您的位置:首页 > 其它

3518e 开启第三个串口uart2

2016-05-14 11:01 435 查看
因为工作需要,需要使用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,
},
};


2.关于uart2的引脚,如下图所示



也就是说,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
这个函数在那个地方,麻烦有了解的告诉一声。

以上便是全部过程,如有错误,欢迎指教!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: