电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
【野火i.MX6ULL ARM Linux开发板连载】-02设备树的编译和加载
分 享
扫描二维码分享
【野火i.MX6ULL ARM Linux开发板连载】-02设备树的编译和加载
IMX6ULL
热门评测
嵌入式软件
嵌入式与Linux那些事
关注
发布时间: 2021-04-12
丨
阅读: 846
> 哈喽,大家好。今天介绍的是设备树的加载和编译。设备树,我也是第一次接触,在编译的时候,也是遇到了很多问题。折腾了好几次才加载成功。在这里,也想和大家说,遇到问题不要怕,我们现阶段所遇到的问题,在网上查找,基本都有对应的解决办法。好好利用谷歌,百度,StackOverflow等检索工具,一定可以事半功倍。有句话说的好,只要思想不滑坡,方法总比困难多。做技术是这样,在生活中亦然。 > > 本文由嵌入式与Linux那些事创作,未经作者授权,禁止转载。 > > CSDN:[嵌入式与Linux那些事](https://blog.csdn.net/qq_16933601?spm=1000.2115.3001.5343) > > 博客园:[嵌入式与Linux那些事](https://www.cnblogs.com/dongxb/) > > 公众号:[嵌入式与Linux那些事](https://gitee.com/dongxingbo/Picture/blob/master/Wechat/%E5%85%AC%E4%BC%97%E5%8F%B7%E4%BA%8C%E7%BB%B4%E7%A0%81_%E6%99%AE%E9%80%9A.png) [TOC] # 1. 设备树的编译和加载 上面介绍的编译模块是和内核一起编译的,这种编译方式比较耗时。在Linux3.x 以后的版本才引入了设备树,有了设备树之后,只需要一次编译内核,编译内核的时候会生成的dtc 工具,利用dtc工具就可以完成驱动的编译。我们这里只是简单介绍如何编译设备树、加载设备树,关于设备树,后面会有更加详细的解释。 ## 1.1 修改内核的设备树 为了测试设备树能否被成功编译和加载,可以向现有设备节点追加数据、和编写设备树插件。 打开`内核源码/arch/arm/boot/dts/imx6ull-seeed-npi.dtb`的文件,在设备树文件后追加如下内容。(程序的含义,先不做解释,后面会讲解)。 ```c / { 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"; }; }; }; ``` ![在设备树中追加一个节点](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E5%9B%9B%E6%9C%88/%E8%AE%BE%E5%A4%87%E6%A0%91%E4%B8%AD%E8%BF%BD%E5%8A%A0%E5%86%85%E5%AE%B9.png) ## 1.2 编译设备树 这里我们选用的编译设备树的方法是和内核一起编译,内核中的设备树都在`内核源码/arch/arm/boot/dts/` 目录中,我们使用的开发板对应的设备树为`imx6ull-seeed-npi.dtb`。 ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs # 参数“-j4”指定多少个线程编译 ``` ![内核目录下编译设备树](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E5%9B%9B%E6%9C%88/%E5%86%85%E6%A0%B8%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%BC%96%E8%AF%91%E8%AE%BE%E5%A4%87%E6%A0%91.png) 设备树编译完成后,位于`/arch/arm/boot/dts`目录中,文件名为“imx6ull-seeed-npi.dtb”。 ## 1.3 加载设备树 将编译好的设备树文件拷贝到开发板中,可以使用SCP或者NFS,替换`/boot/dtbs/4.19.71-imx-r1/imx6ull-seeed-npi.dtb`。 为了确保会覆盖原来的设备树,这里加入 -i指令。 ```bash 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](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E5%9B%9B%E6%9C%88/led_test%E6%B5%8B%E8%AF%95%E8%AE%BE%E5%A4%87%E6%A0%91.png) # 2. 设备树插件的编译和加载 ## 2.1 单独使用dtc工具编译 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`后出现下图报错 ![设备树插件编译报错](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E5%9B%9B%E6%9C%88/%E7%BC%96%E8%AF%91%E6%8A%A5%E9%94%99.png) 可以尝试先卸载device-tree-compiler,卸载命令为:`sudo apt-get autoremove device-tree-compiler`。 重新安装,安装命令`sudo apt-get install device-tree-compiler -y`。 ![卸载后重装](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E5%9B%9B%E6%9C%88/%E5%8D%B8%E8%BD%BD%E9%87%8D%E6%96%B0%E5%AE%89%E8%A3%85%E8%AE%BE%E5%A4%87%E6%A0%91%E6%8F%92%E4%BB%B6.png) 然后修改`ebf-linux-dtoverlays/scripts//basic/fixdep`文件的权限, 修改权限命令为:`sudo chmod 777 scripts/basic/fixdep`。 ![修改文件权限并执行编译](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E5%9B%9B%E6%9C%88/%E4%BF%AE%E6%94%B9%E6%9D%83%E9%99%90%E5%B9%B6%E6%89%A7%E8%A1%8C%E7%BC%96%E8%AF%91.png) ## 2.2 内核dtc工具编译设备树插件 编译设备树插件和编译设备树类似,这里使用内核中的dtc工具编译编译设备树插件。将xxx.dts 编译为 xxx.dtbo。 例如,将imx-fire-rgb-led-overlay.dts编译为rgb.dtbo,编译指令如下。 ```bash 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工具编译](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E5%9B%9B%E6%9C%88/dtc%E5%B7%A5%E5%85%B7%E7%BC%96%E8%AF%91.png) 编译好的设备树插件为rgb.dtbo。 ## 2.3 加载设备树插件 首先在/sys/kernel/config/device-tree/overlays/下创建一个新目录。 ```bash mkdir /sys/kernel/config/device-tree/overlays/rgb_led ``` 将rgb.dtbo文件拷贝到开发板的/sys/kernel/config/device-tree/overlays/rgb_led目录中。 将dtbo的内容cat到dtbo属性文件。 ```bash cat rgb.dtbo > /sys/kernel/config/device-tree/overlays/rgb_led/dtbo ``` 和设备树相同,加载成功后就可以在“/proc/device-tree”目录下找到与插入的设备树节点同名的文件夹, 进入该文件夹还可以看到该节点拥有的属性以及它的子节点,如下所示。 ![查看rgb_led节点](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E5%9B%9B%E6%9C%88/%E6%9F%A5%E7%9C%8Brgb_led%E8%8A%82%E7%82%B9.png) ![rgb_led目录](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E5%9B%9B%E6%9C%88/rgb_led%E7%9B%AE%E5%BD%95.png) # 3.总结 今天的内容,就到这里。学习,还是要多折腾几遍才行。设备树只是一个工具,大家掌握这两种编译和加载的方法,足够在工作中使用了。更详细的关于设备树的内容,后面将会介绍。 > 本文参考:野火Linux开发实战指南 扫描下方二维码关注我的公众号【**嵌入式与Linux那些事**】 回复【交流群】,扫码进入技术交流群,一起学习,一起进步! 回复【电子书】,领取10G电子书! 回复【网盘】,领取2000G学习资料! 回复【简历】领取简历模版 ![](https://gitee.com/dongxingbo/Picture/raw/master/Wechat/%E5%8A%A8%E6%80%81%E5%BC%95%E5%AF%BC%E5%85%B3%E6%B3%A8%E5%85%AC%E4%BC%97%E5%8F%B7%E5%8F%B7.gif)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
嵌入式与Linux那些事
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交