mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
media: rockchip: isp: dmarx support yuv format
Change-Id: I0375e0defa96bb3d3b1573170b203ecfce33219e Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user