摄像头移植简述(mtk)

这里以mt6737t为例

1、编译摄像头驱动
    device/lentek/xxxxxx/ProjectConfig.mk
    kernel-3.18/arch/arm64/configs/xxxxx_defconfig
    kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6735/
    kernel-3.18/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h
2、上电
    kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6735/camera_hw/kd_camera_hw.c
3、hal修改
    device/mediatek/common/kernel-headers/kd_imgsensor.h
    vendor/mediatek/proprietary/custom/mt6735/hal/D1/imgsensor_src/sensorlist.cpp
    vendor/mediatek/proprietary/custom/mt6735/hal/D1/imgsensor/


上电过程小析

vendor/mediatek/proprietary/hardware/mtkcam/legacy/platform/mt6735/hal/sensor/imgsensor_drv.c

MINT32 ImgSensorDrv::impSearchSensor(pfExIdChk pExIdChkCbf)
for (SensorEnum = 0; SensorEnum <= 2; SensorEnum <<= 1)  {
	for (i = 0; i < MAX_NUM_OF_SUPPORT_SENSOR; i++) {
            	if (m_pstSensorInitFunc[i].getCameraDefault == NULL) {
                	LOG_MSG("m_pstSensorInitFunc[i].getCameraDefault is NULL: %d \n", i);
                	break;
            	}
		ioctl(m_fdSensor, KDIMGSENSORIOC_X_SET_DRIVER,&id[KDIMGSENSOR_INVOKE_DRIVER_0] );
		ioctl(m_fdSensor, KDIMGSENSORIOC_T_CHECK_IS_ALIVE);
	}
}

先找后摄,再找前摄(遍历所有摄像头  上电  匹配id)
对于后摄,上电时上的是后摄的电源,所以前摄的id匹配不上。(前摄同理于后摄)

这里,后摄兼容3颗sensor,分别是ov5695,ov8856,gc5025,前摄为sp2509,打印如下

2565:01-12 23:25:57.130   454   454 D ImgSensorDrv: [impSearchSensor]SENSOR search start 
2566:01-12 23:25:57.130   454   454 D ImgSensorDrv: [impSearchSensor]impSearchSensor search to sub
2567:01-12 23:25:57.130   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =10000
2706:01-12 23:25:57.317   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error) 
2710:01-12 23:25:57.317   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
2711:01-12 23:25:57.317   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =10001
2876:01-12 23:25:57.473   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error) 
2880:01-12 23:25:57.482   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
2881:01-12 23:25:57.482   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =10002
3294:01-12 23:25:57.810   454   454 D ImgSensorDrv: [impSearchSensor]found <0x5025/gc5025mipiraw/SENSOR_DRVNAME_GC5025_MIPI_RAW>
3295:01-12 23:25:57.810   454   454 D ImgSensorDrv: [impSearchSensor]MAIN sensor found:[2]/[0x10002]/[0]/[1] 
3296:01-12 23:25:57.810   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =10003
3521:01-12 23:25:58.118   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error) 
3525:01-12 23:25:58.118   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
3526:01-12 23:25:58.118   454   454 D ImgSensorDrv: [impSearchSensor]m_pstSensorInitFunc[i].getCameraDefault is NULL: 4 
3527:01-12 23:25:58.118   454   454 D ImgSensorDrv: [impSearchSensor]impSearchSensor search to sub
3528:01-12 23:25:58.119   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =20000
3529:01-12 23:25:58.119   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error) 
3537:01-12 23:25:58.121   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
3538:01-12 23:25:58.121   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =20001
3539:01-12 23:25:58.121   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error) 
3543:01-12 23:25:58.122   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
3544:01-12 23:25:58.122   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =20002
3875:01-12 23:25:58.547   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error) 
3879:01-12 23:25:58.550   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
3880:01-12 23:25:58.550   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =20003
3937:01-12 23:25:58.782   454   454 D ImgSensorDrv: [impSearchSensor]found <0x2509/sp2509mipiraw/SENSOR_DRVNAME_SP2509_MIPI_RAW>
3938:01-12 23:25:58.782   454   454 D ImgSensorDrv: [impSearchSensor]SUB sensor found:[3]/[0x20003]/[0]/[-1] 
3939:01-12 23:25:58.782   454   454 D ImgSensorDrv: [impSearchSensor]m_pstSensorInitFunc[i].getCameraDefault is NULL: 4 
3940:01-12 23:25:58.782   454   454 D ImgSensorDrv: [impSearchSensor]SENSOR search end: 0x3 /[0x5025][2]/[0xffffff][255]/[0x2509][3]

kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6735/kd_sensorlist.c

    case KDIMGSENSORIOC_X_SET_DRIVER:
		i4RetValue = kdSetDriver((unsigned int *)pBuff);
		break;
	case KDIMGSENSORIOC_T_CHECK_IS_ALIVE:
		i4RetValue = adopt_CAMERA_HW_CheckIsAlive();
		break;

	int kdSetDriver(unsigned int *pDrvIndex)
	{
		pSensorList[drvIdx[i]].SensorInit(&g_pInvokeSensorFunc[i]);
		memcpy((char *)g_invokeSensorNameStr[i], (char *)pSensorList[drvIdx[i]].drvname, sizeof(pSensorList[drvIdx[i]].drvname));
		//获取摄像头的名字
	}

kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6735/camera_hw/kd_camera_hw.c

adopt_CAMERA_HW_CheckIsAlive(void){
	if(0!=kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM *)g_invokeSocketIdx, g_invokeSensorNameStr, true, CAMERA_HW_DRVNAME1)){
		return -EIO;
	}
	err = g_pSensorFunc->SensorFeatureControl(g_invokeSocketIdx[i], SENSOR_FEATURE_CHECK_SENSOR_ID, (MUINT8 *)&sensorID, &retLen);
	//读sensor id
}

kdModulePowerOn调用kdCISModulePowerOn

int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, bool On, char *mode_name)
{
		............
		if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC5025_MIPI_RAW, currSensorName))) {

                          if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMPDN])
                                  mtkcam_gpio_set(pinSetIdx, CAMPDN, pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF]);
  
                          if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST])
                                  mtkcam_gpio_set(pinSetIdx, CAMRST, pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF]);
  
                          mdelay(50);
  
                          /* VCAM_IO */
                          if (TRUE != _hwPowerOn(VCAMIO, VOL_1800)) {
                                  PK_DBG("[CAMERA SENSOR] Fail to enable IO power (VCAM_IO),power id = %d\n", VCAMIO);
                                  goto _kdCISModulePowerOn_exit_;
                          }
  
                          mdelay(10);
  
                          if (TRUE != _hwPowerOn(VCAMD, VOL_1500)) {
                                  PK_DBG("[CAMERA SENSOR] Fail to enable digital power (VCAM_D),power id = %d\n", VCAMD);
                                  goto _kdCISModulePowerOn_exit_;
                          }
  
                          mdelay(10);
  
                          /* VCAM_A */
                          if (TRUE != _hwPowerOn(VCAMA, VOL_2800)) {
                                  PK_DBG("[CAMERA SENSOR] Fail to enable analog power (VCAM_A),power id = %d\n", VCAMA);
                                  goto _kdCISModulePowerOn_exit_;
                          }
  
                          mdelay(10);
  
                          /* AF_VCC */
                          if (TRUE != _hwPowerOn(VCAMAF, VOL_2800)) {
                                  PK_DBG("[CAMERA SENSOR] Fail to enable analog power (VCAM_AF),power id = %d\n", VCAMAF);
                                  goto _kdCISModulePowerOn_exit_;
                          }
  
  
                          mdelay(10);
  
                          /* enable active sensor */
                          if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMPDN]) {
                                  mtkcam_gpio_set(pinSetIdx, CAMPDN, pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON]);
                                  mdelay(5);
                          }
  
  
                          if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {
                                  mtkcam_gpio_set(pinSetIdx, CAMRST, pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON]);
                                  mdelay(5);
                          }
                 }
		............
}

高版本的内核,摄像头部分稍微有点改动,移植摄像头涉及到这些文件,以mt6761平台移植sp5508为例。

kernel-4.19/arch/arm/boot/dts/cust_mt6761_project_camera.dtsi
kernel-4.19/arch/arm/configs/k61v1_hdp_ref_debug_defconfig
kernel-4.19/arch/arm/configs/k61v1_hdp_ref_defconfig
kernel-4.19/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.c
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.h
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/sp5508_mipi_raw/Makefile
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/sp5508_mipi_raw/sp5508mipi_Sensor.c
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/sp5508_mipi_raw/sp5508mipi_Sensor.h
kernel-4.19/drivers/misc/mediatek/imgsensor/src/mt6761/camera_project/k61v1_hdp_ref/camera_hw/imgsensor_cfg_table.c
device/mediatek/common/kernel-headers/kd_imgsensor.h
device/mediateksample/k61v1_hdp_ref/ProjectConfig.mk
vendor/mediatek/proprietary/custom/mt6761/hal/imgsensor_src/sensorlist.cpp
vendor/mediatek/proprietary/custom/mt6761/hal/imgsensor_src/cfg_setting_imgsensor.cpp
vendor/mediatek/proprietary/custom/mt6761/hal/imgsensor/sp5508_mipi_raw
vendor/mediatek/proprietary/custom/common/hal/imgsensor_metadata/sensor/sp5508_mipi_raw
vendor/mediatek/proprietary/custom/mt6761/hal/imgsensor_metadata/sp5508_mipi_raw
vendor/mediatek/proprietary/custom/mt6761/hal/sendepfeature/sp5508_mipi_raw

一般来说,摄像头的驱动源码能拿到(平台的耦合性不强),但摄像头的效果文件在不同的平台上是不通用的,或者同平台在不同的Android版本上也不一定能编译通过,这时需要复制平台的效果文件了,先编译通过,然后让fae去调试效果。具体参考方法参考FAQ22441 或者mtk平台调试总结_Android开发-CSDN博客

metadata

mtk在Android metadata的基础上增加了mtk meatadata,其转换方式可参考

vendor/mediatek/proprietary/hardware/mtkcam/include/mktcam/utils/metadata/client/TagMap.h

。可以通过dumpsys media.camera查看metadata是否生效。注意目前有两种架构的metadata,文档上写着是兼容的,实际调试中也遇到一下问题,最好拿新架构的metadata,遇到不生效的情况,要看下logcat,有没有crash。medata的准确性对过cts比较重要,遇到问题可参考FAQ21242。

对于前后摄像头使用同一款ic的情况,要注意id作假(原始id+/-),也就是id必须是唯一的。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值