Edit online

调试指南

14 Nov 2024
Read time: 3 minute(s)
调试流程如下:
  1. 设置 log 等级为最高 8,有两种设置方法:

    • bootarg

      target/aicxxx/common/env.txt 中设置 loglevel=8

    • kernel menuconfig
      make 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)
  2. 通过 make kernel_menuconfig 或者 make km 命令打开 kernel 的 menuconfig, 如下路径选中 UART 的调试开关
    Kernel hacking
        [*] Kernel debuging
            ArtInChip Debug
            [*] UART Driver Debug

调试端口

如果 UART 作为调试端口,其主要工作即为进行调试日志的输入输出,模块工作正常则可以正常进行日志的输入输出,调试端口是所有其他模块的调试的基础,以 uart0 作为调试端口为例

调试端口在驱动中强制不使用 DMA。
  1. 端口配置:
    target/d211/方案 x/board.dts
    &uart0 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart0_pins_a>;
        status = "okay";
    };
  2. 调试端口指定

    调试端口的配置只在 env.txt 中指定即可,board.dts 中 bootargs 中的 console 只是在 JTAG 调试时使用

    target/d211/common/env.txt
    earlycon=smh
    console=ttyS0,115200n8
    loglevel=8

功能验证

  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.
  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:调试串口
    
  3. 设备通信
    验证模块是否可以正常通信,最简单的办法是环路端口的 RX/TX,使用 AIC 提供的 UART 测试工具进行测试
    1. 编译测试工具
      在根目录下通过 make menuconfig 可以选择编译 AIC 提供的 UART 测试工具到系统
      ArtInChip packages
          Sample code
              [*] test-uart
    2. 端口环路测试
      运行命令: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

问题排查流程

  1. board.dts 中确认使用的 UART 端口 status = “okay”

  2. 确认该 UART 端口的 GPIO 端口配置正确, 具体查看相关 GPIO 端口的寄存器

  3. 确认该 UART 端口的 clk 设置正确

    • 确认 /dev/ttyS#/uartclk 值: 48000000

    • 在 CMU 的寄存器中查看相关寄存器,如:0x0844 CLK_UART1

    • reg-dump -a 0x18020844: 0x18020844: 00003118

    • clk = 1200M / (0x18 + 1) = 48M

  4. UART 寄存器是时分复用寄存器,直接读取的值无法明确意义,要跟踪寄存器设置,只能在代码中打印寄存器值