前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IMX6ULL驱动开发实战连载-02设备树的编译和加载

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

作者头像
嵌入式与Linux那些事
发布2021-05-20 14:17:40
1.9K0
发布2021-05-20 14:17:40
举报

哈喽,大家好。今天介绍的是设备树的加载和编译。设备树,我也是第一次接触,在编译的时候,也是遇到了很多问题。折腾了好几次才加载成功。在这里,也想和大家说,遇到问题不要怕,我们现阶段所遇到的问题,在网上查找,基本都有对应的解决办法。好好利用谷歌,百度,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。

led_test
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
使用dtc工具编译
使用dtc工具编译

编译好的设备树插件为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”目录下找到与插入的设备树节点同名的文件夹, 进入该文件夹还可以看到该节点拥有的属性以及它的子节点,如下所示。

查看rgb_led节点
查看rgb_led节点
rgb_led目录
rgb_led目录

3.总结

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 设备树的编译和加载
    • 1.1 修改内核的设备树
      • 1.2 编译设备树
        • 1.3 加载设备树
        • 2. 设备树插件的编译和加载
          • 2.1 单独使用dtc工具编译
            • 2.2 内核dtc工具编译设备树插件
              • 2.3 加载设备树插件
              • 3.总结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档