目录
LED文件
在/sys/class/leds目录下存放了所有的LED类设备。
sys-led对应板子上的DS0,user-led对应板子上的DS1。
brightness:是亮度的意思,该属性文件可读可写;这个属性文件是用于设置LED的亮度等级或者获取当前LED的亮度等级,譬如brightness等于0表示LED灭,brightness为正整数表示LED亮,其值越大、LED越亮;对于PWM控制的LED来说,这通常是适用的,因为它存在亮度等级的问题,不同的亮度等级对应不同的占空比,自然LED的亮度也是不同的。
max_brightness:该属性文件只能被读取,不能写,用于获取LED设备的最大亮度等级。
trigger:触发模式,该属性文件可读可写,读表示获取LED当前的触发模式,写表示设置LED的触发模式。不同的触发模式其触发条件不同,LED设备会根据不同的触发条件自动控制其亮、灭状态,通过cat命令查看该属性文件,可获取LED支持的所有触发模式以及LED当前被设置的触发模式。
常用的触发模式:
none | 无触发。 |
---|---|
mmc0 | 当对mmc0设备发起读写操作的时候LED会闪烁。 |
timer | LED会有规律的一亮一灭,被定时器控制住。 |
heartbeat | 心跳呼吸模式,LED模仿人的心跳呼吸那样亮灭变化。 |
指令操作LED
将LED触发模式设置为timer。
echo timer > trigger
将LED触发模式设置为none。
echo none > trigger
点亮LED。
echo 1 > brightness
熄灭LED。
echo 0 > brightness
程序操作LED
程序说明
./可执行文件名 参数1 参数2
参数1:LED的选择。
SysLED:DS0LED。
UserLED:DS1LED。
参数2:LED的亮灭。
liang:LED亮。
mie:LED灭。
./可执行文件名 参数1 --ChuFaMoShi 参数2
参数1:LED的选择。
SysLED:DS0LED。
UserLED:DS1LED。
--ChuFaMoShi:触发模式。
参数2:常用的触发模式。
程序代码
1_LED.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define USER_LED_TRIGGER "/sys/class/leds/user-led/trigger"
#define USER_LED_BRIGHTNESS "/sys/class/leds/user-led/brightness"
#define SYS_LED_TRIGGER "/sys/class/leds/sys-led/trigger"
#define SYS_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 UserLED_fd1, UserLED_fd2, SysLED_fd1, SysLED_fd2;
/* 校验传参 */
if (2 > argc)
{
USAGE();
exit(-1);
}
/* 打开文件 */
UserLED_fd1 = open(USER_LED_TRIGGER, O_RDWR);
if (0 > UserLED_fd1)
{
perror("open error");
exit(-1);
}
UserLED_fd2 = open(USER_LED_BRIGHTNESS, O_RDWR);
if (0 > UserLED_fd2)
{
perror("open error");
exit(-1);
}
SysLED_fd1 = open(SYS_LED_TRIGGER, O_RDWR);
if (0 > SysLED_fd1)
{
perror("open error");
exit(-1);
}
SysLED_fd2 = open(SYS_LED_BRIGHTNESS, O_RDWR);
if (0 > SysLED_fd2)
{
perror("open error");
exit(-1);
}
/* 根据传参控制 LED */
if (!strcmp(argv[1], "SysLED"))
{
if (!strcmp(argv[2], "liang"))
{
write(SysLED_fd1, "none", 4); //先将触发模式设置为 none
write(SysLED_fd2, "1", 1); //点亮 LED
}
else if (!strcmp(argv[2], "mie"))
{
write(SysLED_fd1, "none", 4); //先将触发模式设置为 none
write(SysLED_fd2, "0", 1); //熄灭 LED
}
else if (!strcmp(argv[2], "--ChuFaMoShi"))
{
if (argc != 4)
{
USAGE();
exit(-1);
}
if(write(SysLED_fd1, argv[3], strlen(argv[3]))<0){
perror("xie error");
exit(-1);
}
}
else
{
USAGE();
}
}
else if(!strcmp(argv[1], "UserLED")){
if (!strcmp(argv[2], "liang"))
{
write(UserLED_fd1, "none", 4); //先将触发模式设置为 none
write(UserLED_fd2, "1", 1); //点亮 LED
}
else if (!strcmp(argv[2], "mie"))
{
write(UserLED_fd1, "none", 4); //先将触发模式设置为 none
write(UserLED_fd2, "0", 1); //熄灭 LED
}
else if (!strcmp(argv[2], "--ChuFaMoShi"))
{
if (argc != 4)
{
USAGE();
exit(-1);
}
if (write(UserLED_fd1, argv[3], strlen(argv[3])) < 0)
{
perror("xie error");
exit(-1);
}
}
else
{
USAGE();
}
}
else{
USAGE();
}
return 0;
}
启动交叉编译工具
source /opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
编译
${CC} -o 1_LED 1_LED.c
拷贝到开发板
scp 1_LED root@10.3.22.219:/home/root/Linux_C_YingYong_BianCheng/JiaoCheng/1_LED/
测试
点亮DS0。
./1_LED SysLED liang
熄灭DS1。
./1_LED UserLED mie
将DS0触发模式设置为heartbeat。
./1_LED SysLED --ChuFaMoShi heartbeat