• 设备树源码(即xxx.dts或xxx.dtsi文件)的格式


    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。


    1、设备树源码在哪里?

    (1)早期内核版本(2.6及以前的版本)描述硬件信息的.h文件,一般放在arch/arm/mach-xxx 或者arch/arm/plat-xxx中。

    (2)3.x以上的内核版本,xxx.dts文件放在arch/arm/boot/dts目录中。


    2、设备树源码的格式简介

    (1)设备树源码文件,其后缀名一般为dts和dtsi。

    (2)这些设备树源码文件可以include那些C语言的头文件,也可以被其他文件include。

    (3)xxx.dtsi文件编写的是soc共性部分,而xxx.dts文件编写的是具体开发板的特性部分,所以xxx.dts文件一般包含并重写部分xxx.dtsi文件。

    (4)注释用/**/,注意#开头的不是注释。

    (5)分号是段落块之间的分隔符,{}、[]和<>是段落块的封装符号,和C语言语言类似。

    (6)/dts-v1/节点,表示dts的版本号,目前都是v1。

    (7)/{}是根节点,理论上只应该有一个根节点,有说法dtc会合并所有root node为同一个。

    (8)dts是树状的多节点的组织,基本单元是node,除root外其他node都有parent,还可以有child。


    3、设备树源码的节点格式

    (1)格式定义

    1. [label:] [@]{
    2.       [property]
    3.       [child nodes]
    4.       [child nodes]
    5.       ......
    6.     };

    (2)格式解读

    • [ ] 表示该项可以省略,< >表示不可省略。
    • [label] 表示标签,主要是为了方便访问节点,后面可以直接通过&label来访问该节点。
    • node-name表示节点名称。注意,根节点的名称必须是“/”。
    • [@unit-address]表示地址,比如cpu node就是0、1这种,reg node就是0x12010000这种。

    (3)实例说明

    看3516dv300的dts。


    (4)补充说明

    一般一个节点描述一个硬件模块。

    不是所有硬件模块都需要用dts来描述,usb或emmc等可以自己探测。


    4、节点属性的格式

    节点的属性由一个个key-value对组成,其中属性的名称就是key。

    节点的属性可以有值或者没有值(value):

    1. [label:] prooerty-name = value;  //有值
    2. [label:] property-name;      //没有值

    节点的属性如果有值,则其值有以下几种可能情况:

    1. 字符串          compatible = "arm,cortex-a7";
    2. 32位无符号整数  reg = <1 0x123456 100>;
    3. 16进制字节序列  reg = [00 11 22 33];  //每个数据必须是2位,也可以附加上0x
    4. 字符串列表      compatible = "fsl,imx6ull-gpmi-nand", "fsl,imx6ul-gpmi-nand";


    5、常见的标准属性

    (1)compatible属性

    节点数据将来去匹配内核策略部分的兼容性设置。

    1. 案例1:compatible = "manufacturer, model"
    2. 案例2:compatible = "fsl, imx6ul-evk-wm8960", "fsl, imx-audio-wm8960"
    3. 案例3:16dv300的串口uart

    根节点的compatible属性是确认内核是否适配该dtb的,作用类似于老版本的machine id。

    设备节点的compatible属性是为了匹配Linux内核中的驱动程序,作用类似于以前的.name。

    另外,compatible如果有多个,前面的更精准,后面的越来越泛化,所以优先匹配前面。

    (2)model属性

    描述设备模块信息,比如名字、详细版本号。

    1. 案例1:model = "wm8960-audio-V1.0"
    2. 案例2:model = "Hisilicon HI3516DV300 DEMO Board"

    (3)status属性

    描述设备状态信息,有以下几个值:

    1. "okey"                表示设备是可操作的
    2. "disabled"            表示当前不可操作,但是后续是可以更改为可操作性的
    3. "fail" "failed"       表示有严重错误,几乎不可能再可操作了

    (4)reg属性

    配置某个硬件模块对应的地址范围信息,reg是region。

    1. #address-cells = <1>  //表示reg里面的数据address占用一个字长,注意是字长而非字节
    2. #size-cells = <1>   //表示reg里面的数据length占用一个字长,注意是字长而非字节
    3. gpio-spi: gpio_spi@0{   
    4.   compatible = ".spi"
    5.   reg =  
    6.     //address一般用来表示起始地址,length一般表示持续长度
    7. }


    6、与中断有关的属性

    (1)interrupt-controller属性

    无值属性,表示这是一个中断控制器node。

    (2)#interrupt-cells属性

    这是中断控制器节点的属性,用来标识这个控制器需要几个cell做中断描述符。

    (3)interrupt-parent属性

    标识此设备节点属于哪一个中断控制器,如果没有这个属性,会自动依附父节点。

    (4)interrupts属性

    一个中断标识符列表,表示每一个中断输出信号。

  • 相关阅读:
    Android ArrayMap源码解析
    Java中对象的打印
    SpringBoot之文件上传(单文件与多文件上传的使用)
    教你如何在优麒麟上搭建 RISC-V 交叉编译环境
    代理模式,dk动态代理,cglib动态代理
    milvus向量数据库详解
    MONAI 叒叒叒更新了(1.0版本),这次在分割,联邦学习,病理图像,MRI重建上有动作
    WiFi网络分析工具Airtool for Mac
    Apache,PHP安装及Apache引入PHP模块
    吴恩达机器学习复习1:监督学习、无监督学习、模型表示、损失函数、直觉Ⅰ、直觉Ⅱ、梯度下降及其直觉、线性回归的梯度下降
  • 原文地址:https://blog.csdn.net/oqqHuTu12345678/article/details/127453330