android自動調節背光

這項功能涉及兩個模塊,光傳感器和背光,光傳感器采集周圍環境的光感強度,上報給系統,系統通過PowerManagerService.java中設置背光值

 

1.powermanagerService 中實現自動調節背光

1.1 enableLightSensorLocked(Boolean enable){

         if(enable){

                   mSensorManager.registerListener(mLightListener,mLightSensor,xxx);

}

}

在handleLightSensorValue函數中進行處理。

1.2 mHandler.postDelayed(mAuoBrightnessTask,LIGHT_SENSOR_DELAY);

 

1.3調用 lightSensorChangedLocked(value,false);

1.4 調用

mScreenBrightnessAnimator.animateTo(lcdValue,value,SCREEN_BRIGHT_BIT,steps*NORMAL_FRAME_TIME_MS);

 

2配置lcd相關背光值

函數initInThread中獲取config_autoBrightnessLevels中的數組

[html] 

If(mUseSoftwareAutoBrightness){  

    mAutoBrightnessLevels = resources.getIntArray(  

com.android.internal.R.array.config_autoBrightnessLevels);  

mLcdBackLightValues = resources.getIntArray(  

com.android.internal.R.array.config_autoBrightnessLcdBacklightValues);  

…  

}  

 

註意values可以選擇mLcdBackLightValues作為參數,這樣就將配置表中的值轉化為瞭系統中使用的值

[html]

getAutoBrightnessValue(SensorValue,int [] values){  

    for(i=0;i<mAutoBrightnessLevels.length;i++)  

{  

    If(SensorValue<mAutoBrightnessLevels[i])  

        Break;  

}  

Final int minval = values[0];  

Final int maxval = values[mAutoBrightnessLevels.length];  

  

}  

 

 

相關的數組定義在framework/base/core/res/res/values/config.xml

 

N個等級對應N+1個背光值,背光值應該滿足0-255,背光系統節點

 

Sys/class/leds/lcd-backlight/brightness

 

3.上述分析可知:

作為光傳感器獲取的實際值通過驅動層上傳到hal層,通過hal層poll到framework,為瞭減少配置文件調節可以在hal層或者kernel進行統一的映射,不會影響到自動調節背光的動畫效果。

這樣的好處就是多個項目時不必每次都去調節配置表。

例如:hal層中readEvents函數

調用

[html] 

indextoValue(size_t index) const  

{  

    Static const struct adcToLux{  

    Size_t adc_value;  

    Float lux_value;  

} adcToLux[] = {  

    {150,10.0},  

    {800,160},  

    {900,225},  

    {1000,320},  

    {1400,1280},  

};  

  

Return adcToLux[ARRAY_SIZE(adcToLux)-1].lux_value;  

}  

 

發佈留言