作业1/4 设备树总结

news2024/9/28 21:19:26

1.什么是设备树

        设备树(Device Tree)是用来描述(存储)硬件信息的一种树形结构,设备树在linux内核启动的时候传递给内核被内核解析,用来描述设备信息的一种方式(地址,中断号...)。设备节点中信息(属性)构成一个链表,如果你的驱动想要使用这个设备信息只需要在这个链表中获取设备信息即可。

 

2.设备树文的格式

****.dts//设备树的源码文件,类似于.c后缀的文件

****.dtsi//设备树的头文件,里面是对于源码文件的补充,类似.h后缀的文件

|

DTC //编译工具 (make dtbs 单独编译设备树源码文件生成设备树镜像文件)

|

****.dtb //设备树的二进制文件

2.1设备树语法实现

/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的子节点child_node1
            first-child-property;
            second-child-property = <1>;
            a-string-property = "Hello, world";
        };
        child-node2 {//node1的子节点child_node2
        };
    };
    node2 {//根节点的子节点
        an-empty-property;//空的键值对,一般起到标识作用
        a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
        child-node1 {
        };
    };
};
  • 设备树是从根节点 /{};开始描述
  • node1和node2是设备树的子节点
  • 设备树文件注释和c是一样的
  • 设备树每一句话后面都要以;结尾
  • 节点内部的属性是键值对:键名=数值

2.2设备树的节点命名

节点的命名形式:<name>[@<unit-adress>]

<name>:节点名字,是一个简单的 ASCII 字符串,长度最多为 31 个字符,通常,节点是根据它所代表的设备类型来命名的。

<unit-adress>:如果节点使用地址描述设备,则包含单元地址。通常,单元地址是用于访问设备的主要地址,列在节点的属性中。

例:LED@50006000{ };

同级节点必须具有唯一名称,但只要地址不同(即serial@101f1000&serial@101f2000),多个节点使用相同的通用名称是正常的。

2.3键值对的格式

        属性是简单的键值对,其中值可以为空或包含任意字节流。虽然数据类型未编码到数据结构中,但可以在设备树源文件中表示一些基本数据表示形式。

1.文本字符串(以 null 结尾)用双引号表示:
string-property = "a string";
2.“cell”是 32 位无符号整数,由尖括号分隔:
cell-property = <0xbeef 123 0xabcd1234>;
3.二进制数据用方括号分隔(用十六进制表示的单字节整数):
binary-property = [0x01 0x23 0x45 0x67];
4.不同表示形式的数据可以使用逗号连接在一起:
mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
5.逗号也用于创建字符串列表:
string-list = "red fish", "blue fish";

在linux内核里面有一些具有特殊含义的键,比如:

compatible=“厂商,设备名”

compatible="hqyj,si7006"

reg=<地址>

#address-cells:用于描述地址的uint32的个数

#size-cells:用于描述地址长度的uint32的个数

2.4向内核中添加自己的设备树节点

vi 内核源码顶层目录/arch/arm/boot/dts/stm32mp157a-fsmp1a.dts

//将下面这个节点添加在根节点内部
 mynode@0x12345678{
    compatible = "hqyj,mynode";
        astring="hello 22081";
    uint  =<0xaabbccdd 0x11223344>;
        binarry=[00 0c 29 7b f9 be];
        mixed ="hello",[11 22],<0x12345678>;
     };

3.在驱动中获取到设备树节点信息

3.1设备树节点结构体

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;//兄弟节点地址
    };

3.2 属性结构体

struct property {
    char    *name;//键名
    int length;//值的长度
    void    *value;//值
    struct property *next;//指向下一个属性节点的指针
    };

3.3获取设备数节点相关API

#include<linux/of.h>
1.struct device_node *of_find_node_by_path(const char *path)
    功能:通过路径获取设备树节点信息
path:设备树节点路径  ("/mynode@0x12345678")
返回值:成功返回目标节点首地址,失败返回NULL
2.struct device_node *of_find_node_by_name(struct device_node *from,
    const char *name);
功能:通过节点名获取设备树节点信息
参数:
    from:已知的节点首地址,(NULL,默认从根节点开始解析)
    name:节点名字:"mynode"
返回值:成功返回目标节点首地址,失败返回NULL

3.struct device_node *of_find_compatible_node(struct device_node *from,
    const char *type, const char *compat);
功能:通过节点中的conpatible来解析获取设备树节点信息
参数
    from:已知的节点首地址,(NULL,默认从根节点开始解析)
    type:填NULL
    cpmpat:compatible的值
返回值:成功返回目标节点首地址,失败返回NULL

3.4获取属性结构体相关API

struct property *of_find_property(const struct device_node *np,
                        const char *name,
                        int *lenp)
功能:
通过节点信息结构体和键名获取指定属性信息
参数:
    np:节点结构体指针
    name:键名
    lenp:获取到属性值的长度指针
返回值:成功返回目标属性结构体指针,失败返回NULL

3.5获取属性数值相关API

1.int of_property_read_u32_index(const struct device_node *np,
            const char *propname, u32 index, u32 *out_value)
功能:获取u32类型的值
参数:
    np:设备树节点结构体指针
    proname:键名
    index:索引号,第一个数值索引号为0,依次+1
    out_value:获取到的值存放的空间首地址
返回值:成功返回0,失败返回错误码
2.int of_property_read_variable_u32_array(const struct device_node *np,
                    const char *propname,
                    u32 *out_values,
                    size_t sz_min,
                    size_t sz_max)
功能:将获取到的u32类型的值存放在array数组中
参数:
    np:设备树节点结构体指针
    proname:键名
     out_value:获取到的值存放的空间首地址(数组名)
     min:期待读取到的值的最小数量
     max:期待读取到的值的最大数量
返回值:成功返回0,失败返回错误码
 
 3.int of_property_read_string(const struct device_node *np,
                      const char *propname,
                      const char **out_string)
功能:获取字符串类型的值
参数:
    np:设备树节点结构体指针
    proname:键名
    out_string:获取到的字符串类型的值的首地址
返回值:成功返回0,失败返回错误码

4.int of_property_read_variable_u8_array(const struct device_node *np,
                    const char *propname, u8 *out_values,
                    size_t sz_min, size_t sz_max)
   功能:读取u8类型的数组
     参数:
    np:设备树节点结构体指针
    proname:键名
     out_value:获取到的值存放的空间首地址(数组名)
     min:期待读取到的值的最小数量
     max:期待读取到的值的最大数量
返回值:成功返回0,失败返回错误码

5.int of_property_read_u8_array(const struct device_node *np,
                        const char *propname,
                        u8 *out_values, size_t sz)
功能:读取u8类型的数组
     参数:
    np:设备树节点结构体指针
    proname:键名
     out_value:获取到的值存放的空间首地址(数组名)
     sz:数组成员的个数
     返回值:成功返回0,失败返回错误码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《收获,不止Oracle》表的设计之五朵金花

表设计主要强调什么场合该选择什么技术&#xff0c;没有最高级的技术&#xff0c;只有最适合的技术。 1.表的特性 普通堆表的不足之处 1.查看产生多少日志 [oracleoracle-db-19c ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 4 14:27:13 20…

电商数据监测的应用价值——国内吸尘器行业数据浅析

随着科技的发展与居民生活水平的提高&#xff0c;吸尘器进入日常生活&#xff0c;成为了常见家用清洁用具之一。2022年上半年&#xff0c;吸尘器市场零售额达145亿元&#xff0c;同比增速达14.0%&#xff0c;零售量1008万台&#xff0c;同比下跌2.8%。&#xff08;数据来源&…

Hadoop HA高可用

文章目录Hadoop HA高可用1.1 HA概述1.2 HDFS-HA工作机制1.2.1 HDFS-HA工作要点1.2.2 HDFS-HA自动故障转移工作机制1.3 HDFS-HA集群配置1.3.1 环境准备1.3.2 规划集群1.3.3 配置Zookeeper集群1&#xff09;集群规划2&#xff09;解压安装3&#xff09;配置zoo.cfg文件4&#xff…

药品需求加大,蒸汽发生器等制药设备该如何快速有效地进行维护?

一、行业背景药品的生产与制造的每一道关卡都是十分严格的&#xff0c;一方面&#xff0c;涉及到化工污染问题&#xff0c;制药的废气一旦没有得到妥善处理&#xff0c;则会危及到周边居民以及企业工作人员的健康。另一方面&#xff0c;药品本着治病救人的原则&#xff0c;其品…

[Android]序列化原理Serializable

引入 我们知道&#xff0c;当一个程序终止时&#xff0c;这个程序创建的对象也会随着程序终止&#xff0c;那么我需要如何做才能不受其他程序的状态影响并且可以得到其他程序创建的对象状态呢&#xff1f;这时候我们就可以使用Serializable来进行序列化把对象持久化到存储设备上…

【服务器数据恢复】断电导致服务器故障的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌服务器&#xff0c;12块硬盘组成raid5磁盘阵列&#xff0c;存储普通文件。 服务器故障&#xff1a; 机房供电不稳定导致服务器断电&#xff0c;管理员重启服务器后发现服务器无法正常使用。 根据用户描述&#xff0c;北亚服务器数据恢复工…

使用vscode在CMake工程中集成gtest共享库进行单元测试

使用vscode在CMake工程中集成gtest共享库做单元测试一、概述二、工程内容清单三、CMakeLists.txt内容说明四、构建工程一、概述 本文主要介绍如何在一个多层次目录结构的CMAKE工程中以共享库的形式集成gtest进行单元测试。 关于如何使用CMake管理多层次目录结构的CMake工程&a…

FFmpeg 解复用实战

1.封装格式相关函数 avformat_alloc_context()&#xff1a;负责申请一个AVFormatContext结构的内存,并进行简单初始化&#xff0c;这个函数可以不用手动调用&#xff0c;内部会自动调用。 avformat_free_context()&#xff1a;释放该结构里的所有东西以及该结构本身&#xff0…

再学C语言24:分支和跳转——逻辑运算符和条件运算符

一、多重选择else if 功能&#xff1a;在两个以上的语句中作出选择 示例代码&#xff1a; #include <stdio.h> int main(void) {float score;printf("Please enter your score: \n");scanf("%f", &score);if(score < 60)printf("不及…

SSM基础整合

SSM基础整合 文章目录SSM基础整合[toc]SSM基础整合SSM整合流程表现层数据封装设置统一数据返回结果类定义code类优化Controller优化后的返还结果异常处理器异常处理项目异常处理方案项目异常分类处理SSM基础整合 SSM整合流程 创建工程 SSM整合 Spring SpringConfig Configur…

CAS 的使用场景 CAS的ABA问题的优化 以及 synchronized 的三大优化

目录 &#x1f388;专栏链接:多线程相关知识详解 一.什么是CAS 二.CAS最常用的两个场景 Ⅰ.实现原子类 Ⅱ.实现自旋锁 三.CAS的ABA问题 四.优化解决CAS的ABA问题 五.synchronized的优化 Ⅰ.锁升级/锁膨胀 Ⅱ.锁消除 Ⅲ.锁粗化 一.什么是CAS CAS&#xff08;Compar…

p2深度学习基本概念简介下笔记

3. 第 1 讲&#xff1a;深度学习基本概念简介下_哔哩哔哩_bilibili 线性模型太简单&#xff0c;我们需要比较复杂的模型。 不管怎样弄&#xff0c;蓝色描述不出红色的线 强调model bias 无法模拟真实的状况 写出一个有未知参数更复杂的model 观察红色的曲线 &#xff1a;可…

你知道数据在内存中是如何存储的嘛?

&#x1f996;作者&#xff1a;学写代码的恐龙 &#x1f996;博客主页&#xff1a;学写代码的恐龙博客主页 &#x1f996;专栏&#xff1a;【初级c语言】 &#x1f996;语录&#xff1a;❀未来的你&#xff0c;一定会感谢现在努力奋斗的自己❀ 深度剖析数据在内存中的存储一、…

数据结构精讲——排序(二)

数据结构精讲——排序&#xff08;二&#xff09; 排序的分类 上节课我们已经了解过插入排序和选择排序&#xff0c;这节课主要讲的是快排排序&#xff0c;冒泡排序应该都很熟悉&#xff0c;少提一下吧。 冒泡排序 冒泡排序是我们刚接触编程时就学习的排序方法&#xff08;还…

达梦数据库实施、运维与使用经验(一)

一、使用Xshell输入Insert语句&#xff0c;回车执行系统没反应 问题解决思路 查下数据库的活动会话数并登录数据库服务器看数据库的资源负载 select * from v$sessions where stateACTIVE;在数据库Xshell中输入语句查询数据库磁盘是否满了 df -lh上图中的第一个命令是用来查…

C++的IO流

目录 1. 流是什么 2. CIO流 2.1 C标准IO流 2.2 C文件IO流 2.2.1 简单读取文件流 2.2.2 C读取文件巧妙之处 3. stringstream的简单介绍 1. 流是什么 “流”即是流动的意思&#xff0c;是物质从一处向另一处流动的过程&#xff0c;是对一种有序连续且具有方向性的数据&am…

【我的渲染技术进阶之旅】关于OpenGL纹理压缩的相关资料

文章目录一、为啥要了解压缩纹理1.1 为啥要使用压缩纹理1.2 如何自定义压缩纹理以及使用压缩纹理的效果1.2.1 使用压缩纹理节省显存1.2.2 自定义压缩纹理&#xff1a;将压缩好的纹理数据保存在本地1.2.3 使用自定义的压缩纹理1.2.3 示例原理二、纹理压缩相关知识2.0 什么是压缩…

FOLOLane论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/2105.13680.pdf 一、论文创新点 主流的车道线检测方法使用语义分割和聚类实现&#xff0c;但像素级的输出存在信息冗余&#xff0c;同时会带来大量噪声。而该论文使用两个分支&#xff0c;一个输出heatmap用于判断像素是否是关键点…

干货 | 初窥 Pytest 测试框架,基础薄弱也能轻松 hold 住

pytest 是一个成熟的全功能Python测试工具&#xff0c;可以帮助您编写更好的程序。它与 python 自带的 unittest 测试框架类似&#xff0c;但 pytest 使用起来更简洁和高效&#xff0c;并且兼容 unittest 框架。pytest 能够支持简单的单元测试和复杂的功能测试&#xff0c;pyte…

java中修改List的对象元素时碰到的坑

坑 case1 case1:Data class Person {Integer age;String name;public Person(Integer age, String name) {this.age age;this.name name;} } List<Person> v1List new ArrayList<>(); v1List.add(new Person(11, "小刚")); v1List.add(new Person(1…