Linux 学习笔记:设备树 — 标准属性

节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。除了用户自定义属性,有很多属性是标准属性,Linux 下的很多外设驱动都会使用这些标准属性。

1. compatible 属性

compatible 属性也叫做 “兼容性” 属性,这是非常重要的一个属性。compatible 属性的值是一个字符串列表,compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序,属性的值格式如下所示:

"manufacturer,model"
  • manufacturer: 表示厂商
  • model :一般是模块对应的驱动名字。

例如,sound 节点的compatible 属性值如下:

compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960"
  • fsl : 表示厂商是飞思卡尔;
  • “imx6ul-evk-wm8960”,”imx-audio-wm8960” : 表示驱动模块名字。

sound 这个设备首先使用第一个兼容值在Linux 内核里面查找,看看能不能找到与之匹配的驱动文件,如果没找到的话就使用第二个兼容值查。

一般驱动程序文件都会有一个OF 匹配表,此OF匹配表保存着一些compatible 值,如果设备节点的compatible 属性值和OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个驱动。

2. model 属性

model 属性值也是一个字符串,一般model 属性描述设备模块信息,比如名字什么的。

model = "wm8960-audio"

3. status 属性

status 属性和设备状态有关,属性值也是字符串,属性值是设备的状态信息。

4. #address-cells 和#size-cells 属性

这两个属性的值都是无符号32位整形,#address-cells 和#size-cells 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息

  • #address-cells 属性值决定了子节点reg 属性中地址信息所占用的字长(32位)。
  • #size-cells 属性值决定了子节点reg 属性中长度信息所占用的字长(32位)。

#address-cells 和#size-cells 表明了子节点应该如何编写reg 属性值,一般reg 属性都是和地址有关的内容,和地址信息相关的信息有两种:起始地址和地址长度,reg 属性的格式为:

reg = <add1 len1 add2 len2 add3 len3...... >

每个“add len” 组合表示一个地址范围,其中 add 是起始地址,len 是地址长度。#address-cells 表明add 这个数据所占用的字长,#size-cells 表明len 这个数据所占用的字长。

alphaled {
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "atkalpha-led";
		status = "okay";
		reg = < 0X020C406C 0X04		/* CCM_CCGR1_BAE 			*/
				0X020E0068 0X04		/* SW_MUX_GPIO1_IO03_BASE 	*/
				0X020E02F4 0X04		/* SW_PAD_GPIO1_IO03_BASE	*/
				0X0209C000 0X04		/* GPIO1_DR_BASE 			*/
				0X0209C004 0X04>;	/* GPIO1_GDIR_BASE 			*/
	};

5. reg 属性

reg 属性的值一般是(address,length)对,一般用于描述设备地址空间资源信息,一般都是某个外设寄存器地址范围信息。详情参照上面alphaled 节点信息。

6. ranges 属性

ranges 属性值可以为空或者按照( child-bus-address , parent-bus-address ,length ) 格式编写的数字矩阵,ranges 是一个地址映射/转换表,ranges 属性每个项目由子地址、父地址和地址空间长度三部分组成:

6.1 child-bus-address

子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。

6.2 parent-bus-address

父总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。

6.3 length

子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。

6.4 ranges 属性值为空

如果ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换,对于我们所使用的的I.MX6ULL 来说,子地址空间和父地址空间完全相同,因此会在imx6ull.dtsi 中找到大量的值为ranges 属性。

reserved-memory {
		#address-cells = <1>;
		#size-cells = <1>;
		ranges;

		linux,cma {
			compatible = "shared-dma-pool";
			reusable;
			size = <0x14000000>;
			linux,cma-default;
		};
	};

6.4 ranges 属性值不为空

在这里插入图片描述
在这里插入图片描述

第5行,节点soc 定义的ranges 属性,值为<0x0 0xe0000000 0x00100000>, 此属性值指定了一个1024KB (0x00100000) 的地址范围,子空间的物理起始地址为0x0,父地址空间的物理起始地址为0xe000000 。

第10行,serial 是串口设备节点,reg 属性定义了serial 设备寄存器的起始地址为0x4600,寄存器长度为0x100。经过地址转换,serial 设备可以从0xe0004600(0x4600 + 0xe0000000) 开始进行读写操作。

7. name属性

name 属性值为字符串,name属性用于记录节点名字,name属性已经被弃用,不推荐使用name 属性,一些老的设备树文件会使用此属性。

8. device_type 属性

device_type 属性值为字符串,IEEE1275 会用到此属性,用于描述设备的FCode,但是设备树没有FCode,所以此属性也被抛弃了。此属性只能用于cpu 节点或者memory 节点。

cpu0: cpu@0 {
			compatible = "arm,cortex-a7";
			**device_type** = "cpu";
			reg = <0>;
			clock-latency = <61036>; /* two CLK32 periods */
......
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gdut_llkkyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值