[转载] mtk camera 记录
文摘 MediaTek 2024-06-15 阅读:1249文章目录
- 动态调试camera寄存器
- log打开
- sensor信息
- isp出帧
- android.hardware.camera.raw.xml
- media_profiles.xml
- mipi lane问题
- test_ev_compensation_advanced
- CCU
- flicker
- cts 帧率测试相关
- 耗时
- SENSOR_INFO_SENSITIVITY
- size配置
- adb 查看引脚状态
- 驱动size配置
- 平台sensor代码参考
- i2c bus相关配置
- 添加二供编译报错
- 开机不search main3
- 平台支持最大camera个数
- 工程模式
- 抓串口log
- gpio dump
- gpio配置一直为高
- 读id 冲突
- 待机af漏电
- 动态调试Scenario
- gsi屏蔽camera
- isp_driving_current mclk的驱动电流相关及配置
- 平台端otp size问题
- isp版本
- mtk mfnr
- mtk tag与android tag转换
- camera id引脚二供兼容
- cts测试中log打印
- PMIC调试
- af漏电一直为高
- mipi 速率
- 流程log关键字
- vbanking 计算
- sensor gain配置
- af相关配置以及metadata
- rrzo mdp
- 调用栈打印
- dump 符号表
- cts FOV测试
- 双摄硬同步
- Camera lane 数的理论计算
1.动态调试camera寄存器
FAQ05758
首先确保驱动中
sensor driver(XXX_sensor.c)中正确实现相应的feature control:
UINT32 XXX_FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId,
UINT8 *pFeaturePara,UINT32 *pFeatureParaLen)
{
case SENSOR_FEATURE_SET_REGISTER:
XXX_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData);
break;
case SENSOR_FEATURE_GET_REGISTER:
pSensorRegData->RegData = XXX_read_cmos_sensor(pSensorRegData->RegAddr);
break;
}
打开camera
adb shell echo “addr” > /proc/driver/camsensor3
然后cat /proc/driver/camsensor3 查看结果
B:/proc/driver # echo "300b" > camsensor
B:/proc/driver # cat camsensor
addr = 0x0000300b, data = 0x00000088
写同理
adb shell echo “addr para” > /proc/driver/camsensor3
注意,add 与 para均是16进制
2.log打开
mtk通用log
adb root
adb shell setprop persist.mtk.camera.log_level 3
adb shell setprop persist.vendor.mtk.camera.log_level 3
adb root
adb shell setenforce 0
isp问题:
adb shell setprop debug.camera.log.p1node 2
adb shell setprop debuglog.imageio.iopipe 3
adb shell setprop debug.camera.log 1
adb shell setprop debug.camera.log.hal3a 1
adb shell setprop persist.mtk.camera.log_level 3
adb shell setprop debug.camera.log 5
adb shell setprop debug.aao_buf_mgr.enable 1
adb shell setprop debug.afo_buf_mgr.enable 1
其他
adb shell setprop persist.vendor.mtk.camera.log_level 3
adb shell setprop persist.vendor.debug.camera.log 2
adb shell setprop persist.mtk.camera.log_level 3
adb shell setprop persist.vendor.mtk.camera.log_level 3
adb shell setprop vendor.debug.mapping_mgr.enable 2
adb shell setprop debug.hal3av3.log 263
adb shell setprop debug.paramctrl.enable 1
its相关:
adb root
adb shell setenforce 0
adb shell setprop persist.vendor.mtk.camera.log_level 3
adb shell setprop vendor.debug.camera.log 3
adb shell setprop vendor.debug.camera.log.hal3a 1
adb shell setprop vendor.debug.hal3av3.log 263
adb shell setprop vendor.debug.3a.log 1
adb shell setprop debug.cam.drawid 1
adb shell setprop vendor.debug.hal3a.task 1
adb shell setprop vendor.debug.aaa_sensor_mgr.enable 1
adb shell setprop vendor.debug.ae_mgr.enable 1
adb shell setprop vendor.debug.aaa.pvlog.enable 1
adb shell setprop vendor.debug.camera.log.p1node 3
adb shell setprop vendor.flash_is_debug 1
adb shell pkill camera*
打闪相关:
----------------for ae
adb shell setprop debug.ae_mgr.enable 1
adb shell setprop debug.aaa.pvlog.enable 1
adb shell setprop debug.ae.enable 9
adb shell setprop debug.ae.plineinfo 1(for algo pline info)
---------------for hal3a
adb shell setprop debug.camera.log 1
adb shell setprop debug.hal3av3.log 263 // Hal3AAdapter3.cpp
adb shell setprop debug.camera.log.hal3a 1 // Hal3AFlowCtrl.cpp
adb shell setprop debug.3a.log 1 // Thread3AImp.cpp
adb shell setprop debug.thread_raw.log 1 // ThreadRawImp.cpp
adb shell setprop debug.aaa_state.enable 1
---------------for flashlight
adb shell setprop debug.z.flash_verbose_en 1
adb shell setprop debug.camera.log 1
3a相关:
adb root
adb shell setenforce 0
adb shell setprop persist.vendor.mtk.camera.log_level 3
adb shell setprop vendor.debug.camera.log 3
adb shell
setprop vendor.debug.camera.log.hal3a 1
adb shell setprop vendor.debug.hal3av3.log 263
adb shell setprop vendor.debug.3a.log 1
adb shell setprop vendor.debug.hal3a.task 1
adb shell setprop vendor.debug.aaa_sensor_mgr.enable 1
adb shell setprop vendor.debug.ae_mgr.enable 1
adb shell setprop vendor.debug.aaa.pvlog.enable 1
adb shell setprop vendor.debug.camera.log.p1node 2
adb shell setprop debug.cam.drawid 1adb shell pkill cameraserver
adb shell pkill camerahalserver
3.sensor信息
查看meta data 配置是否生效
adb shell dumpsys media.camera -v 2 > meta.info.txt
获取camera info (sensor name,各个size的size配置,delay frame的配置等)
adb shell cat /proc/driver/camera_info
MIPI pixel rate check
adb shell sentest [sensorDev] [scenario]
- sensorDev - 1:main, 2:sub, 4:main2, ......
- Scenario - 0:preview, 1:capture, 2: normal_video, ......*
4.isp出帧
FAQ18079
关键log(kernel):P1_SOF 或 DON 或ISP
releaseAction] [Cam:
CAMA P1_SOF
CAMB P1_SOF
main: P1NodeImp 也会打印SOF
源码路径:
/kernel-4.14/drivers/misc/mediatek/cameraisp/src/mt6765/camera_isp.c
将 #define ISP_DEBUG打开,可以看到更多log
5.android.hardware.camera.raw.xml
这些feature项的配置有两个地方:
a./frameworks/native/data/etc/xxxx.xml //xxxx表示不同feature name
b./device/mediatekprojects/xxxx/ //xxxx表示当前project
对应有android.app.cts.SystemFeaturesTest#testCameraFeatures
常见修改autofocus与capability.raw根据实际情况配置或者注释掉。
如:CtsAppTestCases
android.app.cts.SystemFeaturesTest#testCameraFeatures
Fail Details:java.lang.AssertionError: PackageManager#hasSystemFeature should return true for android.hardware.camera.level.full
则在相应android.hardware.camera.xml文件加上
<feature name="android.hardware.camera.level.full" />
添加"android.hardware.camera.capability.raw功能时,要注意添加对应metadata,
如:
camera 的CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW的
在 config_static_metadata_scaler.h 增加
CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_RAW16, MINT32)
CONFIG_ENTRY_VALUE(640, MINT32)
CONFIG_ENTRY_VALUE(960, MINT32)
CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)
.............
CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_RAW16, MINT64)
CONFIG_ENTRY_VALUE(640, MINT64)
CONFIG_ENTRY_VALUE(960, MINT64)
CONFIG_ENTRY_VALUE(33333333, MINT64)
同时在config_static_metadata_request_commonType.h添加声明:
CONFIG_METADATA_BEGIN(MTK_REQUEST_AVAILABLE_CAPABILITIES)//new
........
CONFIG_ENTRY_VALUE(MTK_REQUEST_AVAILABLE_CAPABILITIES_RAW, MUINT8) //添加
........
CONFIG_METADATA_END()
●相机硬件功能 android.hardware.camera
应用使用设备的后置相机。只有前置相机的设备不会列出该功能,因此如果您的应用可与任何朝向的相机通信,请改用android.hardware.camera.any 功能。
●android.hardware.camera.any 应用使用设备的其中一个相机或用户为设备连接的外置相机。
如果您的应用不要求相机必须是后置式,请使用此值来替代 android.hardware.camera。
●android.hardware.camera.autofocus 应用使用设备相机支持的自动对焦功能。 应用通过使用该功能暗示其还使用 android.hardware.camera 功能,除非这个父功能在声明时使用了 android:required="false"。
● android.hardware.camera.capability.manual_post_processing 应用使用设备相机支持的
MANUAL_POST_PROCESSING 功能。 您的应用可以通过该功能替换相机的自动白平衡功能。 使用
android.colorCorrection.transform、android.colorCorrection.gains 以及
TRANSFORM_MATRIX 的 android.colorCorrection.mode。
● android.hardware.camera.capability.manual_sensor 应用使用设备相机支持的
MANUAL_SENSOR 功能。 该功能隐含对自动曝光锁定 (android.control.aeLock)
的支持,该支持可以让相机的曝光时间和灵敏度一直固定在特定值。
●android.hardware.camera.capability.raw 应用使用设备相机支持的 RAW 功能。 该功能暗示设备可以保存
DNG(原始)文件,并且设备的相机提供您的应用直接处理这些原始图像所需的 DNG 相关元数据。
●android.hardware.camera.external 应用与用户为设备连接的外置相机通信。
但该功能不能保证外置相机可供您的应用使用。
●android.hardware.camera.flash 应用使用设备相机支持的闪光功能。 应用通过使用该功能暗示其还使用
android.hardware.camera 功能,除非这个父功能在声明时使用了 android:required="false"。
●android.hardware.camera.front 应用使用设备的前置相机。 应用通过使用该功能暗示其还使用
android.hardware.camera 功能,除非这个父功能在声明时使用了 android:required="false"。
● android.hardware.camera.level.full 应用使用设备的至少一个相机提供的 FULL 级图像捕捉支持。 提供
FULL 支持的相机可提供快速捕捉功能、逐帧控制和手动后期处理控制。
6.media_profiles.xml
mtk 解释
media_profiles.xml编解码讲解
客制化问题
cts源码:android/cts/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
实际情况实际分析,media_profiles.xml 需要遵循几个原则,不然会导致cts一系列问题。
7.mipi lane问题
参考:https://blog.csdn.net/weixin_38328785/article/details/112131386
DPHY
vendor/mediatek/proprietary/custom/project/hal/imgsensor_src/cfg_setting_imgsensor.cpp
这里是csi 0~4, 4lane。如果要拆分的话,直接配置成如CUSTOM_CFG_CSI_PORT_0A与CUSTOM_CFG_CSI_PORT_0B 就是将csi0拆分成2lane了。
一般是定义在对应平台的
mt6779/hal/inc/camera_custom_imgsensor_cfg.h中
另外,sensor驱动中还需指定.mipi_lane_num = SENSOR_MIPI_4_LANE,//mipi lane num
FAQ22847
当配置未生效或者不知道走哪一个文件时,可以加log确认
/vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1_1/imgsensor_drv.cpp
将 //#define SENDCMD_LOG
注释打开即可
794 case CMD_SENSOR_GET_MCLK_CONNECTION:
795 *parg1 = m_pCustomCfg->mclk;
796 #ifdef SENDCMD_LOG
797 LOG_MSG("[CMD_SENSOR_GET_MCLK_CONNECTION] *parg1 = %d", (MUINT32)*parg1);
798 #endif
799 break;
800
801 case CMD_SENSOR_GET_MIPI_SENSOR_PORT:
802 *parg1 = m_pCustomCfg->port;
803 #ifdef SENDCMD_LOG
804 LOG_MSG("[CMD_SENSOR_GET_MIPI_SENSOR_PORT]");
805 #endif
806 break;
8.test_ev_compensation_advanced
FAQ21801
参考:test_ev_compensation_advanced.py_.pdf
主要是这两处
AE_COMPENSATION_RANGE一般是-4,4,也有-6,6等值。
AE_COMPENSATION_STEP一般是1,2,这里step为2,测试时就是从-6,-4,-2这样。
CONFIG_METADATA_BEGIN(MTK_SENSOR_INFO_SENSITIVITY_RANGE)
CONFIG_ENTRY_VALUE(100, MINT32)
CONFIG_ENTRY_VALUE(1200, MINT32)///12xgain
CONFIG_METADATA_END()
CONFIG_METADATA_BEGIN(MTK_SENSOR_INFO_EXPOSURE_TIME_RANGE)// 100 us - 400ms
CONFIG_ENTRY_VALUE(100000L, MINT64)
CONFIG_ENTRY_VALUE(200000000L, MINT64) ///最大曝光时间是200ms
CONFIG_METADATA_END()
CONFIG_METADATA_BEGIN(MTK_SENSOR_MAX_ANALOG_SENSITIVITY)
CONFIG_ENTRY_VALUE(128, MINT32) ///这里目前配置的是128,这里通常配置的是最大的sensor gain
CONFIG_METADATA_END()
SENSITIVITY_RANGE 值是否合适(该值由SENSOR_MAX_ANALOG_SENSITIVIT和平台gain倍数决定,但一般均不用最大值),如在ev较大时(如4或6时)实际值低于期望值太多,则减小此处配置最大值可能能过,但是可能导致DUO ready test失败。
通过日志查看对应的ev值的log ,检测 ae_mgr中收到的ev 是否正确,如果不正确请提case给MTK
Sensor driver中是否有正确收到对应的shutter和gain,如果没有收到,请提
case给MTK
如果有正确收到对应的shutter和gain,请找sensor vendor解决sensor 设置对
应的ae值,表现不如预期的原因。
ae_mgr 为logtag
//==========================================================================
CONFIG_METADATA_BEGIN(MTK_SENSOR_INFO_MAX_FRAME_DURATION)// 30 sec
CONFIG_ENTRY_VALUE(200000000L, MINT64)
CONFIG_METADATA_END()
MAX_FRAME_DURATION为最小帧率对应的帧间隔,要求大于等于SENSOR_INFO_EXPOSURE_TIME_RANGE的值
9.CCU
ccu有单独的mcu,在CCU中跑AE相关运算,可以省掉CPU的AE运算时间。
其中,
ccu shutter&gain:
表示通过 ccu 调用i2c接口写入 sensor 的shutter 和 gain。
可以省掉 cpu 调用i2c接口的时间,但不能加速AE收敛。
CCU AE Algo:
在ccu中跑AE Algo。
可以省掉 cpu 跑AE Algo的时间,而且可以加速AE 收敛。
能否切到cpu AE Algo:
表示当前平台是否强制跑CCU AE Algo,对于强制跑CCU AE Algo 的平台,不支持传统的CPU AE Algo。
因为是编译时从驱动中拿ae相关函数,所以,在命名上,有一定要求,否则编译不过。
1.sensor名字,在kd_imgsensor.h中定义,且必须遵循SENSOR_NAME_+<sensor_name>,如SENSOR_NAME_OV8856_MIPI_RAW
2.驱动头文件命名,去掉.h后应与.c相同
3. iWriteRegI2C - iWriteRegI2CTiming - iReadRegI2C - iReadRegI2CTiming使用默认i2c读写函数
4. sensor挂载的i2c bus,需要支持2路以上,具体平台不同
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*
tag:CcuDrv 或I2C wr dump
10.flicker
交流电照明灯发出的光会以一定频率抖动,导致sensor图像出现行方向的水波纹,称之为flicker。目前主要的交流电频率有50Hz(中国)和60Hz两种。为了避免出现flicker,要求曝光时间大于base值时必须是base的整数倍。
当出现flicker时,首先要判断曝光时间是否正确,打印曝光寄存器值,看是否是base的整数倍;如果是base的整数倍,那么就得确认所用的行长和频率是否正确;如果都正确就需要向研发反映,可能sensor功能异常或者是行干扰。
11.cts 帧率测试相关
常见为testCameraToSurfaceTextureMetadata与testPreviewFpsRange等
debug方法:
1)上层成功设定15fps到camera kernel driver部分。
见log:
[ 6985.842845] (1)[26035:3ATHREAD][name:×××mipi_Sensor&]×××_camera_sensor[set_max_framerate_by_scenario] scenario_id = 0, framerate = 150
2)在随后的log中,搜索P1_SOF,发现两帧之间时间差为33ms,即sensor的帧率是30fps。这说明虽然设定了15fps的帧率到sensor,但其仍然输出30fps。
见log:
[ 6986.034669] -(0)26036:AFthread[ISP_D2] P1_SOF_13
[ 6986.067636] (2)26035:3ATHREAD[ISP_D2] P1_SOF_14
两帧时间差是6986.067636-6986.034669 = 32967,约33ms
看一下testPreviewFpsRange的log,此时就可按照上面的方法排查
两个方向
上层有没有把帧率下发下来(检查flow,rang 配置等)
如有下发,实际出帧是否符合预期 (检查驱动set_dummy函数,写帧长函数,性能)
12.耗时
power on 阶段,主要耗时在上电上面
<7>[ 73.402464] (6)[4470:powerOnSensor0][imgsensor][IMGSENSOR_PROFILE] [imgsensor][kdCISModulePowerOn]Profile = 28812 us
sensor open时,会有 init操作,主要是init 写寄存器
<7>[ 73.503729] (6)[4470:powerOnSensor0][imgsensor][IMGSENSOR_PROFILE] [imgsensor][SensorOpen]Profile = 130085 us
Preview setting/Capture setting 下这些setting时也会有耗时
<7>[ 73.884306] (4)[4516:HwBinder:815_1]S5K3L6_camera_sensor[control] scenario_id = 1
<7>[ 73.884311] (4)[4516:HwBinder:815_1]S5K3L6_camera_sensor[capture] E
<7>[ 73.884317] (4)[4516:HwBinder:815_1]S5K3L6_camera_sensor[capture_setting] capture_setting() E! currefps:300
<14>[ 73.889788] (0)[339:init]init 26: [73858][200]ReapLogT PropSet [debug.tracing.screen_brightness]=[0.8]73657 Done
<7>[ 73.892507] (0)[4516:HwBinder:815_1]S5K3L6_camera_sensor[set_mirror_flip] S5K3L6_camera_sensor[set_mirror_flip] image_mirror = 0
<7>[ 73.893308] (0)[4516:HwBinder:815_1][imgsensor][IMGSENSOR_PROFILE] [imgsensor][SensorControl]Profile = 8989 us