diff options
-rw-r--r-- | includes/dt_util.h | 4 | ||||
-rw-r--r-- | modules/devices/devicetree/dt_util.c | 16 |
2 files changed, 19 insertions, 1 deletions
diff --git a/includes/dt_util.h b/includes/dt_util.h index 4f4daac1..bf56c293 100644 --- a/includes/dt_util.h +++ b/includes/dt_util.h @@ -9,7 +9,7 @@ #define DTEX_MTUP 0 #ifndef DTR_ROOT -#define DTR_ROOT "/proc/device-tree" +#define DTR_ROOT dtr_find_device_tree_root() #endif enum { @@ -70,4 +70,6 @@ char *dtr_list_hex(dt_uint *list, unsigned long count); char *dtr_maps_info(dtr *); /* returns hardinfo shell section */ +const char *dtr_find_device_tree_root(void); + #endif diff --git a/modules/devices/devicetree/dt_util.c b/modules/devices/devicetree/dt_util.c index dbeda3a6..845ea8da 100644 --- a/modules/devices/devicetree/dt_util.c +++ b/modules/devices/devicetree/dt_util.c @@ -192,6 +192,22 @@ void _dtr_read_aliases(dtr *); void _dtr_read_symbols(dtr *); void _dtr_map_phandles(dtr *, char *np); +const char *dtr_find_device_tree_root() { + char *candidates[] = { + "/proc/device-tree", + "/sys/firmware/devicetree/base", + /* others? */ + NULL + }; + int i = 0; + while (candidates[i] != NULL) { + if(access(candidates[i], F_OK) != -1) + return candidates[i]; + i++; + } + return "/did/not/find/device-tree"; +} + dtr *dtr_new_x(char *base_path, int fast) { dtr *dt = malloc(sizeof(dtr)); if (dt != NULL) { |