led-class.c (led 子系统框架的入口)
维护 LED 子系统的所有 LED 设备,为 LED 设备提供注册操作函数:
led_classdev_register()
devm_led_classdev_register()
注销操作函数:
led_classdev_unregister()
devm_led_classdev_unregister();
电源管理的休眠和恢复操作函数:
led_classdev_suspend()
led_classdev_resume();
用户态操作接口:brightness 、max_brightness
led-core.c
抽象出 LED 操作逻辑,封装成函数导出,供其它文件使用:
led_init_core(): 核心初始化;
led_blink_set(): 设置led闪烁时间:
led_blink_set_oneshot() : 闪烁一次
led_stop_software_blink() : led停止闪烁
led_set_brightness() : 设置led的亮度
led_update_brightness : 更新亮度
led_sysfs_disable : 用户态关闭
led_sysfs enable : 用户态打开
leds_list : leds链表;
leds_list_lock : leds链表锁
led-triggers.c
维护 LED 子系统的所有触发器,为触发器提供注册操作函数:
led_trigger_register()
devm_led_trigger_register()
led_trigger_register_simple()
注销操作函数:
led_trigger_unregister()
led_trigger_unregister_simple()
以及其它触发器相关的操作函数
ledtrig-timer.c、ledtrig-xxx.c
以 ledtrig-timer.c 为例
入口函数调用 led_trigger_register() 注册触发器,
注册时候传入 led_trigger 结构体,里面有 activate 和 deactivate 成员函数指针,
作用是生成 delay_on 、 delay_off 文件
同时还提供 delay_on 和 delay_off 的用户态操作接口
卸载时,使用 led_trigger_unregister() 注销触发器
leds-gpio.c、leds-xxx.c :
以 leds-gpio.c 为例
在通过设备树或者其它途径匹配到设备信息后,将调用 probe() 函数,
然后再根据设备信息设置 led_classdev,
最后调用 devm_led_classdev_register() 注册 LED 设备。
led_classdev 结构体代表 led 实例:
struct led_classdev {
const char *name;//名字
enum led_brightness brightness;//亮度
enum led_brightness max_brightness;//最大亮度
int flags;
/* Lower 16 bits reflect status */
#define LED_SUSPENDED (1 < < 0)
/* Upper 16 bits reflect control information */
#define LED_CORE_SUSPENDRESUME (1 < < 16)
#define LED_BLINK_ONESHOT (1 < < 17)
#define LED_BLINK_ONESHOT_STOP (1 < < 18)
#define LED_BLINK_INVERT (1 < < 19)
#define LED_SYSFS_DISABLE (1 < < 20)
#define SET_BRIGHTNESS_ASYNC (1 < < 21)
#define SET_BRIGHTNESS_SYNC (1 < < 22)
#define LED_DEV_CAP_FLASH (1 < < 23)
//设置亮度API
void (*brightness_set)(struct led_classdev *led_cdev,enum led_brightness brightness);
int (*brightness_set_sync)(struct led_classdev *led_cdev,enum led_brightness brightness);
//获取亮度API
enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
//闪烁时点亮和熄灭的时间设置
int (*blink_set)(struct led_classdev *led_cdev,unsigned long *delay_on,unsigned long *delay_off);
struct device *dev;
const struct attribute_group **groups;
//leds-list的node
struct list_head node;
//默认trigger的名字
const char *default_trigger;
//闪烁的开关时间
unsigned long blink_delay_on, blink_delay_off;
//闪烁的定时器链表
struct timer_list blink_timer;
//闪烁的亮度
int blink_brightness;
void (*flash_resume)(struct led_classdev *led_cdev);
struct work_struct set_brightness_work;
int delayed_set_value;
#ifdef CONFIG_LEDS_TRIGGERS
//trigger的锁
struct rw_semaphore trigger_lock;
//led的trigger
struct led_trigger *trigger;
//trigger的链表
struct list_head trig_list;
//trigger的数据
void *trigger_data;
bool activated;
#endif
struct mutex led_access;
};
led_trigger 结构:
struct led_trigger {
/* Trigger Properties */
const char *name;
void (*activate)(struct led_classdev *led_cdev);
void (*deactivate)(struct led_classdev *led_cdev);
/* LEDs under control by this trigger (for simple triggers) */
rwlock_t leddev_list_lock;
struct list_head led_cdevs;
/* Link to next registered trigger */
struct list_head next_trig;
};
trigger 是控制 LED 类设备的算法,这个算法决定着 LED 什么时候亮什么时候暗。
1、点亮 LED
echo 255 > /sys/class/leds/led1/brightness
cat /sys/class/leds/led1/brightness
cat /sys/class/leds/led1/max_brightness
2、闪烁
cat /sys/class/leds/led1/trigger
会看到 trigger_list
[none] mmc0 mmc1 mmc2 timer
其中的 timer 这个 trigger 是 ledtrig-timer.c 中模块初始化的时候注册进去的
echo timer > /sys/class/leds/led1/trigger
这一句会调用
led_trigger_store()- >
led_trigger_set()- >
trigger- >activate(led_cdev);
从而调用 ledtrig-timer.c 文件里 的timer_trig_activate(),
在 /sys/class/leds/led1/ 下创建 delay_on、delay_off 两个文件
echo 100 > /sys/class/leds/led1/delay_on
echo 200 > /sys/class/leds/led1/delay_off
这样会闪烁,亮 100ms 灭 200ms
3、关闭 LED
echo 0 > /sys/class/leds/led1/delay_on
或
echo 0 > /sys/class/leds/led1/brightness
全部0条评论
快来发表一下你的评论吧 !