Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    [Happy Hacking Nezha Board] 掌握 Device Tree Oerlay 的魔法

    MR Series
    1
    2
    1986
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • L
      liangdi LV 4 last edited by

      Device Tree 是目前嵌入式 Linux 系统最常用的设备解耦工具, 所以要玩转嵌入式 Linux , 这个东西必须掌握.

      DTB, DTS , DTSI?

      在 tina sdk 代码中, 有 board.dts , sun20iw1p1.dtsi 这些文件, 这些就是 device tree 的源文件,或者说描述文件.

      dts 通过 dtc 这个编译器可以编译成 dtb 以及后面我们要用到的 dtbo(dtb overlay) , 它们是二进制文件, Linux 和 uboot 可以使用.

      DTC

      Device Tree Compiler , dts 的编译工具, Linux 下面可以使用包管理工具按照

      # redora
      sudo dnf install dtc
      
      # ubuntu
      
      sudo apt install device-tree-compiler
      
      

      windows 参考(未验证):
      https://github.com/lbmeng/dtc

      dtb overlay 示例代码

      在之前给出的 demo 镜像中, pwm7 这个设备的驱动部分在 dts 中被注释了, 所以我们尝试用 dtb overlay 给他弄回来.

      dtbo 的编译只要 dtc 就可以, 但是我们会看到 dtsi 中有 c 语言的 #include 宏,所以还会用到 c编译根据展开宏,如果没有 #include ,就不需要.

      使用 #include 宏展开示例, include 里面都是 dt-bindings 目录下的文件,该目录在 tina 中的位置是: lichee/linux-5.4/include , 你要展开需要将 lichee/linux-5.4/include/dt-bindings 拷贝到 dts 目录中来

      cpp -nostdinc -I. -undef -x assembler-with-cpp board.dts > board-with-include.dts
      
      

      执行后, board-with-include.dts 就是 include 展开后的代码.

      pwm7-overlay.dts 示例代码

      /dts-v1/;
      /plugin/;
      
      / {
          fragment@0 {
          target-path = "/soc/pinctrl@2000000";
              __overlay__ {
                   pwm7_pin_a: pwm7@0 {
                      pins = "PD22";
                      function = "pwm7";
                      drive-strength = <10>;
                      bias-pull-up;
                  };
      
                  pwm7_pin_b: pwm7@1 {
                      pins = "PD22";
                      function = "gpio_in";
                  };
              };
          };
      
          fragment@1 {
              target-path = "/soc/pwm7@2000c17";
             
              __overlay__ {
                  pinctrl-names = "active", "sleep";
                  pinctrl-0 = <&pwm7_pin_a>;
                  pinctrl-1 = <&pwm7_pin_b>;
                  status = "okay";
              };
          };
      
      };
      

      头部是作为一个 overlay 的描述, 和 dts 相比多了 /plugin/; 这个节点

      /dts-v1/;
      /plugin/;
      

      后面同样有个 / 根节点, 然后需要覆盖的地方用 fragment@x 作为节点名称

      fragment 里面 target-path 为需要覆盖的节点路径, 也可以用 target 使用的是引用.

      后面 overlay 里面就是需要覆盖的属性.

      编译

      dtc -I dts -O dtb -o ./pwm7-overlay.dtbo ./pwm7-overlay.dts
      

      这样得到的 pwm7-overlay.dtbo 文件就是我们所要的. 可以用
      fdtdump ./pwm7-overlay.dtbo 查看结果

      测试

      一个测试程序 (pwm.sh, 来自 RVBoards) 和蜂鸣器扩展版

      #!/bin/bash
      #pwm 节点
      pwmnode=pwm$1
      #输出提示pwm$1 通道
      echo  /sys/class/pwm/pwmchip0/${pwmnode}
      #申请pwm$1 通道
      echo $1 > /sys/class/pwm/pwmchip0/export
      #指定pwm$1 通道的频率
      echo $2 > /sys/class/pwm/pwmchip0/${pwmnode}/period
      #指定pwm$1 通道的占空比
      echo $3 > /sys/class/pwm/pwmchip0/${pwmnode}/duty_cycle
      #使能pwm$1 通道 
      echo 1 > /sys/class/pwm/pwmchip0/${pwmnode}/enable
      #使能pwm$1 通道 工作时间10s
      sleep 10
      #失能pwm$1 通道 
      echo 0 > /sys/class/pwm/pwmchip0/${pwmnode}/enable
      #等待pwm$1 通道 关闭
      sleep 1
      #注销pwm$1 通道
      echo $1 > /sys/class/pwm/pwmchip0/unexport
      

      在没有配置 dtb overlay 的系统中执行

      # 设置 7 号 pwm 引脚数据
      ./pwm.sh 7 300000 150000
      

      会出现错误

      然后将 pwm7-overlay.dtbo 复制到 boot 分区的 overlay 目录下, 在编辑 config.txt 添加配置
      dtboverlay=pwm7-overlay , 配置中不需要加 .dtbo, 系统会自动添加.

      重启后, 在执行
      ./pwm.sh 7 300000 150000 , 蜂鸣器就会响了.

      如果没有蜂鸣器扩展版,可以查看 /sys/class/pwm/ 里面的内容,进行前后对比,也会发现 dtb overlay 生效了.

      后记

      dtb 以及相关技术需要去掌握,掌握了就可以把开发板玩的更溜了, 如果你去使用各种大的扩展板, 基本都会涉及到 dtb overlay.

      L 1 Reply Last reply Reply Quote Share 0
      • L
        liangdi LV 4 @liangdi last edited by

        @liangdi 在 [Happy Hacking Nezha Board] 掌握 Device Tree Oerlay 的魔法 中说:

        dtboverlay=pwm7-overlay

        需要改为

        dtoverlay=pwm7-overlay

        1 Reply Last reply Reply Quote Share 0
        • Referenced by  Kirin Kirin 
        • 1 / 1
        • First post
          Last post

        Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

        行为准则 | 用户协议 | 隐私权政策