目录
- 前言
- linux子系统
- led子系统
- led子系统实战-系统调用-ARM平台
前言
- 接下来记录的是 led子系统
- 目前不涉及驱动源码
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指示灯 |
-
一些属性值
brightnessbrightness 的最大值在 max_brightness 文件中定义。
- brightness 的值在 brightness 文件中定义。
- 注意:大部分 led 不支持亮度调节。
- 常见的触发方式none:无触发方式
cat trigger(x86平台)
查看该文件的内容时,该文件会 列出它的所有可用触方式,而当前使用的触发方式会以“[]”符号括起。
- 例子:
echo none > /sys/class/leds/ledA/triggernone:none触发方式
设计哲学
- 简单哈哈
推荐命名格式
- \”设备名字:颜色:功能\”
API(后面分析驱动再介绍)
- led_set_brightness
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\"#definad8e 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);}}