设备树及其解析相关API

设备树

一、概念

设备树:描述硬件信息的一种树形结构,在linux内核启动后被内核解析。
设备节点:描述一个硬件设备信息的节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存储。

***.dts :设备树源码文件
***.dtsi : 设备树的补充文件或者头文件
***.dtb :编译后设备树的镜像文件
DTC :编译设备树的编译工具

二、语法格式

设备树是节点和属性的简单树结构。
属性是键值对,节点可以同时包含属性和子节点。
参考代码1:

/dts-v1/;  //设备树的版本号

/ {    // '/'表示设备树的根节点,所有的节点信息都在根节点内部定义
    node1 {  //node1是设备树根节点的子节点
        a-string-property = "A string";   //node1节点内部的属性,键值对
        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 {  //根节点的子节点
        an-empty-property;
        a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
        child-node1 {
        };
    };
};

参考代码2:

文本字符串(以 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";

总结:

设备树是从根节点开始描述的:/{};
node1和node2是属于根节点的子节点
设备树文件内部注释和c语言一样  //
设备树每一条语句结束都以‘;’结尾
节点内的属性都是键值对
节点命名规则:<name>[@<unit-address>
name指的是节点名字,是一个简单的 ASCII 字符串,长度最多为 31 个字符。通常,节点是根据它所代表的设备类型来命名的。如果节点使用地址描述设备,则包含unit-address    ex:GPIO@50006000

三、相关结构体

设备信息结构体

#include<linux/of.h>
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

1.struct device_node *of_find_node_by_name(struct device_node *from,const char *name);
功能:根据设备树节点的名字解析设备树节点
参数:
from:当前节点父节点首地址(不知道就填NULL,默认从设备树根节点开始解析)
name:设备树节点名字  mynode
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL

2.struct device_node *of_find_node_by_path(const char *path)
功能:根据设备树节点路径解析设备树节点
参数:
path:设备树节点路径  /mynode0x12345678
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL

3.struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compat);
功能:根据设备树节点中compatibe键来解析设备树节点
参数:
from:NULL,默认从根节点开始解析
type:NULL
compat:填写要解析的设备树节点中compatible的值
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL

*********关于设备驱动中大小端转换相关API***************
4.__u32 __be32_to_cpup(const __be32 *p)
功能:u32类型数据大端转小端
参数:转换的数据首地址
返回值:返回转换后的数值
5.struct property *of_find_property(const struct device_node *np,const char *name,int *lenp)
功能:基于解析后的设备树节点信息结构体解析指定属性键值对
参数:
    np:设备树节点信息结构体指针
    name:指定的键名
    lenp:获取到的字节个数
返回值:成功返回属性结构体首地址,失败返回NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值