led子系统分析:源码核心层3. kernel-3.18\drivers\leds\led-triggers.c

该博客详细分析了Linux内核3.18版本中`leds`子系统的`led-triggers.c`文件,主要涉及LED触发器的相关接口和实现。包括注册、注销LED触发器的函数,以及控制LED亮灭、闪烁的函数。博客还解释了如何通过触发器设置和更改LED状态,并展示了如何处理LED触发器链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
	led-triggers.c 分析:

	1. 导出13个接口:

	led_trigger_register()			// 用于注册一个trigger
	led_trigger_unregister()		// 用于注销一个trigger

	led_trigger_register_simple()	// 用于注册一个trigger
	led_trigger_unregister_simple()	// 用于注销一个trigger

	led_trigger_blink() 			// 触发闪烁、闪烁的时间 - 调用led-core.c中的led_blink_set()
	led_trigger_event()				// 触发亮灭 			- 调用led-core.c中led_set_brightness()		

	led_trigger_store()
	led_trigger_show()
	
	led_trigger_set()
	led_trigger_remove()
	led_trigger_set_default()
	led_trigger_rename_static()

	led_trigger_register()
	led_trigger_unregister()
	
	led_trigger_blink_oneshot()		// 闪烁一次

*/


#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/device.h>
#include <linux/timer.h>
#include <linux/rwsem.h>
#include <linux/leds.h>
#include <linux/slab.h>
#include "leds.h"

/*
 * Nests outside led_cdev->trigger_lock
 */
static DECLARE_RWSEM(triggers_list_lock);
static LIST_HEAD(trigger_list);

 /* Used by LED Class */

ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
{
	struct led_classdev *led_cdev = dev_get_drvdata(dev);
	char trigger_name[TRIG_NAME_MAX];
	struct led_trigger *trig;
	size_t len;

	trigger_name[sizeof(trigger_name) - 1] = '\0';
	strncpy(trigger_name, buf, sizeof(trigger_name) - 1);
	len = strlen(trigger_name);

	if (len && trigger_name[len - 1] == '\n')
		trigger_name[len - 1] = '\0';

	if (!strcmp(trigger_name, "none")) {
		led_trigger_remove(led_cdev);
		return count;
	}

	down_read(&triggers_list_lock);
	list_for_each_entry(trig, &trigger_list, next_trig) {
		if (!strcmp(trigger_name, trig->name)) {
			down_write(&led_cdev->trigger_lock);
			led_trigger_set(led_cdev, trig);
			up_write(&led_cdev->trigger_lock);

			up_read(&triggers_list_lock);
			return count;
		}
	}
	up_read(&triggers_list_lock);

	return -EINVAL;
}
EXPORT_SYMBOL_GPL(led_trigger_store);

ssize_t led_trigger_show(struct device *dev, struct device_attribute *attr,
		char *buf)
{
	struct led_classdev *led_cdev = dev_get_drvdata(dev);
	struct led_trigger *trig;
	int l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值