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

手机摄像头驱动移植办法

[复制链接]
发表于 2015-8-5 09:24:08 | 显示全部楼层 |阅读模式
一、驱动源码包结构
OV13850摄像头在MTK6592平台,驱动移植方法,拿到的驱动源码包解压后得到hal和kernel两个目录文件,源码目录结构如下所示:( T% ?# b* X2 r
13850-6592-driver-10-28.7z
  C6 n  E+ n3 D) r  O|--hal
( o% {) {4 f! `  ^; B) _|  |--camera_AE_PLineTable_ov13850mipiraw.h
! ], U1 N8 j$ K$ t2 |9 A|  |--camera_calibration_cam_cal.cpp
2 ^: X8 E( O; H|  |--camera_flicker_para_ov13850mipiraw.cpp
% ^; i" d& x6 @/ M|  |--camera_info_ov13850mipiraw.h  m3 ^* v" Q0 R& _  e5 G4 S
|  |--camera_isp_lsc_ov13850mipiraw.h+ y# S  D3 `" @+ }, k
|  |--camera_isp_pca_ov13850mipiraw.h7 i) _' t; x% b9 |1 Q% d
|  |--camera_isp_regs_ov13850mipiraw.h& y% n1 Z0 Q0 d0 l3 g
|  |--camera_tsf_data_ov13850mipiraw.h
" j$ ~5 u1 t6 E9 {+ x, b5 M|  |--camera_tsf_para_ov13850mipiraw.h
! q/ C' w: ]4 v- L|  |--camera_tuning_para_ov13850mipiraw.cpp
& P6 g1 }' m0 Z# B- g0 X|  |--config.ftbl.ov13850_mipi_raw.h+ o; c, ~! S* ~' t
|--kernel
* ~5 }6 l  p$ E* `& T, L1 S' s|  |--ov13850mipiraw_Camera_Sensor_para.h7 |9 s3 d0 H" z  e4 E& ~3 v7 M
|  |--ov13850mipiraw_CameraCustomized.h8 \- A* j& S! p3 i. G4 k/ P
|  |--ov13850mipiraw_Sensor.c
" @% s& M: v0 b4 p' z|  |--ov13850mipiraw_Sensor.h
) t- `% ~0 i2 B4 s. I- l

5 R7 {% j7 f" F- q" i

' e" N3 I) x( M* P
二、ov13850驱动移植记录( L% T' w4 O: |
1、kernel% y5 f$ Y# N& z! s) x

Sensor:

0 W4 _- T1 [7 o. S: R+ s' M
  • 在mediatek\custom\common\kernel\imgsensor\目录下增加ov13850_mipi_raw文件夹,把驱动源码kernel目录中所有文件copy进来。
  • 修改mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h文件,增加ov13850 SENSOR_ID和SENSOR_DRVNAME定义* Z  ^& t2 H7 Z  f( Q; z# l! n

6 W2 e! G; p7 i8 y: d
: A( d  t% m: u# C0 }" l9 f  S2 W+ B. E
  • #define OV13850_SENSOR_ID             0xD850  
  • #define SENSOR_DRVNAME_OV13850_MIPI_RAW   "ov13850mipiraw"  
    - A2 ?; l/ |! ^4 V1 w: o

( z4 i1 I' b! Y* q; T  a+ l! B
5 D4 D, {: L2 o! c1 v: x# _" [
3 }& `" h) j* ?4 ~" y( \
  • 修改mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
    ! O5 @$ M# s1 Z

    5 r2 Z3 U* S& f1 S% m( E& A: @9 m

% x/ S% A( [* d) }
增加OV13850_MIPI_RAW_SensorInit函数声明
& u, G6 |) L) y2 r) h
2 H5 P2 ?8 j) Z7 E- z
  • UINT32 OV13850_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);  3 y5 w" `" A) [1 K# U. [4 V! k

' X3 V; W! v/ y# g, p5 s0 d6 z( i& H# S+ G  Y; K, T& z* F
在kdSensorList数组中增加OV13850配置4 h) U3 E) j. q6 v2 S6 d/ C
, ^4 X$ Z5 {% _* B$ G2 k( M
2 u- b/ @, ?& c, ^2 S
  • 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  
  • ...  
  • }  1 a; s2 C, j5 H! M7 g% G# y

+ y9 D: D2 ]8 z' `+ t! M' Q# ^* x5 U$ F, S
  • 在mediatek\custom\wind92_wet_tdd\kernel\camera\camera\kd_camera_hw.c里,增加对OV13850的供电配置,参考OV12830和datasheet。由于OV12830和OV13850供电配置一样,所以copy12830,更改下名字即可。
    5 H5 f1 i8 ?/ M! E; v
% y( l% N* j! k6 B: f
# c# \- E7 `1 |! Q* I  p
  • 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+ @- O7 X4 v; t  [+ u
    * ^% N/ [, i; l) a8 A) M0 r

- x+ k2 k. r6 ?5 V
4 g5 X& b! J8 P% O

Lens:

- V& L. p$ i- t7 @8 E
  • 在mediatek\custom\common\kernel\lens\目录下参照ov12830af,增加ov13850af 目录和驱动源码OV13850AF.c。
  • mediatek\custom\common\kernel\lens\inc\目录下参照ov12830af,增加ov13850af目录和OV13850AF.h头文件
    2 T- m1 G( H  b5 N  E" k7 t2 l
    3 Z3 L" A2 _5 B7 S5 z6 D

    / F0 ?$ v3 P( N# ]9 ~+ b$ J
2、HAL0 ^7 m% ]  x/ Y) C$ n
Sensor:
0 n* Z& F9 s0 \$ V
  • 在mediatek\custom\mt6592\hal\imgsensor\目录下增加ov13850_mipi_raw文件夹,将OV13850驱动源码包中的hal下文件,copy到该文件夹下。
  • 修改mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp增加OV13850的SensorList描述项。
    " `4 N( l/ Q5 Y# o0 U

# V+ I, n4 v. r3 Y' j
3 b+ S9 K( C( }9 h4 ]# @/ Q4 H
  • MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =  
  • {  
  •     ...  
  •     #if defined(OV13850_MIPI_RAW)  
  •         RAW_INFO(OV13850_SENSOR_ID, SENSOR_DRVNAME_OV13850_MIPI_RAW,NULL),  
  •     #endif  
  •     ...  
  • }  
    5 p% e  w7 \1 s( k2 C

: v) G( v% Y! R0 n& z' v

Lens:


3 h# p$ K- \: y/ T+ t
  • 在mediatek\custom\common\hal\lens\下,增加ov13850af目录,参照ov12830增加lens_para_OV13850AF.cpp
  • 修改mediatek\custom\out\wind92_wet_tdd\hal\lens\src\Lenslist.cpp在LensList数组项里增加OV13850AF描述项。- F$ B5 ~% n$ p* e5 m% }
      Z9 i$ l% e# D7 ?# `" _

; ?! j, M9 h* h! ^7 J. `% _# s- ]

9 }2 J  p6 f) I3 a+ Q
  • #if defined(OV13850AF)  
  • extern PFUNC_GETLENSDEFAULT pOV13850AF_getDefaultData;  
  • #endif  * `4 v9 M" `1 u( D

8 }5 O' p4 O9 p) ~3 h
MSDK_LENS_INIT_FUNCTION_STRUCT LensList[MAX_NUM_OF_SUPPORT_LENS] =! ?; m' C1 Y5 ]) \' G6 H+ m" A& j

1 k* |9 z& S$ [  J
  • {  
  •     ...  
  •     #if defined(OV13850AF)  
  •         {OV13850_SENSOR_ID, OV13850AF_LENS_ID, "OV13850AF", pOV13850AF_getDefaultData},  
  •     #endif  
  •     ...  
  • }  
      O/ x2 W/ w5 S2 l# g7 e/ v

1 S; r( _" K# l8 I* C
  • 修改camera_custom_lens.h,增加OV13850_LENS_ID,这里根据序号累加。
    $ e" C. q9 [& S5 \0 X3 d
9 t, Y8 D. }0 y; a# c- x& T8 K

, v# }! I, j3 _
( M; @; V# e5 t$ R1 e, p/ X
  • #define OV13850AF_LENS_ID                    0x0008  2 i( a: v/ o! }
4 B/ g6 v3 I* s  K

3、修改ProductConfig.mk


0 V8 ]# w/ L' P% b0 L
  • 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  
    ! `: R/ e( C( F
9 a+ ?' f- ~" w  ?' L: g& }0 r6 t: M8 A1 s
& m5 l0 s  c' d# l+ `2 j0 Q
4、最后要修改init.rc 更改OV13850AF设备文件的权限,否则在open的时候会失败。2 g$ j7 ]* n. ^( j5 q
高级模式
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.