參考平臺:MT6765Q
一、概念
CCU(Camera Control Unit,相機控制單元),用來控制相機拍出來的畫面
二、簡介
mtk的ccu有單獨的mcu,在CCU中跑AE相關運算,可以省掉CPU的AE運算時間。
-
通過ccu調用i2c接口寫入sensor的shutter和gain。可以省掉cpu調用i2c接口的時間,但不能加速AE收斂;
-
在ccu中跑AE Algo,可以省掉cpu跑AE Algo的時間,而且可以加速AE收斂;
-
不同平臺之間,有的平臺強制跑CCU AE Algo,有的則可以切到CPU AE Algo。
三、ccu rules
由於CCU driver 由系統工具根據sensor driver 自動生成,故而ccu要求image sensor driver遵守以下rules:
1.無論添加的sensor驅動文件名字是什麼,在kd_imgsensor.h定義的sensor driver name必須和驅動文件名一致。比如添加gc5025的驅動文件名爲"gc5025_mipi_raw",則kd_imgsensor.h中應該作如下定義:
#define SENSOR_DRVNAME_GC5025_MIPI_RAW "gc5025_mipi_raw"
2.驅動文件中.c和.h文件除去.c/.h後綴後名字應該保持一致
如:gc5025mipiraw_Sensor.c和gc5025mipiraw_Sensor.h
3.驅動文件中應該使用ccu支持的函數,除了以下白名單中的函數:
-
iWriteRegI2C
-
iWriteRegI2CTiming
-
iReadRegI2C
-
iReadRegI2CTiming
-
fls
4.驅動文件中使用的宏必須先在sensor驅動.c/.h中聲明,不允許使用在其他文件中定義的宏
四、相關FAQ
1.開啓ccu log
adb root
adb shell setprop vendor.debug.drv.ccu_drv 5
adb shell setprop vendor.debug.ccuif.ccu_drv 5
adb shell pkill camera*
注意:ccu log打印在main log中,在main log中搜索"I2C wr dump",就可以看到ccu寫給sensor的register值了。
2.更新shutter和gain函數後,快速編譯ccu lib的方法
由於ccu的代碼跑在自己的mcu中,會對kernel driver中shutter和gain相關的函數單獨編譯。此時只編譯bootimage無法更新ccu的內容,shutter和gain的修改不能生效。此時要麼全編代碼要麼快速變異ccu lib,方法如下:
1)清掉舊的ccu lib文件
$out/target/product/$platform/obj_arm/EXECUTABLES/libccu_$sensor_name.dm_intermediates
$out/target/product/$platform/obj_arm/EXECUTABLES/libccu_$sensor_name.pm_intermediates
$out/target/product/$platform/obj_arm/EXECUTABLES/libccu_$sensor_name_intermediates
2)部分編譯ccu_tool目錄
3) 把新生成的下面內容,push到手機內(system/vendor/bin)
$out/target/product/$platform/vendor/bin/libccu_$sensor_name.dm
$out/target/product/$platform/vendor/bin/libccu_$sensor_name.pm
3.mt6765關閉ccu
修改文件關閉CCU總開關
alps/vendor/mediatek/proprietary/hardware/libcamera_ext/ccu/mt6765/ver1/drv/src/ccuif/src/ccu_mgr.cpp
void CcuMgr::_checkCcuEnable()
{
CcuMgr::IsCcuMgrEnabled = false;
char value[100] = {'\0'};
//property_get("debug.ccu_mgr_ccu.enable", value, "1");
property_get("debug.ccu_mgr_ccu.enable", value, "0"); // 把ccu 的總開關關閉。
CcuMgr::IsCcuMgrEnabled = atoi(value);
}