Re: [PATCH v2] media: ov5675: correct the maximum exposure value

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

 



Hi Bingbu,

On Fri, Aug 21, 2020 at 10:00 AM Bingbu Cao <bingbu.cao@xxxxxxxxx> wrote:
>
> The unit of exposure value is different from other OmniVision sensors,
> driver will divide by 2 before set register, the exposure range exposed
> by v4l2 ctrl to user should be same as others, so the calculation for
> the maximum exposure value in current driver need be fixed.
>
> Signed-off-by: Bingbu Cao <bingbu.cao@xxxxxxxxx>
> ---
>  drivers/media/i2c/ov5675.c | 15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
>

Thanks for the patch! Please see my comments inline.

> diff --git a/drivers/media/i2c/ov5675.c b/drivers/media/i2c/ov5675.c
> index 8537cc4ca108..9540ce8918f0 100644
> --- a/drivers/media/i2c/ov5675.c
> +++ b/drivers/media/i2c/ov5675.c
> @@ -666,8 +666,8 @@ static int ov5675_set_ctrl(struct v4l2_ctrl *ctrl)
>         /* Propagate change of current control to all related controls */
>         if (ctrl->id == V4L2_CID_VBLANK) {
>                 /* Update max exposure while meeting expected vblanking */
> -               exposure_max = (ov5675->cur_mode->height + ctrl->val -
> -                              OV5675_EXPOSURE_MAX_MARGIN) / 2;
> +               exposure_max = ov5675->cur_mode->height + ctrl->val -
> +                       OV5675_EXPOSURE_MAX_MARGIN;
>                 __v4l2_ctrl_modify_range(ov5675->exposure,
>                                          ov5675->exposure->minimum,
>                                          exposure_max, ov5675->exposure->step,
> @@ -689,7 +689,13 @@ static int ov5675_set_ctrl(struct v4l2_ctrl *ctrl)
>                 break;
>
>         case V4L2_CID_EXPOSURE:
> -               /* 3 least significant bits of expsoure are fractional part */
> +               /* 4 least significant bits of expsoure are fractional part

exposure

> +                * val = val << 4
> +                * for ov5675, the unit of exposure is differnt from other

different

> +                * OmniVision sensors, its exposure value is twice of the
> +                * register value, the exposure should be divided by 2 before
> +                * set register, e.g. val << 3.
> +                */
>                 ret = ov5675_write_reg(ov5675, OV5675_REG_EXPOSURE,
>                                        OV5675_REG_VALUE_24BIT, ctrl->val << 3);

How about turning this code into (ctrl->val << 4) / 2 ? It will be
compiled into exactly the same code, but will be obvious that we are
handling two different factors in the computation.

Another question: Since the V4L2_CID_EXPOSURE control is not specified
to be in a particular unit and hardware supports fractional exposures,
why not expose the exposure exactly as it is in the register?

Best regards,
Tomasz

>                 break;
> @@ -770,8 +776,7 @@ static int ov5675_init_controls(struct ov5675 *ov5675)
>         v4l2_ctrl_new_std(ctrl_hdlr, &ov5675_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
>                           OV5675_DGTL_GAIN_MIN, OV5675_DGTL_GAIN_MAX,
>                           OV5675_DGTL_GAIN_STEP, OV5675_DGTL_GAIN_DEFAULT);
> -       exposure_max = (ov5675->cur_mode->vts_def -
> -                       OV5675_EXPOSURE_MAX_MARGIN) / 2;
> +       exposure_max = (ov5675->cur_mode->vts_def - OV5675_EXPOSURE_MAX_MARGIN);
>         ov5675->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov5675_ctrl_ops,
>                                              V4L2_CID_EXPOSURE,
>                                              OV5675_EXPOSURE_MIN, exposure_max,
> --
> 2.7.4
>



[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