[U-Boot] [PATCH 004/126] dm: core: Add documentation on how to debug driver model
sjg at chromium.org
Wed Sep 25 14:55:48 UTC 2019
Sometimes devices don't appear and it can be confusing. Add a few notes to
help with this situation.
Signed-off-by: Simon Glass <sjg at chromium.org>
doc/driver-model/debugging.rst | 62 ++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
create mode 100644 doc/driver-model/debugging.rst
diff --git a/doc/driver-model/debugging.rst b/doc/driver-model/debugging.rst
new file mode 100644
@@ -0,0 +1,62 @@
+.. SPDX-License-Identifier: GPL-2.0+
+.. sectionauthor:: Simon Glass <sjg at chromium.org>
+Debugging driver model
+This document aims to provide help when you cannot work out why driver model is
+not doing what you expect.
+Useful techniques in general
+Here are some useful debugging features generally.
+ - If you are writing a new feature, consider doing it in sandbox instead of
+ on your board. Sandbox has no limits, allows each debugging (e.g. gdb) and
+ you can writing emulators for most common devices.
+ - Put '#define DEBUG' at the top of a file, to activate all the debug() and
+ log_debug() statements in that file.
+ - Where logging is used, change the logging level, e.g. in SPL with
+ CONFIG_SPL_LOG_MAX_LEVEL=7 (which is LOGL_DEBUG) and
+ - Where logging of return values is implemented with log_msg_ret(), set
+ CONFIG_LOG_ERROR_RETURN=y to see exactly where the error is happening
+ - Make sure you have a debug UART enabled - see CONFIG_DEBUG_UART. With this
+ you can get serial output (printf(), etc.) before the serial driver is
+ - Use a JTAG emulator to set breakpoints and single-step through code
+Not that most of these increase code/data size somewhat when enabled.
+Failure to locate a device
+Let's say you have uclass_first_device_err() and it is not finding anything.
+If it is returning an error, then that gives you a clue. Look up linux/errno.h
+to see errors. Common ones are:
+ - -ENOMEM which indicates that memory is short. If it happens in SPL or
+ before relocation in U-Boot, check CONFIG_SPL_SYS_MALLOC_F_LEN and
+ CONFIG_SYS_MALLOC_F_LEN as they may need to be larger. Add '#define DEBUG'
+ at the very top of malloc_simple.c to get an idea of where your memory is
+ - -EINVAL which typically indicates that something was missing or wrong in
+ the device tree node. Check that everything is correct and look at the
+ ofdata_to_platdata() method in the driver.
+If there is no error, you should check if the device is actually bound. Call
+dm_dump_all() just before you locate the device to make sure it exists.
+If it does not exist, check your device tree compatible strings match up with
+what the driver expects (in the struct udevice_id array).
+If you are using of-platdata (e.g. CONFIG_SPL_OF_PLATDATA), check that the
+driver name is the same as the first compatible string in the device tree (with
+invalid-variable characters converted to underscore).
+If you are really stuck, #define DEBUG at the top of lists.c should show you
+what is going on.
More information about the U-Boot