设备树概念

1.设备树概念:

        描述硬件信息的树形结构。描述具体某一个硬件信息的被称为设备节点,每个硬件以树形结构存储,而每个硬件上的属性以链式方式存储。

        dts:设备树源文件

        dtsi:设备树补充文件

        dtb:设备树镜像文件

        DTC:设备树编译工具

2.设备树语法:

      (1)命名格式:node-name@unit-address(节点名称@单位地址)
        节点地址必须与节点的reg属性中指定的第一个地址匹配。根节点没有节点名称和地址,用 / 表示

mynode: mynode@04000000 //label:name@address

label表示给节点名称起的别名。因此可以使用&mynode来访问该节点。

(2)

/{             //表示设备树根节点,所有设备节点都在根节点内部定义
     node1{


     }   
    
     node2{


     }

};

(3)键值对格式

        string = " hello ";

        cell = <0x1234 0xabcd>;        无符号整数

        binary = [00 01 11]     二进制数

        mixed = " hello" ,<0x1234 0x1122>,[00 01]         不同形式的数以 ,进行分隔 

        string-list ="abc","xyz"   字符串列表    

(4)标准属性

        compatible: ("厂商,设备名称")  客户端程序使用此字符串列表选择设备驱动程序。

        reg:描述设备节点的地址

        #address-cells = ; //address_cells用于描述当前子节点硬件设备地址 的无符号32整型数的个数

        #size-cells = ;//size_cell 用于描述硬件地址的长度的32无符号整型数的个数

        status:表示当前设备是否可用

        phandle:设备树中唯一节点的数字标识

(5)基本设备节点

        所有设备树文件都要包含一个根节点,且根节点下要有一个/cpu,至少有一个/memory

        /memory:内存设备节点 ,描述物理内存分布

        /choose: 不代表实际的设备,表示运行时系统固件选择和指定参数---跟uboot中设置bootcmd作用一样

        /cpu:cpu节点

3.设备树API

//设备树节点信息结构体
#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;//下一个属性结构体首地址
    };

(1)获取设备树节点信息

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

用户机数据存储模式为小端存储,而开发板为大端存储。因此需要进行大小端转换

__u32 __be32_to_cpup(const __be32 *p)
功能:u32类型数据大端转小端
参数:转换的数据首地址
返回值:返回转换后的数值

----------------------------------------------

__be32 __cpu_to_be32p(const __u32 *p)
功能:u32类型数据小端转大端
参数:转换的数据首地址
返回值:返回转换后的数值

(2)获取设备树节点属性信息

struct property *of_find_property(const struct device_node *np,
                        const char *name,
                        int *lenp)
功能:基于解析后的设备树节点信息结构体解析指定属性键值对
参数:
    np:设备树节点信息结构体指针
    name:指定的键名
    lenp:获取到的字节个数
返回值:成功返回属性结构体首地址,失败返回NULL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值