1. 程式人生 > >MTK Camera(OV13850) 驅動移植

MTK Camera(OV13850) 驅動移植

一、驅動原始碼包結構

拿到的驅動原始碼包解壓後得到hal和kernel兩個目錄檔案,原始碼目錄結構如下所示

13850-6592-driver-10-28.7z

|--hal

|  |--camera_AE_PLineTable_ov13850mipiraw.h

|  |--camera_calibration_cam_cal.cpp

|  |--camera_flicker_para_ov13850mipiraw.cpp

|  |--camera_info_ov13850mipiraw.h

|  |--camera_isp_lsc_ov13850mipiraw.h

|  |--camera_isp_pca_ov13850mipiraw.h

|  |--camera_isp_regs_ov13850mipiraw.h

|  |--camera_tsf_data_ov13850mipiraw.h

|  |--camera_tsf_para_ov13850mipiraw.h

|  |--camera_tuning_para_ov13850mipiraw.cpp

|  |--config.ftbl.ov13850_mipi_raw.h

|--kernel

|  |--ov13850mipiraw_Camera_Sensor_para.h

|  |--ov13850mipiraw_CameraCustomized.h

|  |--ov13850mipiraw_Sensor.c

|  |--ov13850mipiraw_Sensor.h

二、ov13850驅動移植記錄

1、kernel

Sensor:

  • 在mediatek\custom\common\kernel\imgsensor\目錄下增加ov13850_mipi_raw資料夾,把驅動原始碼kernel目錄中所有檔案copy進來。
  • 修改mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h檔案,增加ov13850 SENSOR_ID和SENSOR_DRVNAME定義
  1. #define OV13850_SENSOR_ID             0xD850
  2. #define SENSOR_DRVNAME_OV13850_MIPI_RAW   "ov13850mipiraw"
  • 修改mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h

增加OV13850_MIPI_RAW_SensorInit函式宣告

  1. UINT32 OV13850_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);  

在kdSensorList陣列中增加OV13850配置

  1. ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] =  
  2. {  
  3. ...  
  4. #if defined(OV13850_MIPI_RAW)
  5.     {OV13850_SENSOR_ID, SENSOR_DRVNAME_OV13850_MIPI_RAW, OV13850_MIPI_RAW_SensorInit},   
  6. #endif
  7. ...  
  8. }  
  • 在mediatek\custom\wind92_wet_tdd\kernel\camera\camera\kd_camera_hw.c裡,增加對OV13850的供電配置,參考OV12830和datasheet。由於OV12830和OV13850供電配置一樣,所以copy12830,更改下名字即可。
  1. int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, BOOL On, char* mode_name)  
  2. {  
  3. //...
  4. elseif (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV13850_MIPI_RAW,currSensorName)))  
  5. {  
  6.     printk("MYCAT kdCISModulePowerOn  SENSOR_DRVNAME_OV13850_MIPI_RAW \n");  
  7.     printk("MYCAT OV13850_RAW idx:%d \n",SensorIdx);  
  8.     #ifdef  __MAINSENSOR_USE_LDO_1_2V__
  9.     if (mt_set_gpio_pull_enable(CAMERA_POWER_VCAM_D_LDO_PIN, GPIO_PULL_DISABLE))    {PK_DBG("[CAMERA SENSOR] CAMERA_POWER_VCAM_D_LDO_PIN pull failed! \n"); }  
  10.     if (mt_set_gpio_mode(CAMERA_POWER_VCAM_D_LDO_PIN, GPIO_MODE_00)){PK_DBG("[CAMERA SENSOR] CAMERA_POWER_VCAM_D_LDO_PIN mode failed! \n");}  
  11.     if (mt_set_gpio_dir(CAMERA_POWER_VCAM_D_LDO_PIN,GPIO_DIR_OUT)) {PK_DBG("[CAMERA SENSOR] CAMERA_POWER_VCAM_D_LDO_PIN dir failed! \n");}  
  12.     if (mt_set_gpio_out(CAMERA_POWER_VCAM_D_LDO_PIN,GPIO_OUT_ONE)) {PK_DBG("[CAMERA SENSOR] CAMERA_POWER_VCAM_D_LDO_PIN out failed! \n");}  
  13.     #else
  14.     // printk("MYCAT S5KH2_RAW POWER ON LDO D\n");
  15.     if (TRUE != hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1200,mode_name))  
  16.     {  
  17.         PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");  
  18.         //return -EIO;
  19.         goto _kdCISModulePowerOn_exit_;  
  20.     }  
  21.     #endif
  22.     //printk("MYCAT S5KH2_RAW POWER ON LDO A\n");
  23.     if (TRUE != hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800,mode_name))  
  24.     {  
  25. <span style="white-space:pre">    </span>   PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");  
  26.         //return -EIO;
  27.         goto _kdCISModulePowerOn_exit_;  
  28.     }  
  29.     //printk("MYCAT S5KH2_RAW POWER ON LDO D2\n");
  30.     if (TRUE != hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800,mode_name))  
  31.     {  
  32.         PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");  
  33.         //return -EIO;
  34.         goto _kdCISModulePowerOn_exit_;  
  35.     }  
  36.     //printk("MYCAT S5KH2_RAW POWER ON LDO A2\n");
  37.     if (TRUE != hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_2800,mode_name))  
  38.     {  
  39.         PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");  
  40.         //return -EIO;
  41.         goto _kdCISModulePowerOn_exit_;  
  42.     }  
  43.     msleep(5);  
  44.     //disable inactive sensor
  45.     if (pinSetIdx == 0 || pinSetIdx == 2)   
  46.     {//disable sub
  47.     <span style="white-space:pre">    </span>if (GPIO_CAMERA_INVALID != pinSet[1][IDX_PS_CMRST])   
  48.         {  
  49.             if (mt_set_gpio_mode(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}  
  50.             if (mt_set_gpio_mode(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}  
  51.             if (mt_set_gpio_dir(pinSet[1][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  52.             if (mt_set_gpio_dir(pinSet[1][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  53.             if (mt_set_gpio_out(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor
  54.             if (mt_set_gpio_out(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module
  55.         }  
  56.     }  
  57.     else
  58.     {  
  59.         if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST])   
  60.         {  
  61.             if (mt_set_gpio_mode(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}  
  62.             if (mt_set_gpio_mode(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}  
  63.             if (mt_set_gpio_dir(pinSet[0][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  64.             if (mt_set_gpio_dir(pinSet[0][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  65.             if (mt_set_gpio_out(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor
  66.             if (mt_set_gpio_out(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module
  67.         }  
  68.         if (GPIO_CAMERA_INVALID != pinSet[2][IDX_PS_CMRST])   
  69.         {  
  70.         }  
  71.     }  
  72.     //PDN/STBY pin
  73.     if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST])  
  74.     {  
  75.         if (mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}  
  76.         if (mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  77.         if (mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");}  
  78.         //PDN pin
  79.         if (mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}  
  80.         if (mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  81.         if (mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");}  
  82.         msleep(1);  
  83.         if (mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_ON])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");}  
  84.         msleep(1);  
  85.         if (mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_ON])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");}  
  86.         msleep(1);  
  87.         printk("OV13850 PWN RST\n");  
  88.     }  
  89. }     
  90. //...

Lens:

  • 在mediatek\custom\common\kernel\lens\目錄下參照ov12830af,增加ov13850af 目錄和驅動原始碼OV13850AF.c。
  • mediatek\custom\common\kernel\lens\inc\目錄下參照ov12830af,增加ov13850af目錄和OV13850AF.h標頭檔案

2、HAL

Sensor:

  • 在mediatek\custom\mt6592\hal\imgsensor\目錄下增加ov13850_mipi_raw資料夾,將OV13850驅動原始碼包中的hal下檔案,copy到該資料夾下。
  • 修改mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp增加OV13850的SensorList描述項。
  1. MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =  
  2. {  
  3.     ...  
  4.     #if defined(OV13850_MIPI_RAW)
  5.         RAW_INFO(OV13850_SENSOR_ID, SENSOR_DRVNAME_OV13850_MIPI_RAW,NULL),  
  6.     #endif
  7.     ...  
  8. }  

Lens:

  • 在mediatek\custom\common\hal\lens\下,增加ov13850af目錄,參照ov12830增加lens_para_OV13850AF.cpp
  • 修改mediatek\custom\out\wind92_wet_tdd\hal\lens\src\Lenslist.cpp在LensList陣列項裡增加OV13850AF描述項。
  1. #if defined(OV13850AF)
  2. extern PFUNC_GETLENSDEFAULT pOV13850AF_getDefaultData;  
  3. #endif
MSDK_LENS_INIT_FUNCTION_STRUCT LensList[MAX_NUM_OF_SUPPORT_LENS] =
  1. {  
  2.     ...  
  3.     #if defined(OV13850AF)
  4.         {OV13850_SENSOR_ID, OV13850AF_LENS_ID, "OV13850AF", pOV13850AF_getDefaultData},  
  5.     #endif
  6.     ...  
  7. }  
  • 修改camera_custom_lens.h,增加OV13850_LENS_ID,這裡根據序號累加。
  1. #define OV13850AF_LENS_ID                    0x0008

3、修改ProductConfig.mk

  1. CUSTOM_HAL_IMGSENSOR= ov13850_mipi_raw ov5648_mipi_raw  
  2. CUSTOM_HAL_LENS= ov13850af  dummy_lens  
  3. CUSTOM_HAL_MAIN_IMGSENSOR= ov13850_mipi_raw  
  4. CUSTOM_HAL_MAIN_LENS= ov13850af  
  5. CUSTOM_KERNEL_IMGSENSOR= ov13850_mipi_raw ov5648_mipi_raw  
  6. CUSTOM_KERNEL_LENS= ov13850af dummy_lens  
  7. CUSTOM_KERNEL_MAIN_IMGSENSOR= ov13850_mipi_raw  
  8. CUSTOM_KERNEL_MAIN_LENS= ov13850af  

4、最後要修改init.rc 更改OV13850AF裝置檔案的許可權,否則在open的時候會失敗。