depends on SOC_CAMERA && I2C
help
This driver supports MT9T111 cameras from Micron.
-
+config SOC_CAMERA_MT9P111
+ tristate "mt9p111 support"
+ depends on SOC_CAMERA && I2C
+ help
+ This driver supports MT9P111 cameras from Micron.
config SOC_CAMERA_MT9D112
tristate "mt9d112 support"
depends on SOC_CAMERA && I2C
endchoice
config SOC_CAMERA_S5K6AA
- tristate "Samsung S5K6AA MIPI CSI-2 (importek mu736asa)"
+ tristate "Samsung S5K6AA camera support"
depends on SOC_CAMERA && I2C
help
- This is a samsung S5K6AA mobile camera driver
+ This is a samsung S5K6AA camera driver
config SOC_CAMERA_GT2005
tristate "GT2005 support"
#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_YUYV
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
#define CONFIG_SENSOR_WhiteBalance 1
#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
{
u8 reg;
.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;
+};
-#define JPG_FMT(_name, _depth, _fourcc) \
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
+/* 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;
+
+ return NULL;
+}
-static const struct soc_camera_data_format sensor_colour_formats[] = {
- JPG_FMT(SENSOR_NAME_STRING(YUYV), 16, V4L2_PIX_FMT_YUYV),
- //JPG_FMT(SENSOR_NAME_STRING(UYVY), 16, V4L2_PIX_FMT_UYVY),
+static const struct sensor_datafmt sensor_colour_fmts[] = {
+ {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;
struct sensor
}
#endif
-
+#if CONFIG_SENSOR_I2C_RDWRCHK
static int sensor_check_array(struct i2c_client *client, struct reginfo *regarray)
{
int ret;
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);
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;
int ret;
SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
}
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);
#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;
{
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;
}
static struct reginfo sensor_power_down_sequence[]=
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ 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;
int ret=0, set_w,set_h;
- 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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
+ sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
+ if (sensor->info_priv.whiteBalance != 0) {
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
+ sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
+ }
+ sensor->info_priv.snap2preview = true;
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
+ sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
+ sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
+ sensor->info_priv.video2preview = true;
+ } else if ((sensor->info_priv.snap2preview == true) || (sensor->info_priv.video2preview == true)) {
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
+ sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
+ sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
+ msleep(600);
+ sensor->info_priv.video2preview = false;
+ sensor->info_priv.snap2preview = false;
+ }
SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h);
}
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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
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 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-//#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_UYVY
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_YVYU
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
#define CONFIG_SENSOR_WhiteBalance 1
#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
{
.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;
struct sensor
preempt_enable();
}
}
-#endif
return 0;
sensor_task_lock_err:
- return -1;
+ return -1;
+#else
+ return 0;
+#endif
+
}
#if 0
{
int err = 0, cnt;
int i = 0;
+#if CONFIG_SENSOR_I2C_RDWRCHK
int j = 0;
char valchk;
+#endif
cnt = 0;
if (sensor_task_lock(client, 1) < 0)
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);
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;
- SENSOR_DG("\n-------------%s..%s.. %d,val = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__,val);
+ SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {
- SENSOR_DG("\n-------------%s..%s.. %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
ret = -ENODEV;
goto sensor_INIT_ERR;
}
ret = -ENODEV;
goto sensor_INIT_ERR;
}
-SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
mdelay(5); //delay 5 microseconds
/* check if it is an sensor sensor */
ret = sensor_read(client, 0x00, &value);
ret = -ENODEV;
goto sensor_INIT_ERR;
}
- SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+
if (value == SENSOR_ID) {
sensor->model = SENSOR_V4L2_IDENT;
} else {
ret = -ENODEV;
goto sensor_INIT_ERR;
}
-SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+
ret = sensor_write_array(client, sensor_init_data);
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;
-SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+ 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);
if (qctrl)
if (qctrl)
sensor->info_priv.focus = qctrl->default_value;
#endif
-SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+
#if CONFIG_SENSOR_Flash
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH);
if (qctrl)
#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;
- SENSOR_DG("\n----------------------------%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__);
+ 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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ 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;
int ret=0, set_w,set_h;
- SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
- if (sensor->info_priv.pixfmt != pix->pixelformat) {
- SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
- 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)
{
- SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
- case V4L2_PIX_FMT_YUYV:
+ case V4L2_MBUS_FMT_YUYV8_2X8:
{
- SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
winseqe_set_addr = sensor_ClrFmt_YUYV;
break;
}
- case V4L2_PIX_FMT_UYVY:
+ case V4L2_MBUS_FMT_UYVY8_2X8:
{
- SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
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;
- SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+
+ set_w = mf->width;
+ set_h = mf->height;
+
if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[0].reg)
{
winseqe_set_addr = sensor_qcif;
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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->height);
+ SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,mf->width,mf->height);
}
- SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+
if ((int)winseqe_set_addr != sensor->info_priv.winseqe_cur_addr) {
+ #if CONFIG_SENSOR_Flash
+ 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());
+ }
+ } else { /* ddl@rock-chips.com : Video */
+ if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {
+ sensor_ioctrl(icd, Sensor_Flash, Flash_Off);
+ SENSOR_DG("%s flash off in preivew!\n", SENSOR_NAME_STRING());
+ }
+ }
+ #endif
ret |= sensor_write_array(client, winseqe_set_addr);
if (ret != 0) {
SENSOR_TR("%s set format capability failed\n", SENSOR_NAME_STRING());
+ #if CONFIG_SENSOR_Flash
+ 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());
+ }
+ }
+ #endif
goto sensor_s_fmt_end;
}
sensor->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
if (sensor->info_priv.whiteBalance != 0) {
sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
}
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
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;
}
int ret;
struct sensor *sensor = to_sensor(client);
- SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
-
/* We must have a parent by now. And it cannot be a wrong one.
* So this entire test is completely redundant. */
if (!icd->dev.parent ||
ret = -ENODEV;
goto sensor_video_probe_err;
}
- SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+
/* soft reset */
ret = sensor_write(client, 0xfe, 0x80);
if (ret != 0)
return -ENODEV;
}
mdelay(5); //delay 5 microseconds
-SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+
/* check if it is an sensor sensor */
ret = sensor_read(client, 0x00, &value);
if (ret != 0) {
ret = -ENODEV;
goto sensor_video_probe_err;
}
-SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+
if (value == SENSOR_ID) {
sensor->model = SENSOR_V4L2_IDENT;
SENSOR_TR("chip id:0x%x\n",value);
ret = -ENODEV;
goto sensor_video_probe_err;
}
-
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-SENSOR_DG("--------------------%s , %s, %d\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__);
+
return 0;
sensor_video_probe_err:
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
#define SENSOR_INIT_WIDTH 1024 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 768
#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 1
#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
{
.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;
+};
-#define JPG_FMT(_name, _depth, _fourcc) \
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
+/* 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;
-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),
+ return NULL;
+}
+
+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;
struct sensor
{
int err = 0, cnt;
int i = 0;
+#if CONFIG_SENSOR_I2C_RDWRCHK
int j = 0;
char valchk;
+#endif
cnt = 0;
if (sensor_task_lock(client, 1) < 0)
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);
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;
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);
#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;
{
struct soc_camera_device *icd = client->dev.platform_data;
+ 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);
+ 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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ 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;
int ret=0, set_w,set_h;
- SENSOR_TR("sensor_s_fmt\n");
- 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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
if (sensor->info_priv.whiteBalance != 0) {
sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
}
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
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;
}
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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,
.g_ext_ctrls = sensor_g_ext_controls,
.s_ext_ctrls = sensor_s_ext_controls,
.g_chip_ident = sensor_g_chip_ident,
- .ioctl = sensor_ioctl,
+ .ioctl = sensor_ioctl,
};
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
#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_YUYV
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
#define CONFIG_SENSOR_WhiteBalance 1
#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;
.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;
struct sensor
return err;
}
-
+#if CONFIG_SENSOR_I2C_RDWRCHK
static int sensor_check_array(struct i2c_client *client, struct reginfo *regarray)
{
int ret;
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);
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;
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);
#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;
{
struct soc_camera_device *icd = client->dev.platform_data;
+ 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 */
+ if (sensor->info_priv.funmodule_state & SENSOR_INIT_IS_OK) {
sensor_write(client, 0x30b0, 0x00);
sensor_write(client, 0x30b1, 0x00);
+ }
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ const struct sensor_datafmt *fmt;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
-#if CONFIG_SENSOR_Flash
+ const struct v4l2_queryctrl *qctrl;
struct soc_camera_device *icd = client->dev.platform_data;
-#endif
struct reginfo *winseqe_set_addr=NULL;
int ret=0, set_w,set_h;
- 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);
+ 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->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
+ sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
+ if (sensor->info_priv.whiteBalance != 0) {
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
+ sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
+ }
+ sensor->info_priv.snap2preview = true;
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
+ sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
+ sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
+ sensor->info_priv.video2preview = true;
+ } else if ((sensor->info_priv.snap2preview == true) || (sensor->info_priv.video2preview == true)) {
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
+ sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
+ qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
+ sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
+ msleep(600);
+ sensor->info_priv.video2preview = false;
+ sensor->info_priv.snap2preview = false;
+ }
SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h);
}
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
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;
}
}
#endif
#if CONFIG_SENSOR_Flash
-static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)
-{
- struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
- struct sensor *sensor = to_sensor(client);
- const struct v4l2_queryctrl *qctrl_info;
-
+static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
+{
if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) {
if (value == 3) { /* ddl@rock-chips.com: torch */
sensor_ioctrl(icd, Sensor_Flash, Flash_Torch); /* Flash On */
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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(&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl));
+ memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl));
}
}
sensor->info_priv.flash = 0xff;
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
ret = sensor_video_probe(icd, client);
- if (ret) {
+ if (ret < 0) {
icd->ops = NULL;
i2c_set_clientdata(client, NULL);
kfree(sensor);
+ sensor = NULL;
}
SENSOR_DG("\n%s..%s..%d ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret);
return ret;
#define SENSOR_INIT_WIDTH 1600 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 1200
#define SENSOR_INIT_WINSEQADR sensor_uxga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_UYVY
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8
#define CONFIG_SENSOR_WhiteBalance 1
#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)
#define END_REG 0xff
struct reginfo
.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;
+};
-#define JPG_FMT(_name, _depth, _fourcc) \
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
+/* 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;
+
+ 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);
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;
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);
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;
-
+ 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 */
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
+ const struct sensor_datafmt *fmt;
const struct v4l2_queryctrl *qctrl;
struct soc_camera_device *icd = client->dev.platform_data;
struct reginfo *winseqe_set_addr=NULL;
int ret=0, set_w,set_h;
- 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 != END_REG))
{
set_w = SENSOR_INIT_WIDTH;
set_h = SENSOR_INIT_HEIGHT;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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());
sensor->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
- 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 CONFIG_SENSOR_Effect
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
}
#endif
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
#if CONFIG_SENSOR_Effect
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
}
#endif
#if CONFIG_SENSOR_DigitalZoom
-static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)
+static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
{
struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
struct sensor *sensor = to_sensor(client);
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;
}
- 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;
}
ret = -ENODEV;
goto sensor_video_probe_err;
}
-
-
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
+
return 0;
sensor_video_probe_err:
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,
.ioctl = sensor_ioctl,
};
+
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
#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_UYVY
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8
#define CONFIG_SENSOR_WhiteBalance 1
#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)
//lxh end of reg flag
#define END_REG 0xff
.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;
+};
-#define JPG_FMT(_name, _depth, _fourcc) \
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
+/* 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;
+
+ 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;
preempt_enable();
}
}
-#endif
return 0;
sensor_task_lock_err:
- return -1;
+ return -1;
+#else
+ return 0;
+#endif
}
#if 0
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);
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;
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);
#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;
-
+ 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 */
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
+ const struct sensor_datafmt *fmt;
const struct v4l2_queryctrl *qctrl;
struct soc_camera_device *icd = client->dev.platform_data;
struct reginfo *winseqe_set_addr=NULL;
int ret=0, set_w,set_h;
- 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 != END_REG))
{
set_w = SENSOR_INIT_WIDTH;
set_h = SENSOR_INIT_HEIGHT;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
- 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 CONFIG_SENSOR_Effect
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
}
#endif
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
#if CONFIG_SENSOR_Effect
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
}
#endif
#if CONFIG_SENSOR_DigitalZoom
-static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)
+static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
{
struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
struct sensor *sensor = to_sensor(client);
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;
}
goto sensor_video_probe_err;
}
-
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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
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 CONS(a,b) _CONS(a,b)
#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_UYVY
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8
#define YUV420_BUFFER_MAX_SIZE 7558272 /* 2592*1944*1.5*/
#define CONFIG_SENSOR_WhiteBalance 1
{0x8404,0x06, BYTE_LEN, 0 },
{SEQUENCE_END, 0x00, 0, 0}
};
-
+#if 0
static struct reginfo sensor_Effect_WandB[] =
{
{SEQUENCE_END, 0x00, 0, 0}
};
-
+#endif
static struct reginfo sensor_Effect_Sepia[] =
{
{0x098e,0xdc38, WORD_LEN, 0},
{0x8404,0x06, BYTE_LEN, 0 },
{SEQUENCE_END, 0x00, 0, 0}
};
+#if 0
static struct reginfo sensor_Effect_Bluish[] =
{
{SEQUENCE_END, 0x00, 0, 0}
{
{SEQUENCE_END, 0x00, 0, 0}
};
-
+#endif
static struct reginfo sensor_Effect_Solarize[] =
{
{0x098e,0xdc38, WORD_LEN, 0},
.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;
+};
-#define JPG_FMT(_name, _depth, _fourcc) \
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
+/* 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;
-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),
+ return NULL;
+}
+
+static const struct sensor_datafmt sensor_colour_fmts[] = {
+ {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
+ {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}
};
enum sensor_work_state
{
int preview_w;
int preview_h;
struct reginfo *winseqe_cur_addr;
- unsigned int pixfmt;
+ struct sensor_datafmt fmt;
unsigned int enable;
unsigned int funmodule_state;
} sensor_info_priv_t;
int i=0;
int sum =0;
struct reginfo *tmpval = NULL;
- u8 buf[1600];
+ u8 *buf;
struct i2c_msg msg[1];
tmpval = reg_info;
return -EINVAL;
memset((char*)&msg[0],0,sizeof(struct i2c_msg));
- memset(buf,0,1600*sizeof(u8));
+ buf = kmalloc((count*2+10)*sizeof(u8),GFP_KERNEL);
+ if (buf == NULL) {
+ SENSOR_TR("%s %s fail,because kmalloc failed",SENSOR_NAME_STRING(),__FUNCTION__);
+ err = -1;
+ goto sensor_write_Multiple_data_end;
+ }
+ memset(buf,0,sizeof(buf));
switch (reg_info->reg)
{
}
}
}
+sensor_write_Multiple_data_end:
+ if (buf) {
+ kfree(buf);
+ buf = NULL;
+ }
return err;
}
struct i2c_msg msg[2];
buf[0] = reg >> 8;
- buf[1] = reg & 0xFF;
+ buf[1] = reg & 0xFF;
msg[0].addr = client->addr;
msg[0].flags = client->flags;
num++;
j++;
}
- //SENSOR_TR("%s ..%s..num =%d,regarray[%d].reg=0x%x\n",SENSOR_NAME_STRING(),__FUNCTION__,num,i,regarray[i].reg);
err = sensor_write_Multiple_data(client, ®array[i], num) ;
if (err < 0)
{
i=i+num;
}
- // SENSOR_TR("%s ..%s..quit\n",SENSOR_NAME_STRING(),__FUNCTION__);
-
sensor_write_array_end:
sensor_task_lock(client,0);
return err;
static int sensor_write_init_data(struct i2c_client *client, struct reginfo *regarray)
{
int err = 0, cnt;
- int i = 0,j=0;
- int num = 0;
- u16 temp = 0;
+ int i = 0;
+ int num = 0;
#if CONFIG_SENSOR_I2C_RDWRCHK
char valchk;
#endif
- cnt = 0;
-
- int ti=0;
+ int ti=0;
int table[167] = { /*written data numbers every time*/
3,1,1,3,1,1,1,1,11,2,2,13,1,1,1,2,11,2,2,13,
1,2,1,1,2,1,1,1,1,1,8,1,1,1,1,1,1,714,1,1,
4,6,1,1,1,1,1
};
+ cnt = 0;
if (sensor_task_lock(client, 1) < 0)
goto sensor_write_array_end;
-
- // SENSOR_TR("%s ..%s..\n",SENSOR_NAME_STRING(),__FUNCTION__);
while (regarray[i].reg != SEQUENCE_END) {
num = table[ti];
ti++;
}
- // SENSOR_TR("%s ..%s..num =%d,regarray[%d].reg=0x%x\n",SENSOR_NAME_STRING(),__FUNCTION__,num,i,regarray[i].reg);
err = sensor_write_Multiple_data(client, ®array[i], num) ;
if (err < 0)
{
}
i=i+num;
}
- // SENSOR_TR("%s ..%s..quit\n",SENSOR_NAME_STRING(),__FUNCTION__);
-
sensor_write_array_end:
sensor_task_lock(client,0);
return err;
struct i2c_client *client = sd->priv;
struct soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
+#if (ADJUST_OPTIMIZE_TIME_FALG == 0)
const struct v4l2_queryctrl *qctrl;
+#endif
+ const struct sensor_datafmt *fmt;
int ret,pid = 0;
int index =0 ;
+#if (SENSOR_RESET_REG != SEQUENCE_END)
+ struct reginfo reg_info;
+#endif
SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
goto sensor_INIT_ERR;
#if (SENSOR_RESET_REG != SEQUENCE_END)
- struct reginfo reg_info;
reg_info.reg = SENSOR_RESET_REG;
reg_info.val = SENSOR_RESET_VAL;
reg_info.reg_len = SENSOR_RESET_REG_LEN;
}
SENSOR_DG("\n sensor_init_data..%s.\n",SENSOR_NAME_STRING());
-
- // ret = sensor_write_array(client, sensor_init_data);
+
ret =sensor_write_init_data(client, sensor_init_data);
- if (ret != 0)
- {
+ if (ret != 0) {
SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());
goto sensor_INIT_ERR;
}
sensor->info_priv.capture_w = SENSOR_MAX_WIDTH;
sensor->info_priv.capture_h = SENSOR_MAX_HEIGHT;
sensor->info_priv.winseqe_cur_addr = 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 */
#if ADJUST_OPTIMIZE_TIME_FALG
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 soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
-
- SENSOR_DG("\n%s..%s.. \n",__FUNCTION__,SENSOR_NAME_STRING());
- 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)
+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 struct reginfo* sensor_fmt_catch(int set_w, int set_h, int *ret_w, int *ret_h)
/*modify image with resolution 2592*1944;solve bug that the first 32 pixel data*/
/*in the first line have misplace with the last 32 pixel data in the last line*/
-static int sensor_cb(struct videobuf_buffer *vb)
+static int sensor_cb(void *arg)
{
void __iomem *vbpmem;
- struct videobuf_buffer *buffer = vb;
+ struct videobuf_buffer *buffer;
char *imagey_addr =NULL;
char *imageuv_addr = NULL;
char *tempaddr = NULL;
int tempsize = 0;
-
+ buffer = (struct videobuf_buffer*)arg;
if(buffer->width!=SENSOR_MAX_WIDTH||buffer->height!=SENSOR_MAX_HEIGHT||buffer==NULL)
return -EINVAL;
if (buffer->bsize< YUV420_BUFFER_MAX_SIZE) //yuv420 format size
return -EINVAL;
+
vbpmem = ioremap(buffer->boff,buffer->bsize);
- if(vbpmem == NULL)
- {
+ if(vbpmem == NULL) {
SENSOR_DG("\n%s..%s..ioremap fail\n",__FUNCTION__,SENSOR_NAME_STRING());
return -ENXIO;
- }
+ }
imagey_addr = (char*)vbpmem; // y data to be dealed with
imageuv_addr = imagey_addr+buffer->width*buffer->height;
- // SENSOR_DG("\n%s..%s..imagey_addr = 0x%x; imageuv_addr = 0x%x\n",__FUNCTION__,SENSOR_NAME_STRING(),imagey_addr,imageuv_addr);
-// SENSOR_DG("\n%s..%s..buffer->bsize=%d\n",__FUNCTION__,SENSOR_NAME_STRING(),buffer->bsize);
-
tempaddr = imageuv_addr - 32;
memcpy(tempaddr,imagey_addr,32);
}
-static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
struct soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
+ const struct sensor_datafmt *fmt;
struct reginfo *winseqe_set_addr=NULL;
int ret = 0, set_w,set_h,cnt;
u16 seq_state=0;
SENSOR_DG("\n%s..%s.. \n",__FUNCTION__,SENSOR_NAME_STRING());
- 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;
winseqe_set_addr = sensor_fmt_catch(set_w, set_h, &set_w, &set_h);
SENSOR_DG("\n%s..%s..Capture icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h);
} else {
SENSOR_DG("\n%s..%s..Video icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h);
- sensor->info_priv.preview_w = pix->width;
- sensor->info_priv.preview_h = pix->height;
+ sensor->info_priv.preview_w = mf->width;
+ sensor->info_priv.preview_h = mf->height;
}
}
SENSOR_TR("%s Preview 2 Capture failed\n", SENSOR_NAME_STRING());
goto sensor_s_fmt_end;
}
- SENSOR_DG("mt9p111 Preview 2 Capture again\n",cnt,seq_state);
+ SENSOR_DG("mt9p111 Preview 2 Capture again\n");
}
SENSOR_DG("mt9p111 Preview 2 Capture count = %d;seq_state = 0x%x\n",cnt,seq_state);
} while((seq_state != 0x07) && (time < 4));
sensor->info_priv.capture_h = set_h;
sensor->info_priv.snap2preview = true;
} else if (sensor->info_priv.snap2preview == true) {
- if (winseqe_set_addr || ((sensor->info_priv.preview_w == pix->width) && (sensor->info_priv.preview_h == pix->height))) {
+ if (winseqe_set_addr || ((sensor->info_priv.preview_w == mf->width) && (sensor->info_priv.preview_h == mf->height))) {
ret |= sensor_write_array(client, sensor_Capture2Preview);
if (ret != 0) {
SENSOR_TR("%s Capture 2 Preview success\n", SENSOR_NAME_STRING());
SENSOR_DG("%s flash off in preivew!\n", SENSOR_NAME_STRING());
}
#endif
- sensor->info_priv.preview_w = pix->width;
- sensor->info_priv.preview_h = pix->height;
+ sensor->info_priv.preview_w = mf->width;
+ sensor->info_priv.preview_h = mf->height;
sensor->info_priv.snap2preview = false;
} else {
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->height);
+ SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,mf->width,mf->height);
}
}
- 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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- int ret = 0;
- 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);
-
- if (sensor_fmt_catch(pix->width, pix->height, &pix->width, &pix->height) == NULL) {
- pix->width = 0;
- pix->height = 0;
- }
-
+ struct i2c_client *client = sd->priv;
+ 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;
+
return ret;
}
-
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
{
struct i2c_client *client = sd->priv;
}
#endif
#if CONFIG_SENSOR_DigitalZoom
-static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)
+static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
{
struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
struct sensor *sensor = to_sensor(client);
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;
}
}
#endif
#if CONFIG_SENSOR_Flash
-static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)
-{
- struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
- struct sensor *sensor = to_sensor(client);
- const struct v4l2_queryctrl *qctrl_info;
-
+static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
+{
if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) {
if (value == 3) { /* ddl@rock-chips.com: torch */
sensor_ioctrl(icd, Sensor_Flash, Flash_Torch); /* Flash On */
{
int ret,pid = 0;
struct sensor *sensor = to_sensor(client);
-
+#if (SENSOR_RESET_REG != SEQUENCE_END)
+ struct reginfo reg_info;
+#endif
/* We must have a parent by now. And it cannot be a wrong one.
* So this entire test is completely redundant. */
if (!icd->dev.parent ||
}
/* soft reset */
-#if (SENSOR_RESET_REG != SEQUENCE_END)
- struct reginfo reg_info;
+#if (SENSOR_RESET_REG != SEQUENCE_END)
reg_info.reg = SENSOR_RESET_REG;
reg_info.val = SENSOR_RESET_VAL;
reg_info.reg_len = SENSOR_RESET_REG_LEN;
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
struct i2c_client *client = sd->priv;
struct soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
+#if CONFIG_SENSOR_Flash
+ int i;
+#endif
int ret = 0;
rk29_camera_sensor_cb_s *icd_cb =NULL;
/* ddl@rock-chips.com : if gpio_flash havn't been set in board-xxx.c, sensor driver must notify is not support flash control
for this project */
#if CONFIG_SENSOR_Flash
- int i;
if (sensor->sensor_gpio_res) {
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(&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl));
+ memset((char*)(icd->ops->controls+i),0x00,sizeof(struct v4l2_queryctrl));
}
}
sensor->info_priv.flash = 0xff;
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,
.g_chip_ident = sensor_g_chip_ident,
.ioctl = sensor_ioctl,
};
-
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,
.s_stream = sensor_s_stream,
};
-
static struct v4l2_subdev_ops sensor_subdev_ops = {
.core = &sensor_subdev_core_ops,
.video = &sensor_subdev_video_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
#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;
.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);
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);
#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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ 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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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 = sd->priv;
+ 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)
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;
}
/* 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:
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
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 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_YUYV//V4L2_PIX_FMT_UYVY
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
#define CONFIG_SENSOR_WhiteBalance 0
#define CONFIG_SENSOR_Brightness 1
.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;
} sensor_info_priv_t;
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;
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);
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
+ const struct sensor_datafmt *fmt;
const struct v4l2_queryctrl *qctrl;
struct soc_camera_device *icd = client->dev.platform_data;
struct reginfo *winseqe_set_addr=NULL;
int ret=0, set_w,set_h;
- 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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
- 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 CONFIG_SENSOR_Effect
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
}
#endif
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
#if CONFIG_SENSOR_Effect
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
-
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
{
struct i2c_client *client = sd->priv;
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
struct i2c_client *client = sd->priv;
struct soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
- int ret = 0,i;
+ int ret = 0;
SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);
switch (cmd)
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
#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_UYVY
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8
#define CONFIG_SENSOR_WhiteBalance 1
#define CONFIG_SENSOR_Brightness 0
.num_controls = ARRAY_SIZE(sensor_controls),
.num_menus = ARRAY_SIZE(sensor_menus),
};
+/* only one fixed colorspace per pixelcode */
+struct sensor_datafmt {
+ enum v4l2_mbus_pixelcode code;
+ enum v4l2_colorspace colorspace;
+};
-#define COL_FMT(_name, _depth, _fourcc, _colorspace) \
- { .name = _name, .depth = _depth, .fourcc = _fourcc, \
- .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;
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;
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);
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ 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;
int ret=0, set_w,set_h;
- 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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
if (sensor->info_priv.whiteBalance != 0) {
sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
}
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
-
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
{
struct i2c_client *client = sd->priv;
ret = -ENODEV;
goto sensor_video_probe_err;
}
-
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
return 0;
sensor_video_probe_err:
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,
.g_chip_ident = sensor_g_chip_ident,
.ioctl = sensor_ioctl,
};
-
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
#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_YUYV
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
#define CONFIG_SENSOR_WhiteBalance 1
#define CONFIG_SENSOR_Brightness 0
{0x5061, 0x7d },
{0x5062, 0x7d },
{0x5063, 0x69 },
- {0x0100, 0x01 },
+ {0x0100, 0x01 },
{0x0000 ,0x00}
};
static int sensor_resume(struct soc_camera_device *icd);
static int sensor_set_bus_param(struct soc_camera_device *icd,unsigned long flags);
static unsigned long sensor_query_bus_param(struct soc_camera_device *icd);
+#if CONFIG_SENSOR_Effect
static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);
+#endif
+#if CONFIG_SENSOR_WhiteBalance
static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);
+#endif
static int sensor_deactivate(struct i2c_client *client);
static struct soc_camera_ops sensor_ops =
.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;
+};
-#define JPG_FMT(_name, _depth, _fourcc) \
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
+/* 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;
+
+ 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;
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;
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);
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ 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;
int ret=0, set_w,set_h;
- 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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
if (sensor->info_priv.whiteBalance != 0) {
sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
}
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
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;
}
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
struct i2c_client *client = sd->priv;
struct soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
- int ret = 0,i;
+ int ret = 0;
+#if CONFIG_SENSOR_Flash
+ int i;
+#endif
SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);
switch (cmd)
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,
.g_ext_ctrls = sensor_g_ext_controls,
.s_ext_ctrls = sensor_s_ext_controls,
.g_chip_ident = sensor_g_chip_ident,
- .ioctl = sensor_ioctl,
+ .ioctl = sensor_ioctl,
};
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 = {
.core = &sensor_subdev_core_ops,
.video = &sensor_subdev_video_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
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 CONS(a,b) _CONS(a,b)
#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_init_data
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_YUYV
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
#define CONFIG_SENSOR_WhiteBalance 1
#define CONFIG_SENSOR_Brightness 0
.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(YUYV), 16, V4L2_PIX_FMT_YUYV),
- 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}
};
-
enum sensor_work_state
{
sensor_work_ready = 0,
unsigned char mirror; /* HFLIP */
unsigned char flip; /* VFLIP */
unsigned int winseqe_cur_addr;
- unsigned int pixfmt;
+ struct sensor_datafmt fmt;
unsigned int enable;
unsigned int funmodule_state;
} sensor_info_priv_t;
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;
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);
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ const struct sensor_datafmt *fmt;
struct soc_camera_device *icd = client->dev.platform_data;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
const struct v4l2_queryctrl *qctrl;
struct reginfo *winseqe_set_addr=NULL;
int ret=0, set_w,set_h;
int isCapture = 0;
- 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;
- isCapture = sensor_fmt_capturechk(sd, f);
+ set_w = mf->width;
+ set_h = mf->height;
+ isCapture = sensor_fmt_capturechk(sd, mf);
if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[isCapture][0].reg)
{
}
else if (((set_w <= 352) && (set_h<= 288)) && sensor_cif[isCapture][0].reg)
{
- //printk("===> isCapture: %d!\n", isCapture);
winseqe_set_addr = sensor_cif[isCapture];
set_w = 352;
set_h = 288;
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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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)
- {
- //srt --if capture,then should write sensor_qxga[1] first
-
- if((winseqe_set_addr != sensor_qxga[isCapture]) && isCapture)
- {
+ if ((int)winseqe_set_addr != sensor->info_priv.winseqe_cur_addr){
+ //srt --if capture,then should write sensor_qxga[1] first
+ if((winseqe_set_addr != sensor_qxga[isCapture]) && isCapture) {
SENSOR_DG("%s write sensor_qxga[1]\n", SENSOR_NAME_STRING());
ret = sensor_write_array(client, sensor_qxga[isCapture]);
- if (ret != 0)
- {
+ if (ret != 0) {
SENSOR_TR("%s write sensor_qxga[1] failed\n", SENSOR_NAME_STRING());
return ret;
}
#endif
#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());
goto sensor_s_fmt_end;
} else {
sensor->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
if (sensor->info_priv.whiteBalance != 0) {
sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
}
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
mdelay(100); // by FAE.
}
SENSOR_DG("\n%s..%s.. icd->width=%d..icd->height=%d..isCapture=%d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h,isCapture);
- }
- else
- {
+ } else {
SENSOR_TR("\n %s .. Current Format is validate. icd->width=%d..icd->height=%d..isCapture=%d\n",SENSOR_NAME_STRING(),set_w,set_h,isCapture);
}
-
- //add by duanyp. Improve the green phenomenon when startup camera every time.
- //mdelay(500);
-
+ 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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ 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 sensor *sensor = to_sensor(client);
- #if CONFIG_SENSOR_Focus
+ #if CONFIG_SENSOR_Focus
struct soc_camera_device *icd = client->dev.platform_data;
- struct v4l2_format fmt;
- #endif
+ struct v4l2_mbus_framefmt mf;
+ #endif
if (enable == 1) {
sensor->info_priv.enable = 1;
#if CONFIG_SENSOR_Focus
- fmt.fmt.pix.width = icd->user_width;
- fmt.fmt.pix.height = icd->user_height;
+ 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;
/* If auto focus firmware haven't download success, must download firmware again when in video or preview stream on */
- if (sensor_fmt_capturechk(sd, &fmt) == false) {
+ if (sensor_fmt_capturechk(sd, &mf) == false) {
if ((sensor->info_priv.affm_reinit == 1) || ((sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK)==0)) {
if (sensor->sensor_wq != NULL) {
mutex_lock(&sensor->wq_lock);
ret = -ENODEV;
goto sensor_video_probe_err;
}
-
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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,
.s_stream = sensor_s_stream,
};
/* 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
#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_PIX_FMT_YUYV
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
#define CONFIG_SENSOR_WhiteBalance 1
#define CONFIG_SENSOR_Brightness 0
{0x370c, 0x03},
{0x3a02, 0x03},
{0x3a03, 0xd8},
+ {0x3a08 ,0x01},///
+ {0x3a09, 0x27},///
+ {0x3a0a, 0x00},///
+ {0x3a0b, 0xf6},///
{0x3a0e, 0x03},
{0x3a0d, 0x04},
{0x3a14, 0x03},
{0x3a15, 0xd8},
{0x4004, 0x02},
+ {0x3002, 0x1c},////
+ {0x4713, 0x03},////
{0x3035, 0x21},
{0x3036, 0x46},
{0x4837, 0x22},
+ {0x3824, 0x02},////
{0x5001, 0xa3},
{SEQUENCE_END, 0x00}
};
.num_controls = ARRAY_SIZE(sensor_controls),
.num_menus = ARRAY_SIZE(sensor_menus),
};
+/* only one fixed colorspace per pixelcode */
+struct sensor_datafmt {
+ enum v4l2_mbus_pixelcode code;
+ enum v4l2_colorspace colorspace;
+};
-#define COL_FMT(_name, _depth, _fourcc, _colorspace) \
- { .name = _name, .depth = _depth, .fourcc = _fourcc, \
- .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}
};
enum sensor_work_state
{
unsigned char mirror; /* HFLIP */
unsigned char flip; /* VFLIP */
struct reginfo *winseqe_cur_addr;
- unsigned int pixfmt;
+ struct sensor_datafmt fmt;
unsigned int enable;
unsigned int funmodule_state;
} sensor_info_priv_t;
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;
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 = 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);
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd,struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ 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;
int ret = 0, set_w,set_h;
- 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!=SEQUENCE_END))
{
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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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 (winseqe_set_addr != sensor->info_priv.winseqe_cur_addr)
{
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
sensor_parameter_record(client);
/*#if CONFIG_SENSOR_Focus
sensor_af_idlechk(client);
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->info_priv.winseqe_cur_addr = winseqe_set_addr;
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
sensor_ae_transfer(client);
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);
}
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
{
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
int ret = 0;
qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_ABSOLUTE);
- if (!qctrl_info)
- return -EINVAL;
+ if (!qctrl_info) {
+ ret = -EINVAL;
+ goto sensor_set_focus_absolute_end;
+ }
if ((sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK) && (sensor->info_priv.affm_reinit == 0)) {
if ((value >= qctrl_info->minimum) && (value <= qctrl_info->maximum)) {
int ret = 0;
qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_RELATIVE);
- if (!qctrl_info)
- return -EINVAL;
+ if (!qctrl_info) {
+ ret = -EINVAL;
+ goto sensor_set_focus_relative_end;
+ }
if ((sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK) && (sensor->info_priv.affm_reinit == 0)) {
if ((value >= qctrl_info->minimum) && (value <= qctrl_info->maximum)) {
struct sensor *sensor = to_sensor(client);
#if CONFIG_SENSOR_Focus
struct soc_camera_device *icd = client->dev.platform_data;
- struct v4l2_format fmt;
+ struct v4l2_mbus_framefmt mf;
#endif
if (enable == 1) {
sensor->info_priv.enable = 1;
#if CONFIG_SENSOR_Focus
- fmt.fmt.pix.width = icd->user_width;
- fmt.fmt.pix.height = icd->user_height;
+ 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;
/* If auto focus firmware haven't download success, must download firmware again when in video or preview stream on */
- if (sensor_fmt_capturechk(sd, &fmt) == false) {
+ if (sensor_fmt_capturechk(sd, &mf) == false) {
if ((sensor->info_priv.affm_reinit == 1) || ((sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK)==0)) {
if (sensor->sensor_wq != NULL) {
mutex_lock(&sensor->wq_lock);
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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,
.s_stream = sensor_s_stream,
};
/* 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
#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 1
#define CONFIG_SENSOR_Brightness 0
static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);
static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);
static int sensor_deactivate(struct i2c_client *client);
-static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_format *f);
-static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_format *f);
+static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf);
+static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf);
static struct soc_camera_ops sensor_ops =
{
.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}
};
+
enum sensor_work_state
{
sensor_work_ready = 0,
bool snap2preview;
bool video2preview;
struct reginfo *winseqe_cur_addr;
- unsigned int pixfmt;
+ struct sensor_datafmt fmt;
unsigned int enable;
unsigned int funmodule_state;
} sensor_info_priv_t;
struct af_cmdinfo cmdinfo;
int ret=0, focus_pos = 0xfe;
struct soc_camera_device *icd = client->dev.platform_data;
- struct v4l2_format fmt;
+ struct v4l2_mbus_framefmt mf;
SENSOR_DG("%s %s Enter\n",SENSOR_NAME_STRING(), __FUNCTION__);
} else {
sensor->info_priv.funmodule_state |= SENSOR_AF_IS_OK;
- fmt.fmt.pix.width = icd->user_width;
- fmt.fmt.pix.height = icd->user_height;
- if (sensor_fmt_videochk(NULL, &fmt) == true) { /* ddl@rock-chips.com: focus mode fix const auto focus in video */
+ 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;
+ if (sensor_fmt_videochk(NULL, &mf) == true) { /* ddl@rock-chips.com: focus mode fix const auto focus in video */
ret = sensor_af_const(client);
} else {
switch (sensor->info_priv.auto_focus)
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;
}
ret = sensor_write_array(client, sensor_init_data);
- if (ret != 0)
- {
+ if (ret != 0) {
SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());
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 = 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);
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
+ 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;
int ret = 0, set_w,set_h;
- 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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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 (winseqe_set_addr != sensor->info_priv.winseqe_cur_addr)
{
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
sensor_parameter_record(client);
#if CONFIG_SENSOR_Flash
if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {
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->info_priv.winseqe_cur_addr = winseqe_set_addr;
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
sensor_ae_transfer(client);
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
}
#endif
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
#if CONFIG_SENSOR_Focus
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ 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 sensor *sensor = to_sensor(client);
+ #if CONFIG_SENSOR_Focus
struct soc_camera_device *icd = client->dev.platform_data;
- struct v4l2_format fmt;
+ struct v4l2_mbus_framefmt mf;
+ #endif
if (enable == 1) {
sensor->info_priv.enable = 1;
#if CONFIG_SENSOR_Focus
- fmt.fmt.pix.width = icd->user_width;
- fmt.fmt.pix.height = icd->user_height;
+ 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;
/* If auto focus firmware haven't download success, must download firmware again when in video or preview stream on */
- if (sensor_fmt_capturechk(sd, &fmt) == false) {
+ if (sensor_fmt_capturechk(sd, &mf) == false) {
if ((sensor->info_priv.affm_reinit == 1) || ((sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK)==0)) {
if (sensor->sensor_wq != NULL) {
mutex_lock(&sensor->wq_lock);
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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,
.s_stream = sensor_s_stream,
};
-
static struct v4l2_subdev_ops sensor_subdev_ops = {
.core = &sensor_subdev_core_ops,
.video = &sensor_subdev_video_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
#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_YUYV
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
#define CONFIG_SENSOR_WhiteBalance 0
#define CONFIG_SENSOR_Brightness 0
{0x0e, 0x61},
{0x0f, 0x4b},
{0x16, 0x02},
- {0x1e, 0x07}, //0x27
+ {0x1e, 0x17}, //0x07//0x27
{0x21, 0x02},
{0x22, 0x91},
{0x29, 0x07},
{0x66, 0x05},
{0x94, 0x10},
{0x95, 0x12},
- {0x7a, 0x24},
- {0x7b, 0x04},
- {0x7c, 0x07},
- {0x7d, 0x12},
- {0x7e, 0x2f},
- {0x7f, 0x3f},
- {0x80, 0x4d},
- {0x81, 0x5a},
- {0x82, 0x69},
- {0x83, 0x74},
- {0x84, 0x7f},
- {0x85, 0x91},
- {0x86, 0x9e},
- {0x87, 0xbb},
- {0x88, 0xd2},
- {0x89, 0xe5},
+ {0x7a, 0x20},// {0x7a, 0x24},
+ {0x7b, 0x16},// {0x7b, 0x04},
+ {0x7c, 0x23},// {0x7c, 0x07},
+ {0x7d, 0x3c},// {0x7d, 0x12},
+ {0x7e, 0x5c},// {0x7e, 0x2f},
+ {0x7f, 0x69},// {0x7f, 0x3f},
+ {0x80, 0x75},// {0x80, 0x4d},
+ {0x81, 0x7e},// {0x81, 0x5a},
+ {0x82, 0x88},// {0x82, 0x69},
+ {0x83, 0x8f},// {0x83, 0x74},
+ {0x84, 0x96},// {0x84, 0x7f},
+ {0x85, 0xa3},// {0x85, 0x91},
+ {0x86, 0xaf},// {0x86, 0x9e},
+ {0x87, 0xc4},// {0x87, 0xbb},
+ {0x88, 0xd7},// {0x88, 0xd2},
+ {0x89, 0xe8},// {0x89, 0xe5},
{0x43, 0x0a},
{0x44, 0xf0},
{0x45, 0x34},
{0x75, 0x63},
{0x76, 0xe1},
{0x4c, 0x00},
- {0x77, 0x01},
+ {0x77, 0x04},//0x01
{0x4b, 0x09},
{0xc9, 0x60},
{0x41, 0x38},
.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;
} sensor_info_priv_t;
while ((cnt-- > 0) && (err < 0)) { /* ddl@rock-chips.com : Transfer again if transent is failed */
err = i2c_transfer(client->adapter, msg, 1);
-
+ udelay(50);
if (err >= 0) {
return 0;
} else {
static int sensor_read(struct i2c_client *client, u8 reg, u8 *val)
{
int err,cnt;
- //u8 buf[2];
u8 buf[1];
struct i2c_msg msg[2];
-
- //buf[0] = reg >> 8;
+
buf[0] = reg;
- buf[1] = reg & 0xFF;
msg[0].addr = client->addr;
msg[0].flags = client->flags;
}
/* write a array of registers */
-#if 1
static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)
{
int err = 0, cnt;
sensor_task_lock(client,0);
return err;
}
-#else
-static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)
+static int sensor_readchk_array(struct i2c_client *client, struct reginfo *regarray)
{
- int err;
+ int cnt;
int i = 0;
- u8 val_read;
+ char valchk;
+
+ cnt = 0;
+ valchk = 0;
while (regarray[i].reg != 0)
{
- err = sensor_write(client, regarray[i].reg, regarray[i].val);
- if (err != 0)
- {
- SENSOR_TR("%s..write failed current i = %d\n", SENSOR_NAME_STRING(),i);
- return err;
- }
- err = sensor_read(client, regarray[i].reg, &val_read);
- SENSOR_TR("%s..reg[0x%x]=0x%x,0x%x\n", SENSOR_NAME_STRING(),regarray[i].reg, val_read, regarray[i].val);
+ sensor_read(client, regarray[i].reg, &valchk);
+ if (valchk != regarray[i].val)
+ SENSOR_TR("%s Reg:0x%x read(0x%x, 0x%x) error\n",SENSOR_NAME_STRING(), regarray[i].reg, regarray[i].val, valchk);
+
i++;
}
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);
case Sensor_PowerDown:
{
if (icl->powerdown) {
+ if (on == 0)
+ mdelay(1);
ret = icl->powerdown(icd->pdev, on);
if (ret == RK29_CAM_IO_SUCCESS) {
if (on == 0) {
- mdelay(2);
+ mdelay(20);
if (icl->reset)
icl->reset(icd->pdev);
}
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;
int ret;
SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
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);
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
+ const struct sensor_datafmt *fmt;
const struct v4l2_queryctrl *qctrl;
struct soc_camera_device *icd = client->dev.platform_data;
struct reginfo *winseqe_set_addr=NULL;
char readval;
int ret=0, set_w,set_h;
+
+ 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.pixfmt != pix->pixelformat) {
- switch (pix->pixelformat)
+ 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;
sensor_read(client, 0x3a, &readval);
sensor_write(client,0x3d,readval&0xfe);
break;
}
- case V4L2_PIX_FMT_UYVY:
+ case V4L2_MBUS_FMT_UYVY8_2X8:
{
//winseqe_set_addr = sensor_ClrFmt_UYVY;
sensor_read(client, 0x3a, &readval);
}
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)
{
}
else if (((set_w <= 1280) && (set_h <= 1024)) && sensor_sxga[0].reg)
{
- winseqe_set_addr = sensor_sxga;
+ winseqe_set_addr = sensor_vga; //sensor_sxga;
set_w = 1280;
set_h = 1024;
}
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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;
- 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 CONFIG_SENSOR_Effect
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
}
#endif
sensor->info_priv.snap2preview = true;
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */
#if CONFIG_SENSOR_Effect
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ 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 sensor *sensor = to_sensor(client);
- struct soc_camera_device *icd = client->dev.platform_data;
+ struct soc_camera_device *icd = client->dev.platform_data;
const struct v4l2_queryctrl *qctrl;
-
-
+
qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);
if (!qctrl)
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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
#include <media/v4l2-dev.h>
#include <media/videobuf-dma-contig.h>
#include <media/soc_camera.h>
+#include <media/soc_mediabus.h>
#include <mach/rk29-ipp.h>
printk(KERN_WARNING"rk29xx_camera: " fmt , ## arg); } while (0)
#define RK29CAMERA_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)
-#define RK29CAMERA_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)
+#define RK29CAMERA_DG(format, ...) dprintk(0, format, ## __VA_ARGS__)
// VIP Reg Offset
#define RK29_VIP_AHBR_CTRL 0x00
#define CAM_IPPWORK_IS_EN() ((pcdev->host_width != pcdev->icd->user_width) || (pcdev->host_height != pcdev->icd->user_height))
//Configure Macro
-#define RK29_CAM_VERSION_CODE KERNEL_VERSION(0, 0, 2)
+#define RK29_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 2)
/* limit to rk29 hardware capabilities */
#define RK29_CAM_BUS_PARAM (SOCAM_MASTER |\
extern void videobuf_dma_contig_free(struct videobuf_queue *q, struct videobuf_buffer *buf);
extern dma_addr_t videobuf_to_dma_contig(struct videobuf_buffer *buf);
-extern void videobuf_queue_dma_contig_init(struct videobuf_queue *q,
- struct videobuf_queue_ops *ops,
- struct device *dev,
- spinlock_t *irqlock,
- enum v4l2_buf_type type,
- enum v4l2_field field,
- unsigned int msize,
- void *priv);
/* buffer for one video frame */
struct rk29_buffer
{
/* common v4l buffer stuff -- must be first */
struct videobuf_buffer vb;
- const struct soc_camera_data_format *fmt;
+ enum v4l2_mbus_pixelcode code;
int inwork;
};
enum rk29_camera_reg_state
struct soc_camera_device *icd = vq->priv_data;
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct rk29_camera_dev *pcdev = ici->priv;
+ int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
+ icd->current_fmt->host_fmt);
dev_dbg(&icd->dev, "count=%d, size=%d\n", *count, *size);
+ if (bytes_per_line < 0)
+ return bytes_per_line;
+
/* planar capture requires Y, U and V buffers to be page aligned */
- #if 0
- int bytes_per_pixel = (icd->current_fmt->depth + 7) >> 3;
- *size = PAGE_ALIGN(icd->user_width* icd->user_height * bytes_per_pixel); /* Y pages UV pages, yuv422*/
- pcdev->vipmem_bsize = PAGE_ALIGN(pcdev->host_width * pcdev->host_height * bytes_per_pixel);
- #else
- *size = PAGE_ALIGN((icd->user_width* icd->user_height * icd->current_fmt->depth + 7)>>3); /* Y pages UV pages, yuv422*/
- pcdev->vipmem_bsize = PAGE_ALIGN((pcdev->host_width * pcdev->host_height * icd->current_fmt->depth + 7)>>3);
- #endif
+ *size = PAGE_ALIGN(bytes_per_line*icd->user_height); /* Y pages UV pages, yuv422*/
+ pcdev->vipmem_bsize = PAGE_ALIGN(bytes_per_line * pcdev->host_height);
+
if (CAM_WORKQUEUE_IS_EN()) {
if (CAM_IPPWORK_IS_EN()) {
struct soc_camera_device *icd = vq->priv_data;
struct rk29_buffer *buf;
int ret;
+ int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
+ icd->current_fmt->host_fmt);
+ if (bytes_per_line < 0)
+ return bytes_per_line;
buf = container_of(vb, struct rk29_buffer, vb);
BUG_ON(NULL == icd->current_fmt);
- if (buf->fmt != icd->current_fmt ||
+ if (buf->code != icd->current_fmt->code ||
vb->width != icd->user_width ||
vb->height != icd->user_height ||
vb->field != field) {
- buf->fmt = icd->current_fmt;
+ buf->code = icd->current_fmt->code;
vb->width = icd->user_width;
vb->height = icd->user_height;
vb->field = field;
vb->state = VIDEOBUF_NEEDS_INIT;
}
- vb->size = (((vb->width * vb->height *buf->fmt->depth) + 7) >> 3) ; /* ddl@rock-chips.com : fmt->depth is coorect */
+ vb->size = bytes_per_line*vb->height; /* ddl@rock-chips.com : fmt->depth is coorect */
if (0 != vb->baddr && vb->bsize < vb->size) {
ret = -EINVAL;
goto out;
return;
}
-
static int rk29_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt)
{
unsigned long bus_flags, camera_flags, common_flags;
unsigned int vip_ctrl_val = 0;
- int ret = 0;
+ const struct soc_mbus_pixelfmt *fmt;
+ int ret = 0;
RK29CAMERA_DG("%s..%d..\n",__FUNCTION__,__LINE__);
+ fmt = soc_mbus_get_fmtdesc(icd->current_fmt->code);
+ if (!fmt)
+ return -EINVAL;
+
bus_flags = RK29_CAM_BUS_PARAM;
+ /* If requested data width is supported by the platform, use it */
+ switch (fmt->bits_per_sample) {
+ case 10:
+ if (!(bus_flags & SOCAM_DATAWIDTH_10))
+ return -EINVAL;
+ break;
+ case 9:
+ if (!(bus_flags & SOCAM_DATAWIDTH_9))
+ return -EINVAL;
+ break;
+ case 8:
+ if (!(bus_flags & SOCAM_DATAWIDTH_8))
+ return -EINVAL;
+ break;
+ default:
+ return -EINVAL;
+ }
+
if (icd->ops->query_bus_param)
camera_flags = icd->ops->query_bus_param(icd);
else
if (ret < 0)
goto RK29_CAMERA_SET_BUS_PARAM_END;
- if (common_flags & SOCAM_DATAWIDTH_8) {
- icd->buswidth = 8;
- } else if (common_flags & SOCAM_DATAWIDTH_10) {
- icd->buswidth = 10;
- }
-
vip_ctrl_val = read_vip_reg(RK29_VIP_CTRL);
if (common_flags & SOCAM_PCLK_SAMPLE_FALLING) {
vip_ctrl_val |= NEGATIVE_EDGE;
camera_flags, bus_flags);
return ret;
}
-static const struct soc_camera_data_format rk29_camera_formats[] = {
- {
- .name = "YUV420 NV12",
- .depth = 12,
- .fourcc = V4L2_PIX_FMT_NV12,
- .colorspace = V4L2_COLORSPACE_JPEG,
+
+static const struct soc_mbus_pixelfmt rk29_camera_formats[] = {
+ {
+ .fourcc = V4L2_PIX_FMT_NV12,
+ .name = "YUV420 NV12",
+ .bits_per_sample = 8,
+ .packing = SOC_MBUS_PACKING_2X8_PADHI,
+ .order = SOC_MBUS_ORDER_LE,
},{
- .name = "YUV422 NV16",
- .depth = 16,
- .fourcc = V4L2_PIX_FMT_NV16,
- .colorspace = V4L2_COLORSPACE_JPEG,
+ .fourcc = V4L2_PIX_FMT_NV16,
+ .name = "YUV422 NV16",
+ .bits_per_sample = 8,
+ .packing = SOC_MBUS_PACKING_2X8_PADHI,
+ .order = SOC_MBUS_ORDER_LE,
},{
- .name = "NV12(v0.0.1)", /* ddl@rock-chips.com: 0.0.1 driver */
- .depth = 12,
- .fourcc = V4L2_PIX_FMT_YUV420,
- .colorspace = V4L2_COLORSPACE_JPEG,
+ .fourcc = V4L2_PIX_FMT_YUV420,
+ .name = "NV12(v0.0.1)",
+ .bits_per_sample = 8,
+ .packing = SOC_MBUS_PACKING_2X8_PADHI,
+ .order = SOC_MBUS_ORDER_LE,
},{
- .name = "NV16(v0.0.1)",
- .depth = 16,
- .fourcc = V4L2_PIX_FMT_YUV422P,
- .colorspace = V4L2_COLORSPACE_JPEG,
- },{
- .name = "Raw Bayer RGB 10 bit",
- .depth = 16,
- .fourcc = V4L2_PIX_FMT_SGRBG10,
- .colorspace = V4L2_COLORSPACE_SRGB,
+ .fourcc = V4L2_PIX_FMT_YUV422P,
+ .name = "NV16(v0.0.1)",
+ .bits_per_sample = 8,
+ .packing = SOC_MBUS_PACKING_2X8_PADHI,
+ .order = SOC_MBUS_ORDER_LE,
}
};
-static void rk29_camera_setup_format(struct soc_camera_device *icd, __u32 host_pixfmt, __u32 cam_pixfmt, struct v4l2_rect *rect)
+static void rk29_camera_setup_format(struct soc_camera_device *icd, __u32 host_pixfmt, enum v4l2_mbus_pixelcode icd_code, struct v4l2_rect *rect)
{
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct rk29_camera_dev *pcdev = ici->priv;
pcdev->frame_inval = RK29_CAM_FRAME_INVAL_INIT;
pcdev->pixfmt = host_pixfmt;
break;
- case V4L2_PIX_FMT_SGRBG10:
- vip_ctrl_val |= (VIP_RAW | VIP_SENSOR | VIP_DATA_LITTLEEND);
- pcdev->frame_inval = RK29_CAM_FRAME_INVAL_DC;
- pcdev->pixfmt = host_pixfmt;
- break;
default: /* ddl@rock-chips.com : vip output format is hold when pixfmt is invalidate */
vip_ctrl_val |= (read_vip_reg(RK29_VIP_CTRL) & VIPREGYUV422);
break;
}
- switch (cam_pixfmt)
+ switch (icd_code)
{
- case V4L2_PIX_FMT_UYVY:
+ case V4L2_MBUS_FMT_UYVY8_2X8:
vip_ctrl_val |= SENSOR_UYVY;
break;
- case V4L2_PIX_FMT_YUYV:
+ case V4L2_MBUS_FMT_YUYV8_2X8:
vip_ctrl_val |= SENSOR_YUYV;
break;
default :
static int rk29_camera_get_formats(struct soc_camera_device *icd, int idx,
struct soc_camera_format_xlate *xlate)
{
+ struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
struct device *dev = icd->dev.parent;
- int formats = 0, buswidth, ret;
-
- buswidth = 8;
+ int formats = 0, ret;
+ enum v4l2_mbus_pixelcode code;
+ const struct soc_mbus_pixelfmt *fmt;
+
+ ret = v4l2_subdev_call(sd, video, enum_mbus_fmt, idx, &code);
+ if (ret < 0)
+ /* No more formats */
+ return 0;
+
+ fmt = soc_mbus_get_fmtdesc(code);
+ if (!fmt) {
+ dev_err(dev, "Invalid format code #%u: %d\n", idx, code);
+ return 0;
+ }
- ret = rk29_camera_try_bus_param(icd, buswidth);
+ ret = rk29_camera_try_bus_param(icd, fmt->bits_per_sample);
if (ret < 0)
return 0;
- switch (icd->formats[idx].fourcc) {
- case V4L2_PIX_FMT_UYVY:
- case V4L2_PIX_FMT_YUYV:
+ switch (code) {
+ case V4L2_MBUS_FMT_UYVY8_2X8:
+ case V4L2_MBUS_FMT_YUYV8_2X8:
formats++;
if (xlate) {
xlate->host_fmt = &rk29_camera_formats[0];
- xlate->cam_fmt = icd->formats + idx;
- xlate->buswidth = buswidth;
+ xlate->code = code;
xlate++;
- dev_dbg(dev, "Providing format %s using %s\n",
- rk29_camera_formats[0].name,
- icd->formats[idx].name);
+ dev_dbg(dev, "Providing format %s using code %d\n",
+ rk29_camera_formats[0].name,code);
}
formats++;
if (xlate) {
xlate->host_fmt = &rk29_camera_formats[1];
- xlate->cam_fmt = icd->formats + idx;
- xlate->buswidth = buswidth;
+ xlate->code = code;
xlate++;
- dev_dbg(dev, "Providing format %s using %s\n",
- rk29_camera_formats[1].name,
- icd->formats[idx].name);
+ dev_dbg(dev, "Providing format %s using code %d\n",
+ rk29_camera_formats[1].name,code);
}
formats++;
if (xlate) {
xlate->host_fmt = &rk29_camera_formats[2];
- xlate->cam_fmt = icd->formats + idx;
- xlate->buswidth = buswidth;
+ xlate->code = code;
xlate++;
- dev_dbg(dev, "Providing format %s using %s\n",
- rk29_camera_formats[2].name,
- icd->formats[idx].name);
+ dev_dbg(dev, "Providing format %s using code %d\n",
+ rk29_camera_formats[2].name,code);
}
formats++;
if (xlate) {
xlate->host_fmt = &rk29_camera_formats[3];
- xlate->cam_fmt = icd->formats + idx;
- xlate->buswidth = buswidth;
+ xlate->code = code;
xlate++;
- dev_dbg(dev, "Providing format %s using %s\n",
- rk29_camera_formats[3].name,
- icd->formats[idx].name);
+ dev_dbg(dev, "Providing format %s using code %d\n",
+ rk29_camera_formats[3].name,code);;
}
- break;
- case V4L2_PIX_FMT_SGRBG10:
- formats++;
- if (xlate) {
- xlate->host_fmt = &rk29_camera_formats[4];
- xlate->cam_fmt = icd->formats + idx;
- xlate->buswidth = 10;
- xlate++;
- dev_dbg(dev, "Providing format %s using %s\n",
- rk29_camera_formats[2].name,
- icd->formats[idx].name);
- }
- break;
+ break;
default:
break;
}
struct v4l2_crop *a)
{
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
- struct v4l2_format f;
- struct v4l2_pix_format *pix = &f.fmt.pix;
+ struct v4l2_mbus_framefmt mf;
+ u32 fourcc = icd->current_fmt->host_fmt->fourcc;
int ret;
- f.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
- ret = v4l2_subdev_call(sd, video, g_fmt, &f);
+ ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mf);
if (ret < 0)
return ret;
- if ((pix->width < (a->c.left + a->c.width)) || (pix->height < (a->c.top + a->c.height))) {
+ if ((mf.width < (a->c.left + a->c.width)) || (mf.height < (a->c.top + a->c.height))) {
- pix->width = a->c.left + a->c.width;
- pix->height = a->c.top + a->c.height;
+ mf.width = a->c.left + a->c.width;
+ mf.height = a->c.top + a->c.height;
- v4l_bound_align_image(&pix->width, RK29_CAM_W_MIN, RK29_CAM_W_MAX, 1,
- &pix->height, RK29_CAM_H_MIN, RK29_CAM_H_MAX, 0,
- icd->current_fmt->fourcc == V4L2_PIX_FMT_NV16 ?4 : 0);
+ v4l_bound_align_image(&mf.width, RK29_CAM_W_MIN, RK29_CAM_W_MAX, 1,
+ &mf.height, RK29_CAM_H_MIN, RK29_CAM_H_MAX, 0,
+ fourcc == V4L2_PIX_FMT_NV16 ?4 : 0);
- ret = v4l2_subdev_call(sd, video, s_fmt, &f);
+ ret = v4l2_subdev_call(sd, video, s_mbus_fmt, &mf);
if (ret < 0)
return ret;
}
- rk29_camera_setup_format(icd, icd->current_fmt->fourcc, pix->pixelformat, &a->c);
+ rk29_camera_setup_format(icd, fourcc, mf.code, &a->c);
- icd->user_width = pix->width;
- icd->user_height = pix->height;
+ icd->user_width = mf.width;
+ icd->user_height = mf.height;
return 0;
}
{
struct device *dev = icd->dev.parent;
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
- const struct soc_camera_data_format *cam_fmt = NULL;
const struct soc_camera_format_xlate *xlate = NULL;
struct soc_camera_host *ici =to_soc_camera_host(icd->dev.parent);
struct rk29_camera_dev *pcdev = ici->priv;
struct v4l2_pix_format *pix = &f->fmt.pix;
- struct v4l2_format cam_f = *f;
+ struct v4l2_mbus_framefmt mf;
struct v4l2_rect rect;
int ret,usr_w,usr_h;
int stream_on = 0;
ret = -EINVAL;
goto RK29_CAMERA_SET_FMT_END;
}
-
- cam_fmt = xlate->cam_fmt;
+
/* ddl@rock-chips.com: sensor init code transmit in here after open */
if (pcdev->icd_init == 0) {
v4l2_subdev_call(sd,core, init, 0);
stream_on = read_vip_reg(RK29_VIP_CTRL);
if (stream_on & ENABLE_CAPTURE)
write_vip_reg(RK29_VIP_CTRL, (stream_on & (~ENABLE_CAPTURE)));
- cam_f.fmt.pix.pixelformat = cam_fmt->fourcc;
- ret = v4l2_subdev_call(sd, video, s_fmt, &cam_f);
- cam_f.fmt.pix.pixelformat = pix->pixelformat;
- *pix = cam_f.fmt.pix;
+
+ mf.width = pix->width;
+ mf.height = pix->height;
+ mf.field = pix->field;
+ mf.colorspace = pix->colorspace;
+ mf.code = xlate->code;
+
+ ret = v4l2_subdev_call(sd, video, s_mbus_fmt, &mf);
+
+ if (mf.code != xlate->code)
+ return -EINVAL;
+
#ifdef CONFIG_VIDEO_RK29_WORK_IPP
- if ((pix->width != usr_w) || (pix->height != usr_h)) {
- if (unlikely((pix->width <16) || (pix->width > 8190) || (pix->height < 16) || (pix->height > 8190))) {
- RK29CAMERA_TR("Senor and IPP both invalid source resolution(%dx%d)\n",pix->width,pix->height);
+ if ((mf.width != usr_w) || (mf.height != usr_h)) {
+ if (unlikely((mf.width <16) || (mf.width > 8190) || (mf.height < 16) || (mf.height > 8190))) {
+ RK29CAMERA_TR("Senor and IPP both invalid source resolution(%dx%d)\n",mf.width,mf.height);
ret = -EINVAL;
goto RK29_CAMERA_SET_FMT_END;
}
ret = -EINVAL;
goto RK29_CAMERA_SET_FMT_END;
}
- pix->width = usr_w;
- pix->height = usr_h;
+ mf.width = usr_w;
+ mf.height = usr_h;
}
#endif
icd->sense = NULL;
if (!ret) {
rect.left = 0;
rect.top = 0;
- rect.width = cam_f.fmt.pix.width;
- rect.height = cam_f.fmt.pix.height;
-
- RK29CAMERA_DG("%s..%s..%s icd width:%d host width:%d \n",__FUNCTION__,xlate->host_fmt->name, cam_fmt->name,
- rect.width, pix->width);
- rk29_camera_setup_format(icd, pix->pixelformat, cam_fmt->fourcc, &rect);
- icd->buswidth = xlate->buswidth;
- icd->current_fmt = xlate->host_fmt;
+ rect.width = mf.width;
+ rect.height = mf.height;
+ RK29CAMERA_DG("%s..%s..v4l2_mbus_code:%d icd:%dx%d host:%dx%d \n",__FUNCTION__,xlate->host_fmt->name, mf.code,
+ rect.width,rect.height, pix->width,pix->height);
+ rk29_camera_setup_format(icd, pix->pixelformat, mf.code, &rect);
+
if (CAM_IPPWORK_IS_EN()) {
BUG_ON(pcdev->vipmem_phybase == 0);
}
+
+ pix->width = mf.width;
+ pix->height = mf.height;
+ pix->field = mf.field;
+ pix->colorspace = mf.colorspace;
+ icd->current_fmt = xlate;
}
RK29_CAMERA_SET_FMT_END:
const struct soc_camera_format_xlate *xlate;
struct v4l2_pix_format *pix = &f->fmt.pix;
__u32 pixfmt = pix->pixelformat;
- enum v4l2_field field;
int ret,usr_w,usr_h,i;
bool is_capture = rk29_camera_fmt_capturechk(f);
bool vipmem_is_overflow = false;
+ struct v4l2_mbus_framefmt mf;
usr_w = pix->width;
usr_h = pix->height;
xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
if (!xlate) {
- dev_err(ici->v4l2_dev.dev, "Format (%c%c%c%c) not found\n", pixfmt & 0xFF, (pixfmt >> 8) & 0xFF,
+ dev_err(icd->dev.parent, "Format (%c%c%c%c) not found\n", pixfmt & 0xFF, (pixfmt >> 8) & 0xFF,
(pixfmt >> 16) & 0xFF, (pixfmt >> 24) & 0xFF);
ret = -EINVAL;
RK29CAMERA_TR("%s(version:%c%c%c) support format:\n",rk29_cam_driver_description,(RK29_CAM_VERSION_CODE&0xff0000)>>16,
&pix->height, RK29_CAM_H_MIN, RK29_CAM_H_MAX, 0,
pixfmt == V4L2_PIX_FMT_NV16 ? 4 : 0);
- pix->bytesperline = pix->width * DIV_ROUND_UP(xlate->host_fmt->depth, 8);
- pix->sizeimage = pix->height * pix->bytesperline;
+ pix->bytesperline = soc_mbus_bytes_per_line(pix->width,
+ xlate->host_fmt);
+ if (pix->bytesperline < 0)
+ return pix->bytesperline;
- /* camera has to see its format, but the user the original one */
- pix->pixelformat = xlate->cam_fmt->fourcc;
/* limit to sensor capabilities */
- ret = v4l2_subdev_call(sd, video, try_fmt, f);
- pix->pixelformat = pixfmt;
+ mf.width = pix->width;
+ mf.height = pix->height;
+ mf.field = pix->field;
+ mf.colorspace = pix->colorspace;
+ mf.code = xlate->code;
+
+ ret = v4l2_subdev_call(sd, video, try_mbus_fmt, &mf);
+ if (ret < 0)
+ goto RK29_CAMERA_TRY_FMT_END;
+
#ifdef CONFIG_VIDEO_RK29_WORK_IPP
- if ((pix->width > usr_w) && (pix->height > usr_h)) {
+ if ((mf.width > usr_w) && (mf.height > usr_h)) {
if (is_capture) {
- vipmem_is_overflow = (PAGE_ALIGN((pix->width*pix->height*icd->current_fmt->depth+7)>>3) > pcdev->vipmem_size);
+ vipmem_is_overflow = (PAGE_ALIGN(pix->bytesperline*pix->height) > pcdev->vipmem_size);
} else {
/* Assume preview buffer minimum is 4 */
- vipmem_is_overflow = (PAGE_ALIGN((pix->width*pix->height*icd->current_fmt->depth+7)>>3)*4 > pcdev->vipmem_size);
+ vipmem_is_overflow = (PAGE_ALIGN(pix->bytesperline*pix->height)*4 > pcdev->vipmem_size);
}
if (vipmem_is_overflow == false) {
pix->width = usr_w;
} else {
RK29CAMERA_TR("vipmem for IPP is overflow, This resolution(%dx%d -> %dx%d) is invalidate!\n",pix->width,pix->height,usr_w,usr_h);
}
- } else if ((pix->width < usr_w) && (pix->height < usr_h)) {
- if (((usr_w>>1) < pix->width) && ((usr_h>>1) < pix->height)) {
+ } else if ((mf.width < usr_w) && (mf.height < usr_h)) {
+ if (((usr_w>>1) < mf.width) && ((usr_h>>1) < mf.height)) {
if (is_capture) {
- vipmem_is_overflow = (PAGE_ALIGN((pix->width*pix->height*icd->current_fmt->depth+7)>>3) > pcdev->vipmem_size);
+ vipmem_is_overflow = (PAGE_ALIGN(pix->bytesperline*pix->height) > pcdev->vipmem_size);
} else {
- vipmem_is_overflow = (PAGE_ALIGN((pix->width*pix->height*icd->current_fmt->depth+7)>>3)*4 > pcdev->vipmem_size);
+ vipmem_is_overflow = (PAGE_ALIGN(pix->bytesperline*pix->height)*4 > pcdev->vipmem_size);
}
if (vipmem_is_overflow == false) {
pix->width = usr_w;
RK29CAMERA_TR("The aspect ratio(%dx%d/%dx%d) is bigger than 2 !\n",pix->width,pix->height,usr_w,usr_h);
}
}
- #endif
-
- field = pix->field;
-
- if (field == V4L2_FIELD_ANY) {
- pix->field = V4L2_FIELD_NONE;
- } else if (field != V4L2_FIELD_NONE) {
- dev_err(icd->dev.parent, "Field type %d unsupported.\n", field);
- ret = -EINVAL;
- goto RK29_CAMERA_TRY_FMT_END;
- }
+ #else
+ pix->width = mf.width;
+ pix->height = mf.height;
+ #endif
+ pix->colorspace = mf.colorspace;
+
+ switch (mf.field) {
+ case V4L2_FIELD_ANY:
+ case V4L2_FIELD_NONE:
+ pix->field = V4L2_FIELD_NONE;
+ break;
+ default:
+ /* TODO: support interlaced at least in pass-through mode */
+ dev_err(icd->dev.parent, "Field type %d unsupported.\n",
+ mf.field);
+ goto RK29_CAMERA_TRY_FMT_END;
+ }
RK29_CAMERA_TRY_FMT_END:
if (ret)
{
struct device *control;
struct v4l2_subdev *sd;
- struct v4l2_format cam_f;
+ struct v4l2_mbus_framefmt mf;
const struct soc_camera_format_xlate *xlate;
int ret;
sd = dev_get_drvdata(control);
ret = v4l2_subdev_call(sd,core, init, 1);
- cam_f.fmt.pix.width = rk29_camdev_info_ptr->icd->user_width;
- cam_f.fmt.pix.height = rk29_camdev_info_ptr->icd->user_height;
- xlate = soc_camera_xlate_by_fourcc(rk29_camdev_info_ptr->icd, rk29_camdev_info_ptr->icd->current_fmt->fourcc);
- cam_f.fmt.pix.pixelformat = xlate->cam_fmt->fourcc;
- ret |= v4l2_subdev_call(sd, video, s_fmt, &cam_f);
+ mf.width = rk29_camdev_info_ptr->icd->user_width;
+ mf.height = rk29_camdev_info_ptr->icd->user_height;
+ xlate = soc_camera_xlate_by_fourcc(rk29_camdev_info_ptr->icd, rk29_camdev_info_ptr->icd->current_fmt->host_fmt->fourcc);
+ mf.code = xlate->code;
+
+ ret |= v4l2_subdev_call(sd, video, s_mbus_fmt, &mf);
write_vip_reg(RK29_VIP_CTRL, (read_vip_reg(RK29_VIP_CTRL)|ENABLE_CAPTURE));
#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_YUYV
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
#define CONFIG_SENSOR_WhiteBalance 0
#define CONFIG_SENSOR_Brightness 0
.num_menus = ARRAY_SIZE(sensor_menus),
};
-#define COL_FMT(_name, _depth, _fourcc, _colorspace) \
- { .name = _name, .depth = _depth, .fourcc = _fourcc, \
- .colorspace = _colorspace }
-#define JPG_FMT(_name, _depth, _fourcc) \
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
+/* 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;
-static const struct soc_camera_data_format sensor_colour_formats[] = {
- JPG_FMT(SENSOR_NAME_STRING(UYVY), 16, V4L2_PIX_FMT_UYVY),
+ return NULL;
+}
+
+static const struct sensor_datafmt sensor_colour_fmts[] = {
+ {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG}
};
enum sensor_work_state
{
int preview_w;
int preview_h;
struct reginfo *winseqe_cur_addr;
- unsigned int pixfmt;
+ struct sensor_datafmt fmt;
unsigned int enable;
unsigned int funmodule_state;
} sensor_info_priv_t;
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;
int ret;
u16 pid = 0;
}
sensor_task_lock(client,0);
sensor->info_priv.winseqe_cur_addr = 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);
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 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)
+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 struct reginfo* sensor_fmt_catch(int set_w, int set_h, int *ret_w, int *ret_h)
return winseqe_set_addr;
}
-static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
- struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
+ const struct sensor_datafmt *fmt;
+ struct sensor *sensor = to_sensor(client);
struct reginfo *winseqe_set_addr=NULL;
int ret=0, set_w,set_h;
- 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;
winseqe_set_addr = sensor_fmt_catch(set_w, set_h, &set_w, &set_h);
if ((winseqe_set_addr != sensor->info_priv.winseqe_cur_addr) && winseqe_set_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_TR("\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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- int ret = 0;
- struct v4l2_pix_format *pix = &f->fmt.pix;
- int set_w,set_h;
- 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
- */
- set_w = pix->width;
- set_h = pix->height;
-
- 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);
-
- if (sensor_fmt_catch(pix->width, pix->height, &pix->width, &pix->height) == NULL) {
- pix->width = 0;
- pix->height = 0;
- }
+ struct i2c_client *client = sd->priv;
+ 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;
+
return ret;
}
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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_stream = sensor_s_stream,
+ .s_mbus_fmt = sensor_s_fmt,
+ .g_mbus_fmt = sensor_g_fmt,
+ .try_mbus_fmt = sensor_try_fmt,
+ .enum_mbus_fmt = sensor_enum_fmt,
+ .s_stream = sensor_s_stream,
};
-
static struct v4l2_subdev_ops sensor_subdev_ops = {
.core = &sensor_subdev_core_ops,
.video = &sensor_subdev_video_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];
ret = sensor_video_probe(icd, client);
if (ret) {
#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */\r
#define SENSOR_INIT_HEIGHT 480\r
#define SENSOR_INIT_WINSEQADR sensor_vga\r
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_UYVY\r
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8\r
\r
#define CONFIG_SENSOR_WhiteBalance 1\r
#define CONFIG_SENSOR_Brightness 0\r
#define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
#define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
\r
+#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)\r
+\r
struct reginfo\r
{\r
u8 reg;\r
.num_menus = ARRAY_SIZE(sensor_menus),\r
};\r
\r
-#define COL_FMT(_name, _depth, _fourcc, _colorspace) \\r
- { .name = _name, .depth = _depth, .fourcc = _fourcc, \\r
- .colorspace = _colorspace }\r
-\r
-#define JPG_FMT(_name, _depth, _fourcc) \\r
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)\r
-\r
-static const struct soc_camera_data_format sensor_colour_formats[] = {\r
- JPG_FMT(SENSOR_NAME_STRING(UYVY), 16, V4L2_PIX_FMT_UYVY),\r
- JPG_FMT(SENSOR_NAME_STRING(YUYV), 16, V4L2_PIX_FMT_YUYV),\r
+/* 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;
+
+ return NULL;
+}
+
+static const struct sensor_datafmt sensor_colour_fmts[] = {
+ {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
+ {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}
};\r
\r
typedef struct sensor_info_priv_s\r
unsigned char mirror; /* HFLIP */\r
unsigned char flip; /* VFLIP */\r
unsigned int winseqe_cur_addr;\r
- unsigned int pixfmt;\r
-\r
+ struct sensor_datafmt fmt;\r
+ unsigned int funmodule_state;\r
} sensor_info_priv_t;\r
\r
struct sensor\r
struct soc_camera_device *icd = client->dev.platform_data;\r
struct sensor *sensor = to_sensor(client);\r
const struct v4l2_queryctrl *qctrl;\r
+ const struct sensor_datafmt *fmt;\r
char value;\r
int ret,pid = 0;\r
\r
goto sensor_INIT_ERR;\r
}\r
sensor_task_lock(client,0);\r
- // icd->user_width = SENSOR_INIT_WIDTH;\r
- //icd->user_height = SENSOR_INIT_HEIGHT;\r
- sensor->info_priv.winseqe_cur_addr = (int)SENSOR_INIT_WINSEQADR;\r
- sensor->info_priv.pixfmt = SENSOR_INIT_PIXFMT;\r
+ sensor->info_priv.winseqe_cur_addr = (int)SENSOR_INIT_WINSEQADR;\r
+ fmt = sensor_find_datafmt(SENSOR_INIT_PIXFMT,sensor_colour_fmts, ARRAY_SIZE(sensor_colour_fmts));\r
+ 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;\r
\r
/* sensor sensor information for initialization */\r
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
#endif\r
\r
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);\r
-\r
+ sensor->info_priv.funmodule_state |= SENSOR_INIT_IS_OK;\r
return 0;\r
sensor_INIT_ERR:\r
+ sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
sensor_task_lock(client,0);\r
sensor_deactivate(client);\r
return ret;\r
static int sensor_deactivate(struct i2c_client *client)\r
{\r
struct soc_camera_device *icd = client->dev.platform_data;\r
-\r
+ struct sensor *sensor = to_sensor(client);\r
+ \r
SENSOR_DG("\n%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
\r
/* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */\r
- //sensor_task_lock(client, 1);\r
- //sensor_write(client, 0x30b0, 0x00);\r
- //sensor_write(client, 0x30b1, 0x00);\r
- //sensor_task_lock(client, 0);\r
+ \r
sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
\r
/* ddl@rock-chips.com : sensor config init width , because next open sensor quickly(soc_camera_open -> Try to configure with default parameters) */\r
icd->user_width = SENSOR_INIT_WIDTH;\r
- icd->user_height = SENSOR_INIT_HEIGHT;\r
+ icd->user_height = SENSOR_INIT_HEIGHT;\r
msleep(100);\r
+\r
+ sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
return 0;\r
}\r
\r
return soc_camera_apply_sensor_flags(icl, flags);\r
}\r
\r
-static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)\r
-{\r
- struct i2c_client *client = sd->priv;\r
- struct soc_camera_device *icd = client->dev.platform_data;\r
- struct sensor *sensor = to_sensor(client);\r
- struct v4l2_pix_format *pix = &f->fmt.pix;\r
-\r
- pix->width = icd->user_width;\r
- pix->height = icd->user_height;\r
- pix->pixelformat = sensor->info_priv.pixfmt;\r
- pix->field = V4L2_FIELD_NONE;\r
- pix->colorspace = V4L2_COLORSPACE_JPEG;\r
-\r
- return 0;\r
-}\r
-static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_format *f)\r
-{\r
- bool ret = false;\r
-\r
- if ((f->fmt.pix.width == 1024) && (f->fmt.pix.height == 768)) {\r
- ret = true;\r
- } else if ((f->fmt.pix.width == 1280) && (f->fmt.pix.height == 1024)) {\r
- ret = true;\r
- } else if ((f->fmt.pix.width == 1600) && (f->fmt.pix.height == 1200)) {\r
- ret = true;\r
- } else if ((f->fmt.pix.width == 2048) && (f->fmt.pix.height == 1536)) {\r
- ret = true;\r
- } else if ((f->fmt.pix.width == 2592) && (f->fmt.pix.height == 1944)) {\r
- ret = true;\r
- }\r
-\r
- if (ret == true)\r
- SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, f->fmt.pix.width, f->fmt.pix.height);\r
- return ret;\r
-}\r
-\r
-static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_format *f)\r
-{\r
- bool ret = false;\r
-\r
- if ((f->fmt.pix.width == 1280) && (f->fmt.pix.height == 720)) {\r
- ret = true;\r
- } else if ((f->fmt.pix.width == 1920) && (f->fmt.pix.height == 1080)) {\r
- ret = true;\r
- }\r
-\r
- if (ret == true)\r
- SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, f->fmt.pix.width, f->fmt.pix.height);\r
- return ret;\r
-}\r
-static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)\r
+static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
+{
+ struct i2c_client *client = sd->priv;
+ struct soc_camera_device *icd = client->dev.platform_data;
+ struct sensor *sensor = to_sensor(client);
+
+ 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_mbus_framefmt *mf)
+{
+ bool ret = false;
+
+ if ((mf->width == 1024) && (mf->height == 768)) {
+ ret = true;
+ } else if ((mf->width == 1280) && (mf->height == 1024)) {
+ ret = true;
+ } else if ((mf->width == 1600) && (mf->height == 1200)) {
+ ret = true;
+ } else if ((mf->width == 2048) && (mf->height == 1536)) {
+ ret = true;
+ } else if ((mf->width == 2592) && (mf->height == 1944)) {
+ ret = true;
+ }
+
+ if (ret == true)
+ 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_mbus_framefmt *mf)
+{
+ bool ret = false;
+
+ if ((mf->width == 1280) && (mf->height == 720)) {
+ ret = true;
+ } else if ((mf->width == 1920) && (mf->height == 1080)) {
+ ret = true;
+ }
+
+ if (ret == true)
+ 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_mbus_framefmt *mf)\r
{\r
struct i2c_client *client = sd->priv;\r
struct sensor *sensor = to_sensor(client);\r
- struct v4l2_pix_format *pix = &f->fmt.pix;\r
+ const struct sensor_datafmt *fmt;\r
const struct v4l2_queryctrl *qctrl;\r
struct soc_camera_device *icd = client->dev.platform_data;\r
struct reginfo *winseqe_set_addr=NULL;\r
int ret=0, set_w,set_h;\r
\r
- if (sensor->info_priv.pixfmt != pix->pixelformat) {\r
- switch (pix->pixelformat)\r
- {\r
- case V4L2_PIX_FMT_YUYV:\r
- {\r
- winseqe_set_addr = sensor_ClrFmt_YUYV;\r
- break;\r
- }\r
- case V4L2_PIX_FMT_UYVY:\r
- {\r
- winseqe_set_addr = sensor_ClrFmt_UYVY;\r
- break;\r
- }\r
- default:\r
- break;\r
- }\r
- if (winseqe_set_addr != NULL) {\r
- sensor_write_array(client, winseqe_set_addr);\r
- sensor->info_priv.pixfmt = pix->pixelformat;\r
-\r
- SENSOR_DG("%s Pixelformat(0x%x) set success!\n", SENSOR_NAME_STRING(),pix->pixelformat);\r
- } else {\r
- SENSOR_TR("%s Pixelformat(0x%x) is invalidate!\n", SENSOR_NAME_STRING(),pix->pixelformat);\r
- }\r
- }\r
-\r
- set_w = pix->width;\r
- set_h = pix->height;\r
+ 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_MBUS_FMT_YUYV8_2X8:
+ {
+ winseqe_set_addr = sensor_ClrFmt_YUYV;
+ break;
+ }
+ case V4L2_MBUS_FMT_UYVY8_2X8:
+ {
+ winseqe_set_addr = sensor_ClrFmt_UYVY;
+ break;
+ }
+ default:
+ break;
+ }
+ if (winseqe_set_addr != NULL) {
+ sensor_write_array(client, winseqe_set_addr);
+ 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 v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);
+ }
+ }
+
+ set_w = mf->width;
+ set_h = mf->height;\r
\r
if (((set_w <= 176) && (set_h <= 144)) &&( sensor_qcif[0].reg!=0xff))\r
{\r
winseqe_set_addr = SENSOR_INIT_WINSEQADR; /* ddl@rock-chips.com : Sensor output smallest size if isn't support app */\r
set_w = SENSOR_INIT_WIDTH;\r
set_h = SENSOR_INIT_HEIGHT; \r
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->height);\r
+ SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,mf->width,mf->height);\r
}\r
\r
if ((int)winseqe_set_addr != sensor->info_priv.winseqe_cur_addr) {\r
\r
sensor->info_priv.winseqe_cur_addr = (int)winseqe_set_addr;\r
\r
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */\r
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */\r
#if CONFIG_SENSOR_Effect\r
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
}\r
#endif\r
sensor->info_priv.snap2preview = true;\r
- } else if (sensor_fmt_videochk(sd,f) == true) { /* ddl@rock-chips.com : Video */\r
+ } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */\r
#if CONFIG_SENSOR_Effect\r
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
SENSOR_DG("\n %s .. Current Format is validate. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),set_w,set_h);\r
}\r
\r
- pix->width = set_w;\r
- pix->height = set_h;\r
+ mf->width = set_w;\r
+ mf->height = set_h;\r
\r
sensor_s_fmt_end:\r
return ret;\r
}\r
\r
-static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_format *f)\r
-{\r
- struct v4l2_pix_format *pix = &f->fmt.pix;\r
- bool bayer = pix->pixelformat == V4L2_PIX_FMT_UYVY ||\r
- pix->pixelformat == V4L2_PIX_FMT_YUYV;\r
-\r
- /*\r
- * With Bayer format enforce even side lengths, but let the user play\r
- * with the starting pixel\r
- */\r
- if (pix->height > SENSOR_MAX_HEIGHT)\r
- pix->height = SENSOR_MAX_HEIGHT;\r
- else if (pix->height < SENSOR_MIN_HEIGHT)\r
- pix->height = SENSOR_MIN_HEIGHT;\r
- else if (bayer)\r
- pix->height = ALIGN(pix->height, 2);\r
-\r
- if (pix->width > SENSOR_MAX_WIDTH)\r
- pix->width = SENSOR_MAX_WIDTH;\r
- else if (pix->width < SENSOR_MIN_WIDTH)\r
- pix->width = SENSOR_MIN_WIDTH;\r
- else if (bayer)\r
- pix->width = ALIGN(pix->width, 2);\r
- return 0;\r
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
+{
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}\r
\r
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)\r
}\r
#endif\r
#if CONFIG_SENSOR_DigitalZoom\r
-static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)\r
+static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
{\r
struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
struct sensor *sensor = to_sensor(client);\r
digitalzoom_cur = sensor->info_priv.digitalzoom;\r
digitalzoom_total = qctrl_info->maximum;\r
\r
- if ((*value > 0) && (digitalzoom_cur >= digitalzoom_total))\r
+ if ((value > 0) && (digitalzoom_cur >= digitalzoom_total))\r
{\r
SENSOR_TR("%s digitalzoom is maximum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
return -EINVAL;\r
}\r
\r
- if ((*value < 0) && (digitalzoom_cur <= qctrl_info->minimum))\r
+ if ((value < 0) && (digitalzoom_cur <= qctrl_info->minimum))\r
{\r
SENSOR_TR("%s digitalzoom is minimum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
return -EINVAL;\r
}\r
\r
- if ((*value > 0) && ((digitalzoom_cur + *value) > digitalzoom_total))\r
+ if ((value > 0) && ((digitalzoom_cur + value) > digitalzoom_total))\r
{\r
- *value = digitalzoom_total - digitalzoom_cur;\r
+ value = digitalzoom_total - digitalzoom_cur;\r
}\r
\r
- if ((*value < 0) && ((digitalzoom_cur + *value) < 0))\r
+ if ((value < 0) && ((digitalzoom_cur + value) < 0))\r
{\r
- *value = 0 - digitalzoom_cur;\r
+ value = 0 - digitalzoom_cur;\r
}\r
\r
- digitalzoom_cur += *value;\r
+ digitalzoom_cur += value;\r
\r
if (sensor_ZoomSeqe[digitalzoom_cur] != NULL)\r
{\r
SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
return -EINVAL;\r
}\r
- SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, *value);\r
+ SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
return 0;\r
}\r
\r
goto sensor_video_probe_err;\r
}\r
#endif\r
- icd->formats = sensor_colour_formats;\r
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);\r
\r
return 0;\r
\r
return ret;\r
\r
}\r
+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;
+}\r
static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {\r
.init = sensor_init,\r
.g_ctrl = sensor_g_control,\r
.ioctl = sensor_ioctl,\r
};\r
\r
-static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {\r
- .s_fmt = sensor_s_fmt,\r
- .g_fmt = sensor_g_fmt,\r
- .try_fmt = sensor_try_fmt,\r
+static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {
+ .s_mbus_fmt = sensor_s_fmt,
+ .g_mbus_fmt = sensor_g_fmt,
+ .try_mbus_fmt = sensor_try_fmt,
+ .enum_mbus_fmt = sensor_enum_fmt,
};\r
\r
static struct v4l2_subdev_ops sensor_subdev_ops = {\r
\r
/* Second stage probe - when a capture adapter is there */\r
icd->ops = &sensor_ops;\r
- icd->y_skip_top = 0;\r
+ sensor->info_priv.fmt = sensor_colour_fmts[0];\r
#if CONFIG_SENSOR_I2C_NOSCHED\r
atomic_set(&sensor->tasklock_cnt,0);\r
#endif\r
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 640 /* Sensor pixel size for sensor_init_data array */
#define SENSOR_INIT_HEIGHT 480
#define SENSOR_INIT_WINSEQADR sensor_vga
-#define SENSOR_INIT_PIXFMT V4L2_PIX_FMT_YUYV
+#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_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
{
u8 reg;
static struct reginfo sensor_ClrFmt_YUYV[]=
{
+ {0x00,0x00}
};
static struct reginfo sensor_ClrFmt_UYVY[]=
{
+ {0x00,0x00}
};
{0xb8,0x00},
};
+#if 0
static struct reginfo sensor_Effect_Bluish[] =
{
// Bluish -- aqua
{0xb8,0x60},
};
-
+#endif
static struct reginfo sensor_Effect_Green[] =
{
// Greenish
static int sensor_resume(struct soc_camera_device *icd);
static int sensor_set_bus_param(struct soc_camera_device *icd,unsigned long flags);
static unsigned long sensor_query_bus_param(struct soc_camera_device *icd);
+#if CONFIG_SENSOR_Effect
static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);
+#endif
+#if CONFIG_SENSOR_WhiteBalance
static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);
+#endif
static int sensor_deactivate(struct i2c_client *client);
static struct soc_camera_ops sensor_ops =
.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;
+};
-#define JPG_FMT(_name, _depth, _fourcc) \
- COL_FMT(_name, _depth, _fourcc, V4L2_COLORSPACE_JPEG)
+/* 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;
-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),
+ return NULL;
+}
+
+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;
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;
int ret, i;
SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
// goto sensor_INIT_ERR;
// }
- mdelay(5); //delay 5 microseconds
+// mdelay(5); //delay 5 microseconds
for(i = 0; i < sizeof(sensor_init_data)/2;i++){
// printk("read from reg[0x%x] 0x%x\n",sensor_init_data[i].reg,tmp);
}
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);
#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;
+ struct sensor *sensor = to_sensor(client);
SENSOR_DG("\n%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__);
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;
}
static struct reginfo sensor_power_down_sequence[]=
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 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)
+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)
+static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
struct i2c_client *client = sd->priv;
struct sensor *sensor = to_sensor(client);
- struct v4l2_pix_format *pix = &f->fmt.pix;
+ const struct sensor_datafmt *fmt;
struct reginfo *winseqe_set_addr=NULL;
char readval;
int ret=0, set_w,set_h,i;
- 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;
+ winseqe_set_addr = sensor_ClrFmt_YUYV;
sensor_read(client, 0x3a, &readval);
sensor_write(client,0x3a, readval&0xf7);
sensor_read(client,0x3d,&readval);
sensor_write(client,0x3d,readval&0xfe);
break;
}
- case V4L2_PIX_FMT_UYVY:
+ case V4L2_MBUS_FMT_UYVY8_2X8:
{
- //winseqe_set_addr = sensor_ClrFmt_UYVY;
+ winseqe_set_addr = sensor_ClrFmt_UYVY;
sensor_read(client, 0x3a, &readval);
sensor_write(client,0x3a, readval|0x08);
sensor_read(client,0x3d,&readval);
}
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->info_priv.pixfmt = pix->pixelformat;
-
- // SENSOR_DG("%s Pixelformat(0x%x) set success!\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;
- SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,pix->width,pix->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)
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)
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
{
- 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);
-
- return 0;
+ struct i2c_client *client = sd->priv;
+ 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;
+
+ return ret;
}
-
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
{
struct i2c_client *client = sd->priv;
}
#endif
#if CONFIG_SENSOR_DigitalZoom
-static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)
+static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
{
struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
struct sensor *sensor = to_sensor(client);
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;
}
goto sensor_video_probe_err;
}
- icd->formats = sensor_colour_formats;
- icd->num_formats = ARRAY_SIZE(sensor_colour_formats);
-
return 0;
sensor_video_probe_err:
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