• 新型LINUX驱动开发 DTS设备树


    1.为什么使用设备树

    linux内核3.版本之后才有设备树。

    没有设备树之前的板级信息都写在.c文件里面,导致内核臃肿。

    因此将板级信息独立成格式,文件名为dts,一个平台对应一个dts。

    2.dts dtb dtc

    dts是设备树源码文件。

    dtb是将设备树dts编译以后得到的二进制文件。

    dtc是将dts编译成dtb的工具。

    3.编译设备树

    make dtbs

    单独编译某个dts文件

    make 文件.dtb

    4.设备树语法

    dts也是/开始的表示根。

    dts文件也可以有有文件,将一款soc的所有通用信息提取出来作为一个通用的dts。如CPU,中断控制器,时钟,iic。

    如:/WorkPlatform/T5/auto-T507-linux4.9-v1.0/t5_alter/CLIENT/tshumh_TSH/sysfile/board.dts

    (1)从/开始描述设备信息。

    (2)在/节点外,有些像&cpu_trip这样的语句,是对某个节点的追加。

    (3)节点名字的完整要求

    lcd0: lcd0@01c0c000  @后面的一般都是这个外设寄存器的起始地址。

    (4)uart1: uart@05000400  uart1是标签,完整的名字是 uart@05000400

    1. ```
    2. /dts-v1/;
    3. #include ""
    4. /{ //开始的表示根
    5. model = "sun50iw9"; //属性和属性值
    6. compatible = "allwinner,t507", "arm,sun50iw9p1";
    7. reg_usb_vbus: usb-vbus { //一级子节点
    8. };
    9. reg_hdmi_power: hdmi-power {
    10. };
    11. soc@03000000{
    12. r_pio: pinctrl@07022000 { //二级子节点
    13. s_twi0_pins_a: s_twi0@0 { //三级子节点
    14. allwinner,pins = "PL0", "PL1"; //属性信息
    15. allwinner,pname = "s_twi0_scl", "s_twi0_sda";
    16. allwinner,function = "s_twi0";
    17. allwinner,muxsel = <3>;
    18. allwinner,drive = <0>;
    19. allwinner,pull = <1>;
    20. };
    21. s_twi0_pins_b: s_twi0@1 {
    22. allwinner,pins = "PL0", "PL1";
    23. allwinner,function = "io_disabled";
    24. allwinner,muxsel = <7>;
    25. allwinner,drive = <0>;
    26. allwinner,pull = <0>;
    27. };
    28. };
    29. };
    30. //自己添加一个子节点,一般添加在一级子节点
    31. mytestnode:mytest@0101{
    32. };
    33. };
    34. &cpu_trips{ //对某个节点的追加
    35. };
    36. &reg_usb_vbus{ //在reg_usb-vbus节点里面追加内容
    37. mytestnode{
    38. };
    39. };

    5.设备树在系统中的体现

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

    在这里插入图片描述

    6.标准属性

    compatible 属性也叫做“兼容性”属性,compatible 属性用于将设备和驱动绑定起来。

    compatible = "regulator-fixed";直接搜regulator-fixed,通过compatible与驱动框架匹配。

    model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的。

    status 属性是描述设备的状态的,“okay” 表明设备是可操作的,disabled”表明设备当前是不可操作

    的。

    reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。主要是

    外设首地址和地址长度。

    7.根节点 compatible 属性

    根节点下的compatible 属性用来描述支持哪一个平台的。

    内核是怎么匹配到板子所需要的设备树:也是根据/节点下面的compatible 属性。

    compatible = "regulator-fixed";

    8.dts绑定文档

    对dts里面的属性进行解释,设备树的描述信息,Documentation/devicetree/bindings 目录下

    找对应的文档。

    9.linux内核中的of函数

    在驱动框架中使用of函数获取设备树属性内容。 OF 函数原型都定义在 include/linux/of.h 文件中。

    (1)of_find_node_by_name 函数通过节点名字查找指定的节点

      struct device_node *of_find_node_by_name(struct device_node *from,const char *name)

      函数参数和返回值含义如下:

      from:开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。

      name:要查找的节点名字。

      返回值:找到的节点,如果为 NULL 表示查找失败。

    (2)of_find_node_by_path 函数通过路径来查找指定的节点

       inline struct device_node *of_find_node_by_path(const char *path)

       函数参数和返回值含义如下:

       path:带有全路径的节点名,可以使用节点的别名,比如“/backlight”就是 backlight 这个节点的全路径。

       返回值:找到的节点,如果为 NULL 表示查找失败

  • 相关阅读:
    2316. 统计无向图中无法互相到达点对数
    B+树索引(5)之索引注意事项
    2021年软件测试面试题大全
    Chromebook文件夹应用新功能
    通过 ChatGPT 制作一个短视频
    MySQL的时间差函数、日期转换计算函数
    深入了解多分类混淆矩阵:解读、应用与实例
    【sqlserver】配置管理器打不开
    短视频矩阵系统源码--saas开发
    ChatGPT与广泛应用:革新还是威胁?
  • 原文地址:https://blog.csdn.net/weixin_49303682/article/details/127760866