/ {
aliases {
can0 = &flexcan1;
…
};
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
clock-latency = <61036>; /* two CLK32 periods */
operating-points = <
/* kHz uV */
996000 1275000
792000 1225000
528000 1175000
396000 1025000
198000 950000
>;
/* kHz uV */
996000 1275000
792000 1225000
528000 1175000
396000 1025000
...
};
intc: interrupt-controller@00a01000 {
compatible = "arm,cortex-a7-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x00a01000 0x1000>,
<0x00a02000 0x100>;
};
...
文件描述了 **CPU arm**,**cortex-a7** ,支持 **996MHz**、 **792MHz**等频率, 时钟一些信息。
* “/”是根节点,每个设备树文件只有一个根节点
* “/”是根节点,每个设备树文件只有一个根节点
node-name@unit-address
其中 **“node-name”** 是节点名字,为 **ASCII** 字符串,节点名字应该能够清晰的描述出节点的功能,比如 **“uart1”** 就表示这个节点是 **UART1** 外设。**“unit-address”** 一般表示设备的地址或寄存器首地址,如果某个节点没有地址或者寄存器的话 **“unit-address”** 可以不要,比如 **“cpu@0”**、**“interrupt-controller@00a01000”**。
label: node-name@unit-address
引入 **label** 的目的就是为了方便访问节点,可以直接通过 **&label** 来访问这个节点,比如通过**&cpu0** 就可以访问 **“cpu@0”** 这个节点。很明显通过 **&intc** 来访问 **“interrupt-controller@00a01000”** 这个节点要方便很多!
每个节点都有不同属性,不同的属性又有不同的内容,属性都是键值对,值可以为空或任意的字节流。设备树源码中常用的几种数据形式如下所示:
**1、字符串**
compatible = “fairchild,74hc595”;
**2、32 位无符号整数**
reg = <0 0x123456 100>;
**3、字符串列表**
compatible = “fsl,imx6ul-pxp-v4l2”, “fsl,imx6sx-pxp-v4l2”, “fsl,imx6sl-pxp-v4l2”;
## 二、设备树详解
### 2.1 标准属性
**1、compatible 属性**
compatible 属性也叫做“兼容性”属性,这是非常重要的一个属性! compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序,compatible 属性的值格式如下所示:
>
> "manufacturer,model"
>
>
>
其中 **manufacturer** 表示厂商,**model** 一般是模块对应的驱动名字。比如 imx6ull-alientek-emmc.dts 中 sound 节点是 I.MX6U-ALPHA 开发板的音频设备节点,I.MX6U-ALPHA 开发板上的音频芯片采用的欧胜(WOLFSON)出品的 WM8960,sound 节点的 compatible 属性值如下:
>
> compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";
>
>
>
其中 **“fsl”** 表示厂商是飞思卡尔,**“imx6ul-evk-wm8960”**和 **“imx-audio-wm8960”** 表示驱动模块名字。设备首先使用第一个兼容值在 Linux 内核里面查找,如果没有找到的话就使用第二个兼容值查。
**2、 model 属性