U-boot 设备树解析API接口
U-boot 启动过程中,会解析设备树文件,提取节点信息,创建对应的udevice,绑定对应的driver,然后调用对应的probe去初始化硬件。
U-boot提供了一系列API接口函数,用来解析二进制的设备树blob文件。
1.获得dtb下某个节点的路径path的偏移。这个偏移就代表了这个节点:
int fdt_path_offset(const void *fdt, const char *path)
示例:node = fdt_path_offset(gd->fdt_blob, “/aliases”);
在上面的示例中,传递的实参 gd->fdt_blob 保存的是dtb在内存中的地址。
2.获得节点node的某个字符串属性值:
void *fdt_getprop(const void *fdt, int nodeoffset, const char *name, int *lenp)
示例: mac = fdt_getprop(gd->fdt_blob, node, “mac-address”, &len);
3.获得节点node的某个整形数组属性值:
int fdtdec_get_int_array(const void *blob, int node, const char *prop_name, u32 *array, int count)
示例: ret = fdtdec_get_int_array(blob, node, “interrupts”, cell, ARRAY_SIZE(cell));
4.获得节点node的地址属性值:
fdt_addr_t fdtdec_get_addr(const void *blob, int node, const char *prop_name);
示例:fdtdec_get_addr(blob, node, “reg”);
5.获得config节点下的整形属性、bool属性、字符串等:
int fdtdec_get_config_int(const void *blob, const char *prop_name, int default_val);
int fdtdec_get_config_bool(const void *blob, const char *prop_name);
char *fdtdec_get_config_string(const void *blob, const char *prop_name);
6.获得chosen下的name节点的偏移:
int fdtdec_get_chosen_node(const void *blob, const char *name);
7.获得chosen下name属性的值:
const char *fdtdec_get_chosen_prop(const void *blob, const char *name);
8.获得节点node的某个整形属性值:
int fdtdec_get_int(void *blob, int node, const char *prop_name, int default_val);
示例: bus->udelay = fdtdec_get_int(blob, node, “i2c-gpio,delay-us”, DEFAULT_UDELAY);
9.获得节点node的某个无符号整形属性值:
unsigned int fdtdec_get_uint(const void *blob, int node, const char *prop_name,
unsigned int default_val);