Welcome 微信登录

首页 / 操作系统 / Linux / 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 这样的函数实现创建节点。