查看: 9284|回复: 0
收起左侧

手机摄像头驱动移植办法

[复制链接]
发表于 2015-8-5 09:24:08 | 显示全部楼层 |阅读模式
一、驱动源码包结构
OV13850摄像头在MTK6592平台,驱动移植方法,拿到的驱动源码包解压后得到hal和kernel两个目录文件,源码目录结构如下所示:# b5 [0 v# B4 R
13850-6592-driver-10-28.7z3 X0 \' r1 v& X+ \% W
|--hal
2 ?- C; g7 T" c9 W5 x  [|  |--camera_AE_PLineTable_ov13850mipiraw.h
$ a4 p, M, s1 T' G|  |--camera_calibration_cam_cal.cpp
3 d/ C% ]) d. @$ c# j: [" D|  |--camera_flicker_para_ov13850mipiraw.cpp
* Y9 x4 ^8 W) i6 U+ ^- {. Z) N0 k|  |--camera_info_ov13850mipiraw.h
8 v; s- T: s3 Q% r; S|  |--camera_isp_lsc_ov13850mipiraw.h1 l. H$ Y7 R! n  E
|  |--camera_isp_pca_ov13850mipiraw.h8 A  [/ U1 E6 ]2 F) e8 C, s
|  |--camera_isp_regs_ov13850mipiraw.h
$ {8 n3 i1 [4 ~2 A& r! M& X  t/ n|  |--camera_tsf_data_ov13850mipiraw.h
2 {  U9 v! J' D( F+ X) S8 Y|  |--camera_tsf_para_ov13850mipiraw.h
, g7 }- v4 Z" m" _6 b|  |--camera_tuning_para_ov13850mipiraw.cpp
  M. V  o2 u  M|  |--config.ftbl.ov13850_mipi_raw.h1 ^8 N6 n5 Y3 u8 [8 b
|--kernel
0 ^; H; x! k0 p" l|  |--ov13850mipiraw_Camera_Sensor_para.h9 b+ S+ l  R- R# b1 X( B
|  |--ov13850mipiraw_CameraCustomized.h. x! Z% `; F3 G$ J9 G
|  |--ov13850mipiraw_Sensor.c
- l3 N4 O0 I- ^* ]|  |--ov13850mipiraw_Sensor.h

5 U1 P* O1 W- N4 Q  _* ?9 h


" J8 ~8 K! F  r$ F  o& ^

  h, ~  ?3 h  F2 l: I  o5 n* j' G
二、ov13850驱动移植记录' Y  H) n. U- j; b- }/ h5 m3 F
1、kernel
3 v) ?8 m4 I7 `4 l- V( X- k4 u! {

Sensor:

+ ]. m) P1 h  t7 G, ]: q
  • 在mediatek\custom\common\kernel\imgsensor\目录下增加ov13850_mipi_raw文件夹,把驱动源码kernel目录中所有文件copy进来。
  • 修改mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h文件,增加ov13850 SENSOR_ID和SENSOR_DRVNAME定义  R7 \3 i% n) V2 t  m9 X
9 l& R8 p$ b" }/ x
+ g1 w5 j0 ]1 @( O: Q0 m
  • #define OV13850_SENSOR_ID             0xD850  
  • #define SENSOR_DRVNAME_OV13850_MIPI_RAW   "ov13850mipiraw"  
    7 S5 S3 f% |) \2 C7 G6 X
/ W. f4 N4 A% }2 G
5 {$ g1 n/ s# }# ]) V
  V. D0 {* f$ @
  • 修改mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
    8 r  b- d  V. y5 E
    ; y2 e& a5 a9 `/ ?3 u
1 F# }. ?& T' f5 e5 C
增加OV13850_MIPI_RAW_SensorInit函数声明
# i& h+ n9 Q; @

  B$ ]  ?: g" o( j# K, S
  • UINT32 OV13850_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);  % X/ r: X" \: P9 c) G
) F1 t0 p  H9 A

2 [- S9 u3 C% c& b+ n/ R; D
在kdSensorList数组中增加OV13850配置6 Q# u4 ?  r  t* U  @! ?
( U6 B0 h( H, W$ {9 a
0 e- O2 ~5 ]: D, ]" U
  • ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] =  
  • {  
  • ...  
  • #if defined(OV13850_MIPI_RAW)  
  •     {OV13850_SENSOR_ID, SENSOR_DRVNAME_OV13850_MIPI_RAW, OV13850_MIPI_RAW_SensorInit},   
  • #endif  
  • ...  
  • }  
      q2 J- R( ^! C7 c4 C
' }& m! f  K6 J' o
8 j6 ~5 J- B: Y$ Q
  • 在mediatek\custom\wind92_wet_tdd\kernel\camera\camera\kd_camera_hw.c里,增加对OV13850的供电配置,参考OV12830和datasheet。由于OV12830和OV13850供电配置一样,所以copy12830,更改下名字即可。
    # E! S6 r# L& o, ~+ c
6 v1 ^, `2 k8 k$ v3 ?3 G; h3 ^
* f( n1 v  r2 j$ t. C
  • int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, BOOL On, char* mode_name)  
  • {  
  • //...  
  • else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV13850_MIPI_RAW,currSensorName)))  
  • {  
  •     printk("MYCAT kdCISModulePowerOn  SENSOR_DRVNAME_OV13850_MIPI_RAW \n");  
  •     printk("MYCAT OV13850_RAW idx:%d \n",SensorIdx);  
  •     #ifdef  __MAINSENSOR_USE_LDO_1_2V__  
  •   
  •     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"); }  
  •     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");}  
  •     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");}  
  •     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");}  
  •               
  •     #else  
  •                   
  •     // printk("MYCAT S5KH2_RAW POWER ON LDO D\n");  
  •     if (TRUE != hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1200,mode_name))  
  •     {  
  •         PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");  
  •         //return -EIO;  
  •         goto _kdCISModulePowerOn_exit_;  
  •     }  
  •   
  •   
  •     #endif  
  •       
  •     //printk("MYCAT S5KH2_RAW POWER ON LDO A\n");  
  •       
  •     if (TRUE != hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800,mode_name))  
  •     {  
  • <span style="white-space:pre">    </span>   PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");  
  •         //return -EIO;  
  •         goto _kdCISModulePowerOn_exit_;  
  •     }  
  •       
  •     //printk("MYCAT S5KH2_RAW POWER ON LDO D2\n");  
  •       
  •     if (TRUE != hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800,mode_name))  
  •     {  
  •         PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");  
  •         //return -EIO;  
  •         goto _kdCISModulePowerOn_exit_;  
  •     }  
  •     //printk("MYCAT S5KH2_RAW POWER ON LDO A2\n");  
  •     if (TRUE != hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_2800,mode_name))  
  •     {  
  •         PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");  
  •         //return -EIO;  
  •         goto _kdCISModulePowerOn_exit_;  
  •     }  
  •     msleep(5);  
  •       
  •     //disable inactive sensor  
  •     if (pinSetIdx == 0 || pinSetIdx == 2)   
  •     {//disable sub  
  •     <span style="white-space:pre">    </span>if (GPIO_CAMERA_INVALID != pinSet[1][IDX_PS_CMRST])   
  •         {  
  •             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");}  
  •             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");}  
  •             if (mt_set_gpio_dir(pinSet[1][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  •             if (mt_set_gpio_dir(pinSet[1][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  •             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  
  •             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  
  •         }  
  •     }  
  •     else   
  •     {  
  •         if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST])   
  •         {  
  •             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");}  
  •             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");}  
  •             if (mt_set_gpio_dir(pinSet[0][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  •             if (mt_set_gpio_dir(pinSet[0][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  •             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  
  •             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  
  •         }  
  •         if (GPIO_CAMERA_INVALID != pinSet[2][IDX_PS_CMRST])   
  •         {  
  •                                  
  •         }  
  •     }  
  •     //PDN/STBY pin  
  •     if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST])  
  •     {  
  •         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");}  
  •         if (mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}  
  •         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");}  
  •         //PDN pin  
  •         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");}  
  •         if (mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}  
  •         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");}  
  •         msleep(1);  
  •         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");}  
  •         msleep(1);  
  •         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");}  
  •         msleep(1);  
  •         printk("OV13850 PWN RST\n");  
  •     }  
  • }     
  • //...  3 d# b: S, P3 `1 ]' Z% o/ F6 u
    & z) m+ S/ t7 [3 x3 b# |
  K( Z. y# R# q
- s3 W+ F) z, C$ u0 [

Lens:


+ D+ X; v" q+ V& {0 r! p
  • 在mediatek\custom\common\kernel\lens\目录下参照ov12830af,增加ov13850af 目录和驱动源码OV13850AF.c。
  • mediatek\custom\common\kernel\lens\inc\目录下参照ov12830af,增加ov13850af目录和OV13850AF.h头文件5 E- a9 U' _; m$ u. M, O
    # E& `. P) o' i. W8 j

    2 J# W+ S1 a2 J
2、HAL8 F0 \! ^. F$ J, W/ n
Sensor:

  b& w/ L" m1 X+ S$ e) v9 g, K$ m+ N  Z
  • 在mediatek\custom\mt6592\hal\imgsensor\目录下增加ov13850_mipi_raw文件夹,将OV13850驱动源码包中的hal下文件,copy到该文件夹下。
  • 修改mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp增加OV13850的SensorList描述项。
      L  v5 U' `% ]: ^1 P

) O: g9 e3 b/ q4 p' I6 o1 [  _
$ U' D0 }/ P9 A+ b
  • MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =  
  • {  
  •     ...  
  •     #if defined(OV13850_MIPI_RAW)  
  •         RAW_INFO(OV13850_SENSOR_ID, SENSOR_DRVNAME_OV13850_MIPI_RAW,NULL),  
  •     #endif  
  •     ...  
  • }  
    & s3 r# g. p& J2 I

9 A0 F* i! r5 u+ l+ v3 T

Lens:

9 \8 d% U! e- h
  • 在mediatek\custom\common\hal\lens\下,增加ov13850af目录,参照ov12830增加lens_para_OV13850AF.cpp
  • 修改mediatek\custom\out\wind92_wet_tdd\hal\lens\src\Lenslist.cpp在LensList数组项里增加OV13850AF描述项。( U" I7 y6 g; U0 X) L
    , s1 g9 Q7 }) w

- w3 O# ]. |$ T2 K7 z

; x4 ?3 O: l: l
  • #if defined(OV13850AF)  
  • extern PFUNC_GETLENSDEFAULT pOV13850AF_getDefaultData;  
  • #endif  
      b, t# [- @& I/ `, j
: F  Y  o) T' d/ R& p' n
MSDK_LENS_INIT_FUNCTION_STRUCT LensList[MAX_NUM_OF_SUPPORT_LENS] =% o& E& v* c5 L. R7 E
# h. K9 Y. Y8 N& ?
  • {  
  •     ...  
  •     #if defined(OV13850AF)  
  •         {OV13850_SENSOR_ID, OV13850AF_LENS_ID, "OV13850AF", pOV13850AF_getDefaultData},  
  •     #endif  
  •     ...  
  • }  + `7 r3 A- d" @1 `
; G4 p& R: L! }% r1 W7 ]5 n% O
  • 修改camera_custom_lens.h,增加OV13850_LENS_ID,这里根据序号累加。' t5 E( M# S9 B; G. t$ z% ]

8 }# D5 X+ ^) Z" h: [
" c& H, i1 ~6 s5 _: O' a5 c+ m( r) z4 p' }! p
  • #define OV13850AF_LENS_ID                    0x0008  
    3 j( a' d' k0 [( I7 {

+ G4 E& o) g  x

3、修改ProductConfig.mk


0 J& ?& ^% b+ B: |3 ~
  • CUSTOM_HAL_IMGSENSOR= ov13850_mipi_raw ov5648_mipi_raw  
  • CUSTOM_HAL_LENS= ov13850af  dummy_lens  
  • CUSTOM_HAL_MAIN_IMGSENSOR= ov13850_mipi_raw  
  • CUSTOM_HAL_MAIN_LENS= ov13850af  
  • CUSTOM_KERNEL_IMGSENSOR= ov13850_mipi_raw ov5648_mipi_raw  
  • CUSTOM_KERNEL_LENS= ov13850af dummy_lens  
  • CUSTOM_KERNEL_MAIN_IMGSENSOR= ov13850_mipi_raw  
  • CUSTOM_KERNEL_MAIN_LENS= ov13850af  4 s9 j# J& g  C1 j6 _( F; x% ?  O

" J- M7 s2 I7 p9 v3 j. Q: j. L( W# v' D, t. c
4、最后要修改init.rc 更改OV13850AF设备文件的权限,否则在open的时候会失败。- {) W4 J/ V9 Z: T: ~
高级模式
B Color Image Link Quote Code Smilies @朋友 |上传

本版积分规则

在线客服

客服电话

欢迎来电咨询

188-9985 8350

微信关注

手机APP程序:
扫码下载访问

微信公众平台:
摄像头之家公众号

微信小程序:
摄像头小程序

返回顶部

QQ|站点统计|小黑屋|手机版|Archiver|摄像头模组论坛网-摄像头方案网CCM99 ( 粤ICP备18155214号 )

Powered by Discuz! X3.4 Licensed© 2001-2013 Comsenz Inc.