media: rockchip: isp: update procfs info

Change-Id: I48d64f9e579ca6eee1af5b707420a055e5b1b17f
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2021-03-31 14:04:15 +08:00
committed by Tao Huang
parent 4033489c82
commit 93b52078a6
8 changed files with 271 additions and 112 deletions

View File

@@ -38,6 +38,7 @@
#include "common.h"
#include "capture_v1x.h"
#include "capture_v2x.h"
#include "isp_ispp.h"
#define RDBK_MAX 3
#define RDBK_L 0
@@ -223,6 +224,7 @@ struct rkisp_stream {
wait_queue_head_t done;
unsigned int burst;
atomic_t sequence;
struct frame_debug_info dbg;
union {
struct rkisp_stream_sp sp;
struct rkisp_stream_mp mp;

View File

@@ -1385,6 +1385,13 @@ static int mi_frame_end(struct rkisp_stream *stream)
ns = ktime_get_ns();
vb2_buf->timestamp = ns;
ns = ktime_get_ns();
stream->dbg.interval = ns - stream->dbg.timestamp;
stream->dbg.timestamp = ns;
stream->dbg.id = stream->curr_buf->vb.sequence;
if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP)
stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp;
if (is_rdbk_stream(stream) &&
dev->dmarx_dev.trigger == T_MANUAL) {
if (stream->id == RKISP_STREAM_DMATX0) {

View File

@@ -738,6 +738,13 @@ static int mi_frame_end(struct rkisp_stream *stream)
ns = ktime_get_ns();
vb2_buf->timestamp = ns;
ns = ktime_get_ns();
stream->dbg.interval = ns - stream->dbg.timestamp;
stream->dbg.timestamp = ns;
stream->dbg.id = stream->curr_buf->vb.sequence;
if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP)
stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp;
if (is_rdbk_stream(stream) &&
dev->dmarx_dev.trigger == T_MANUAL) {
if (stream->id == RKISP_STREAM_DMATX0) {

View File

@@ -658,6 +658,7 @@ static void rkisp_dev_trigger_handle(struct rkisp_device *dev, u32 cmd)
isp->dmarx_dev.cur_frame.id = t.frame_id;
isp->dmarx_dev.cur_frame.sof_timestamp = t.sof_timestamp;
isp->dmarx_dev.cur_frame.timestamp = t.frame_timestamp;
isp->isp_sdev.frm_timestamp = t.sof_timestamp;
mode = t.mode;
times = t.times;
hw->cur_dev_id = id;

View File

@@ -41,49 +41,52 @@ struct isp_irqs_data {
/* using default value if reg no write for multi device */
static void default_sw_reg_flag(struct rkisp_device *dev)
{
u32 reg[] = {
CTRL_VI_ISP_PATH,
IMG_EFF_CTRL,
SUPER_IMP_CTRL,
ISP_FLASH_CMD,
ISP_SHUTTER_CTRL,
ISP_CCM_CTRL,
CPROC_CTRL,
DUAL_CROP_CTRL,
ISP_GAMMA_OUT_CTRL,
ISP_GAMMA_OUT_CTRL,
ISP_LSC_CTRL,
ISP_DEBAYER_CONTROL,
ISP_WDR_CTRL,
ISP_GIC_CONTROL,
ISP_BLS_CTRL,
ISP_DPCC0_MODE,
ISP_DPCC1_MODE,
ISP_DPCC2_MODE,
ISP_HDRMGE_CTRL,
ISP_HDRTMO_CTRL,
ISP_RAWNR_CTRL,
ISP_LDCH_STS,
ISP_DHAZ_CTRL,
ISP_3DLUT_CTRL,
ISP_GAIN_CTRL,
ISP_AFM_CTRL,
ISP_HIST_HIST_CTRL,
RAWAE_BIG1_BASE,
RAWAE_BIG2_BASE,
RAWAE_BIG3_BASE,
ISP_RAWAE_LITE_CTRL,
ISP_RAWHIST_LITE_CTRL,
ISP_RAWHIST_BIG1_BASE,
ISP_RAWHIST_BIG2_BASE,
ISP_RAWHIST_BIG3_BASE,
ISP_YUVAE_CTRL,
ISP_RAWAF_CTRL,
ISP_RAWAWB_CTRL,
u32 v20_reg[] = {
CTRL_VI_ISP_PATH, IMG_EFF_CTRL, ISP_CCM_CTRL,
CPROC_CTRL, DUAL_CROP_CTRL, ISP_GAMMA_OUT_CTRL,
ISP_LSC_CTRL, ISP_DEBAYER_CONTROL, ISP_WDR_CTRL,
ISP_GIC_CONTROL, ISP_BLS_CTRL, ISP_DPCC0_MODE,
ISP_DPCC1_MODE, ISP_DPCC2_MODE, ISP_HDRMGE_CTRL,
ISP_HDRTMO_CTRL, ISP_RAWNR_CTRL, ISP_LDCH_STS,
ISP_DHAZ_CTRL, ISP_3DLUT_CTRL, ISP_GAIN_CTRL,
ISP_AFM_CTRL, ISP_HIST_HIST_CTRL, RAWAE_BIG1_BASE,
RAWAE_BIG2_BASE, RAWAE_BIG3_BASE, ISP_RAWAE_LITE_CTRL,
ISP_RAWHIST_LITE_CTRL, ISP_RAWHIST_BIG1_BASE,
ISP_RAWHIST_BIG2_BASE, ISP_RAWHIST_BIG3_BASE,
ISP_YUVAE_CTRL, ISP_RAWAF_CTRL, ISP_RAWAWB_CTRL,
};
u32 i, *flag;
u32 v21_reg[] = {
CTRL_VI_ISP_PATH, IMG_EFF_CTRL, ISP_CCM_CTRL,
CPROC_CTRL, DUAL_CROP_CTRL, ISP_GAMMA_OUT_CTRL,
SELF_RESIZE_CTRL, MAIN_RESIZE_CTRL, ISP_LSC_CTRL,
ISP_DEBAYER_CONTROL, ISP21_YNR_GLOBAL_CTRL,
ISP21_CNR_CTRL, ISP21_SHARP_SHARP_EN, ISP_GIC_CONTROL,
ISP_BLS_CTRL, ISP_DPCC0_MODE, ISP_DPCC1_MODE,
ISP_HDRMGE_CTRL, ISP21_DRC_CTRL0, ISP21_BAYNR_CTRL,
ISP21_BAY3D_CTRL, ISP_LDCH_STS, ISP21_DHAZ_CTRL,
ISP_3DLUT_CTRL, ISP_AFM_CTRL, ISP_HIST_HIST_CTRL,
RAWAE_BIG1_BASE, RAWAE_BIG2_BASE, RAWAE_BIG3_BASE,
ISP_RAWAE_LITE_CTRL, ISP_RAWHIST_LITE_CTRL,
ISP_RAWHIST_BIG1_BASE, ISP_RAWHIST_BIG2_BASE,
ISP_RAWHIST_BIG3_BASE, ISP_YUVAE_CTRL, ISP_RAWAF_CTRL,
ISP21_RAWAWB_CTRL,
};
u32 i, *flag, *reg, size;
for (i = 0; i < ARRAY_SIZE(reg); i++) {
switch (dev->isp_ver) {
case ISP_V20:
reg = v20_reg;
size = ARRAY_SIZE(v20_reg);
break;
case ISP_V21:
reg = v21_reg;
size = ARRAY_SIZE(v21_reg);
break;
default:
return;
}
for (i = 0; i < size; i++) {
flag = dev->sw_base_addr + reg[i] + RKISP_ISP_SW_REG_SIZE;
*flag = SW_REG_CACHE;
}

View File

@@ -12,13 +12,10 @@
#include "regs_v2x.h"
#ifdef CONFIG_PROC_FS
static int isp_show(struct seq_file *p, void *v)
static void isp20_show(struct rkisp_device *dev, struct seq_file *p)
{
struct rkisp_device *dev = p->private;
struct rkisp_isp_subdev *sdev = &dev->isp_sdev;
struct rkisp_sensor_info *sensor = dev->active_sensor;
u32 full_range_flg = CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA;
u32 val = 0;
static const char * const effect[] = {
"BLACKWHITE",
"NEGATIVE",
@@ -29,70 +26,7 @@ static int isp_show(struct seq_file *p, void *v)
"SHARPEN",
"RKSHARPEN"
};
seq_printf(p, "%-10s Version:v%02x.%02x.%02x\n",
dev->name,
RKISP_DRIVER_VERSION >> 16,
(RKISP_DRIVER_VERSION & 0xff00) >> 8,
RKISP_DRIVER_VERSION & 0x00ff);
for (val = 0; val < dev->hw_dev->num_clks; val++) {
seq_printf(p, "%-10s %ld\n",
dev->hw_dev->match_data->clks[val],
clk_get_rate(dev->hw_dev->clks[val]));
}
if (!(dev->isp_state & ISP_START))
return 0;
seq_printf(p, "%-10s Cnt:%d ErrCnt:%d\n",
"Interrupt",
dev->isp_isr_cnt,
dev->isp_err_cnt);
if (sensor && sensor->fi.interval.numerator)
val = sensor->fi.interval.denominator / sensor->fi.interval.numerator;
seq_printf(p, "%-10s %s Format:%s Size:%dx%d@%dfps Offset(%d,%d)\n",
"Input",
sensor ? sensor->sd->name : NULL,
sdev->in_fmt.name,
sdev->in_crop.width, sdev->in_crop.height, val,
sdev->in_crop.left, sdev->in_crop.top);
if (IS_HDR_RDBK(dev->hdr.op_mode))
seq_printf(p, "%-10s mode:frame%d (frame:%d rate:%dms %s) cnt(total:%d X1:%d X2:%d X3:%d)\n",
"Isp Read",
dev->csi_dev.rd_mode - 3,
dev->dmarx_dev.cur_frame.id,
(u32)(dev->dmarx_dev.cur_frame.timestamp - dev->dmarx_dev.pre_frame.timestamp) / 1000 / 1000,
(dev->isp_state & ISP_FRAME_END) ? "idle" : "working",
dev->csi_dev.frame_cnt,
dev->csi_dev.frame_cnt_x1,
dev->csi_dev.frame_cnt_x2,
dev->csi_dev.frame_cnt_x3);
seq_printf(p, "%-10s rkispp%d %s Format:%s%s Size:%dx%d (frame:%d rate:%dms)\n",
"Output",
dev->dev_id,
dev->br_dev.en ? "ON" : "OFF",
(dev->br_dev.work_mode & ISP_ISPP_FBC) ? "FBC" : "YUV",
(dev->br_dev.work_mode & ISP_ISPP_422) ? "422" : "420",
dev->br_dev.crop.width,
dev->br_dev.crop.height,
dev->br_dev.dbg.id,
dev->br_dev.dbg.interval / 1000 / 1000);
for (val = 0; val < RKISP_MAX_STREAM; val++) {
struct rkisp_stream *stream = &dev->cap_dev.stream[val];
if (!stream->streaming)
continue;
seq_printf(p, "%-10s %s Format:%c%c%c%c Size:%dx%d frame:%d\n",
"Output",
stream->vnode.vdev.name,
stream->out_fmt.pixelformat,
stream->out_fmt.pixelformat >> 8,
stream->out_fmt.pixelformat >> 16,
stream->out_fmt.pixelformat >> 24,
stream->out_fmt.width,
stream->out_fmt.height,
atomic_read(&stream->sequence) - 1);
}
u32 val;
val = rkisp_read(dev, ISP_DPCC0_MODE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "DPCC0", (val & 1) ? "ON" : "OFF", val);
@@ -175,6 +109,200 @@ static int isp_show(struct seq_file *p, void *v)
seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST2", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_RAWHIST_BIG1_BASE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST3", (val & 1) ? "ON" : "OFF", val);
}
static void isp21_show(struct rkisp_device *dev, struct seq_file *p)
{
u32 full_range_flg = CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA;
static const char * const effect[] = {
"BLACKWHITE",
"NEGATIVE",
"SEPIA",
"COLOR_SEL",
"EMBOSS",
"SKETCH",
"SHARPEN",
"RKSHARPEN"
};
u32 val;
val = rkisp_read(dev, ISP_DPCC0_MODE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "DPCC0", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_DPCC1_MODE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "DPCC1", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_BLS_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "BLS", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, CIF_ISP_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "SDG",
(val & CIF_ISP_CTRL_ISP_GAMMA_IN_ENA) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_LSC_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "LSC", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, CIF_ISP_CTRL, false);
seq_printf(p, "%-10s %s(0x%x) (gain: 0x%08x, 0x%08x)\n", "AWBGAIN",
(val & CIF_ISP_CTRL_ISP_AWB_ENA) ? "ON" : "OFF", val,
rkisp_read(dev, CIF_ISP_AWB_GAIN_G_V12, false),
rkisp_read(dev, CIF_ISP_AWB_GAIN_RB_V12, false));
val = rkisp_read(dev, ISP_DEBAYER_CONTROL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "DEBAYER", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_CCM_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "CCM", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_GAMMA_OUT_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "GAMMA_OUT", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, CPROC_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "CPROC", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, CIF_IMG_EFF_CTRL, false);
seq_printf(p, "%-10s %s(0x%x) (effect: %s)\n", "IE",
(val & 1) ? "ON" : "OFF", val,
effect[(val & CIF_IMG_EFF_CTRL_MODE_MASK) >> 1]);
val = rkisp_read(dev, ISP21_DRC_CTRL0, false);
seq_printf(p, "%-10s %s(0x%x)\n", "HDRTMO", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_HDRMGE_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "HDRMGE", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP21_BAYNR_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "BAYNR", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP21_BAY3D_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "BAY3D", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP21_YNR_GLOBAL_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "YNR", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP21_CNR_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "CNR", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP21_SHARP_SHARP_EN, false);
seq_printf(p, "%-10s %s(0x%x)\n", "SHARP", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_GIC_CONTROL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "GIC", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_DHAZ_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "DHAZ", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_3DLUT_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "3DLUT", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_LDCH_STS, false);
seq_printf(p, "%-10s %s(0x%x)\n", "LDCH", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "CSM",
(val & full_range_flg) ? "FULL" : "LIMITED", val);
val = rkisp_read(dev, ISP_AFM_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "SIAF", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, CIF_ISP_AWB_PROP_V10, false);
seq_printf(p, "%-10s %s(0x%x)\n", "SIAWB",
(val & CIF_ISP_AWB_ENABLE) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_YUVAE_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "YUVAE", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_HIST_HIST_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "SIHST", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_RAWAF_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAF", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP21_RAWAWB_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAWB", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_RAWAE_LITE_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE0", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, RAWAE_BIG2_BASE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE1", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, RAWAE_BIG3_BASE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE2", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, RAWAE_BIG1_BASE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE3", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_RAWHIST_LITE_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST0", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_RAWHIST_BIG2_BASE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST1", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_RAWHIST_BIG3_BASE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST2", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP_RAWHIST_BIG1_BASE, false);
seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST3", (val & 1) ? "ON" : "OFF", val);
}
static int isp_show(struct seq_file *p, void *v)
{
struct rkisp_device *dev = p->private;
struct rkisp_isp_subdev *sdev = &dev->isp_sdev;
struct rkisp_sensor_info *sensor = dev->active_sensor;
u32 val = 0;
seq_printf(p, "%-10s Version:v%02x.%02x.%02x\n",
dev->name,
RKISP_DRIVER_VERSION >> 16,
(RKISP_DRIVER_VERSION & 0xff00) >> 8,
RKISP_DRIVER_VERSION & 0x00ff);
for (val = 0; val < dev->hw_dev->num_clks; val++) {
seq_printf(p, "%-10s %ld\n",
dev->hw_dev->match_data->clks[val],
clk_get_rate(dev->hw_dev->clks[val]));
}
if (!(dev->isp_state & ISP_START))
return 0;
seq_printf(p, "%-10s Cnt:%d ErrCnt:%d\n",
"Interrupt",
dev->isp_isr_cnt,
dev->isp_err_cnt);
if (sensor && sensor->fi.interval.numerator)
val = sensor->fi.interval.denominator / sensor->fi.interval.numerator;
seq_printf(p, "%-10s %s Format:%s Size:%dx%d@%dfps Offset(%d,%d)\n",
"Input",
sensor ? sensor->sd->name : NULL,
sdev->in_fmt.name,
sdev->in_crop.width, sdev->in_crop.height, val,
sdev->in_crop.left, sdev->in_crop.top);
if (IS_HDR_RDBK(dev->hdr.op_mode))
seq_printf(p, "%-10s mode:frame%d (frame:%d rate:%dms %s time:%dms) cnt(total:%d X1:%d X2:%d X3:%d)\n",
"Isp Read",
dev->csi_dev.rd_mode - 3,
dev->dmarx_dev.cur_frame.id,
(u32)(dev->dmarx_dev.cur_frame.timestamp - dev->dmarx_dev.pre_frame.timestamp) / 1000 / 1000,
(dev->isp_state & ISP_FRAME_END) ? "idle" : "working",
sdev->dbg.interval / 1000 / 1000,
dev->csi_dev.frame_cnt,
dev->csi_dev.frame_cnt_x1,
dev->csi_dev.frame_cnt_x2,
dev->csi_dev.frame_cnt_x3);
else
seq_printf(p, "%-10s frame:%d %s time:%dms\n",
"Isp online",
sdev->dbg.id,
(dev->isp_state & ISP_FRAME_END) ? "idle" : "working",
sdev->dbg.interval / 1000 / 1000);
if (dev->br_dev.en)
seq_printf(p, "%-10s rkispp%d Format:%s%s Size:%dx%d (frame:%d rate:%dms)\n",
"Output",
dev->dev_id,
(dev->br_dev.work_mode & ISP_ISPP_FBC) ? "FBC" : "YUV",
(dev->br_dev.work_mode & ISP_ISPP_422) ? "422" : "420",
dev->br_dev.crop.width,
dev->br_dev.crop.height,
dev->br_dev.dbg.id,
dev->br_dev.dbg.interval / 1000 / 1000);
for (val = 0; val < RKISP_MAX_STREAM; val++) {
struct rkisp_stream *stream = &dev->cap_dev.stream[val];
if (!stream->streaming)
continue;
seq_printf(p, "%-10s %s Format:%c%c%c%c Size:%dx%d (frame:%d rate:%dms delay:%dms)\n",
"Output",
stream->vnode.vdev.name,
stream->out_fmt.pixelformat,
stream->out_fmt.pixelformat >> 8,
stream->out_fmt.pixelformat >> 16,
stream->out_fmt.pixelformat >> 24,
stream->out_fmt.width,
stream->out_fmt.height,
stream->dbg.id,
stream->dbg.interval / 1000 / 1000,
stream->dbg.delay / 1000 / 1000);
}
switch (dev->isp_ver) {
case ISP_V20:
isp20_show(dev, p);
break;
case ISP_V21:
isp21_show(dev, p);
break;
default:
break;
}
return 0;
}

View File

@@ -1836,6 +1836,8 @@ rkisp_isp_queue_event_sof(struct rkisp_isp_subdev *isp)
.u.frame_sync.frame_sequence =
atomic_inc_return(&isp->frm_sync_seq) - 1,
};
event.timestamp = ns_to_timespec(ktime_get_ns());
v4l2_event_queue(isp->sd.devnode, &event);
}
@@ -2318,6 +2320,8 @@ void rkisp_isp_isr(unsigned int isp_mis,
dev->isp_isr_cnt++;
/* start edge of v_sync */
if (isp_mis & CIF_ISP_V_START) {
if (!(dev->isp_state & ISP_FRAME_VS))
dev->isp_sdev.dbg.timestamp = ktime_get_ns();
rkisp_set_state(dev, ISP_FRAME_VS);
/* last vsync to config next buf */
if (!dev->csi_dev.filt_state[CSI_F_VS])
@@ -2352,8 +2356,10 @@ void rkisp_isp_isr(unsigned int isp_mis,
}
}
if (dev->vs_irq < 0)
if (dev->vs_irq < 0) {
dev->isp_sdev.frm_timestamp = ktime_get_ns();
rkisp_isp_queue_event_sof(&dev->isp_sdev);
}
vs_skip:
writel(CIF_ISP_V_START, base + CIF_ISP_ICR);
isp_mis_tmp = readl(base + CIF_ISP_MIS);
@@ -2410,6 +2416,8 @@ vs_skip:
/* frame was completely put out */
if (isp_mis & CIF_ISP_FRAME) {
dev->isp_sdev.dbg.interval =
ktime_get_ns() - dev->isp_sdev.dbg.timestamp;
/* Clear Frame In (ISP) */
rkisp_set_state(dev, ISP_FRAME_END);
writel(CIF_ISP_FRAME, base + CIF_ISP_ICR);
@@ -2417,7 +2425,7 @@ vs_skip:
if (isp_mis_tmp & CIF_ISP_FRAME)
v4l2_err(&dev->v4l2_dev,
"isp icr frame end err: 0x%x\n", isp_mis_tmp);
rkisp_dmarx_get_frame(dev, &dev->isp_sdev.dbg.id, NULL, NULL, true);
rkisp_isp_read_add_fifo_data(dev);
}

View File

@@ -41,6 +41,7 @@
#include <linux/rk-camera-module.h>
#include <media/v4l2-fwnode.h>
#include "common.h"
#include "isp_ispp.h"
#define CIF_ISP_INPUT_W_MAX 4416
#define CIF_ISP_INPUT_H_MAX 3312
@@ -118,6 +119,8 @@ struct rkisp_isp_subdev {
bool dphy_errctrl_disabled;
atomic_t frm_sync_seq;
enum v4l2_quantization quantization;
u64 frm_timestamp;
struct frame_debug_info dbg;
};
struct rkisp_emd_data {