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

手机摄像头驱动移植办法

[复制链接]
发表于 2015-8-5 09:24:08 | 显示全部楼层 |阅读模式
一、驱动源码包结构
OV13850摄像头在MTK6592平台,驱动移植方法,拿到的驱动源码包解压后得到hal和kernel两个目录文件,源码目录结构如下所示:
  Q* i, h% I3 K5 g' O6 S13850-6592-driver-10-28.7z& J5 K: T$ G+ j7 [. X: C8 L& `5 X
|--hal
% k  ^( E* ]8 ]- @|  |--camera_AE_PLineTable_ov13850mipiraw.h
4 t5 }! b( n! r/ A4 A. D# m# D|  |--camera_calibration_cam_cal.cpp- i5 i/ D4 f' K9 o3 x
|  |--camera_flicker_para_ov13850mipiraw.cpp
/ E; `' \# W# J|  |--camera_info_ov13850mipiraw.h
! a0 X+ k* i+ w' \) o|  |--camera_isp_lsc_ov13850mipiraw.h$ V# w' F3 o, e) X( J3 j! z
|  |--camera_isp_pca_ov13850mipiraw.h
$ F1 j) D9 W2 O9 C7 j1 S/ Z|  |--camera_isp_regs_ov13850mipiraw.h
7 L& X2 _' Y  n. v8 O3 m|  |--camera_tsf_data_ov13850mipiraw.h
  F( w( c$ }4 _# G! c4 d" v|  |--camera_tsf_para_ov13850mipiraw.h4 y( W' H1 k+ n8 {" Z
|  |--camera_tuning_para_ov13850mipiraw.cpp
, |- I7 F  ?  }: S: I7 H# r|  |--config.ftbl.ov13850_mipi_raw.h
3 g8 k% g, J1 |' z5 m7 @8 A|--kernel
5 K. x: \- `6 v! \  ~0 _|  |--ov13850mipiraw_Camera_Sensor_para.h
4 m4 v- Q9 v4 i( E% e, a6 C! }. U, S, S|  |--ov13850mipiraw_CameraCustomized.h' s- o4 y# S4 v  \% ^
|  |--ov13850mipiraw_Sensor.c4 g) _' E" V4 V; L
|  |--ov13850mipiraw_Sensor.h

! E1 r8 o/ [  O2 T6 U) T

6 e9 m, T# E5 U# E$ f, N

! |, E7 a0 r* K' J7 R, e! \3 I
二、ov13850驱动移植记录
  e; A3 x# p% I3 z/ A/ H" G  [1、kernel
( S! E; K$ [7 r, |7 y) e5 M

Sensor:

" H! H7 J* e5 T* a: b
  • 在mediatek\custom\common\kernel\imgsensor\目录下增加ov13850_mipi_raw文件夹,把驱动源码kernel目录中所有文件copy进来。
  • 修改mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h文件,增加ov13850 SENSOR_ID和SENSOR_DRVNAME定义
    ; \# j$ g! ~8 ?' I# p4 T

$ D4 }& }( I7 X6 C5 X& a8 f2 A& G- W9 T- ^1 D) Z
  • #define OV13850_SENSOR_ID             0xD850  
  • #define SENSOR_DRVNAME_OV13850_MIPI_RAW   "ov13850mipiraw"  
    ' A8 ~7 y* C8 _9 [

4 ]( @2 S! M% c, d& J- ?$ Q$ N1 Q2 E4 k8 ~+ x6 R

, H+ O6 K2 }3 |) l" H8 w6 }1 g
  • 修改mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
    . k# M5 z: ^" b  u# N
    & w# Z+ f: ?+ s! A- T; j2 I$ N

3 I/ Q8 V7 u' g- Y9 T0 j0 `
增加OV13850_MIPI_RAW_SensorInit函数声明
/ v4 v+ W% o) ]: ~: A; E
1 Y6 q# Q+ @, j6 n
  • UINT32 OV13850_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);  
    8 U7 m9 ~  n  ~7 r
' J: M; X, i" z) l. z

4 e$ l7 [% k; D0 m
在kdSensorList数组中增加OV13850配置
$ c4 R! v& ?" i0 B& ~0 P6 J
8 l" u$ J0 t0 c
4 z& C! b( D; x. I) P
  • 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  
  • ...  
  • }  6 J+ s3 l+ ^1 J' K) V- _
) c; U+ j! E$ T; _. ^* _* w

- [: V6 K9 Q$ {) r5 Y+ ~3 H) b/ x
  • 在mediatek\custom\wind92_wet_tdd\kernel\camera\camera\kd_camera_hw.c里,增加对OV13850的供电配置,参考OV12830和datasheet。由于OV12830和OV13850供电配置一样,所以copy12830,更改下名字即可。' B* H7 l! ]) y  F6 h

% y, L* @. s/ T- Z
7 W: f/ S( x! F& \  H
  • 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");  
  •     }  
  • }     
  • //...  ) m( k" ^0 |/ _5 |; A

      E* N2 @, \. f. c: C* O
; a6 I) F# G% \/ h

, {2 Y9 k. R2 u' A& f

Lens:

3 L* V2 t  B+ i& r
  • 在mediatek\custom\common\kernel\lens\目录下参照ov12830af,增加ov13850af 目录和驱动源码OV13850AF.c。
  • mediatek\custom\common\kernel\lens\inc\目录下参照ov12830af,增加ov13850af目录和OV13850AF.h头文件  X9 I/ i  Z- i5 o8 P

    $ J  I) c8 Y' E5 ?: z. d
    ; p5 Y1 c+ e! i% w& p" N
2、HAL; K  L6 s* f& N
Sensor:
% g& R. h8 j& w
  • 在mediatek\custom\mt6592\hal\imgsensor\目录下增加ov13850_mipi_raw文件夹,将OV13850驱动源码包中的hal下文件,copy到该文件夹下。
  • 修改mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp增加OV13850的SensorList描述项。" y3 Q6 j6 t# [5 P0 t/ v" {7 n1 l# ?

2 u) i" E' p0 C6 e8 h4 H, z3 ]
2 d5 t* e, w# W
  • MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =  
  • {  
  •     ...  
  •     #if defined(OV13850_MIPI_RAW)  
  •         RAW_INFO(OV13850_SENSOR_ID, SENSOR_DRVNAME_OV13850_MIPI_RAW,NULL),  
  •     #endif  
  •     ...  
  • }  
    $ t3 l, Z% J) q
; ^7 H. v, T5 T: W) l4 A

Lens:

( U9 ?0 f' s- q2 N, \
  • 在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+ w8 g- G# \( @& ]5 s5 s6 ?) j
    * M: z6 }  _1 g" R1 v* Z: u; T6 A
+ A7 Q: k" o; c4 a9 m, O

; c6 h" e+ R5 `5 c
  • #if defined(OV13850AF)  
  • extern PFUNC_GETLENSDEFAULT pOV13850AF_getDefaultData;  
  • #endif  + m# S4 X1 M4 b2 N  Z6 w/ |
# C! ^  o: \* o- A! Z
MSDK_LENS_INIT_FUNCTION_STRUCT LensList[MAX_NUM_OF_SUPPORT_LENS] =/ p  a5 `& a0 d1 O: f0 p
8 h) ]/ g; C8 T# l$ E
  • {  
  •     ...  
  •     #if defined(OV13850AF)  
  •         {OV13850_SENSOR_ID, OV13850AF_LENS_ID, "OV13850AF", pOV13850AF_getDefaultData},  
  •     #endif  
  •     ...  
  • }  ; S& S0 x4 ?& }! m3 L8 F, O3 w0 ^- b, n

, M  M1 ~$ d+ N
  • 修改camera_custom_lens.h,增加OV13850_LENS_ID,这里根据序号累加。1 H. {# l1 r8 f% }, w* A$ O$ e3 C1 k
3 ]9 q) ?, q9 Y$ V! ?" e3 _" T) o
# E, J* \: W7 h
" S+ q. e0 g5 `1 _9 x/ |( v7 Y" k8 @
  • #define OV13850AF_LENS_ID                    0x0008  
    0 G; J! R2 t5 e$ j/ H

. o4 g, e  _1 k9 x5 w7 U0 Z9 s

3、修改ProductConfig.mk


3 O( f8 q8 i# N, q9 v3 i' V; c6 p- s0 r
  • 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  
    $ y6 {& \* M2 h! q
' P- q2 ?; Y" G+ O) @% o
) x/ R3 \! c7 z/ B1 T
4、最后要修改init.rc 更改OV13850AF设备文件的权限,否则在open的时候会失败。
  R. @  m6 F2 }4 {
高级模式
B Color Image Link Quote Code Smilies @朋友 |上传

本版积分规则

在线客服

客服电话

欢迎来电咨询

188-9985 8350

微信关注

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

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

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

返回顶部

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

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