您的位置:首页 > 其它

海思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相关的寄存器设置根本不生效,后面才采用修改内核的方法来解决问题。路过的朋友,有知道这个原因的,烦请不吝赐教,给我留言,谢谢!


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: