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);