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
12 static int debug =1;
\r
13 module_param(debug, int, S_IRUGO|S_IWUSR);
\r
15 #define dprintk(level, fmt, arg...) do { \
\r
16 if (debug >= level) \
\r
17 printk(KERN_WARNING fmt , ## arg); } while (0)
\r
19 /* Sensor Driver Configuration Begin */
\r
20 #define SENSOR_NAME RK29_CAM_SENSOR_GC0328
\r
21 #define SENSOR_V4L2_IDENT V4L2_IDENT_GC0328
\r
22 #define SENSOR_ID 0x9d
\r
23 #define SENSOR_BUS_PARAM (SOCAM_MASTER |\
\r
24 SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_LOW|\
\r
25 SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
\r
26 #define SENSOR_PREVIEW_W 640
\r
27 #define SENSOR_PREVIEW_H 480
\r
28 #define SENSOR_PREVIEW_FPS 15000 // 15fps
\r
29 #define SENSOR_FULLRES_L_FPS 7500 // 7.5fps
\r
30 #define SENSOR_FULLRES_H_FPS 7500 // 7.5fps
\r
31 #define SENSOR_720P_FPS 0
\r
32 #define SENSOR_1080P_FPS 0
\r
34 #define SENSOR_REGISTER_LEN 1 // sensor register address bytes
\r
35 #define SENSOR_VALUE_LEN 1 // sensor register value bytes
\r
36 static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect|CFG_Scene);
\r
37 /* Sensor Driver Configuration End */
\r
40 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))
\r
41 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)
\r
43 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)
\r
44 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
45 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
46 #define sensor_write_array generic_sensor_write_array
\r
48 struct sensor_parameter
\r
50 unsigned int PreviewDummyPixels;
\r
51 unsigned int CaptureDummyPixels;
\r
52 unsigned int preview_exposure;
\r
53 unsigned short int preview_line_width;
\r
54 unsigned short int preview_gain;
\r
56 unsigned short int PreviewPclk;
\r
57 unsigned short int CapturePclk;
\r
61 struct specific_sensor{
\r
62 struct generic_sensor common_sensor;
\r
63 //define user data below
\r
64 struct sensor_parameter parameter;
\r
69 * The follow setting need been filled.
\r
72 * sensor_init_data : Sensor initial setting;
\r
73 * sensor_fullres_lowfps_data : Sensor full resolution setting with best auality, recommand for video;
\r
74 * sensor_preview_data : Sensor preview resolution setting, recommand it is vga or svga;
\r
75 * sensor_softreset_data : Sensor software reset register;
\r
76 * sensor_check_id_data : Sensir chip id register;
\r
79 * sensor_fullres_highfps_data: Sensor full resolution setting with high framerate, recommand for video;
\r
80 * sensor_720p: Sensor 720p setting, it is for video;
\r
81 * sensor_1080p: Sensor 1080p setting, it is for video;
\r
84 * The SensorEnd which is the setting end flag must be filled int the last of each setting;
\r
86 static unsigned int SensorChipID[] = {SENSOR_ID};
\r
87 /* Sensor initial setting */
\r
88 static struct rk_sensor_reg sensor_init_data[] ={
\r
91 {0xfc , 0x16}, //clock enable
\r
92 {0xfc , 0x16}, //clock enable
\r
93 {0xfc , 0x16}, //clock enable
\r
94 {0xfc , 0x16}, //clock enable
\r
99 {0x4c , 0x01}, //AWB Buffer reset
\r
103 {0x0d , 0x01}, //{8}cis_win_height 486 1e6
\r
104 {0x0e , 0xe8}, //{7:0}cis_win_height
\r
105 {0x0f , 0x02}, //{9:8}cis_win_width 646 286
\r
106 {0x10 , 0x88}, //{7:0}cis_win_width
\r
107 {0x09 , 0x00}, //row_start
\r
109 {0x0b , 0x00}, //col_start
\r
112 {0x17 , 0x14}, //[7]hsync_always, [6]close_2_frame_dbrow, [5:4]CFA_seqence, [3:2]dark_CFA_seqence, [1]updown, [0]mirror
\r
113 {0x19 , 0x06}, //AD Pipe line number
\r
114 {0x1f , 0xC8}, //txlow
\r
116 {0x21 , 0x78}, //68
\r
121 {0x50 , 0x01}, //crop mode
\r
123 //global gain for range
\r
126 ////////////////////////////////////////////////
\r
127 //////////// BLK //////////////////////
\r
128 ////////////////////////////////////////////////
\r
130 {0x28 , 0x7F}, //BLK LIMIT
\r
131 {0x29 , 0x20}, //global offset
\r
132 {0x33 , 0x1A},//offset_ratio_G1
\r
133 {0x34 , 0x1A}, //offset_ratio_R
\r
145 ////////////////////////////////////////////////
\r
146 //////////// block enable /////////////
\r
147 ////////////////////////////////////////////////
\r
157 {0x50 , 0x01}, //crop mode
\r
161 {0x7f , 0x03}, //c3 //1D DN
\r
163 {0x82 , 0x85}, //8f//bilt_base_b
\r
164 {0x83 , 0x02}, //02 //DN C weight
\r
174 {0xd2 , 0x38}, // cb,cr saturation
\r
176 {0xde , 0x38}, //autogray_mode
\r
219 {0x97 , 0x30}, //Y offset TH
\r
220 {0xa4 , 0x10}, //ASDE auto sa slope
\r
221 {0xa8 , 0x80}, //ASDE LSC SLOPE
\r
222 {0x9c , 0x60}, //auto Y offset Slope
\r
224 {0xad , 0x01}, //ASDE ee,ddMODE
\r
225 {0x9c , 0x01}, //ABS manual K
\r
228 {0x9c , 0x00}, //ABS manual K
\r
232 {0x10 , 0x08},//[7]win_mode,[6]show_mode [3]measure_point
\r
234 {0x11 , 0x21}, //[7]fix target
\r
236 {0x13 , 0x45}, //AEC Y target
\r
237 {0x15 , 0xfc}, //high range for count
\r
238 {0x21 , 0xf0}, //c0 //post_gain limit
\r
240 {0x23 , 0x30},//20 //dggain max
\r
242 {0x24 , 0x14}, //Max index
\r
251 {0x56 , 0x18}, //18
\r
254 {0xb2 , 0xdc}, //R2G STAND
\r
255 {0x7c , 0x71}, //AWB speed,AWB margin
\r
256 {0x7d , 0x10}, //AWB every N
\r
257 {0x76 , 0x8f}, //move mode en,Move mode TH
\r
287 {0xfe , 0x00}, //page0
\r
336 {0xB1 , 0x08},// 40
\r
356 //GC0328_SET_PAGE1,
\r
357 {0x29, 0x00}, //anti-flicker step [11:8]
\r
358 {0x2a, 0x60}, //anti-flicker step [7:0]
\r
360 {0x2b, 0x02}, //exp level 0 14.28fps
\r
362 {0x2d, 0x03}, //exp level 1 12.50fps
\r
364 {0x2f, 0x03}, //exp level 2 10.00fps
\r
366 {0x31, 0x05}, //exp level 3 7.14fps
\r
372 //-------------H_V_Switch(4)---------------//
\r
376 /*GC0328_H_V_Switch,
\r
381 2: // IMAGE_H_MIRROR
\r
384 3: // IMAGE_V_MIRROR
\r
387 4: // IMAGE_HV_MIRROR
\r
390 //-------------H_V_Select End--------------//
\r
393 /* Senor full resolution setting: recommand for capture */
\r
394 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={
\r
399 /* Senor full resolution setting: recommand for video */
\r
400 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={
\r
403 /* Preview resolution setting*/
\r
404 static struct rk_sensor_reg sensor_preview_data[] =
\r
410 static struct rk_sensor_reg sensor_720p[]={
\r
415 static struct rk_sensor_reg sensor_1080p[]={
\r
420 static struct rk_sensor_reg sensor_softreset_data[]={
\r
424 static struct rk_sensor_reg sensor_check_id_data[]={
\r
425 SensorRegVal(0xf0,0),
\r
429 * The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx
\r
431 static struct rk_sensor_reg sensor_WhiteB_Auto[]=
\r
440 /* Cloudy Colour Temperature : 6500K - 8000K */
\r
441 static struct rk_sensor_reg sensor_WhiteB_Cloudy[]=
\r
444 {0x42, 0x55}, // Disable AWB
\r
450 /* ClearDay Colour Temperature : 5000K - 6500K */
\r
451 static struct rk_sensor_reg sensor_WhiteB_ClearDay[]=
\r
455 {0x42, 0x55}, // Disable AWB
\r
461 /* Office Colour Temperature : 3500K - 5000K */
\r
462 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=
\r
466 {0x42, 0x55}, // Disable AWB
\r
473 /* Home Colour Temperature : 2500K - 3500K */
\r
474 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=
\r
478 {0x42, 0x55}, // Disable AWB
\r
484 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,
\r
485 sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,
\r
488 static struct rk_sensor_reg sensor_Brightness0[]=
\r
496 static struct rk_sensor_reg sensor_Brightness1[]=
\r
504 static struct rk_sensor_reg sensor_Brightness2[]=
\r
512 static struct rk_sensor_reg sensor_Brightness3[]=
\r
520 static struct rk_sensor_reg sensor_Brightness4[]=
\r
528 static struct rk_sensor_reg sensor_Brightness5[]=
\r
535 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,
\r
536 sensor_Brightness4, sensor_Brightness5,NULL,
\r
539 static struct rk_sensor_reg sensor_Effect_Normal[] =
\r
545 static struct rk_sensor_reg sensor_Effect_WandB[] =
\r
553 static struct rk_sensor_reg sensor_Effect_Sepia[] =
\r
561 static struct rk_sensor_reg sensor_Effect_Negative[] =
\r
567 static struct rk_sensor_reg sensor_Effect_Bluish[] =
\r
576 static struct rk_sensor_reg sensor_Effect_Green[] =
\r
585 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,
\r
586 sensor_Effect_Bluish, sensor_Effect_Green,NULL,
\r
589 static struct rk_sensor_reg sensor_Exposure0[]=
\r
597 static struct rk_sensor_reg sensor_Exposure1[]=
\r
605 static struct rk_sensor_reg sensor_Exposure2[]=
\r
613 static struct rk_sensor_reg sensor_Exposure3[]=
\r
621 static struct rk_sensor_reg sensor_Exposure4[]=
\r
629 static struct rk_sensor_reg sensor_Exposure5[]=
\r
638 static struct rk_sensor_reg sensor_Exposure6[]=
\r
646 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,
\r
647 sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,
\r
650 static struct rk_sensor_reg sensor_Saturation0[]=
\r
655 static struct rk_sensor_reg sensor_Saturation1[]=
\r
660 static struct rk_sensor_reg sensor_Saturation2[]=
\r
664 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};
\r
666 static struct rk_sensor_reg sensor_Contrast0[]=
\r
673 static struct rk_sensor_reg sensor_Contrast1[]=
\r
680 static struct rk_sensor_reg sensor_Contrast2[]=
\r
687 static struct rk_sensor_reg sensor_Contrast3[]=
\r
694 static struct rk_sensor_reg sensor_Contrast4[]=
\r
702 static struct rk_sensor_reg sensor_Contrast5[]=
\r
709 static struct rk_sensor_reg sensor_Contrast6[]=
\r
715 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,
\r
716 sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,
\r
718 static struct rk_sensor_reg sensor_SceneAuto[] =
\r
726 static struct rk_sensor_reg sensor_SceneNight[] =
\r
733 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};
\r
735 static struct rk_sensor_reg sensor_Zoom0[] =
\r
740 static struct rk_sensor_reg sensor_Zoom1[] =
\r
745 static struct rk_sensor_reg sensor_Zoom2[] =
\r
751 static struct rk_sensor_reg sensor_Zoom3[] =
\r
755 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
\r
758 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu
\r
760 static struct v4l2_querymenu sensor_menus[] =
\r
764 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl
\r
766 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =
\r
770 //MUST define the current used format as the first item
\r
771 static struct rk_sensor_datafmt sensor_colour_fmts[] = {
\r
772 {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}
\r
774 static struct soc_camera_ops sensor_ops;
\r
778 **********************************************************
\r
779 * Following is local code:
\r
781 * Please codeing your program here
\r
782 **********************************************************
\r
785 **********************************************************
\r
786 * Following is callback
\r
787 * If necessary, you could coding these callback
\r
788 **********************************************************
\r
791 * the function is called in open sensor
\r
793 static int sensor_activate_cb(struct i2c_client *client)
\r
799 * the function is called in close sensor
\r
801 static int sensor_deactivate_cb(struct i2c_client *client)
\r
807 * the function is called before sensor register setting in VIDIOC_S_FMT
\r
809 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
815 * the function is called after sensor register setting finished in VIDIOC_S_FMT
\r
817 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
821 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)
\r
826 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
831 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
835 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)
\r
837 //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
839 if (pm_msg.event == PM_EVENT_SUSPEND) {
\r
840 SENSOR_DG("Suspend");
\r
843 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);
\r
849 static int sensor_resume(struct soc_camera_device *icd)
\r
852 SENSOR_DG("Resume");
\r
857 static int sensor_mirror_cb (struct i2c_client *client, int mirror)
\r
862 SENSOR_DG("mirror: %d",mirror);
\r
864 sensor_write(client, 0xfe, 0);
\r
865 err = sensor_read(client, 0x17, &val);
\r
868 if((val & 0x1) == 0){
\r
869 err = sensor_write(client, 0x17, ((val |0x1)+4));
\r
872 err = sensor_write(client, 0x17, ((val & 0xfe)+4));
\r
881 * the function is v4l2 control V4L2_CID_HFLIP callback
\r
883 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
884 struct v4l2_ext_control *ext_ctrl)
\r
886 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
888 if (sensor_mirror_cb(client,ext_ctrl->value) != 0)
\r
889 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);
\r
891 SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);
\r
895 static int sensor_flip_cb(struct i2c_client *client, int flip)
\r
900 SENSOR_DG("flip: %d",flip);
\r
903 sensor_write(client, 0xfe, 0);
\r
904 err = sensor_read(client, 0x17, &val);
\r
907 if((val & 0x2) == 0){
\r
908 err = sensor_write(client, 0x17, ((val |0x2)+4));
\r
911 err = sensor_write(client, 0x17, ((val & 0xfc)+4));
\r
921 * the function is v4l2 control V4L2_CID_VFLIP callback
\r
923 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
924 struct v4l2_ext_control *ext_ctrl)
\r
926 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
928 if (sensor_flip_cb(client,ext_ctrl->value) != 0)
\r
929 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);
\r
931 SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);
\r
935 * the functions are focus callbacks
\r
937 static int sensor_focus_init_usr_cb(struct i2c_client *client){
\r
941 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){
\r
945 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){
\r
949 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){
\r
953 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos)
\r
958 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){
\r
961 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
965 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){
\r
969 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)
\r
975 face defect call back
\r
977 static int sensor_face_detect_usr_cb(struct i2c_client *client,int on){
\r
982 * The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some
\r
983 * initialization in the function.
\r
985 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)
\r
991 * :::::WARNING:::::
\r
992 * It is not allowed to modify the following code
\r
995 sensor_init_parameters_default_code();
\r
997 sensor_v4l2_struct_initialization();
\r
999 sensor_probe_default_code();
\r
1001 sensor_remove_default_code();
\r
1003 sensor_driver_default_module_code();
\r