#include <media/v4l2-common.h>
#include <media/v4l2-chip-ident.h>
#include <media/soc_camera.h>
-#include <mach/rk29_camera.h>
+#include <plat/rk_camera.h>
static int debug;
module_param(debug, int, S_IRUGO|S_IWUSR);
printk(KERN_WARNING fmt , ## arg); } while (0)
#define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)
-#define SENSOR_DG(format, ...) dprintk(0, format, ## __VA_ARGS__)
+#define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)
#define _CONS(a,b) a##b
#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_PIX_FMT_UYVY
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8
#define CONFIG_SENSOR_WhiteBalance 0
#define CONFIG_SENSOR_Brightness 0
#define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))
#define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)
+#define SENSOR_AF_IS_ERR (0x00<<0)
+#define SENSOR_AF_IS_OK (0x01<<0)
+#define SENSOR_INIT_IS_ERR (0x00<<28)
+#define SENSOR_INIT_IS_OK (0x01<<28)
+
struct reginfo
{
u16 reg;
u8 val;
};
+//flash off in fixed time to prevent from too hot , zyc
+struct flash_timer{
+ struct soc_camera_device *icd;
+ struct hrtimer timer;
+};
+#if CONFIG_SENSOR_Flash
+static enum hrtimer_restart flash_off_func(struct hrtimer *timer);
+#endif
+static struct flash_timer flash_off_timer;
+//for user defined if user want to customize the series , zyc
+#ifdef CONFIG_NT99250_USER_DEFINED_SERIES
+#include "NT99250_user_series.c"
+#else
/* init 352X288 SVGA */
static struct reginfo sensor_init_data[] =
{
{
{0x0, 0x0},
};
-
+#endif
static struct reginfo sensor_ClrFmt_YUYV[]=
{
};
static struct reginfo *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
#endif
-static const struct v4l2_querymenu sensor_menus[] =
+static struct v4l2_querymenu sensor_menus[] =
{
#if CONFIG_SENSOR_WhiteBalance
{ .id = V4L2_CID_DO_WHITE_BALANCE, .index = 0, .name = "auto", .reserved = 0, }, { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 1, .name = "incandescent", .reserved = 0,},
#endif
};
-static const struct v4l2_queryctrl sensor_controls[] =
+static struct v4l2_queryctrl sensor_controls[] =
{
#if CONFIG_SENSOR_WhiteBalance
{
.num_menus = ARRAY_SIZE(sensor_menus),
};
-#define COL_FMT(_name, _depth, _fourcc, _colorspace) \
- { .name = _name, .depth = _depth, .fourcc = _fourcc, \
- .colorspace = _colorspace }
+/* only one fixed colorspace per pixelcode */
+struct sensor_datafmt {
+ enum v4l2_mbus_pixelcode code;
+ enum v4l2_colorspace colorspace;
+};
+
+/* Find a data format by a pixel code in an array */
+static const struct sensor_datafmt *sensor_find_datafmt(
+ enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt,
+ int n)
+{
+ int i;
+ for (i = 0; i < n; i++)
+ if (fmt[i].code == code)
+ return fmt + i;
-#define JPG_FMT(_name, _depth, _fourcc) \
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
+ return NULL;
+}
-static const struct soc_camera_data_format sensor_colour_formats[] = {
- JPG_FMT(SENSOR_NAME_STRING(UYVY), 16, V4L2_PIX_FMT_UYVY),
- JPG_FMT(SENSOR_NAME_STRING(YUYV), 16, V4L2_PIX_FMT_YUYV),
+static const struct sensor_datafmt sensor_colour_fmts[] = {
+ {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
+ {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}
};
typedef struct sensor_info_priv_s
unsigned char mirror; /* HFLIP */
unsigned char flip; /* VFLIP */
unsigned int winseqe_cur_addr;
- unsigned int pixfmt;
+ struct sensor_datafmt fmt;
+ unsigned int funmodule_state;
} sensor_info_priv_t;
sensor_task_lock(client,0);
return err;
}
+#if CONFIG_SENSOR_I2C_RDWRCHK
static int sensor_readchk_array(struct i2c_client *client, struct reginfo *regarray)
{
int cnt;
}
return 0;
}
+#endif
static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd cmd, int on)
{
struct soc_camera_link *icl = to_soc_camera_link(icd);
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 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;
}
sensor_power_end:
return ret;
}
+#if CONFIG_SENSOR_Flash
+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;
+
+}
+#endif
static int sensor_init(struct v4l2_subdev *sd, u32 val)
{
- struct i2c_client *client = sd->priv;
+ struct i2c_client *client = v4l2_get_subdevdata(sd);
struct soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
const struct v4l2_queryctrl *qctrl;
+ const struct sensor_datafmt *fmt;
char value;
int ret,pid = 0;
}
/* soft reset */
- sensor_task_lock(client,1);
+ if (sensor_task_lock(client,1)<0)
+ goto sensor_INIT_ERR;
+
ret = sensor_write(client, 0x3021, 0x61);
if (ret != 0)
{
goto sensor_INIT_ERR;
}
sensor_task_lock(client,0);
- //icd->user_width = SENSOR_INIT_WIDTH;
- //icd->user_height = SENSOR_INIT_HEIGHT;
+
sensor->info_priv.winseqe_cur_addr = (int)SENSOR_INIT_WINSEQADR;
- sensor->info_priv.pixfmt = SENSOR_INIT_PIXFMT;
+ fmt = sensor_find_datafmt(SENSOR_INIT_PIXFMT,sensor_colour_fmts, ARRAY_SIZE(sensor_colour_fmts));
+ if (!fmt) {
+ SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING());
+ ret = -EINVAL;
+ goto sensor_INIT_ERR;
+ }
+ sensor->info_priv.fmt = *fmt;
/* sensor sensor information for initialization */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
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);
-
+ sensor->info_priv.funmodule_state |= SENSOR_INIT_IS_OK;
return 0;
sensor_INIT_ERR:
+ sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;
sensor_task_lock(client,0);
sensor_deactivate(client);
return ret;
static int sensor_deactivate(struct i2c_client *client)
{
struct soc_camera_device *icd = client->dev.platform_data;
- //u8 reg_val;
-
+ struct sensor *sensor = to_sensor(client);
SENSOR_DG("\n%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__);
/* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */
sensor_ioctrl(icd, Sensor_PowerDown, 1);
+ msleep(100);
/* ddl@rock-chips.com : sensor config init width , because next open sensor quickly(soc_camera_open -> Try to configure with default parameters) */
icd->user_width = SENSOR_INIT_WIDTH;
icd->user_height = SENSOR_INIT_HEIGHT;
- msleep(100);
+ sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;
+
return 0;
}
return soc_camera_apply_sensor_flags(icl, flags);
}
-static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
+static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- struct i2c_client *client = sd->priv;
+ struct i2c_client *client = v4l2_get_subdevdata(sd);
struct soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
- pix->width = icd->user_width;
- pix->height = icd->user_height;
- pix->pixelformat = sensor->info_priv.pixfmt;
- pix->field = V4L2_FIELD_NONE;
- pix->colorspace = V4L2_COLORSPACE_JPEG;
+ mf->width = icd->user_width;
+ mf->height = icd->user_height;
+ mf->code = sensor->info_priv.fmt.code;
+ mf->colorspace = sensor->info_priv.fmt.colorspace;
+ mf->field = V4L2_FIELD_NONE;
return 0;
}
-static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_format *f)
+#if 0
+static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
bool ret = false;
- if ((f->fmt.pix.width == 1024) && (f->fmt.pix.height == 768)) {
+ if ((mf->width == 1024) && (mf->height == 768)) {
ret = true;
- } else if ((f->fmt.pix.width == 1280) && (f->fmt.pix.height == 1024)) {
+ } else if ((mf->width == 1280) && (mf->height == 1024)) {
ret = true;
- } else if ((f->fmt.pix.width == 1600) && (f->fmt.pix.height == 1200)) {
+ } else if ((mf->width == 1600) && (mf->height == 1200)) {
ret = true;
- } else if ((f->fmt.pix.width == 2048) && (f->fmt.pix.height == 1536)) {
+ } else if ((mf->width == 2048) && (mf->height == 1536)) {
ret = true;
- } else if ((f->fmt.pix.width == 2592) && (f->fmt.pix.height == 1944)) {
+ } else if ((mf->width == 2592) && (mf->height == 1944)) {
ret = true;
}
if (ret == true)
- SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, f->fmt.pix.width, f->fmt.pix.height);
+ SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height);
return ret;
}
-static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_format *f)
+static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
bool ret = false;
- if ((f->fmt.pix.width == 1280) && (f->fmt.pix.height == 720)) {
+ if ((mf->width == 1280) && (mf->height == 720)) {
ret = true;
- } else if ((f->fmt.pix.width == 1920) && (f->fmt.pix.height == 1080)) {
+ } else if ((mf->width == 1920) && (mf->height == 1080)) {
ret = true;
}
if (ret == true)
- SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, f->fmt.pix.width, f->fmt.pix.height);
+ SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height);
return ret;
}
-static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
+#endif
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- struct i2c_client *client = sd->priv;
+ struct i2c_client *client = v4l2_get_subdevdata(sd);
+ const struct sensor_datafmt *fmt;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
- const struct v4l2_queryctrl *qctrl;
- struct soc_camera_device *icd = client->dev.platform_data;
- struct reginfo *winseqe_set_addr=NULL;
- char readval;
+ struct reginfo *winseqe_set_addr=NULL;
int ret=0, set_w,set_h;
-
-u16 AE_reg, AGC_reg;
- u8 temp_reg12,temp_reg13;
- u16 shutter,reg_1, reg;
+ u8 reg_1, reg;
+ u16 shutter;
//turn on scaler for preivew
sensor_read(client ,0x3201, ®_1);
sensor_write(client, 0x32f1, (reg|0x10) );
#if 0 //preview_fastmode
+ u16 AE_reg, AGC_reg;
+ u8 temp_reg12,temp_reg13
// turn off AE for preview
sensor_read(client ,0x3201, &AE_reg);
sensor_write(client, 0x3201, (AE_reg|0x20) );
sensor_read(client, 0x3013, &temp_reg13);
shutter = (temp_reg13 & 0x00FF) | (temp_reg12 << 8);
#endif
- if (sensor->info_priv.pixfmt != pix->pixelformat) {
- switch (pix->pixelformat)
+ fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,
+ ARRAY_SIZE(sensor_colour_fmts));
+ if (!fmt) {
+ ret = -EINVAL;
+ goto sensor_s_fmt_end;
+ }
+
+ if (sensor->info_priv.fmt.code != mf->code) {
+ switch (mf->code)
{
- case V4L2_PIX_FMT_YUYV:
+ case V4L2_MBUS_FMT_YUYV8_2X8:
{
winseqe_set_addr = sensor_ClrFmt_YUYV;
break;
}
- case V4L2_PIX_FMT_UYVY:
+ case V4L2_MBUS_FMT_UYVY8_2X8:
{
winseqe_set_addr = sensor_ClrFmt_UYVY;
break;
}
if (winseqe_set_addr != NULL) {
sensor_write_array(client, winseqe_set_addr);
- sensor->info_priv.pixfmt = pix->pixelformat;
-
- SENSOR_DG("%s Pixelformat(0x%x) set success!\n", SENSOR_NAME_STRING(),pix->pixelformat);
+ sensor->info_priv.fmt.code = mf->code;
+ sensor->info_priv.fmt.colorspace= mf->colorspace;
+ SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code);
} else {
- SENSOR_TR("%s Pixelformat(0x%x) is invalidate!\n", SENSOR_NAME_STRING(),pix->pixelformat);
+ SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);
}
}
- set_w = pix->width;
- set_h = pix->height;
+ set_w = mf->width;
+ set_h = mf->height;
if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[0].reg)
{
{
winseqe_set_addr = SENSOR_INIT_WINSEQADR; /* ddl@rock-chips.com : Sensor output smallest size if isn't support app */
set_w = SENSOR_INIT_WIDTH;
- set_h = SENSOR_INIT_HEIGHT;
- ret = -1;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->height);
+ set_h = SENSOR_INIT_HEIGHT;
+ SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,mf->width,mf->height);
}
if ((int)winseqe_set_addr != sensor->info_priv.winseqe_cur_addr) {
#if CONFIG_SENSOR_Flash
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {
sensor_ioctrl(icd, Sensor_Flash, Flash_On);
SENSOR_DG("%s flash on in capture!\n", SENSOR_NAME_STRING());
if (ret != 0) {
SENSOR_TR("%s set format capability failed\n", SENSOR_NAME_STRING());
#if CONFIG_SENSOR_Flash
- if (sensor_fmt_capturechk(sd,f) == true) {
+ if (sensor_fmt_capturechk(sd,mf) == true) {
if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {
sensor_ioctrl(icd, Sensor_Flash, Flash_Off);
SENSOR_TR("%s Capture format set fail, flash off !\n", SENSOR_NAME_STRING());
SENSOR_DG("\n %s .. Current Format is validate. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),set_w,set_h);
}
- pix->width = set_w;
- pix->height = set_h;
+ mf->width = set_w;
+ mf->height = set_h;
sensor_s_fmt_end:
return ret;
}
-static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
-{
- struct v4l2_pix_format *pix = &f->fmt.pix;
- bool bayer = pix->pixelformat == V4L2_PIX_FMT_UYVY ||
- pix->pixelformat == V4L2_PIX_FMT_YUYV;
-
- /*
- * With Bayer format enforce even side lengths, but let the user play
- * with the starting pixel
- */
-
- if (pix->height > SENSOR_MAX_HEIGHT)
- pix->height = SENSOR_MAX_HEIGHT;
- else if (pix->height < SENSOR_MIN_HEIGHT)
- pix->height = SENSOR_MIN_HEIGHT;
- else if (bayer)
- pix->height = ALIGN(pix->height, 2);
-
- if (pix->width > SENSOR_MAX_WIDTH)
- pix->width = SENSOR_MAX_WIDTH;
- else if (pix->width < SENSOR_MIN_WIDTH)
- pix->width = SENSOR_MIN_WIDTH;
- else if (bayer)
- pix->width = ALIGN(pix->width, 2);
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
+{
+ struct i2c_client *client = v4l2_get_subdevdata(sd);
+ struct sensor *sensor = to_sensor(client);
+ const struct sensor_datafmt *fmt;
+ int ret = 0;
+
+ fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,
+ ARRAY_SIZE(sensor_colour_fmts));
+ if (fmt == NULL) {
+ fmt = &sensor->info_priv.fmt;
+ mf->code = fmt->code;
+ }
+
+ if (mf->height > SENSOR_MAX_HEIGHT)
+ mf->height = SENSOR_MAX_HEIGHT;
+ else if (mf->height < SENSOR_MIN_HEIGHT)
+ mf->height = SENSOR_MIN_HEIGHT;
+
+ if (mf->width > SENSOR_MAX_WIDTH)
+ mf->width = SENSOR_MAX_WIDTH;
+ else if (mf->width < SENSOR_MIN_WIDTH)
+ mf->width = SENSOR_MIN_WIDTH;
+
+ mf->colorspace = fmt->colorspace;
/*not support 720p video*/
- if(pix->height == 720 && pix->width == 1280){
- pix->height = 480;
- pix->width = 640;
+ if(mf->height == 720 && mf->width == 1280){
+ mf->height = 480;
+ mf->width = 640;
}
- return 0;
+ return ret;
}
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
{
- struct i2c_client *client = sd->priv;
+ struct i2c_client *client = v4l2_get_subdevdata(sd);
if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
return -EINVAL;
digitalzoom_cur = sensor->info_priv.digitalzoom;
digitalzoom_total = qctrl_info->maximum;
- if ((*value > 0) && (digitalzoom_cur >= digitalzoom_total))
+ if ((value > 0) && (digitalzoom_cur >= digitalzoom_total))
{
SENSOR_TR("%s digitalzoom is maximum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);
return -EINVAL;
}
- if ((*value < 0) && (digitalzoom_cur <= qctrl_info->minimum))
+ if ((value < 0) && (digitalzoom_cur <= qctrl_info->minimum))
{
SENSOR_TR("%s digitalzoom is minimum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);
return -EINVAL;
}
- if ((*value > 0) && ((digitalzoom_cur + *value) > digitalzoom_total))
+ if ((value > 0) && ((digitalzoom_cur + value) > digitalzoom_total))
{
- *value = digitalzoom_total - digitalzoom_cur;
+ value = digitalzoom_total - digitalzoom_cur;
}
- if ((*value < 0) && ((digitalzoom_cur + *value) < 0))
+ if ((value < 0) && ((digitalzoom_cur + value) < 0))
{
- *value = 0 - digitalzoom_cur;
+ value = 0 - digitalzoom_cur;
}
- digitalzoom_cur += *value;
+ digitalzoom_cur += value;
if (sensor_ZoomSeqe[digitalzoom_cur] != NULL)
{
SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
return -EINVAL;
}
- SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, *value);
+ SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
return 0;
}
static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
- struct i2c_client *client = sd->priv;
+ struct i2c_client *client = v4l2_get_subdevdata(sd);
struct sensor *sensor = to_sensor(client);
const struct v4l2_queryctrl *qctrl;
static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
- struct i2c_client *client = sd->priv;
- struct sensor *sensor = to_sensor(client);
- struct soc_camera_device *icd = client->dev.platform_data;
+ //struct i2c_client *client = v4l2_get_subdevdata(sd);
+ //struct sensor *sensor = to_sensor(client);
+ //struct soc_camera_device *icd = client->dev.platform_data;
const struct v4l2_queryctrl *qctrl;
static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_control *ext_ctrl)
{
const struct v4l2_queryctrl *qctrl;
- struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
- struct sensor *sensor = to_sensor(client);
+ //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
+ //struct sensor *sensor = to_sensor(client);
int val_offset;
qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);
static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)
{
- struct i2c_client *client = sd->priv;
+ struct i2c_client *client = v4l2_get_subdevdata(sd);
struct soc_camera_device *icd = client->dev.platform_data;
int i, error_cnt=0, error_idx=-1;
static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)
{
- struct i2c_client *client = sd->priv;
+ struct i2c_client *client = v4l2_get_subdevdata(sd);
struct soc_camera_device *icd = client->dev.platform_data;
int i, error_cnt=0, error_idx=-1;
/* soft reset */
ret = sensor_write(client, 0x3021, 0x61);
- if (ret != 0)
- {
+ if (ret != 0) {
SENSOR_TR("soft reset %s failed\n",SENSOR_NAME_STRING());
- return -ENODEV;
- }
+ ret = -ENODEV;
+ goto sensor_video_probe_err;
+ }
mdelay(5); //delay 5 microseconds
/* check if it is an sensor sensor */
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
}
static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
{
- struct i2c_client *client = sd->priv;
+ struct i2c_client *client = v4l2_get_subdevdata(sd);
struct soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
int ret = 0;
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
return ret;
}
+static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
+ enum v4l2_mbus_pixelcode *code)
+{
+ if (index >= ARRAY_SIZE(sensor_colour_fmts))
+ return -EINVAL;
+
+ *code = sensor_colour_fmts[index].code;
+ return 0;
+}
static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {
.init = sensor_init,
.g_ctrl = sensor_g_control,
};
static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {
- .s_fmt = sensor_s_fmt,
- .g_fmt = sensor_g_fmt,
- .try_fmt = sensor_try_fmt,
+ .s_mbus_fmt = sensor_s_fmt,
+ .g_mbus_fmt = sensor_g_fmt,
+ .try_mbus_fmt = sensor_try_fmt,
+ .enum_mbus_fmt = sensor_enum_fmt,
};
static struct v4l2_subdev_ops sensor_subdev_ops = {
/* Second stage probe - when a capture adapter is there */
icd->ops = &sensor_ops;
- icd->y_skip_top = 0;
+
+ sensor->info_priv.fmt = sensor_colour_fmts[0];
+
#if CONFIG_SENSOR_I2C_NOSCHED
atomic_set(&sensor->tasklock_cnt,0);
#endif
kfree(sensor);
sensor = NULL;
}
+ 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;
}