Hi Maxime,

Below comments about JPEG issue.

On 03/02/2018 03:34 PM, Maxime Ripard wrote:
> The clock rate, while hardcoded until now, is actually a function of the
> resolution, framerate and bytes per pixel. Now that we have an algorithm to
> adjust our clock rate, we can select it dynamically when we change the
> mode.
> 
> This changes a bit the clock rate being used, with the following effect:
> 
> +------+------+------+------+-----+-----------------+----------------+-----------+
> | Hact | Vact | Htot | Vtot | FPS | Hardcoded clock | Computed clock | 
> Deviation |
> +------+------+------+------+-----+-----------------+----------------+-----------+
> |  640 |  480 | 1896 | 1080 |  15 |        56000000 |       61430400 | 8.84 % 
>    |
> |  640 |  480 | 1896 | 1080 |  30 |       112000000 |      122860800 | 8.84 % 
>    |
> | 1024 |  768 | 1896 | 1080 |  15 |        56000000 |       61430400 | 8.84 % 
>    |
> | 1024 |  768 | 1896 | 1080 |  30 |       112000000 |      122860800 | 8.84 % 
>    |
> |  320 |  240 | 1896 |  984 |  15 |        56000000 |       55969920 | 0.05 % 
>    |
> |  320 |  240 | 1896 |  984 |  30 |       112000000 |      111939840 | 0.05 % 
>    |
> |  176 |  144 | 1896 |  984 |  15 |        56000000 |       55969920 | 0.05 % 
>    |
> |  176 |  144 | 1896 |  984 |  30 |       112000000 |      111939840 | 0.05 % 
>    |
> |  720 |  480 | 1896 |  984 |  15 |        56000000 |       55969920 | 0.05 % 
>    |
> |  720 |  480 | 1896 |  984 |  30 |       112000000 |      111939840 | 0.05 % 
>    |
> |  720 |  576 | 1896 |  984 |  15 |        56000000 |       55969920 | 0.05 % 
>    |
> |  720 |  576 | 1896 |  984 |  30 |       112000000 |      111939840 | 0.05 % 
>    |
> | 1280 |  720 | 1892 |  740 |  15 |        42000000 |       42002400 | 0.01 % 
>    |
> | 1280 |  720 | 1892 |  740 |  30 |        84000000 |       84004800 | 0.01 % 
>    |
> | 1920 | 1080 | 2500 | 1120 |  15 |        84000000 |       84000000 | 0.00 % 
>    |
> | 1920 | 1080 | 2500 | 1120 |  30 |       168000000 |      168000000 | 0.00 % 
>    |
> | 2592 | 1944 | 2844 | 1944 |  15 |        84000000 |      165862080 | 49.36 
> %   |
> +------+------+------+------+-----+-----------------+----------------+-----------+
> 
> Only the 640x480, 1024x768 and 2592x1944 modes are significantly affected
> by the new formula.
> 
> In this case, 640x480 and 1024x768 are actually fixed by this driver.
> Indeed, the sensor was sending data at, for example, 27.33fps instead of
> 30fps. This is -9%, which is roughly what we're seeing in the array.
> Testing these modes with the new clock setup actually fix that error, and
> data are now sent at around 30fps.
> 
> 2592x1944, on the other hand, is probably due to the fact that this mode
> can only be used using MIPI-CSI2, in a two lane mode. This would have to be
> tested though.
> 
> Signed-off-by: Maxime Ripard <maxime.rip...@bootlin.com>
> ---
>   drivers/media/i2c/ov5640.c | 41 +++++++++++++++++------------------------
>   1 file changed, 17 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> index 323cde27dd8b..bdf378d80e07 100644
> --- a/drivers/media/i2c/ov5640.c
> +++ b/drivers/media/i2c/ov5640.c
> @@ -126,6 +126,12 @@ static const struct ov5640_pixfmt ov5640_formats[] = {
>       { MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB, },
>   };
>   
> +/*
> + * FIXME: If we ever have something else, we'll obviously need to have
> + * something smarter.
> + */
> +#define OV5640_FORMATS_BPP   2
> +

We have the case with JPEG which is 1 byte.

>   /*
>    * FIXME: remove this when a subdev API becomes available
>    * to set the MIPI CSI-2 virtual channel.
> @@ -172,7 +178,6 @@ struct ov5640_mode_info {
>       u32 htot;
>       u32 vact;
>       u32 vtot;
> -     u32 clock;
>       const struct reg_value *reg_data;
>       u32 reg_data_size;
>   };
> @@ -696,7 +701,6 @@ static const struct reg_value 
> ov5640_setting_15fps_QSXGA_2592_1944[] = {
>   /* power-on sensor init reg table */
>   static const struct ov5640_mode_info ov5640_mode_init_data = {
>       0, SUBSAMPLING, 640, 1896, 480, 984,
> -     112000000,
>       ov5640_init_setting_30fps_VGA,
>       ARRAY_SIZE(ov5640_init_setting_30fps_VGA),
>   };
> @@ -706,91 +710,74 @@ 
> ov5640_mode_data[OV5640_NUM_FRAMERATES][OV5640_NUM_MODES] = {
>       {
>               {OV5640_MODE_QCIF_176_144, SUBSAMPLING,
>                176, 1896, 144, 984,
> -              56000000,
>                ov5640_setting_15fps_QCIF_176_144,
>                ARRAY_SIZE(ov5640_setting_15fps_QCIF_176_144)},
>               {OV5640_MODE_QVGA_320_240, SUBSAMPLING,
>                320, 1896, 240, 984,
> -              56000000,
>                ov5640_setting_15fps_QVGA_320_240,
>                ARRAY_SIZE(ov5640_setting_15fps_QVGA_320_240)},
>               {OV5640_MODE_VGA_640_480, SUBSAMPLING,
>                640, 1896, 480, 1080,
> -              56000000,
>                ov5640_setting_15fps_VGA_640_480,
>                ARRAY_SIZE(ov5640_setting_15fps_VGA_640_480)},
>               {OV5640_MODE_NTSC_720_480, SUBSAMPLING,
>                720, 1896, 480, 984,
> -              56000000,
>                ov5640_setting_15fps_NTSC_720_480,
>                ARRAY_SIZE(ov5640_setting_15fps_NTSC_720_480)},
>               {OV5640_MODE_PAL_720_576, SUBSAMPLING,
>                720, 1896, 576, 984,
> -              56000000,
>                ov5640_setting_15fps_PAL_720_576,
>                ARRAY_SIZE(ov5640_setting_15fps_PAL_720_576)},
>               {OV5640_MODE_XGA_1024_768, SUBSAMPLING,
>                1024, 1896, 768, 1080,
> -              56000000,
>                ov5640_setting_15fps_XGA_1024_768,
>                ARRAY_SIZE(ov5640_setting_15fps_XGA_1024_768)},
>               {OV5640_MODE_720P_1280_720, SUBSAMPLING,
>                1280, 1892, 720, 740,
> -              42000000,
>                ov5640_setting_15fps_720P_1280_720,
>                ARRAY_SIZE(ov5640_setting_15fps_720P_1280_720)},
>               {OV5640_MODE_1080P_1920_1080, SCALING,
>                1920, 2500, 1080, 1120,
> -              84000000,
>                ov5640_setting_15fps_1080P_1920_1080,
>                ARRAY_SIZE(ov5640_setting_15fps_1080P_1920_1080)},
>               {OV5640_MODE_QSXGA_2592_1944, SCALING,
>                2592, 2844, 1944, 1968,
> -              168000000,
>                ov5640_setting_15fps_QSXGA_2592_1944,
>                ARRAY_SIZE(ov5640_setting_15fps_QSXGA_2592_1944)},
>       }, {
>               {OV5640_MODE_QCIF_176_144, SUBSAMPLING,
>                176, 1896, 144, 984,
> -              112000000,
>                ov5640_setting_30fps_QCIF_176_144,
>                ARRAY_SIZE(ov5640_setting_30fps_QCIF_176_144)},
>               {OV5640_MODE_QVGA_320_240, SUBSAMPLING,
>                320, 1896, 240, 984,
> -              112000000,
>                ov5640_setting_30fps_QVGA_320_240,
>                ARRAY_SIZE(ov5640_setting_30fps_QVGA_320_240)},
>               {OV5640_MODE_VGA_640_480, SUBSAMPLING,
>                640, 1896, 480, 1080,
> -              112000000,
>                ov5640_setting_30fps_VGA_640_480,
>                ARRAY_SIZE(ov5640_setting_30fps_VGA_640_480)},
>               {OV5640_MODE_NTSC_720_480, SUBSAMPLING,
>                720, 1896, 480, 984,
> -              112000000,
>                ov5640_setting_30fps_NTSC_720_480,
>                ARRAY_SIZE(ov5640_setting_30fps_NTSC_720_480)},
>               {OV5640_MODE_PAL_720_576, SUBSAMPLING,
>                720, 1896, 576, 984,
> -              112000000,
>                ov5640_setting_30fps_PAL_720_576,
>                ARRAY_SIZE(ov5640_setting_30fps_PAL_720_576)},
>               {OV5640_MODE_XGA_1024_768, SUBSAMPLING,
>                1024, 1896, 768, 1080,
> -              112000000,
>                ov5640_setting_30fps_XGA_1024_768,
>                ARRAY_SIZE(ov5640_setting_30fps_XGA_1024_768)},
>               {OV5640_MODE_720P_1280_720, SUBSAMPLING,
>                1280, 1892, 720, 740,
> -              84000000,
>                ov5640_setting_30fps_720P_1280_720,
>                ARRAY_SIZE(ov5640_setting_30fps_720P_1280_720)},
>               {OV5640_MODE_1080P_1920_1080, SCALING,
>                1920, 2500, 1080, 1120,
> -              168000000,
>                ov5640_setting_30fps_1080P_1920_1080,
>                ARRAY_SIZE(ov5640_setting_30fps_1080P_1920_1080)},
> -             {OV5640_MODE_QSXGA_2592_1944, -1, 0, 0, 0, 0, 0, NULL, 0},
> +             {OV5640_MODE_QSXGA_2592_1944, -1, 0, 0, 0, 0, NULL, 0},
>       },
>   };
>   
> @@ -1854,6 +1841,7 @@ static int ov5640_set_mode(struct ov5640_dev *sensor,
>   {
>       const struct ov5640_mode_info *mode = sensor->current_mode;
>       enum ov5640_downsize_mode dn_mode, orig_dn_mode;
> +     unsigned long rate;
>       int ret;
>   
>       dn_mode = mode->dn_mode;
> @@ -1868,10 +1856,15 @@ static int ov5640_set_mode(struct ov5640_dev *sensor,
>       if (ret)
>               return ret;
>   
> -     if (sensor->ep.bus_type == V4L2_MBUS_CSI2)
> -             ret = ov5640_set_mipi_pclk(sensor, mode->clock);
> -     else
> -             ret = ov5640_set_dvp_pclk(sensor, mode->clock);
> +     rate = mode->vtot * mode->htot * OV5640_FORMATS_BPP;

Proposal:
        rate = mode->vtot * mode->htot *
                (sensor->fmt.code == MEDIA_BUS_FMT_JPEG_1X8 ? 1 : 2);


> +     rate *= ov5640_framerates[sensor->current_fr];
> +
> +     if (sensor->ep.bus_type == V4L2_MBUS_CSI2) {
> +             rate = rate / sensor->ep.bus.mipi_csi2.num_data_lanes;
> +             ret = ov5640_set_mipi_pclk(sensor, rate);
> +     } else {
> +             ret = ov5640_set_dvp_pclk(sensor, rate);
> +     }
>   
>       if (ret < 0)
>               return 0;
> 

BR
Hugues.

Reply via email to