Linux驱动学习-设备树-20220411

设备树的作用是代替device.c来描述硬件。paltform的匹配方式不变,而且使用设备树,对硬件的改动就不需要去改动device.c重新编译到内核中,而是可以直接通过bootloader传递给内核,所以设备树也是platform平台设备驱动的一部分,是platform平台设备驱动框架的一种优化编写形式。

1. dts ,dtsi ,dtc , dtb

dts:设备树文件;

dtsi:通用设备树文件;

dtc:设备树编译器

dtb:设备树编译器编译设备树文件最终生成二进制文件

2.新增dts设备树文件

在设备树目录下新建xxx.dts设备树文件,然后在dtb编译文件Makefile中添加:

dtb-$(CONFIG_ARCH_ROCKCHIP)+=xxx.dtb

这样在编译设备树的时候就会将对应的xxx.dts 编译为二进制的xxx.dtb 文件;

【/kernel/arch/arm64/boot/dts/rockchip/】设备树参考路径

3.设备树文件语法

3.1可以像c文件一样添加头文件包含,设备树文件的头文件一般为dtsi文件

dtsi文件一般包含了SOC内部外设信息,在SOC整体移植的过程中,dtsi文件是通用部分,可以直接使用

3.2设备树-节点

设备树的起始:根节点,所有的设备节点都包含在根节点下,根节点的表示方法:

/{                                

}

以反斜杠+大括号的方式表示根节点,且整个系统只有一个根节点,包含在根节点内部的节点都为子节点,同时子节点内部也可以包含节点进行延伸表现形式如下:

/ {                    //根节点
    node1 {            //子节点
        a-string-property = "A string";
        a-string-list-property = "first string", "second string";
        a-byte-data-property = [0x01 0x23 0x34 0x56];
            child-node1 {        //子节点中的子节点
                first-child-property;
                second-child-property = <1>;
                a-string-property = "Hello, world";
            };
            child-node2 {
            };
        };
    node2 {             //子节点
        an-empty-property;
        a-cell-property = <1 2 3 4>;
            child-node1 {        //子节点中的子节点
            };
        };
}

3.3节点内包含的内容

节点的命名规则:<名称>@设备地址       

        名称不可以随意命名,要体现设备类型

        设备地址是访问该设备的基地址,主要用于区分节点

节点别名:

举例:uart8: serial@02288000
其中,uart8 就是这个节点名称的别名,serial@02288000 就是节点名称。

后期添加或修改节点信息的时候可以通过别名直接操作

&uart8{

        pinctrl_names = "uart8";

        status = "okay";

};

后期对节点信息的修改,对于原先节点中已有的属性会进行重写操作,对于原先节点中没有的属性则会添加到原有的节点中。直接引用节点可以避免在设备树文件中去找修改,直接在同级节点路径末尾修改即可,当然也可以在原有的节点中直接进行属性的修改。

3.4标准属性

不同平台,不同总线,地址位长度可能不同,有 32 位地址,有 64 位地址,为了适应规范,规定一个 32 位的长度为一个 cell。

3.4.1#address_cells:表示子总线地址(子节点设备地址)所需要的cell个数,u32类型数据

3.4.2#size_cells:表示子总线地址空间长度所需要的cell个数,u32类型数据

如果没有设置,内核默认认为"#address-cells"为 2,"#size-cells"为 1。

(用于父节点配置来设置子节点的reg属性)

3.4.3reg :"reg"属性用来表示节点地址资源的,比如常见的就是寄存器的起始地址及大小。要想表示一块连续地
址,必须包含起始地址和空间大小两个参数,如果有多块地址,那么就需要多组这样的值表示。对于'reg'
属性,每个元素是一个二元组,包含起始地址和大小。还有另外一个问题,地址和大小用几个 u32 表示呢?
这个就由父节点的"#address-cells","#size-cells"属性确定

3.4.4compatible:设备树中的每个表示一个设备的节点都需要一个 compatible 属性, compatible 属性是操作系统用来决定设备和驱动绑定的关键因素。compatible 属性也叫做兼容性属性,属性的值是一个字符串列表,用于表示是何种设备,可以在代码中进行匹配。

3.4.5status:属性用来表示节点的状态,其实就是硬件的状态,用字符串表示。
        “okay”表示硬件正常工作
        “disable”表示当前硬件不可用                                                                                                                          "fail”表示因为出错不可用
        "fail-sss”表示某种原因出错不可用,sss 表示具体出错的原因。
实际中,基本只用“okay”和“disable”

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值