青县网站建设,住房和城乡建设部网站诚信评价,设计公司企业介绍,广州网页编辑数量Linux4.4 以后引入了动态设备树#xff08;Dynamic DeviceTree#xff09;#xff0c;我们这里翻译为“设备树插件”。设备树插件可以理解为主设备树的“补丁”它动态的加载到系统中#xff0c;并被内核识别。例如我们要在系统中增加RGB 驱动#xff0c;那么我们可以针对R…Linux4.4 以后引入了动态设备树Dynamic DeviceTree我们这里翻译为“设备树插件”。设备树插件可以理解为主设备树的“补丁”它动态的加载到系统中并被内核识别。例如我们要在系统中增加RGB 驱动那么我们可以针对RGB 这个硬件设备写一个设备树插件然后编译、加载到系统即可无需从新编译整个设备树。
设备树插件是在设备树基础上增加的内容我们之前讲解的设备树语法完全适用甚至我们可以直接将之前编写的设备树节点复制到设备树插件里。具体使用方法介绍如下。
设备树插件格式
设备树插件拥有相对固定的格式甚至可以认为它只是把设备节点加了一个“壳”编译后内核能够动态加载它。格式如下具体节点省略。
列表1: 设备树插件基本格式
/dts-v1/;
/plugin/;/ {fragment0 {target-path /;__overlay__ {/* 在此添加要插入的节点*/};};
};第1 行用于指定dts 的版本。第2 行表示允许使用未定义的引用并记录它们设备树插件中可以引用主设备树中的节点而这些“引用的节点”对于设备树插件来说就是未定义的所以设备树插件应该加上“/plugin/”。第6 行指定设备树插件的加载位置默认我们加载到根节点下既“target-path “/”。第7-8 行我们要插入的设备及节点或者要引用追加的设备树节点放在__overlay__ {⋯}内。
实验说明
硬件介绍
本节实验使用到STM32MP1 开发板
实验代码讲解
本章的示例代码目录为linux_driver/dynamic_device_tree
我们尝试将上一节编写的RGB 灯节点使用动态设备树的方式添加到系统中。
创建RGB 灯的设备树插件
实现方法很简单直接复制上一小节RGB 灯的设备节点到设备树插件模板中如下所示。
列表2: rgb_led 设备树插件
// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
/*
* Copyright (C) STMicroelectronics 2018 - All Rights Reserved
* Author: Alexandre Torgue alexandre.torguest.com.
*//dts-v1/;
/plugin/;
//#include ../stm32mp157c.dtsi
#include dt-bindings/pinctrl/stm32-pinfunc.h
#include dt-bindings/input/input.h
#include dt-bindings/mfd/st,stpmic1.h
#include dt-bindings/gpio/gpio.h/{fragment0{target-path /;__overlay__ {/* 添加led 节点*/rgb_led{#address-cells 1;#size-cells 1;compatible fire,rgb_led;/* 红灯节点*/ranges;rgb_led_red0x50002000{compatible fire,rgb_led_red;reg 0x50002000 0x000000040x50002004 0x000000040x50002008 0x000000040x5000200C 0x000000040x50002018 0x000000040x50000A28 0x00000004;status okay;};/* 绿灯节点*/rgb_led_green0x50000A28{compatible fire,rgb_led_green;reg 0x50008000 0x000000040x50008004 0x000000040x50008008 0x000000040x5000800C 0x000000040x50008018 0x000000040x50000A28 0x00000004;status okay;};/* 蓝灯节点*/rgb_led_blue0x50000A28{compatible fire,rgb_led_blue;reg 0x50003000 0x000000040x50003004 0x000000040x50003008 0x000000040x5000300C 0x000000040x50003018 0x000000040x50000A28 0x00000004;status okay;};};};};};第10-13 行 RGB 灯设备节点使用到的头文件第19-61 行我们之前编写的RGB 灯设备节点。
就这样简单RGB 灯的设备树插件已经做好了下面重点是编译设备树插件并把设备树插件添加到系统。
实验准备
在板卡上的部分GPIO 可能会被系统占用在使用前请根据需要修改/boot/uEnv.txt 文件可注释掉某些设备树插件的加载重启系统释放相应的GPIO 引脚。
如本节实验中可能在鲁班猫系统中默认使能了LED 的设备功能用在了LED 子系统。引脚被占用后设备树可能无法再加载或驱动中无法再申请对应的资源。
方法参考如下 取消LED 设备树插件以释放系统对应LED 资源操作如下 并按上述步骤操作。
如出现Permission denied 或类似字样请注意用户权限大部分操作硬件外设的功能几乎都需要root 用户权限简单的解决方案是在执行语句前加入sudo 或以root 用户运行程序。
通过内核工具编译设备树插件
设备树插件与设备树一样都是使用DTC 工具编译只不过设备树编译为.dtb。而设备树插件需要编译为.dtbo。我们可以使用DTC 编译命令编译生成.dtbo但是这样比较繁琐、容易出错。
我们可以修改内核目录/arch/arm/boot/dts/overlays 下的Makefile 文件添加我们编辑好的设备树插件。并把设备树插件文件放在和Makefile 文件同级目录下。以进行设备树插件的编译。 在内核的根目录下执行如下命令即可
make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- stm32mp157_ebf_defconfigmake ARCHarm -j4 CROSS_COMPILEarm-linux-gnueabihf- dtbs生成的.dtbo 位于内核根目录下的“/arch/arm/boot/dts/overlays”目录下。 本章的RGB 设备树插件为“stm-fire-rgb-led-overlay.dts”编译之后就会在/arch/arm/boot/dts/overlays目录下生成同名的stm-fire-rgb-led.dtbo 文件。得到.dtbo 后下一步就是将其加载到系统中。
实验效果
上一小节我们编译生成了.dtbo。.dtbo 可以被动态的加载到系统这一小节介绍将设备树插件加入系统的方法。
uboot 加载(适用野火linux 开发板)
linux 内核从4.4 开始支持设备号树插件支持并不代表默认开启。所以我们使用之前要配置内核开启这个功能。如果使用的是我们提供的debian 镜像无论哪个版本都是开启过了无需再配置内核并重新编译。假设使用的是debian 镜像下面介绍具体的加载步骤。
首先我们把编译好的设备树插件文件上传到我们开发板中。
我们可以使用uboot 加载编写好的设备树插件只需完成简单的两个步骤
将需要加载的.dtbo 文件放入“/usr/lib/linux-image-4.19.94-stm-r1/overlays/”目录下。 将设备树插件写入位于“/boot”目录下的uEnv.txt 文件文件系统启动过程中会自动从uEnv.txt 读取要加载的设备树插件。
# 使用nano 编辑器编辑
nano /boot/uEnv.txt
# 在文件中添加一行
dtoverlay/usr/lib/linux-image-4.19.94-stm-r1/overlays/stm-fire-rgb-led.dtbo添加好后我们重启开发板并输入对应的命令可以查看设备树插件是否加载成功
ls /sys/firmware/devicetree/base/
# 或者
ls /proc/device-tree看到这些文件证明已经加载成功了。 删除设备树”插件”时我们只需将对用的插件在“/boot”目录下的uEnv.txt 文件中添加# 号注释即可。
从上图可以看出在uEnv.txt 文件夹下有很多被屏蔽的设备树插件这些设备树插件是烧写系统时自带的插件为避免它们干扰我们的实验这里把它们全部屏蔽掉。如果要将RGB 的设备树插件写入uEnv.txt 也很简单参照着写即可。书写格式为“dtoverlay 设备树插件路径”。修改完成后保存、退出。执行reboot 命令重启系统。正常情况下我们可以在“/proc/device-tree”找与插入的设备节点同名的文件夹。
加载RGB 灯驱动
驱动程序和应用程序的使用方法与上一章完全相同可直接使用上一章的驱动和测试应用程序完成实验实验现象完全相同。 参考资料嵌入式Linux 驱动开发实战指南-基于STM32MP1 系列