Linux下有通用的LED驱动,对于开发板上面的LED,采用的是单独的gpio进行控制,其对应的驱动为gpio-leds。此引脚已被gpio-leds驱动占用,对应用层提供专门的LED操作接口。
开发板上有两个LED,在这个位置
其中,GPIO3_A4对应的LED名为work,GPIO2_B2对应的LED名为work1
对应用层提供的节点存放在如下两个文件夹
/sys/class/leds/work
/sys/class/leds/work1
led的节点需要root权限才能操作,使用命令行或者C语言编译出来的程序操作led都需要root权限。如果是ssh或者使用LX终端的,先执行如下命令获取root权限。
sudo su
下面以操作GPIO3_A4对应的LED为例进行介绍。此LED位于下图红框所示位置
将led翻转条件设置为none,即只能设置为亮或者灭
echo none > /sys/class/leds/work/trigger
设置led为亮
echo 1 > /sys/class/leds/work/brightness
现象如下图
设置led为灭
echo 0 > /sys/class/leds/work/brightness
现象如下图
将led翻转条件设置为timer,此时内核线程会实现定时翻转,用户需设置亮和灭的时间
echo timer > /sys/class/leds/work/trigger
通过写入 delay_on 节点来配置亮的时间,单位为ms,通过写入 delay_off 节点来配置灭的时间,单位为ms。如设置led为亮1000ms后灭200ms循环
echo 1000 > /sys/class/leds/work/delay_on
echo 200 > /sys/class/leds/work/delay_off
通过连接 libperipheral_api.a 静态库,可以使用C语言调用以下接口来操作LED
/**
* @name: user_led_set_none_mode
* @description: 将LED设置为无触发模式,此种模式下通过调用 user_led_turn_on_off 来配置亮和灭
* @param led_name:LED的名称,如work work1
* @return 0 - 成功 小于0 - 失败
*/
int user_led_set_none_mode(char *led_name);
/**
* @name: user_led_turn_on_off
* @description: 配置LED为亮或者灭,只能在无触发模式下使用
* @param led_name:LED的名称,如work work1
* @param level:1 - 亮 0 -灭
* @return 0 - 成功 小于0 - 失败
*/
int user_led_turn_on_off(char *led_name, unsigned char level);
/**
* @name: user_led_set_timer_mode
* @description: 配置LED为定时器翻转模式
* @param led_name:LED的名称,如work work1
* @return 0 - 成功 小于0 - 失败
*/
int user_led_set_timer_mode(char *led_name);
/**
* @name: user_led_set_timer_on_off
* @description: LED为定时器翻转模式时设置亮和灭的时间
* @param led_name:LED的名称,如work work1
* @param on_time:亮的时间,单位ms
* @param on_time:灭的时间,单位ms
* @return 0 - 成功 小于0 - 失败
*/
int user_led_set_timer_on_off(char *led_name, int on_time, int off_time);
测试demo如下,以操作 work led为例
#include "peripheral_api.h"
void led_api_test(void)
{
int ret = 0;
ret = user_led_set_none_mode("work");
if (ret < 0) {
printf("user_led_set_none_mode fail \n");
return;
}
ret = user_led_turn_on_off("work",1);
if (ret < 0) {
printf("user_led_turn_on_off fail \n");
return;
}
sleep(1);
ret = user_led_turn_on_off("work",0);
if (ret < 0) {
printf("user_led_turn_on_off fail \n");
return;
}
sleep(1);
ret = user_led_turn_on_off("work",1);
if (ret < 0) {
printf("user_led_turn_on_off fail \n");
return;
}
ret = user_led_set_timer_mode("work");
if (ret < 0) {
printf("user_led_set_timer_mode fail \n");
return;
}
ret = user_led_set_timer_on_off("work", 1000, 200);
if (ret < 0) {
printf("user_led_set_timer_on_off fail \n");
return;
}
sleep(5);
ret = user_led_set_none_mode("work");
if (ret < 0) {
printf("user_led_set_none_mode fail \n");
return;
}
return;
}
int main()
{
led_api_test();
return 0;
}
运行此命令时也是需要root权限,运行之后结果如下