UART使用参考

Version1.0


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串接起来。