Re: [PATCH 13/13] media: i2c: imx214: Add test pattern control

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

 



On Mon, Sep 2, 2024 at 11:53 PM André Apitzsch via B4 Relay
<devnull+git.apitzsch.eu@xxxxxxxxxx> wrote:
>
> From: André Apitzsch <git@xxxxxxxxxxx>
>
> This adds V4L2_CID_TEST_PATTERN control support.
>
> Signed-off-by: André Apitzsch <git@xxxxxxxxxxx>
Acked-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx>
> ---
>  drivers/media/i2c/imx214.c | 77 ++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 75 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c
> index 6493a9b9ea88..6d67c7b307bd 100644
> --- a/drivers/media/i2c/imx214.c
> +++ b/drivers/media/i2c/imx214.c
> @@ -181,6 +181,23 @@
>
>  #define IMX214_REG_ATR_FAST_MOVE       CCI_REG8(0x9300)
>
> +/* Test Pattern Control */
> +#define IMX214_REG_TEST_PATTERN                CCI_REG16(0x0600)
> +#define IMX214_TEST_PATTERN_DISABLE    0
> +#define IMX214_TEST_PATTERN_SOLID_COLOR        1
> +#define IMX214_TEST_PATTERN_COLOR_BARS 2
> +#define IMX214_TEST_PATTERN_GREY_COLOR 3
> +#define IMX214_TEST_PATTERN_PN9                4
> +
> +/* Test pattern colour components */
> +#define IMX214_REG_TESTP_RED           CCI_REG16(0x0602)
> +#define IMX214_REG_TESTP_GREENR                CCI_REG16(0x0604)
> +#define IMX214_REG_TESTP_BLUE          CCI_REG16(0x0606)
> +#define IMX214_REG_TESTP_GREENB                CCI_REG16(0x0608)
> +#define IMX214_TESTP_COLOUR_MIN                0
> +#define IMX214_TESTP_COLOUR_MAX                0x03ff
> +#define IMX214_TESTP_COLOUR_STEP       1
> +
>  /* IMX214 native and active pixel array size */
>  #define IMX214_NATIVE_WIDTH            4224U
>  #define IMX214_NATIVE_HEIGHT           3136U
> @@ -213,6 +230,22 @@ static const u32 imx214_mbus_formats[] = {
>         MEDIA_BUS_FMT_SBGGR10_1X10,
>  };
>
> +static const char * const imx214_test_pattern_menu[] = {
> +       "Disabled",
> +       "Color Bars",
> +       "Solid Color",
> +       "Grey Color Bars",
> +       "PN9"
> +};
> +
> +static const int imx214_test_pattern_val[] = {
> +       IMX214_TEST_PATTERN_DISABLE,
> +       IMX214_TEST_PATTERN_COLOR_BARS,
> +       IMX214_TEST_PATTERN_SOLID_COLOR,
> +       IMX214_TEST_PATTERN_GREY_COLOR,
> +       IMX214_TEST_PATTERN_PN9,
> +};
> +
>  struct imx214 {
>         struct device *dev;
>         struct clk *xclk;
> @@ -819,6 +852,26 @@ static int imx214_set_ctrl(struct v4l2_ctrl *ctrl)
>                 cci_write(imx214->regmap, IMX214_REG_FRM_LENGTH_LINES,
>                           format->height + ctrl->val, &ret);
>                 break;
> +       case V4L2_CID_TEST_PATTERN:
> +               cci_write(imx214->regmap, IMX214_REG_TEST_PATTERN,
> +                         imx214_test_pattern_val[ctrl->val], &ret);
> +               break;
> +       case V4L2_CID_TEST_PATTERN_RED:
> +               cci_write(imx214->regmap, IMX214_REG_TESTP_RED,
> +                         ctrl->val, &ret);
> +               break;
> +       case V4L2_CID_TEST_PATTERN_GREENR:
> +               cci_write(imx214->regmap, IMX214_REG_TESTP_GREENR,
> +                         ctrl->val, &ret);
> +               break;
> +       case V4L2_CID_TEST_PATTERN_BLUE:
> +               cci_write(imx214->regmap, IMX214_REG_TESTP_BLUE,
> +                         ctrl->val, &ret);
> +               break;
> +       case V4L2_CID_TEST_PATTERN_GREENB:
> +               cci_write(imx214->regmap, IMX214_REG_TESTP_GREENB,
> +                         ctrl->val, &ret);
> +               break;
>         default:
>                 ret = -EINVAL;
>         }
> @@ -846,14 +899,14 @@ static int imx214_ctrls_init(struct imx214 *imx214)
>         struct v4l2_ctrl_handler *ctrl_hdlr;
>         int exposure_max, exposure_def;
>         int hblank;
> -       int ret;
> +       int i, ret;
>
>         ret = v4l2_fwnode_device_parse(imx214->dev, &props);
>         if (ret < 0)
>                 return ret;
>
>         ctrl_hdlr = &imx214->ctrls;
> -       ret = v4l2_ctrl_handler_init(&imx214->ctrls, 12);
> +       ret = v4l2_ctrl_handler_init(&imx214->ctrls, 13);
>         if (ret)
>                 return ret;
>
> @@ -908,6 +961,26 @@ static int imx214_ctrls_init(struct imx214 *imx214)
>         if (imx214->vflip)
>                 imx214->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
>
> +       v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx214_ctrl_ops,
> +                                    V4L2_CID_TEST_PATTERN,
> +                                    ARRAY_SIZE(imx214_test_pattern_menu) - 1,
> +                                    0, 0, imx214_test_pattern_menu);
> +       for (i = 0; i < 4; i++) {
> +               /*
> +                * The assumption is that
> +                * V4L2_CID_TEST_PATTERN_GREENR == V4L2_CID_TEST_PATTERN_RED + 1
> +                * V4L2_CID_TEST_PATTERN_BLUE   == V4L2_CID_TEST_PATTERN_RED + 2
> +                * V4L2_CID_TEST_PATTERN_GREENB == V4L2_CID_TEST_PATTERN_RED + 3
> +                */
> +               v4l2_ctrl_new_std(ctrl_hdlr, &imx214_ctrl_ops,
> +                                 V4L2_CID_TEST_PATTERN_RED + i,
> +                                 IMX214_TESTP_COLOUR_MIN,
> +                                 IMX214_TESTP_COLOUR_MAX,
> +                                 IMX214_TESTP_COLOUR_STEP,
> +                                 IMX214_TESTP_COLOUR_MAX);
> +               /* The "Solid color" pattern is white by default */
> +       }
> +
>         imx214->unit_size = v4l2_ctrl_new_std_compound(ctrl_hdlr,
>                                 NULL,
>                                 V4L2_CID_UNIT_CELL_SIZE,
>
> --
> 2.46.0
>
>





[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