Registered User m (remove spaces) |
Registered User |
||
(21 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
<noinclude>{{ApplicableFor | |||
|MPUs list=STM32MP13x, STM32MP15x | |||
|MPUs checklist=STM32MP13x,STM32MP15x | |||
}}</noinclude> | |||
== Debug with console == | == Debug with console == | ||
See {{DocSource | domain=U-Boot |path=develop/logging.html | text=U-Boot Documentation}} or {{CodeSource | U-Boot |doc/develop/logging.rst}} for U-Boot logging details. | |||
By default, the macros used by U-Boot (debug(), pr_debug()...) | '''CONFIG_LOG''' is enable in OpenSTLinux. | ||
* define | |||
By default, traces are available on the U-Boot console which use <code>stdout-path</code> defined in the <code>chosen</code> node of the Linux kernel device tree as described in the Linux kernel binding<ref>{{CodeSource | Linux kernel | Documentation/devicetree/bindings/chosen.txt | Documentation/devicetree/bindings/chosen.txt}} the Linux kernel binding for chosen node</ref>. | |||
See page [[How_to_configure_U-Boot_for_your_board#Console|How to configure U-Boot for your board]] for configuration details. | |||
The ST boards use the default logging configuration: | |||
* {{highlight|CONFIG_LOG_DEFAULT_LEVEL}} = {{highlight|CONFIG_LOG_MAX_LEVEL}} = {{highlightParam|LOGL_INFO}} = {{highlightParam|6}}<br/>the 'debug' macros used by U-Boot (log_debug(), debug(), pr_debug()...) are removed in the U-Boot binary. | |||
* CONFIG_LOGF_FILE, CONFIG_LOGF_LINE, CONFIG_LOGF_FUNC are not activated<br/>no debug information in log messages by default. | |||
To enable all the debug traces in U-Boot you need to increase the max logging level with a major impact on U-Boot size; e.g. set {{highlight|CONFIG_LOG_MAX_LEVEL}} to {{highlightParam|LOGL_DEBUG}} by adding in your defconfig file the line: | |||
{{highlight|CONFIG_LOG_MAX_LEVEL}}={{HighlightParam|7}} | |||
When the traces are present in U-Boot, you can change the default trace level with {{highlight|CONFIG_LOG_DEFAULT_LEVEL}} or you can use the <code>log</code> command (CONFIG_CMD_LOG) to dynamically configure and filter the output: | |||
{{U-Boot$}} log level 7 | |||
{{U-Boot$}} log format all | |||
=== Activate debug trace on one file === | |||
To turn on this debug logging just in one file, you can define LOG_DEBUG and DEBUG for this file | |||
* add define before any include in the <file>.c file | |||
#define LOG_DEBUG | |||
#define DEBUG | #define DEBUG | ||
* with a Makefile | * with a Makefile | ||
CFLAGS_<file>.o+= -DDEBUG | CFLAGS_<file>.o+= -DLOG_DEBUG -DDEBUG | ||
=== Debug before console === | |||
If U-Boot fails before the console configuration (in the first stage of U-Boot execution), trace is not available. | If U-Boot fails before the console configuration (in the first stage of U-Boot execution), trace is not available. | ||
Line 27: | Line 48: | ||
*** {{Highlight|CONFIG_DEBUG_UART}} | *** {{Highlight|CONFIG_DEBUG_UART}} | ||
*** {{Highlight|CONFIG_DEBUG_UART_STM32}} | *** {{Highlight|CONFIG_DEBUG_UART_STM32}} | ||
** | ** adapt the function {{Highlight|board_debug_uart_init()}}: that configures the required resources (pad, clock) before initialization by the U-Boot driver.<br/>This function needs to be adapted for your board. | ||
== Debug with GDB == | == Debug with GDB == | ||
Line 36: | Line 57: | ||
Or for manual GDB connection, you need to: | Or for manual GDB connection, you need to: | ||
# get the [[U-Boot_overview#Output_files|elf files]] for U-Boot | # get the [[U-Boot_overview#Output_files|elf files]] for U-Boot = <code>u-boot</code> available in the build directory | ||
# connect [[GDB]] to the target | # connect [[GDB]] to the target | ||
# '''reset with attach''' the target with the gdb {{Highlight|"monitor reset halt"}} command:<br/>execution is stopped in ROM code or at the beginning of FSBL execution. | # '''reset with attach''' the target with the gdb {{Highlight|"monitor reset halt"}} command:<br/>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:<br/>[[#Load U-Boot symbol | # load the symbols of the binary to be debugged with commands available in next chapter:<br/>[[#Load U-Boot symbol]] | ||
# start execution with the {{Highlight|"continue"}} command | # start execution with the {{Highlight|"continue"}} command | ||
=== Load U-Boot symbol === | === Load U-Boot symbol === | ||
With [[U-Boot_overview#U- | With [[U-Boot_overview#U-Boot_execution_sequence|U-Boot relocation]], symbols are more difficult to load, see {{CodeSource | U-Boot | doc/README.arm-relocation}} for details. | ||
If you connect GDB on running target, you can load the debug symbols: | If you connect GDB on running target, you can load the debug symbols: | ||
Line 61: | Line 80: | ||
The following GDB example script automatically loads the U-Boot symbol before and after relocation for a programmed board, after {{Highlight|"monitor reset halt"}} command: | The following GDB example script automatically loads the U-Boot symbol before and after relocation for a programmed board, after {{Highlight|"monitor reset halt"}} command: | ||
{{GDB$}} thbreak *0xC0100000 | {{GDB$}} thbreak *{{HighlightParam|0xC0100000}} | ||
{{GDB$}} commands | {{GDB$}} commands | ||
> symbol-file u-boot | > symbol-file u-boot | ||
Line 77: | Line 96: | ||
> end | > end | ||
This script uses a temporary hardware breakpoint {{Highlight|"thbreak"}} to load the symbol when U-Boot code is loaded in DDR by FSBL = TF-A | This script uses a temporary hardware breakpoint {{Highlight|"thbreak"}} to load the symbol when U-Boot code is loaded in DDR by FSBL = TF-A at the U-Boot entry point, CONFIG_SYS_TEXT_BASE = | ||
* {{HighlightParam|0xC0000000}} for {{MicroprocessorDevice | device=13}} | |||
* {{HighlightParam|0xC0100000}} for {{MicroprocessorDevice | device=15}} | |||
It allows the symbol to be loaded only when code is executed to avoid DDR access before DDR initialization. | It allows the symbol to be loaded only when code is executed to avoid DDR access before DDR initialization. | ||
=== | == References == | ||
<references/> | |||
< | |||
<noinclude> | <noinclude> | ||
[[Category:U-Boot]] | [[Category:U-Boot|U-Boot - 8]] | ||
[[Category:Tracing tools]] | [[Category:Tracing tools]] | ||
[[Category:Debugging tools]] | [[Category:Debugging tools]] | ||
{{PublicationRequestId | 12894 | 2019-08-01}} | {{PublicationRequestId | 12894 | 2019-08-01}} | ||
</noinclude> | </noinclude> |
Latest revision as of 15:01, 2 November 2022
1. Debug with console
See U-Boot Documentation or doc/develop/logging.rst for U-Boot logging details.
CONFIG_LOG is enable in OpenSTLinux.
By default, traces are available on the U-Boot console which use stdout-path
defined in the chosen
node of the Linux kernel device tree as described in the Linux kernel binding[1].
See page How to configure U-Boot for your board for configuration details.
The ST boards use the default logging configuration:
- CONFIG_LOG_DEFAULT_LEVEL = CONFIG_LOG_MAX_LEVEL = LOGL_INFO = 6
the 'debug' macros used by U-Boot (log_debug(), debug(), pr_debug()...) are removed in the U-Boot binary. - CONFIG_LOGF_FILE, CONFIG_LOGF_LINE, CONFIG_LOGF_FUNC are not activated
no debug information in log messages by default.
To enable all the debug traces in U-Boot you need to increase the max logging level with a major impact on U-Boot size; e.g. set CONFIG_LOG_MAX_LEVEL to LOGL_DEBUG by adding in your defconfig file the line:
CONFIG_LOG_MAX_LEVEL=7
When the traces are present in U-Boot, you can change the default trace level with CONFIG_LOG_DEFAULT_LEVEL or you can use the log
command (CONFIG_CMD_LOG) to dynamically configure and filter the output:
log level 7
log format all
1.1. Activate debug trace on one file
To turn on this debug logging just in one file, you can define LOG_DEBUG and DEBUG for this file
- add define before any include in the <file>.c file
#define LOG_DEBUG
#define DEBUG
- with a Makefile
CFLAGS_<file>.o+= -DLOG_DEBUG -DDEBUG
1.2. Debug before console
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
- adapt 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 =
u-boot
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 - start execution with the "continue" command
2.1. Load U-Boot symbol
With U-Boot relocation, symbols are more difficult to load, see doc/README.arm-relocation for details.
If you connect GDB on running target, you can load the debug symbols:
- Before relocation with "symbol-file" command:
symbol-file u-boot
- After relocation with "add-symbol-file" command to relocate the symbol with the code offset = gd->relocaddr:
--> only for "gd_t" definition set $offset = ((gd_t *)$r9)->relocaddr --> get relocation offset symbol-file --> clear previous symbol add-symbol-file u-boot $offsetsymbol-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:
0xC0100000 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 > endthbreak *
This script uses a temporary hardware breakpoint "thbreak" to load the symbol when U-Boot code is loaded in DDR by FSBL = TF-A at the U-Boot entry point, CONFIG_SYS_TEXT_BASE =
It allows the symbol to be loaded only when code is executed to avoid DDR access before DDR initialization.
3. References
- ↑ Documentation/devicetree/bindings/chosen.txt the Linux kernel binding for chosen node