1. 程式人生 > >linux背光碟機動解析

linux背光碟機動解析

一、核心驅動相應的程式碼:kernel/drivers/video/backlight/backlight.c
1、驅動初始化基本流程及關鍵資訊
postcore_initcall(backlight_class_init);//初始化backlight類
module_exit(backlight_class_exit);
》》》》初始化
static int __init backlight_class_init(void)
{
backlight_class = class_create(THIS_MODULE, “backlight”);//建立backlight類
if (IS_ERR(backlight_class)) {
printk(KERN_WARNING “Unable to create backlight class; errno = %ld\n”,
PTR_ERR(backlight_class));
return PTR_ERR(backlight_class);
}
backlight_class->dev_attrs = bl_device_attributes;//backlight裝置屬性
backlight_class->suspend = backlight_suspend;
backlight_class->resume = backlight_resume;
return 0;
}
》》》》裝置屬性
static struct device_attribute bl_device_attributes[] = {
__ATTR(bl_power, 0644, backlight_show_power, backlight_store_power),
__ATTR(brightness, 0644, backlight_show_brightness,
backlight_store_brightness),
__ATTR(actual_brightness, 0444, backlight_show_actual_brightness,
NULL),
__ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL),
__ATTR(type, 0444, backlight_show_type, NULL),
__ATTR_NULL,
};
核心初始化時將在/sys/class/backlight/下建立bl_power、brightness、actual_brightness、max_brightness、type等屬性檔案。

命令列:echo 1 > /sys/class/backlight/bl_power //關閉背光
cat 時核心會呼叫xxx_show_xxx()函式,例如backlight_show_power()
echo 時核心會呼叫xxx_store_xxx()函式,例如backlight_store_power()
核心呼叫這些xxx_store_xxx()函式時都會呼叫backlight_update_status(bd);
》》》》
//這個函式在/kernel/include/linux/backlight.h
static inline void backlight_update_status(struct backlight_device *bd)
{
mutex_lock(&bd->update_lock);
if (bd->ops && bd->ops->update_status)
bd->ops->update_status(bd);
mutex_unlock(&bd->update_lock);
}
》》》》
static const struct backlight_ops act_pwm_bl_ops = {
.update_status = act_pwm_bl_update_status,//調節背光的函式
.get_brightness = act_pwm_bl_get_brightness,//獲取當前背光的函式
};

二、
在核心原始碼中,platform 裝置的初始化(註冊)用arch_initcall()呼叫,它的initcall 的level為3;
而驅動的註冊用module_init()呼叫,即device_initcall(),它的initcall 的level為6。
kernel 初始化時([email protected]/main.c),按照核心連結檔案中(arm系統:kernel/arch/arm/vmlinux.lds)的__init call_start段的序列依次執行,
這樣level小的初始化函式先於level大的初始化函式被呼叫。
所以platform裝置先被註冊,驅動載入時會呼叫驅動程式中的probe(),掃描系統中已註冊的裝置,找到匹配裝置後將驅動和裝置繫結。