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

举报
嵌入式与Linux那些事 发表于 2022/03/28 23:42:19 2022/03/28
【摘要】 哈喽,大家好。今天介绍的是设备树的加载和编译。设备树,我也是第一次接触,在编译的时候,也是遇到了很多问题。折腾了好几次才加载成功。在这里,也想和大家说,遇到问题不要怕,我们现阶段所遇到的问题,在网上...

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

本文由嵌入式与Linux那些事创作,未经作者授权,禁止转载。

CSDN:嵌入式与Linux那些事

IMX6ULL驱动开发实战连载系列总目录

1. 设备树的编译和加载

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

1.1 修改内核的设备树

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

打开内核源码/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";
        };
    };
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在设备树中追加一个节点

1.2 编译设备树

这里我们选用的编译设备树的方法是和内核一起编译,内核中的设备树都在内核源码/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”指定多少个线程编译

  
 
  • 1
  • 2

内核目录下编译设备树

设备树编译完成后,位于/arch/arm/boot/dts目录中,文件名为“imx6ull-seeed-npi.dtb”。

1.3 加载设备树

将编译好的设备树文件拷贝到开发板中,可以使用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

  
 
  • 1

重启开发板后,uboot在启动的时候负责该目录的设备文件加载到内存,如下图所示,就可以看到创建的led_test。

led_test

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

2.1 单独使用dtc工具编译

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

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

git clone https://gitee.com/Embedfire/ebf-linux-dtoverlays.git

  
 
  • 1

要编译的设备树插件源文件放在 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,编译指令如下。

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

  
 
  • 1
  • 2

使用dtc工具编译

编译好的设备树插件为rgb.dtbo。

2.3 加载设备树插件

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

mkdir /sys/kernel/config/device-tree/overlays/rgb_led

  
 
  • 1

将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

  
 
  • 1

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

查看rgb_led节点

rgb_led目录

3.总结

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_16933601/article/details/115577800

文章来源: blog.csdn.net,作者:嵌入式与Linux那些事,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_16933601/article/details/115577800

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。