Edit online

JTAG 调试

16 Dec 2024
Read time: 2 minute(s)

本节描述通过 JTAG 接口下载和运行 U-Boot 脚本,以及在重定位后的调试流程。

通过 JTAG 下载 SPL

  1. 将 SPL 直接下载到芯片 SRAM 运行:
    restore ./output/images/u-boot-spl-dtb.bin binary 0x103100
    add-symbol-file ./output/build/uboot-2021.10/spl/u-boot-spl
    • restore 命令将 U-Boot 的 SPL (Secondary Program Loader) 下载到芯片的 SRAM 中。
    • add-symbol-file 命令加载符号表文件,以便调试器能够识别二进制文件中的符号。
  2. 通过设置寄存器的值,配置使用的启动介质。

    具体值请参考源码 boot_param.h,以设置 R0 寄存器的值为例:

    # 1: eMMC; 2: SD; 4: SPINOR; 5: SPINAND; 6: SDFAT32
    set $a0=5
    set $a1=0
    set $pc=0x103100
  3. U-Boot 不能直接下载执行,必须通过 OpenSBI 来跳转执行:
    1. 启用 L1 Cache
      set $mhcr = 0x17f
      set $mhint = 0x650C
      set $mxstatus = 0x638000
    2. 恢复环境变量、设备树和 U-Boot 镜像

      
      restore ./output/images/env.bin binary 0x43100000
      restore ./output/images/u-boot.dtb binary 0x42200000
      restore ./output/images/u-boot-dtb.bin binary 0x40200000
      
  4. 加载并跳转到固件
    restore ./output/images/fw_jump.bin binary 0x40000000
    load ./output/images/fw_jump.elf
    set $a0=0
    set $a1=0x42200000
    # 1: eMMC, 5: NAND 7:USB
    set $a3=7
    set $pc=0x40000000
    
    continue
    • load 命令加载固件跳转程序 (fw_jump.elf)。
    • set 命令设置参数,其中 a3 传递启动设备信息,具体值请参考源码 boot_param.h
    • continue 命令继续执行程序。

Relocation 后的调试

U-Boot 在初始化过程中,会将运行空间迁移到 DRAM 末端,代码段和相关的数据进行重定位。调试器原本加载的 elf 文件与实际运行的代码地址不一致,此时不能继续调试。如需继续调试,参照以下流程执行:

  1. board_init_r 函数处设置断点:
    call_board_init_r // arch/riscv/cpu/start.S

    重定位发生在 board_init_fboard_init_r 之间。

  2. 添加新的符号表:
    (gdb) add-symbol-file uboot-2021.10/build/updater/u-boot 0x43f51000

    地址 0x43f51000 是重定位之后的 U-Boot 开始地址,可在启动打印中查看具体信息, 如 Relocating to 0x43f51000

    Relocation Offset is: 0x03d51000
    Relocating to 0x43f51000, new gd at 0x43b4ce20, sp at 0x43b44230
  3. 设置新的断点,比如断点设置在 board_init_r 函数
    (gdb) b board_init_r
  4. 继续运行,即可完成调试。
    continue