From: Kruno Mrak <kruno.mrak@matrix-vision.de>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: linux-media@vger.kernel.org, sakari.ailus@iki.fi
Subject: Re: omap3isp: sequence number in v4l2 buffer not incremented
Date: Fri, 10 Feb 2012 17:18:22 +0100 [thread overview]
Message-ID: <4F35434E.6020405@matrix-vision.de> (raw)
In-Reply-To: <3002082.9RrLpdpVPL@avalon>
Laurent,
thank you for the patch.
It was a bit tricky to get it work as our kernel is based
on 2.6.38, but i succeeded.
The frame_number is incremented now.
The following changes are not clear to me, are they really necessary to
get frame_number incremented?
@@ -350,7 +337,6 @@ static void ccp2_lcx_config(struct isp_ccp2_device
*ccp2,
ISPCCP2_LC01_IRQSTATUS_LC0_CRC_IRQ |
ISPCCP2_LC01_IRQSTATUS_LC0_FSP_IRQ |
ISPCCP2_LC01_IRQSTATUS_LC0_FW_IRQ |
- ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ |
ISPCCP2_LC01_IRQSTATUS_LC0_FSC_IRQ |
ISPCCP2_LC01_IRQSTATUS_LC0_SSC_IRQ;
@@ -378,21 +378,17 @@ static void csi2_timing_config(struct isp_device *isp,
static void csi2_irq_ctx_set(struct isp_device *isp,
struct isp_csi2_device *csi2, int enable)
{
- u32 reg = ISPCSI2_CTX_IRQSTATUS_FE_IRQ;
int i;
- if (csi2->use_fs_irq)
- reg |= ISPCSI2_CTX_IRQSTATUS_FS_IRQ;
-
for (i = 0; i < 8; i++) {
- isp_reg_writel(isp, reg, csi2->regs1,
+ isp_reg_writel(isp, ISPCSI2_CTX_IRQSTATUS_FE_IRQ, csi2->regs1,
ISPCSI2_CTX_IRQSTATUS(i));
if (enable)
isp_reg_set(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
- reg);
+ ISPCSI2_CTX_IRQSTATUS_FE_IRQ);
else
isp_reg_clr(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
- reg);
+ ISPCSI2_CTX_IRQSTATUS_FE_IRQ);
}
}
Am 09.02.2012 17:08, schrieb Laurent Pinchart:
> Hi Kruno,
>
> On Wednesday 25 January 2012 16:34:26 Kruno Mrak wrote:
>> Hello,
>>
>> we have an omap based intelligent camera and image sensor is connected to
>> camera parallel interface. Image capturing via "CCDC output" works fine.
>> When streaming is on and reading "sequence" variable, it shows always -1.
>> Looking at kernel-source ispvideo.c, i found following if-else statement:
>>
>> /* Do frame number propagation only if this is the output video node.
>> * Frame number either comes from the CSI receivers or it gets
>> * incremented here if H3A is not active.
>> * Note: There is no guarantee that the output buffer will finish
>> * first, so the input number might lag behind by 1 in some cases.
>> */
>> if (video == pipe->output && !pipe->do_propagation)
>> buf->vbuf.sequence = atomic_inc_return(&pipe->frame_number);
>> else
>> buf->vbuf.sequence = atomic_read(&pipe->frame_number);
>>
>> When i change to
>> if (video == pipe->output && pipe->do_propagation)
>> ...
>> the sequence variable is incremented.
>>
>> So my question:
>> Could it be that "pipe->do_propagation" should be tested on true and not on
>> false?
>
> No, the code is correct here. When do_propagation is true, the pipeline's
> frame number is incremented in the frame start interrupt handler. This allows
> synchronization of buffer sequence numbers with the statistics engine frame
> counts.
>
>> If this change is wrong, how can i achieve that the sequence number is
>> incremented?
>
> The driver increments the frame number in the CCP2 and CSI2 receivers
> interrupt handlers. The frame number will thus not be incremented when using
> the CCDC parallel input, which is wrong.
>
> Does the following patch fix your problem ? I haven't been able to test it
> yet with the CCP2 and CSI2 receivers, I might ask you to test a second
> version. Sakari, could you test the patch on the N900 with the CCP2 receiver ?
> I'm currently travelling and haven't brought mine with me.
>
>>From c0d23bfa38fc91f33f39bab9328eda3a4481f152 Mon Sep 17 00:00:00 2001
> From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Date: Thu, 9 Feb 2012 17:00:45 +0100
> Subject: [PATCH] omap3isp: Fix frame number propagation
>
> When propagating the frame number through the pipeline, the frame number
> must be incremented at frame start by the appropriate IRQ handler. This
> was properly handled for the CSI2 and CCP2 receivers, but not when the
> CCDC parallel interface is used.
>
> ADD frame number incrementation to the HS/VS interrupt handler. As the
> HS/VS interrupt is also generated for frames received by the CSI2 and
> CCP2 receivers, remove explicit propagation handling from the serial
> receivers.
>
> Reported-by: Kruno Mrak <kruno.mrak@matrix-vision.de>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> drivers/media/video/omap3isp/isp.c | 8 --------
> drivers/media/video/omap3isp/ispccdc.c | 3 +++
> drivers/media/video/omap3isp/ispccp2.c | 22 ----------------------
> drivers/media/video/omap3isp/ispcsi2.c | 19 +++----------------
> drivers/media/video/omap3isp/ispcsi2.h | 1 -
> 5 files changed, 6 insertions(+), 47 deletions(-)
>
> diff --git a/drivers/media/video/omap3isp/isp.c b/drivers/media/video/omap3isp/isp.c
> index 06afbc1..df6416c 100644
> --- a/drivers/media/video/omap3isp/isp.c
> +++ b/drivers/media/video/omap3isp/isp.c
> @@ -785,14 +785,6 @@ static int isp_pipeline_enable(struct isp_pipeline *pipe,
> }
> }
>
> - /* Frame number propagation. In continuous streaming mode the number
> - * is incremented in the frame start ISR. In mem-to-mem mode
> - * singleshot is used and frame start IRQs are not available.
> - * Thus we have to increment the number here.
> - */
> - if (pipe->do_propagation && mode == ISP_PIPELINE_STREAM_SINGLESHOT)
> - atomic_inc(&pipe->frame_number);
> -
> return 0;
> }
>
> diff --git a/drivers/media/video/omap3isp/ispccdc.c b/drivers/media/video/omap3isp/ispccdc.c
> index eaabc27..8d8d6f3 100644
> --- a/drivers/media/video/omap3isp/ispccdc.c
> +++ b/drivers/media/video/omap3isp/ispccdc.c
> @@ -1410,6 +1410,9 @@ static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc)
> struct video_device *vdev = ccdc->subdev.devnode;
> struct v4l2_event event;
>
> + /* Frame number propagation */
> + atomic_inc(&pipe->frame_number);
> +
> memset(&event, 0, sizeof(event));
> event.type = V4L2_EVENT_FRAME_SYNC;
> event.u.frame_sync.frame_sequence = atomic_read(&pipe->frame_number);
> diff --git a/drivers/media/video/omap3isp/ispccp2.c b/drivers/media/video/omap3isp/ispccp2.c
> index 70ddbf3..84014b9 100644
> --- a/drivers/media/video/omap3isp/ispccp2.c
> +++ b/drivers/media/video/omap3isp/ispccp2.c
> @@ -178,19 +178,6 @@ static void ccp2_if_enable(struct isp_ccp2_device *ccp2, u8 enable)
> ISPCCP2_CTRL_MODE | ISPCCP2_CTRL_IF_EN,
> enable ? (ISPCCP2_CTRL_MODE | ISPCCP2_CTRL_IF_EN) : 0);
>
> - /* For frame count propagation */
> - if (pipe->do_propagation) {
> - /* We may want the Frame Start IRQ from LC0 */
> - if (enable)
> - isp_reg_set(isp, OMAP3_ISP_IOMEM_CCP2,
> - ISPCCP2_LC01_IRQENABLE,
> - ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ);
> - else
> - isp_reg_clr(isp, OMAP3_ISP_IOMEM_CCP2,
> - ISPCCP2_LC01_IRQENABLE,
> - ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ);
> - }
> -
> if (!enable && ccp2->vdds_csib)
> regulator_disable(ccp2->vdds_csib);
> }
> @@ -350,7 +337,6 @@ static void ccp2_lcx_config(struct isp_ccp2_device *ccp2,
> ISPCCP2_LC01_IRQSTATUS_LC0_CRC_IRQ |
> ISPCCP2_LC01_IRQSTATUS_LC0_FSP_IRQ |
> ISPCCP2_LC01_IRQSTATUS_LC0_FW_IRQ |
> - ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ |
> ISPCCP2_LC01_IRQSTATUS_LC0_FSC_IRQ |
> ISPCCP2_LC01_IRQSTATUS_LC0_SSC_IRQ;
>
> @@ -613,14 +599,6 @@ void omap3isp_ccp2_isr(struct isp_ccp2_device *ccp2)
> if (omap3isp_module_sync_is_stopping(&ccp2->wait, &ccp2->stopping))
> return;
>
> - /* Frame number propagation */
> - if (lcx_irqstatus & ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ) {
> - struct isp_pipeline *pipe =
> - to_isp_pipeline(&ccp2->subdev.entity);
> - if (pipe->do_propagation)
> - atomic_inc(&pipe->frame_number);
> - }
> -
> /* Handle queued buffers on frame end interrupts */
> if (lcm_irqstatus & ISPCCP2_LCM_IRQSTATUS_EOF_IRQ)
> ccp2_isr_buffer(ccp2);
> diff --git a/drivers/media/video/omap3isp/ispcsi2.c b/drivers/media/video/omap3isp/ispcsi2.c
> index fcb5168..3026215 100644
> --- a/drivers/media/video/omap3isp/ispcsi2.c
> +++ b/drivers/media/video/omap3isp/ispcsi2.c
> @@ -378,21 +378,17 @@ static void csi2_timing_config(struct isp_device *isp,
> static void csi2_irq_ctx_set(struct isp_device *isp,
> struct isp_csi2_device *csi2, int enable)
> {
> - u32 reg = ISPCSI2_CTX_IRQSTATUS_FE_IRQ;
> int i;
>
> - if (csi2->use_fs_irq)
> - reg |= ISPCSI2_CTX_IRQSTATUS_FS_IRQ;
> -
> for (i = 0; i < 8; i++) {
> - isp_reg_writel(isp, reg, csi2->regs1,
> + isp_reg_writel(isp, ISPCSI2_CTX_IRQSTATUS_FE_IRQ, csi2->regs1,
> ISPCSI2_CTX_IRQSTATUS(i));
> if (enable)
> isp_reg_set(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
> - reg);
> + ISPCSI2_CTX_IRQSTATUS_FE_IRQ);
> else
> isp_reg_clr(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
> - reg);
> + ISPCSI2_CTX_IRQSTATUS_FE_IRQ);
> }
> }
>
> @@ -690,14 +686,6 @@ static void csi2_isr_ctx(struct isp_csi2_device *csi2,
> status = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
> isp_reg_writel(isp, status, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
>
> - /* Propagate frame number */
> - if (status & ISPCSI2_CTX_IRQSTATUS_FS_IRQ) {
> - struct isp_pipeline *pipe =
> - to_isp_pipeline(&csi2->subdev.entity);
> - if (pipe->do_propagation)
> - atomic_inc(&pipe->frame_number);
> - }
> -
> if (!(status & ISPCSI2_CTX_IRQSTATUS_FE_IRQ))
> return;
>
> @@ -1054,7 +1042,6 @@ static int csi2_set_stream(struct v4l2_subdev *sd, int enable)
> case ISP_PIPELINE_STREAM_CONTINUOUS:
> if (omap3isp_csiphy_acquire(csi2->phy) < 0)
> return -ENODEV;
> - csi2->use_fs_irq = pipe->do_propagation;
> if (csi2->output & CSI2_OUTPUT_MEMORY)
> omap3isp_sbl_enable(isp, OMAP3_ISP_SBL_CSI2A_WRITE);
> csi2_configure(csi2);
> diff --git a/drivers/media/video/omap3isp/ispcsi2.h b/drivers/media/video/omap3isp/ispcsi2.h
> index 885ad79..c57729b 100644
> --- a/drivers/media/video/omap3isp/ispcsi2.h
> +++ b/drivers/media/video/omap3isp/ispcsi2.h
> @@ -145,7 +145,6 @@ struct isp_csi2_device {
> u32 output; /* output to CCDC, memory or both? */
> bool dpcm_decompress;
> unsigned int frame_skip;
> - bool use_fs_irq;
>
> struct isp_csiphy *phy;
> struct isp_csi2_ctx_cfg contexts[ISP_CSI2_MAX_CTX_NUM + 1];
>
MATRIX VISION GmbH, Talstrasse 16, DE-71570 Oppenweiler
Registergericht: Amtsgericht Stuttgart, HRB 271090
Geschaeftsfuehrer: Gerhard Thullner, Werner Armingeon, Uwe Furtner, Erhard Meier
next prev parent reply other threads:[~2012-02-10 16:18 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-25 15:34 omap3isp: sequence number in v4l2 buffer not incremented Kruno Mrak
2012-02-09 16:08 ` Laurent Pinchart
2012-02-10 16:18 ` Kruno Mrak [this message]
2012-02-10 17:03 ` Laurent Pinchart
-- strict thread matches above, loose matches on Subject: below --
2012-01-16 10:32 Kruno Mrak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F35434E.6020405@matrix-vision.de \
--to=kruno.mrak@matrix-vision.de \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=sakari.ailus@iki.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).