当前位置: 首页 > news >正文

Linux驱动->设备树

1.定义

设备树(device tree是描述硬件信息的一种树形结构,设备书文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同

2.设备树的文件格式

内核顶层目录下/arch/arm/boot/dts:设备树文件存放路径

单独编译设备树文件:make dtbs

***.dts//设备树源码文件

***.dtsi //设备树的补充文件或者头文件

|

|

DTC(编译设备树的编译工具)

|

|

***.dtb //编译后设备树的镜像文件

3.设备树的语法

3.1 设备树的语法实现

参考官网设备树语法解析文件:Device Tree Usage - eLinux.org

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

/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 requireda-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 {};};
};
  • 设备树是从根节点开始描述的:/{};
  • node1和node2是属于根节点的子节点
  • 设备树文件内部注释和c语言一样 //
  • 设备树每一条语句结束都以‘;’结尾
  • 节点内的属性都是键值对

3.2 设备树中节点的命名

节点命名规则:[@

name指的是节点名字,是一个简单的 ASCII 字符串,长度最多为 31 个字符。通常,节点是根据它所代表的设备类型来命名的。如果节点使用地址描述设备,则包含unit-address ex:GPIO@50006000

3.3 键值对格式

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

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

注:在linux内核中有一些具有特定含义的键,比如:

compatible = "厂商,设备名字;

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

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

reg:用于描述当前节点的地址

3.4 添加自定义设备树节点

编写

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

//在根节点内部添加自定义设备树节点

mynode@0x12345678

{

compatible = "hqyj,mynode";

astring="hello 22091";

uint =<0xaabbccdd 0x11223344>;

binarry=[00 0c 29 7b f9 be];

mixed ="hello",[11 22],<0x12345678>;

};

4.在驱动程序中获取设备树信息

4.1 设备树节点信息结构体

#include<linux/of.h>
struct device_node {const char *name;    //设备树节点名   mynodeconst char *full_name;//完整的设备树节点名  mynode@0x12345678struct  property *properties;//属性链表头节点struct  device_node *parent;//父节点地址struct  device_node *child;//子节点地址struct  device_node *sibling;//兄弟节点地址
};

4.2 设备树节点属性结构体

struct property {char    *name;//键名int length;//值的长度void    *value;//值struct property *next;//下一个属性结构体首地址};

4.3 获取设备树节点信息的相关API

1.struct device_node *of_find_node_by_name(struct device_node *from,const char *name);
功能:根据设备树节点的名字解析设备树节点
参数:
from:当前节点父节点首地址(不知道就填NULL,默认从设备树根节点开始解析)
name:设备树节点名字  mynode
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL2.struct device_node *of_find_node_by_path(const char *path)
功能:根据设备树节点路径解析设备树节点
参数:
path:设备树节点路径  /mynode0x12345678
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL3.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***************
__u32 __be32_to_cpup(const __be32 *p)
功能:u32类型数据大端转小端
参数:转换的数据首地址
返回值:返回转换后的数值
__be32 __cpu_to_be32p(const __u32 *p)

http://www.lryc.cn/news/5031.html

相关文章:

  • 一天一道力扣题
  • 算法leetcode|36. 有效的数独(rust重拳出击)
  • 都说爱有回音,这次情人节驱动人生宠你!
  • npm安装依赖报错 npm code ERESOLVEnpm ERESOLVE unable to resolve dependency tree
  • 【项目设计】—— 基于Boost库的搜索引擎
  • 全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法
  • 联想K14电脑开机全屏变成绿色无法使用怎么U盘重装系统?
  • Spring Boot HTTP 400排查
  • 【手撕源码】vue2.x中keep-alive源码解析
  • ROS2机器人编程简述humble-第四章-BASIC DETECTOR .3
  • 【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(双向LSTM,附完整代码和数据集)
  • 【Linux】多线程编程 - 同步/条件变量/信号量
  • ES优化方案
  • 从数据备份保护到完整生命周期管理平台,爱数全新发布 AnyBackup Family 8
  • Go 微服务开发框架 DMicro 的设计思路
  • 浅谈功能测试
  • UDP的详细解析
  • 史上最详细JUC教程之Synchronized与锁升级详解
  • Vue|初识Vue
  • 在职阿里6年,一个29岁女软件测试工程师的心声
  • (C语言)自定义类型,枚举与联合
  • node.js服务端笔记文档学会写接口,学习分类:path、包、模块化、fs、express、中间件、jwt、开发模式、cors。
  • 初始C++(三):引用
  • 【前端】参考C站动态发红包界面,高度还原布局和交互
  • VR全景带你浪漫“狂飙”情人节,见证甜蜜心动
  • Linux系统安全之iptables防火墙
  • 【C#基础】C# 变量与常量的使用
  • [ 常用工具篇 ] CobaltStrike(CS神器)基础(一) -- 安装及设置监听器详解
  • Redis集群
  • 00---C++入门