Android 背光驱动


Android里,自带的背光亮度调节,会调用哪个接口?

会调用

/sys/class/leds/lcd-backlight/brightness

而这个brightness节点,是如何声明的呢

请看LED驱动里的这么一句

static DEVICE_ATTR(brightness, /*NAME*/

0644, /*权限*/

led_brightness_show, /*Read Point*/

led_brightness_store); /*Write Point*/

这就是声明brightness的。

这里调用了led_brightness_store做为写背光函数,也就是调节时用到,它最终会调用到显示驱动里的PWM操作函数,实现背光调节。

分析:

在LED驱动中,led_classdev_register ()函数,调用device_create()创建了操作结构体空间leds_class,

led_cdev->dev = device_create(leds_class, parent, 0, led_cdev,"%s", led_cdev->name);

关键是填充led_cdev结构体。

在led_brightness_store函数里,调用led_set_brightness设置背光亮度,最终是调用了

led_cdev->brightness_set(led_cdev, value);实现操作,这个操作,会调用哪里的函数呢?它是显示驱动里的brightness_set()函数。

请注意看,在显示驱动里(S3cfb_lte480wv.c),有这么一段代码,

static struct led_classdev smdk_backlight_led = {

.name = "lcd-backlight",

.brightness = SMDK_DEFAULT_BACKLIGHT_BRIGHTNESS,

.brightness_set = smdk_brightness_set,

};

把brightness_set指向了smdk_brightness_set()函数。这就有戏看了,终于找到真正操作函数了。

当然,LED驱动是如何与显示驱动关联起来的,这一套机制,得看一下

static int smdk_bl_probe(struct platform_device *pdev)

{

led_classdev_register(&pdev->dev, &smdk_backlight_led);

return 0;

}

原来使用了led_classdev_register(),它是由LEDS驱动提供的函数,

#include 传过来的。

这就把smdk_backlight_led 结构体指针传给了LEDS驱动,里面就有smdk_brightness_set函数的指针,所以,LEDS里的led_cdev->brightness_set能调用到这边来,呵呵。原来是这样。

注册背光的控制节点

/sys/class/leds/lcd-backlight/brightness

是在这个函数 platform_driver_register() à

smdk_bl_probe() à led_classdev_register(&pdev->dev, &smdk_backlight_led);

在smdk_backlight_led结构体里,设置了节点名称lcd-backlight和控制接口等。

而led_classdev_register()是led-class里的函数。最终调用了device_createp 这样的函数实现创建节点。

相关内容