Message ID | 20210517142923.3173431-1-festevam@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v3] media: imx-csi: Skip first few frames from a BT.656 source | expand |
On Mon, May 17, 2021 at 7:29 AM Fabio Estevam <festevam@gmail.com> wrote: > > From: Steve Longerbeam <slongerbeam@gmail.com> > > Some BT.656 sensors (e.g. ADV718x) transmit frames with unstable BT.656 > sync codes after initial power on. This confuses the imx CSI,resulting > in vertical and/or horizontal sync issues. Skip the first 20 frames > to avoid the unstable sync codes. > > Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com> > [fabio: fixed checkpatch warning and increased the frame skipping to 20] > Signed-off-by: Fabio Estevam <festevam@gmail.com> > --- > Changes since v2: > - Increase 'bad_frames' to 20 as 10 was not enough to avoid > the problem when using an NTSC camera. > > drivers/staging/media/imx/imx-media-csi.c | 14 +++++++++++++- > 1 file changed, 13 insertions(+), 1 deletion(-) > > diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c > index e3bfd635a89a..6a94fff49bf6 100644 > --- a/drivers/staging/media/imx/imx-media-csi.c > +++ b/drivers/staging/media/imx/imx-media-csi.c > @@ -750,9 +750,10 @@ static int csi_setup(struct csi_priv *priv) > > static int csi_start(struct csi_priv *priv) > { > - struct v4l2_fract *output_fi; > + struct v4l2_fract *input_fi, *output_fi; > int ret; > > + input_fi = &priv->frame_interval[CSI_SINK_PAD]; > output_fi = &priv->frame_interval[priv->active_output_pad]; > > /* start upstream */ > @@ -761,6 +762,17 @@ static int csi_start(struct csi_priv *priv) > if (ret) > return ret; > > + /* Skip first few frames from a BT.656 source */ > + if (priv->upstream_ep.bus_type == V4L2_MBUS_BT656) { > + u32 delay_usec, bad_frames = 20; > + > + delay_usec = DIV_ROUND_UP_ULL((u64)USEC_PER_SEC * > + input_fi->numerator * bad_frames, > + input_fi->denominator); > + > + usleep_range(delay_usec, delay_usec + 1000); > + } > + > if (priv->dest == IPU_CSI_DEST_IDMAC) { > ret = csi_idmac_start(priv); > if (ret) > -- > 2.25.1 > Reviewed-By: Tim Harvey <tharvey@gateworks.com>
diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c index e3bfd635a89a..6a94fff49bf6 100644 --- a/drivers/staging/media/imx/imx-media-csi.c +++ b/drivers/staging/media/imx/imx-media-csi.c @@ -750,9 +750,10 @@ static int csi_setup(struct csi_priv *priv) static int csi_start(struct csi_priv *priv) { - struct v4l2_fract *output_fi; + struct v4l2_fract *input_fi, *output_fi; int ret; + input_fi = &priv->frame_interval[CSI_SINK_PAD]; output_fi = &priv->frame_interval[priv->active_output_pad]; /* start upstream */ @@ -761,6 +762,17 @@ static int csi_start(struct csi_priv *priv) if (ret) return ret; + /* Skip first few frames from a BT.656 source */ + if (priv->upstream_ep.bus_type == V4L2_MBUS_BT656) { + u32 delay_usec, bad_frames = 20; + + delay_usec = DIV_ROUND_UP_ULL((u64)USEC_PER_SEC * + input_fi->numerator * bad_frames, + input_fi->denominator); + + usleep_range(delay_usec, delay_usec + 1000); + } + if (priv->dest == IPU_CSI_DEST_IDMAC) { ret = csi_idmac_start(priv); if (ret)