2 #include "icatch7002_common.h"
5 *v0.0.1: this driver is compatible with generic_sensor
7 * add sensor_focus_af_const_pause_usr_cb;
9 static int version = KERNEL_VERSION(0,0,3);
10 module_param(version, int, S_IRUGO);
15 module_param(debug, int, S_IRUGO|S_IWUSR);
17 #define dprintk(level, fmt, arg...) do { \
19 printk(KERN_WARNING fmt , ## arg); } while (0)
21 /* Sensor Driver Configuration Begin */
22 #define SENSOR_NAME RK29_CAM_ISP_ICATCH7002_MI1040
23 #define SENSOR_V4L2_IDENT V4L2_IDENT_ICATCH7002_MI1040
24 #define SENSOR_ID 0x2481
25 #define SENSOR_BUS_PARAM (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING|\
26 SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_HIGH|\
27 SOCAM_DATA_ACTIVE_HIGH|SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
28 #define SENSOR_PREVIEW_W 1280
29 #define SENSOR_PREVIEW_H 960
30 #define SENSOR_PREVIEW_FPS 30000 // 15fps
31 #define SENSOR_FULLRES_L_FPS 15000 // 7.5fps
32 #define SENSOR_FULLRES_H_FPS 15000 // 7.5fps
33 #define SENSOR_720P_FPS 0
34 #define SENSOR_1080P_FPS 0
37 static unsigned int SensorConfiguration = 0;
38 static unsigned int SensorChipID[] = {SENSOR_ID};
39 /* Sensor Driver Configuration End */
42 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))
43 //#define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)
45 //#define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)
46 //#define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
47 //#define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
48 //#define sensor_write_array generic_sensor_write_array
53 * The follow setting need been filled.
56 * sensor_init_data : Sensor initial setting;
57 * sensor_fullres_lowfps_data : Sensor full resolution setting with best auality, recommand for video;
58 * sensor_preview_data : Sensor preview resolution setting, recommand it is vga or svga;
59 * sensor_softreset_data : Sensor software reset register;
60 * sensor_check_id_data : Sensir chip id register;
63 * sensor_fullres_highfps_data: Sensor full resolution setting with high framerate, recommand for video;
64 * sensor_720p: Sensor 720p setting, it is for video;
65 * sensor_1080p: Sensor 1080p setting, it is for video;
68 * The SensorEnd which is the setting end flag must be filled int the last of each setting;
71 /* Sensor initial setting */
72 static struct rk_sensor_reg sensor_init_data[] ={
76 /* Senor full resolution setting: recommand for capture */
77 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={
82 /* Senor full resolution setting: recommand for video */
83 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={
86 /* Preview resolution setting*/
87 static struct rk_sensor_reg sensor_preview_data[] =
93 static struct rk_sensor_reg sensor_720p[]={
98 static struct rk_sensor_reg sensor_1080p[]={
103 static struct rk_sensor_reg sensor_softreset_data[]={
107 static struct rk_sensor_reg sensor_check_id_data[]={
111 * The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx
113 static struct rk_sensor_reg sensor_WhiteB_Auto[]=
117 /* Cloudy Colour Temperature : 6500K - 8000K */
118 static struct rk_sensor_reg sensor_WhiteB_Cloudy[]=
122 /* ClearDay Colour Temperature : 5000K - 6500K */
123 static struct rk_sensor_reg sensor_WhiteB_ClearDay[]=
128 /* Office Colour Temperature : 3500K - 5000K */
129 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=
135 /* Home Colour Temperature : 2500K - 3500K */
136 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=
141 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,
142 sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,
145 static struct rk_sensor_reg sensor_Brightness0[]=
151 static struct rk_sensor_reg sensor_Brightness1[]=
158 static struct rk_sensor_reg sensor_Brightness2[]=
165 static struct rk_sensor_reg sensor_Brightness3[]=
172 static struct rk_sensor_reg sensor_Brightness4[]=
179 static struct rk_sensor_reg sensor_Brightness5[]=
185 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,
186 sensor_Brightness4, sensor_Brightness5,NULL,
189 static struct rk_sensor_reg sensor_Effect_Normal[] =
194 static struct rk_sensor_reg sensor_Effect_WandB[] =
199 static struct rk_sensor_reg sensor_Effect_Sepia[] =
204 static struct rk_sensor_reg sensor_Effect_Negative[] =
209 static struct rk_sensor_reg sensor_Effect_Bluish[] =
215 static struct rk_sensor_reg sensor_Effect_Green[] =
220 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,
221 sensor_Effect_Bluish, sensor_Effect_Green,NULL,
224 static struct rk_sensor_reg sensor_Exposure0[]=
230 static struct rk_sensor_reg sensor_Exposure1[]=
235 static struct rk_sensor_reg sensor_Exposure2[]=
240 static struct rk_sensor_reg sensor_Exposure3[]=
245 static struct rk_sensor_reg sensor_Exposure4[]=
250 static struct rk_sensor_reg sensor_Exposure5[]=
255 static struct rk_sensor_reg sensor_Exposure6[]=
260 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,
261 sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,
264 static struct rk_sensor_reg sensor_Saturation0[]=
269 static struct rk_sensor_reg sensor_Saturation1[]=
274 static struct rk_sensor_reg sensor_Saturation2[]=
278 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};
280 static struct rk_sensor_reg sensor_Contrast0[]=
286 static struct rk_sensor_reg sensor_Contrast1[]=
292 static struct rk_sensor_reg sensor_Contrast2[]=
298 static struct rk_sensor_reg sensor_Contrast3[]=
304 static struct rk_sensor_reg sensor_Contrast4[]=
311 static struct rk_sensor_reg sensor_Contrast5[]=
317 static struct rk_sensor_reg sensor_Contrast6[]=
322 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,
323 sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,
325 static struct rk_sensor_reg sensor_SceneAuto[] =
330 static struct rk_sensor_reg sensor_SceneNight[] =
334 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};
336 static struct rk_sensor_reg sensor_Zoom0[] =
341 static struct rk_sensor_reg sensor_Zoom1[] =
346 static struct rk_sensor_reg sensor_Zoom2[] =
352 static struct rk_sensor_reg sensor_Zoom3[] =
356 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
359 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu
361 static struct v4l2_querymenu sensor_menus[] =
364 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,0,"auto",0),
365 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,1,"incandescent",0),
366 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,2,"fluorescent",0),
367 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,3,"daylight",0),
368 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,4,"cloudy-daylight",0),
371 new_usr_v4l2menu(V4L2_CID_EFFECT,0,"normal",0),
372 new_usr_v4l2menu(V4L2_CID_EFFECT,1,"aqua",0),
373 new_usr_v4l2menu(V4L2_CID_EFFECT,2,"negative",0),
374 new_usr_v4l2menu(V4L2_CID_EFFECT,3,"sepia",0),
375 new_usr_v4l2menu(V4L2_CID_EFFECT,4,"mono",0),
376 new_usr_v4l2menu(V4L2_CID_EFFECT,5,"none",0),
377 new_usr_v4l2menu(V4L2_CID_EFFECT,6,"aura",0),
378 new_usr_v4l2menu(V4L2_CID_EFFECT,7,"vintage",0),
379 new_usr_v4l2menu(V4L2_CID_EFFECT,8,"vintage2",0),
380 new_usr_v4l2menu(V4L2_CID_EFFECT,9,"lomo",0),
381 new_usr_v4l2menu(V4L2_CID_EFFECT,10,"red",0),
382 new_usr_v4l2menu(V4L2_CID_EFFECT,11,"blue",0),
383 new_usr_v4l2menu(V4L2_CID_EFFECT,12,"green",0),
386 new_usr_v4l2menu(V4L2_CID_SCENE,0,"normal",0),
387 new_usr_v4l2menu(V4L2_CID_SCENE,1,"auto",0),
388 new_usr_v4l2menu(V4L2_CID_SCENE,2,"landscape",0),
389 new_usr_v4l2menu(V4L2_CID_SCENE,3,"night",0),
390 new_usr_v4l2menu(V4L2_CID_SCENE,4,"night_portrait",0),
391 new_usr_v4l2menu(V4L2_CID_SCENE,5,"snow",0),
392 new_usr_v4l2menu(V4L2_CID_SCENE,6,"sports",0),
393 new_usr_v4l2menu(V4L2_CID_SCENE,7,"candlelight",0),
396 new_usr_v4l2menu(V4L2_CID_ANTIBANDING,0,"50hz",0),
397 new_usr_v4l2menu(V4L2_CID_ANTIBANDING,1,"60hz",0),
400 new_usr_v4l2menu(V4L2_CID_ISO,0,"auto",0),
401 new_usr_v4l2menu(V4L2_CID_ISO,1,"50",0),
402 new_usr_v4l2menu(V4L2_CID_ISO,2,"100",0),
403 new_usr_v4l2menu(V4L2_CID_ISO,3,"200",0),
404 new_usr_v4l2menu(V4L2_CID_ISO,4,"400",0),
405 new_usr_v4l2menu(V4L2_CID_ISO,5,"800",0),
406 new_usr_v4l2menu(V4L2_CID_ISO,6,"1600",0),
409 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl
411 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =
413 new_user_v4l2ctrl(V4L2_CID_DO_WHITE_BALANCE,V4L2_CTRL_TYPE_MENU,"White Balance Control", 0, 4, 1, 0,sensor_set_get_control_cb, NULL),
414 // new_user_v4l2ctrl(V4L2_CID_BRIGHTNESS,V4L2_CTRL_TYPE_INTEGER,"Brightness Control", -3, 2, 1, 0,sensor_set_get_control_cb, NULL),
415 new_user_v4l2ctrl(V4L2_CID_EXPOSURE,V4L2_CTRL_TYPE_INTEGER,"Exposure Control", -3, 3, 1, 0,sensor_set_get_control_cb, NULL),
416 new_user_v4l2ctrl(V4L2_CID_EFFECT,V4L2_CTRL_TYPE_MENU,"Effect Control", 0, 12, 1, 5,sensor_set_get_control_cb, NULL),
417 // new_user_v4l2ctrl(V4L2_CID_CONTRAST,V4L2_CTRL_TYPE_INTEGER,"Contrast Control", -4, 4, 1, 0,sensor_set_get_control_cb, NULL),
418 new_user_v4l2ctrl(V4L2_CID_SCENE,V4L2_CTRL_TYPE_MENU,"Scene Control", 0, 7, 1, 1,sensor_set_get_control_cb, NULL),
419 new_user_v4l2ctrl(V4L2_CID_ANTIBANDING,V4L2_CTRL_TYPE_MENU,"Antibanding Control", 0, 1, 1, 0,sensor_set_get_control_cb, NULL),
420 new_user_v4l2ctrl(V4L2_CID_WHITEBALANCE_LOCK,V4L2_CTRL_TYPE_BOOLEAN,"WhiteBalanceLock Control", 0, 1, 1, 0,sensor_set_get_control_cb, NULL),
421 new_user_v4l2ctrl(V4L2_CID_EXPOSURE_LOCK,V4L2_CTRL_TYPE_BOOLEAN,"ExposureLock Control", 0, 1, 1, 0,sensor_set_get_control_cb, NULL),
422 new_user_v4l2ctrl(V4L2_CID_METERING_AREAS,V4L2_CTRL_TYPE_INTEGER,"MeteringAreas Control", 0, 1, 1, 1,sensor_set_get_control_cb, NULL),
423 new_user_v4l2ctrl(V4L2_CID_WDR,V4L2_CTRL_TYPE_BOOLEAN,"WDR Control", 0, 1, 1, 0,sensor_set_get_control_cb, NULL),
424 new_user_v4l2ctrl(V4L2_CID_EDGE,V4L2_CTRL_TYPE_BOOLEAN,"EDGE Control", 0, 1, 1, 1,sensor_set_get_control_cb, NULL),
425 new_user_v4l2ctrl(V4L2_CID_JPEG_EXIF,V4L2_CTRL_TYPE_BOOLEAN,"Exif Control", 0, 1, 1, 0,sensor_set_get_control_cb, NULL),
426 new_user_v4l2ctrl(V4L2_CID_ISO,V4L2_CTRL_TYPE_MENU,"Exif Control", 0, 6, 1, 0,sensor_set_get_control_cb, NULL),
429 //MUST define the current used format as the first item
430 static struct rk_sensor_datafmt sensor_colour_fmts[] = {
431 {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG}
436 **********************************************************
437 * Following is local code:
439 * Please codeing your program here
440 **********************************************************
443 **********************************************************
444 * Following is callback
445 * If necessary, you could coding these callback
446 **********************************************************
449 * the function is called in open sensor
451 static int sensor_activate_cb(struct i2c_client *client)
453 return icatch_sensor_init(client);
456 * the function is called in close sensor
458 static int sensor_deactivate_cb(struct i2c_client *client)
464 * the function is called before sensor register setting in VIDIOC_S_FMT
466 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
468 return icatch_s_fmt(client, mf,capture);
471 * the function is called after sensor register setting finished in VIDIOC_S_FMT
473 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
477 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)
482 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
487 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
489 struct generic_sensor *sensor = to_generic_sensor(client);
490 return sensor->info_priv.chip_id[0];
492 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)
494 //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
496 if (pm_msg.event == PM_EVENT_SUSPEND) {
497 SENSOR_DG("Suspend");
500 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);
506 static int sensor_resume(struct soc_camera_device *icd)
515 * the function is v4l2 control V4L2_CID_HFLIP callback
517 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
518 struct v4l2_ext_control *ext_ctrl)
524 * the function is v4l2 control V4L2_CID_VFLIP callback
526 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
527 struct v4l2_ext_control *ext_ctrl)
532 * the function is v4l2 control V4L2_CID_HFLIP callback
535 static int sensor_flip_cb(struct i2c_client *client, int flip)
541 static int sensor_mirror_cb(struct i2c_client *client, int flip)
549 * the functions are focus callbacks
551 static int sensor_focus_init_usr_cb(struct i2c_client *client){
555 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){
559 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){
563 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){
567 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){
571 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){
575 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
579 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){
583 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)
589 face defect call back
591 static int sensor_face_detect_usr_cb(struct i2c_client *client,int on){
596 * The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some
597 * initialization in the function.
599 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)
601 spsensor->common_sensor.sensor_cb.sensor_s_stream_cb = icatch_s_stream;
602 spsensor->common_sensor.sensor_cb.sensor_enum_framesizes = icatch_enum_framesizes;
604 spsensor->isp_priv_info.outputSize =OUTPUT_QUADVGA;
605 spsensor->isp_priv_info.supportedSizeNum = 1;
606 spsensor->isp_priv_info.supportedSize[0] = OUTPUT_QUADVGA;
614 * It is not allowed to modify the following code
617 sensor_init_parameters_default_code();
619 sensor_v4l2_struct_initialization();
621 sensor_probe_default_code();
623 sensor_remove_default_code();
625 sensor_driver_default_module_code();