--作者: 賴玉平(peter lai)aulyp@163.com
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 這樣的函數實現建立節點。