【linux】led子系统
前言
- 接下来记录的是 led子系统
- 目前不涉及驱动源码
- 李柱明博客:https://www.cnblogs.com/lizhuming/
- 本文链接:https://www.cnblogs.com/lizhuming/p/13986601.html
linux子系统
- 在 Linux 系统中
- 绝大多数硬件设备都有非常成熟的驱动框架
- 驱动工程师使用这些框架添加与板子相关的硬件支持
- 建立硬件与Linux内核的联系
- 内核再通过统一文件系统接口呈现给用户
- 用户通过对应的设备文件控制硬件。
led子系统
- led子系统相关描述可在内核源码 Documentation/leds/leds-class.txt 了解。
- led子系统是一个简单的 linux子系统 ,在目录
/sys/class/leds
下展示该子系统设备。 -
/sys/class/leds下的目录 | 对应的LED灯设备 |
---|---|
input2::capslock | 键盘大写锁定指示灯 |
input2::numlock | 键盘数字键盘指示灯 |
input2::scrolllock | 键盘ScrollLock指示灯 |
-
一些属性值
- brightness
- brightness 的最大值在 max_brightness 文件中定义。
- brightness 的值在 brightness 文件中定义。
- 注意:大部分 led 不支持亮度调节。
- trigger.
- 常见的触发方式
- none:无触发方式
- disk-activity:硬盘活动
- nand-disknand:flash活动
- mtd:mtd设备活动
- timer:定时器
- heartbeat:系统心跳
- 查看触发方式
cat trigger
(x86平台)-
-
查看该文件的内容时,该文件会 列出它的所有可用触方式,而当前使用的触发方式会以“[]”符号括起。
-
- 修改触发方式
- 例子:
echo none > /sys/class/leds/ledA/trigger
- none:none触发方式
- ledA:ledA设备
- 修改后,便按新的触发方式触发
- 例子:
- 常见的触发方式
- brightness
-
设计哲学
- 简单哈哈
-
推荐命名格式
- "设备名字:颜色:功能"
-
API(后面分析驱动再介绍)
- led_set_brightness
- led_set_brightness_sync
- led_classdev_register
- led_classdev
led子系统实战-系统调用-ARM平台
-
先在终端运行
-
查询触发方式:
cat trigger
(注意图中 []) -
修改触发方式 (注意图中 [])
-
-
使用系统调用方式 APP
- main.c 文件
/** @file main.c
* @brief 简要说明
* @details 详细说明
* @author lzm
* @date 2020-11-10 17:01:15
* @version v1.0
* @copyright Copyright By lizhuming, All Rights Reserved
*
**********************************************************
* @LOG 修改日志:
**********************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
//ARM 开发板 LED 设备的路径
#define RLED_DEV_PATH "/sys/class/leds/red/brightness"
#define GLED_DEV_PATH "/sys/class/leds/green/brightness"
#define BLED_DEV_PATH "/sys/class/leds/blue/brightness"
int main(int argc, char *argv[])
{
int res = 0;
int r_fd;
int g_fd;
int b_fd;
printf("this is the led demo\n");
// 获取 LED 设备文件描述符
r_fd = open(RLED_DEV_PATH, O_WRONLY);
if(r_fd < 0){
printf("Fail to open %s device\n",RLED_DEV_PATH);
exit(1);
}
g_fd = open(GLED_DEV_PATH, O_WRONLY);
if(g_fd < 0){
printf("Fail to open %s device\n",GLED_DEV_PATH);
exit(1);
}
b_fd = open(BLED_DEV_PATH, O_WRONLY);
if(b_fd < 0){
printf("Fail to open %s device\n",BLED_DEV_PATH);
exit(1);
}
while(1){
write(r_fd, "255", 3);
sleep(2);
write(g_fd, "255", 3);
sleep(1);
write(r_fd, "0", 1);
sleep(2);
write(g_fd, "0", 1);
sleep(1);
write(b_fd, "255", 3);
sleep(1);
write(b_fd, "0", 1);
sleep(1);
}
}
分类:
Linux
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现