初学MP157,采用的是正点的一款MP157开发板。
基于网络各方资料,ai帮助总结,自我实践写出
1、Linux LED触发器操作
Linux内核提供了一种通过文件系统接口控制LED灯行为的机制,通常通过 /sys/class/leds
路径访问。利用触发器(Trigger)系统,可以根据不同条件自动或手动控制LED的状态。
2、Linux LED触发器操作方式
Linux内核提供了一种通过文件系统接口控制LED灯行为的机制,通过 /sys/class/leds
路径访问。这套机制利用触发器(Trigger)系统,可以根据不同条件自动或手动控制LED的状态。
(1)查询LED触发器选项
1)查看当前可用的触发器
使用下面的命令可以查看某个LED设备支持的触发器:
bash
cat /sys/class/leds/<led-name>/trigger
其中 <led-name>
具体的LED名称,这里是sys-led
。
输出示例:
bash
[none] heartbeat timer default-on mmc0 cpu0
方括号 []
表示当前激活的触发器。
比如之前设置的LED心跳模式,heartbeat就会有[ ]
2)这块板子的选项分别的代表
使用cat命令可以看到有许多的选项,那又具体代表什么意思?
bash
root@ATK-MP157:~# cat /sys/class/leds/sys-led/trigger
none rfkill-any rfkill-none kbd-scrolllock
kbd-numlock kbd-capslock kbd-kanalock
kbd-shiftlock kbd-altgrlock kbd-ctrllock
kbd-altlock kbd-shiftllock kbd-shiftrlock
kbd-ctrlllock kbd-ctrlrlock timer
oneshot [heartbeat] backlight gpio
cpu cpu0 cpu1 default-on transient
flash torch mmc0 mmc1 mmc2 rfkill0
root@ATK-MP157:~# ^C
**none:**LED不与任何事件进行关联,通常的情况下,LED是关闭的。
rfkill-any / rfkill-none / rfkill0: 与无线电设备(如WI-FI、蓝牙)的rfkill子系统相关联,指示某种rfkill状态。rfkill-any表示rfkill事件,rfkill-none代表没有rfkill事件。这里还不清楚,待会后面放一段关于它的介绍。
**kbd-scrolllock / kbd-numlock / kbd-capslock / kbd-kanalock / kbd-shiftlock / kbd-altgrlock / kbd-ctrllock / kbd-altlock / kbd-shiftllock / kbd-shiftrlock / kbd-ctrlllock / kbd-ctrlrlock:**与键盘灯同步,指示相应的键盘锁定键状态(如Scroll Lock、Num Lock、Caps Lock等)。
**timer:**LED在用户定义的时间间隔内闪烁
**oneshot:**单次亮或灭操作,用做短暂的状态显示
**heartbeat:**LED以心跳模式闪烁,用于系统健康显示(快慢不同节奏的闪烁)
**backlight/gpio:**与背光信号或用做通用输入输出(GPIO)事件关联,通常用于显示设备的背光控制或简单的LED信号指示。
**cpu/cpu0/cpu1:**与CPU活动信号有关。cpu0和cpu1表示多核CPU中的具体核心活动状态。
**default-on:**LED保持常亮状态
**transient/flash/torch:**不同的闪烁或持续亮模式,torch常用于模拟手电筒功能。
**mmc0/mmc1/mmc2:**与存储设备的活动关联(比如MMC/SD卡),表示数据传输状态。
(2)设置LED触发器
1、更改LED触发器:
使用 echo
命令来修改触发器。例如,要将LED设置为心跳模式:
bash
echo heartbeat > /sys/class/leds/<led-name>/trigger
替换 <led-name>
为实际的LED设备名称。
常用触发器说明:
-
none
: LED关闭,通常为默认状态。 -
heartbeat
: LED按心跳模式闪烁。 -
timer
: 可以设置定时闪烁。 -
default-on
: LED保持常亮状态。 -
cpu
: 根据CPU活动状态闪烁。 -
mmc0/mmc1
: 随着MMC/SD卡活动闪烁。
可能的权限问题(板子默认是管理员权限)
- 操作LED设备需要有足够的权限。确保使用root用户或通过
sudo
执行相应命令:
bash
sudo echo heartbeat > /sys/class/leds/<led-name>/trigger
注意事项
- 输入的触发器名称必须在可用选项列表中,否则将显示错误。
- 一些系统需要加载特定模块才能使用某些触发器。
- 某些硬件平台可能不支持所有列出的触发器选项。
(3)触发器基础操作
下面是快速入门里面的相关代码
bash
cat /sys/class/leds/sys-led/trigger //查看LED0的当前触发方式及支持的触发方式
echo none>/sys/class/leds/sys-led/trigger //改变LED0的触发模式
echo 1>/sys/class/leds/sys-led/brightness //点亮LED0
echo 0 > /sys/class/leds/sys-led/brightness //熄灭 LED0
echo none > /sys/class/leds/user-led/trigger //改变 LED1 的触发模式
echo 1 > /sys/class/leds/user-led/brightness //点亮 LED1
echo 0 > /sys/class/leds/user-led/brightness //熄灭 LED1
echo 1 > /sys/class/leds/beep/brightness //打开蜂鸣器
echo 0 > /sys/class/leds/beep/brightness //关闭蜂鸣器
echo heartbeat > /sys/class/leds/beep/trigger //改变蜂鸣器的触发模式,设置为心跳方式
echo none > /sys/class/leds/beep/trigger //改变蜂鸣器的触发模式,设置为 none 方式
echo 0 > /sys/class/leds/beep/brightness //关闭蜂鸣器
3、思考
(2)什么是fkill
rfkill是Linux内核提供的一个框架,用于控制无线通信硬件(如 WiFi、蓝牙、NFC 等)的开关和状态。rfkill就是RF(射频) 设备的开关,有类似一键关闭所有射频外设的功能。
rfkill的出现方便管理各种RF芯片的开关, 目前已经很多厂商的设备使用的是rfkill的驱动来管理一些无线设备的电源了,都是和RF相关的芯片,比如WiFi,蓝牙, NFC, FM,,GPS等等。
rfkill子系统有"hard"和"soft" blocked的概念,blocked的意思就是发射器关闭;
- soft blocked ::表示软件层面对无线设备进行的阻止(比如说,通过运行rfkill激活命令)。在这种情况下,无线电器的硬件电源依旧是打开的,只是被软件控制给关掉了;
- hard blocked:表示硬件层面对无线设备进行的阻止,通常是由于硬件按键或者物理开关进行的关闭。在这种情况下,即使在操作系统层面执行启动命令,也无法使无线电器工作;
区别在于软/硬件控制的不同。soft blocked是软件层面的禁用,硬件还是打开的,可以通过命令解除禁用;而hard blocked是硬件层面的禁用,无论从软件还是命令层面都无法解除。
当无线设备处于hard blocked状态时,意味着无法通过软件命令或驱动程序打开该设备;相反,必须在硬件层面解除阻塞才能使设备重新工作。这通常需要找到控制设备硬件的开关或
按键,并在上面进行操作。
从这段描述可以看出,rfkill应该是一种控制外部射频设备的一个开关,具体的有时间再研究
(2)内核源码的思考
在快速入门手册里面有一段描述
1)什么是设备树
设备树(Device Tree)是一种描述硬件信息的数据结构,主要用于嵌入式系统和Linux内核中,以抽象化地定义硬件设备的配置和特征,而无需对设备进行驱动程序代码修改。这样,内核就可以在启动时配置系统,以便与硬件交互。
以下是对设备树的更详细解释:
设备树的作用
1.硬件描述:
设备树提供了一种标准化的方式来描述系统中的所有硬件资源,包括CPU、内存、外围设备、总线和接口等。
2.平台独立性:
设备树使得相同的内核二进制文件可以在不同硬件配置的系统上使用,只需在设备树中指定相应的硬件配置。
3.减少代码耦合:
通过设备树,将硬件特定的信息从驱动程序中抽离出来,使驱动程序开发和硬件配置分离,方便更新和维护。
设备树的基本构成
1.设备树源文件(DTS):
DTS文件是设备树的源代码文件,使用人可读的文本格式定义硬件结构和属性。
2.设备树编译器(DTC):
将设备树源文件(DTS)编译成设备树二进制(DTB)格式。DTB是二进制格式的设备树,供内核在启动时读取。
3.设备树片段/overlay:
。用于在运行时动态修改或扩展设备树的部分配置,适合一些可插拔设备或需要灵活动态配置的系统。
设备树的常见应用
嵌入式Linux系统:
设备树广泛用于ARM架构的嵌入式Linux系统中,适配各种硬件平台。
支持新硬件:
通过修改设备树,而不是修改内核代码,来支持新添加的硬件设备。
简化内核配置:
让一个通用内核支持多种不同配置的嵌入式系统,减少了编译和维护不同版本内核的复杂性。
2)LED设备树的分析
下面是LED和蜂鸣器的设备树内核源码
ai解释:
结构概述1.1
1、leds节点:
描述了一个LED控制器的定义,使用GPIO来驱动多个LED。
2. compatible = "gpio-leds";:
这个属性表示leds 节点与通用的GPIO LED 驱动兼容。Linux内核将使用 gpio-leds驱动程序处理这个设备。
子节点
每个子节点定义一个LED或蜂鸣器,配置其标签、GPIO连接和默认行为。
led1
.label = "sys-led";:
为LED命名为"sys-led",用于标识该LED的用途。
gpios = <&gpioi 0 GPIO_ACTIVE_LOW>;:
指定与该LED相关联的GPIO引脚。这里使用的是gpioi控制器的第0号引脚, GPIO_ACTIVE_LOW 意味着该引脚在低电平时点亮LED。
linux,default-trigger = "heartbeat";:
设置LED的默认触发器为"heartbeat",这意味着LED将以类似心跳的模式闪烁,通常用于指示系统的工作状态。
default-state = "on";:
指定LED上电后的默认状态为"on",即默认情况下LED是亮的。
status="okay";:
指明当前节点的状态为启用(有效)。
led2
label ="user-led";:
为LED命名为"user-led",通常用于用户自定义操作和状态指示。
gpios = <&gpiof 3 GPIO_ACTIVE_LOW>;:
使用gpiof 控制器的第3号引脚,以低电平激活LED。
linux,default-trigger = "none";:
默认为无触发器,这意味着它不随任何系统事件自动改变状态。
default-state = "on";:
上电后的默认状态为亮。
status = "okay"; :
节点状态为启用。
beep
label = "beep";:
此节点描述了一个通过GPIO控制的蜂鸣器,命名为"beep"。
gpios = <&gpioc 7 GPIO_ACTIVE_LOW>;:
使用gpioc 控制器的第7号引脚,并通过低电平来激活蜂鸣器。
default-state = "off";:
上电后的默认状态为关闭(不响)。
总结该设备树片段定义了两个LED和一个蜂鸣器设备的硬件配置,包括它们的GPIO连接,默认状态以及在Linux系统中的默认行为和触发器类型。这允许操作系统在启动时根据这些配置文件自动设置设备的行为。