1 #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 * config sensor io H-Z in sensor_deactive_cb;
\r
11 static int version = KERNEL_VERSION(0,1,3);
\r
12 module_param(version, int, S_IRUGO);
\r
16 module_param(debug, int, S_IRUGO|S_IWUSR);
\r
18 #define dprintk(level, fmt, arg...) do { \
\r
19 if (debug >= level) \
\r
20 printk(KERN_WARNING fmt , ## arg); } while (0)
\r
22 /* Sensor Driver Configuration Begin */
\r
23 #define SENSOR_NAME RK29_CAM_SENSOR_OV5640
\r
24 #define SENSOR_V4L2_IDENT V4L2_IDENT_OV5640
\r
25 #define SENSOR_ID 0x5640
\r
26 #define SENSOR_BUS_PARAM (SOCAM_MASTER |\
\r
27 SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_LOW|\
\r
28 SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
\r
29 #define SENSOR_PREVIEW_W 800
\r
30 #define SENSOR_PREVIEW_H 600
\r
31 #define SENSOR_PREVIEW_FPS 15000 // 15fps
\r
32 #define SENSOR_FULLRES_L_FPS 7500 // 7.5fps
\r
33 #define SENSOR_FULLRES_H_FPS 7500 // 7.5fps
\r
34 #define SENSOR_720P_FPS 30000
\r
35 #define SENSOR_1080P_FPS 15000
\r
37 #define SENSOR_REGISTER_LEN 2 // sensor register address bytes
\r
38 #define SENSOR_VALUE_LEN 1 // sensor register value bytes
\r
40 static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect
\r
41 |CFG_Scene|CFG_Focus
\r
44 static unsigned int SensorChipID[] = {SENSOR_ID};
\r
45 /* Sensor Driver Configuration End */
\r
48 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))
\r
49 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)
\r
51 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)
\r
52 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
53 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
54 #define sensor_write_array generic_sensor_write_array
\r
56 #if 1//CONFIG_SENSOR_Focus
\r
57 #include "ov5640_af_firmware.c"
\r
58 /* ov5640 VCM Command and Status Registers */
\r
59 #define CONFIG_SENSOR_FocusCenterInCapture 0
\r
60 #define CMD_MAIN_Reg 0x3022
\r
61 //#define CMD_TAG_Reg 0x3023
\r
62 #define CMD_ACK_Reg 0x3023
\r
63 #define CMD_PARA0_Reg 0x3024
\r
64 #define CMD_PARA1_Reg 0x3025
\r
65 #define CMD_PARA2_Reg 0x3026
\r
66 #define CMD_PARA3_Reg 0x3027
\r
67 #define CMD_PARA4_Reg 0x3028
\r
69 //#define STA_ZONE_Reg 0x3026
\r
70 #define STA_FOCUS_Reg 0x3029
\r
72 /* ov5640 VCM Command */
\r
74 #define ConstFocus_Cmd 0x04
\r
75 #define StepMode_Cmd 0x05
\r
76 #define PauseFocus_Cmd 0x06
\r
77 #define ReturnIdle_Cmd 0x08
\r
78 #define SetZone_Cmd 0x10
\r
79 #define UpdateZone_Cmd 0x12
\r
80 #define SetMotor_Cmd 0x20
\r
81 #define SingleFocus_Cmd 0x03
\r
82 #define GetFocusResult_Cmd 0x07
\r
83 #define ReleaseFocus_Cmd 0x08
\r
84 #define ZoneRelaunch_Cmd 0x12
\r
85 #define DefaultZoneConfig_Cmd 0x80
\r
86 #define TouchZoneConfig_Cmd 0x81
\r
87 #define CustomZoneConfig_Cmd 0x8f
\r
90 /* ov5640 Focus State */
\r
91 //#define S_FIRWRE 0xFF /*Firmware is downloaded and not run*/
\r
92 #define S_STARTUP 0x7e /*Firmware is initializing*/
\r
93 #define S_ERROR 0x7f
\r
94 #define S_IDLE 0x70 /*Idle state, focus is released; lens is located at the furthest position.*/
\r
95 #define S_FOCUSING 0x00 /*Auto Focus is running.*/
\r
96 #define S_FOCUSED 0x10 /*Auto Focus is completed.*/
\r
98 #define S_CAPTURE 0x12
\r
101 /* ov5640 Zone State */
\r
102 #define Zone_Is_Focused(a, zone_val) (zone_val&(1<<(a-3)))
\r
103 #define Zone_Get_ID(zone_val) (zone_val&0x03)
\r
105 #define Zone_CenterMode 0x01
\r
106 #define Zone_5xMode 0x02
\r
107 #define Zone_5PlusMode 0x03
\r
108 #define Zone_4fMode 0x04
\r
110 #define ZoneSel_Auto 0x0b
\r
111 #define ZoneSel_SemiAuto 0x0c
\r
112 #define ZoneSel_Manual 0x0d
\r
113 #define ZoneSel_Rotate 0x0e
\r
115 /* ov5640 Step Focus Commands */
\r
116 #define StepFocus_Near_Tag 0x01
\r
117 #define StepFocus_Far_Tag 0x02
\r
118 #define StepFocus_Furthest_Tag 0x03
\r
119 #define StepFocus_Nearest_Tag 0x04
\r
120 #define StepFocus_Spec_Tag 0x10
\r
123 struct sensor_parameter
\r
125 unsigned int PreviewDummyPixels;
\r
126 unsigned int CaptureDummyPixels;
\r
127 unsigned int preview_exposure;
\r
128 unsigned short int preview_line_width;
\r
129 unsigned short int preview_gain;
\r
130 unsigned short int preview_maxlines;
\r
132 unsigned short int PreviewPclk;
\r
133 unsigned short int CapturePclk;
\r
137 struct specific_sensor{
\r
138 struct generic_sensor common_sensor;
\r
139 //define user data below
\r
140 struct sensor_parameter parameter;
\r
145 * The follow setting need been filled.
\r
148 * sensor_init_data : Sensor initial setting;
\r
149 * sensor_fullres_lowfps_data : Sensor full resolution setting with best auality, recommand for video;
\r
150 * sensor_preview_data : Sensor preview resolution setting, recommand it is vga or svga;
\r
151 * sensor_softreset_data : Sensor software reset register;
\r
152 * sensor_check_id_data : Sensir chip id register;
\r
155 * sensor_fullres_highfps_data: Sensor full resolution setting with high framerate, recommand for video;
\r
156 * sensor_720p: Sensor 720p setting, it is for video;
\r
157 * sensor_1080p: Sensor 1080p setting, it is for video;
\r
159 * :::::WARNING:::::
\r
160 * The SensorEnd which is the setting end flag must be filled int the last of each setting;
\r
163 /* Sensor initial setting */
\r
164 static struct rk_sensor_reg sensor_init_data[] ={
\r
262 {0x4300, 0x32},//uyvy:0x32,yuyv:0x30
\r
421 SensorWaitUs(1000),
\r
424 /* Senor full resolution setting: recommand for capture */
\r
425 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={
\r
444 {0x3612, 0x2b}, //4b
\r
467 /* Senor full resolution setting: recommand for video */
\r
468 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={
\r
471 /* Preview resolution setting*/
\r
472 static struct rk_sensor_reg sensor_preview_data[] =
\r
507 {0x3002, 0x1c},////
\r
508 {0x4713, 0x03},////
\r
512 {0x3824, 0x02},////
\r
518 static struct rk_sensor_reg sensor_720p[]={
\r
545 {0x3820, 0x41}, //ddl@rock-chips.com add start: qsxvga -> 720p isn't stream on
\r
565 {0x3002, 0x1c},////
\r
566 {0x4713, 0x03},//////ddl@rock-chips.com add end
\r
582 static struct rk_sensor_reg sensor_1080p[]={
\r
587 static struct rk_sensor_reg sensor_softreset_data[]={
\r
588 SensorRegVal(0x3008, 0x80),
\r
593 static struct rk_sensor_reg sensor_check_id_data[]={
\r
594 SensorRegVal(0x300a,0),
\r
595 SensorRegVal(0x300b,0),
\r
599 * The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx
\r
601 static struct rk_sensor_reg sensor_WhiteB_Auto[]=
\r
628 /* Cloudy Colour Temperature : 6500K - 8000K */
\r
629 static struct rk_sensor_reg sensor_WhiteB_Cloudy[]=
\r
640 /* ClearDay Colour Temperature : 5000K - 6500K */
\r
641 static struct rk_sensor_reg sensor_WhiteB_ClearDay[]=
\r
652 /* Office Colour Temperature : 3500K - 5000K */
\r
653 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=
\r
666 /* Home Colour Temperature : 2500K - 3500K */
\r
667 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=
\r
679 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,
\r
680 sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,
\r
683 static struct rk_sensor_reg sensor_Brightness0[]=
\r
689 static struct rk_sensor_reg sensor_Brightness1[]=
\r
696 static struct rk_sensor_reg sensor_Brightness2[]=
\r
703 static struct rk_sensor_reg sensor_Brightness3[]=
\r
710 static struct rk_sensor_reg sensor_Brightness4[]=
\r
717 static struct rk_sensor_reg sensor_Brightness5[]=
\r
723 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,
\r
724 sensor_Brightness4, sensor_Brightness5,NULL,
\r
727 static struct rk_sensor_reg sensor_Effect_Normal[] =
\r
734 static struct rk_sensor_reg sensor_Effect_WandB[] =
\r
743 static struct rk_sensor_reg sensor_Effect_Sepia[] =
\r
752 static struct rk_sensor_reg sensor_Effect_Negative[] =
\r
759 static struct rk_sensor_reg sensor_Effect_Bluish[] =
\r
769 static struct rk_sensor_reg sensor_Effect_Green[] =
\r
778 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,
\r
779 sensor_Effect_Bluish, sensor_Effect_Green,NULL,
\r
782 static struct rk_sensor_reg sensor_Exposure0[]=
\r
793 static struct rk_sensor_reg sensor_Exposure1[]=
\r
804 static struct rk_sensor_reg sensor_Exposure2[]=
\r
815 static struct rk_sensor_reg sensor_Exposure3[]=
\r
826 static struct rk_sensor_reg sensor_Exposure4[]=
\r
837 static struct rk_sensor_reg sensor_Exposure5[]=
\r
848 static struct rk_sensor_reg sensor_Exposure6[]=
\r
859 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,
\r
860 sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,
\r
863 static struct rk_sensor_reg sensor_Saturation0[]=
\r
868 static struct rk_sensor_reg sensor_Saturation1[]=
\r
873 static struct rk_sensor_reg sensor_Saturation2[]=
\r
877 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};
\r
879 static struct rk_sensor_reg sensor_Contrast0[]=
\r
884 static struct rk_sensor_reg sensor_Contrast1[]=
\r
889 static struct rk_sensor_reg sensor_Contrast2[]=
\r
894 static struct rk_sensor_reg sensor_Contrast3[]=
\r
899 static struct rk_sensor_reg sensor_Contrast4[]=
\r
905 static struct rk_sensor_reg sensor_Contrast5[]=
\r
910 static struct rk_sensor_reg sensor_Contrast6[]=
\r
914 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,
\r
915 sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,
\r
917 static struct rk_sensor_reg sensor_SceneAuto[] =
\r
923 static struct rk_sensor_reg sensor_SceneNight[] =
\r
925 //15fps ~ 3.75fps night mode for 60/50Hz light environment, 24Mhz clock input,24Mzh pclk
\r
945 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};
\r
947 static struct rk_sensor_reg sensor_Zoom0[] =
\r
952 static struct rk_sensor_reg sensor_Zoom1[] =
\r
957 static struct rk_sensor_reg sensor_Zoom2[] =
\r
963 static struct rk_sensor_reg sensor_Zoom3[] =
\r
967 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
\r
970 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu
\r
972 static struct v4l2_querymenu sensor_menus[] =
\r
976 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl
\r
978 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =
\r
982 //MUST define the current used format as the first item
\r
983 static struct rk_sensor_datafmt sensor_colour_fmts[] = {
\r
984 {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG}
\r
986 static struct soc_camera_ops sensor_ops;
\r
990 **********************************************************
\r
991 * Following is local code:
\r
993 * Please codeing your program here
\r
994 **********************************************************
\r
996 static int sensor_parameter_record(struct i2c_client *client)
\r
998 u8 ret_l,ret_m,ret_h;
\r
999 int tp_l,tp_m,tp_h;
\r
1000 struct generic_sensor*sensor = to_generic_sensor(client);
\r
1001 struct specific_sensor *spsensor = to_specific_sensor(sensor);
\r
1002 sensor_read(client,0x3a00, &ret_l);
\r
1003 sensor_write(client,0x3a00, ret_l&0xfb);
\r
1005 sensor_write(client,0x3503,0x07); //stop AE/AG
\r
1006 sensor_read(client,0x3406, &ret_l);
\r
1007 sensor_write(client,0x3406, ret_l|0x01);
\r
1009 sensor_read(client,0x3500,&ret_h);
\r
1010 sensor_read(client,0x3501, &ret_m);
\r
1011 sensor_read(client,0x3502, &ret_l);
\r
1015 spsensor->parameter.preview_exposure = ((tp_h<<12) & 0xF000) | ((tp_m<<4) & 0x0FF0) | ((tp_l>>4) & 0x0F);
\r
1017 //Read back AGC Gain for preview
\r
1018 sensor_read(client,0x350b, &ret_l);
\r
1019 spsensor->parameter.preview_gain = ret_l;
\r
1021 SENSOR_DG(" %s Read 0x350b=0x%02x PreviewExposure:%d 0x3500=0x%02x 0x3501=0x%02x 0x3502=0x%02x \n",
\r
1022 SENSOR_NAME_STRING(), tp_l,spsensor->parameter.preview_exposure,tp_h, tp_m, tp_l);
\r
1025 #define OV5640_FULL_PERIOD_PIXEL_NUMS_HTS (2844)
\r
1026 #define OV5640_FULL_PERIOD_LINE_NUMS_VTS (1968)
\r
1027 #define OV5640_PV_PERIOD_PIXEL_NUMS_HTS (1896)
\r
1028 #define OV5640_PV_PERIOD_LINE_NUMS_VTS (984)
\r
1029 static int sensor_ae_transfer(struct i2c_client *client)
\r
1034 u16 ulCapture_Exposure;
\r
1035 u16 Preview_Maxlines;
\r
1037 u16 OV5640_g_iExtra_ExpLines;
\r
1038 struct generic_sensor*sensor = to_generic_sensor(client);
\r
1039 struct specific_sensor *spsensor = to_specific_sensor(sensor);
\r
1040 //Preview_Maxlines = sensor->parameter.preview_line_width;
\r
1041 Preview_Maxlines = spsensor->parameter.preview_maxlines;
\r
1042 Gain = spsensor->parameter.preview_gain;
\r
1045 ulCapture_Exposure = (spsensor->parameter.preview_exposure*OV5640_PV_PERIOD_PIXEL_NUMS_HTS)/OV5640_FULL_PERIOD_PIXEL_NUMS_HTS;
\r
1047 SENSOR_DG("cap shutter calutaed = %d, 0x%x\n", ulCapture_Exposure,ulCapture_Exposure);
\r
1049 // write the gain and exposure to 0x350* registers
\r
1050 sensor_write(client,0x350b, Gain);
\r
1052 if (ulCapture_Exposure <= 1940) {
\r
1053 OV5640_g_iExtra_ExpLines = 0;
\r
1055 OV5640_g_iExtra_ExpLines = ulCapture_Exposure - 1940;
\r
1057 SENSOR_DG("Set Extra-line = %d, iExp = %d \n", OV5640_g_iExtra_ExpLines, ulCapture_Exposure);
\r
1059 ExposureLow = (ulCapture_Exposure<<4)&0xff;
\r
1060 ExposureMid = (ulCapture_Exposure>>4)&0xff;
\r
1061 ExposureHigh = (ulCapture_Exposure>>12);
\r
1063 sensor_write(client,0x350c, (OV5640_g_iExtra_ExpLines&0xff00)>>8);
\r
1064 sensor_write(client,0x350d, OV5640_g_iExtra_ExpLines&0xff);
\r
1065 sensor_write(client,0x3502, ExposureLow);
\r
1066 sensor_write(client,0x3501, ExposureMid);
\r
1067 sensor_write(client,0x3500, ExposureHigh);
\r
1069 //SENSOR_DG(" %s Write 0x350b=0x%02x 0x350c=0x%2x 0x350d=0x%2x 0x3502=0x%02x 0x3501=0x%02x 0x3500=0x%02x\n",SENSOR_NAME_STRING(), Gain, ExposureLow, ExposureMid, ExposureHigh);
\r
1074 **********************************************************
\r
1075 * Following is callback
\r
1076 * If necessary, you could coding these callback
\r
1077 **********************************************************
\r
1080 * the function is called in open sensor
\r
1082 static int sensor_activate_cb(struct i2c_client *client)
\r
1084 SENSOR_DG("%s",__FUNCTION__);
\r
1088 * the function is called in close sensor
\r
1090 static int sensor_deactivate_cb(struct i2c_client *client)
\r
1092 struct generic_sensor *sensor = to_generic_sensor(client);
\r
1094 SENSOR_DG("%s",__FUNCTION__);
\r
1095 if (sensor->info_priv.funmodule_state & SENSOR_INIT_IS_OK) {
\r
1096 sensor_write(client, 0x3017, 0x00); // FREX,VSYNC,HREF,PCLK,D9-D6
\r
1097 sensor_write(client, 0x3018, 0x03); // D5-D0
\r
1098 sensor_write(client,0x3019,0x00); // STROBE,SDA
\r
1104 * the function is called before sensor register setting in VIDIOC_S_FMT
\r
1106 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
1108 //struct generic_sensor*sensor = to_generic_sensor(client);
\r
1111 sensor_parameter_record(client);
\r
1115 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
1120 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
1126 * the function is called after sensor register setting finished in VIDIOC_S_FMT
\r
1128 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
1130 //struct generic_sensor*sensor = to_generic_sensor(client);
\r
1132 sensor_ae_transfer(client);
\r
1137 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)
\r
1142 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)
\r
1144 //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1146 if (pm_msg.event == PM_EVENT_SUSPEND) {
\r
1147 SENSOR_DG("Suspend");
\r
1150 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);
\r
1156 static int sensor_resume(struct soc_camera_device *icd)
\r
1159 SENSOR_DG("Resume");
\r
1164 static int sensor_mirror_cb (struct i2c_client *client, int mirror)
\r
1167 SENSOR_DG("mirror: %d",mirror);
\r
1172 * the function is v4l2 control V4L2_CID_HFLIP callback
\r
1174 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
1175 struct v4l2_ext_control *ext_ctrl)
\r
1177 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1179 if (sensor_mirror_cb(client,ext_ctrl->value) != 0)
\r
1180 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);
\r
1182 SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);
\r
1186 static int sensor_flip_cb(struct i2c_client *client, int flip)
\r
1188 SENSOR_DG("flip: %d",flip);
\r
1193 * the function is v4l2 control V4L2_CID_VFLIP callback
\r
1195 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
1196 struct v4l2_ext_control *ext_ctrl)
\r
1198 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
1200 if (sensor_flip_cb(client,ext_ctrl->value) != 0)
\r
1201 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);
\r
1203 SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);
\r
1207 * the functions are focus callbacks
\r
1216 char validate_bit;
\r
1218 static int sensor_af_cmdset(struct i2c_client *client, int cmd_main, struct af_cmdinfo *cmdinfo)
\r
1221 char read_tag=0xff,cnt;
\r
1224 for (i=0; i<4; i++) {
\r
1225 if (cmdinfo->validate_bit & (1<<i)) {
\r
1226 if (sensor_write(client, CMD_PARA0_Reg+i, cmdinfo->cmd_para[i])) {
\r
1227 SENSOR_TR("%s write CMD_PARA_Reg(main:0x%x para%d:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main,i,cmdinfo->cmd_para[i]);
\r
1228 goto sensor_af_cmdset_err;
\r
1230 SENSOR_DG("%s write CMD_PARA_Reg(main:0x%x para%d:0x%x) success!\n",SENSOR_NAME_STRING(),cmd_main,i,cmdinfo->cmd_para[i]);
\r
1234 if (cmdinfo->validate_bit & 0x80) {
\r
1235 if (sensor_write(client, CMD_ACK_Reg, cmdinfo->cmd_tag)) {
\r
1236 SENSOR_TR("%s write CMD_ACK_Reg(main:0x%x tag:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main,cmdinfo->cmd_tag);
\r
1237 goto sensor_af_cmdset_err;
\r
1239 SENSOR_DG("%s write CMD_ACK_Reg(main:0x%x tag:0x%x) success!\n",SENSOR_NAME_STRING(),cmd_main,cmdinfo->cmd_tag);
\r
1243 if (sensor_write(client, CMD_ACK_Reg, 0x01)) {
\r
1244 SENSOR_TR("%s write CMD_ACK_Reg(main:0x%x no tag) error!\n",SENSOR_NAME_STRING(),cmd_main);
\r
1245 goto sensor_af_cmdset_err;
\r
1247 SENSOR_DG("%s write CMD_ACK_Reg(main:0x%x no tag) success!\n",SENSOR_NAME_STRING(),cmd_main);
\r
1250 if (sensor_write(client, CMD_MAIN_Reg, cmd_main)) {
\r
1251 SENSOR_TR("%s write CMD_MAIN_Reg(main:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main);
\r
1252 goto sensor_af_cmdset_err;
\r
1259 if (sensor_read(client,CMD_ACK_Reg,&read_tag)){
\r
1260 SENSOR_TR("%s[%d] read TAG failed\n",SENSOR_NAME_STRING(),__LINE__);
\r
1263 } while((read_tag != 0x00)&& (cnt++<100));
\r
1265 SENSOR_DG("%s write CMD_MAIN_Reg(main:0x%x read tag:0x%x) success!\n",SENSOR_NAME_STRING(),cmd_main,read_tag);
\r
1267 sensor_af_cmdset_err:
\r
1270 static int sensor_af_idlechk(struct i2c_client *client)
\r
1274 struct af_cmdinfo cmdinfo;
\r
1276 SENSOR_DG("%s , %d\n",__FUNCTION__,__LINE__);
\r
1278 cmdinfo.cmd_tag = 0x01;
\r
1279 cmdinfo.validate_bit = 0x80;
\r
1280 ret = sensor_af_cmdset(client, ReturnIdle_Cmd, &cmdinfo);
\r
1282 SENSOR_TR("%s[%d] read focus_status failed\n",SENSOR_NAME_STRING(),__LINE__);
\r
1284 goto sensor_af_idlechk_end;
\r
1289 ret = sensor_read(client, CMD_ACK_Reg, &state);
\r
1291 SENSOR_TR("%s[%d] read focus_status failed\n",SENSOR_NAME_STRING(),__LINE__);
\r
1293 goto sensor_af_idlechk_end;
\r
1295 }while(0x00 != state);
\r
1297 SENSOR_DG("%s , %d\n",__FUNCTION__,__LINE__);
\r
1298 sensor_af_idlechk_end:
\r
1301 /*for 5640 focus end*/
\r
1303 static int sensor_focus_af_single_usr_cb(struct i2c_client *client);
\r
1305 static int sensor_focus_init_usr_cb(struct i2c_client *client)
\r
1311 ret = sensor_write_array(client, sensor_af_firmware);
\r
1313 SENSOR_TR("%s Download firmware failed\n",SENSOR_NAME_STRING());
\r
1315 goto sensor_af_init_end;
\r
1324 ret = sensor_read(client, STA_FOCUS_Reg, &state);
\r
1326 SENSOR_TR("%s[%d] read focus_status failed\n",SENSOR_NAME_STRING(),__LINE__);
\r
1328 goto sensor_af_init_end;
\r
1330 } while (state != S_IDLE);
\r
1332 if (state != S_IDLE) {
\r
1333 SENSOR_TR("%s focus state(0x%x) is error!\n",SENSOR_NAME_STRING(),state);
\r
1335 goto sensor_af_init_end;
\r
1337 sensor_af_init_end:
\r
1338 SENSOR_DG("%s %s ret:0x%x \n",SENSOR_NAME_STRING(),__FUNCTION__,ret);
\r
1342 static int sensor_focus_af_single_usr_cb(struct i2c_client *client)
\r
1346 struct af_cmdinfo cmdinfo;
\r
1347 //char s_zone[5],i;
\r
1348 cmdinfo.cmd_tag = 0x01;
\r
1349 cmdinfo.validate_bit = 0x80;
\r
1350 ret = sensor_af_cmdset(client, SingleFocus_Cmd, &cmdinfo);
\r
1352 SENSOR_TR("%s single focus mode set error!\n",SENSOR_NAME_STRING());
\r
1354 goto sensor_af_single_end;
\r
1364 ret = sensor_read(client, STA_FOCUS_Reg, &state);
\r
1366 SENSOR_TR("%s[%d] read focus_status failed\n",SENSOR_NAME_STRING(),__LINE__);
\r
1368 goto sensor_af_single_end;
\r
1370 }while((state == S_FOCUSING) && (cnt<100));
\r
1372 if (state != S_FOCUSED) {
\r
1373 SENSOR_TR("%s[%d] focus state(0x%x) is error!\n",SENSOR_NAME_STRING(),__LINE__,state);
\r
1375 goto sensor_af_single_end;
\r
1377 SENSOR_DG("%s[%d] single focus mode set success!\n",SENSOR_NAME_STRING(),__LINE__);
\r
1379 sensor_af_single_end:
\r
1383 static int sensor_focus_af_near_usr_cb(struct i2c_client *client)
\r
1388 static int sensor_focus_af_far_usr_cb(struct i2c_client *client)
\r
1394 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos)
\r
1396 struct af_cmdinfo cmdinfo;
\r
1397 sensor_af_idlechk(client);
\r
1399 cmdinfo.cmd_tag = StepFocus_Spec_Tag;
\r
1400 cmdinfo.cmd_para[0] = pos;
\r
1401 cmdinfo.validate_bit = 0x81;
\r
1402 return sensor_af_cmdset(client, StepMode_Cmd, &cmdinfo);
\r
1405 static int sensor_focus_af_const_usr_cb(struct i2c_client *client)
\r
1408 struct af_cmdinfo cmdinfo;
\r
1409 cmdinfo.cmd_tag = 0x01;
\r
1410 cmdinfo.cmd_para[0] = 0x00;
\r
1411 cmdinfo.validate_bit = 0x81;
\r
1412 sensor_af_idlechk(client);
\r
1413 if (sensor_af_cmdset(client, ConstFocus_Cmd, &cmdinfo)) {
\r
1414 SENSOR_TR("%s[%d] const focus mode set error!\n",SENSOR_NAME_STRING(),__LINE__);
\r
1416 goto sensor_af_const_end;
\r
1418 SENSOR_DG("%s[%d] const focus mode set success!\n",SENSOR_NAME_STRING(),__LINE__);
\r
1420 sensor_af_const_end:
\r
1423 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
\r
1427 static int sensor_focus_af_close_usr_cb(struct i2c_client *client)
\r
1430 sensor_af_idlechk(client);
\r
1431 if (sensor_af_cmdset(client, PauseFocus_Cmd, NULL)) {
\r
1432 SENSOR_TR("%s pause focus mode set error!\n",SENSOR_NAME_STRING());
\r
1434 goto sensor_af_pause_end;
\r
1436 sensor_af_pause_end:
\r
1440 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)
\r
1443 struct af_cmdinfo cmdinfo;
\r
1444 //int zone_tm_pos[4];
\r
1445 int zone_center_pos[2];
\r
1446 //struct generic_sensor*sensor = to_generic_sensor(client);
\r
1448 if (zone_tm_pos) {
\r
1449 zone_tm_pos[0] += 1000;
\r
1450 zone_tm_pos[1] += 1000;
\r
1451 zone_tm_pos[2]+= 1000;
\r
1452 zone_tm_pos[3] += 1000;
\r
1453 zone_center_pos[0] = ((zone_tm_pos[0] + zone_tm_pos[2])>>1)*80/2000;
\r
1454 zone_center_pos[1] = ((zone_tm_pos[1] + zone_tm_pos[3])>>1)*60/2000;
\r
1456 #if CONFIG_SENSOR_FocusCenterInCapture
\r
1457 zone_center_pos[0] = 32;
\r
1458 zone_center_pos[1] = 24;
\r
1460 zone_center_pos[0] = -1;
\r
1461 zone_center_pos[1] = -1;
\r
1464 if ((zone_center_pos[0] >=0) && (zone_center_pos[1]>=0)){
\r
1465 cmdinfo.cmd_tag = 0x01;
\r
1466 cmdinfo.validate_bit = 0x83;
\r
1467 if (zone_center_pos[0]<=8)
\r
1468 cmdinfo.cmd_para[0] = 0;
\r
1469 else if ((zone_center_pos[0]>8) && (zone_center_pos[0]<72))
\r
1470 cmdinfo.cmd_para[0] = zone_center_pos[0]-8;
\r
1472 cmdinfo.cmd_para[0] = 72;
\r
1474 if (zone_center_pos[1]<=6)
\r
1475 cmdinfo.cmd_para[1] = 0;
\r
1476 else if ((zone_center_pos[1]>6) && (zone_center_pos[1]<54))
\r
1477 cmdinfo.cmd_para[1] = zone_center_pos[1]-6;
\r
1479 cmdinfo.cmd_para[1] = 54;
\r
1481 ret = sensor_af_cmdset(client, TouchZoneConfig_Cmd, &cmdinfo);
\r
1483 SENSOR_TR("%s touch zone config error!\n",SENSOR_NAME_STRING());
\r
1485 goto sensor_af_zone_end;
\r
1488 sensor_af_zone_end:
\r
1493 face defect call back
\r
1495 static int sensor_face_detect_usr_cb(struct i2c_client *client,int on){
\r
1500 * The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some
\r
1501 * initialization in the function.
\r
1503 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)
\r
1509 * :::::WARNING:::::
\r
1510 * It is not allowed to modify the following code
\r
1513 sensor_init_parameters_default_code();
\r
1515 sensor_v4l2_struct_initialization();
\r
1517 sensor_probe_default_code();
\r
1519 sensor_remove_default_code();
\r
1521 sensor_driver_default_module_code();
\r