2 #include "generic_sensor.h"
\r
4 * Driver Version Note
\r
5 *v0.0.1: this driver is compatible with generic_sensor
\r
7 * add sensor_focus_af_const_pause_usr_cb;
\r
9 static int version = KERNEL_VERSION(0,0,3);
\r
10 module_param(version, int, S_IRUGO);
\r
15 module_param(debug, int, S_IRUGO|S_IWUSR);
\r
17 #define dprintk(level, fmt, arg...) do { \
\r
18 if (debug >= level) \
\r
19 printk(KERN_WARNING fmt , ## arg); } while (0)
\r
21 /* Sensor Driver Configuration Begin */
\r
22 #define SENSOR_NAME RK29_CAM_SENSOR_GC2015
\r
23 #define SENSOR_V4L2_IDENT V4L2_IDENT_GC2015
\r
24 #define SENSOR_ID 0x2005
\r
25 #define SENSOR_BUS_PARAM (SOCAM_MASTER |\
\r
26 SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_LOW|\
\r
27 SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
\r
28 #define SENSOR_PREVIEW_W 800
\r
29 #define SENSOR_PREVIEW_H 600
\r
30 #define SENSOR_PREVIEW_FPS 15000 // 15fps
\r
31 #define SENSOR_FULLRES_L_FPS 7500 // 7.5fps
\r
32 #define SENSOR_FULLRES_H_FPS 7500 // 7.5fps
\r
33 #define SENSOR_720P_FPS 0
\r
34 #define SENSOR_1080P_FPS 0
\r
36 #define SENSOR_REGISTER_LEN 1 // sensor register address bytes
\r
37 #define SENSOR_VALUE_LEN 1 // sensor register value bytes
\r
38 static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect|CFG_Scene);
\r
39 static unsigned int SensorChipID[] = {SENSOR_ID};
\r
40 /* Sensor Driver Configuration End */
\r
43 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))
\r
44 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)
\r
46 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)
\r
47 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
48 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
49 #define sensor_write_array generic_sensor_write_array
\r
51 struct sensor_parameter
\r
53 unsigned int PreviewDummyPixels;
\r
54 unsigned int CaptureDummyPixels;
\r
55 unsigned int preview_exposure;
\r
56 unsigned short int preview_line_width;
\r
57 unsigned short int preview_gain;
\r
59 unsigned short int PreviewPclk;
\r
60 unsigned short int CapturePclk;
\r
64 struct specific_sensor{
\r
65 struct generic_sensor common_sensor;
\r
66 //define user data below
\r
67 struct sensor_parameter parameter;
\r
73 * The follow setting need been filled.
\r
76 * sensor_init_data : Sensor initial setting;
\r
77 * sensor_fullres_lowfps_data : Sensor full resolution setting with best auality, recommand for video;
\r
78 * sensor_preview_data : Sensor preview resolution setting, recommand it is vga or svga;
\r
79 * sensor_softreset_data : Sensor software reset register;
\r
80 * sensor_check_id_data : Sensir chip id register;
\r
83 * sensor_fullres_highfps_data: Sensor full resolution setting with high framerate, recommand for video;
\r
84 * sensor_720p: Sensor 720p setting, it is for video;
\r
85 * sensor_1080p: Sensor 1080p setting, it is for video;
\r
88 * The SensorEnd which is the setting end flag must be filled int the last of each setting;
\r
91 /* Sensor initial setting */
\r
92 static struct rk_sensor_reg sensor_init_data[] ={
\r
93 {0xfe, 0x80}, //soft reset
\r
94 {0xfe, 0x80}, //soft reset
\r
95 {0xfe, 0x80}, //soft reset
\r
97 {0xfe, 0x00}, //page0
\r
98 {0x45, 0x00}, //output_disable
\r
100 //////////////////////////////////////////////////////////////////////////////////////
\r
101 //////////////////////////preview capture switch /////////////////////////////////////
\r
102 //////////////////////////////////////////////////////////////////////////////////////
\r
104 {0x02, 0x01}, //preview mode
\r
105 {0x2a, 0xca}, //[7]col_binning, 0x[6]even skip
\r
106 {0x48, 0x40}, //manual_gain
\r
108 ////////////////////////////////////////////////////////////////////////
\r
109 ////////////////////////// preview LSC /////////////////////////////////
\r
110 ////////////////////////////////////////////////////////////////////////
\r
111 {0xfe, 0x01}, //page1
\r
112 {0xb0, 0x03}, //[4]Y_LSC_en [3]lsc_compensate [2]signed_b4 [1:0]pixel array select
\r
113 {0xb1, 0x46}, //P_LSC_red_b2
\r
114 {0xb2, 0x40}, //P_LSC_green_b2
\r
115 {0xb3, 0x40}, //P_LSC_blue_b2
\r
116 {0xb4, 0x24}, //P_LSC_red_b4
\r
117 {0xb5, 0x20}, //P_LSC_green_b4
\r
118 {0xb6, 0x22}, //P_LSC_blue_b4
\r
119 {0xb7, 0x00}, //P_LSC_compensate_b2
\r
120 {0xb8, 0x80}, //P_LSC_row_center, 0x344, 0x (1200/2-344)/2=128, 0x, 0x
\r
121 {0xb9, 0x80}, //P_LSC_col_center, 0x544, 0x (1600/2-544)/2=128
\r
124 ////////////////////////////////////////////////////////////////////////
\r
125 ////////////////////////// capture LSC /////////////////////////////////
\r
126 ////////////////////////////////////////////////////////////////////////
\r
127 {0xba, 0x03}, //[4]Y_LSC_en [3]lsc_compensate [2]signed_b4 [1:0]pixel array select
\r
128 {0xbb, 0x46}, //C_LSC_red_b2
\r
129 {0xbc, 0x40}, //C_LSC_green_b2
\r
130 {0xbd, 0x40}, //C_LSC_blue_b2
\r
131 {0xbe, 0x24}, //C_LSC_red_b4
\r
132 {0xbf, 0x20}, //C_LSC_green_b4
\r
133 {0xc0, 0x22}, //C_LSC_blue_b4
\r
134 {0xc1, 0x00}, //C_Lsc_compensate_b2
\r
135 {0xc2, 0x80}, //C_LSC_row_center, 0x344, 0x (1200/2-344)/2=128
\r
136 {0xc3, 0x80}, //C_LSC_col_center, 0x544, 0x (1600/2-544)/2=128
\r
137 {0xfe, 0x00}, //page0
\r
139 ////////////////////////////////////////////////////////////////////////
\r
140 ////////////////////////// analog configure ///////////////////////////
\r
141 ////////////////////////////////////////////////////////////////////////
\r
142 {0xfe, 0x00}, //page0
\r
143 {0x29, 0x00}, //cisctl mode 1
\r
144 {0x2b, 0x06}, //cisctl mode 3
\r
145 {0x32, 0x1c}, //analog mode 1
\r
146 {0x33, 0x0f}, //analog mode 2
\r
147 {0x34, 0x30}, //[6:4]da_rsg
\r
149 {0x35, 0x88}, //Vref_A25
\r
150 {0x37, 0x16}, //Drive Current
\r
152 /////////////////////////////////////////////////////////////////////
\r
153 /////////////////////////// ISP Related /////////////////////////////
\r
154 /////////////////////////////////////////////////////////////////////
\r
156 {0x41, 0x20}, //[5]skin_detectionenable[2]auto_gray, 0x[1]y_gamma
\r
157 {0x42, 0xf6}, //[7]auto_sa[6]auto_ee[5]auto_dndd[4]auto_lsc[3]na[2]abs, 0x[1]awb
\r
158 {0x4b, 0xe8}, //[1]AWB_gain_mode, 0x1:atpregain0:atpostgain
\r
159 {0x4d, 0x03}, //[1]inbf_en
\r
160 {0x4f, 0x01}, //AEC enable
\r
162 ////////////////////////////////////////////////////////////////////
\r
163 /////////////////////////// BLK //////////////////////////////////
\r
164 ////////////////////////////////////////////////////////////////////
\r
165 {0x63, 0x77}, //BLK mode 1
\r
166 {0x66, 0x00}, //BLK global offset
\r
168 {0x6e, 0x1a}, //BLK offset submode,offset R
\r
177 ////////////////////////////////////////////////////////////////////
\r
178 /////////////////////////// DNDD ///////////////////////////////////
\r
179 ////////////////////////////////////////////////////////////////////
\r
180 {0x80, 0x07}, //[7]dn_inc_or_dec [4]zero_weight_mode[3]share [2]c_weight_adap [1]dn_lsc_mode [0]dn_b
\r
181 {0x82, 0x0c}, //DN lilat b base
\r
184 ////////////////////////////////////////////////////////////////////
\r
185 /////////////////////////// EEINTP ////////////////////////////////
\r
186 ////////////////////////////////////////////////////////////////////
\r
193 /////////////////////////////////////////////////////////////////////
\r
194 /////////////////////////// CC_t ////////////////////////////////////
\r
195 /////////////////////////////////////////////////////////////////////
\r
196 {0xb0, 0x40}, // 0x48
\r
207 /////////////////////////////////////////////////////////////////////
\r
208 /////////////////////////// GAMMA ///////////////////////////////////
\r
209 /////////////////////////////////////////////////////////////////////
\r
247 /////////////////////////////////////////////////////////////////////
\r
248 /////////////////////////// YCP_t ///////////////////////////////////
\r
249 /////////////////////////////////////////////////////////////////////
\r
250 {0xd1, 0x40}, //saturation 38
\r
251 {0xd2, 0x40}, //saturation 38
\r
253 {0xd3, 0x46}, // 2011-08-11 kim add
\r
255 {0xde, 0x21}, //auto_gray
\r
257 ////////////////////////////////////////////////////////////////////
\r
258 /////////////////////////// ASDE ///////////////////////////////////
\r
259 ////////////////////////////////////////////////////////////////////
\r
267 {0xfe, 0x01}, //page1
\r
273 ////////////////////////////////////////////////////////////////////
\r
274 /////////////////////////// AEC ////////////////////////////////////
\r
275 ////////////////////////////////////////////////////////////////////
\r
276 {0x10, 0x09}, //AEC mode 1
\r
277 {0x11, 0x92}, //[7]fix target // 0xb2 2011-08-11 kim
\r
279 {0x13, 0x78}, // 0x78 2011-08-11 kim
\r
282 {0x1d, 0x04}, // sunlight step
\r
284 {0x21, 0xc0}, //max_post_gain
\r
285 {0x22, 0x40}, //max_pre_gain // 0x60 2011-08-11 kim
\r
286 {0x2d, 0x06}, //P_N_AEC_exp_level_1[12:8]
\r
287 {0x2e, 0x00}, //P_N_AEC_exp_level_1[7:0]
\r
289 {0x33, 0x00}, //[6:5]max_exp_level [4:0]min_exp_level
\r
290 {0x34, 0x04}, // min exp
\r
292 ////////////////////////////////////////////////////////////////////
\r
293 /////////////////////////// Measure Window /////////////////////////
\r
294 ////////////////////////////////////////////////////////////////////
\r
300 ////////////////////////////////////////////////////////////////////
\r
301 /////////////////////////// AWB ////////////////////////////////////
\r
302 ////////////////////////////////////////////////////////////////////
\r
303 {0x57, 0x40}, //number limit
\r
305 {0x5c, 0x35}, //show mode,close dark_mode
\r
306 {0x5e, 0x29}, //close color temp
\r
310 ////////////////////////////////////////////////////////////////////
\r
311 /////////////////////////// ABS ////////////////////////////////////
\r
312 ////////////////////////////////////////////////////////////////////
\r
318 {0x83, 0x10}, //ABS Y stretch limit
\r
320 ////////////////////////////////////////////////////////////////////
\r
321 /////////////////////////// OUT ////////////////////////////////////
\r
322 ////////////////////////////////////////////////////////////////////
\r
335 {0x44, 0xa0}, //YUV sequence
\r
336 {0x45, 0x0f}, //output enable
\r
337 {0x46, 0x02}, //sync mode
\r
363 {0x29, 0x00},//Anti Step 128
\r
366 {0x2b, 0x05},//Level_0 10.00fps
\r
368 {0x2d, 0x06},//Level_1 8.33fps
\r
370 {0x2f, 0x08},//Level_2 6.25fps
\r
372 {0x31, 0x09},//Level_3 5.55fps
\r
377 //--------------------Updated By Mormo 2011/08/08 Start --------------------//
\r
381 //--------------------Updated By Mormo 2011/08/08 End ---------------------//
\r
387 /* Senor full resolution setting: recommand for capture */
\r
388 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={
\r
391 {0x48, 0x80}, // 68
\r
393 {0x4f, 0x00}, // aec off
\r
424 /* Senor full resolution setting: recommand for video */
\r
425 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={
\r
428 /* Preview resolution setting*/
\r
429 static struct rk_sensor_reg sensor_preview_data[] =
\r
434 {0x4f, 0x01}, // aec on
\r
451 {0x50 , 0x01},//out window
\r
457 {0x56 , 0x58},// 600
\r
459 {0x58 , 0x20},//800
\r
463 static struct rk_sensor_reg sensor_720p[]={
\r
468 static struct rk_sensor_reg sensor_1080p[]={
\r
473 static struct rk_sensor_reg sensor_softreset_data[]={
\r
474 SensorRegVal(0xfe,80),
\r
479 static struct rk_sensor_reg sensor_check_id_data[]={
\r
480 SensorRegVal(0x00,0),
\r
481 SensorRegVal(0x01,0),
\r
485 * The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx
\r
487 static struct rk_sensor_reg sensor_WhiteB_Auto[]=
\r
492 /* Cloudy Colour Temperature : 6500K - 8000K */
\r
493 static struct rk_sensor_reg sensor_WhiteB_Cloudy[]=
\r
495 {0x42 , 0x74},// [1] AWB enable ¹¦ÄÜ¿ª¹ØAWB OFF
\r
496 {0x7a , 0x8c}, //AWB_R_gain
\r
497 {0x7b , 0x50}, //AWB_G_gain
\r
498 {0x7c , 0x40}, //AWB_B_gain
\r
501 /* ClearDay Colour Temperature : 5000K - 6500K */
\r
502 static struct rk_sensor_reg sensor_WhiteB_ClearDay[]=
\r
505 {0x42 , 0x74},// [1] AWB enable ¹¦ÄÜ¿ª¹ØAWB OFF
\r
506 {0x7a , 0x74}, //AWB_R_gain
\r
507 {0x7b , 0x52}, //AWB_G_gain
\r
508 {0x7c , 0x40}, //AWB_B_gain
\r
511 /* Office Colour Temperature : 3500K - 5000K */
\r
512 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=
\r
515 {0x42 , 0x74},// [1] AWB enable ¹¦ÄÜ¿ª¹ØAWB OFF
\r
516 {0x7a , 0x48}, //AWB_R_gain
\r
517 {0x7b , 0x40}, //AWB_G_gain
\r
518 {0x7c , 0x5c}, //AWB_B_gain
\r
522 /* Home Colour Temperature : 2500K - 3500K */
\r
523 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=
\r
526 {0x42 , 0x74},// [1] AWB enable ¹¦ÄÜ¿ª¹ØAWB OFF
\r
527 {0x7a , 0x40}, //AWB_R_gain
\r
528 {0x7b , 0x54}, //AWB_G_gain
\r
529 {0x7c , 0x70}, //AWB_B_gain
\r
532 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,
\r
533 sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,
\r
536 static struct rk_sensor_reg sensor_Brightness0[]=
\r
541 {0x13, 0x68}, //AEC_target_Y
\r
543 {0xd5, 0xe0},// Luma_offset
\r
547 static struct rk_sensor_reg sensor_Brightness1[]=
\r
551 {0x13, 0x70}, //AEC_target_Y
\r
553 {0xd5, 0xf0},// Luma_offset
\r
558 static struct rk_sensor_reg sensor_Brightness2[]=
\r
563 {0x13, 0x78}, //AEC_target_Y 48
\r
565 {0xd5, 0x00},// Luma_offset c0
\r
570 static struct rk_sensor_reg sensor_Brightness3[]=
\r
574 {0x13, 0x80}, //AEC_target_Y
\r
576 {0xd5, 0x10},// Luma_offset
\r
581 static struct rk_sensor_reg sensor_Brightness4[]=
\r
585 {0x13, 0x88}, //AEC_target_Y
\r
587 {0xd5, 0x20},// Luma_offset
\r
593 static struct rk_sensor_reg sensor_Brightness5[]=
\r
597 {0x13, 0x90}, //AEC_target_Y
\r
599 {0xd5, 0x30},// Luma_offset
\r
603 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,
\r
604 sensor_Brightness4, sensor_Brightness5,NULL,
\r
607 static struct rk_sensor_reg sensor_Effect_Normal[] =
\r
613 static struct rk_sensor_reg sensor_Effect_WandB[] =
\r
621 static struct rk_sensor_reg sensor_Effect_Sepia[] =
\r
629 static struct rk_sensor_reg sensor_Effect_Negative[] =
\r
637 static struct rk_sensor_reg sensor_Effect_Bluish[] =
\r
646 static struct rk_sensor_reg sensor_Effect_Green[] =
\r
654 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,
\r
655 sensor_Effect_Bluish, sensor_Effect_Green,NULL,
\r
658 static struct rk_sensor_reg sensor_Exposure0[]=
\r
664 static struct rk_sensor_reg sensor_Exposure1[]=
\r
669 static struct rk_sensor_reg sensor_Exposure2[]=
\r
674 static struct rk_sensor_reg sensor_Exposure3[]=
\r
679 static struct rk_sensor_reg sensor_Exposure4[]=
\r
684 static struct rk_sensor_reg sensor_Exposure5[]=
\r
690 static struct rk_sensor_reg sensor_Exposure6[]=
\r
695 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,
\r
696 sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,
\r
699 static struct rk_sensor_reg sensor_Saturation0[]=
\r
704 static struct rk_sensor_reg sensor_Saturation1[]=
\r
709 static struct rk_sensor_reg sensor_Saturation2[]=
\r
713 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};
\r
715 static struct rk_sensor_reg sensor_Contrast0[]=
\r
724 static struct rk_sensor_reg sensor_Contrast1[]=
\r
733 static struct rk_sensor_reg sensor_Contrast2[]=
\r
742 static struct rk_sensor_reg sensor_Contrast3[]=
\r
751 static struct rk_sensor_reg sensor_Contrast4[]=
\r
761 static struct rk_sensor_reg sensor_Contrast5[]=
\r
770 static struct rk_sensor_reg sensor_Contrast6[]=
\r
778 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,
\r
779 sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,
\r
781 static struct rk_sensor_reg sensor_SceneAuto[] =
\r
789 static struct rk_sensor_reg sensor_SceneNight[] =
\r
791 //30fps ~ 5fps night mode for 60/50Hz light environment, 24Mhz clock input,36Mzh pclk
\r
797 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};
\r
799 static struct rk_sensor_reg sensor_Zoom0[] =
\r
804 static struct rk_sensor_reg sensor_Zoom1[] =
\r
809 static struct rk_sensor_reg sensor_Zoom2[] =
\r
815 static struct rk_sensor_reg sensor_Zoom3[] =
\r
819 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
\r
822 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu
\r
824 static struct v4l2_querymenu sensor_menus[] =
\r
828 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl
\r
830 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =
\r
834 //MUST define the current used format as the first item
\r
835 static struct rk_sensor_datafmt sensor_colour_fmts[] = {
\r
836 {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG}
\r
838 static struct soc_camera_ops sensor_ops;
\r
842 **********************************************************
\r
843 * Following is local code:
\r
845 * Please codeing your program here
\r
846 **********************************************************
\r
848 static u16 GC2015_read_shutter(struct i2c_client *client); // add 2011-08-11 kim
\r
849 static void GC2015_set_shutter(struct i2c_client *client, u16 shutter); // add 2011-08-11 kim
\r
852 ////// add 2011-08-11 kim
\r
853 static u16 GC2015_read_shutter(struct i2c_client *client)
\r
855 u8 temp_reg1, temp_reg2;
\r
858 /* Backup the preview mode last shutter & sensor gain. */
\r
859 sensor_read(client, 0x03, &temp_reg1);
\r
860 sensor_read(client, 0x04, &temp_reg2);
\r
862 shutter = (temp_reg1 << 8) | (temp_reg2 & 0xFF);
\r
865 } /* GC2015_read_shutter */
\r
867 static void GC2015_set_shutter(struct i2c_client *client, u16 shutter)
\r
871 temp_reg = shutter * 10 / 20; ////
\r
873 /*Set Shutter start*/
\r
874 if(temp_reg < 1) temp_reg = 1;
\r
875 sensor_write(client ,0x03 , (temp_reg>>8)&0xff);
\r
876 sensor_write(client ,0x04 , temp_reg&0xff);
\r
877 /*Set Shutter end*/
\r
879 //////// end add kim
\r
881 **********************************************************
\r
882 * Following is callback
\r
883 * If necessary, you could coding these callback
\r
884 **********************************************************
\r
887 * the function is called in open sensor
\r
889 static int sensor_activate_cb(struct i2c_client *client)
\r
895 * the function is called in close sensor
\r
897 static int sensor_deactivate_cb(struct i2c_client *client)
\r
903 * the function is called before sensor register setting in VIDIOC_S_FMT
\r
905 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
907 struct generic_sensor *sensor = to_generic_sensor(client);
\r
908 struct specific_sensor *spsensor = to_specific_sensor(sensor);
\r
909 spsensor->shutter= GC2015_read_shutter(client); // add 2011-08-11 kim
\r
914 * the function is called after sensor register setting finished in VIDIOC_S_FMT
\r
916 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
918 struct generic_sensor *sensor = to_generic_sensor(client);
\r
919 struct specific_sensor *spsensor = to_specific_sensor(sensor);
\r
920 if(mf->width >=1024)
\r
921 GC2015_set_shutter(client, spsensor->shutter); // add 2011-08-11 kim
\r
924 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)
\r
929 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
934 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
938 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)
\r
940 //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
942 if (pm_msg.event == PM_EVENT_SUSPEND) {
\r
943 SENSOR_DG("Suspend");
\r
946 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);
\r
952 static int sensor_resume(struct soc_camera_device *icd)
\r
955 SENSOR_DG("Resume");
\r
960 static int sensor_mirror_cb (struct i2c_client *client, int mirror)
\r
965 SENSOR_DG("mirror: %d",mirror);
\r
967 sensor_write(client, 0xfe, 0);
\r
968 err = sensor_read(client, 0x29, &val);
\r
970 if((val & 0x1) == 0)
\r
971 err = sensor_write(client, 0x29, (val |0x1));
\r
973 err = sensor_write(client, 0x29, (val & 0xfe));
\r
982 * the function is v4l2 control V4L2_CID_HFLIP callback
\r
984 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
985 struct v4l2_ext_control *ext_ctrl)
\r
987 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
989 if (sensor_mirror_cb(client,ext_ctrl->value) != 0)
\r
990 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);
\r
992 SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);
\r
996 static int sensor_flip_cb(struct i2c_client *client, int flip)
\r
1001 SENSOR_DG("flip: %d",flip);
\r
1004 sensor_write(client, 0xfe, 0);
\r
1005 err = sensor_read(client, 0x29, &val);
\r
1007 if((val & 0x2) == 0)
\r
1008 err = sensor_write(client, 0x29, (val |0x2));
\r
1010 err = sensor_write(client, 0x29, (val & 0xfc));
\r
1019 * the function is v4l2 control V4L2_CID_VFLIP callback
\r
1021 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
1022 struct v4l2_ext_control *ext_ctrl)
\r
1024 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1026 if (sensor_flip_cb(client,ext_ctrl->value) != 0)
\r
1027 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);
\r
1029 SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);
\r
1033 * the functions are focus callbacks
\r
1035 static int sensor_focus_init_usr_cb(struct i2c_client *client){
\r
1039 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){
\r
1043 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){
\r
1047 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){
\r
1051 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos) {
\r
1055 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){
\r
1058 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1062 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){
\r
1066 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)
\r
1072 face defect call back
\r
1074 static int sensor_face_detect_usr_cb(struct i2c_client *client,int on){
\r
1079 * The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some
\r
1080 * initialization in the function.
\r
1082 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)
\r
1088 * :::::WARNING:::::
\r
1089 * It is not allowed to modify the following code
\r
1092 sensor_init_parameters_default_code();
\r
1094 sensor_v4l2_struct_initialization();
\r
1096 sensor_probe_default_code();
\r
1098 sensor_remove_default_code();
\r
1100 sensor_driver_default_module_code();
\r