Linux 内核dts文件是怎么一回事?

   一个CPU可能对应多个平台,为了方便开发,只能这么做,dts文件和dtsi文件相当于C语言的.c和.h文件.一样可以包含,下面以BBB的DTS文件分析学习格式规范.

    涉及的文件包含:

  1. am33xx.dtsi
  2. am33xx-bone-common.dtsi
  3. am335x-bone-black.dts
    其中每个AM3359[或者说AM33XX]平台都包含第一个文件am33xx.dtsi,而所有的Beaglebone都包含第二个文件,而第三个又是细化,包含.所有文件最后包含skeleton.dtsi,不过这个不用分析,固定的了.
    如果把文件当成C看待,那会简单非常非常多,整体结构如下:
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属于<name>[@<unit-address>]格式,其中[]是可选的,这个说明他在44E0 7000地址上.gpio是类型,gpio1才是名字.


    可寻址的外设[或者设备],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
    有了dts这个东西,以前经常在mach-xxx的信息可以省掉了,ARM社区一贯充斥的大量垃圾代码导致Linus盛怒,因此社区在2011年到2012年进行了大量的工作,ARM Linux开始围绕Device Tree展开,Device Tree有自己的独立的语法,它的源文件为.dts,编译后得到.dtb,Bootloader在引导Linux内核的时候会将.dtb地址告知内核,之后内核会展开Device Tree并创建和注册相关的设备,因此arch/arm/mach-xxx和arch/arm/plat-xxx中大量的用于注册platform板级信息的代码被删除,而驱动也以新的方式和.dts中定义的设备结点进行匹配.

»版权所有© TaterLi → 《Linux 内核dts文件是怎么一回事?》;
»本文网址:http://www.lijingquan.net/what-is-linux-dts.html ;
»除特别标注,本博客所有文章均为原创. 互联分享,尊重版权,转载请以链接形式标明本文地址。
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值