因为工作需要,需要使用3518e的uart2,但是海思内核默认只开启了uart0和uart1,因此需要自己手动开启uart2,因此网上查了一些资料,打开uart2。
参考资料1 http://www.ebaina.com/bbs/thread-5111-1-1.html
参考资料2http://www.lai18.com/content/1938833.html
参考资料3http://blog.csdn.net/olei_oleitao/article/details/7383592
具体过程如下:
1、修改内核arch/arm/mach-hi3518/core.c
1.第一个修改的地方
HIL_AMBA_DEVICE(uart0, "uart:0", UART0, NULL);
HIL_AMBA_DEVICE(uart1, "uart:1", UART1, NULL);
HIL_AMBA_DEVICE(uart2, "uart:2", UART2, NULL);
2.第二个修改的地方
static struct amba_device *amba_devs[] __initdata = {
&HIL_AMBADEV_NAME(uart0),
&HIL_AMBADEV_NAME(uart1),
&HIL_AMBADEV_NAME(uart2),
};
3.第三个修改的地方
static struct clk_lookup lookups[] = {
{ /* UART0 */
.dev_id = "uart:0",
.clk = &uart_clk,
},
{ /* UART1 */
.dev_id = "uart:1",
.clk = &uart_clk,
},
{ /* UART2 */
.dev_id = "uart:2",
.clk = &uart_clk,
},
};
也就是说,uart2的两个引脚复用了,因此需要将其复用为uart功能,而不是普通的GPIO,
通过查询海思的sdk得知,其对应的寄存器地址为
uart2_RXD ----> 0x200f0108
uart2_TXD ----> 0x200f010C
因此,在编写应用程序代码时,需要在对串口进行初始化时,采取以下方式对其进行复用功能控制:
system("himm 0x200F0108 0x1");
system("himm 0x200F010c 0x1");
或者
system("devmem 0x200f0108 32 0x00000001");
system("devmem 0x200f010c 32 0x00000001");
或者
在目录 /ko/lowpower.sh中,有这样一句话
#UART2管脚复用成gpio
himm 0x200f0108 0x0
himm 0x200f010c 0x0
将其改为
himm 0x200f0108 0x1
himm 0x200f010c 0x1
即可
至此,完成,并且uart2能够正常收发数据。
但是,在参考资料3中
参考资料3http://blog.csdn.net/olei_oleitao/article/details/7383592
里面有这样一句话
最后在hisilicon_init_machine函数后面增加对这4个管脚复用设置为串口使用;
writew(1, IO_ADDRESS(REG_BASE_IO));
writew(1, IO_ADDRESS(REG_BASE_IO+0x0004));
writew(1, IO_ADDRESS(REG_BASE_IO+0x0028));
writew(1, IO_ADDRESS(REG_BASE_IO+0x002C));
然后编译内核重新下载内核 查看dev目录下有了ttyAMA2 和ttyAMA3
然后用串口测试工具测试OK!
一直没有找到hisilicon_init_machine
这个函数在那个地方,麻烦有了解的告诉一声。
以上便是全部过程,如有错误,欢迎指教!