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, 串口注册)