原文:http://blog.chinaunix.net/uid-22072065-id-5759929.html
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;
- }