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,1,1);
\r
10 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_NT99240
\r
21 #define SENSOR_V4L2_IDENT V4L2_IDENT_NT99240
\r
22 #define SENSOR_ID 0x2400
\r
23 #define SENSOR_BUS_PARAM (SOCAM_MASTER |\
\r
24 SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_HIGH|\
\r
25 SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
\r
26 #define SENSOR_PREVIEW_W 800
\r
27 #define SENSOR_PREVIEW_H 600
\r
28 #define SENSOR_PREVIEW_FPS 15000 // 15fps
\r
29 #define SENSOR_FULLRES_L_FPS 5000 // 5fps
\r
30 #define SENSOR_FULLRES_H_FPS 10000 // 10fps
\r
31 #define SENSOR_720P_FPS 15000
\r
32 #define SENSOR_1080P_FPS 0
\r
34 #define SENSOR_REGISTER_LEN 2 // sensor register address bytes
\r
35 #define SENSOR_VALUE_LEN 1 // sensor register value bytes
\r
37 static unsigned int SensorConfiguration = 0;
\r
38 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_dr;
\r
58 unsigned short int preview_gain_ar;
\r
59 unsigned short int preview_gain_dgr;
\r
60 unsigned short int preview_gain_agr;
\r
61 unsigned short int preview_gain_dgb;
\r
62 unsigned short int preview_gain_agb;
\r
63 unsigned short int preview_gain_db;
\r
64 unsigned short int preview_gain_ab;
\r
65 unsigned short int preview_gain_dglobal;
\r
66 unsigned short int preview_gain_aglobal;
\r
67 unsigned short int preview_awb_r;
\r
68 unsigned short int preview_awb_b;
\r
71 unsigned short int PreviewPclk;
\r
72 unsigned short int CapturePclk;
\r
76 struct specific_sensor{
\r
77 struct generic_sensor common_sensor;
\r
78 //define user data below
\r
79 struct sensor_parameter parameter;
\r
84 * The follow setting need been filled.
\r
87 * sensor_init_data : Sensor initial setting;
\r
88 * sensor_fullres_lowfps_data : Sensor full resolution setting with best auality, recommand for video;
\r
89 * sensor_preview_data : Sensor preview resolution setting, recommand it is vga or svga;
\r
90 * sensor_softreset_data : Sensor software reset register;
\r
91 * sensor_check_id_data : Sensir chip id register;
\r
94 * sensor_fullres_highfps_data: Sensor full resolution setting with high framerate, recommand for video;
\r
95 * sensor_720p: Sensor 720p setting, it is for video;
\r
96 * sensor_1080p: Sensor 1080p setting, it is for video;
\r
99 * The SensorEnd which is the setting end flag must be filled int the last of each setting;
\r
102 /* Sensor initial setting */
\r
103 static struct rk_sensor_reg sensor_init_data[] ={
\r
219 /* Senor full resolution setting: recommand for capture */
\r
220 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={
\r
258 /* Senor full resolution setting: recommand for video */
\r
259 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={
\r
297 /* Preview resolution setting*/
\r
298 static struct rk_sensor_reg sensor_preview_data[] =
\r
346 static struct rk_sensor_reg sensor_720p[]={
\r
386 static struct rk_sensor_reg sensor_1080p[]={
\r
391 static struct rk_sensor_reg sensor_softreset_data[]={
\r
392 SensorRegVal(0x3021,0x61),
\r
396 static struct rk_sensor_reg sensor_check_id_data[]={
\r
397 SensorRegVal(0x3000,0),
\r
398 SensorRegVal(0x3001,0),
\r
402 * The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx
\r
404 static struct rk_sensor_reg sensor_WhiteB_Auto[]=
\r
409 /* Cloudy Colour Temperature : 6500K - 8000K */
\r
410 static struct rk_sensor_reg sensor_WhiteB_Cloudy[]=
\r
420 /* ClearDay Colour Temperature : 5000K - 6500K */
\r
421 static struct rk_sensor_reg sensor_WhiteB_ClearDay[]=
\r
431 /* Office Colour Temperature : 3500K - 5000K */
\r
432 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=
\r
434 //[WB-INCANDESCENCE]
\r
443 /* Home Colour Temperature : 2500K - 3500K */
\r
444 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=
\r
454 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp3[]=
\r
465 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,
\r
466 sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy, sensor_WhiteB_TungstenLamp3,NULL,
\r
469 static struct rk_sensor_reg sensor_Brightness0[]=
\r
475 static struct rk_sensor_reg sensor_Brightness1[]=
\r
482 static struct rk_sensor_reg sensor_Brightness2[]=
\r
489 static struct rk_sensor_reg sensor_Brightness3[]=
\r
496 static struct rk_sensor_reg sensor_Brightness4[]=
\r
503 static struct rk_sensor_reg sensor_Brightness5[]=
\r
509 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,
\r
510 sensor_Brightness4, sensor_Brightness5,NULL,
\r
513 static struct rk_sensor_reg sensor_Effect_Normal[] =
\r
519 static struct rk_sensor_reg sensor_Effect_WandB[] =
\r
525 static struct rk_sensor_reg sensor_Effect_Sepia[] =
\r
532 static struct rk_sensor_reg sensor_Effect_Inverse[] =
\r
538 static struct rk_sensor_reg sensor_Effect_Bluish[] =
\r
547 static struct rk_sensor_reg sensor_Effect_Green[] =
\r
556 static struct rk_sensor_reg sensor_Effect_Solarization[] =
\r
559 //[SE-Solarization]
\r
565 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Inverse,sensor_Effect_Sepia,
\r
566 sensor_Effect_Bluish, sensor_Effect_Green,sensor_Effect_Solarization,NULL,
\r
569 static struct rk_sensor_reg sensor_Exposure04[]=
\r
577 static struct rk_sensor_reg sensor_Exposure03[]=
\r
585 static struct rk_sensor_reg sensor_Exposure02[]=
\r
593 static struct rk_sensor_reg sensor_Exposure01[]=
\r
601 static struct rk_sensor_reg sensor_Exposure00[]=
\r
610 static struct rk_sensor_reg sensor_Exposure11[]=
\r
618 static struct rk_sensor_reg sensor_Exposure12[]=
\r
626 static struct rk_sensor_reg sensor_Exposure13[]=
\r
634 static struct rk_sensor_reg sensor_Exposure14[]=
\r
642 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure04,sensor_Exposure03, sensor_Exposure02, sensor_Exposure01, sensor_Exposure00,
\r
643 sensor_Exposure11, sensor_Exposure12,sensor_Exposure13,sensor_Exposure14,NULL,
\r
646 static struct rk_sensor_reg sensor_Saturation0[]=
\r
651 static struct rk_sensor_reg sensor_Saturation1[]=
\r
656 static struct rk_sensor_reg sensor_Saturation2[]=
\r
660 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};
\r
662 static struct rk_sensor_reg sensor_Contrast04[]=
\r
671 static struct rk_sensor_reg sensor_Contrast03[]=
\r
680 static struct rk_sensor_reg sensor_Contrast02[]=
\r
689 static struct rk_sensor_reg sensor_Contrast01[]=
\r
698 static struct rk_sensor_reg sensor_Contrast00[]=
\r
707 static struct rk_sensor_reg sensor_Contrast11[]=
\r
717 static struct rk_sensor_reg sensor_Contrast12[]=
\r
726 static struct rk_sensor_reg sensor_Contrast13[]=
\r
735 static struct rk_sensor_reg sensor_Contrast14[]=
\r
744 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast04, sensor_Contrast03, sensor_Contrast02, sensor_Contrast01,
\r
745 sensor_Contrast00, sensor_Contrast11, sensor_Contrast12, sensor_Contrast13, sensor_Contrast14,NULL,
\r
748 static struct rk_sensor_reg sensor_SceneAuto[] =
\r
753 static struct rk_sensor_reg sensor_SceneNight[] =
\r
757 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};
\r
759 static struct rk_sensor_reg sensor_Zoom0[] =
\r
764 static struct rk_sensor_reg sensor_Zoom1[] =
\r
769 static struct rk_sensor_reg sensor_Zoom2[] =
\r
775 static struct rk_sensor_reg sensor_Zoom3[] =
\r
779 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
\r
782 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu
\r
784 static struct v4l2_querymenu sensor_menus[] =
\r
787 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,0,"auto",0),
\r
788 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,1,"incandescent",0),
\r
789 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,2,"fluorescent",0),
\r
790 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,3,"daylight",0),
\r
791 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,4,"cloudy-daylight",0),
\r
792 new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,5,"tungsten",0),
\r
795 new_usr_v4l2menu(V4L2_CID_EFFECT,0,"none",0),
\r
796 new_usr_v4l2menu(V4L2_CID_EFFECT,1,"mono",0),
\r
797 new_usr_v4l2menu(V4L2_CID_EFFECT,2,"negative",0),
\r
798 new_usr_v4l2menu(V4L2_CID_EFFECT,3,"sepia",0),
\r
799 new_usr_v4l2menu(V4L2_CID_EFFECT,4,"posterize",0),
\r
800 new_usr_v4l2menu(V4L2_CID_EFFECT,5,"aqua",0),
\r
801 new_usr_v4l2menu(V4L2_CID_EFFECT,6,"solarize",0),
\r
804 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl
\r
806 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =
\r
808 new_user_v4l2ctrl(V4L2_CID_DO_WHITE_BALANCE,V4L2_CTRL_TYPE_MENU,"White Balance Control", 0, 5, 1, 0,sensor_v4l2ctrl_default_cb, sensor_WhiteBalanceSeqe),
\r
809 new_user_v4l2ctrl(V4L2_CID_EXPOSURE,V4L2_CTRL_TYPE_INTEGER,"Exposure Control", -4, 4, 1, 0,sensor_v4l2ctrl_default_cb, sensor_ExposureSeqe),
\r
810 new_user_v4l2ctrl(V4L2_CID_EFFECT,V4L2_CTRL_TYPE_MENU,"Effect Control", 0, 6, 1, 0,sensor_v4l2ctrl_default_cb, sensor_EffectSeqe),
\r
811 new_user_v4l2ctrl(V4L2_CID_CONTRAST,V4L2_CTRL_TYPE_INTEGER,"Contrast Control", -4, 4, 1, 0,sensor_v4l2ctrl_default_cb, sensor_ContrastSeqe),
\r
814 //MUST define the current used format as the first item
\r
815 static struct rk_sensor_datafmt sensor_colour_fmts[] = {
\r
816 {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},
\r
817 {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG}
\r
819 static struct soc_camera_ops sensor_ops;
\r
823 **********************************************************
\r
824 * Following is local code:
\r
826 * Please codeing your program here
\r
827 **********************************************************
\r
829 static int sensor_parameter_record(struct i2c_client *client)
\r
834 struct generic_sensor *sensor = to_generic_sensor(client);
\r
835 struct specific_sensor *spsensor = to_specific_sensor(sensor);
\r
837 sensor_read(client, 0x3200, &ret_l);
\r
838 sensor_write(client, 0x3200, ret_l&0xf9);
\r
839 sensor_read(client, 0x3201, &ret_l);
\r
840 sensor_write(client, 0x3201, ret_l&0xcf); //stop ae awb
\r
843 sensor_read(client,0x3012,&ret_h);
\r
844 sensor_read(client,0x3013, &ret_l);
\r
847 spsensor->parameter.preview_exposure = ((tp_h<<8) & 0xF0) |((tp_l) & 0x0F);
\r
849 //Read back AGC Gain for preview
\r
850 sensor_read(client,0x3014, &ret_l);
\r
851 spsensor->parameter.preview_gain_dr = ret_l;
\r
852 sensor_read(client,0x3015, &ret_l);
\r
853 spsensor->parameter.preview_gain_ar = ret_l;
\r
854 sensor_read(client,0x3016, &ret_l);
\r
855 spsensor->parameter.preview_gain_dgr = ret_l;
\r
856 sensor_read(client,0x3017, &ret_l);
\r
857 spsensor->parameter.preview_gain_agr = ret_l;
\r
858 sensor_read(client,0x3018, &ret_l);
\r
859 spsensor->parameter.preview_gain_dgb = ret_l;
\r
860 sensor_read(client,0x3019, &ret_l);
\r
861 spsensor->parameter.preview_gain_agb = ret_l;
\r
862 sensor_read(client,0x301a, &ret_l);
\r
863 spsensor->parameter.preview_gain_db = ret_l;
\r
864 sensor_read(client,0x301b, &ret_l);
\r
865 spsensor->parameter.preview_gain_ab = ret_l;
\r
866 sensor_read(client,0x301c, &ret_l);
\r
867 spsensor->parameter.preview_gain_dglobal= ret_l;
\r
868 sensor_read(client,0x301d, &ret_l);
\r
869 spsensor->parameter.preview_gain_aglobal= ret_l;
\r
871 spsensor->parameter.CapturePclk = 48000;
\r
872 spsensor->parameter.PreviewPclk = 48000;
\r
873 sensor_read(client,0x300a, &ret_h);
\r
874 sensor_read(client,0x300b, &ret_l);
\r
877 spsensor->parameter.PreviewDummyPixels = (tp_l&0x0F) | ((tp_h<<8)&0xF0);
\r
878 spsensor->parameter.CaptureDummyPixels = 0;
\r
881 sensor_read(client,0x3290, &ret_h);
\r
882 sensor_read(client,0x3291, &ret_l);
\r
885 spsensor->parameter.preview_awb_r = (tp_l&0x0F) | ((tp_h<<8)&0x10);
\r
887 sensor_read(client,0x3296, &ret_h);
\r
888 sensor_read(client,0x3297, &ret_l);
\r
891 spsensor->parameter.preview_awb_b = (tp_l&0x0F) | ((tp_h<<8)&0x10);
\r
895 #define OV2659_FULL_PERIOD_PIXEL_NUMS (1940) // default pixel#(w/o dummy pixels) in UXGA mode
\r
896 #define OV2659_FULL_PERIOD_LINE_NUMS (1238) // default line#(w/o dummy lines) in UXGA mode
\r
897 #define OV2659_PV_PERIOD_PIXEL_NUMS (970) // default pixel#(w/o dummy pixels) in SVGA mode
\r
898 #define OV2659_PV_PERIOD_LINE_NUMS (618) // default line#(w/o dummy lines) in SVGA mode
\r
900 /* SENSOR EXPOSURE LINE LIMITATION */
\r
901 #define OV2659_FULL_EXPOSURE_LIMITATION (1236)
\r
902 #define OV2659_PV_EXPOSURE_LIMITATION (618)
\r
904 // SENSOR UXGA SIZE
\r
905 #define OV2659_IMAGE_SENSOR_FULL_WIDTH (1600)
\r
906 #define OV2659_IMAGE_SENSOR_FULL_HEIGHT (1200)
\r
908 #define OV2659_FULL_GRAB_WIDTH (OV2659_IMAGE_SENSOR_FULL_WIDTH - 16)
\r
909 #define OV2659_FULL_GRAB_HEIGHT (OV2659_IMAGE_SENSOR_FULL_HEIGHT - 12)
\r
911 static int sensor_ae_transfer(struct i2c_client *client)
\r
913 //unsigned int prev_line_len,cap_line_len,shutter;
\r
914 struct generic_sensor *sensor = to_generic_sensor(client);
\r
915 struct specific_sensor *spsensor = to_specific_sensor(sensor);
\r
916 int preview_ae_integration, capture_ae_integration;
\r
923 sensor_read(client, 0x3200, &ret_h);
\r
925 sensor_write(client, 0x3200, ret_h&0xfd);
\r
926 sensor_read(client, 0x3201, &ret_l);
\r
928 sensor_write(client, 0x3201, ret_l&0xdf); //stop ae awb
\r
930 sensor_read(client,0x300a, &ret_h);
\r
931 sensor_read(client,0x300b, &ret_l);
\r
932 capture_pixel = (ret_l&0x0F) | ((ret_h<<8)&0xF0);
\r
933 preview_ae_integration = spsensor->parameter.preview_exposure*spsensor->parameter.PreviewDummyPixels;
\r
934 capture_ae_integration = preview_ae_integration/capture_pixel;
\r
937 sensor_write(client,0x3012,(capture_ae_integration>>8)&0x0F);
\r
938 sensor_write(client,0x3013,capture_ae_integration&0x0F);
\r
940 //write back AGC Gain for preview
\r
941 sensor_write(client,0x3014, spsensor->parameter.preview_gain_dr);
\r
942 sensor_write(client,0x3015, spsensor->parameter.preview_gain_ar);
\r
943 sensor_write(client,0x3016, spsensor->parameter.preview_gain_dgr);
\r
944 sensor_write(client,0x3017, spsensor->parameter.preview_gain_agr);
\r
945 sensor_write(client,0x3018, spsensor->parameter.preview_gain_dgb);
\r
946 sensor_write(client,0x3019, spsensor->parameter.preview_gain_agb);
\r
947 sensor_write(client,0x301a, spsensor->parameter.preview_gain_db);
\r
948 sensor_write(client,0x301b, spsensor->parameter.preview_gain_ab);
\r
949 sensor_write(client,0x301c, spsensor->parameter.preview_gain_dglobal);
\r
950 sensor_write(client,0x301d, spsensor->parameter.preview_gain_aglobal);
\r
953 sensor_write(client,0x3290, (spsensor->parameter.preview_awb_r>>8)&0x01);
\r
954 sensor_write(client,0x3291, spsensor->parameter.preview_awb_r&0x0F);
\r
955 sensor_write(client,0x3296, (spsensor->parameter.preview_awb_b>>8)&0x01 );
\r
956 sensor_write(client,0x3297, spsensor->parameter.preview_awb_b&0x0F );
\r
959 //sensor_write(client, 0x3200, val_h);
\r
960 //sensor_write(client, 0x3201, val_l); //enable ae awb
\r
964 **********************************************************
\r
965 * Following is callback
\r
966 * If necessary, you could coding these callback
\r
967 **********************************************************
\r
970 * the function is called in open sensor
\r
972 static int sensor_activate_cb(struct i2c_client *client)
\r
974 SENSOR_DG("%s",__FUNCTION__);
\r
980 * the function is called in close sensor
\r
982 static int sensor_deactivate_cb(struct i2c_client *client)
\r
984 struct generic_sensor *sensor = to_generic_sensor(client);
\r
986 SENSOR_DG("%s",__FUNCTION__);
\r
988 /* ddl@rock-chips.com : all sensor output pin must switch into Hi-Z */
\r
989 if (sensor->info_priv.funmodule_state & SENSOR_INIT_IS_OK) {
\r
990 sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;;
\r
996 * the function is called before sensor register setting in VIDIOC_S_FMT
\r
998 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
1000 printk("set fmt set!!!!!!!!!!!!");
\r
1003 sensor_parameter_record(client);
\r
1004 printk("set fmt set!!!!!!!!!!!!");
\r
1011 * the function is called after sensor register setting finished in VIDIOC_S_FMT
\r
1013 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
1016 sensor_ae_transfer(client);
\r
1017 printk("set fmt set!!!!!!!!!!!!");
\r
1024 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)
\r
1029 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
1034 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
1039 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)
\r
1041 //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1043 if (pm_msg.event == PM_EVENT_SUSPEND) {
\r
1044 SENSOR_DG("Suspend");
\r
1047 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);
\r
1053 static int sensor_resume(struct soc_camera_device *icd)
\r
1056 SENSOR_DG("Resume");
\r
1061 static int sensor_mirror_cb (struct i2c_client *client, int mirror)
\r
1066 SENSOR_DG("mirror: %d",mirror);
\r
1068 err = sensor_read(client, 0x3022, &val);
\r
1071 err = sensor_write(client, 0x3022, val);
\r
1074 err = sensor_read(client, 0x3022, &val);
\r
1077 err = sensor_write(client, 0x3022, val);
\r
1084 * the function is v4l2 control V4L2_CID_HFLIP callback
\r
1086 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
1087 struct v4l2_ext_control *ext_ctrl)
\r
1089 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1091 if (sensor_mirror_cb(client,ext_ctrl->value) != 0)
\r
1092 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);
\r
1094 SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);
\r
1098 static int sensor_flip_cb(struct i2c_client *client, int flip)
\r
1104 SENSOR_DG("flip: %d",flip);
\r
1106 err = sensor_read(client, 0x3022, &val);
\r
1109 err = sensor_write(client, 0x3022, val);
\r
1112 err = sensor_read(client, 0x3022, &val);
\r
1115 err = sensor_write(client, 0x3022, val);
\r
1122 * the function is v4l2 control V4L2_CID_VFLIP callback
\r
1124 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
1125 struct v4l2_ext_control *ext_ctrl)
\r
1127 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1129 if (sensor_flip_cb(client,ext_ctrl->value) != 0)
\r
1130 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);
\r
1132 SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);
\r
1136 static int sensor_focus_init_usr_cb(struct i2c_client *client){
\r
1140 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){
\r
1144 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){
\r
1148 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){
\r
1152 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){
\r
1156 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){
\r
1159 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1163 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){
\r
1167 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)
\r
1173 face defect call back
\r
1175 static int sensor_face_detect_usr_cb(struct i2c_client *client,int on){
\r
1180 * The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some
\r
1181 * initialization in the function.
\r
1183 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)
\r
1189 * :::::WARNING:::::
\r
1190 * It is not allowed to modify the following code
\r
1193 sensor_init_parameters_default_code();
\r
1195 sensor_v4l2_struct_initialization();
\r
1197 sensor_probe_default_code();
\r
1199 sensor_remove_default_code();
\r
1201 sensor_driver_default_module_code();
\r