1. LED模块
点亮一个 LED 灯
本节介绍如何使用命令行或 C 程序来控制 LED 灯点亮或熄灭。开发板上的可控 LED 灯
通常都是一端接高电平或 GND,另一端接 GPIO。通过操作 GPIO 来控制其点亮和熄灭。
两个 LED 是由发光二极管组成,一端接高电平,另一端若接入高电平,
则二极管不导通, LED 不会发光。另一端若接入低电平,则二极管导通, LED 发光。高低
电平一般由 GPIO 输出。
1.1 LED 的操作接口
LED 操作接口位于/sys/class/leds 目录下。此目录下包含了关于 LED 操作的目录,如下所示:
root@EasyARM-iMX283 /# ls /sys/class/leds/
beep led-err led-run
其中 led-err 目录是 ERR LED 的操作接口, led-run 目录是 RUN LED 的操作接口。以
RUN LED 为例,进入 led-run 目录,该目录的内容为:
root@EasyARM-iMX283 /sys/class/leds# ls
beep led-err led-run
root@EasyARM-iMX283 /sys/class/leds# ls led-run/
brightness max_brightness subsystem uevent
device power trigger
各个文件作用介绍如表 1.1所示。
表 1.1 LED 属性文件用途
文件名 作用
---------------------------------
brightness 用于控制 LED 亮灭(需要将 LED 灯设置为用户控制)
subsystem 符号链接,指向父目录。
trigger
写入“ none”可以将 LED 设置为用户控制
写入“ heartbeat”可以将 LED 设置为心跳灯
写入“ mmc0”可以将 LED 设置为 TF 卡检测指示灯
写入“ nand-disk”可以将 LED 设置为 NAND Flash 读写指示灯
power 设备供电方面的相关信息
1.2 LED 控制
以 led_run 灯为例,点亮命令如下:
# echo none > /sys/class/leds/led-run/trigger #将 LED RUN 设置为用户控制
# echo 1 > /sys/class/leds/led-run/brightness #控制 LED 点亮
# echo 0 > /sys/class/leds/led-run/brightness #控制 LED 熄灭
1.3 在 C 程序中操作 LED
C 程序中操作 LED,首先需要设置 trigger 属性。如下代码片段,将 LED 灯设置为用户控制方式:
#define TRIGGER_NONE "none"
int fd = open(path, O_RDWR); //path 为 trigger 路径
...
ret = write(fd, TRIGGER_NONE, strlen(TRIGGER_NONE));
...
然后操作 brightness 属性, 设置 LED 点亮或熄灭:
char data[2];
int fd;
...
fd = open(path, O_WRONLY); //path 为 brightness 路径
data[0] = '0';
ret = write(fd, data, 1); //熄灭 LED
下面给出的程序清单 1.1,首先设置 LED trigger 属性为“ none”,然后设置 brightness
属交替为 0 和 1。实现了 LED 每隔 1s 点亮一次。
-
#include <stdio.h>
-
#include <sys/types.h>
-
#include <sys/stat.h>
-
#include <fcntl.h>
-
#include <string.h>
-
-
#define TRIGGER "trigger"
-
#define LED_PATH "/sys/class/leds/"
-
#define LED_STATUS "brightness"
-
#define TRIGGER_NONE "none"
-
-
int main(int argc,char **argv)
-
{
-
char path[20],data[2];
-
int fd, ret, flag;
-
if(argv[1] == NULL) {
-
printf("usage : ./led led-run"); // 注意:这里应该是 led-run ,而不是 led_run
-
return 0;
-
}
-
strcpy(path, LED_PATH);
-
strcat(path, argv[1]); // 追加路径"/sys/class/leds/argv[1]" = /sys/class/leds/led_run
-
strcat(path, "/" TRIGGER); // 追加路径 /sys/class/leds/led_run/trigger
-
fd = open(path, O_RDWR);
-
if(fd < 0) {
-
perror("open");
-
return -1;
-
}
-
// 1. 设置LED_RUN为用户控制
-
ret = write(fd, TRIGGER_NONE, strlen(TRIGGER_NONE));
-
if(ret < 0) {
-
perror("write");
-
return -1;
-
}
-
close(fd);
-
-
// 2. 设置brightness
-
strcpy(path, LED_PATH);
-
strcat(path, argv[1]);
-
strcat(path, "/" LED_STATUS);
-
fd = open(path, O_WRONLY);
-
if(fd < 0) {
-
perror("open");
-
return -1;
-
}
-
-
for(;;)
-
{
-
// 每一秒亮灭一次
-
data[0] = flag ? '0': '1';
-
ret = write(fd, data, 1);
-
if(ret < 0) {
-
perror("write");
-
return -1;
-
}
-
flag = !flag;
-
sleep(1);
-
}
-
return 0;
-
}
阅读(1359) | 评论(0) | 转发(0) |