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 寄存器是时分复用寄存器,直接读取的值无法明确意义,要跟踪寄存器设置,只能在代码中打印寄存器值