IMX6ULL驱动开发实战连载-02设备树的编译和加载

2021-05-20 14:17:40 浏览数 (1)

哈喽,大家好。今天介绍的是设备树的加载和编译。设备树,我也是第一次接触,在编译的时候,也是遇到了很多问题。折腾了好几次才加载成功。在这里,也想和大家说,遇到问题不要怕,我们现阶段所遇到的问题,在网上查找,基本都有对应的解决办法。好好利用谷歌,百度,StackOverflow等检索工具,一定可以事半功倍。有句话说的好,只要思想不滑坡,方法总比困难多。做技术是这样,在生活中亦然。 本文由嵌入式与Linux那些事创作,未经作者授权,禁止转载。

1. 设备树的编译和加载

上面介绍的编译模块是和内核一起编译的,这种编译方式比较耗时。在Linux3.x 以后的版本才引入了设备树,有了设备树之后,只需要一次编译内核,编译内核的时候会生成的dtc 工具,利用dtc工具就可以完成驱动的编译。我们这里只是简单介绍如何编译设备树、加载设备树,关于设备树,后面会有更加详细的解释。

1.1 修改内核的设备树

为了测试设备树能否被成功编译和加载,可以向现有设备节点追加数据、和编写设备树插件。

打开内核源码/arch/arm/boot/dts/imx6ull-seeed-npi.dtb的文件,在设备树文件后追加如下内容。(程序的含义,先不做解释,后面会讲解)。

代码语言:javascript复制
/ {
    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";
        };
    };
};

1.2 编译设备树

这里我们选用的编译设备树的方法是和内核一起编译,内核中的设备树都在内核源码/arch/arm/boot/dts/ 目录中,我们使用的开发板对应的设备树为imx6ull-seeed-npi.dtb

代码语言:javascript复制
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”。

1.3 加载设备树

将编译好的设备树文件拷贝到开发板中,可以使用SCP或者NFS,替换/boot/dtbs/4.19.71-imx-r1/imx6ull-seeed-npi.dtb

为了确保会覆盖原来的设备树,这里加入 -i指令。

代码语言:javascript复制
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。

2. 设备树插件的编译和加载

2.1 单独使用dtc工具编译

Linux4.4以后引入了动态设备树的概念,即我们无需编译整个设备树,只需要编译我们修改过的部分即可。

设备树插件也可以使用DTC工具编译,不过,比较繁琐,容易出错。在虚拟机中,从gitee克隆下野火提供的一键式编译工具。

代码语言:javascript复制
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

2.2 内核dtc工具编译设备树插件

编译设备树插件和编译设备树类似,这里使用内核中的dtc工具编译编译设备树插件。将xxx.dts 编译为 xxx.dtbo。

例如,将imx-fire-rgb-led-overlay.dts编译为rgb.dtbo,编译指令如下。

代码语言:javascript复制
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。

2.3 加载设备树插件

首先在/sys/kernel/config/device-tree/overlays/下创建一个新目录。

代码语言:javascript复制
mkdir /sys/kernel/config/device-tree/overlays/rgb_led

将rgb.dtbo文件拷贝到开发板的/sys/kernel/config/device-tree/overlays/rgb_led目录中。

将dtbo的内容cat到dtbo属性文件。

代码语言:javascript复制
cat rgb.dtbo  > /sys/kernel/config/device-tree/overlays/rgb_led/dtbo

和设备树相同,加载成功后就可以在“/proc/device-tree”目录下找到与插入的设备树节点同名的文件夹, 进入该文件夹还可以看到该节点拥有的属性以及它的子节点,如下所示。

3.总结

今天的内容,就到这里。学习,还是要多折腾几遍才行。设备树只是一个工具,大家掌握这两种编译和加载的方法,足够在工作中使用了。更详细的关于设备树的内容,后面将会介绍。

本文参考:野火Linux开发实战指南

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

0 人点赞