[转载] mtk camera 记录

文摘 MediaTek 2024-06-15 阅读:586

文章目录

  1. 动态调试camera寄存器
  2. log打开
  3. sensor信息
  4. isp出帧
  5. android.hardware.camera.raw.xml
  6. media_profiles.xml
  7. mipi lane问题
  8. test_ev_compensation_advanced
  9. CCU
  10. flicker
  11. cts 帧率测试相关
  12. 耗时
  13. SENSOR_INFO_SENSITIVITY
  14. size配置
  15. adb 查看引脚状态
  16. 驱动size配置
  17. 平台sensor代码参考
  18. i2c bus相关配置
  19. 添加二供编译报错
  20. 开机不search main3
  21. 平台支持最大camera个数
  22. 工程模式
  23. 抓串口log
  24. gpio dump
  25. gpio配置一直为高
  26. 读id 冲突
  27. 待机af漏电
  28. 动态调试Scenario
  29. gsi屏蔽camera
  30. isp_driving_current mclk的驱动电流相关及配置
  31. 平台端otp size问题
  32. isp版本
  33. mtk mfnr
  34. mtk tag与android tag转换
  35. camera id引脚二供兼容
  36. cts测试中log打印
  37. PMIC调试
  38. af漏电一直为高
  39. mipi 速率
  40. 流程log关键字
  41. vbanking 计算
  42. sensor gain配置
  43. af相关配置以及metadata
  44. rrzo mdp
  45. 调用栈打印
  46. dump 符号表
  47. cts FOV测试
  48. 双摄硬同步
  49. 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
1.png
DPHY
vendor/mediatek/proprietary/custom/project/hal/imgsensor_src/cfg_setting_imgsensor.cpp
2.png

这里是csi 0~4, 4lane。如果要拆分的话,直接配置成如CUSTOM_CFG_CSI_PORT_0A与CUSTOM_CFG_CSI_PORT_0B 就是将csi0拆分成2lane了。
一般是定义在对应平台的
mt6779/hal/inc/camera_custom_imgsensor_cfg.h中
3.png

另外,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
主要是这两处
1004.png
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路以上,具体平台不同

4.png

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的整数倍。
5.png

当出现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,此时就可按照上面的方法排查
6.png
两个方向
上层有没有把帧率下发下来(检查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

0条评论

© 2024 芯缘异码. Powered by Typecho