compatible属性

节点下的compatible属性

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

  1. "manufacturer,model"

其中 manufacturer 表示厂商,model 一般是模块对应的驱动名字。
例如:

  1. compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";

属性值有两个,分别为fsl,imx6ul-evk-wm8960fsl,imx-audio-wm8960,其中fsl表示厂商是飞思卡尔,imx6ul-evk-wm8960imx-audio-wm8960表示驱动模块名字。sound这个设备首先使用第一个兼容值在Linux内核里面查找,看看能不能找到与之匹配的驱动文件,如果没有找到的话就使用第二个兼容值查。

根文件下的compatible属性

每个节点都有compatible属性,根节点/也不例外。例如:

  1. / {
  2. model = "Freescale i.MX6 ULL 14x14 EVK Board";
  3. compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
  4. }

可以看出,compatible有两个值:fsl,imx6ull-14x14-evkfsl,imx6ull。前面我们说了,设备节点的compatible属性值是为了匹配 Linux内核中的驱动程序,那么根节点中的compatible属性是为了做什么工作的? 通过根节点的compatible属性可以知道我们所使用的设备,一般第一个值描述了所使用的硬件设备名字,比如这里使用的是imx6ull-14x14-evk这个设备,第二个值描述了设备所使用的 SOC,比如这里使用的是imx6ull这颗 SOC。Linux 内核会通过根节点的compoatible属性查看是否支持此设备,如果支持的话设备就会启动Linux内核。

model属性

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

  1. model = "wm8960-audio";

phandle属性

值的类型: <u32>
phandle属性为节点指定了一个在设备树中独一无二的数字标识符。

  1. pic@10000000 {
  2. phandle = <1>;
  3. interrupt-controller;
  4. };
  5. another-device-node {
  6. interrupt-parent = <1>;
  7. };

使用phandle属性值定义设备pic@10000000,这样在其他设备中就可以直接使用<1>直接引用设备pic@10000000

status属性

值类型: <string>
描述了设备当前的状态,可以取以下是可选的值:

  • okay: 指明该设备是可操作的
  • disable: 指明该设备当前是不可操作的,但是之后可以被操作
  • reserved: 指明该设备是可操作的,但是不应该被使用。通常用在被其他驱动软件控制的设备
  • fail: 指明该设备是不可操作的,设备被检测到有严重问题,不修复的话没法使用
  • fail-sss: 与fail属性类似,sss指明了错误的情况

    #address-cells和#size-cells属性

    值类型: <u32>
    这两个属性可以用在device tree层次结构中具有子级的任何设备节点中,用来描述应如何寻址子级设备节点。

  • #address-cells属性用来在子节点的reg属性中编码地址区域。

  • #size-cells属性用来在子节点的reg属性中编码大小区域。

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

  1. reg = <address1 length1 address2 length2 address3 length3……>

每个address length组合表示一个地址范围,其中address是起始地址,length是地址长度,#address-cells表明address这个数据所占用的字长,#size-cells表明length这个数据所占用的字长。并且这两个属性并不会从父级设备中继承,每个设备都需要指定该值。如果没有指定的话,#address-cells的默认值是2,#size-cells的默认值是1。
例如:

  1. spi4 {
  2. compatible = "spi-gpio";
  3. #address-cells = <1>;
  4. #size-cells = <0>;
  5. gpio_spi: gpio_spi@0 {
  6. compatible = "fairchild,74hc595"; 8 reg = <0>;
  7. };
  8. };
  9. aips3: aips-bus@02200000 {
  10. compatible = "fsl,aips-bus", "simple-bus";
  11. #address-cells = <1>;
  12. #size-cells = <2>;
  13. dcp: dcp@02280000 {
  14. compatible = "fsl,imx6sl-dcp";
  15. reg = <0x02280000 0x4000 0x3000>;
  16. };
  17. };

reg属性

属性类型:<prop-encoded-array>编码方式是任意数量的地址、长度对。
该属性描述了被父级总线定义的设备资源的地址,通常来该属性表示了设备资源在总线上的偏移量和大小,但是在一些特定的总线类型上可能有所不同。
假设一个soc上的设备具有两块寄存器组,一个在soc地址偏移0x3000的32字节的块和一个偏移0xFE00的256字节的块。reg的编码如下(前提是#address-cells#size-cells都为1):

  1. reg = <0x3000 0x20 0xFE00 0x100>

virtual-reg属性

值的类型:<u32>
virtual-reg属性指定一个有效地址,该地址映射到设备节点的reg属性中指定的第一个物理地址,该属性使能启动程序在初始化的过程中为用户程序提供虚拟地址到物理地址的映射。

ranges属性

值的类型:空值或者prop-encoded-array
描述:该属性是提供了一种。
ranges值的格式是任意数量的三元组(child-bus-address,parent-bus-address,length)。

  • child-bus-address是子总线地址空间的物理地址(真实的映射需要加上子设备相对于父设备的地址偏移)
  • parent-bus-address是父总线地址空间的物理地址
  • length是指定了range中子地址空间的大小
    1. soc {
    2. compatible = "simple-bus";
    3. #address-cells = <1>;
    4. #size-cells = <1>;
    5. ranges = <0x0 0xe0000000 0x00100000>;
    6. serial@4600 {
    7. device_type = "serial";
    8. compatible = "ns16550";
    9. reg = <0x4600 0x100>;
    10. clock-frequency = <0>;
    11. interrupts = <0xA 0x8>;
    12. interrupt-parent = <&pic>;
    13. };
    14. };
    ranges属性指定了1024KB大小的地址空间,把子总线soc的物理地址0x0处的内存映射到父总线的物理地址0xe0000000的内存。在这种映射关系中,serial设备的起始地址实际上被映射到总线物理地址为0xe0004600的地址空间。

    dma-ranges属性

    值的类型:空值prop-encoded-array
    该属性的使用与ranges属性类似,该属性是用来描述DMA结构的内存映射关系。

    name属性(过时的)

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

    device_type属性(过时的)

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