调试指南
-
设置 log 等级为最高 8,有两种设置方法:
- bootarg
target/aicxxx/common/env.txt 中设置 loglevel=8
- kernel menuconfigmake kernel_menuconfig 或者 make km 命令打开 kernel 的 menuconfigc
Kernel hacking printk and dmesg options (8) Default console loglevel (1-15) (7) Default message log level (1-7)
- bootarg
-
通过 make kernel_menuconfig 或者 make km 命令打开 kernel 的 menuconfig, 如下路径选中 UART 的调试开关
Kernel hacking [*] Kernel debuging ArtInChip Debug [*] UART Driver Debug
调试端口
如果 UART 作为调试端口,其主要工作即为进行调试日志的输入输出,模块工作正常则可以正常进行日志的输入输出,调试端口是所有其他模块的调试的基础,以 uart0 作为调试端口为例
- 端口配置:
target/d211/方案 x/board.dts &uart0 { pinctrl-names = "default"; pinctrl-0 = <&uart0_pins_a>; status = "okay"; };
- 调试端口指定
调试端口的配置只在 env.txt 中指定即可,board.dts 中 bootargs 中的 console 只是在 JTAG 调试时使用
target/d211/common/env.txt earlycon=smh console=ttyS0,115200n8 loglevel=8
功能验证
- 驱动加载
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.
- 设备信息
系统默认会给每一个 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:调试串口
- 设备通信验证模块是否可以正常通信,最简单的办法是环路端口的 RX/TX,使用 AIC 提供的 UART 测试工具进行测试
- 编译测试工具在根目录下通过 make menuconfig 可以选择编译 AIC 提供的 UART 测试工具到系统
ArtInChip packages Sample code [*] test-uart
- 端口环路测试运行命令:test_uart -C /dev/ttyS1 9600 进行环路测试,但不要使用其测试调试端口
test_uart -C /dev/ttyS1 9600 Test Mode: 3:Circle Send Device : /dev/ttyS1 Receive Device : /dev/ttyS1 m_Baudrate : 9600 send data is: 1234567890artinchip0987654321 receive data is: 1234567890artinchip0987654321
- 编译测试工具
问题排查流程
-
在 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 寄存器是时分复用寄存器,直接读取的值无法明确意义,要跟踪寄存器设置,只能在代码中打印寄存器值