7.11.3. 调试指南
7.11.3.1. 调试开关
7.11.3.1.1. Log等级
调试的时候需要设置 log 等级为最高8,有两种设置方法:
- bootarg
target/aicxxx/common/env.txt 中设置 loglevel=8
- kernel menuconfig
参考快速入门 - 编译概述 - Kernel配置,打开 kernel 的 menuconfig
Kernel hacking
printk and dmesg options
(8) Default console loglevel (1-15)
(7) Default message log level (1-7)
7.11.3.1.2. 调试开关
参考快速入门 - 编译概述 - Kernel配置,打开 kernel 的 menuconfig, 如下路径选中 UART 的调试开关
Kernel hacking
[*] Kernel debuging
ZX Debug
[*] UART Driver Debug
7.11.3.2. 调试端口
如果 UART 作为调试端口,其主要工作即为进行调试日志的输入输出,模块工作正常则可以正常进行日志的输入输出,调试端口是所有其他模块的调试的基础,以 uart0 作为调试端口为例
调试端口在驱动中强制不使用 DMA
7.11.3.2.1. 端口配置
xxx-board.dts
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pins_a>;
status = "okay";
};
7.11.3.2.2. 调试端口指定
调试端口的配置只在 env.txt 中指定即可,xxx-board.dts 中 bootargs 中的 console 只是在 JTAG 调试时使用
earlycon=smh
console=ttyS0,115200n8
loglevel=8
7.11.3.3. 功能验证
7.11.3.3.1. 驱动加载
uboot 和 kernel 不共享驱动,因此驱动加载是否成功也要分两个阶段验证。
UART 作为调试串口和非调试串口使用的驱动一致,因此系统有任何日志输出则说明驱动加载正常。
Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled
18713000.serial: ttyS3 at MMIO 0x18713000 (irq = 22, base_baud = 75000000) is a 16550A
aic8250_apply_quirks port:0 rs485:0
aic8250_probe port:0 clk:48000000 regshift:2
aic8250_probe success.
7.11.3.3.2. 设备信息
系统默认会给每一个 UART 端口创建一个设备节点,即 ttyS#,而不管设备是否被打开。
从 /sys/class/tty/ttyS# 中查看该设备信息可以确认其是否被正常初始化
[aic@ttyS1] cd /sys/class/tty/ttyS1
[aic@ttyS1] # cat type
0: 没有初始;4: 初始化为16550A设备
[aic@ttyS2] # cat console
N:非调试串口;Y:调试串口
7.11.3.3.3. 设备通信
验证模块是否可以正常通信,最简单的办法是环路端口的 RX/TX,使用 AIC 提供的 UART 测试工具进行测试
7.11.3.3.3.1. 编译测试工具
在根目录下通过 make menuconfig 可以选择编译 AIC 提供的UART测试工具到系统
zx (openwrt)
sample-code
[*] test-uart
7.11.3.3.3.2. 端口环路测试
运行命令:aic_uart -C /dev/ttyS1 9600 进行环路测试,但不要使用其测试调试端口
aic_uart -C /dev/ttyS1 9600
Test Mode: 3:Circle
Send Device : /dev/ttyS1
Receive Device : /dev/ttyS1
m_Baudrate : 9600
send data is: 1234567890zx0987654321
receive data is: 1234567890zx0987654321
7.11.3.4. 问题排查流程
在 xxx-board.dts 中确认使用的 UART 端口 status = “okay”
确认该 UART 端口的 GPIO 端口配置正确, 具体查看相关 GPIO 端口的寄存器
确认该 UART 端口的 clk 设置正确
确认 /dev/ttyS#/uartclk 值: 48000000
在 CMU 的寄存器中查看相关寄存器,如:0x0844 CLK_UART1
reg-dump -a 0x18020844: 0x18020844: 00003118
clk = 1200M / (0x18 + 1) = 48M
UART 寄存器是时分复用寄存器,直接读取的值无法明确意义,要跟踪寄存器设置,只能在代码中打印寄存器值