Table of Contents
2.2.4、#address-cells 和#size-cells 属性
一、设备节点
1.1、节点命名方式
(1)node-name@unit-address
其中“node-name”是节点名字,为 ASCII 字符串,节点名字应该能够清晰的描述出节点的
功能,比如“uart1”就表示这个节点是 UART1 外设。“unit-address”一般表示设备的地址或寄
存器首地址,如果某个节点没有地址或者寄存器的话“unit-address”可以不要,比如“cpu@0”、
“interrupt-controller@00a01000”(2)labe:node-name@unit-address
引入 label 的目的就是为了方便访问节点,可以直接通过&label 来访问这个节点,比如:cpu0:cpu@0 通过
&cpu0 就可以访问“cpu@0”这个节点,而不需要输入完整的节点名字。
二、节点内的属性
1、属性值格式
2.1.1、字符串
compatible = "arm,cortex-a7";
上述代码设置 compatible 属性的值为字符串“arm,cortex-a7”
2.1.2、32 位无符号整数
reg = <0>;
上述代码设置 reg 属性的值为 0,
reg = <0 0x123456 100>;
reg 的值也可以设置为一组值,
2.1.3、字符串列表
compatible = "fsl,imx6ull-gpmi-nand", "fsl, imx6ul-gpmi-nand";
属性值也可以为字符串列表,字符串和字符串之间采用“,”隔开,
上述代码设置属性 compatible 的值为“fsl,imx6ull-gpmi-nand”和“fsl, imx6ul-gpmi-nand”。
2、标准属性
2.2.1、compatible 属性
compatible="manufacturer,model"
其中 manufacturer 表示厂商, model 一般是模块对应的驱动名字。
比如 compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";
属性值有两个,分别为“fsl,imx6ul-evk-wm8960”和“fsl,imx-audio-wm8960”,其中“fsl”表示厂商是飞思卡尔,“imx6ul-evk-wm8960”和“imx-audio-wm8960”表示驱动模块名字。 sound这个设备首先使用第一个兼容值在 Linux 内核里面查找,看看能不能找到与之匹配的驱动文件,如果没有找到的话就使用第二个兼容值查找,直到找到或者查找完整个 Linux 内核也没有找到对应的驱动
2.2.2、model 属性
model = "wm8960-audio";
model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的
2.2.3、status 属性
status 属性看名字就知道是和设备状态有关的, status 属性值也是字符串,字符串是设备的
状态信息,可选的状态如表 所示:
2.2.4、#address-cells 和#size-cells 属性
#address-cells
决定了子节点 reg 属性中地址信息所占用的字长(32 位)#size-cells
属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。
2.2.5、reg 属性
reg = <address1 length1 address2 length2 、、、>
{
#address-cells = <1>;
#size-cells = <0>;
gpio_spi: gpio_spi@0 {
compatible = "fairchild,74hc595";
reg = <0>; //address-cells=1:一个32位的地址 size-cells=0:为0也就是没有
};}
{
#address-cells = <1>;
#size-cells = <1>;
dcp: dcp@02280000 {
compatible = "fsl,imx6sl-dcp";
reg = <0x02280000 0x4000>; //address-cells=1:一个32位的地址 size-cells=1: 一个32位的长度
};}
2.2.6、ranges 属性
ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字
矩阵, ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度
这三部分组成:
child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址
所占用的字长。
parent-bus-address: 父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物
理地址所占用的字长。
length: 子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。
ranges 属性不为空的示例代码如下所示:
1 soc {
2 compatible = "simple-bus";
3 #address-cells = <1>;
4 #size-cells = <1>;
5 ranges = <0x0 0xe0000000 0x00100000>;
6
7serial {
8 device_type = "serial";
9 compatible = "ns16550";
10 reg = <0x4600 0x100>;
11 clock-frequency = <0>;
12 interrupts = <0xA 0x8>;
13 interrupt-parent = <&ipic>;
14 };
15 };
第 5 行,节点 soc 定义的 ranges 属性,值为<0x0 0xe0000000 0x00100000>,此属性值指定
了一个 1024KB(0x00100000)的地址范围,子地址空间的物理起始地址为 0x0,父地址空间的物
理起始地址为 0xe0000000。
第 6 行, serial 是串口设备节点, reg 属性定义了 serial 设备寄存器的起始地址为 0x4600,
寄存器长度为 0x100。经过地址转换, serial 设备可以从 0xe0004600 开始进行读写操作,
0xe0004600=0x4600+0xe0000000。
2.2.7、name 属性
name 属性值为字符串, name 属性用于记录节点名字, name 属性已经被弃用,不推荐使用
name 属性,一些老的设备树文件可能会使用此属性。
2.2.8、device_type 属性
device_type 属性值为字符串, IEEE 1275 会用到此属性,用于描述设备的 FCode,但是设
备树没有 FCode,所以此属性也被抛弃了。此属性只能用于 cpu 节点或者 memory 节点。
三、向节点追加或修改内容
1、追加子节点
假设现在有个六轴芯片fxls8471, fxls8471 要接到 I.MX6U-ALPHA 开发板的 I2C1 接口上,然而IIC1节点是在.dtsi文件定义的,那么怎么追加呢?
正确做法:在dts文件中引用IIC1节点
例如:
&i2c1 {
fxls8471@1e {
compatible = "fsl,fxls8471";
reg = <0x1e>;
position = <0>;
interrupt-parent = <&gpio5>;
interrupts = <0 8>;
};
};
2、修改内容
224 &i2c1 {
225 clock-frequency = <100000>;
226 pinctrl-names = "default";
227 pinctrl-0 = <&pinctrl_i2c1>;
228 status = "okay";、、、、、
}
示例代码 43.3.5.4 就是向 i2c1 节点添加/修改数据,比如第 225 行的属性“clock-frequency”就表示 i2c1 时钟为 100KHz。“clock-frequency”就是新添加的属性
第 228 行,将 status 属性的值由原来的 disabled 改为 okay
本笔记是来源文档:正点原子linux教程