1. Debug with console
Trace and error are available on the console defined in the chosen node of the device tree by the stdout-path field, for example on serial0=uart4:
serial0:115200n8"; }; aliases { serial0 = &uart4; };chosen { stdout-path = "
The associated node (including the pincontrol nodes) need to have to be accessible before the relocation with the property: "u-boot,dm-pre-reloc;", for example in <board>-u-boot.dtsi file:
&uart4 { u-boot,dm-pre-reloc; }; &uart4_pins_a { u-boot,dm-pre-reloc; pins1 { u-boot,dm-pre-reloc; }; pins2 { u-boot,dm-pre-reloc; }; };
By default, the macros used by U-Boot (debug(), pr_debug()...) do not print any trace; to activate the debug traces on a specific file, you need to enable the DEBUG compilation flag and change the LOGLEVEL for the file:
- define DEBUG before any include in the <file>.c file
#define DEBUG
#undef CONFIG_LOGLEVEL
#define CONFIG_LOGLEVEL 8
- with a Makefile
CFLAGS_<file>.o+= -DDEBUG -DCONFIG_LOGLEVEL=8
For details, see doc/README.log .
If U-Boot fails before the console configuration (in the first stage of U-Boot execution), trace is not available.
In this case, you need to:
- debug with GDB (see the next chapter)
or,
- activate the debug UART feature:
- add in defconfig of U-Boot configuration
- CONFIG_DEBUG_UART
- CONFIG_DEBUG_UART_STM32
- adpat the function board_debug_uart_init(): that configures the required resources (pad, clock) before initialization by the U-Boot driver.
This function needs to be adapted for your board.
- add in defconfig of U-Boot configuration
2. Debug with GDB
With OpenSTLinux, you can directly use GDB script Setup.gdb:
Or for manual GDB connection, you need to:
- get the elf files for U-Boot and/or SPL
(u-boot and u-boot-spl available in the build directory) - connect GDB to the target
- reset with attach the target with the gdb "monitor reset halt" command:
execution is stopped in ROM code or at the beginning of FSBL execution. - load the symbols of the binary to be debugged with commands available in next chapter:
#Load U-Boot symbol, #Load SPL symbol, #Load SPL code and debug - start execution with the "continue" command
2.1. Load U-Boot symbol
With U-Boot relocation, symbols are more difficult to load.
See https://www.denx.de/wiki/DULG/DebuggingUBoot
If you connect GDB on running target, you can load the debug symbols:
- Before relocation with "symbol-file" command:
symbol-file u-boot(gdb)
- After relocation with "add-symbol-file" command to relocate the symbol with the code offset = gd->relocaddr:
--> only for "gd_t" definition (gdb) set $offset = ((gd_t *)$r9)->relocaddr --> get relocation offset (gdb) symbol-file --> clear previous symbol (gdb) add-symbol-file u-boot $offset(gdb) symbol-file u-boot
The following GDB example script automatically loads the U-Boot symbol before and after relocation for a programmed board, after "monitor reset halt" command:
(gdb) thbreak *0xC0100000
(gdb) commands
> symbol-file u-boot
> thbreak relocate_code
> commands
> print "RELOCATE U-Boot..."
> set $offset = ((gd_t *)$r9)->relocaddr
> print $offset
> symbol-file
> add-symbol-file u-boot $offset
> thbreak boot_jump_linux
> continue
> end
> continue
> end
This script uses a temporary hardware breakpoint "thbreak" to load the symbol when U-Boot code is loaded in DDR by FSBL = TF-A or SPL at the U-Boot entry point (CONFIG_SYS_TEXT_BASE = 0xC0100000).
It allows the symbol to be loaded only when code is executed to avoid DDR access before DDR initialization.
3. Debug SPL with GDB
SPL is also supported with "stm32mp15_basic_defconfig" but only for U-Boot_SPL:_DDR_interactive_mode.