树莓派驱动之设备树覆盖

一、前言

由于是初学者,所以对于一些操作需要记录下方便自己查找。

附上:树莓派设备树官网

我只从官网上了解到一点点内容,还有许多没看懂的和还没学的

一个常规的Arm-Linux设备树,主要是由源文件.dts和头文件.dtsi共同编译出.dtb二进制,内核在初始化后会加载这个dtb,并把相关设备都注册好,就可以愉快地使用了。例如树莓派3B+,/boot/bcm2710-rpi-3-b-plus.dtb就是树莓派SoC和外围电路的默认配置。

对于大部分硬件产品来说这没什么问题,例如一部手机在出厂以后,它的硬件几乎是不会变的。但对于树莓派这种开发板来说,尤其是它的40pin扩展引脚,外围电路的变动可就大了去了,而内核加载dtb后是不能变的,所以需要一种动态覆盖配置的设备树机制,这就是树莓派的——dtoverlay(设备树覆盖)。

dtoverlay同样是由dts源编译而来,语法几乎和设备树一样,不过输出文件扩展名为dtbo。树莓派提供了两种方式加载dtbo:

1、将编译好的dtbo放到/boot/overlays下,并由/boot/config.txt配置和使能;
2、通过命令dtoverlay <dtbo_file>动态覆盖设备树;
第1种方式会涉及更复杂的语法规则,本篇文章仅仅是对平台设备及设备树的知识入门,因此选择第2种命令行的方式,动态加载。

二、操作过程

1、先安装设备树编译器

sudo apt-get install device-tree-compiler

2、新建一个设备树文件,并定义一个led_type_a的LED设备,并将其命名为led_a1 。

pi@raspberrypi:/modules $ ls
myled.dts

myled.dts

/dts-v1/;
/plugin/;

/ {
  fragment@0 {
    target-path = "/";
    __overlay__ {
      led_a1 {
        compatible = "led_type_a";
      };
    };
  };
};

fragment和__overlay__非常重要!!如果不这么写会导致动态加载失败,但其实以上的代码转化为标准的设备树语法为:

/led_a1 {
  compatible = "led_type_a";
};

3、将.dts文件生成.dtbo

sudo dtc -I dts myled.dts -o myled.dtbo

结果再当前目录下会生成myled.dtbo文件
4、加载设备树覆盖:

sudo dtoverlay myled.dtbo

5、将myled.dtbo文件拷贝到/boot/overlays/

sudo cp myled.dtbo /boot/overlays/

6、在/boot/config.txt最后一行添加dtoverlay=myled

sudo vi /boot/config.txt

7、重启reboot…
8、可以在/sys/device/platform或者/proc/device-tree下查看到设备led_a1已经注册

ls /proc/device-tree
pi@raspberrypi:~ $ ls /proc/device-tree
'#address-cells'   axi      compatible           fixedregulator_5v0   leds         model           phy             serial-number   __symbols__     timer
 aliases           chosen   cpus                 interrupt-parent     memory@0     name            scb            '#size-cells'    system          v3dbus
 arm-pmu           clocks   fixedregulator_3v3   led_a1               memreserve   __overrides__   sd_io_1v8_reg   soc             thermal-zones

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在嵌入式Linux下,设备树(device tree)用来描述硬件平台的各种资源,Linux内核在启动过程中,会解析设备树,获取各种硬件资源来初始化硬件。设备树的overlay功能是指可以在系统运行期间动态修改设备树。一般情况下,如上图所示,设备树经过DTC编译器编译为二进制的hello.dtb文件,加载到内存,随Linux内核一起启动后,一般就无法更改了。如果我们想修改设备树,需要修改hello.dts文件文件,重新编译成二进制文件:hello.dtb,然后重新启动内核,重新解析。有了设备树的overlay功能,省去了设备树的重新编译和内核重启,我们可以直接编写一个设备树插件:overlay.dts,编译成overlay.dtbo后,直接给设备树“打补丁”,在运行期间就可以动态添加节点、修改节点...设备树的overlay功能,在很多场合都会用得到,会让我们的开发更加方便:外界插拔设备,无法在设备树中预先描述:耳机树莓派 + FPGA开发板基于I2C的温度传感器管脚的重新配置:PIN multiplexing修改bootcmd、分区...设备树的overlay功能,目前还没有加入到内核mainline(linux-5.10.x),但目前有些开发板和配套的BSP已经支持了,支持在系统运行期间动态修改设备树文件。如果你手头的开发板或内核平台还没有支持device tree overlay,可以学习本期课程,学习内核中设备树overlay的实现原理,如何给内核打补丁,使内核支持设备树的overlay功能。有了本期课程的学习基础,明白了设备树overlay的实现原理和运行机制,你就可以尝试在自己的开发板平台上实现这个功能了。本期课程的主要内容如下:在开发板上如何实现设备树的overlay功能Configfs文件系统的配置与挂载Configfs编程接口如何编写设备树 overlay插件设备树 overlay的编译和运行设备树overlay运行机制分析本期课程适合哪些人学习:嵌入式驱动工程师嵌入式BSP工程师嵌入式软件工程师想从事嵌入式开发的同学全网首家讲解设备树overlay的视频教程。   

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值