Hi3520D UART2和UART3是如何加载到内核的
生活随笔
收集整理的這篇文章主要介紹了
Hi3520D UART2和UART3是如何加载到内核的
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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(); }
總結
以上是生活随笔為你收集整理的Hi3520D UART2和UART3是如何加载到内核的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《MATLAB 神经网络43个案例分析》
- 下一篇: linux dd 命令详解