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

From: Ricardo Ribalda Delgado
Date: Thu Sep 12 2024 - 09:40:27 EST


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
>
>