1. 程式人生 > >Android L系統mtk平臺下AAL自動背光調整服務亮度曲線調試需要涉及的地方

Android L系統mtk平臺下AAL自動背光調整服務亮度曲線調試需要涉及的地方

8bit red 根據 亮度 off 變量 環境 mil min

Android L系統mtk平臺下AAL自動背光調整服務亮度曲線調試需要涉及的地方

如果你想修改MTK的AAL自動背光調整相關的內容,那麽根據情況,可能需要涉及如下文件:

這是Android L版本的,對於新的版本文件名字,mtk可能作調整。

主要涉及的文件是:

1)cust_aal.cpp
2)DisplayPowerController.java
3)AutomaticBrightnessController.java
4)libaal.so MTK的AAL自動背光調整服務用到的庫
5)具體硬件driver的 pwm led。
6)另外,除了cust_aal.cpp和als驅動的實現get als的方法,可以通過als轉換來影響亮度外,即als raw data 改為als value, 16段折線擬合。參見代碼cm36652.c的cm36652_read_als()獲取raw als data,然後cm36652_get_als_value()根據cust_aal.cpp的.als_level[], .als_value[],來返回als轉換後的als sensor值,進而影響AAL service的背光走向。 新的驅動架構中,.als_level[], .als_value[]是在.dts文件中描述。

請註意,原來的驅動,對als_level和als_value只是區間內的值都是als_value[i]這種固定值,而不是區間內做線性擬合值,所以需要修改,參見我在mt6753中的cm3232.c中對cm3232_get_als_value()函數的修改。
另外setting的亮度條的亮度設置也可以影響AAL service設置背光的亮度。 從而達到提高亮度、降低亮度等目的。應用接口是Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS); 和Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,systemBrightness);
所以MTK的AAL service的根據環境光亮度調節還是很豐富的,滿足大部分需求。
即als_level和als_value描述的是raw_als到als的映射曲線,進而影響亮度調節。
而setting影響此映射曲線的倍數系數(當然最小值仍然是0亮度,最大值仍然是亮度255(8bit)/1023(10bit)),即相當於選擇了不同的映射曲線,即曲線偏亮還是偏暗。

float value = Settings.System.getFloatForUser(mContext.getContentResolver(), Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0, UserHandle.USER_CURRENT);

Settings.System.putFloatForUser(mContext.getContentResolver(), Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adj, UserHandle.USER_CURRENT);
adj的值從-1到1的取值範圍。
以及:
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mPower = IPowerManager.Stub.asInterface(ServiceManager.getService(“power”));
mPower.setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(adj); 實現。具體參考代碼BrightnessController.java

技術分享圖片

8)關於als調節背光的響應速度:
其實,另外從代碼DisplayPowerController.java的構造函數的代碼實現來看,可以看出,幾個config.xml配置值也影響相應的亮度。
例如:
config_autoBrightnessLevels[]和config_autoBrightnessLcdBacklightValues[],影響的是light sensor上報的.als_value(註意不是.als_level)時,對應的lux,與level[n]和value[m]之間的關系。即也是lux和亮度值之間的曲線範圍。
另外註意screenBrightne***angeMinimum值的取值。
config_screenBrightnessSettingDefault值
另外還有一些scale計算。
另外註意config_autoBrightnessLightSensorRate值。

涉及的主要參數是:
BRIGHTNESS_RAMP_RATE_BRIGHTEN 從 BRIGHTNESS_RAMP_RATE_SLOW調為fast,即從40變為200。 目前使用150
BRIGHTNESS_RAMP_RATE_DARKEN 從 BRIGHTNESS_RAMP_RATE_SLOW調為fast,即從40變為200。目前使用150
選為fast
AMBIENT_LIGHT_HORIZON 從10000,調為1000 即als sensor的穩定系數。
BRIGHTENING_LIGHT_DEBOUNCE 從4000, 調為500,新代碼改為mBrighteningLightDebounceConfig,此值參見DisplayPowerController.java中com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce。即config.xml的值。
DARKENING_LIGHT_DEBOUNCE 從8000, 調為500,新代碼改為mDarkeningLightDebounceConfig
BRIGHTENING_LIGHT_DEBOUNCE和DARKENING_LIGHT_DEBOUNCE這兩個變量表示,framework發現als亮度發生變化後,需要多久才會啟動AAL去做PWM調節。值越低,表示亮度越敏感。
SCREEN_DIM_MINIMUM_REDUCTION 從10變為2,減少最小步幅,可以減少跳變的感覺。
新版本代碼還有一個BRIGHTNESS_ADJUSTMENT_SAMPLE_DEBOUNCE_MILLIS, 從10000ms改為1000。
那麽結果是,從探測到要變到變完,1.5秒以內就完成。所以還是比較快的。

技術分享圖片

另外AAL service往下設置的初始值在cust_aal.cpp中的InitBrightness中設置。
這個值從0到1023,即8bit的255變為10bit的1023

9)由於CABC還會影響到背光的變化,所以調整亮度曲線時,可以根據需求關閉CABC、CABL。
在project的cust_aal.cpp中, 添加int InitFunction = 4; // 0: all off, 2: cabc, 4: dre

具體請參考我的免費的linux各種驅動開發課程如下:
https://edu.51cto.com/course/17138.html

另外我的相關培訓視頻請看:
歡迎觀看我發布的各個課程: https://edu.51cto.com/lecturer/8896847.html

Android L系統mtk平臺下AAL自動背光調整服務亮度曲線調試需要涉及的地方