海思HI3518内核中开启UART2的方法
2016-02-18 17:46
232 查看
转自:http://blog.csdn.net/zqj6893/article/details/47663265
海思HI3518 SOC提供 了3个 UART(UniversalAsynchronous Receiver Transmitter异步串行通信接口)单元,主要功能是将来自外围设备的数据进行串并转换之后传入内部总线,以及将数据进行并串转换之后输出到外部设备。UART的主要功能是和外部芯片的UART进行对接,从而实现两芯片间的通信。
海思提供的SDK中的内核默认开启了uart0和uart1,uart0默认用于调试使用,对应于设备单板中的/dev/ttyAMA0。Uart1可用作通信接口与外设进行数据接收和发送,对应于单板中的/dev/ttyAMA1。然而要想使用uart2来作为串行通信口,还需要修改内核,修改说明如下:
1、修改内核arch/arm/mach-hi3518/core.c,将对应位置修改为如下内容。
HIL_AMBA_DEVICE(uart0,"uart:0", UART0, NULL);
HIL_AMBA_DEVICE(uart1,"uart:1", UART1, NULL);
HIL_AMBA_DEVICE(uart2,"uart:2", UART2, NULL);
static struct amba_device *amba_devs[]__initdata = {
#if(CONFIG_HISILICON_KCONSOLE==1)
& HIL_AMBADEV_NAME(uart1),
& HIL_AMBADEV_NAME(uart0),
& HIL_AMBADEV_NAME(uart2),
#elif (CONFIG_HISILICON_KCONSOLE==2)
& HIL_AMBADEV_NAME(uart2),
& HIL_AMBADEV_NAME(uart0),
& HIL_AMBADEV_NAME(uart1),
#else
& HIL_AMBADEV_NAME(uart0),
& HIL_AMBADEV_NAME(uart1),
& HIL_AMBADEV_NAME(uart2),
#endif
}
2、lookups结构体中增加:
static struct clk_lookup lookups[] = {
{ /* UART2 */ //add
.dev_id = "uart:2",
.clk = &uart_clk,
},
}
3、修改 arm/mach-hi3518/include/mach/irqs.h中相关宏为以下内容:
#define UART0_IRQ {HI3518_IRQ_START + 5, NO_IRQ }
#define UART1_IRQ { HI3518_IRQ_START +5, NO_IRQ }
#define UART2_IRQ { HI3518_IRQ_START + 25,NO_IRQ }
4、应用代码中需要设置一下 UART_RXD(GPIO7_6)、UART2_TXD(GPIO7_7)GPIO复用功能
himm 0x200F0108 0x1 //UART2_RXD
himm 0x200F010C 0x1 //UART2_TXD
5、单板的/etc/init.d/S00devs文件中,添加以下内容:
mknod /dev/ttyAMA2 c 204 66
补充:
按照以上设置之后,在应用程序中,只需要根据实际需要,打开uart2在单板上字符设备结点,设置波特率,然后select监听对应文件描述符,read接收其它芯片发出的数据即可。
疑惑:
海思SDK中提供的用户指南上有“通用异步收发器”相关的驱动配置流程说明,但是根据文档上的流程实现了驱动,发现依旧不能使用UART2功能,而且与UART2相关的寄存器设置根本不生效,后面才采用修改内核的方法来解决问题。路过的朋友,有知道这个原因的,烦请不吝赐教,给我留言,谢谢!
海思HI3518 SOC提供 了3个 UART(UniversalAsynchronous Receiver Transmitter异步串行通信接口)单元,主要功能是将来自外围设备的数据进行串并转换之后传入内部总线,以及将数据进行并串转换之后输出到外部设备。UART的主要功能是和外部芯片的UART进行对接,从而实现两芯片间的通信。
海思提供的SDK中的内核默认开启了uart0和uart1,uart0默认用于调试使用,对应于设备单板中的/dev/ttyAMA0。Uart1可用作通信接口与外设进行数据接收和发送,对应于单板中的/dev/ttyAMA1。然而要想使用uart2来作为串行通信口,还需要修改内核,修改说明如下:
1、修改内核arch/arm/mach-hi3518/core.c,将对应位置修改为如下内容。
HIL_AMBA_DEVICE(uart0,"uart:0", UART0, NULL);
HIL_AMBA_DEVICE(uart1,"uart:1", UART1, NULL);
HIL_AMBA_DEVICE(uart2,"uart:2", UART2, NULL);
static struct amba_device *amba_devs[]__initdata = {
#if(CONFIG_HISILICON_KCONSOLE==1)
& HIL_AMBADEV_NAME(uart1),
& HIL_AMBADEV_NAME(uart0),
& HIL_AMBADEV_NAME(uart2),
#elif (CONFIG_HISILICON_KCONSOLE==2)
& HIL_AMBADEV_NAME(uart2),
& HIL_AMBADEV_NAME(uart0),
& HIL_AMBADEV_NAME(uart1),
#else
& HIL_AMBADEV_NAME(uart0),
& HIL_AMBADEV_NAME(uart1),
& HIL_AMBADEV_NAME(uart2),
#endif
}
2、lookups结构体中增加:
static struct clk_lookup lookups[] = {
{ /* UART2 */ //add
.dev_id = "uart:2",
.clk = &uart_clk,
},
}
3、修改 arm/mach-hi3518/include/mach/irqs.h中相关宏为以下内容:
#define UART0_IRQ {HI3518_IRQ_START + 5, NO_IRQ }
#define UART1_IRQ { HI3518_IRQ_START +5, NO_IRQ }
#define UART2_IRQ { HI3518_IRQ_START + 25,NO_IRQ }
4、应用代码中需要设置一下 UART_RXD(GPIO7_6)、UART2_TXD(GPIO7_7)GPIO复用功能
himm 0x200F0108 0x1 //UART2_RXD
himm 0x200F010C 0x1 //UART2_TXD
5、单板的/etc/init.d/S00devs文件中,添加以下内容:
mknod /dev/ttyAMA2 c 204 66
补充:
按照以上设置之后,在应用程序中,只需要根据实际需要,打开uart2在单板上字符设备结点,设置波特率,然后select监听对应文件描述符,read接收其它芯片发出的数据即可。
疑惑:
海思SDK中提供的用户指南上有“通用异步收发器”相关的驱动配置流程说明,但是根据文档上的流程实现了驱动,发现依旧不能使用UART2功能,而且与UART2相关的寄存器设置根本不生效,后面才采用修改内核的方法来解决问题。路过的朋友,有知道这个原因的,烦请不吝赐教,给我留言,谢谢!
相关文章推荐
- hadoop环境搭建总结
- yum安装memcache,mongo扩展以及python的mysql模块安装
- 线程同步的总结
- 汇编运行地址,链接地址,加载地址,存储地址 位置无关码、位置有关码
- 深入解析Andoird应用开发中View的事件传递
- MongoDB学习笔记(索引)
- 在web应用中获取spring的context,并打印出context中所有bean的id
- Gulp 简易入门及API介绍
- javascript 练习
- HTML5开发移动web应用——SAP UI5篇(8)
- Linux网络管理
- Java泛型
- DataTable如何转换为实体类
- 大型网站架构体系的演变(下)
- MongoDB:索引与性能
- 解决php deprecated 的问题
- Bootstrap基础:选择器
- Servlet3简介
- 欢迎使用CSDN-markdown编辑器
- iOS中js与objective-c的交互