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

本文详细分析了Linux内核3.18版本中`led-class.c`驱动的核心代码,包括`leds_init()`模块入口、设备类与设备属性创建、亮度控制以及触发器功能。通过`sysfs`接口,用户可以读写LED亮度,并通过不同触发器控制LED闪烁。此外,文章还介绍了系统休眠和唤醒时LED的管理操作。
摘要由CSDN通过智能技术生成
/*
	led-class.c分析:

	1.leds_init()						// 模块入口
		leds_class = class_create(THIS_MODULE, "leds");
		leds_class->pm = &leds_class_dev_pm_ops;
		leds_class->dev_groups = led_groups;
*/

/*
	SIMPLE_DEV_PM_OPS宏

	将led-class中的suspend中的指针,以及resume的指针初始化
	当系统休眠或唤醒的时候,遍历class,调用其中的pm的书suspend() 或resume()
		
	static SIMPLE_DEV_PM_OPS(leds_class_dev_pm_ops, led_suspend, led_resume);

	==>
	static const struct dev_pm_ops leds_class_dev_pm_ops = { 
		SET_SYSTEM_SLEEP_PM_OPS(led_suspend, led_resume) 
	}

	==>
	static const struct dev_pm_ops leds_class_dev_pm_ops = {
		.suspend = led_suspend,
		.resume = led_resume,
	}
*/

/*
	sysfs创建节点方法:

	共创建3个节点:brightness、max_brightness、trigger
	
static DEVICE_ATTR_RW(brightness);			// 可读可写
static DEVICE_ATTR_RO(max_brightness);		// 只读
static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store);	// 可读可写 - 控制led闪烁
*/

/*
应用层控制led的方法:
	读: cat /sys/class/leds/xxx/brightness
	写: echo 255 > /sys/class/leds/xxx/brightness

读 cat:
static ssize_t brightness_show(struct device *dev, struct device_attribute *attr, char *buf)
	|
	return sprintf(buf, "%u\n", led_cdev->brightness);

写 echo:
static ssize_t brightness_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
	|
	__led_set_brightness(led_cdev, state);
		|
		led_cdev->brightness_set(led_cdev, value);
			// g_leds_data[i]->cdev.brightness_set = mt65xx_led_set;		// 注册led的时候设定了函数指针	
			// led_classdev_register(&pdev->dev, &g_leds_data[i]->cdev);	// 注册一个led(如red)到一个全局leds_list链表中
		
		即mt65xx_led_set(led_cdev, value)
			|
			mt_mt65xx_led_set(led_cdev, level);
				|
				if (strcmp(led_data->cust.name, "lcd-backlight") != 0) {	// led走这里
					schedule_work(&led_data->work);
						|
						// INIT_WORK(&g_leds_data[i]->work, mt_mt65xx_led_work);// 初始化一个工作
						mt_mt65xx_led_work()
							|
							mt_mt65xx_led_set_cust(&led_data->cust, led_data->level);
								|
								switch (cust->mode) {
								case MT65XX_LED_MODE_PWM:				// 模式1
								case MT65XX_LED_MODE_GPIO:				// 模式2 - B
									return mt_brightness_set_gpio(cust->data, level);
											|
											nleds_get_gpio_pinctrl();	
											if (level == 0){
												if(data == 0)
												pinctrl_select_state(led_pinctrl, pinctrl_led0_low);
												else if(data == 1) 
												pinctrl_select_state(led_pinctrl, pinctrl_led1_low);
											}
											else {
												if(data == 0) 
												pinctrl_select_state(led_pinctrl, pinctrl_led0_high);
												else if(data == 1) 
												pinctrl_select_state(led_pinctrl, pinctrl_led1_high);
											}
								case MT65XX_LED_MODE_PMIC:				// 模式3 - RG 根据原理图可知:三色灯中的R、G、B分别接在ISINK0、ISINK1、GPIO63(AD27)上
									return mt_brightness_set_pmic(cust->data, level, bl_div_hal);
										   mt_brightness_set_pmic(enum mt65xx_led_pmic pmic_type, u32 level, u32 div)
											|
											if (pmic_type == MT65XX_LED_PMIC_NLE
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值