/*
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
led子系统分析:源码核心层1. kernel-3.18\drivers\leds\led-class.c
最新推荐文章于 2023-01-13 18:08:10 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)