RE: [PATCH] media: ov5640: fix vblank unchange issue when work at dvp mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Alain,

> -----Original Message-----
> From: Alain Volmat <alain.volmat@xxxxxxxxxxx>
> Sent: 2023年7月19日 19:46
> To: G.N. Zhou (OSS) <guoniu.zhou@xxxxxxxxxxx>
> Cc: linux-media@xxxxxxxxxxxxxxx; mchehab@xxxxxxxxxx;
> slongerbeam@xxxxxxxxx; sakari.ailus@xxxxxxxxxxxxxxx;
> jacopo.mondi@xxxxxxxxxxxxxxxx; laurent.pinchart@xxxxxxxxxxxxxxxx
> Subject: Re: [PATCH] media: ov5640: fix vblank unchange issue when work at
> dvp mode
> 
> Caution: This is an external email. Please take care when clicking links or opening
> attachments. When in doubt, report the message using the 'Report this email'
> button
> 
> 
> Hi Guoniu,
> 
> I came up to the same conclusion about wrong vblank when trying to make the
> OV5640 work in DVP mode so I agree about this modification.
> 
> However I think other ctrls also have the same issue, at least exposure.  I am
> wondering if we should keep the splitted code as currently and add back the
> missing ctrl in the DVP mode path or rework code to apply ctrl in both modes ?
> Basically link_freq / pixelrate handling differ between DVP and MIPI but it should
> be same handling for other ctrls I think.

As you know, the patch is for VBLANK control added in " bce93b827de6 ("media: ov5640: Add VBLANK control")" and I prefer and follow "one patch do one thing" rule.

> 
> Regards,
> Alain
> 
> On Wed, Jul 19, 2023 at 03:30:12PM +0800, guoniu.zhou@xxxxxxxxxxx wrote:
> > From: "Guoniu.zhou" <guoniu.zhou@xxxxxxx>
> >
> > The value of V4L2_CID_VBLANK control is initialized to default vblank
> > value of 640x480 when driver probe. When OV5640 work at DVP mode, the
> > control value won't update and lead to sensor can't output data if the
> > resolution remain the same as last time since incorrect total vertical
> > size. So update it when there is a new value applied.
> >
> > Fixes: bce93b827de6 ("media: ov5640: Add VBLANK control")
> > Signed-off-by: Guoniu.zhou <guoniu.zhou@xxxxxxx>
> > ---
> >  drivers/media/i2c/ov5640.c | 19 ++++++++++++++-----
> >  1 file changed, 14 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> > index 36b509714c8c..2f742f5f95fd 100644
> > --- a/drivers/media/i2c/ov5640.c
> > +++ b/drivers/media/i2c/ov5640.c
> > @@ -2854,12 +2854,22 @@ static int ov5640_try_fmt_internal(struct
> v4l2_subdev *sd,
> >       return 0;
> >  }
> >
> > +static void __v4l2_ctrl_vblank_update(struct ov5640_dev *sensor, u32
> > +vblank) {
> > +     const struct ov5640_mode_info *mode = sensor->current_mode;
> > +
> > +     __v4l2_ctrl_modify_range(sensor->ctrls.vblank,
> OV5640_MIN_VBLANK,
> > +                              OV5640_MAX_VTS - mode->height, 1,
> > + vblank);
> > +
> > +     __v4l2_ctrl_s_ctrl(sensor->ctrls.vblank, vblank); }
> > +
> >  static int ov5640_update_pixel_rate(struct ov5640_dev *sensor)  {
> >       const struct ov5640_mode_info *mode = sensor->current_mode;
> >       enum ov5640_pixel_rate_id pixel_rate_id = mode->pixel_rate;
> >       struct v4l2_mbus_framefmt *fmt = &sensor->fmt;
> > -     const struct ov5640_timings *timings;
> > +     const struct ov5640_timings *timings = ov5640_timings(sensor,
> > + mode);
> >       s32 exposure_val, exposure_max;
> >       unsigned int hblank;
> >       unsigned int i = 0;
> > @@ -2878,6 +2888,8 @@ static int ov5640_update_pixel_rate(struct
> ov5640_dev *sensor)
> >               __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
> >
> > ov5640_calc_pixel_rate(sensor));
> >
> > +             __v4l2_ctrl_vblank_update(sensor, timings->vblank_def);
> > +
> >               return 0;
> >       }
> >
> > @@ -2920,15 +2932,12 @@ static int ov5640_update_pixel_rate(struct
> ov5640_dev *sensor)
> >       __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate, pixel_rate);
> >       __v4l2_ctrl_s_ctrl(sensor->ctrls.link_freq, i);
> >
> > -     timings = ov5640_timings(sensor, mode);
> >       hblank = timings->htot - mode->width;
> >       __v4l2_ctrl_modify_range(sensor->ctrls.hblank,
> >                                hblank, hblank, 1, hblank);
> >
> >       vblank = timings->vblank_def;
> > -     __v4l2_ctrl_modify_range(sensor->ctrls.vblank,
> OV5640_MIN_VBLANK,
> > -                              OV5640_MAX_VTS - mode->height, 1,
> vblank);
> > -     __v4l2_ctrl_s_ctrl(sensor->ctrls.vblank, vblank);
> > +     __v4l2_ctrl_vblank_update(sensor, vblank);
> >
> >       exposure_max = timings->crop.height + vblank - 4;
> >       exposure_val = clamp_t(s32, sensor->ctrls.exposure->val,
> > --
> > 2.37.1
> >




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux