42.设备树---DTS的语法

 Device Tree Usage - 摩斯电码 - 博客园

设备树dts/dtsi格式_孤独行者的专栏-CSDN博客_dts格式

Linux设备树语法详解 - Abnor - 博客园

设备树笔记 - 知乎

[DTS]设备树语法_嵌入式软件开发交流-CSDN博客_dts设备树语法

目录

 DTS文件和DTSI文件

一.设备树的布局与节点的基本语法

二.节点的元素介绍

1.节点名node-name[@unit-address]

2.属性值 [properties definitions] 

2.1属性值的表示方式:

2.2特殊的属性值

3.label 方式---引用

“&” 引用节点(比如这个设备树include了其他的设备树文件,其他设备树文件里有个ABC节点,&ABC就可以引用这个节点并添加新的属性了)

4.覆盖规则:


仿照别人的自己写写改改加深印象

 DTS文件和DTSI文件

dts文件是用户编写的,一个*.dts文件对应一个ARM的machine。一般放置在内核的"arch/arm/boot/dts/"目录内,比如exynos4412参考板的板级设备树文件就是"arch/arm/boot/dts/exynos4412-origen.dts"

一个dts文件对应一个ARM的machine,但一个soc可能有多个不同电路板,这些电路板有很多类似的部分,导致dts文件会有很多共同的部分,导致有不少冗余代码,设备树将这些共同部分保存在*.dtsi文件中,供不同的dts使用。dtsi文件的使用方法,类似于C语言的头文件,在dts文件中使用include包含 *.dtsi文件即可。如:

#include "jz2440.dtsi"

使用dts文件时,就会把包含的dtsi文件内容进行展开。

dts和dtsi的语法规则一样。

一.设备树的布局与节点的基本语法


DTS文件布局(layout):
/dts-v1/;
[memory reservations]                 //格式:/memreserve/<address><length>;
/{
   [label:] node-name[@unit-address] { //节点名称
      [properties definitions]        //就是属性定义,对当前节点描述,将硬件信息提供给内核处理
      [child nodes]                    //子节点 
 };
};

上面代表代表一个节点,一个节点由节点名称、节点属性以及子节点三部分组成,以大括号{}为一段,[]表示可写可不写。子节点语法跟父节点一样,子节点里可以有自己的子节点,层层嵌套。

设备树的跟是从"/"开始,/{};代表根节点root,一个设备树仅有一个根节点,根节点下可有多个节点。如:

/{                                  //根节点
    node1{                          //node1是节点名,是/的子节点
        key=value;                  //node1的属性
        ...
        node2{                      //node2是node1的子节点
            key=value;              //node2的属性
            ...
        };
    };                            //node1的描述到此为止
    node3{
        key=value;
        ...
    };
};

一般根节点描述板子,第一层节点可以描述控制器,如片选、nand_flash控制器,第二层可描述控制器上具体的设备。

二.节点的元素介绍

1.节点名node-name[@unit-address]

node-name是必须的,最长可以是31个字符长度node-name可重复

@unit-address是设备地址,在同级中必须是唯一,用以区分相同node-name的两个设备,比如有两块内存


 memory@30000000 {
        device_type = "memory";
        reg = <0x30000000 0x20000000>;
    };
 
 memory@50000000 {
        device_type = "memory";
        reg = <0x50000000 0x20000000>;
    };

特殊的节点名:有一些节点名用于特殊的用途,比如:

chosen节点,不表示一个设备,仅用来出出传递参数给内核,其parent node必须是名字是“/”的根节点。

chosen {
        bootargs = "console=ttySAC2,115200n8 root=/dev/nfs nfsroot=192.168.0.101:/home/run/work/rootfs/rootfs_3.16.57 ;
    }; 

其效果等同于跟u-boot中设置的bootargs作用一样

memory device node描述物理内存的分布,是所有设备树必备的节点,其device_type必须等于memory,reg定义起始地址和长度。

memory@50000000 {
        device_type = "memory";
        reg = <0x50000000 0x20000000>; //用来指定内存的地址、大小
    };

 /cpus

/cpus节点下面有1个或多个cpu子节点,cpu子节点用reg属性来表明自己是那个cpu。cpus的格式是固定的。


  cpus {
        #address-cells = <1>;
        #size-cells = <0>;
 
        cpu0: cpu@0 {
            device_type = "cpu";
            compatible = "arm,cortex-a15";
            reg = <0x0>;
            clock-frequency = <1600000000>;
        };  
 
        cpu1: cpu@1 {
            device_type = "cpu";
            compatible = "arm,cortex-a15";
            reg = <0x1>;
            clock-frequency = <1600000000>;
        };  
 
        cpu2: cpu@2 {
            device_type = "cpu";
            compatible = "arm,cortex-a15";
            reg = <0x2>;
            clock-frequency = <1600000000>;
        };  
 
        cpu3: cpu@3 {
            device_type = "cpu";
            compatible = "arm,cortex-a15";
            reg = <0x3>;
            clock-frequency = <1600000000>;
        };
    };

2.属性值 [properties definitions] 

2.1属性值的表示方式:

第一种:字符串,如 device_type = "memory";

compatible = "yic,smdkv210", "samsung,s5pv210";

第二种:32位无符号整型,整形用<>表示,如 reg = <0x30000000 0x20000000>;

第三种:字节数据,十六进表示1byte,制用[]表示,address = [00 00 de ad be ef];

其中00必须是两个0

2.2特殊的属性值

model

设备制造商的描述,如果有2款板子配置基本一致, 它们的compatible是一样的那么就通过model来分辨这2款板子.这个板子是什么
compatible

compatible属性用于平台的匹配,用来指定内核中哪个machine_desc可以支持本设备,是用来查找节点的方法之一,另外还可以通过节点名或节点路径查找指定节点。所以值内的字符串必须跟驱动内定义的名字一摸一样。

reg             
描述设备资源在其父总线定义的地址空间中的地址。两个参数,分别是基地址和长度

注:“cells”是由尖括号分隔的32位无符号整数:cell-property = <0xbeef 123 0xabcd1234>

#address-cells   在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address)
#size-cells      在它的子节点的reg属性中, 使用多少个u32整数来描述大小(size)

有了这两个属性,子节点中的"reg"就可以描述一块连续的地址区域。

每个可寻址的设备有一个reg属性,即以下面形式表示的元组列表:

reg = <address1 length1 [address2 length2] [address3 length3] ... > 

interrupts

中断,以后再写。

3.label 方式---引用

PIC: pic@10000000 {
    interrupt-controller;
};

another-device-node {
    interrupt-parent = <&PIC>;   // 使用label来引用上述节点, 
                                 // 使用lable时实际上也是使用phandle来引用, 
                                 // 在编译dts文件为dtb文件时, 编译器dtc会在dtb中插入phandle属性
};

“&” 引用节点(比如这个设备树include了其他的设备树文件,其他设备树文件里有个ABC节点,&ABC就可以引用这个节点并添加新的属性了)

4.覆盖规则:

同一层次的节点,后面出现的会覆盖前面的节点的内容。如include了dtsi文件,不想进入dtsi里修改,则可在dts文件内对节点进行新值的定义,就会覆盖掉dtsi内同级别节点内的对应的属性值

memory@30000000 {
        device_type = "memory";
        reg = <0x30000000 0x20000000>;
    };  
    memory@30000000 {
        reg = <0x30000000 0x10000000>; //覆盖了上一个reg的值
    }; 
引用的覆盖
dtsi文件下:
xusbxti: oscillator@1 {
                compatible = "fixed-clock";
                reg = <1>;
                clock-frequency = <0>;
                clock-output-names = "xusbxti";
                #clock-cells = <0>;
            }; 
引用:
&xusbxti {
     clock-frequency = <24000000>;  //clock-frequency 属性值被覆盖更新
};
直接覆盖方式引用时,新的覆盖要放在根节点外面即,刚才的例子要按照这种方式替换clock-frequency属性。

/ {
 
};
 
&xusbxti {
     clock-frequency = <24000000>;
};

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高通的 mixer 文件是用来控制音频硬件的,它的语法规则如下: 1. 每行以一个控制名开头,后跟一个或多个参数,参数之间用空格分隔。 2. "#" 开头的行表示注释。 3. "@" 开头的行表示设备的配置信息,如 @audio_route、@audio_effects、@audio_device、@audio_policy、@speaker_protection 等,用于描述音频路由、音频效果、音频设备、音频策略以及扬声器保护等相关信息。 4. "=" 开头的行表示设备的状态,包括可读属性和可写属性,用于控制音频硬件的操作。例如,"Playback Volume" 表示播放音量,可以通过修改该属性的值来调节音量大小。 5. "|" 开头的行表示控制的路径,它指定了控制操作的目标设备和设备的属性。 6. "!" 开头的行表示控制的操作,包括 get、set、cget、cset 等,用于获取、设置、获取并清除、设置并清除控制的值。 7. "$" 开头的行表示控制值的别名,用于简化控制的名称,方便使用。 例如,以下是一个 mixer 文件的示例: ``` #注释 @audio_route { name "default" playback { pcm "default" mixer_control "Playback Path" } capture { pcm "default" mixer_control "Capture Path" } } Playback Volume { type INTEGER count 1 range 0 100 } Playback Path { type ENUM count 1 items { "Speaker" "Headset" "Bluetooth" } } |Playback Path { control Playback Path iface MIXER device 0 } !Playback Path Speaker { control Playback Path value 0 } $Speaker Playback Path Speaker ``` 以上 mixer 文件包含了一个名为 "default" 的音频路由,包括播放和录制两种模式。其中 "Playback Volume" 控制播放音量大小,"Playback Path" 控制播放的音频路由,使用了 "ENUM" 类型的控制,可以选择 "Speaker"、"Headset" 或 "Bluetooth" 三种设备进行播放。控制的路径使用了 "|" 表示,控制的目标设备为 "Playback Path",控制的属性为 "control"、"iface" 和 "device",分别表示控制的类型、接口和设备编号。控制的操作使用了 "!" 表示,控制的属性为 "control" 和 "value",分别表示控制的名称和控制的值。最后一个 "$" 行表示 "Playback Path Speaker" 的别名为 "Speaker"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值