三 属性(property)

device_type = "memory"就是一个属性,等号前边是属性,后边是值。节点是一个逻辑上相对独立的实体,属性是用来描述节点特性的,根据需要一个节点由0个,1个或多个属性表示节点的特性。一个属性由名字和值两部分组成。

和节点的名字类似,规范要求属性名字由1到31个字符组成。和节点名字字符的种类有些区别,不允许有大写字母,增加了问号和井号两个字符。不清楚为什么没有和节点名字完全保持一致,井号对于初学者容易误解,以为是注释。

0-9    数字
a-z    小写字母
,    逗号
.    句点(英)
_    下划线
+    加号
-    破折号(英)
?    问号
#    井号

为了容易区分以及避免重复,标准未定义的属性名字应该用公司或组织名称开头,比如:
fsl,channel-fifo-len
ibm,ppc-interrupt-server#s
linux,network-index

属性的值在内存中由0个或多个字节存储。标准定义的基本类型包括:空,u32,u64,字符串,<prop-encoded-array>,字符数组6种。空前边我们已经提到,当不需要值就可以表示节点的特性时,属性的值可以为空。u32,u64,字符串,字符数组和c语言的定义没有区别,注意的是规范要求都是大端表示,字符串也是以0x00结尾。<prop-encoded-array>是一个结构体数组,数组的元素具体是什么根据属性的定义确定,后边我们讲到具体的属性时会详细说明。规范中还有一个类型的属性值,叫<phandle>,这个类型的属性在内存中存储时本质上是u32。

规范预定义了一些标准的属性。“compatible”,“model”,"device_type"都是用来表示节点基本信息的。

“compatible”属性是用来匹配驱动的,他的类型是字符串数组,每个字符串表示一种设备的类型,从具体到一般。举个例子就比较清楚了,比如某个串口控制器节点的属性”compatible = “fsl,mpc8641-uart”, “ns16550"“。第一个字符串“fsl,mpc8641-uart”前边部分是厂商(推测是frescale),后边部分是控制器具体型号,这个形式也是规范建议的标准写法。第二个字符串ns16550表示一类符合同一标准的串口控制器,比第一个字符串表示的范围更大。内核匹配驱动时首先看是否有匹配第一个字符串的驱动,如果没有的话再匹配第二个(如果有更多的,依次类推,所以优先匹配前边的)。

"model"属性用来表示设备的型号,用字符串表示,不像"compatible"用多个字符串,只需一个就够了。"device_type"属性用来表示设备类型,用字符串表示。

"#address-cells","#size-cells","reg","ranges","dma-ranges"属性都是和地址有关的。

不同的平台,不同的总线,地址位长度可能不同,有32位地址,有64位地址,为了适应这个,规范规定一个32位的长度为一个cell。"#address-cells"属性用来表示总线地址需要几个cell表示,该属性本身是u32类型的。"#size-cells"属性用来表示子总线地址空间的长度需要几个cell表示,属性本身的类型也是u32。可以这么理解父节点表示总线,总线上每个设备的地址长度以及地址范围是总线的一个特性,用"#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'属性决定,大小需要几个u32表示由当前节点的'#size-cells'属性确定。

'dma-ranges'属性的结构和定义与'ranges'属性完全相同,唯一不同的是地址是dma使用的地址,'ranges'中的地址是cpu使用的地址。

有的时候在一个节点中需要引用另外一个节点,比如某个外设的中断连在哪个中断控制器上。在讲节点那一节我们说过,可以通过节点的全路径指定是哪个节点,但这种方法非常繁琐。'phandle'属性是专门为方便引用节点设计的,想要引用哪个节点就在该节点下边增加一个'phandle'属性,设定值为一个u32,如'phandle = <1>',引用的地方直接使用数字1就可以引用该节点,如'interrupt-parent = <1>'。以上是规范中描述的方法,实际上这样也不方便,我在实际的代码中没有看到这么用的。还记得节点那节说过节点名字前边可以定义一个标签吧,实际情况是都用标签引用,比如节点标签为intc1,那么用'interrupt-parent = <&intc1>'就可以引用了。

'status'属性用来表示节点的状态的,其实就是硬件的状态,用字符串表示。'okay'表示硬件正常工作,“disabled”表示硬件当前不可用,“fail”表示因为出错不可用,“fail-sss”表示因为某种原因出错不可用,sss表示具体的出错原因。实际中,基本只用'okay'和'disabled'。

我眼中的Linux设备树(三 属性)相关推荐

  1. 我眼中的Linux设备树(六 memorychosen节点)

    六 memory&chosen节点 根节点那一节我们说过,最简单的设备树也必须包含cpus节点和memory节点.memory节点用来描述硬件内存布局的.如果有多块内存,既可以通过多个memo ...

  2. 我眼中的Linux设备树(五 根节点)

    五 根节点 一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是"/",至少需要包含model和compatible两个属性.model属性我 ...

  3. 我眼中的Linux设备树(四 中断)

    四 中断 中断一般包括中断产生设备和中断处理设备.中断控制器负责处理中断,每一个中断都有对应的中断号及触发条件.中断产生设备可能有多个中断源,有时多个中断源对应中断控制器中的一个中断,这种情况中断产生 ...

  4. 我眼中的Linux设备树(一 概述)

    一 概述 设备树(Device tree)是一套用来描述硬件属相的规则.ARM Linux采用设备树机制源于2011年3月份Linux创始人Linus Torvalds发的一封邮件,在这封邮件中他提倡 ...

  5. 我眼中的Linux设备树(二 节点)

    二 节点(node)的表示 首先说节点的表示方法,除了根节点只用一个斜杠"/"表示外,其他节点的表示形式如"node-name@unit-address".@前 ...

  6. Linux设备树语法详解【转】

    转自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备 ...

  7. linux spidev 应用_嵌入式Linux设备树语法总结

    1 设备树的说明 在写完嵌入式驱动总结后,对于设备树相关的语法和使用一直都想进行系统的描述,但是因为最近比较忙碌,所以一直拖到现在才完成初版,对于整个嵌入式Linux驱动开发中,设备树语法和构建是其中 ...

  8. Linux 设备树的使用技巧

    Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代码只负 ...

  9. 【正点原子MP157连载】第二十三章 Linux设备树-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. 使用 Elasticsearch 优雅搭建自己的搜索系统
  2. SAP云平台里给应用创建自定义环境变量
  3. mysql 5.6.10 32_安装mysql-5.6.10-win32 解压版-略有修改
  4. stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)
  5. 【Flink】Flink No JAAS configuration section named Client ERROR:Authentication failed
  6. centos 部署.netcore 开发环境
  7. SilverLight 条码 扫描枪 MVVM(转载)
  8. 聚宽macd底背离_很多散户可能永远都不会知道:MACD月线金叉,每一次MACD月金叉都会带来一波牛市...
  9. vue项目中moment的使用(时间戳格式化)
  10. 【转】char,wchar_t,WCHAR,TCHAR,ACHAR的区别
  11. 人均瑞数系列,瑞数 4 代 JS 逆向分析
  12. 抖音怎么上热门?这样发视频点赞过万!
  13. html设备状态监测系统,盾构机状态监测系统
  14. 让学前端不再害怕英语单词(四)
  15. minMaxLoc opencv
  16. 物联网卡传感器赋能零售商品感应机制 开启智能零售新风尚
  17. 【软件测试】接口测试用例和报告模板
  18. 已知总图的边和子图顶点,判断子图连通性
  19. 【机器学习系列】概率图模型第一讲:从概率和图的角度理解概率图模型
  20. 知识图谱与认知智能--肖仰华

热门文章

  1. 服务器响应时延,服务器响应时延
  2. c++语言表白超炫图形_教你用C语言加图形库打造炫酷表白连连看
  3. linux 指令tftp传输文件_Linux tftp命令使用详解:在本机与tftp服务器之间使用TFTP协议传输文件...
  4. 大学计算机网络技术考试题,2017年大学生计算机考试的试题
  5. Linux查询系统运行的时间
  6. h5活动是什么意思_分析什么是h5页面
  7. python二分法递归_python 【递归 及 二分法】
  8. linux kill命令信号,linux kill命令详解
  9. php 锁的使用场景,抢购秒杀的场景使用锁个人认为不太合理?
  10. 计算机网络期中考察方案,计算机网络期中考试题 b卷_ans.docx