参考平台: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 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中声明,不允许使用在其他文件中定义的宏
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);
}