活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
…
欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程。您可以从以下3个方面任选其一着手(不强制),或者按照自己的理解发布专栏学习作品,参考如下:
**
学习日记
**
一、学习知识点
1、什么是设备树?
简单来讲,就是描述硬件上的设备信息,如CPU数量,内存基地址,I2C、SPI接口上接了那些设备等等。描述设备树的文件叫做DTS(Device Tree Source),该文件采用树形结构来描述板级设备。
2、为什么要引用设备树呢?
在老的Linux内核中,存在着太多不同板子硬件信息的代码,不同的板子所描述的硬件资源也大不相同,这样就造成了内核过于冗余,设备树的引入就是为了解决这个问题。
设备树是一种描述硬件的数据结构,采用了设备树后,许多硬件的细节可以直接通过它传递给Linux,而不需要在内核中进行大量的冗余编码,它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立。
3、内核将设备树编译生成的dtb转化为什么?
内核将dtb中的设备节点转化为device_node,再将device_node按照如下规则转化为 struct platform_device。
内核将device_node转换成struct platfrom_device的规则如下:
1.该device_node 必须含有 compatible属性。
2.该device_node 是根节点的子节点(必须有compatible属性)。
3.如果孙子节点或者孙孙子节点也想要转换成platfrom_device,
则它的父节点的device_node的compatible属性必含有如下特殊字符串:
“simple-bus” ,“simple-mfd”,“isa”,“arm,amba-bus”.
(只要compatilbe中含有其中任一即可)
4、设备树的语法:
设备树的框架:
设备树用树状结构描述设备信息,它有以下几种特性:
- 每个设备树文件都有一个根节点,每个设备都是一个节点。
- 节点间可以嵌套,形成父子关系,更加方便描述设备之间的关系
- 每个设备的属性都用一组key-value(键值对)来描述
- 每个属性的描述用分号;结束
设备树的结构由两种元素组成:Node(节点) 、Property(属性)
设备节点:命名格式:node-name@unit-address
其中node-name为设备节点,节点名字能够清晰的描述出节点的功能。
unit-address:设备地址或者寄存器地址。
--compatible 属性(也被称为兼容性属性)
用于将设备和驱动绑定起来
例:compatibe="manufacturer , mode" 其中 manufacturer:表示厂商,mode表示模块对应的驱动名字。
--status属性
表示与设备状态有关的属性,有四种状态值,分别为“okay”(表示设备可操作)、“disabled”(表明设备当前是不可操作的)、“fail”(表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作)、“fail-sss”(含义和“fail”相同,后面的 sss 部分是检测到的错误内容)。
- #address-cells、#size-cells和reg (寻址属性)
reg 属性的值一般是 (address, length) 对,reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。
#address-cells 和 #size-cells的值都是无符号 32 位整型,可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。其中address-cells为起始地址,size-cells为地址长度。
- ranges 属性(地址翻译)
ranges属性值可以为空或者按照 (child-bus-address,parent-bus-address,length) 格式编写的数字矩阵, ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成:
child-bus-address: 子总线地址空间的物理地址,由父节点的 #address-cells 确定此物理地址所占用的字长。
parent-bus-address: 父总线地址空间的物理地址,同样由父节点的 #address-cells 确定此物理地址所占用的字长。
length: 子地址空间的长度,由父节点的 #size-cells 确定此地址长度所占用的字长。
2,学习的收获
通过这几天的学习,对设备树的概念有了一定的了解,但我个人觉得还是掌握的不是很好,一些概念的理解还停留再表面,后续得查阅资料来对这些概念进行了解,并通过学习内核源码来提高实际应用能力。
本人是初学者,若是出现一些错误,还请各位读者担待,并能给予我指导,谢谢!
其中参考连接: