這項功能涉及兩個模塊,光傳感器和背光,光傳感器采集周圍環境的光感強度,上報給系統,系統通過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;
}