一个CPU可能对应多个平台,为了方便开发,只能这么做,dts文件和dtsi文件相当于C语言的.c和.h文件.一样可以包含,下面以BBB的DTS文件分析学习格式规范.
涉及的文件包含:
01 |
{ |
02 |
compatible = "ti,am33xx" ; |
03 |
interrupt-parent = <&intc>; |
04 |
05 |
aliases { |
06 |
serial0 = &uart1; |
07 |
}; |
08 |
09 |
ocp { |
10 |
compatible = "simple-bus" ; |
11 |
#address-cells = <1>; |
12 |
#size-cells = <1>; |
13 |
ranges; |
14 |
ti,hwmods = "l3_main" ; |
15 |
16 |
intc: interrupt-controller@48200000 { |
17 |
compatible = "ti,omap2-intc" ; |
18 |
interrupt-controller; |
19 |
#interrupt-cells = <1>; |
20 |
ti,intc-size = <128>; |
21 |
reg = <0x48200000 0x1000>; |
22 |
}; |
23 |
/* ....... */ |
24 |
25 |
} |
整体结构如上,先是说明平台,然后指向中断控制器的指针,还可以写一些别名.就是描述平台用的.比如上面的中断指向intc,那么在ocp下有intc,用于处理中断信号.aliases下把serial0当成uart1,所以下面就可以如下写法.
1 |
uart1: serial@44e09000 { |
2 |
compatible = "ti,omap3-uart" ; |
3 |
ti,hwmods = "uart1" ; |
4 |
clock -frequency = <48000000>; |
5 |
reg = <0x44e09000 0x2000>; |
6 |
interrupts = <72>; |
7 |
status = "disabled" ; |
8 |
}; |
节点会遵循这个格式:
01 |
/ { |
02 |
node1 { |
03 |
a-string-property = "A string" ; |
04 |
a-string-list-property = "first string" , "second string" ; |
05 |
a-byte-data-property = [0x01 0x23 0x34 0x56]; |
06 |
child-node1 { |
07 |
first-child-property; |
08 |
second-child-property = <1>; |
09 |
a-string-property = "Hello, world" ; |
10 |
}; |
11 |
child-node2 { |
12 |
}; |
13 |
}; |
14 |
node2 { |
15 |
an-empty-property; |
16 |
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */ |
17 |
child-node1 { |
18 |
}; |
19 |
}; |
20 |
}; |
上面描述了两个node,node1下面还有两个child-node,比如处理器节点:
01 |
cpus { |
02 |
cpu: cpu@0 { |
03 |
compatible = "arm,cortex-a8" ; |
04 |
05 |
operating-points = < |
06 |
720000 1285000 |
07 |
600000 1225000 |
08 |
500000 1125000 |
09 |
275000 1125000 |
10 |
>; |
11 |
voltage-tolerance = <2>; /* 2 percentage */ |
12 |
clock -latency = <300000>; /* From omap-cpufreq driver */ |
13 |
}; |
14 |
}; |
其中compatible是用于绑定设备的manufacturer,model,理解为用户驱动和设备的绑定.下面是可操作的点,频率电压,这里说明的是720M啊,那1G在哪里,不急,先慢慢分析.
再往下看看GPIO控制器:
01 |
gpio1: gpio@44e07000 { |
02 |
compatible = "ti,omap4-gpio" ; |
03 |
ti,hwmods = "gpio1" ; |
04 |
gpio-controller; |
05 |
#gpio-cells = <2>; |
06 |
interrupt-controller; |
07 |
#interrupt-cells = <1>; |
08 |
reg = <0x44e07000 0x1000>; |
09 |
interrupts = <96>; |
10 |
}; |
其中开始的gpio@44e07000属于
可寻址的外设[或者设备],reg字段,描述地址从0x44E0 7000开始,共0x1000长度,与手册描述的一样.而gpio-controller;说明自己是GPIO控制器,就如前面的中断控制器必须说明自己是中断控制器interrupt-controller[这里GPIO也包含中断控制],interrupts指定中断号,cell指定的是cell大小.
而在bone-common.dtsi,包含一些覆盖配置.
1 |
cpus { |
2 |
cpu@0 { |
3 |
cpu0-supply = <&dcdc2_reg>; |
4 |
}; |
5 |
}; |
也可以替代一些LED驱动之类的.
01 |
gpio-leds { |
02 |
compatible = "gpio-leds" ; |
03 |
pinctrl-names = "default" ; |
04 |
pinctrl-0 = <&userled_pins>; |
05 |
06 |
led0 { |
07 |
label = "beaglebone:green:usr0" ; |
08 |
gpios = <&gpio2 21 0>; |
09 |
linux, default -trigger = "heartbeat" ; |
10 |
default -state = "off" ; |
11 |
}; |
12 |
13 |
led1 { |
14 |
label = "beaglebone:green:usr1" ; |
15 |
gpios = <&gpio2 22 0>; |
16 |
linux, default -trigger = "mmc0" ; |
17 |
default -state = "off" ; |
18 |
}; |
19 |
20 |
led2 { |
21 |
label = "beaglebone:green:usr2" ; |
22 |
gpios = <&gpio2 23 0>; |
23 |
linux, default -trigger = "cpu0" ; |
24 |
default -state = "off" ; |
25 |
}; |
26 |
27 |
led3 { |
28 |
label = "beaglebone:green:usr3" ; |
29 |
gpios = <&gpio2 24 0>; |
30 |
default -state = "off" ; |
31 |
linux, default -trigger = "mmc1" ; |
32 |
}; |
33 |
}; |
在linux内核中用dtc编译dts文件到dtb,当我们运行make dtbs时候,如果已经选了ARCH_OMAP2PLUS,那么以下文件会被编译出来.
01 |
dtb-$(CONFIG_ARCH_OMAP2PLUS) += omap2420-h4.dtb \ |
02 |
omap3-beagle.dtb \ |
03 |
omap3-beagle-xm.dtb \ |
04 |
omap3-evm.dtb \ |
05 |
omap3-tobi.dtb \ |
06 |
omap4-panda.dtb \ |
07 |
omap4-panda-a4.dtb \ |
08 |
omap4-panda-es.dtb \ |
09 |
omap4-var-som.dtb \ |
10 |
omap4-sdp.dtb \ |
11 |
omap5-evm.dtb \ |
12 |
am335x-evm.dtb \ |
13 |
am335x-evmsk.dtb \ |
14 |
am335x-bone.dtb \ |
15 |
am335x-boneblack.dtb \ |
16 |
am335x-tester.dtb |