1. 数据结构 led_classdev
struct led_classdev { const char *name; enum led_brightness brightness; enum led_brightness max_brightness; int flags; unsigned long work_flags; void (*brightness_set)(struct led_classdev *led_cdev, enum led_brightness brightness); int (*brightness_set_blocking)(struct led_classdev *led_cdev, enum led_brightness brightness); 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; struct list_head node; /* LED Device list */ const char *default_trigger; /* Trigger to use */ unsigned long blink_delay_on, blink_delay_off; struct timer_list blink_timer; int blink_brightness; int new_blink_brightness; void (*flash_resume)(struct led_classdev *led_cdev); struct work_struct set_brightness_work; int delayed_set_value; #ifdef CONFIG_LEDS_TRIGGERS /* Protects the trigger data below */ struct rw_semaphore trigger_lock; struct led_trigger *trigger; struct list_head trig_list; void *trigger_data; /* true if activated - deactivate routine uses it to do cleanup */ bool activated; #endif #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED int brightness_hw_changed; struct kernfs_node *brightness_hw_changed_kn; #endif /* Ensures consistent access to the LED Flash Class device */ struct mutex led_access; }; |
位置: include\linux\leds.h |
注意: 一个LED 对应一个led_classdev结构体,如果有多个LED,则要注册多个led_classdev
2. 结构体初始化
ldev->brightness_set = tm1929_led_ctrl; ldev->default_trigger = "none"; ldev->name = uled->name; |
说明:tm1929_led_ctrl是自己写的 |
3. 注册与反注册
led_classdev_register(parent, led_cdev) ;//parent是 struct device 类型的指针,需要调用反注册函数 |
void led_classdev_unregister(struct led_classdev *led_cdev);//反注册函数 |
devm_led_classdev_register(parent, led_cdev); //无需调用反注册函数,系统自动调用 |
说明 |
4. 应用层控制
echo "255">/sys/class/leds/led02/brightness |
说明: "255" 必须使用字符串格式,否则无法正确控制 led02 是注册时的名字 |