哈喽,大家好。今天介绍的是设备树的加载和编译。设备树,我也是第一次接触,在编译的时候,也是遇到了很多问题。折腾了好几次才加载成功。在这里,也想和大家说,遇到问题不要怕,我们现阶段所遇到的问题,在网上查找,基本都有对应的解决办法。好好利用谷歌,百度,StackOverflow等检索工具,一定可以事半功倍。有句话说的好,只要思想不滑坡,方法总比困难多。做技术是这样,在生活中亦然。
本文由嵌入式与Linux那些事创作,未经作者授权,禁止转载。
CSDN:嵌入式与Linux那些事
IMX6ULL驱动开发实战连载系列总目录
上面介绍的编译模块是和内核一起编译的,这种编译方式比较耗时。在Linux3.x 以后的版本才引入了设备树,有了设备树之后,只需要一次编译内核,编译内核的时候会生成的dtc 工具,利用dtc工具就可以完成驱动的编译。我们这里只是简单介绍如何编译设备树、加载设备树,关于设备树,后面会有更加详细的解释。
为了测试设备树能否被成功编译和加载,可以向现有设备节点追加数据、和编写设备树插件。
打开内核源码/arch/arm/boot/dts/imx6ull-seeed-npi.dtb
的文件,在设备树文件后追加如下内容。(程序的含义,先不做解释,后面会讲解)。
/ {
model = "Seeed i.MX6 ULL NPi Board";
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
aliases {
pwm0 = &pwm1;
pwm1 = &pwm2;
pwm2 = &pwm3;
pwm3 = &pwm4;
};
/*添加led节点*/
led_test{
#address-cells = <1>;
#size-cells = <1>;
rgb_led_red@0x0209C000{
compatible = "fire,rgb_led_red";
reg = <0x0209C000 0x00000020>;
status = "okay";
};
};
};
这里我们选用的编译设备树的方法是和内核一起编译,内核中的设备树都在内核源码/arch/arm/boot/dts/
目录中,我们使用的开发板对应的设备树为imx6ull-seeed-npi.dtb
。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig
make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs # 参数“-j4”指定多少个线程编译
设备树编译完成后,位于/arch/arm/boot/dts
目录中,文件名为“imx6ull-seeed-npi.dtb”。
将编译好的设备树文件拷贝到开发板中,可以使用SCP或者NFS,替换/boot/dtbs/4.19.71-imx-r1/imx6ull-seeed-npi.dtb
。
为了确保会覆盖原来的设备树,这里加入 -i指令。
sudo cp -i /mnt/linux_driver/ebf-buster-linux/arch/arm/boot/dts/imx6ull-seeed-npi.dtb /boot/dtbs/4.19.71-imx-r1/imx6ull-seeed-npi.dtb
重启开发板后,uboot在启动的时候负责该目录的设备文件加载到内存,如下图所示,就可以看到创建的led_test。
Linux4.4以后引入了动态设备树的概念,即我们无需编译整个设备树,只需要编译我们修改过的部分即可。
设备树插件也可以使用DTC工具编译,不过,比较繁琐,容易出错。在虚拟机中,从gitee克隆下野火提供的一键式编译工具。
git clone https://gitee.com/Embedfire/ebf-linux-dtoverlays.git
要编译的设备树插件源文件放在 ebf-linux-dtoverlays/overlays/ebf
目录下, 然后回到编译工具的根目录 ebf-linux-dtoverlays/
执行make
即可。
生成的.dtbo
位于~/ebf-linux-dtoverlays/output
目录下。
如果你在执行make
后出现下图报错
可以尝试先卸载device-tree-compiler,卸载命令为:sudo apt-get autoremove device-tree-compiler
。
重新安装,安装命令sudo apt-get install device-tree-compiler -y
。
然后修改ebf-linux-dtoverlays/scripts//basic/fixdep
文件的权限, 修改权限命令为:sudo chmod 777 scripts/basic/fixdep
。
编译设备树插件和编译设备树类似,这里使用内核中的dtc工具编译编译设备树插件。将xxx.dts 编译为 xxx.dtbo。
例如,将imx-fire-rgb-led-overlay.dts编译为rgb.dtbo,编译指令如下。
sudo su #一定要切换root用户
/home/zhongyi/workdir/linux_driver/ebf-buster-linux/build_image/build/scripts/dtc/dtc -I dts -O dtb -o rgb.dtbo imx-fire-rgb-led-overlay.dts
编译好的设备树插件为rgb.dtbo。
首先在/sys/kernel/config/device-tree/overlays/下创建一个新目录。
mkdir /sys/kernel/config/device-tree/overlays/rgb_led
将rgb.dtbo文件拷贝到开发板的/sys/kernel/config/device-tree/overlays/rgb_led目录中。
将dtbo的内容cat到dtbo属性文件。
cat rgb.dtbo > /sys/kernel/config/device-tree/overlays/rgb_led/dtbo
和设备树相同,加载成功后就可以在“/proc/device-tree”目录下找到与插入的设备树节点同名的文件夹, 进入该文件夹还可以看到该节点拥有的属性以及它的子节点,如下所示。
今天的内容,就到这里。学习,还是要多折腾几遍才行。设备树只是一个工具,大家掌握这两种编译和加载的方法,足够在工作中使用了。更详细的关于设备树的内容,后面将会介绍。
本文参考:野火Linux开发实战指南
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_16933601/article/details/115577800