关于设备树的理解:
设备树(Device Tree)是一种用于特定硬件设备的解释语法树。它用来表示
存储有关主板硬件和CPU架构信息
的数据在内核中的传递格式,使内核可以更好地了解硬件并支持它们,而不必编写固定的代码。设备节点是一颗带着叶子和枝的树,它的枝分支表示硬件结构之间的关系类型。它使硬件设备作为一个有意义的结构,以及由几个硬件设备组成的总体设备的依赖关系。描述一个设备信息的节点,我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存储。
设备树文件格式:
设备树(Device Tree)提供给Linux系统一种标准的用于描述硬件和软件间通信的表示方式。设备树是一种描述性的格式,它包括单个阴影的集合,按照一定的结构和内容构成。
设备树包括3个部分:
- 设备树头(Device Tree Header):它定义了该文件的格式版本及操作系统/芯片平台等信息。
- 设备节点(device Nodes):它描述了系统中的设备,如 CPU、GPIO、I2C等等。
- 引导参数( boot args):它用于描述设备树加载时进行系统初始化所需要的参数以及将来设备树中所定义的设备加载在内存中时所需要的参数。
每个设备树的结构中都会有一个root节点,它的名字一般是
/
。节点具有属性,即name/value串,name/value串存储于device-levels中,路径由从root node开始,在*.dts*文件中由空格分隔的文本字符串标识。另外,设备树的属性还可以由
#cells
,phandle
,reg
,compatible
等标签标识,它们代表了设备的总体概括信息,以及设备如何组合,结构和行为方式。
设备树基本语法
设备树是节点和属性的简单树结构。属性是键值对,节点可以同时包含属性和子节点。
例:
/dts-v1/;//当前使用的设备树的版本号
/ {//设备树的根节点 node1
{//子节点node1 a-string-property = "A string";//属性-》键值对
a-string-list-property = "first string", "second string";
// hex is implied in byte arrays. no '0x' prefix is required
a-byte-data-property = [01 23 34 56];
child-node1 {//node1节点的子节点
first-child-property;//空属性,只起到标识作用
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 {//子节点node2
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
在驱动中获取设备树信息
设备树节点信息结构体
在内核里面存在一个结构体 struct device_node,用于存放设备节点信息
struct device_node {
const char *name; //设备节点名字 mynode
const char *full_name;//设备节点完整名字 mynode@0x12345678
struct property *properties;//键值对结构体(属性结构体)
struct device_node *parent;//父节点地址
struct device_node *child;//子节点地址
struct device_node *sibling;//兄弟节点地址
};
节点属性结构体:
struct property {
char *name;//键的名字
int length;//值的长度(字节)
void *value;//值
struct property *next;//指向下一个节点的指针
};
自动获取设备树节点API
struct device_node *of_find_node_by_path(const char *path)
功能:通过节点路径获取设备节点
参数: path:节点路径("/mynode@0x12345678")
返回值:成功返回指向设备节点信息结构体空间的指针,失败返回NULL
struct device_node *of_find_node_by_name(struct device_node *from, const char *name)
功能:通过节点名字获取设备节点
参数: from:父节点指针,填NULL,默认从根节点帮我们解析寻找
name:设备节点名:"mynode"
返回值:成功返回指向设备节点信息结构体空间的指针,失败返回NULL
struct device_node *of_find_compatible_node( struct device_node *from, const char *type, const char *compat)
功能:通过compatible来解析节点
参数: from:NULL,默认从根节点开始解析
type:NULL compat:compatible的值
返回值:成功返回指向设备节点信息结构体空间的指针,失败返回NULL
__u32 __be32_to_cpup(const __be32 *p)
功能:将大端字节序转化为小端字节序
参数:数据指针
返回值:成功返回转化后的数据,失败返回-1
属性解析API
struct property *of_find_property(const struct device_node *np, const char *name, int *lenp) 功能:根据解析的节点结构体得到属性结构体信息
参数: np:设备节点首地址
name:键名
lenp:获取到的值的字节数
返回值:成功返回属性结构体地址,失败返回空