设备树是描述硬件信息的一种树形结构,设备书文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存储。
所以对设备树文件解析就要
1.先获取他的设备节点
设备节点函数有:
(1)of_find_get_node_from_name(truct device_node *from, const char *name)
功能:通过设备节点的名字解析设别树文件结构体
返回值:成功返回struct device_node *类型的设备树文件结构体指针,失败返回NULL
(2)of_find_get_node_from_path(const char *path)
功能:根据设备树节点路径解析设备树节点
返回值:成功返回struct device_node *类型的设备树文件结构体指针,失败返回NULL
(3)of_find_compatible_node(struct device_node *from, const char *type, const char *compat);
功能:根据设备树节点中compatibe键来解析设备树节点
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL
获取到设备树节点信息结构体后,可以选择解析后的设备节点信息结构体指针找到节点属性结构体解析节点属性信息,或者直接通过节点找到
设备树节点属性结构体内部指针进行打印
2.获取设备树节点属性
(1)通过解析节点信息结构体指针解析设备树属性信息
compatible = "hqyj,mynode";
打印上述内容需要设备节点信息结构体指针,node找到节点属性结构体指针properties中的value指针获取到值即:
printk("name=%s,value=%s\n",node->properties->name,(char *)(node->properties->value));
对于键值是整形数的需要注意大小端转换
__u32 __be32_to_cpup(const __be32 *p)
功能:u32类型数据大端转小端
参数:转换的数据首地址 返回值:返回转换后的数值
__be32 __cpu_to_be32p(const __u32 *p)
(2)通过获取设备树节点属性信息的相关API解析指定属性键值对
struct property *of_find_property(const struct device_node *np, const char *name, int *lenp)
功能:基于解析后的设备树节点信息结构体解析指定属性键值对
键值是字符串类型
:直接打印
键值是整形类型
:按字节循环打印
(3)根据设备树节点信息结构体和键名解析uint类型的值
int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value)
int of_property_read_u8_array(const struct device_node *np, const char *propname, u8 *out_values, size_t sz)
(4)读取设备树节点配置信息中键值为字符串的信息
int of_property_read_string(const struct device_node *np, const char *propname, const char **out_string)