一、前言
用于非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
版权声明:本文为musicalspace原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。