mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
rk30 phone: camera update ov5640_for_td8801.c
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user