UART使用参考
1. 概述¶
本文主要介绍在uboot以及userspace下如何配置并使用uart。
表1-1 规格介绍
外设 | 最高波特率 |
---|---|
1路FUART 3路UART 其中UART0作为console | UART时钟最高172MHZ,理论最高波特率为:172M/16 = 10.7Mbps |
2. Uboot下使用UART¶
2.1. Uart Driver分析¶
uboot下uart driver代码在boot/drivers/mstar/uart/ms_serial.c
中。
主要的API函数介绍如下:
函数名 | 描述 |
---|---|
ms_uart_putc | 发送一个char型字符 |
ms_uart_getc | 接收一个char型字符 |
ms_uart_init | 初始化串口 |
ms_uart_padmux | 配置uart的padmux、外设时钟 |
2.2. 配置UART PADMUX¶
用户配置uart padmux可参考boot/drivers/mstar/uart/pioneer3/uart_padmux.c
。
该文件中列出了UART/FUART默认使用的脚位与PADMUX MODE,如下图所示。用户可查看CheckList表格,选中其他管脚作为UART,并更改对应的PADMUX MODE。
ms_uart_padmux函数会根据PADMUX MODE配置对应的管脚、选择uart controller、使能uart外设时钟。
2.3. 测试uart通讯¶
uboot下提供了uart测试命令,详见boot/common/cmd_mstar.c
。
用户可参考do_uart函数实现,编写应用代码。
首先选中一组要测试的uart,如测试uart1,则将uart1的tx与rx硬件上连接在一起,uboot下运行下述命令测试uart1通讯:
# uart init 1 115200 # uart lookback 5
命令解释:初始化uart1并配置波特率为115200,如果发送的字符与接收到的字符一致,则表明uart通讯正常。
3. kernel下配置uart¶
推荐使用如下mode与脚位:
UART Group | Mode | TX | RX | CTS | RTS | DEV |
---|---|---|---|---|---|---|
Fuart | 6 | PAD_GPIO5 | PAD_GPIO6 | PAD_GPIO7 | PAD_GPIO8 | /dev/ttyS2 |
Uart1 | 8 | PAD_GPIO1 | PAD_GPIO2 | -- | -- | /dev/ttyS1 |
Uart2 | 6 | PAD_GPIO3 | PAD_GPIO4 | -- | -- | /dev/ttyS3 |
以下均以表格中列举的脚位以及mode为例。
3.1. Kernel中配置dts¶
打开如下dtsi文件,配置对应的设备树:
Kernel/arch/arm/boot/dts/pioneer3.dtsi
配置fuart mode:
配置uart1 mode:
配置uart2 mode:
3.2. Kernel中配置padmux¶
打开如下文件,根据选择的mode配置padmux。
Kernel/arch/arm/boot/dts/pioneer3-ssc020a-s01a-demo-padmux.dtsi
配置fuart padmux:
配置uart1 padmux:
配置uart2 padmux:
3.3. kernel中使能uart驱动¶
menuconfig中使能如图所示选项,打开uart功能,配置驱动:
4. 用户空间如何使用uart¶
4.1. 确认uart使用的/dev/ttySx¶
打开如下dts文件,确认uart对应的是哪路serialx,serialx对应的就是/dev/ttySx。
kernel/arch/arm/boot/dts/pioneer3.dtsi
4.2. 应用层使用uart¶
提供测试用sample code源文件uart_main.c
按如下操作编译源文件,生成可执行bin档并测试uart通讯。
# arm-linux-gnueabihf-gcc -o uart_main uart_main.c
将开发板的串口与电脑链接,串口调试助手中的波特率设置为115200。将bin档拷贝到开发板,shell中运行# ./uart_main
。
此时PC端串口助手会收到“hello world!”字符串,shell中输入字符以“#”号结束,则应用会将shell中接收的字符串通过uart发送给PC;在PC端串口助手的发送框中输入字符串以“#”号结束,则开发板的shell中会打印串口助手发送的字符。
4.3. fuart流控制¶
如果测试fuart通讯,sample code中需要开启流控制,使能CTS与RTS。
此时运行uart_main应用后,正常情况下CTS=1,fuart并不会马上将“hello world!”字符串发送出去,当CTS脚接地时,PC端串口助手才会收到字符串,则CTS功能正常;将RTS信号挂到示波器上,正常情况下RTS=0,当fuart的fifo数据缓冲区full时,RTS会拉高,告诉发送设备停止发送。串口助手发送长度较长(30个字节以上)的字符串,此时可以捕捉到RTS信号上升沿跳变,则RTS功能正常。
4.4. 读寄存器判断PADMUX是否配置正确¶
如果uart通讯测试异常,首先检查硬件连接是否正确,然后可通过读取相关寄存器确认uart的padmux配置是否正确。
在kernel驱动文件中提供了padmux table并列举了寄存器基地址、偏移地址以及有效位。打开kernel/drivers/sstar/gpio/pioneer3/mhal_pinmux.c
,以fuart为例,找到对应脚位。
当fuart配置为PINMUX_FOR_FUART_MODE_6时,对应的寄存器信息如图:
基地址 | PADTOP_BANK | 0x103C |
---|---|---|
偏移地址 | REG_FUART_MODE | 0x6E |
有效位 | BIT10|BIT9 | 0x0600 |
开发板中运行/customer/riu_r 0x103C 0x6E读寄存器的值,如果读出的值为0x0600则表明FUART PADMUX寄存器配置正确。注意!!!由于GPIO MODE的优先级更高,如果该组脚位要配置为FUART MODE,则需保证该组脚位为非GPIO MODE。
5. uart驱动架构及debug方法¶
Uart驱动主要框架图如下:
从上图可以看出来驱动的主要工作就是把uart controller和对应的pad串接起来。