树莓派驱动之设备树覆盖
一、前言
由于是初学者,所以对于一些操作需要记录下方便自己查找。
附上:树莓派设备树官网
我只从官网上了解到一点点内容,还有许多没看懂的和还没学的
一个常规的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
更多推荐
所有评论(0)