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 static int version = KERNEL_VERSION(0,1,1);
\r
10 module_param(version, int, S_IRUGO);
\r
14 module_param(debug, int, S_IRUGO|S_IWUSR);
\r
16 #define dprintk(level, fmt, arg...) do { \
\r
17 if (debug >= level) \
\r
18 printk(KERN_WARNING fmt , ## arg); } while (0)
\r
20 /* Sensor Driver Configuration Begin */
\r
21 #define SENSOR_NAME RK29_CAM_SENSOR_HM5065
\r
22 #define SENSOR_V4L2_IDENT V4L2_IDENT_HM5065
\r
23 #define SENSOR_ID 0x039E
\r
24 #define SENSOR_BUS_PARAM (SOCAM_MASTER |\
\r
25 SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH| SOCAM_VSYNC_ACTIVE_LOW|\
\r
26 SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
\r
27 #define SENSOR_PREVIEW_W 800
\r
28 #define SENSOR_PREVIEW_H 600
\r
29 #define SENSOR_PREVIEW_FPS 15000 // 15fps
\r
30 #define SENSOR_FULLRES_L_FPS 7500 // 7.5fps
\r
31 #define SENSOR_FULLRES_H_FPS 7500 // 7.5fps
\r
32 #define SENSOR_720P_FPS 30000
\r
33 #define SENSOR_1080P_FPS 15000
\r
35 #define SENSOR_REGISTER_LEN 2 // sensor register address bytes
\r
36 #define SENSOR_VALUE_LEN 1 // sensor register value bytes
\r
38 static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect
\r
39 |CFG_Scene|CFG_Focus|CFG_FocusContinues
\r
42 static unsigned int SensorChipID[] = {SENSOR_ID};
\r
43 /* Sensor Driver Configuration End */
\r
46 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))
\r
47 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)
\r
49 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)
\r
50 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
51 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))
\r
52 #define sensor_write_array generic_sensor_write_array
\r
55 /* hm5065 VCM Command and Status Registers */
56 #define AF_TARGETPOS_REG_H 0x0700
57 #define AF_TARGETPOS_REG_L 0x0701
59 #define AF_MODES_REG 0x070A
60 #define AF_AUTOCMDS_REG 0x070b
61 #define AF_LENSPOS_REG_H 0x06F0
62 #define AF_LENSPOS_REG_L 0x06F1
63 #define AF_MANUCMDS_REG 0x070c
64 #define AF_FINISHCHK_REG 0x07ae //[0]: false [1] : true
66 #define FACE_LC 0x0714 //[0] : focus , [1] : AE Â
\93\84Ó
67 #define FACE_START_XH 0x0715
68 #define FACE_START_XL 0x0716
69 #define FACE_SIZE_XH 0x0717
70 #define FACE_SIZE_XL 0x0718
71 #define FACE_START_YH 0x0719
72 #define FACE_START_YL 0x071A
73 #define FACE_SIZE_YH 0x071B
74 #define FACE_SIZE_YL 0x071C
77 #define AF_ZONE0_WEIGHT 0x0808
78 #define AF_ZONE1_WEIGHT 0x0809
79 #define AF_ZONE2_WEIGHT 0x080A
80 #define AF_ZONE3_WEIGHT 0x080B
81 #define AF_ZONE4_WEIGHT 0x080C
82 #define AF_ZONE5_WEIGHT 0x080D
83 #define AF_ZONE6_WEIGHT 0x080E
\r
86 struct sensor_parameter
\r
91 struct specific_sensor{
\r
92 struct generic_sensor common_sensor;
\r
93 //define user data below
\r
94 struct sensor_parameter parameter;
\r
99 * The follow setting need been filled.
\r
102 * sensor_init_data : Sensor initial setting;
\r
103 * sensor_fullres_lowfps_data : Sensor full resolution setting with best auality, recommand for video;
\r
104 * sensor_preview_data : Sensor preview resolution setting, recommand it is vga or svga;
\r
105 * sensor_softreset_data : Sensor software reset register;
\r
106 * sensor_check_id_data : Sensir chip id register;
\r
109 * sensor_fullres_highfps_data: Sensor full resolution setting with high framerate, recommand for video;
\r
110 * sensor_720p: Sensor 720p setting, it is for video;
\r
111 * sensor_1080p: Sensor 1080p setting, it is for video;
\r
113 * :::::WARNING:::::
\r
114 * The SensorEnd which is the setting end flag must be filled int the last of each setting;
\r
117 /* Sensor initial setting */
\r
118 static struct rk_sensor_reg sensor_init_data[] = {
\r
120 {0xffff,0x01}, // 2013-03-01 Start new patch
1634 {0xffff,0x00}, // 2013-03-01 end
\r
1635 SensorWaitMs(200),
\r
1636 {0x0009,0x16}, //10
\r
1662 {0x0040,0x00}, //00
\r
1665 {0x0041,0x00},//00:5M 03:SVGA
\r
1763 {0x0420,0x00}, //new LSC start - 0306
\r
2022 {0x0564,0x00}, //new LSC end
\r
2113 {0x0081,0x55}, //6E->55
\r
2125 SensorWaitMs(200),
\r
2131 //AF intial setting
\r
2132 {0x0659,0x01},//03-06 new af @ vcm
\r
2189 {0x0040,0x01}, //AB2
\r
2190 {0x0041,0x03}, //SVGA mode
\r
2193 SensorWaitMs(200),
\r
2196 /* Senor full resolution setting: recommand for capture */
\r
2197 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={
\r
2206 /* Senor full resolution setting: recommand for video */
\r
2207 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={
\r
2210 /* Preview resolution setting*/
\r
2211 static struct rk_sensor_reg sensor_preview_data[] =
\r
2222 static struct rk_sensor_reg sensor_720p[]={
\r
2227 static struct rk_sensor_reg sensor_1080p[]={
\r
2232 static struct rk_sensor_reg sensor_softreset_data[]={
\r
2236 static struct rk_sensor_reg sensor_check_id_data[]={
\r
2237 SensorRegVal(0x0000,0),
\r
2238 SensorRegVal(0x0001,0),
\r
2242 * The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx
\r
2244 static struct rk_sensor_reg sensor_WhiteB_Auto[]=
\r
2249 /* Cloudy Colour Temperature : 6500K - 8000K */
\r
2250 static struct rk_sensor_reg sensor_WhiteB_Cloudy[]=
\r
2255 /* ClearDay Colour Temperature : 5000K - 6500K */
\r
2256 static struct rk_sensor_reg sensor_WhiteB_ClearDay[]=
\r
2261 /* Office Colour Temperature : 3500K - 5000K */
\r
2262 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=
\r
2268 /* Home Colour Temperature : 2500K - 3500K */
\r
2269 static struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=
\r
2274 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,
\r
2275 sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,
\r
2278 static struct rk_sensor_reg sensor_Brightness0[]=
\r
2284 static struct rk_sensor_reg sensor_Brightness1[]=
\r
2291 static struct rk_sensor_reg sensor_Brightness2[]=
\r
2298 static struct rk_sensor_reg sensor_Brightness3[]=
\r
2305 static struct rk_sensor_reg sensor_Brightness4[]=
\r
2312 static struct rk_sensor_reg sensor_Brightness5[]=
\r
2318 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,
\r
2319 sensor_Brightness4, sensor_Brightness5,NULL,
\r
2322 static struct rk_sensor_reg sensor_Effect_Normal[] =
\r
2331 static struct rk_sensor_reg sensor_Effect_WandB[] =
\r
2340 static struct rk_sensor_reg sensor_Effect_Sepia[] =
\r
2349 static struct rk_sensor_reg sensor_Effect_Negative[] =
\r
2358 static struct rk_sensor_reg sensor_Effect_Bluish[] =
\r
2368 static struct rk_sensor_reg sensor_Effect_Green[] =
\r
2377 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,
\r
2378 sensor_Effect_Bluish, sensor_Effect_Green,NULL,
\r
2381 static struct rk_sensor_reg sensor_Exposure0[]=
\r
2386 static struct rk_sensor_reg sensor_Exposure1[]=
\r
2391 static struct rk_sensor_reg sensor_Exposure2[]=
\r
2396 static struct rk_sensor_reg sensor_Exposure3[]=
\r
2401 static struct rk_sensor_reg sensor_Exposure4[]=
\r
2406 static struct rk_sensor_reg sensor_Exposure5[]=
\r
2411 static struct rk_sensor_reg sensor_Exposure6[]=
\r
2416 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,
\r
2417 sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,
\r
2420 static struct rk_sensor_reg sensor_Saturation0[]=
\r
2425 static struct rk_sensor_reg sensor_Saturation1[]=
\r
2430 static struct rk_sensor_reg sensor_Saturation2[]=
\r
2434 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};
\r
2436 static struct rk_sensor_reg sensor_Contrast0[]=
\r
2441 static struct rk_sensor_reg sensor_Contrast1[]=
\r
2446 static struct rk_sensor_reg sensor_Contrast2[]=
\r
2451 static struct rk_sensor_reg sensor_Contrast3[]=
\r
2456 static struct rk_sensor_reg sensor_Contrast4[]=
\r
2462 static struct rk_sensor_reg sensor_Contrast5[]=
\r
2467 static struct rk_sensor_reg sensor_Contrast6[]=
\r
2471 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,
\r
2472 sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,
\r
2474 static struct rk_sensor_reg sensor_SceneAuto[] =
\r
2480 static struct rk_sensor_reg sensor_SceneNight[] =
\r
2484 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};
\r
2486 static struct rk_sensor_reg sensor_Zoom0[] =
\r
2491 static struct rk_sensor_reg sensor_Zoom1[] =
\r
2496 static struct rk_sensor_reg sensor_Zoom2[] =
\r
2502 static struct rk_sensor_reg sensor_Zoom3[] =
\r
2506 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
\r
2509 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu
\r
2511 static struct v4l2_querymenu sensor_menus[] =
\r
2515 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl
\r
2517 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =
\r
2521 //MUST define the current used format as the first item
\r
2522 static struct rk_sensor_datafmt sensor_colour_fmts[] = {
\r
2523 {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG}
\r
2525 static struct soc_camera_ops sensor_ops;
\r
2529 **********************************************************
\r
2530 * Following is local code:
\r
2532 * Please codeing your program here
\r
2533 **********************************************************
\r
2538 **********************************************************
\r
2539 * Following is callback
\r
2540 * If necessary, you could coding these callback
\r
2541 **********************************************************
\r
2545 * the function is called in open sensor
\r
2547 static int sensor_activate_cb(struct i2c_client *client)
\r
2549 SENSOR_DG("%s",__FUNCTION__);
\r
2553 * the function is called in close sensor
\r
2555 static int sensor_deactivate_cb(struct i2c_client *client)
\r
2557 SENSOR_DG("%s",__FUNCTION__);
\r
2561 * the function is called before sensor register setting in VIDIOC_S_FMT
\r
2563 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
2565 //struct generic_sensor*sensor = to_generic_sensor(client);
\r
2570 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
2575 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)
\r
2581 * the function is called after sensor register setting finished in VIDIOC_S_FMT
\r
2583 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)
\r
2585 struct soc_camera_device *icd = client->dev.platform_data;
\r
2586 struct generic_sensor *gsensor = to_generic_sensor(client);
\r
2589 generic_sensor_af_workqueue_set(icd, WqCmd_af_special_pos,0,true);
\r
2591 if (gsensor->sensor_focus.focus_mode == V4L2_CID_FOCUS_AUTO) {
\r
2592 generic_sensor_af_workqueue_set(icd, WqCmd_af_close,0,false);
\r
2593 } else if (gsensor->sensor_focus.focus_mode == V4L2_CID_FOCUS_CONTINUOUS) {
\r
2594 generic_sensor_af_workqueue_set(icd,WqCmd_af_continues,0,false);
\r
2599 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)
\r
2601 struct soc_camera_device *icd = client->dev.platform_data;
\r
2602 struct generic_sensor *gsensor = to_generic_sensor(client);
\r
2604 if (gsensor->sensor_focus.focus_mode == V4L2_CID_FOCUS_CONTINUOUS) {
\r
2605 generic_sensor_af_workqueue_set(icd,WqCmd_af_continues_pause,0,true);
\r
2610 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)
\r
2612 //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
2614 if (pm_msg.event == PM_EVENT_SUSPEND) {
\r
2615 SENSOR_DG("Suspend");
\r
2618 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);
\r
2624 static int sensor_resume(struct soc_camera_device *icd)
\r
2627 SENSOR_DG("Resume");
\r
2632 static int sensor_mirror_cb (struct i2c_client *client, int mirror)
\r
2635 SENSOR_DG("mirror: %d",mirror);
\r
2640 * the function is v4l2 control V4L2_CID_HFLIP callback
\r
2642 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
2643 struct v4l2_ext_control *ext_ctrl)
\r
2645 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
2647 if (sensor_mirror_cb(client,ext_ctrl->value) != 0)
\r
2648 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);
\r
2650 SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);
\r
2654 static int sensor_flip_cb(struct i2c_client *client, int flip)
\r
2656 SENSOR_DG("flip: %d",flip);
\r
2661 * the function is v4l2 control V4L2_CID_VFLIP callback
\r
2663 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info,
\r
2664 struct v4l2_ext_control *ext_ctrl)
\r
2666 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
\r
2668 if (sensor_flip_cb(client,ext_ctrl->value) != 0)
\r
2669 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);
\r
2671 SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);
\r
2675 * the functions are focus callbacks
\r
2677 static int sensor_focus_af_single_usr_cb(struct i2c_client *client);
\r
2679 static int sensor_focus_init_usr_cb(struct i2c_client *client)
\r
2684 static int sensor_focus_af_single_usr_cb(struct i2c_client *client)
\r
2688 struct generic_sensor *sensor = to_generic_sensor(client);
\r
2689 struct specific_sensor *ssensor = to_specific_sensor(sensor);
\r
2691 ret |= sensor_write(client,AF_MODES_REG,0x03);
2692 ret |= sensor_write(client,AF_AUTOCMDS_REG,0x01);
2694 ret |= sensor_write(client,AF_AUTOCMDS_REG,0x02);
2698 sensor_read(client,AF_FINISHCHK_REG,&state);
2700 }while ((state != 1) && (cnt<100));
2703 sensor_read(client, AF_LENSPOS_REG_H,(char*)&ssensor->parameter.af_pos[0]);
\r
2704 sensor_read(client, AF_LENSPOS_REG_L,(char*)&ssensor->parameter.af_pos[1]);
\r
2707 SENSOR_DG("single focus, state: %d cnt: %d",state,cnt);
\r
2709 //sensor_af_single_end:
\r
2713 static int sensor_focus_af_near_usr_cb(struct i2c_client *client)
\r
2718 static int sensor_focus_af_far_usr_cb(struct i2c_client *client)
\r
2724 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos)
\r
2726 struct generic_sensor *sensor = to_generic_sensor(client);
\r
2727 struct specific_sensor *ssensor = to_specific_sensor(sensor);
\r
2729 sensor_write(client,0x070A, 0x00);
\r
2730 sensor_write(client,0x0734, ssensor->parameter.af_pos[0]& 0xFF);
\r
2731 sensor_write(client,0x0735, ssensor->parameter.af_pos[1] & 0xFF);
\r
2732 sensor_write(client,0x070C, 0x00);
2734 sensor_write(client,0x070C, 0x05);
\r
2739 static int sensor_focus_af_const_usr_cb(struct i2c_client *client)
\r
2743 ret = sensor_write(client, AF_MODES_REG, 0x01);
\r
2744 //sensor_af_const_end:
\r
2747 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
\r
2751 struct generic_sensor *sensor = to_generic_sensor(client);
\r
2752 struct specific_sensor *ssensor = to_specific_sensor(sensor);
\r
2754 sensor_read(client, 0x07ae, &status);
\r
2757 sensor_read(client, AF_LENSPOS_REG_H,(char*)&ssensor->parameter.af_pos[0]);
\r
2758 sensor_read(client, AF_LENSPOS_REG_L,(char*)&ssensor->parameter.af_pos[1]);
\r
2760 sensor_focus_af_single_usr_cb(client);
\r
2765 static int sensor_focus_af_close_usr_cb(struct i2c_client *client)
\r
2769 ret |= sensor_write(client,0x070A, 0x00);
\r
2770 ret |= sensor_write(client,0x0700, 0x03);
\r
2771 ret |= sensor_write(client,0x0701, 0xFF);
\r
2772 ret |= sensor_write(client,0x070C, 0x00);
\r
2773 ret |= sensor_write(client,0x070C, 0x07);
\r
2774 SENSOR_DG("%s",__FUNCTION__);
\r
2778 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)
\r
2781 int xstart,ystart;
\r
2783 *zone_tm_pos += 1000;
\r
2784 *(zone_tm_pos+1) += 1000;
\r
2785 *(zone_tm_pos+2) += 1000;
\r
2786 *(zone_tm_pos+3) += 1000;
\r
2788 xstart = ((*zone_tm_pos + *(zone_tm_pos+2))>>1)*800/2000;
\r
2789 ystart = ((*(zone_tm_pos+1) + *(zone_tm_pos+3))>>1)*600/2000;
\r
2791 if (xstart>0xa0) {
\r
2797 if (ystart>0xa0) {
\r
2803 ret |= sensor_write(client, AF_ZONE0_WEIGHT,0x01);
\r
2804 ret |= sensor_write(client, AF_ZONE1_WEIGHT,0x00);
2805 ret |= sensor_write(client, AF_ZONE2_WEIGHT,0x00);
2806 ret |= sensor_write(client, AF_ZONE3_WEIGHT,0x00);
2807 ret |= sensor_write(client, AF_ZONE4_WEIGHT,0x00);
2808 ret |= sensor_write(client, AF_ZONE5_WEIGHT,0x00);
2809 ret |= sensor_write(client, AF_ZONE6_WEIGHT,0x00);
2810 ret |= sensor_write(client, FACE_LC,0x03);
2812 ret |= sensor_write(client, FACE_START_XH, ((xstart&0xff00)>>8));
\r
2813 ret |= sensor_write(client, FACE_START_XL, xstart&0xff);
\r
2814 ret |= sensor_write(client, FACE_START_YH, ((ystart&0xff00)>>8));
\r
2815 ret |= sensor_write(client, FACE_START_YL, ystart&0xff);
\r
2817 ret |= sensor_write(client, FACE_SIZE_XH, 0x01);
2818 ret |= sensor_write(client, FACE_SIZE_XL, 0x40);
2819 ret |= sensor_write(client, FACE_SIZE_YH, 0x01);
2820 ret |= sensor_write(client, FACE_SIZE_YL, 0x40);
\r
2821 //sensor_af_zone_end:
\r
2826 face defect call back
\r
2828 static int sensor_face_detect_usr_cb(struct i2c_client *client,int on){
\r
2833 * The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some
\r
2834 * initialization in the function.
\r
2836 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)
\r
2842 * :::::WARNING:::::
\r
2843 * It is not allowed to modify the following code
\r
2846 sensor_init_parameters_default_code();
\r
2848 sensor_v4l2_struct_initialization();
\r
2850 sensor_probe_default_code();
\r
2852 sensor_remove_default_code();
\r
2854 sensor_driver_default_module_code();
\r