1.LED 硬件控制方式
对于 ALPHA/Mini I.MX6U
开发板出厂系统来说,此
LED
设备使用的是
Linux
内核标准
LED
驱动框架注册而成,在/dev
目录下并没有其对应的设备节点,其实现使用
sysfs
方式控制。
进入到/sys/class/leds 目录下,系统中的所有设备根据其功能分类组织到了/sys/class 目录下,所以/sys/class/leds 目录下便存放了所有的 LED 类设备。
进入到该目录下,brightness、max_brightness 以及 trigger 三个文件都是
LED 设备的属性文件:
echo timer > trigger //将 LED 触发模式设置为 timerecho none > trigger //将 LED 触发模式设置为 noneecho 1 > brightness //点亮 LED echo 0 > brightness// 熄灭 LED
除了使用 echo
或
cat
命令之后,同样我们编写应用程序,使用 write()
、
read()
函数对这些属性文件进行
I/O
操作以达到控制
LED
的效果。
Tips:命令 cat 读取以及 echo 写入到属性文件中的均是
字符串
,所以如果在应用程序中通过 write()向属性文件写入数据,同样也要是字符串形式;同理,使用 read()读取的数据也是字符串 ASCII 编码的。
2.编写
LED
应用程序
LED 应用程序:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define LED_TRIGGER "/sys/class/leds/sys-led/trigger"
#define LED_BRIGHTNESS "/sys/class/leds/sys-led/brightness"
#define USAGE() fprintf(stderr, "usage:\n" \
" %s <on|off>\n" \
" %s <trigger> <type>\n", argv[0], argv[0])
int main(int argc, char *argv[])
{
int fd1, fd2;
/* 校验传参 */
if (2 > argc) {
USAGE();
exit(-1);
}
/* 打开文件 */
fd1 = open(LED_TRIGGER, O_RDWR);
if (0 > fd1) {
perror("open error");
exit(-1);
}
fd2 = open(LED_BRIGHTNESS, O_RDWR);
if (0 > fd2) {
perror("open error");
exit(-1);
}
/* 根据传参控制 LED */
if (!strcmp(argv[1], "on")) {
write(fd1, "none", 4); //先将触发模式设置为 none
write(fd2, "1", 1); //点亮 LED
}
else if (!strcmp(argv[1], "off")) {
write(fd1, "none", 4); //先将触发模式设置为 none
write(fd2, "0", 1); //LED 灭
}
else if (!strcmp(argv[1], "trigger")) {
if (3 != argc) {
USAGE();
exit(-1);
}
if (0 > write(fd1, argv[2], strlen(argv[2])))
perror("write error");
}
else
USAGE();
exit(0);
}
3.运行测试
./testApp on # 点亮 LED
./testApp off # 熄灭 LED
./testApp trigger heartbeat # 将 LED 触发模式设置为 heartbeat