文章目录
调试的目的
运行测试程序minicom来验证串口/dev/ttySx(0-1)可以正常通信,串口在大数据长时间收发数据正常。
调试的过程
步骤一,查询uart说明文档,确定串口的基本信息。
步骤二,查询原理图,确认外接串口与CPU的引脚对应关系。
步骤三,配置板级config文件
步骤四,修改设备树
步骤五,检查驱动程序
步骤一,查询uart说明文档,确定串口的基本信息。
波特率:通过说明文档,以及内核日志信息串口波特率是1500000
查阅说明文档docs/Common/UART/Rockchip_Developer_Guide_UART_CN.pd,可知UART波特率 = 工作时钟源 / 内部分频系数 / 16
。
cat /sys/kernel/debug/clk/clk_summary | grep uart # 查询UART工作时钟频率
drivers/tty/serial/serial_core.c
port->uartclk / 16
= 24000000/16
= 1500000
步骤二,查询原理图,确认外接串口与CPU的引脚对应关系。
查阅原理图
GPIO对应关系如下
步骤三,配置板级config文件
kernel/arch/arm64/configs/rockchip_linux_defconfig,确保以下配置
#
# Serial drivers
#
CONFIG_SERIAL_EARLYCON=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y
# CONFIG_SERIAL_8250_FINTEK is not set
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_DMA=y
# CONFIG_SERIAL_8250_PCI is not set
CONFIG_SERIAL_8250_NR_UARTS=10
CONFIG_SERIAL_8250_RUNTIME_UARTS=10
# CONFIG_SERIAL_8250_EXTENDED is not set
# CONFIG_SERIAL_8250_ASPEED_VUART is not set
CONFIG_SERIAL_8250_FSL=y
CONFIG_SERIAL_8250_DW=y
# CONFIG_SERIAL_8250_RT288X is not set
# CONFIG_SERIAL_8250_MOXA is not set
CONFIG_SERIAL_OF_PLATFORM=y
步骤四,修改设备树
arch/arm64/boot/dts/rockchip/rk3568.dtsi
根据引脚对应图,修改相关uart节点的引脚。如下图。右边是修改后的代码。
arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
添加以下节点信息,打开uart。
&uart5 {
status = "okay";
};
&uart7 {
status = "okay";
};
&uart9 {
status = "okay";
};
步骤五,修改驱动程序
drivers/tty/serial/8250/*.c
无需更改
测试的方法
更新系统后重新启动,进入 shell。
内核启动日志分析
dmesg |grep tty
通过内核日志可知波特率为1500000,使用中断模式而不是DMA
[ 0.583601] fe690000.serial: ttyS5 at MMIO 0xfe690000 (irq = 68, base_baud = 1500000) is a 16550A
[ 0.584097] fe6b0000.serial: ttyS7 at MMIO 0xfe6b0000 (irq = 69, base_baud = 1500000) is a 16550A
[ 0.584504] fe6c0000.serial: ttyS8 at MMIO 0xfe6c0000 (irq = 70, base_baud = 1500000) is a 16550A
[ 0.584911] fe6d0000.serial: ttyS9 at MMIO 0xfe6d0000 (irq = 71, base_baud = 1500000) is a 16550A
查看设备文件
ls /dev/ttyS*
——————————————
/dev/ttyS5 /dev/ttyS7 /dev/ttyS8 /dev/ttyS9
# /dev/ttyS8是板载的一个wifi/bt模块使用的。
打开关闭,以及“读写”测试app
# 使用USB转串口,将板子的串口接入开发主机
# 在shell命令行使用以下测试命令
while true; do echo abc > /dev/ttyS9; sleep 3 ; done # ctrl+c退出进程
# 在开发主机中监听串口,注意波特率设置成1500000
sudo minicom /dev/ttyUSB0
# 短接板子的TX和RX
# 在shell命令行使用以下测试命令
microcom /dev/ttyS9 # ctrl+x退出界面
————————————
此时输入什么就打印什么,因为是发送接收回环。
遇到的问题
对遇到的问题,进行记录,如何重现问题的,现象是怎么样的,怎么解决或规避的,当时解决问题的思路是怎样的。
开发板串口驱动错误,UART5/7/9在文件系统中没有相关设备文件/dev/ttyS5、/dev/ttyS7和/dev/ttyS9
现象或日志
描述问题产生的现象,可以附上关键日志,或截图(如果是日志尽量以文本方式呈现,尽量去除不重要的日志,方便搜索)
ls /dev/ttyS* -l
解决思路
描述对导致问题发生的原因,进行的合理猜测。(错误的猜测也记录,但不用在解决过程中详细描述,只需备注一下即可)
- 猜想一,串口驱动错误 (已验证不是此原因)
- 猜想二,驱动没有加载(已验证是此原因)
- 猜想三,设备树信息描述错误(实测是这个原因)
- 猜想四,驱动.c源文件没有被编译进内核(已验证不是此原因)
解决过程
详细描述如何验证猜测,并最终解决问题(只记录正确的猜测验证就可)。
验证串口驱动是否出错。跟踪调试串口执行流程,查询错误路径,实测驱动没有加载。
验证驱动是否被加载。驱动没有加载可能有原因一是设备树信息描述错误,或原因二是驱动.c文件没有被编译进内核。
验证设备树节点信息描述是否错误。见步骤四。
验证驱动是否被编译。查阅drivers/tty/serial/8250/Makefile文件,对比板级配置文件的相关宏定义,确定驱动被编译,见步骤三。
参考资料
【RK3568SDK】docs/Common/UART/Rockchip_Developer_Guide_UART_CN.pdf
【RK3568SDK】docs/Common/UART/Rockchip_Developer_Guide_UART_FAQ_CN.pdf
Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准,完整模块支持以下
功能:
支持5、6、7、8 bits数据位。
支持1、1.5、2 bits停止位。
支持奇校验和偶校验,不支持mark校验和space校验。
支持接收FIFO和发送FIFO,一般为32字节或者64字节。
支持最高4M波特率,实际支持波特率需要芯片时钟分频策略配合。
支持中断传输模式和DMA传输模式。
支持硬件自动流控,RTS+CTS。
在Linux kernel 4.4和Linux kernel 4.19中,使用8250串口通用驱动,以下为主要驱动文件:
drivers/tty/serial/rk_serial.c
drivers/tty/serial/8250/8250_core.c # 8250串口驱动核心
drivers/tty/serial/8250/8250_dw.c # Synopsis DesignWare 8250串口驱动
drivers/tty/serial/8250/8250_dma.c # 8250串口DMA驱动
drivers/tty/serial/8250/8250_port.c # 8250串口端口操作
drivers/tty/serial/8250/8250_early.c # 8250串口early console驱动
UART相关的menuconfig配置
Device Drivers --->
Character devices --->
Serial drivers --->
UART的板级dts配置只有以下参数允许修改:
dma-names:
"tx" 打开tx dma
"rx" 打开rx dma
"!tx" 关闭tx dma
"!rx" 关闭rx dma
pinctrl-0:
&uart1m0_xfer 配置tx和rx引脚为iomux group 0
&uart1m1_xfer 配置tx和rx引脚为iomux group 1
&uart1m0_ctsn和&uart1m0_rtsn 配置硬件自动流控cts和rts引脚为iomux group 0
&uart1m1_ctsn和&uart1m1_rtsn 配置硬件自动流控cts和rts引脚为iomux group 1
status:
"okay" 打开
"disabled" 关闭