Linux 设备树基本简介

简介: 设备树(Device Tree)是一种描述硬件的数据结构在操作系统引导阶段进行设备初始化的时候,数据结构中的硬件信息被检测并传递给操作系统

一:基本简介


设备作用:提供设备信息


设备树(Device Tree)是一种描述硬件的数据结构在操作系统引导阶段进行设备初始化的时候,数据结构中的硬件信息被检测并传递给操作系统


设备树: 设备树源文件(xxxx.dts) —DTC—>>> 设备树二进制文件(xxxx.dtb)


设备树基本语法:

设备树的基本单元是节点(node),这些node被组织成树状结构,除了root node,每个node都只有一个parent node,一个device tree文件中只能有一个root node。每个node中包含了若干的键值对(property/value)来描述该node的一些特性。每个node用节点名字标识。


节点名命名规范:节点名字的格式是[@]。如果该node没有reg属性,那么该节点名字中不能包括@unit-address。unit-address的具体格式是和设备挂在哪个bus上相关。例如对于CPU,其unit-address就是从0开始编址,以此加1,而具体的设备,例如以太网控制器,其unit-address就是寄存器地址。根节点的节点名是确定的,必须是“/”。


节点别名:一个设备可能会使用到别的节点的内容,可以通过节点的别名来引用到其内容。引用的目的可能是合并两个节点的内容、 替换部分内容、或是使用部分内容


20200309211147517.png


节点名 : demo0@0x48000000

节点路径: /demo0@0x48000000

节点别名: demo

demo等价/demo0@80000000


  合并节点内容:一个硬件设备的部分信息不会变化,但是另一部分信息是有可能会变化的,就出现了节点内容合并。即:先编写好节点,仅仅描述部分属性值;使用者后加一部分属性值。在同级路径下,节点名相同的“两个”节点实际会自动合并成一个节点
  设备树键值对相关语法:[1]. 字符串信息     compatible = "qf-edu,iot-test";[2]. 32位无符号整形数组    word-array = <32 45 67 89>;              例子:reg = <0x10001000 0x24   0x20001000 0x24>;[3]. 二进制数组    bi-array = [0c 20 11 24];           例子:mac = [FE 02 11 CB 40  58];[4]. 字符数组     string-list = "aaa" , "bbb" , "ccc";
默认意义的属性:
[1].   设备树语法中已经定义好的,具有通用规范意义的属性如果是设备信息和驱动分离框架的设备节点,则能够在内核初始化找到节点时候,自动解析生成相应的设备信息。
常见属性的有: compatible、地址address、中断interrupt      [2]. ARM Linux内核定义好的,一类设备通用的有默认意义的属性不能被内核自动解析生成相应的设备信息,但是内核已经编写了相应的解析提取函数。    常见属性的有: MAC地址、 GPIO、 clock ...
Compatible属性:用于匹配设备节点和设备驱动的属性,规则是驱动设备ID表中的compatible域的值(字符串),和设备树中设备节点中的compatible属性值完全一致。
    compatible=“厂商名,设备名” ;


platform_driver--->>>struct 
device_driver driver;
struct of_device_id{  
char  compatible[128];      //用来和设备树中的
compatible属性进行匹配  
kernel_ulong_t data;#endif};


地址属性:

reg 描述地址表

#address-cells:描述子节点reg属性值的地址表中首地址元素的数量

#size-cells :描述子节点reg属性值的地址表中地址长度元素的数量


GPIO属性:

gpio-controller:说明该节点描述的是一个gpio控制器

#gpio-cells:描述gpio使用节点的属性一个cell的内容属性名=<&引用GPIO节点别名 GPIO标号 工作模式>;

eg: gpios = <&gpx0 1 1> ;


中断属性:Documentation/devicetree/bindings/interrupt-controller/interrupts.txtDocumentation/devicetree/bindings/interrupt-controller/arm,gic.txt

interrupt-controller 一个空属性用来声明这个node接收中断信号#interrupt-cells 这是中断控制器节点的属性,用来标识这个控制器需要几个单位做中断描述符interrupt-parent 标识此设备节点属于哪一个中断控制器,如果没有设置这个属性,会自动依附父节点的interrupts 一个中断标识符列表,表示每一个中断输出信号


驱动代码中如何从设备树上获取设备信息:


struct device_node {
const char *name; //名字
const char *type; //类型
char *full_name; //节点全名
};
//1.获取节点struct device_node *of_find_node_by_name(struct device_node *from,const char *name);功能:通过节点名字查询获取节点参数: @from 查找的时候,从from节点开始向下查找,如果传NULL,从根节点开始查找 @name 节点名返回值:成功返回节点结构体指针,失败返回NULL
struct device_node *of_find_node_by_type(struct device_node *from,const char *type);
功能:通过节点类型查询获取节点
参数:
@from 查找的时候,从from节点开始向下查找,如果传NULL,从根节点开始查找
@type 节点类型 device_type = “mydemo”;返回值:成功返回节点结构体指针,失败返回NULL


struct device_node *of_find_node_by_path(const char *path);
功能:通过路径来查找
参数:    @path  节点路径
返回值:成功返回节点结构体指针,失败返回NULL


//2.获取属性值
int of_property_read_u32_array(const struct device_node *np,const char *propname,\
u32 *out_values, size_t sz)
功能:获取无符号32位整型数组值
参数:
@np 设备节点结构体指针
@propname 属性名
@out_values 存放u32类型数据的地址(定义一个u32类型的数组,将数组首地址传递过 来)
@sz 获取数组元素的个数


int of_property_read_string(struct device_node *np, const char *propname,const char **out_string)
功能:获取字符串属性值
参数:
@np 设备节点结构体指针
@propname 属性名
@out_string 存放字符串地址的变量


相关文章
|
3月前
|
Linux 编译器 开发者
Linux设备树解析:桥接硬件与操作系统的关键架构
在探索Linux的庞大和复杂世界时🌌,我们经常会遇到许多关键概念和工具🛠️,它们使得Linux成为了一个强大和灵活的操作系统💪。其中,"设备树"(Device Tree)是一个不可或缺的部分🌲,尤其是在嵌入式系统🖥️和多平台硬件支持方面🔌。让我们深入了解Linux设备树是什么,它的起源,以及为什么Linux需要它🌳。
Linux设备树解析:桥接硬件与操作系统的关键架构
|
3月前
|
Linux
嵌入式linux系统设备树实例分析
嵌入式linux系统设备树实例分析
83 0
|
6天前
|
Linux SoC
Linux设备树(DTS)
Dts:DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息。一般都是固定信息,无法变更,无法overlay。 设备树由来 linux内核源码中,之前充斥着大量的平台相关(platform Device)配置,而这些代码大多是杂乱且重复的,这使得ARM体系结构的代码维护者和内核维护者在发布一个新的版本的时候有大量的工作要做,以至于LinusTorvalds 在2011年3月17日的ARM Linux邮件列表中宣称“Gaah.Guys,this whole ARM thing is a f*cking pain in the ass”这使得整个ARM社区不得不
16 1
Linux设备树(DTS)
|
2月前
|
缓存 Linux 程序员
老程序员分享:linux下netlink的使用简介
老程序员分享:linux下netlink的使用简介
|
5天前
|
Unix Linux Shell
Linux I/O 重定向简介
Linux I/O 重定向简介
15 2
|
5天前
|
Unix Linux Shell
Linux 权限简介
Linux 权限简介
15 1
|
14天前
|
存储 Unix Linux
揭秘Linux硬件组成:从内核魔法到设备树桥梁,打造你的超级系统,让你的Linux之旅畅通无阻,震撼体验来袭!
【8月更文挑战第5天】Linux作为顶级开源操作系统,凭借其强大的功能和灵活的架构,在众多领域大放异彩。本文首先概述了Linux的四大核心组件:内核、Shell、文件系统及应用程序,并深入探讨了内核的功能模块,如存储、CPU及进程管理等。接着介绍了设备树(Device Tree),它是连接硬件与内核的桥梁,通过DTS/DTB文件描述硬件信息,实现了跨平台兼容。此外,还简要介绍了Linux如何通过本地总线高效管理硬件资源,并阐述了文件系统与磁盘管理机制。通过这些内容,读者可以全面了解Linux的硬件组成及其核心技术。
29 3
|
29天前
|
Linux SoC
Linux设备树(DTS)介绍
**设备树(DTS)是Linux中用于描述硬件信息的文本文件,旨在减少内核与平台相关代码的耦合。DTS文件包含静态硬件配置,不支持动态变更。它被编译成DTB二进制文件,供内核在启动时解析以了解硬件布局。设备树解决了ARM体系结构代码维护的复杂性问题,通过解耦实现vendor修改的独立和共二进制目标。设备树overlay允许对配置进行增量修改,遵循特定规则,如dts覆盖dtsi,先引用后修改。调试时,可使用内置工具反编译dtb或dtbo映像为dts文本以检查内容。**
76 7
|
5天前
|
Java Linux 编译器
【Linux】gcc简介+编译过程
【Linux】gcc简介+编译过程
|
9天前
|
存储 运维 监控
运维.Linux下执行定时任务(上:Cron简介与用法解析)
运维.Linux下执行定时任务(上:Cron简介与用法解析)
29 0