hi I get your point but have no idea about IPU_CONF:B28 question. Suggest you to fetch data by mxc_v4l2_capture with CSI_MEM channel to avoid ipu_still issue. Besides, the following is a workable patch for sensor output JPEG data, and IPU taskles as generic format. That includes a little bugs (not handle JPEG varying length) but work. For your reference.
Subject: [PATCH] Enable JPEG camera.
---
drivers/media/video/mxc/capture/SENSOR_mipi.c | 12 +++++++++---
drivers/media/video/mxc/capture/ipu_csi_enc.c | 2 ++
drivers/media/video/mxc/capture/mxc_v4l2_capture.c | 5 +++++
3 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/drivers/media/video/mxc/capture/SENSOR_mipi.c b/drivers/media/video/mxc/capture/SENSOR_mipi.c
index e94fe3c..4612269 100644
--- a/drivers/media/video/mxc/capture/SENSOR_mipi.c
+++ b/drivers/media/video/mxc/capture/SENSOR_mipi.c
@@ -4486,8 +4486,10 @@ static int SENSOR_init_mode(enum SENSOR_frame_rate frame_rate,
mipi_csi2_reset(mipi_csi2_info);
if (SENSOR_data.pix.pixelformat == V4L2_PIX_FMT_UYVY)//V4L2_PIX_FMT_YUYV)
- mipi_csi2_set_datatype(mipi_csi2_info, 0x1E); //0x1e 8bit
- else if (SENSOR_data.pix.pixelformat == V4L2_PIX_FMT_RGB565)
+ mipi_csi2_set_datatype(mipi_csi2_info, 0x1e); //0x1e 8bit
+ else if (SENSOR_data.pix.pixelformat == V4L2_PIX_FMT_JPEG) {
+ mipi_csi2_set_datatype(mipi_csi2_info, 0x30);
+ } else if (SENSOR_data.pix.pixelformat == V4L2_PIX_FMT_RGB565)
mipi_csi2_set_datatype(mipi_csi2_info, MIPI_DT_RGB565);
else
pr_err("currently this sensor format can not be supported!\n");
@@ -4502,6 +4504,8 @@ static int SENSOR_init_mode(enum SENSOR_frame_rate frame_rate,
if ((mode == SENSOR_mode_INIT) || (mode ==0)) {
pr_err("SENSOR_init_mode init mode_0329\n");
+ SENSOR_data.pix.width = 640;
+ SENSOR_data.pix.height = 480;
if(mode == 0)
{
icount = 0;
@@ -4570,6 +4574,8 @@ static int SENSOR_init_mode(enum SENSOR_frame_rate frame_rate,
// set SENSOR to capture mode //
pr_err("SENSOR_init_mode capture mode\n");
+ SENSOR_data.pix.width = 2560;
+ SENSOR_data.pix.height = 1920;
//capture
// pr_err("987 start to capture\n");
/*
@@ -5202,7 +5208,7 @@ static int SENSOR_probe(struct i2c_client *client,
SENSOR_data.io_init = plat_data->io_init;
SENSOR_data.i2c_client = client;
- SENSOR_data.pix.pixelformat = V4L2_PIX_FMT_UYVY;//V4L2_PIX_FMT_YUYV;
+ SENSOR_data.pix.pixelformat = V4L2_PIX_FMT_JPEG;//V4L2_PIX_FMT_YUYV;
SENSOR_data.pix.width = 640;
SENSOR_data.pix.height = 480;
SENSOR_data.streamcap.capability = V4L2_MODE_HIGHQUALITY |
diff --git a/drivers/media/video/mxc/capture/ipu_csi_enc.c b/drivers/media/video/mxc/capture/ipu_csi_enc.c
index 0261a7e..70a8df2 100644
--- a/drivers/media/video/mxc/capture/ipu_csi_enc.c
+++ b/drivers/media/video/mxc/capture/ipu_csi_enc.c
@@ -122,6 +122,8 @@ static int csi_enc_setup(cam_data *cam)
pixel_fmt = IPU_PIX_FMT_BGR32;
else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_RGB32)
pixel_fmt = IPU_PIX_FMT_RGB32;
+ else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_JPEG)
+ pixel_fmt = IPU_PIX_FMT_GENERIC;
else {
printk(KERN_ERR "format not supported\n");
return -EINVAL;
diff --git a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
index 68afd70..73e3049 100644
--- a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
+++ b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
@@ -378,6 +378,7 @@ static inline int valid_mode(u32 palette)
(palette == V4L2_PIX_FMT_UYVY) ||
(palette == V4L2_PIX_FMT_YUYV) ||
(palette == V4L2_PIX_FMT_YUV420) ||
+ (palette == V4L2_PIX_FMT_JPEG) ||
(palette == V4L2_PIX_FMT_NV12));
}
@@ -903,6 +904,10 @@ static int mxc_v4l2_s_fmt(cam_data *cam, struct v4l2_format *f)
size = f->fmt.pix.width * f->fmt.pix.height * 3 / 2;
bytesperline = f->fmt.pix.width;
break;
+ case V4L2_PIX_FMT_JPEG: /* JPEG8, 2bits per pixel */
+ size = f->fmt.pix.width * f->fmt.pix.height / 4;
+ bytesperline = f->fmt.pix.width;
+ break;
default:
break;
}
--
1.7.4.1