Linux驱动编程【设备树详解】

目录

一、什么是设备树

二、DTS、DTB、DTC的关系

三、DTS基本语法

四、设备树在系统中的体现

五、设备树特殊节点

一、什么是设备树

        1、uboot启动内核用到zImage、imx6ull-alientek-emmc.dtb

                bootz 80800000 - 83000000

        2、描述设备树的文件叫做DTS,这个DTS文件采用树形结构描述板级设备,也就是开发板上的设备信息,例如CPU数量、内存基地址、I2C接口上接了哪些设备

        3、在单片机驱动里面比如W25QXX,SPI,速度都是在.c文件里面写死的。板级信息都写在.c里,导致Linux内核冗余、臃肿。因此,将板子信息做成独立的格式。文件扩展名为.dts。一个机器对应一个.dts

二、DTS、DTB、DTC的关系

        .dts相当于.c ==> DTS源码文件

        DTC工具相当于gcc编译器,将.dts编译成.dtb

        .dtb相当于bin文件,可执行文件

        使用方法: ①、make all

                           ②、make dtbs

        如果要编译指定的.dts :make xxxxxx.dtb

三、DTS基本语法

        1、设备树也有头文件,扩展名为.dtsi,可以将一款SOC他的其他所有设备/平台的共有信息提出来,作为一个通用的.dtsi文件

        .dtsl描述CPU内部的一些共有的外设的信息

#include <dt-bindings/input/input.h> 
#include "imx6ull.dtsi"

设备树抽象例子

        DPU:教务处

                ==>信息与科学学院

                        ==>通信工程

                                ==> 二班

        ALPHA:soc \* 描述6ull芯片内部内存映射,内部外设信息 *\

                ==>I2C

                ==>bus

                ==>aips1

                        ==>gpt2

                ==>aips2

                        ==>i2c1

        cpu

        clocks

        2、DTS也是 / 开始

        3、从根节点开始描述设备信息

        4、在根节点外有一些&cpu0这样的语句是追加信息,追加到.dtsi文件

/dts-v1/;
#include <xxx.h>
#include "xxxx.dtsi"
/ {            /* 根节点 */
    model = "";
    compatible = "";    /* 属性 */ 
    chosn {    /* 一级子节点 */
                
    };
    memory {   /* 一级子节点 */
            
    };
    reserved-memory {
            
    };
    backlight {
            
    };
    pxp_v412 {
            
    };
    regulatros {
            
    };
    sound {
            
    };
    spi4 {

    };
};

5、节点名字:完整名字的要求

“node-name@unit-address

一般都是外设寄存器的起始地址,或者其他含义,具体节点具体分析

        intc:interrupt-controllen@00a01000

        冒号前面是标签(label):后面才是名字

        intc是标签,interrupt-controllen@00a01000是完整名字

四、设备树在系统中的体现

        系统启动以后可以在根文件系统中看到设备树的节点信息。

        cd /proc/device-tree/ 在这个目录下存放着设备树信息。

        目录中的文件都是.dts文件的一级子节点

        内核启动的时候,会解析设备树,然后在/proc/device-tree/目录下呈现出来

五、设备树特殊节点

        chosn { /* 特殊节点 */ };

        aliases{ /* 特殊节点 */ };

        aliases子节点:在Linux内核启动的时候会扫描这个节点。例如soc上有很多个i2c控制器,alias的相当于给每个i2c控制器分配一个唯一的编号

        chosen子节点:主要是为了uboot向Linux内核传递数据,重点是bootargs参数。作为命令行参数

linux内核cmdline的值为

        uboot是如何向内核传递bootargs。

        经过查看发现chosen节点中包含bootargs属性,属性值和uboot的bootargs一致。

        uboot接触过dtb,最终通过bootz 80800000 - 83000000来启动内核。经过分析判断uboot拥有bootargs环境变量和dtb,因此最有可能“作案”。

        在uboot的fdt_chosen函数中会查找chosen节点,并且添加bootargs环境变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值