Hi3520D的UART驱动位于linux-3.0.y/drivers/tty/serial/amba-pl011.c
添加UART2和UART3需要修改的文件为:linux-3.0.y/arch/arm/mach-hi3520d/core.c和linux-3.0.y/arch/arm/mach-hi3520d/include/mach/irqs.h两个文件;
首先修改 core.c文件,在309行左右的位置修改成如下:
HIL_AMBA_DEVICE(uart0, "uart:0", UART0, NULL);
HIL_AMBA_DEVICE(uart1, "uart:1", UART1, NULL);
HIL_AMBA_DEVICE(uart2, "uart:2", UART2, NULL);
HIL_AMBA_DEVICE(uart3, "uart:3", UART3, NULL);static struct amba_device *amba_devs[] __initdata = {&HIL_AMBADEV_NAME(uart0),&HIL_AMBADEV_NAME(uart1),&HIL_AMBADEV_NAME(uart2),&HIL_AMBADEV_NAME(uart3),
};static struct clk uart_clk;
static struct clk_lookup lookups[4];static void uart_clk_init(unsigned long clk)
{uart_clk.rate = clk;lookups[0].dev_id = "uart:0";lookups[0].clk = &uart_clk;lookups[1].dev_id = "uart:1";lookups[1].clk = &uart_clk;lookups[2].dev_id = "uart:2";lookups[2].clk = &uart_clk;lookups[3].dev_id = "uart:3";lookups[3].clk = &uart_clk;
}
然后修改irqs.h文件,修改为如下
#define UART0_IRQ (HI3520D_IRQ_START + 8)
#define UART1_IRQ (HI3520D_IRQ_START + 9)
#define UART2_IRQ (HI3520D_IRQ_START + 10)
#define UART3_IRQ (HI3520D_IRQ_START + 11)
这个样文件就修改完成了;重新编译内核应该就能在dev底下出现ttyAMA2和ttyAMA3了;
HI3520D在内核中复用UART2,UART3管脚
在linux-3.0.y/arch/arm/mach-hi3520d/core.c文件中合适的位置添加
#define GK_HW_WEG(gkval,gkaddr) writel(gkval,gkaddr)#define GK_IOCFG_BASE_ADDR 0x200F0000 /* IO口复用寄存器地址空间映射 */
#define GK_GPIO0_BASE_ADDR 0x20150000 /* GPIO0的地址空间映射 */
#define GK_GPIO1_BASE_ADDR 0x20160000 /* GPIO1的地址空间映射 */
#define GK_GPIO2_BASE_ADDR 0x20170000 /* GPIO2的地址空间映射 */
#define GK_GPIO3_BASE_ADDR 0x20180000 /* GPIO3的地址空间映射 */
#define GK_GPIO4_BASE_ADDR 0x20190000 /* GPIO4的地址空间映射 */
#define GK_GPIO5_BASE_ADDR 0x201A0000 /* GPIO5的地址空间映射 */
#define GK_GPIO6_BASE_ADDR 0x201B0000 /* GPIO6的地址空间映射 */
#define GK_GPIO7_BASE_ADDR 0x201C0000 /* GPIO7的地址空间映射 */
#define GK_GPIO8_BASE_ADDR 0x201D0000 /* GPIO7的地址空间映射 */#define GK_REG_UART1RXD_OFFSET IO_ADDRESS(GK_IOCFG_BASE_ADDR + 0x050) /* UART1_RXD偏移寄存器 */
#define GK_REG_UART1TXD_OFFSET IO_ADDRESS(GK_IOCFG_BASE_ADDR + 0x058) /* UART1_TXD偏移寄存器 */
#define GK_REG_UART2RXD_OFFSET IO_ADDRESS(GK_IOCFG_BASE_ADDR + 0x05C) /* UART2_RXD偏移寄存器 */
#define GK_REG_UART2TXD_OFFSET IO_ADDRESS(GK_IOCFG_BASE_ADDR + 0x060) /* UART2_TXD偏移寄存器 */
#define GK_REG_UART3RXD_OFFSET IO_ADDRESS(GK_IOCFG_BASE_ADDR + 0x0BC) /* UART3_RXD偏移寄存器 */
#define GK_REG_UART3TXD_OFFSET IO_ADDRESS(GK_IOCFG_BASE_ADDR + 0x0B8) /* UART3_TXD偏移寄存器 */#define gk_cfg_uart_pin()({\GK_HW_WEG(0x01,GK_REG_UART1RXD_OFFSET);\GK_HW_WEG(0x01,GK_REG_UART1TXD_OFFSET);\GK_HW_WEG(0x01,GK_REG_UART2RXD_OFFSET);\GK_HW_WEG(0x01,GK_REG_UART2TXD_OFFSET);\GK_HW_WEG(0x01,GK_REG_UART3RXD_OFFSET);\GK_HW_WEG(0x01,GK_REG_UART3TXD_OFFSET);\})
修改 core.c文件函数--加入初始化
static void uart_clk_init(unsigned long clk)
{uart_clk.rate = clk;lookups[0].dev_id = "uart:0";lookups[0].clk = &uart_clk;lookups[1].dev_id = "uart:1";lookups[1].clk = &uart_clk;lookups[2].dev_id = "uart:2";lookups[2].clk = &uart_clk;lookups[3].dev_id = "uart:3";lookups[3].clk = &uart_clk;gk_cfg_uart_pin();
}