学习心得--Linux 设备树


活动地址: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、设备树的语法:

 设备树的框架:

        设备树用树状结构描述设备信息,它有以下几种特性:

  1. 每个设备树文件都有一个根节点,每个设备都是一个节点。
  2. 节点间可以嵌套,形成父子关系,更加方便描述设备之间的关系
  3. 每个设备的属性都用一组key-value(键值对)来描述
  4. 每个属性的描述用分号;结束

     设备树的结构由两种元素组成: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,学习的收获

通过这几天的学习,对设备树的概念有了一定的了解,但我个人觉得还是掌握的不是很好,一些概念的理解还停留再表面,后续得查阅资料来对这些概念进行了解,并通过学习内核源码来提高实际应用能力。

本人是初学者,若是出现一些错误,还请各位读者担待,并能给予我指导,谢谢!

​其中参考连接:

图解Kernel Device Tree(设备树)的使用_内核笔记的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值