2 #include "generic_sensor.h"
\r
5 * Driver Version Note
\r
6 *v0.0.1: this driver is compatible with generic_sensor
\r
8 * add sensor_focus_af_const_pause_usr_cb;
\r
10 static int version = KERNEL_VERSION(0,0,3);
\r
11 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_GC0329
\r
23 #define SENSOR_V4L2_IDENT V4L2_IDENT_GC0329
\r
24 #define SENSOR_ID 0xc0
\r
25 #define SENSOR_BUS_PARAM (SOCAM_MASTER |\
\r
26 SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_HIGH|\
\r
27 SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
\r
28 #define SENSOR_PREVIEW_W 640
\r
29 #define SENSOR_PREVIEW_H 480
\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
72 * The follow setting need been filled.
\r
75 * sensor_init_data : Sensor initial setting;
\r
76 * sensor_fullres_lowfps_data : Sensor full resolution setting with best auality, recommand for video;
\r
77 * sensor_preview_data : Sensor preview resolution setting, recommand it is vga or svga;
\r
78 * sensor_softreset_data : Sensor software reset register;
\r
79 * sensor_check_id_data : Sensir chip id register;
\r
82 * sensor_fullres_highfps_data: Sensor full resolution setting with high framerate, recommand for video;
\r
83 * sensor_720p: Sensor 720p setting, it is for video;
\r
84 * sensor_1080p: Sensor 1080p setting, it is for video;
\r
87 * The SensorEnd which is the setting end flag must be filled int the last of each setting;
\r
90 /* Sensor initial setting */
\r
91 static struct rk_sensor_reg sensor_init_data[] ={
\r
92 // TODO: add initial code here
\r
95 {0xfc, 0x12}, //[4]Clock_en [2] A25_en [1]D18_en [0]Apwdn
\r
97 {0xf0, 0x07}, //vsync_en
\r
98 {0xf1, 0x01}, //data_en
\r
100 {0x73, 0x90}, //R channle gain
\r
101 {0x74, 0x80}, //G1 channle gain
\r
102 {0x75, 0x80}, //G2 channle gain
\r
103 {0x76, 0x94}, //B channle gain
\r
111 ////////////////////analog////////////////////
\r
114 {0x0a, 0x00}, //row_start_low
\r
115 {0x0c, 0x00}, //col_start_low
\r
116 {0x17, 0x14}, //cisctl_mode1//[7]hsync_always },[6] NA}, [5:4] CFA sequence [3:2]NA, [1]upside_down, [0] mirror
\r
117 //[3:2]NA [1]upside_down}, [0] mirror
\r
119 {0x19, 0x05}, //cisctl_mode3
\r
120 {0x1b, 0x24}, //rsh_width
\r
121 {0x1c, 0x04}, //Tsp_width
\r
122 {0x1e, 0x00}, //Analog_mode1//[7:6]rsv1},rsv0[5:3] Column bias(coln_r)[1] clk_delay_en
\r
123 {0x1f, 0xc0}, //Analog_mode2//[7:6] comv_r
\r
124 {0x20, 0x00}, //Analog_mode3//[6:4] cap_low_r for MPW [3:2] da18_r [1] rowclk_mode [0]adclk_mode
\r
125 {0x21, 0x48}, //Hrst_rsg//[7] hrst[6:4] da_rsg[3]txhigh_en
\r
126 {0x23, 0x22}, //ADC_r//[6:5]opa_r [1:0]sRef
\r
127 {0x24, 0x16}, //PAD_drv//[7:6]NA},[5:4]sync_drv [3:2]data_drv [1:0]pclk_drv
\r
130 ////////////////////blk////////////////////
\r
138 ////////////////////ISP BLOCK ENABLE////////////////////
\r
142 {0x46, 0x03}, //sync mode
\r
146 {0x70, 0x48},//global gain
\r
153 ////////////////////DNDD////////////////////
\r
154 {0x80, 0xe7}, //[7]auto_en [6]one_pixel [5]two_pixel
\r
158 ////////////////////ASDE////////////////////
\r
160 {0x18, 0x22}, //[7:4]AWB LUMA X [3:0]ASDE LUMA X
\r
161 {0xfe, 0x00},//ASDE dn b slope
\r
162 {0x9c, 0x0a}, //ASDE dn b slope
\r
163 {0xa4, 0x50}, // Auto Sa slope
\r
164 {0xa5, 0x21}, // [7:4]Saturation limit x10
\r
165 {0xa7, 0x35}, //low luma value th
\r
166 {0xdd, 0x54}, //edge dec sat enable & slopes
\r
167 {0x95, 0x35}, //Edge effect
\r
169 ////////////////////RGB gamma////////////////////
\r
189 //////////////////CC///////////////////
\r
213 ////////////////////YCP////////////////////
\r
215 {0xd1, 0x34}, //saturation Cb
\r
216 {0xd2, 0x34}, //saturation Cr
\r
218 ////////////////////AEC////////////////////
\r
223 {0x13, 0x50}, //Y target
\r
231 ////////////////////AWB////////////////////
\r
290 {0x50,0xfc}, //RGB high
\r
291 {0x51,0x28}, //Y2C diff
\r
293 {0x53,0x08},// //1d //20//
\r
294 {0x54,0x12}, //16 //30//C inter
\r
296 {0x56,0x10}, //20//60
\r
297 {0x58,0x80}, //a0//60//number limit X4
\r
298 {0x59,0x08}, //0c //08 //AWB adjust temp curve //0c
\r
299 {0x5a,0x02}, //01 //03//25//[3:0]light gain range x10
\r
301 {0x5c,0x34}, //37 //show and mode [2]big C mode [1]dark mode [0] block move mode
\r
302 {0x5d,0x73}, //72 //52//AWB margin
\r
303 {0x5e,0x29}, //11 //20 //11 //19//temp curve_enable
\r
304 {0x5f,0x40}, //5K gain
\r
305 {0x60,0x40}, //5K gain
\r
306 {0x61,0xc8}, //sinT
\r
307 {0x62,0xa0}, //cosT
\r
308 {0x63,0x40}, //38//30//AWB X1 cut
\r
309 {0x64,0x38}, //50 //38 //30 //20 //40 //50 //60//AWB X2 cut
\r
310 {0x65,0x98}, //a0 //98 //a0//AWB Y1 cut
\r
311 {0x66,0xfa}, //ea//AWB Y2 cut
\r
312 {0x67,0x80}, //70 //AWB R gain limit
\r
313 {0x68,0x60}, //58 //58 //AWB G gain Limit
\r
314 {0x69,0x90}, //85 //7d //AWB B gain limit
\r
318 {0x6d,0x28}, //40//80
\r
319 {0x6e,0x41}, //outdoor gain limit enable [7]use exp or luma value to adjust outdoor
\r
320 {0x70,0x10}, //50 //10
\r
321 {0x71,0x00}, //when outdoor , add high luma gray pixel weight
\r
323 {0x73,0x40}, //95// when exp < th, outdoor mode open
\r
324 {0x80,0x70}, //R gain high limit
\r
325 {0x81,0x58}, //G gain high limit
\r
326 {0x82,0x42}, //B gain high limit
\r
327 {0x83,0x40}, //R gain low limit
\r
328 {0x84,0x40}, //G gain low limit
\r
329 {0x85,0x40}, //B gain low limit
\r
339 {0x53, 0x0b}, // 1d
\r
377 {0x80, 0x70},//4// 4a
\r
390 ////////////////////CC-AWB////////////////////
\r
395 ///////////////////ABS///////////////////////
\r
399 ///////////////////LSC //////////////////////
\r
400 //// for xuye062d lens setting
\r
448 ////////////////////asde ///////////////////
\r
452 {0x44, 0xa2}, // YUV order
\r
456 /* Senor full resolution setting: recommand for capture */
\r
457 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={
\r
461 /* Senor full resolution setting: recommand for video */
\r
462 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={
\r
465 /* Preview resolution setting*/
\r
466 static struct rk_sensor_reg sensor_preview_data[] =
\r
471 static struct rk_sensor_reg sensor_720p[]={
\r
476 static struct rk_sensor_reg sensor_1080p[]={
\r
481 static struct rk_sensor_reg sensor_softreset_data[]={
\r
485 static struct rk_sensor_reg sensor_check_id_data[]={
\r
489 * The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx
\r
491 static struct rk_sensor_reg sensor_WhiteB_Auto[]=
\r
499 /* Cloudy Colour Temperature : 6500K - 8000K */
\r
500 static struct rk_sensor_reg sensor_WhiteB_Cloudy[]=
\r
503 {0x77, 0x8c}, //WB_manual_gain
\r
508 /* ClearDay Colour Temperature : 5000K - 6500K */
\r
509 static struct rk_sensor_reg sensor_WhiteB_ClearDay[]=
\r
518 /* Office Colour Temperature : 3500K - 5000K */
\r
519 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=
\r
529 /* Home Colour Temperature : 2500K - 3500K */
\r
530 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=
\r
539 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,
\r
540 sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,
\r
543 static struct rk_sensor_reg sensor_Brightness0[]=
\r
554 static struct rk_sensor_reg sensor_Brightness1[]=
\r
566 static struct rk_sensor_reg sensor_Brightness2[]=
\r
579 static struct rk_sensor_reg sensor_Brightness3[]=
\r
591 static struct rk_sensor_reg sensor_Brightness4[]=
\r
603 static struct rk_sensor_reg sensor_Brightness5[]=
\r
614 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,
\r
615 sensor_Brightness4, sensor_Brightness5,NULL,
\r
618 static struct rk_sensor_reg sensor_Effect_Normal[] =
\r
624 static struct rk_sensor_reg sensor_Effect_WandB[] =
\r
633 static struct rk_sensor_reg sensor_Effect_Sepia[] =
\r
641 static struct rk_sensor_reg sensor_Effect_Negative[] =
\r
647 static struct rk_sensor_reg sensor_Effect_Bluish[] =
\r
656 static struct rk_sensor_reg sensor_Effect_Green[] =
\r
665 static struct rk_sensor_reg sensor_Effect_Grayscale[]=
\r
680 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,
\r
681 sensor_Effect_Bluish, sensor_Effect_Green,NULL,
\r
684 static struct rk_sensor_reg sensor_Exposure0[]=
\r
691 static struct rk_sensor_reg sensor_Exposure1[]=
\r
697 static struct rk_sensor_reg sensor_Exposure2[]=
\r
703 static struct rk_sensor_reg sensor_Exposure3[]=
\r
709 static struct rk_sensor_reg sensor_Exposure4[]=
\r
715 static struct rk_sensor_reg sensor_Exposure5[]=
\r
722 static struct rk_sensor_reg sensor_Exposure6[]=
\r
728 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,
\r
729 sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,
\r
732 static struct rk_sensor_reg sensor_Saturation0[]=
\r
737 static struct rk_sensor_reg sensor_Saturation1[]=
\r
742 static struct rk_sensor_reg sensor_Saturation2[]=
\r
746 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};
\r
748 static struct rk_sensor_reg sensor_Contrast0[]=
\r
754 static struct rk_sensor_reg sensor_Contrast1[]=
\r
760 static struct rk_sensor_reg sensor_Contrast2[]=
\r
766 static struct rk_sensor_reg sensor_Contrast3[]=
\r
772 static struct rk_sensor_reg sensor_Contrast4[]=
\r
779 static struct rk_sensor_reg sensor_Contrast5[]=
\r
785 static struct rk_sensor_reg sensor_Contrast6[]=
\r
790 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,
\r
791 sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,
\r
793 static struct rk_sensor_reg sensor_SceneAuto[] =
\r
801 static struct rk_sensor_reg sensor_SceneNight[] =
\r
808 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};
\r
810 static struct rk_sensor_reg sensor_Zoom0[] =
\r
815 static struct rk_sensor_reg sensor_Zoom1[] =
\r
820 static struct rk_sensor_reg sensor_Zoom2[] =
\r
826 static struct rk_sensor_reg sensor_Zoom3[] =
\r
830 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
\r
833 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu
\r
835 static struct v4l2_querymenu sensor_menus[] =
\r
839 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl
\r
841 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =
\r
845 //MUST define the current used format as the first item
\r
846 static struct rk_sensor_datafmt sensor_colour_fmts[] = {
\r
847 {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}
\r
849 static struct soc_camera_ops sensor_ops;
\r
853 **********************************************************
\r
854 * Following is local code:
\r
856 * Please codeing your program here
\r
857 **********************************************************
\r
860 **********************************************************
\r
861 * Following is callback
\r
862 * If necessary, you could coding these callback
\r
863 **********************************************************
\r
866 * the function is called in open sensor
\r
868 static int sensor_activate_cb(struct i2c_client *client)
\r
874 * the function is called in close sensor
\r
876 static int sensor_deactivate_cb(struct i2c_client *client)
\r
882 * the function is called before sensor register setting in VIDIOC_S_FMT
\r
884 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
890 * the function is called after sensor register setting finished in VIDIOC_S_FMT
\r
892 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
896 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)
\r
901 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
906 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
910 struct generic_sensor *sensor = to_generic_sensor(client);
\r
912 /* check if it is an sensor sensor */
\r
913 ret = sensor_write(client, 0xfc, 0x16); //before read id should write 0xfc
\r
915 ret = sensor_read(client, 0x00, &pid);
\r
917 SENSOR_TR("%s read chip id high byte failed\n",SENSOR_NAME_STRING());
\r
920 SENSOR_DG("\n %s pid = 0x%x\n", SENSOR_NAME_STRING(), pid);
\r
921 if (pid == SENSOR_ID) {
\r
922 sensor->model = SENSOR_V4L2_IDENT;
\r
924 SENSOR_TR("error: %s mismatched pid = 0x%x\n", SENSOR_NAME_STRING(), pid);
\r
929 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)
\r
931 //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
933 if (pm_msg.event == PM_EVENT_SUSPEND) {
\r
934 SENSOR_DG("Suspend");
\r
937 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);
\r
943 static int sensor_resume(struct soc_camera_device *icd)
\r
946 SENSOR_DG("Resume");
\r
951 static int sensor_mirror_cb (struct i2c_client *client, int mirror)
\r
956 SENSOR_DG("mirror: %d",mirror);
\r
958 sensor_write(client, 0xfe, 0);
\r
959 err = sensor_read(client, 0x17, &val);
\r
961 if((val & 0x1) == 0)
\r
962 err = sensor_write(client, 0x17, (val |0x1));
\r
964 err = sensor_write(client, 0x17, (val & 0xfe));
\r
973 * the function is v4l2 control V4L2_CID_HFLIP callback
\r
975 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
976 struct v4l2_ext_control *ext_ctrl)
\r
978 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
980 if (sensor_mirror_cb(client,ext_ctrl->value) != 0)
\r
981 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);
\r
983 SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);
\r
987 static int sensor_flip_cb(struct i2c_client *client, int flip)
\r
992 SENSOR_DG("flip: %d",flip);
\r
994 sensor_write(client, 0xfe, 0);
\r
995 err = sensor_read(client, 0x17, &val);
\r
997 if((val & 0x2) == 0)
\r
998 err = sensor_write(client, 0x17, (val |0x2));
\r
1000 err = sensor_write(client, 0x17, (val & 0xfc));
\r
1009 * the function is v4l2 control V4L2_CID_VFLIP callback
\r
1011 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
1012 struct v4l2_ext_control *ext_ctrl)
\r
1014 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1016 if (sensor_flip_cb(client,ext_ctrl->value) != 0)
\r
1017 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);
\r
1019 SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);
\r
1023 * the functions are focus callbacks
\r
1025 static int sensor_focus_init_usr_cb(struct i2c_client *client){
\r
1029 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){
\r
1033 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){
\r
1037 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){
\r
1041 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){
\r
1045 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){
\r
1048 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1052 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){
\r
1056 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)
\r
1062 face defect call back
\r
1064 static int sensor_face_detect_usr_cb(struct i2c_client *client,int on){
\r
1069 * The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some
\r
1070 * initialization in the function.
\r
1072 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)
\r
1078 * :::::WARNING:::::
\r
1079 * It is not allowed to modify the following code
\r
1082 sensor_init_parameters_default_code();
\r
1084 sensor_v4l2_struct_initialization();
\r
1086 sensor_probe_default_code();
\r
1088 sensor_remove_default_code();
\r
1090 sensor_driver_default_module_code();
\r