我所认知的LINUX设备树汇编.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
我所认知的LINUX设备树汇编

设备树(Device tree)是一套用来描述硬件属相的规则.设备树是从软件使用的角度描述硬件的,不是从硬件设计的角度描述的。我们在写设备树时没有必要按照硬件逻辑生搬硬套,也不要指望通过阅读设备树弄清楚硬件是如何设计的。对于软件可以自动识别的硬件,如USB设备,PCI设备,也是没有必要通过设备树描述的。我个人觉得规范内容是可以分为两个层次的。第一层是关于设备树组织形式的,如设备树结构,节点名字的构成等,第一个层次是基础,是理解第二个层次的前提。第二层是关于设备树内容的,如多核CPU怎样描述,一个具体的设备如何描述。第二层可以看成是第一层的具体应用。DTS(Device tree syntax,另一种说法是Device tree source)是设备树源文件,为了方便阅读及修改,采用文本格式。DTC(Device tree compiler)是一个小工具,负责将DTS转换成DTB(Device tree blob)。设备树首先是一个树形结构,并且是一棵树。除了根节点外其他子节点都有唯一的父节点,节点下可以有子节点和属性(子节点可以看成是树枝,属性可以看成是叶子)。属性由名字和值组成(名字是必须的,但是值不是必须的,如果只要根据是否存在这个属性就可以表示我们想要的功能,那么可以不需要有值)。节点(node)的表示首先说节点的表示方法,除了根节点只用一个斜杠“/”表示外,其他节点的表示形式如“node-name@unit-address”。@前边是节点名字,后边是节点地址。节点地址是用来区别同名节点的,不是软件意义上的地址,但是有些情况可以用软件地址作为这个地址。除此之外规范还要求,如果节点有地址,那么节点下边必须有一个叫reg的属性,并且该地址必须和reg的属性的第一个地址相同。如果节点没有reg属性,那么节点地址及前边的@必须都不能有。除了名字和地址外,节点前边还可以有一个标签(label),这个标签不是必须的,一般只有在别个地方需要引用这个节点时才会用标签标示这个节点,因为如果用全路径太繁琐了。如“i2c_1: i2c@12C70000”中的i2c_1就是一个标签。属性(property)属性的值在内存中由0个或多个字节存储。标准定义的基本类型包括:空,u32,u64,字符串,prop-encoded-array,字符数组6种。标准的属性:“compatible”属性是用来匹配驱动的,他的类型是字符串数组,每个字符串表示一种设备的类型,从具体到一般。model属性用来表示设备的型号,用字符串表示,不像compatible用多个字符串,只需一个就够了。device_type属性用来表示设备类型,用字符串表示。#address-cells,#size-cells,reg,ranges,dma-ranges属性都是和地址有关的。不同的平台,不同的总线,地址位长度可能不同,有32位地址#address-cells属性用来表示总线地址需要几个cell表示,该属性本身是u32类型的。#size-cells属性用来表示子总线地址空间的长度需要几个cell表示,属性本身的类型也是u32。,有64位地址,为了适应这个,规范规定一个32位的长度为一个cell。可以这么理解父节点表示总线,总线上每个设备的地址长度以及地址范围是总线的一个特性,用#address-cells,#size-cells属性表示,比如总线是32位,那么#address-cells设置成1就可以了。这两个属性不可以继承,就是说在未定义这两个属性的时候,不会继承更高一级父节点的设置,如果没有设置的话,内核默认认为#address-cells为2,#size-cells为1。reg属性用来表示节点地址资源的,比如常见的就是寄存器的起始地址及大小。要想表示一块连续地址,必须包含起始地址和空间大小两个参数,如果有多块地址,那么就需要多组这样的值表示。还记得前边说过的prop-encoded-array类型的属性吧,就是用来干这个的,他表示一个数组,每个元素的具体格式根据属性而定,对于reg属性,每个元素是一个二元组,包含起始地址和大小。还有另外一个问题,地址和大小用几个u32表示呢?这个就由父节点的#address-cells,#size-cells属性确定。总线上设备在总线地址和总线本身的地址可能不同,ranges属性用来表示如何转换。和reg属性类似,ranges属性也是prop-encoded-array类型的属性,不同的是ranges属性的每个元素是三元组,按照前后顺序分别是(子总线地址,父总线地址,大小)。子总线地址需要几个u32表示由ranges属性所在节点的#address-cells属性决定,父总线地址需要几个u32表示由上一级节点的#address-cells属性决

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档