media: rockchip: isp: dmarx support yuv format

Change-Id: I0375e0defa96bb3d3b1573170b203ecfce33219e
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2021-07-16 15:44:50 +08:00
committed by Tao Huang
parent 354dc4cebe
commit 9e9bbd341c
3 changed files with 51 additions and 8 deletions

View File

@@ -177,6 +177,26 @@ static const struct capture_fmt rawrd_fmts[] = {
.fmt_type = FMT_BAYER,
.bpp = { 12 },
.mplanes = 1,
}, {
.fourcc = V4L2_PIX_FMT_YUYV,
.fmt_type = FMT_YUV,
.bpp = { 16 },
.mplanes = 1,
}, {
.fourcc = V4L2_PIX_FMT_YVYU,
.fmt_type = FMT_YUV,
.bpp = { 16 },
.mplanes = 1,
}, {
.fourcc = V4L2_PIX_FMT_UYVY,
.fmt_type = FMT_YUV,
.bpp = { 16 },
.mplanes = 1,
}, {
.fourcc = V4L2_PIX_FMT_VYUY,
.fmt_type = FMT_YUV,
.bpp = { 16 },
.mplanes = 1,
}
};
@@ -317,6 +337,12 @@ static int rawrd_config_mi(struct rkisp_stream *stream)
case V4L2_PIX_FMT_Y10:
val |= CIF_CSI2_DT_RAW10;
break;
case V4L2_PIX_FMT_YUYV:
case V4L2_PIX_FMT_YVYU:
case V4L2_PIX_FMT_UYVY:
case V4L2_PIX_FMT_VYUY:
val |= CIF_CSI2_DT_YUV422_8b;
break;
default:
val |= CIF_CSI2_DT_RAW12;
}
@@ -342,6 +368,21 @@ static void update_rawrd(struct rkisp_stream *stream)
stream->curr_buf->buff_addr[RKISP_PLANE_Y],
false);
stream->frame_end = false;
if (stream->id == RKISP_STREAM_RAWRD2 &&
stream->out_isp_fmt.fmt_type == FMT_YUV) {
struct vb2_v4l2_buffer *vbuf = &stream->curr_buf->vb;
struct isp2x_csi_trigger trigger = {
.frame_timestamp = vbuf->vb2_buf.timestamp,
.sof_timestamp = vbuf->vb2_buf.timestamp,
.frame_id = vbuf->sequence,
.mode = T_START_X1,
.times = 0,
};
if (!vbuf->sequence)
trigger.frame_id = atomic_inc_return(&dev->isp_sdev.frm_sync_seq);
rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, &trigger);
}
} else if (dev->dmarx_dev.trigger == T_AUTO) {
/* internal raw wr/rd buf rotate */
struct rkisp_dummy_buffer *buf;
@@ -399,9 +440,10 @@ static int dmarx_frame_end(struct rkisp_stream *stream)
queue);
list_del(&stream->curr_buf->queue);
}
spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
stream->ops->update_mi(stream);
if (stream->streaming)
stream->ops->update_mi(stream);
spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
return 0;
}
@@ -439,8 +481,8 @@ static int dmarx_start(struct rkisp_stream *stream)
return ret;
stream->curr_buf = NULL;
dmarx_frame_end(stream);
stream->streaming = true;
dmarx_frame_end(stream);
return 0;
}
@@ -615,7 +657,7 @@ static int rkisp_init_vb2_queue(struct vb2_queue *q,
q->mem_ops = stream->ispdev->hw_dev->mem_ops;
q->buf_struct_size = sizeof(struct rkisp_buffer);
q->min_buffers_needed = CIF_ISP_REQ_BUFS_MIN;
q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
q->lock = &stream->apilock;
q->dev = stream->ispdev->hw_dev->dev;
q->allow_cache_hints = 1;
@@ -967,6 +1009,7 @@ void rkisp_rawrd_set_pic_size(struct rkisp_device *dev,
u32 width, u32 height)
{
struct rkisp_isp_subdev *sdev = &dev->isp_sdev;
u8 mult = sdev->in_fmt.fmt_type == FMT_YUV ? 2 : 1;
/* rx height should equal to isp height + offset for read back mode */
height = sdev->in_crop.top + sdev->in_crop.height;
@@ -978,7 +1021,7 @@ void rkisp_rawrd_set_pic_size(struct rkisp_device *dev,
dev->rd_mode == HDR_RDBK_FRAME1)
height += RKMODULE_EXTEND_LINE;
rkisp_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | width, false);
rkisp_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | width * mult, false);
}
void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id,

View File

@@ -81,8 +81,6 @@
* +---------------------------------------------------------+
*/
static int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg);
struct backup_reg {
const u32 base;
const u32 shd;
@@ -666,7 +664,7 @@ end:
rkisp_trigger_read_back(isp, times, mode, false);
}
static int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg)
int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg)
{
struct kfifo *fifo = &dev->rdbk_kfifo;
struct isp2x_csi_trigger *trigger = NULL;

View File

@@ -168,6 +168,8 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq);
void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, bool is_try);
int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg);
static inline
struct ispsd_out_fmt *rkisp_get_ispsd_out_fmt(struct rkisp_isp_subdev *isp_sdev)
{