Linux GPIO-LED 实现自定义LED闪烁

一、前言

用于非PMIC的LED,Linux内部有对应的库可以直接调用。

二、CONFIG文件

CONFIG_LEDS_TRIGGER_TIMER=y 
CONFIG_LEDS_GPIO=y

使能内核的LED GPIO模块

三、DTS描述

添加GPIO-LED的具体描述

gpio-leds { 
    compatible = "gpio-leds"; 
    status = "okay"; 
    led-blink { 
        gpios = <&tlmm 76 0x00>; 
        label = "led-blink";//创建子节点 
        linux,default-trigger = "none";//没有默认的触发源,也可以写为timer 
        retain-state-suspended; //休眠保持运行
    }; 
};

四、权限添加

GPIO-LED中亮灭时间的节点默认为644,因此需要补充加上读写权限

//drivers/leds/trigger/ledtrig-timer.c
static DEVICE_ATTR(delay_on, 0666, led_delay_on_show, led_delay_on_store); 
static DEVICE_ATTR(delay_off, 0666, led_delay_off_show, led_delay_off_store);

但是直接这样修改,会发现内核编译会报错误,这是因为修改/sys文件系统下的文件权限,会受到VERIFY_OCTAL_PERMISSIONS的权限检查。详细内容查看include/linux/kernel.h文件中的定义

//include/linux/kernel.h
#define VERIFY_OCTAL_PERMISSIONS(perms) 	\ 
(BUILD_BUG_ON_ZERO((perms) < 0) + 		\ 
BUILD_BUG_ON_ZERO((perms) > 0777) + 	\ 
/* USER_READABLE >= GROUP_READABLE >= OTHER_READABLE */ \ 
BUILD_BUG_ON_ZERO((((perms) >> 6) & 4) < (((perms) >> 3) & 4)) + \ BUILD_BUG_ON_ZERO((((perms) >> 3) & 4) < ((perms) & 4)) + \ 
/* USER_WRITABLE >= GROUP_WRITABLE */ \ 
BUILD_BUG_ON_ZERO((((perms) >> 6) & 2) < (((perms) >> 3) & 2)) + \ 
/* OTHER_WRITABLE? Generally considered a bad idea. */ \ 
BUILD_BUG_ON_ZERO((perms) & 2) + \ 
(perms))

这里从注释上也看的比较清晰权限的要求: 
1.User perms >= group perms >= other perms 

即所有者权限>=组用户权限>=其他人权限 
也就是说 类似0466的这种权限是不允许的 
2. Other writable? Generally considered a bad idea.

不允许其他用户写的权限

BUILD_BUG_ON_ZERO(e) 表示的就是若表达式e结果为0,则编译通过,该宏的值也为0;若表达式e的结果不为0,则编译不通过。

因此只需要将最后一个检查:其他用户可写,这一项删除即可

BUILD_BUG_ON_ZERO((perms) & 2) +	 /

 

五、测试功能

//10Hz 闪烁
echo timer > /sys/class/leds/led-blink/trigger 
echo 50> /sys/class/leds/led-blink/delay_on 
echo 50> /sys/class/leds/led-blink/delay_off

 

你可能感兴趣的:(Android,Kernel)