什么是设备树
设备树是一种结构化的文件,通常在嵌入式Linux中用来表示和控制硬件设备。它由一系列键值对组成,用于标识某个硬件节点以及为其指定属性和设备标识。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存储。
键值对的格式
文本字符串(以 null 结尾)用双引号表示:
string-property = “a string”;
“cell”是 32 位无符号整数,由尖括号分隔:
cell-property = <0xbeef 123 0xabcd1234>;
二进制数据用方括号分隔:
binary-property = [0x01 0x23 0x45 0x67];
不同表示形式的数据可以使用逗号连接在一起:
mixed-property = “a string”, [0x01 0x23 0x45 0x67], <0x12345678>;
逗号也用于创建字符串列表:
string-list = “red fish”, “blue fish”;
添加自定义设备节点
mynode@0x12345678{
compatible = "hqyj,mynode";
astring="hello world";
uint =<0xaabbccdd 0x11223344>;
binarry=[00 0c 29 7b f9 be];
mixed ="hello",[11 22],<0x12345678>;
};
驱动程序中如何获取设备数信息
获取设备树节点信息
一、根据设备树节点的名字解析设备树节点
struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);
二、根据设备树节点路径解析设备树节点
struct device_node *of_find_node_by_path(const char *path)
三、根据设备树节点中compatibe键来解析设备树节点
struct device_node *of_find_compatible_node(struct device_node *from,
const char *type, const char *compat);
解析设备树节点属性
基于解析后的设备树节点信息结构体解析指定属性键值对
struct property *of_find_property(const struct device_node *np,const char *name,int *lenp)
代码实例
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/device.h>
#include <linux/poll.h>
#include <linux/of.h>
struct device_node *node;
struct property *pr;
int len;
static int __init mycdev_init(void)
{
int i;
// 解析设备树节点
node = of_find_node_by_path("/mynode@0x12345678");
if (node == NULL)
{
printk("设备树节点信息解析失败\n");
return -ENOENT;
}
pr = of_find_property(node, "astring", &len);
printk("name = %s value = %s", pr->name, (char *)pr->value);
if(len) {
for (i = 0; i < len; i++)
{
printk("name=%s,value=%x\n", pr->name, ((char *)pr->value)[i]);
}
}
return 0;
}
static void __exit mycdev_exit(void)
{
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");