From: hhb Date: Mon, 25 Jun 2012 03:39:56 +0000 (+0800) Subject: rk30 phone: camera update ov5640_for_td8801.c X-Git-Tag: firefly_0821_release~9072 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=eca304b75b260ffe64795c67208b9d58b366e903;p=firefly-linux-kernel-4.4.55.git rk30 phone: camera update ov5640_for_td8801.c --- diff --git a/drivers/media/video/ov5640_for_td8801.c b/drivers/media/video/ov5640_for_td8801.c index 5762a514e97f..6202c32e2c7f 100644 --- a/drivers/media/video/ov5640_for_td8801.c +++ b/drivers/media/video/ov5640_for_td8801.c @@ -53,7 +53,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_INIT_WIDTH 800 /* Sensor pixel size for sensor_init_data array */ #define SENSOR_INIT_HEIGHT 600 #define SENSOR_INIT_WINSEQADR sensor_svga -#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8 +#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8 #define CONFIG_SENSOR_WhiteBalance 1 #define CONFIG_SENSOR_Brightness 0 @@ -73,7 +73,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define CONFIG_SENSOR_Focus 0 #endif -#define CONFIG_SENSOR_I2C_SPEED 250000 /* Hz */ +#define CONFIG_SENSOR_I2C_SPEED 50*1000 /* Hz */ /* Sensor write register continues by preempt_disable/preempt_enable for current process not be scheduled */ #define CONFIG_SENSOR_I2C_NOSCHED 0 #define CONFIG_SENSOR_I2C_RDWRCHK 0 @@ -177,11 +177,24 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define StepFocus_Spec_Tag 0x10 #endif +//flash off in fixed time to prevent from too hot , zyc +struct flash_timer{ + struct soc_camera_device *icd; + struct hrtimer timer; +}; +static enum hrtimer_restart flash_off_func(struct hrtimer *timer); + +static struct flash_timer flash_off_timer; +//for user defined if user want to customize the series , zyc +#ifdef CONFIG_OV5640_USER_DEFINED_SERIES +#include "ov5640_user_series.c" +#else + /* init 800X600 SVGA */ static struct reginfo sensor_init_data[] = { {0x3103, 0x11}, - {0x3008, 0x82}, +// {0x3008, 0x82}, //don't do software reset here, or writing some registers may fail {0x3008, 0x42}, {0x3103, 0x03}, {0x3017, 0xff}, @@ -791,15 +804,19 @@ static struct reginfo sensor_qcif[] = {SEQUENCE_END, 0x00} }; - +#endif static struct reginfo sensor_ClrFmt_YUYV[]= { + {0x4300,0x30}, + {0x4300,0x30}, {0x4300,0x30}, {SEQUENCE_END, 0x00} }; static struct reginfo sensor_ClrFmt_UYVY[]= { + {0x4300,0x32}, + {0x4300,0x32}, {0x4300,0x32}, {SEQUENCE_END, 0x00} }; @@ -1216,7 +1233,7 @@ static const struct v4l2_querymenu sensor_menus[] = #endif }; -static const struct v4l2_queryctrl sensor_controls[] = +static struct v4l2_queryctrl sensor_controls[] = { #if CONFIG_SENSOR_WhiteBalance { @@ -2403,6 +2420,11 @@ static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd if (sensor->sensor_io_request && sensor->sensor_io_request->sensor_ioctrl) { sensor->sensor_io_request->sensor_ioctrl(icd->pdev,Cam_Flash, on); + if(on == Flash_On){ + //flash off after 2 secs + hrtimer_cancel(&(flash_off_timer.timer)); + hrtimer_start(&(flash_off_timer.timer),ktime_set(0, 800*1000*1000),HRTIMER_MODE_REL); + } } break; } @@ -2416,6 +2438,15 @@ static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd sensor_power_end: return ret; } + +static enum hrtimer_restart flash_off_func(struct hrtimer *timer){ + struct flash_timer *fps_timer = container_of(timer, struct flash_timer, timer); + sensor_ioctrl(fps_timer->icd,Sensor_Flash,0); + SENSOR_DG("%s %s !!!!!!",SENSOR_NAME_STRING(),__FUNCTION__); + return 0; + +} + static int sensor_init(struct v4l2_subdev *sd, u32 val) { struct i2c_client *client = v4l2_get_subdevdata(sd); @@ -2529,6 +2560,8 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val) qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH); if (qctrl) sensor->info_priv.flash = qctrl->default_value; + flash_off_timer.icd = icd; + flash_off_timer.timer.function = flash_off_func; #endif SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),((val == 0)?__FUNCTION__:"sensor_reinit"),icd->user_width,icd->user_height); @@ -3938,11 +3971,18 @@ static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) if (sensor->sensor_gpio_res->gpio_flash == INVALID_GPIO) { for (i = 0; i < icd->ops->num_controls; i++) { if (V4L2_CID_FLASH == icd->ops->controls[i].id) { - memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl)); + //memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl)); + sensor_controls[i].id=0xffff; } } sensor->info_priv.flash = 0xff; SENSOR_DG("%s flash gpio is invalidate!\n",SENSOR_NAME_STRING()); + }else{ //two cameras are the same,need to deal diffrently ,zyc + for (i = 0; i < icd->ops->num_controls; i++) { + if(0xffff == icd->ops->controls[i].id){ + sensor_controls[i].id=V4L2_CID_FLASH; + } + } } } #endif @@ -4045,7 +4085,7 @@ static int sensor_probe(struct i2c_client *client, mutex_init(&sensor->wq_lock); #endif } - + hrtimer_init(&(flash_off_timer.timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL); SENSOR_DG("\n%s..%s..%d ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret); return ret; }