This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am3354 gpmc 扩展 st16C554串口问题



1.引脚复用关系:

    {"gpmc_ad0.gpmc_ad0",      OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad1.gpmc_ad1",      OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad2.gpmc_ad2",      OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad3.gpmc_ad3",      OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad4.gpmc_ad4",      OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad5.gpmc_ad5",      OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad6.gpmc_ad6",      OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad7.gpmc_ad7",      OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_wen.gpmc_wen",            OMAP_MUX_MODE0 | AM33XX_PULL_DISA},  // 554 IOW
    {"gpmc_oen_ren.gpmc_oen_ren",     OMAP_MUX_MODE0 | AM33XX_PULL_DISA},  // 554 IOR
    // A1A0 : 00==SCA; 01==SCB; 10==CSC; 11==SCD
    {"gpmc_a3.gpio1_19",         OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA}, // 554 //74HC138:A0  
    {"gpmc_a4.gpio1_20",         OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA}, // 554 //74HC138:A1   
    {"gpmc_a0.gpmc_a0",             OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA}, // 554 ADDR0
    {"gpmc_a1.gpmc_a1",             OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA}, // 554 ADDR1
    {"gpmc_a2.gpmc_a2",             OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA}, // 554 ADDR2
    {"gpmc_a6.gpio1_22",             OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},  // 554 INTA
    {"gpmc_a7.gpio1_23",             OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},  // 554 INTB
    {"gpmc_a8.gpio1_24",             OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},  // 554 INTC
    {"gpmc_a9.gpio1_25",             OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},  // 554 INTD
    {NULL, 0},

定义串口虚拟地址:

#define PORT(_base,_irq)                \
    {                        \
        .mapbase        = _base,        \
        .irq        = _irq,            \
        .uartclk    = 7372800,        \
        .iotype        = UPIO_MEM,        \
        .flags        = UPF_BOOT_AUTOCONF | UPF_IOREMAP,    \
    }

static struct plat_serial8250_port exar_data[] = {
    //PORT(0x1000020, OMAP_GPIO_IRQ(exar_uart_int_port2)),
    //PORT(0x1000028, OMAP_GPIO_IRQ(exar_uart_int_port3)),
    PORT(0x1000000, OMAP_GPIO_IRQ(exar_uart_int_port0)),
    PORT(0x2000000, OMAP_GPIO_IRQ(exar_uart_int_port1)),
    //PORT(0x1000010, OMAP_GPIO_IRQ(exar_uart_int_port4)),
    //PORT(0x1000018, OMAP_GPIO_IRQ(exar_uart_int_port5)),
    { },
};

3.注册串口设备

    gpmc_cs_write_reg(GPMC_CS2, GPMC_CS_CONFIG1, gpmc_csn2_config[0]);

    gpmc_cs_write_reg(GPMC_CS2, GPMC_CS_CONFIG2, gpmc_csn2_config[1]);

    gpmc_cs_write_reg(GPMC_CS2, GPMC_CS_CONFIG3, gpmc_csn2_config[2]);

    gpmc_cs_write_reg(GPMC_CS2, GPMC_CS_CONFIG4, gpmc_csn2_config[3]);

    gpmc_cs_write_reg(GPMC_CS2, GPMC_CS_CONFIG5, gpmc_csn2_config[4]);

    gpmc_cs_write_reg(GPMC_CS2, GPMC_CS_CONFIG6, gpmc_csn2_config[5]);

    val = gpmc_cs_read_reg(GPMC_CS2, GPMC_CS_CONFIG7);

    if (gpmc_cs_request(GPMC_CS2, GPMC_CS_SIZE, &uart_mem_base1) < 0)
    {
     printk(KERN_ERR "Failed request for GPMC mem for exar_uart1\n");
    }
          
        printk("GPMC mem for exar_uart1 baseaddr is 0x%x\n",(unsigned int)uart_mem_base1);


    gpmc_cs_write_reg(GPMC_CS3, GPMC_CS_CONFIG1, gpmc_csn3_config[0]);

    gpmc_cs_write_reg(GPMC_CS3, GPMC_CS_CONFIG2, gpmc_csn3_config[1]);

    gpmc_cs_write_reg(GPMC_CS3, GPMC_CS_CONFIG3, gpmc_csn3_config[2]);

    gpmc_cs_write_reg(GPMC_CS3, GPMC_CS_CONFIG4, gpmc_csn3_config[3]);

    gpmc_cs_write_reg(GPMC_CS3, GPMC_CS_CONFIG5, gpmc_csn3_config[4]);

    gpmc_cs_write_reg(GPMC_CS3, GPMC_CS_CONFIG6, gpmc_csn3_config[5]);

    val = gpmc_cs_read_reg(GPMC_CS3, GPMC_CS_CONFIG7);

    if (gpmc_cs_request(GPMC_CS3, GPMC_CS_SIZE, &uart_mem_base2) < 0)
    {
     printk(KERN_ERR "Failed request for GPMC mem for exar_uart2\n");
    }
          
        printk("GPMC mem for exar_uart2 baseaddr is 0x%x\n",(unsigned int)uart_mem_base2);
/*
    irq_set_irq_type(OMAP_GPIO_IRQ(exar_uart_int_port0),IRQ_TYPE_LEVEL_HIGH);
    irq_set_irq_type(OMAP_GPIO_IRQ(exar_uart_int_port1),IRQ_TYPE_LEVEL_HIGH);
    irq_set_irq_type(OMAP_GPIO_IRQ(exar_uart_int_port2),IRQ_TYPE_LEVEL_HIGH);
    irq_set_irq_type(OMAP_GPIO_IRQ(exar_uart_int_port3),IRQ_TYPE_LEVEL_HIGH);
*/
    irq_set_irq_type(OMAP_GPIO_IRQ(exar_uart_int_port0),IRQ_TYPE_EDGE_RISING);
    irq_set_irq_type(OMAP_GPIO_IRQ(exar_uart_int_port1),IRQ_TYPE_EDGE_RISING);

    return platform_device_register(&exar_device);

现象:

root@buildroot:~# cat /proc/tty/driver/*
serinfo:1.0 driver revision:
0: uart:OMAP UART0 mmio:0x44E09000 irq:72 tx:1060 rx:49 RTS|CTS|DTR|DSR
1: uart:OMAP UART1 mmio:0x48022000 irq:73 tx:0 rx:0 CTS|DSR|CD|RI
2: uart:OMAP UART2 mmio:0x48024000 irq:74 tx:0 rx:0 CTS|DSR
3: uart:OMAP UART3 mmio:0x481A6000 irq:44 tx:0 rx:0 CTS|DSR
4: uart:OMAP UART4 mmio:0x481A8000 irq:45 tx:0 rx:0 CTS|DSR
5: uart:OMAP UART5 mmio:0x481AA000 irq:46 tx:0 rx:0 CTS|DSR
serinfo:1.0 driver revision:
0: uart:unknown mmio:0x02000000 irq:215
1: uart:unknown port:00000000 irq:0
2: uart:unknown port:00000000 irq:0
3: uart:unknown port:00000000 irq:0

请问:

st16C554这个驱动未能驱动起来,请问是什么原因导致的?有没有使用过gpmc成功驱动ST16C554的详细例子(包括:引脚复用,PORT地址,IRQ, 串口注册)