攝像頭移植簡述(mtk)
阿新 • • 發佈:2019-02-17
這裡以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/
上電過程小析
對於後攝,上電時上的是後攝的電源,所以前攝的id匹配不上。(前攝同理於後攝)
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
先找後攝,再找前攝(遍歷所有攝像頭 上電 匹配id)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匹配不上。(前攝同理於後攝)
這裡,後攝相容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);
}
}
............
}