UART功能调试记录

本文记录了对UART串口进行功能调试的过程,包括查阅文档、确认引脚关系、配置板级config、修改设备树及驱动程序,以及在测试中遇到的设备文件缺失问题及其解决方法。调试目的是确保串口在大数据收发时能正常通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调试的目的

运行测试程序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

在这里插入图片描述

解决思路

描述对导致问题发生的原因,进行的合理猜测。(错误的猜测也记录,但不用在解决过程中详细描述,只需备注一下即可)

  1. 猜想一,串口驱动错误 (已验证不是此原因)
  2. 猜想二,驱动没有加载(已验证是此原因)
  3. 猜想三,设备树信息描述错误(实测是这个原因)
  4. 猜想四,驱动.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" 关闭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值