Message ID | 20231023-imx214-v1-4-b33f1bbd1fcf@apitzsch.eu |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1571560vqx; Mon, 23 Oct 2023 14:50:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG29+3K9U3f+YMDEygUj03IQaHqSj434lJS8V5W8+dBMpx39NGox82h+83i+QxFzmJnTZsb X-Received: by 2002:a05:6a21:3289:b0:17a:4891:e33 with SMTP id yt9-20020a056a21328900b0017a48910e33mr1077566pzb.4.1698097821587; Mon, 23 Oct 2023 14:50:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698097821; cv=none; d=google.com; s=arc-20160816; b=lbRgKB/tvuEIiwiPOjyiwVqmPsug0Ugv03fqt/3wK4RTHI6Prb4Uy1Vw6Yd3AjlFaM YQkYdiF0dhVpgXD8sdCRzSBmcbYt5O0c5Lq+Kb9OsJuCVT+MkGMKehgfwEiOt4knP/NQ mpn4kQ9B7sR+nk/hziUiZaS079cbHsa17XcioXAStXyBwTVCKA9sOabnBSSVSNM+/REa agWmvdcCBL37YzCkR3ys9kl1+/E8bivNcWwwAgQWxsyCLVVpecyJqOCh26uMc43YOoea ersrrUCp/1wgSXlG4x3AsvA1OlYnfIn8yYuCTCARKUmxx3jFlC2rSrlZxsAikgjQ5jUZ GhAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from; bh=vgnquDODJh0Bumd4uVhwWrsoPUmOHur4QQeopR137RI=; fh=p+mi5Td8bOurAzEd8CdVTJhDRtapyUXUHLHoRH6vUVQ=; b=e8ZWgdgxtv26o31h9dBMoO1kzGlO4wBjb67TFPm5nIZdWh2TrfQcqmzC3rPvgbxULo NFC7qVJ+ANbdj/cA+brK4ZYE0buazt2DAiQrx6ZQWvl08QTdcG7rasxrxqdU1csht8Q1 TiZZ8Vs/Rc2fHUFeus95QkojztdukqEvnpYH4t7hyUcKPB6wbis9KmQSdPG4HDICWtyK VhsXwZ0wAu/c95w5jPXfEwt8Arw0m5in6oj0NufuVSInbrz6welfDkx0ZC5WpLjXr1Oh PqJ4REvrNvJQz3OjsEOnZQ4wTsuzOIyrSNnWEsFnWibXgGI3v9cqi6JzOPl4v1/WBSf2 kwFQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id d5-20020a170902c18500b001b3bd85f54bsi6889526pld.35.2023.10.23.14.50.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 14:50:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 92AE38055AFA; Mon, 23 Oct 2023 14:50:18 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233441AbjJWVtp (ORCPT <rfc822;aposhian.dev@gmail.com> + 27 others); Mon, 23 Oct 2023 17:49:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41714 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232377AbjJWVtj (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Mon, 23 Oct 2023 17:49:39 -0400 Received: from smtprelay01.ispgateway.de (smtprelay01.ispgateway.de [80.67.18.13]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 83276BD for <linux-kernel@vger.kernel.org>; Mon, 23 Oct 2023 14:49:32 -0700 (PDT) Received: from [92.206.139.21] (helo=note-book.lan) by smtprelay01.ispgateway.de with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96.1) (envelope-from <git@apitzsch.eu>) id 1qv2nh-0004Kz-1P; Mon, 23 Oct 2023 23:49:29 +0200 From: =?utf-8?q?Andr=C3=A9_Apitzsch?= <git@apitzsch.eu> Date: Mon, 23 Oct 2023 23:47:53 +0200 Subject: [PATCH 4/4] media: i2c: imx214: Add sensor's pixel matrix size MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Message-Id: <20231023-imx214-v1-4-b33f1bbd1fcf@apitzsch.eu> References: <20231023-imx214-v1-0-b33f1bbd1fcf@apitzsch.eu> In-Reply-To: <20231023-imx214-v1-0-b33f1bbd1fcf@apitzsch.eu> To: Ricardo Ribalda <ribalda@kernel.org>, Sakari Ailus <sakari.ailus@linux.intel.com>, Mauro Carvalho Chehab <mchehab@kernel.org> Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, =?utf-8?q?Andr=C3=A9_Apitzsch?= <git@apitzsch.eu> X-Mailer: b4 0.12.3 X-Df-Sender: YW5kcmVAYXBpdHpzY2guZXU= X-Spam-Status: No, score=1.2 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,PDS_OTHER_BAD_TLD,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Level: * X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.vger.email Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Mon, 23 Oct 2023 14:50:18 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780584621210660187 X-GMAIL-MSGID: 1780584621210660187 |
Series |
media: i2c: imx214: Extend with sensor size and firmware information
|
|
Commit Message
André Apitzsch
Oct. 23, 2023, 9:47 p.m. UTC
Set effictive and active sensor pixel sizes as shown in product
brief[1].
[1]: https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf
Signed-off-by: André Apitzsch <git@apitzsch.eu>
---
drivers/media/i2c/imx214.c | 39 ++++++++++++++++++++++++++++++++-------
1 file changed, 32 insertions(+), 7 deletions(-)
Comments
Hi Andre' On Mon, Oct 23, 2023 at 11:47:53PM +0200, André Apitzsch wrote: > Set effictive and active sensor pixel sizes as shown in product s/effictive/effective > brief[1]. > > [1]: https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf > > Signed-off-by: André Apitzsch <git@apitzsch.eu> > --- > drivers/media/i2c/imx214.c | 39 ++++++++++++++++++++++++++++++++------- > 1 file changed, 32 insertions(+), 7 deletions(-) > > diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c > index bef8dc36e2d0..a2d441cd8dcd 100644 > --- a/drivers/media/i2c/imx214.c > +++ b/drivers/media/i2c/imx214.c > @@ -36,6 +36,14 @@ > #define IMX214_EXPOSURE_STEP 1 > #define IMX214_EXPOSURE_DEFAULT 0x0c70 > > +/* IMX214 native and active pixel array size */ > +#define IMX214_NATIVE_WIDTH 4224U > +#define IMX214_NATIVE_HEIGHT 3136U > +#define IMX214_PIXEL_ARRAY_LEFT 8U > +#define IMX214_PIXEL_ARRAY_TOP 8U > +#define IMX214_PIXEL_ARRAY_WIDTH 4208U > +#define IMX214_PIXEL_ARRAY_HEIGHT 3120U > + I do get slightly different numbers from the datasheet version I have The sensor is said to have 4224x3208 total pixels of which 4208x3120 are active ones. The pixel array diagram shows 64 "OPB" (optically black ?) lines, followed by 8 dummy lines, followed by 3120 valid lines. There are 8 dummy columns at each side of the 4208 valid ones. Now, NATIVE which represents the full pixel array size seems to be 4224x3208 (other parts of the datasheet only report 3200 lines though) BOUNDS represents the readabale array area, which I presume corresponds to what is named as 'effective area' by the datasheet. It excludes the OPB lines at the top of the image and seems to be represented by (0, 64, 4224, 3160). CROP_DEFAULT represents the default crop rectangle which covers the active pixel area, so it excludes 8 more lines of dummy pixels and 8 dummy columns, which gives a rectangle (8, 72, 4208, 3120) Also note that the driver always reports a TGT_CROP rectangle with top/left points set to 0. If my understanding is correct, V4L2 selection targets are defined from the most external target (TGT_NATIVE in this case), and the driver should be corrected to initialize the crop rectangle with a top-left corner at (8, 72). Does this make sense ? Thanks j > static const char * const imx214_supply_name[] = { > "vdda", > "vddd", > @@ -634,14 +642,31 @@ static int imx214_get_selection(struct v4l2_subdev *sd, > { > struct imx214 *imx214 = to_imx214(sd); > > - if (sel->target != V4L2_SEL_TGT_CROP) > - return -EINVAL; > + switch (sel->target) { > + case V4L2_SEL_TGT_CROP: > + mutex_lock(&imx214->mutex); > + sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel->pad, > + sel->which); > + mutex_unlock(&imx214->mutex); > + return 0; > > - mutex_lock(&imx214->mutex); > - sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel->pad, > - sel->which); > - mutex_unlock(&imx214->mutex); > - return 0; > + case V4L2_SEL_TGT_NATIVE_SIZE: > + sel->r.top = 0; > + sel->r.left = 0; > + sel->r.width = IMX214_NATIVE_WIDTH; > + sel->r.height = IMX214_NATIVE_HEIGHT; > + return 0; > + > + case V4L2_SEL_TGT_CROP_DEFAULT: > + case V4L2_SEL_TGT_CROP_BOUNDS: > + sel->r.top = IMX214_PIXEL_ARRAY_TOP; > + sel->r.left = IMX214_PIXEL_ARRAY_LEFT; > + sel->r.width = IMX214_PIXEL_ARRAY_WIDTH; > + sel->r.height = IMX214_PIXEL_ARRAY_HEIGHT; > + return 0; > + } > + > + return -EINVAL; > } > > static int imx214_entity_init_cfg(struct v4l2_subdev *subdev, > > -- > 2.42.0 >
Hi Jacopo, Am Dienstag, dem 24.10.2023 um 09:52 +0200 schrieb Jacopo Mondi: > Hi Andre' > > On Mon, Oct 23, 2023 at 11:47:53PM +0200, André Apitzsch wrote: > > Set effictive and active sensor pixel sizes as shown in product > > s/effictive/effective > > > brief[1]. > > > > [1]: > > https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf > > > > Signed-off-by: André Apitzsch <git@apitzsch.eu> > > --- > > drivers/media/i2c/imx214.c | 39 ++++++++++++++++++++++++++++++++-- > > ----- > > 1 file changed, 32 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/media/i2c/imx214.c > > b/drivers/media/i2c/imx214.c > > index bef8dc36e2d0..a2d441cd8dcd 100644 > > --- a/drivers/media/i2c/imx214.c > > +++ b/drivers/media/i2c/imx214.c > > @@ -36,6 +36,14 @@ > > #define IMX214_EXPOSURE_STEP 1 > > #define IMX214_EXPOSURE_DEFAULT 0x0c70 > > > > +/* IMX214 native and active pixel array size */ > > +#define IMX214_NATIVE_WIDTH 4224U > > +#define IMX214_NATIVE_HEIGHT 3136U > > +#define IMX214_PIXEL_ARRAY_LEFT 8U > > +#define IMX214_PIXEL_ARRAY_TOP 8U > > +#define IMX214_PIXEL_ARRAY_WIDTH 4208U > > +#define IMX214_PIXEL_ARRAY_HEIGHT 3120U > > + > > I do get slightly different numbers from the datasheet version I have > > The sensor is said to have 4224x3208 total pixels of which 4208x3120 > are active ones. > > The pixel array diagram shows 64 "OPB" (optically black ?) lines, > followed by 8 dummy lines, followed by 3120 valid lines. There are 8 > dummy columns at each side of the 4208 valid ones. > > Now, NATIVE which represents the full pixel array size seems to be > 4224x3208 (other parts of the datasheet only report 3200 lines > though) > > BOUNDS represents the readabale array area, which I presume > corresponds to what is named as 'effective area' by the datasheet. It > excludes the OPB lines at the top of the image and seems to be > represented by (0, 64, 4224, 3160). > > CROP_DEFAULT represents the default crop rectangle which covers the > active pixel area, so it excludes 8 more lines of dummy pixels and 8 > dummy columns, which gives a rectangle (8, 72, 4208, 3120) > > Also note that the driver always reports a TGT_CROP rectangle with > top/left points set to 0. If my understanding is correct, V4L2 > selection targets are defined from the most external target > (TGT_NATIVE in this case), and the driver should be corrected to > initialize the crop rectangle with a top-left corner at (8, 72). > > Does this make sense ? As far as I understood, only the effective and active sizes of three sizes provided in the datasheet (total, effective and active) matter. By comparing the values used in imx219.c (and imx415.c) with the ones in the corresponding datasheets [1,2] I assume, that "effective" matches "NATIVE_SIZE", "active" matches "CROP_DEFAULT" and "total" is ignored. The commit message of 1ed36ecd1459b653cced8929bfb37dba94b64c5d ("media: i2c: imx219: Selection compliance fixes") seems to support me here: > The top/left crop coordinates of the TGT_CROP rectangle were set to > (0, 0) instead of (8, 8) which is the offset from the larger physical > pixel array rectangle. This (8, 8) is half the difference between number of effective and active pixels of imx219[1]. Together with the 8 dummy lines and 8 dummy columns you mentioned, I still think my values are right. But I've just started working with V4L2, so I might be wrong. Could you share the imx214 datasheet with me? Best regards, André [1] https://www.arducam.com/downloads/modules/RaspberryPi_camera/IMX219DS.PDF [2] https://www.sony-semicon.com/files/62/pdf/p-12_IMX415-AAQR_AAMR_Flyer.pdf > > Thanks > j > > > > static const char * const imx214_supply_name[] = { > > "vdda", > > "vddd", > > @@ -634,14 +642,31 @@ static int imx214_get_selection(struct > > v4l2_subdev *sd, > > { > > struct imx214 *imx214 = to_imx214(sd); > > > > - if (sel->target != V4L2_SEL_TGT_CROP) > > - return -EINVAL; > > + switch (sel->target) { > > + case V4L2_SEL_TGT_CROP: > > + mutex_lock(&imx214->mutex); > > + sel->r = *__imx214_get_pad_crop(imx214, sd_state, > > sel->pad, > > + sel->which); > > + mutex_unlock(&imx214->mutex); > > + return 0; > > > > - mutex_lock(&imx214->mutex); > > - sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel- > > >pad, > > - sel->which); > > - mutex_unlock(&imx214->mutex); > > - return 0; > > + case V4L2_SEL_TGT_NATIVE_SIZE: > > + sel->r.top = 0; > > + sel->r.left = 0; > > + sel->r.width = IMX214_NATIVE_WIDTH; > > + sel->r.height = IMX214_NATIVE_HEIGHT; > > + return 0; > > + > > + case V4L2_SEL_TGT_CROP_DEFAULT: > > + case V4L2_SEL_TGT_CROP_BOUNDS: > > + sel->r.top = IMX214_PIXEL_ARRAY_TOP; > > + sel->r.left = IMX214_PIXEL_ARRAY_LEFT; > > + sel->r.width = IMX214_PIXEL_ARRAY_WIDTH; > > + sel->r.height = IMX214_PIXEL_ARRAY_HEIGHT; > > + return 0; > > + } > > + > > + return -EINVAL; > > } > > > > static int imx214_entity_init_cfg(struct v4l2_subdev *subdev, > > > > -- > > 2.42.0 > >
Hi Andre' On Wed, Oct 25, 2023 at 11:26:00PM +0200, André Apitzsch wrote: > Hi Jacopo, > > Am Dienstag, dem 24.10.2023 um 09:52 +0200 schrieb Jacopo Mondi: > > Hi Andre' > > > > On Mon, Oct 23, 2023 at 11:47:53PM +0200, André Apitzsch wrote: > > > Set effictive and active sensor pixel sizes as shown in product > > > > s/effictive/effective > > > > > brief[1]. > > > > > > [1]: > > > https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf > > > > > > Signed-off-by: André Apitzsch <git@apitzsch.eu> > > > --- > > > drivers/media/i2c/imx214.c | 39 ++++++++++++++++++++++++++++++++-- > > > ----- > > > 1 file changed, 32 insertions(+), 7 deletions(-) > > > > > > diff --git a/drivers/media/i2c/imx214.c > > > b/drivers/media/i2c/imx214.c > > > index bef8dc36e2d0..a2d441cd8dcd 100644 > > > --- a/drivers/media/i2c/imx214.c > > > +++ b/drivers/media/i2c/imx214.c > > > @@ -36,6 +36,14 @@ > > > #define IMX214_EXPOSURE_STEP 1 > > > #define IMX214_EXPOSURE_DEFAULT 0x0c70 > > > > > > +/* IMX214 native and active pixel array size */ > > > +#define IMX214_NATIVE_WIDTH 4224U > > > +#define IMX214_NATIVE_HEIGHT 3136U > > > +#define IMX214_PIXEL_ARRAY_LEFT 8U > > > +#define IMX214_PIXEL_ARRAY_TOP 8U > > > +#define IMX214_PIXEL_ARRAY_WIDTH 4208U > > > +#define IMX214_PIXEL_ARRAY_HEIGHT 3120U > > > + > > > > I do get slightly different numbers from the datasheet version I have > > > > The sensor is said to have 4224x3208 total pixels of which 4208x3120 > > are active ones. > > > > The pixel array diagram shows 64 "OPB" (optically black ?) lines, > > followed by 8 dummy lines, followed by 3120 valid lines. There are 8 > > dummy columns at each side of the 4208 valid ones. > > > > Now, NATIVE which represents the full pixel array size seems to be > > 4224x3208 (other parts of the datasheet only report 3200 lines > > though) > > > > BOUNDS represents the readabale array area, which I presume > > corresponds to what is named as 'effective area' by the datasheet. It > > excludes the OPB lines at the top of the image and seems to be > > represented by (0, 64, 4224, 3160). > > > > CROP_DEFAULT represents the default crop rectangle which covers the > > active pixel area, so it excludes 8 more lines of dummy pixels and 8 > > dummy columns, which gives a rectangle (8, 72, 4208, 3120) > > > > Also note that the driver always reports a TGT_CROP rectangle with > > top/left points set to 0. If my understanding is correct, V4L2 > > selection targets are defined from the most external target > > (TGT_NATIVE in this case), and the driver should be corrected to > > initialize the crop rectangle with a top-left corner at (8, 72). > > > > Does this make sense ? > > As far as I understood, only the effective and active sizes of three > sizes provided in the datasheet (total, effective and active) matter. > By comparing the values used in imx219.c (and imx415.c) with the ones > in the corresponding datasheets [1,2] I assume, that "effective" > matches "NATIVE_SIZE", "active" matches "CROP_DEFAULT" and "total" is > ignored. imx219 driver indeed does not consider the OPB areas in the definition of the rectangles... Also looking at the X/Y_ADDR_START value assigned in the register tables for full resolution mode (3280x2462) they have value of 0, indeed meaning the active area is the only readable one. Then yes, you're right, for imx219 NATIVE = effective CROP_DEFAULT = BOUND = active > The commit message of 1ed36ecd1459b653cced8929bfb37dba94b64c5d ("media: > i2c: imx219: Selection compliance fixes") seems to support me here: > > > The top/left crop coordinates of the TGT_CROP rectangle were set to > > (0, 0) instead of (8, 8) which is the offset from the larger physical > > pixel array rectangle. > > This (8, 8) is half the difference between number of effective and > active pixels of imx219[1]. > > Together with the 8 dummy lines and 8 dummy columns you mentioned, I > still think my values are right. But I've just started working with > V4L2, so I might be wrong. To actually verify if the 'effective area' is readable or not, we should know what register controls the X/Y_ADDR_START value, and that's an information I don't have in my version of the datasheet. It's however plausible that it behaves the same as imx219, as the driver's register sequences seems to program the crop sizes in register 0x034c and 0x034e and there's not programmed top-left corner there. Ok then, let's be consistent and do the same as imx219 as you're doing here. Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > Could you share the imx214 datasheet with me? > > Best regards, > André > > [1] https://www.arducam.com/downloads/modules/RaspberryPi_camera/IMX219DS.PDF > [2] https://www.sony-semicon.com/files/62/pdf/p-12_IMX415-AAQR_AAMR_Flyer.pdf > > > > Thanks > > j > > > > > > > static const char * const imx214_supply_name[] = { > > > "vdda", > > > "vddd", > > > @@ -634,14 +642,31 @@ static int imx214_get_selection(struct > > > v4l2_subdev *sd, > > > { > > > struct imx214 *imx214 = to_imx214(sd); > > > > > > - if (sel->target != V4L2_SEL_TGT_CROP) > > > - return -EINVAL; > > > + switch (sel->target) { > > > + case V4L2_SEL_TGT_CROP: > > > + mutex_lock(&imx214->mutex); > > > + sel->r = *__imx214_get_pad_crop(imx214, sd_state, > > > sel->pad, > > > + sel->which); > > > + mutex_unlock(&imx214->mutex); > > > + return 0; > > > > > > - mutex_lock(&imx214->mutex); > > > - sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel- > > > >pad, > > > - sel->which); > > > - mutex_unlock(&imx214->mutex); > > > - return 0; > > > + case V4L2_SEL_TGT_NATIVE_SIZE: > > > + sel->r.top = 0; > > > + sel->r.left = 0; > > > + sel->r.width = IMX214_NATIVE_WIDTH; > > > + sel->r.height = IMX214_NATIVE_HEIGHT; > > > + return 0; > > > + > > > + case V4L2_SEL_TGT_CROP_DEFAULT: > > > + case V4L2_SEL_TGT_CROP_BOUNDS: > > > + sel->r.top = IMX214_PIXEL_ARRAY_TOP; > > > + sel->r.left = IMX214_PIXEL_ARRAY_LEFT; > > > + sel->r.width = IMX214_PIXEL_ARRAY_WIDTH; > > > + sel->r.height = IMX214_PIXEL_ARRAY_HEIGHT; > > > + return 0; > > > + } > > > + > > > + return -EINVAL; > > > } > > > > > > static int imx214_entity_init_cfg(struct v4l2_subdev *subdev, > > > > > > -- > > > 2.42.0 > > > >
Hi Jacopo On Fri, 27 Oct 2023 at 09:57, Jacopo Mondi <jacopo.mondi@ideasonboard.com> wrote: > > Hi Andre' > > On Wed, Oct 25, 2023 at 11:26:00PM +0200, André Apitzsch wrote: > > Hi Jacopo, > > > > Am Dienstag, dem 24.10.2023 um 09:52 +0200 schrieb Jacopo Mondi: > > > Hi Andre' > > > > > > On Mon, Oct 23, 2023 at 11:47:53PM +0200, André Apitzsch wrote: > > > > Set effictive and active sensor pixel sizes as shown in product > > > > > > s/effictive/effective > > > > > > > brief[1]. > > > > > > > > [1]: > > > > https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf > > > > > > > > Signed-off-by: André Apitzsch <git@apitzsch.eu> > > > > --- > > > > drivers/media/i2c/imx214.c | 39 ++++++++++++++++++++++++++++++++-- > > > > ----- > > > > 1 file changed, 32 insertions(+), 7 deletions(-) > > > > > > > > diff --git a/drivers/media/i2c/imx214.c > > > > b/drivers/media/i2c/imx214.c > > > > index bef8dc36e2d0..a2d441cd8dcd 100644 > > > > --- a/drivers/media/i2c/imx214.c > > > > +++ b/drivers/media/i2c/imx214.c > > > > @@ -36,6 +36,14 @@ > > > > #define IMX214_EXPOSURE_STEP 1 > > > > #define IMX214_EXPOSURE_DEFAULT 0x0c70 > > > > > > > > +/* IMX214 native and active pixel array size */ > > > > +#define IMX214_NATIVE_WIDTH 4224U > > > > +#define IMX214_NATIVE_HEIGHT 3136U > > > > +#define IMX214_PIXEL_ARRAY_LEFT 8U > > > > +#define IMX214_PIXEL_ARRAY_TOP 8U > > > > +#define IMX214_PIXEL_ARRAY_WIDTH 4208U > > > > +#define IMX214_PIXEL_ARRAY_HEIGHT 3120U > > > > + > > > > > > I do get slightly different numbers from the datasheet version I have > > > > > > The sensor is said to have 4224x3208 total pixels of which 4208x3120 > > > are active ones. > > > > > > The pixel array diagram shows 64 "OPB" (optically black ?) lines, > > > followed by 8 dummy lines, followed by 3120 valid lines. There are 8 > > > dummy columns at each side of the 4208 valid ones. > > > > > > Now, NATIVE which represents the full pixel array size seems to be > > > 4224x3208 (other parts of the datasheet only report 3200 lines > > > though) > > > > > > BOUNDS represents the readabale array area, which I presume > > > corresponds to what is named as 'effective area' by the datasheet. It > > > excludes the OPB lines at the top of the image and seems to be > > > represented by (0, 64, 4224, 3160). > > > > > > CROP_DEFAULT represents the default crop rectangle which covers the > > > active pixel area, so it excludes 8 more lines of dummy pixels and 8 > > > dummy columns, which gives a rectangle (8, 72, 4208, 3120) > > > > > > Also note that the driver always reports a TGT_CROP rectangle with > > > top/left points set to 0. If my understanding is correct, V4L2 > > > selection targets are defined from the most external target > > > (TGT_NATIVE in this case), and the driver should be corrected to > > > initialize the crop rectangle with a top-left corner at (8, 72). > > > > > > Does this make sense ? > > > > As far as I understood, only the effective and active sizes of three > > sizes provided in the datasheet (total, effective and active) matter. > > By comparing the values used in imx219.c (and imx415.c) with the ones > > in the corresponding datasheets [1,2] I assume, that "effective" > > matches "NATIVE_SIZE", "active" matches "CROP_DEFAULT" and "total" is > > ignored. > > imx219 driver indeed does not consider the OPB areas in the definition > of the rectangles... > > Also looking at the X/Y_ADDR_START value assigned in the register tables > for full resolution mode (3280x2462) they have value of 0, indeed > meaning the active area is the only readable one. > > Then yes, you're right, for imx219 > NATIVE = effective > CROP_DEFAULT = BOUND = active > > > The commit message of 1ed36ecd1459b653cced8929bfb37dba94b64c5d ("media: > > i2c: imx219: Selection compliance fixes") seems to support me here: > > > > > > The top/left crop coordinates of the TGT_CROP rectangle were set to > > > (0, 0) instead of (8, 8) which is the offset from the larger physical > > > pixel array rectangle. > > > > This (8, 8) is half the difference between number of effective and > > active pixels of imx219[1]. > > > > Together with the 8 dummy lines and 8 dummy columns you mentioned, I > > still think my values are right. But I've just started working with > > V4L2, so I might be wrong. > > To actually verify if the 'effective area' is readable or not, we > should know what register controls the X/Y_ADDR_START value, and > that's an information I don't have in my version of the datasheet. I happen to have an IMX214 datasheet. X_ADDR_START is 0x0344/5 (set in multiples of 2) Y_ADDR_START is 0x0346/7 (set in multiples of 4) X_ADDR_END is 0x0348/9 (set in multiples of 2) Y_ADDR_END is 0x034a/b (set in multiples of 4) X_OUTPUT_SIZE 0x034c/d Y_OUTPUT_SIZE 0x034e/f X direction are 13bit values, Y direction are 12 bit. [12:8] or [11:8] in the low bits of the first register, [7:0] in the second register. Dave > It's however plausible that it behaves the same as imx219, as the > driver's register sequences seems to program the crop sizes in > register 0x034c and 0x034e and there's not programmed top-left corner > there. > > Ok then, let's be consistent and do the same as imx219 as you're doing > here. > > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > > > > Could you share the imx214 datasheet with me? > > > > Best regards, > > André > > > > [1] https://www.arducam.com/downloads/modules/RaspberryPi_camera/IMX219DS.PDF > > [2] https://www.sony-semicon.com/files/62/pdf/p-12_IMX415-AAQR_AAMR_Flyer.pdf > > > > > > Thanks > > > j > > > > > > > > > > static const char * const imx214_supply_name[] = { > > > > "vdda", > > > > "vddd", > > > > @@ -634,14 +642,31 @@ static int imx214_get_selection(struct > > > > v4l2_subdev *sd, > > > > { > > > > struct imx214 *imx214 = to_imx214(sd); > > > > > > > > - if (sel->target != V4L2_SEL_TGT_CROP) > > > > - return -EINVAL; > > > > + switch (sel->target) { > > > > + case V4L2_SEL_TGT_CROP: > > > > + mutex_lock(&imx214->mutex); > > > > + sel->r = *__imx214_get_pad_crop(imx214, sd_state, > > > > sel->pad, > > > > + sel->which); > > > > + mutex_unlock(&imx214->mutex); > > > > + return 0; > > > > > > > > - mutex_lock(&imx214->mutex); > > > > - sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel- > > > > >pad, > > > > - sel->which); > > > > - mutex_unlock(&imx214->mutex); > > > > - return 0; > > > > + case V4L2_SEL_TGT_NATIVE_SIZE: > > > > + sel->r.top = 0; > > > > + sel->r.left = 0; > > > > + sel->r.width = IMX214_NATIVE_WIDTH; > > > > + sel->r.height = IMX214_NATIVE_HEIGHT; > > > > + return 0; > > > > + > > > > + case V4L2_SEL_TGT_CROP_DEFAULT: > > > > + case V4L2_SEL_TGT_CROP_BOUNDS: > > > > + sel->r.top = IMX214_PIXEL_ARRAY_TOP; > > > > + sel->r.left = IMX214_PIXEL_ARRAY_LEFT; > > > > + sel->r.width = IMX214_PIXEL_ARRAY_WIDTH; > > > > + sel->r.height = IMX214_PIXEL_ARRAY_HEIGHT; > > > > + return 0; > > > > + } > > > > + > > > > + return -EINVAL; > > > > } > > > > > > > > static int imx214_entity_init_cfg(struct v4l2_subdev *subdev, > > > > > > > > -- > > > > 2.42.0 > > > > > >
Hi Dave On Fri, Oct 27, 2023 at 11:29:11AM +0100, Dave Stevenson wrote: > Hi Jacopo > > On Fri, 27 Oct 2023 at 09:57, Jacopo Mondi > <jacopo.mondi@ideasonboard.com> wrote: > > > > Hi Andre' > > > > On Wed, Oct 25, 2023 at 11:26:00PM +0200, André Apitzsch wrote: > > > Hi Jacopo, > > > > > > Am Dienstag, dem 24.10.2023 um 09:52 +0200 schrieb Jacopo Mondi: > > > > Hi Andre' > > > > > > > > On Mon, Oct 23, 2023 at 11:47:53PM +0200, André Apitzsch wrote: > > > > > Set effictive and active sensor pixel sizes as shown in product > > > > > > > > s/effictive/effective > > > > > > > > > brief[1]. > > > > > > > > > > [1]: > > > > > https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf > > > > > > > > > > Signed-off-by: André Apitzsch <git@apitzsch.eu> > > > > > --- > > > > > drivers/media/i2c/imx214.c | 39 ++++++++++++++++++++++++++++++++-- > > > > > ----- > > > > > 1 file changed, 32 insertions(+), 7 deletions(-) > > > > > > > > > > diff --git a/drivers/media/i2c/imx214.c > > > > > b/drivers/media/i2c/imx214.c > > > > > index bef8dc36e2d0..a2d441cd8dcd 100644 > > > > > --- a/drivers/media/i2c/imx214.c > > > > > +++ b/drivers/media/i2c/imx214.c > > > > > @@ -36,6 +36,14 @@ > > > > > #define IMX214_EXPOSURE_STEP 1 > > > > > #define IMX214_EXPOSURE_DEFAULT 0x0c70 > > > > > > > > > > +/* IMX214 native and active pixel array size */ > > > > > +#define IMX214_NATIVE_WIDTH 4224U > > > > > +#define IMX214_NATIVE_HEIGHT 3136U > > > > > +#define IMX214_PIXEL_ARRAY_LEFT 8U > > > > > +#define IMX214_PIXEL_ARRAY_TOP 8U > > > > > +#define IMX214_PIXEL_ARRAY_WIDTH 4208U > > > > > +#define IMX214_PIXEL_ARRAY_HEIGHT 3120U > > > > > + > > > > > > > > I do get slightly different numbers from the datasheet version I have > > > > > > > > The sensor is said to have 4224x3208 total pixels of which 4208x3120 > > > > are active ones. > > > > > > > > The pixel array diagram shows 64 "OPB" (optically black ?) lines, > > > > followed by 8 dummy lines, followed by 3120 valid lines. There are 8 > > > > dummy columns at each side of the 4208 valid ones. > > > > > > > > Now, NATIVE which represents the full pixel array size seems to be > > > > 4224x3208 (other parts of the datasheet only report 3200 lines > > > > though) > > > > > > > > BOUNDS represents the readabale array area, which I presume > > > > corresponds to what is named as 'effective area' by the datasheet. It > > > > excludes the OPB lines at the top of the image and seems to be > > > > represented by (0, 64, 4224, 3160). > > > > > > > > CROP_DEFAULT represents the default crop rectangle which covers the > > > > active pixel area, so it excludes 8 more lines of dummy pixels and 8 > > > > dummy columns, which gives a rectangle (8, 72, 4208, 3120) > > > > > > > > Also note that the driver always reports a TGT_CROP rectangle with > > > > top/left points set to 0. If my understanding is correct, V4L2 > > > > selection targets are defined from the most external target > > > > (TGT_NATIVE in this case), and the driver should be corrected to > > > > initialize the crop rectangle with a top-left corner at (8, 72). > > > > > > > > Does this make sense ? > > > > > > As far as I understood, only the effective and active sizes of three > > > sizes provided in the datasheet (total, effective and active) matter. > > > By comparing the values used in imx219.c (and imx415.c) with the ones > > > in the corresponding datasheets [1,2] I assume, that "effective" > > > matches "NATIVE_SIZE", "active" matches "CROP_DEFAULT" and "total" is > > > ignored. > > > > imx219 driver indeed does not consider the OPB areas in the definition > > of the rectangles... > > I know it sounds ridiculous as I've been the one adding selection support to imx219, but I presume we discussed it somewhen in the past: do you happen to remember why we left the OPB area out from the native sizes ? (Does OPB stand for "Optically black" ? ) > > Also looking at the X/Y_ADDR_START value assigned in the register tables > > for full resolution mode (3280x2462) they have value of 0, indeed > > meaning the active area is the only readable one. > > > > Then yes, you're right, for imx219 > > NATIVE = effective > > CROP_DEFAULT = BOUND = active > > I presume you can confirm this, right ? > > > The commit message of 1ed36ecd1459b653cced8929bfb37dba94b64c5d ("media: > > > i2c: imx219: Selection compliance fixes") seems to support me here: > > > > > > > > > The top/left crop coordinates of the TGT_CROP rectangle were set to > > > > (0, 0) instead of (8, 8) which is the offset from the larger physical > > > > pixel array rectangle. > > > > > > This (8, 8) is half the difference between number of effective and > > > active pixels of imx219[1]. > > > > > > Together with the 8 dummy lines and 8 dummy columns you mentioned, I > > > still think my values are right. But I've just started working with > > > V4L2, so I might be wrong. > > > > To actually verify if the 'effective area' is readable or not, we > > should know what register controls the X/Y_ADDR_START value, and > > that's an information I don't have in my version of the datasheet. > > I happen to have an IMX214 datasheet. > X_ADDR_START is 0x0344/5 (set in multiples of 2) > Y_ADDR_START is 0x0346/7 (set in multiples of 4) > X_ADDR_END is 0x0348/9 (set in multiples of 2) > Y_ADDR_END is 0x034a/b (set in multiples of 4) > X_OUTPUT_SIZE 0x034c/d > Y_OUTPUT_SIZE 0x034e/f > > X direction are 13bit values, Y direction are 12 bit. > [12:8] or [11:8] in the low bits of the first register, [7:0] in the > second register. AH thanks! Unfortunately the largest imx214 mode is cropped from full pixel array it seems, so not that helpful :( > > Dave > > > It's however plausible that it behaves the same as imx219, as the > > driver's register sequences seems to program the crop sizes in > > register 0x034c and 0x034e and there's not programmed top-left corner > > there. > > > > Ok then, let's be consistent and do the same as imx219 as you're doing > > here. > > > > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > > > > > > > Could you share the imx214 datasheet with me? > > > > > > Best regards, > > > André > > > > > > [1] https://www.arducam.com/downloads/modules/RaspberryPi_camera/IMX219DS.PDF > > > [2] https://www.sony-semicon.com/files/62/pdf/p-12_IMX415-AAQR_AAMR_Flyer.pdf > > > > > > > > Thanks > > > > j > > > > > > > > > > > > > static const char * const imx214_supply_name[] = { > > > > > "vdda", > > > > > "vddd", > > > > > @@ -634,14 +642,31 @@ static int imx214_get_selection(struct > > > > > v4l2_subdev *sd, > > > > > { > > > > > struct imx214 *imx214 = to_imx214(sd); > > > > > > > > > > - if (sel->target != V4L2_SEL_TGT_CROP) > > > > > - return -EINVAL; > > > > > + switch (sel->target) { > > > > > + case V4L2_SEL_TGT_CROP: > > > > > + mutex_lock(&imx214->mutex); > > > > > + sel->r = *__imx214_get_pad_crop(imx214, sd_state, > > > > > sel->pad, > > > > > + sel->which); > > > > > + mutex_unlock(&imx214->mutex); > > > > > + return 0; > > > > > > > > > > - mutex_lock(&imx214->mutex); > > > > > - sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel- > > > > > >pad, > > > > > - sel->which); > > > > > - mutex_unlock(&imx214->mutex); > > > > > - return 0; > > > > > + case V4L2_SEL_TGT_NATIVE_SIZE: > > > > > + sel->r.top = 0; > > > > > + sel->r.left = 0; > > > > > + sel->r.width = IMX214_NATIVE_WIDTH; > > > > > + sel->r.height = IMX214_NATIVE_HEIGHT; > > > > > + return 0; > > > > > + > > > > > + case V4L2_SEL_TGT_CROP_DEFAULT: > > > > > + case V4L2_SEL_TGT_CROP_BOUNDS: > > > > > + sel->r.top = IMX214_PIXEL_ARRAY_TOP; > > > > > + sel->r.left = IMX214_PIXEL_ARRAY_LEFT; > > > > > + sel->r.width = IMX214_PIXEL_ARRAY_WIDTH; > > > > > + sel->r.height = IMX214_PIXEL_ARRAY_HEIGHT; > > > > > + return 0; > > > > > + } > > > > > + > > > > > + return -EINVAL; > > > > > } > > > > > > > > > > static int imx214_entity_init_cfg(struct v4l2_subdev *subdev, > > > > > > > > > > -- > > > > > 2.42.0 > > > > > > > >
Hi Jacopo On Fri, 27 Oct 2023 at 12:12, Jacopo Mondi <jacopo.mondi@ideasonboard.com> wrote: > > Hi Dave > > On Fri, Oct 27, 2023 at 11:29:11AM +0100, Dave Stevenson wrote: > > Hi Jacopo > > > > On Fri, 27 Oct 2023 at 09:57, Jacopo Mondi > > <jacopo.mondi@ideasonboard.com> wrote: > > > > > > Hi Andre' > > > > > > On Wed, Oct 25, 2023 at 11:26:00PM +0200, André Apitzsch wrote: > > > > Hi Jacopo, > > > > > > > > Am Dienstag, dem 24.10.2023 um 09:52 +0200 schrieb Jacopo Mondi: > > > > > Hi Andre' > > > > > > > > > > On Mon, Oct 23, 2023 at 11:47:53PM +0200, André Apitzsch wrote: > > > > > > Set effictive and active sensor pixel sizes as shown in product > > > > > > > > > > s/effictive/effective > > > > > > > > > > > brief[1]. > > > > > > > > > > > > [1]: > > > > > > https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf > > > > > > > > > > > > Signed-off-by: André Apitzsch <git@apitzsch.eu> > > > > > > --- > > > > > > drivers/media/i2c/imx214.c | 39 ++++++++++++++++++++++++++++++++-- > > > > > > ----- > > > > > > 1 file changed, 32 insertions(+), 7 deletions(-) > > > > > > > > > > > > diff --git a/drivers/media/i2c/imx214.c > > > > > > b/drivers/media/i2c/imx214.c > > > > > > index bef8dc36e2d0..a2d441cd8dcd 100644 > > > > > > --- a/drivers/media/i2c/imx214.c > > > > > > +++ b/drivers/media/i2c/imx214.c > > > > > > @@ -36,6 +36,14 @@ > > > > > > #define IMX214_EXPOSURE_STEP 1 > > > > > > #define IMX214_EXPOSURE_DEFAULT 0x0c70 > > > > > > > > > > > > +/* IMX214 native and active pixel array size */ > > > > > > +#define IMX214_NATIVE_WIDTH 4224U > > > > > > +#define IMX214_NATIVE_HEIGHT 3136U > > > > > > +#define IMX214_PIXEL_ARRAY_LEFT 8U > > > > > > +#define IMX214_PIXEL_ARRAY_TOP 8U > > > > > > +#define IMX214_PIXEL_ARRAY_WIDTH 4208U > > > > > > +#define IMX214_PIXEL_ARRAY_HEIGHT 3120U > > > > > > + > > > > > > > > > > I do get slightly different numbers from the datasheet version I have > > > > > > > > > > The sensor is said to have 4224x3208 total pixels of which 4208x3120 > > > > > are active ones. > > > > > > > > > > The pixel array diagram shows 64 "OPB" (optically black ?) lines, > > > > > followed by 8 dummy lines, followed by 3120 valid lines. There are 8 > > > > > dummy columns at each side of the 4208 valid ones. > > > > > > > > > > Now, NATIVE which represents the full pixel array size seems to be > > > > > 4224x3208 (other parts of the datasheet only report 3200 lines > > > > > though) > > > > > > > > > > BOUNDS represents the readabale array area, which I presume > > > > > corresponds to what is named as 'effective area' by the datasheet. It > > > > > excludes the OPB lines at the top of the image and seems to be > > > > > represented by (0, 64, 4224, 3160). > > > > > > > > > > CROP_DEFAULT represents the default crop rectangle which covers the > > > > > active pixel area, so it excludes 8 more lines of dummy pixels and 8 > > > > > dummy columns, which gives a rectangle (8, 72, 4208, 3120) > > > > > > > > > > Also note that the driver always reports a TGT_CROP rectangle with > > > > > top/left points set to 0. If my understanding is correct, V4L2 > > > > > selection targets are defined from the most external target > > > > > (TGT_NATIVE in this case), and the driver should be corrected to > > > > > initialize the crop rectangle with a top-left corner at (8, 72). > > > > > > > > > > Does this make sense ? > > > > > > > > As far as I understood, only the effective and active sizes of three > > > > sizes provided in the datasheet (total, effective and active) matter. > > > > By comparing the values used in imx219.c (and imx415.c) with the ones > > > > in the corresponding datasheets [1,2] I assume, that "effective" > > > > matches "NATIVE_SIZE", "active" matches "CROP_DEFAULT" and "total" is > > > > ignored. > > > > > > imx219 driver indeed does not consider the OPB areas in the definition > > > of the rectangles... > > > > > I know it sounds ridiculous as I've been the one adding selection > support to imx219, but I presume we discussed it somewhen in the past: > do you happen to remember why we left the OPB area out from the native > sizes ? (Does OPB stand for "Optically black" ? ) Yes, OPB is Optical Black. Optically black pixels can be used for subtracting dark noise from pixels. OPB lines are often sent on a totally separate CSI-2 data type, so they will generally not apply to the image buffer that is read out. See IMX290/462 for an example of that (it uses data type 0x37) I believe some other sensors use the OPB internally to perform compensation on-sensor. I've never fully followed what the full selection API is meant to be used for beyond determining which parts of the array are cropped out in particular modes. It's numbers that I extract from the datasheet, stick in the driver, and the user can do something with them if they wish. > > > Also looking at the X/Y_ADDR_START value assigned in the register tables > > > for full resolution mode (3280x2462) they have value of 0, indeed > > > meaning the active area is the only readable one. > > > > > > Then yes, you're right, for imx219 > > > NATIVE = effective > > > CROP_DEFAULT = BOUND = active > > > > > I presume you can confirm this, right ? Sounds about right. > > > > The commit message of 1ed36ecd1459b653cced8929bfb37dba94b64c5d ("media: > > > > i2c: imx219: Selection compliance fixes") seems to support me here: > > > > > > > > > > > > The top/left crop coordinates of the TGT_CROP rectangle were set to > > > > > (0, 0) instead of (8, 8) which is the offset from the larger physical > > > > > pixel array rectangle. > > > > > > > > This (8, 8) is half the difference between number of effective and > > > > active pixels of imx219[1]. > > > > > > > > Together with the 8 dummy lines and 8 dummy columns you mentioned, I > > > > still think my values are right. But I've just started working with > > > > V4L2, so I might be wrong. > > > > > > To actually verify if the 'effective area' is readable or not, we > > > should know what register controls the X/Y_ADDR_START value, and > > > that's an information I don't have in my version of the datasheet. > > > > I happen to have an IMX214 datasheet. > > X_ADDR_START is 0x0344/5 (set in multiples of 2) > > Y_ADDR_START is 0x0346/7 (set in multiples of 4) > > X_ADDR_END is 0x0348/9 (set in multiples of 2) > > Y_ADDR_END is 0x034a/b (set in multiples of 4) > > X_OUTPUT_SIZE 0x034c/d > > Y_OUTPUT_SIZE 0x034e/f > > > > X direction are 13bit values, Y direction are 12 bit. > > [12:8] or [11:8] in the low bits of the first register, [7:0] in the > > second register. > > AH thanks! Unfortunately the largest imx214 mode is cropped from full > pixel array it seems, so not that helpful :( Yup, I noticed that too. Make the selection reflect the register set - it's all you can do. I don't know why it got cropped down so much to make a 16:9 full res mode. Possibly a limit of 4096 on an ISP or receiver somewhere, or potentially just the use case. I guess there's nothing stopping an extra mode being added which uses the full sensor array. Dave > > > > Dave > > > > > It's however plausible that it behaves the same as imx219, as the > > > driver's register sequences seems to program the crop sizes in > > > register 0x034c and 0x034e and there's not programmed top-left corner > > > there. > > > > > > Ok then, let's be consistent and do the same as imx219 as you're doing > > > here. > > > > > > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > > > > > > > > > > Could you share the imx214 datasheet with me? > > > > > > > > Best regards, > > > > André > > > > > > > > [1] https://www.arducam.com/downloads/modules/RaspberryPi_camera/IMX219DS.PDF > > > > [2] https://www.sony-semicon.com/files/62/pdf/p-12_IMX415-AAQR_AAMR_Flyer.pdf > > > > > > > > > > Thanks > > > > > j > > > > > > > > > > > > > > > > static const char * const imx214_supply_name[] = { > > > > > > "vdda", > > > > > > "vddd", > > > > > > @@ -634,14 +642,31 @@ static int imx214_get_selection(struct > > > > > > v4l2_subdev *sd, > > > > > > { > > > > > > struct imx214 *imx214 = to_imx214(sd); > > > > > > > > > > > > - if (sel->target != V4L2_SEL_TGT_CROP) > > > > > > - return -EINVAL; > > > > > > + switch (sel->target) { > > > > > > + case V4L2_SEL_TGT_CROP: > > > > > > + mutex_lock(&imx214->mutex); > > > > > > + sel->r = *__imx214_get_pad_crop(imx214, sd_state, > > > > > > sel->pad, > > > > > > + sel->which); > > > > > > + mutex_unlock(&imx214->mutex); > > > > > > + return 0; > > > > > > > > > > > > - mutex_lock(&imx214->mutex); > > > > > > - sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel- > > > > > > >pad, > > > > > > - sel->which); > > > > > > - mutex_unlock(&imx214->mutex); > > > > > > - return 0; > > > > > > + case V4L2_SEL_TGT_NATIVE_SIZE: > > > > > > + sel->r.top = 0; > > > > > > + sel->r.left = 0; > > > > > > + sel->r.width = IMX214_NATIVE_WIDTH; > > > > > > + sel->r.height = IMX214_NATIVE_HEIGHT; > > > > > > + return 0; > > > > > > + > > > > > > + case V4L2_SEL_TGT_CROP_DEFAULT: > > > > > > + case V4L2_SEL_TGT_CROP_BOUNDS: > > > > > > + sel->r.top = IMX214_PIXEL_ARRAY_TOP; > > > > > > + sel->r.left = IMX214_PIXEL_ARRAY_LEFT; > > > > > > + sel->r.width = IMX214_PIXEL_ARRAY_WIDTH; > > > > > > + sel->r.height = IMX214_PIXEL_ARRAY_HEIGHT; > > > > > > + return 0; > > > > > > + } > > > > > > + > > > > > > + return -EINVAL; > > > > > > } > > > > > > > > > > > > static int imx214_entity_init_cfg(struct v4l2_subdev *subdev, > > > > > > > > > > > > -- > > > > > > 2.42.0 > > > > > > > > > >
diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c index bef8dc36e2d0..a2d441cd8dcd 100644 --- a/drivers/media/i2c/imx214.c +++ b/drivers/media/i2c/imx214.c @@ -36,6 +36,14 @@ #define IMX214_EXPOSURE_STEP 1 #define IMX214_EXPOSURE_DEFAULT 0x0c70 +/* IMX214 native and active pixel array size */ +#define IMX214_NATIVE_WIDTH 4224U +#define IMX214_NATIVE_HEIGHT 3136U +#define IMX214_PIXEL_ARRAY_LEFT 8U +#define IMX214_PIXEL_ARRAY_TOP 8U +#define IMX214_PIXEL_ARRAY_WIDTH 4208U +#define IMX214_PIXEL_ARRAY_HEIGHT 3120U + static const char * const imx214_supply_name[] = { "vdda", "vddd", @@ -634,14 +642,31 @@ static int imx214_get_selection(struct v4l2_subdev *sd, { struct imx214 *imx214 = to_imx214(sd); - if (sel->target != V4L2_SEL_TGT_CROP) - return -EINVAL; + switch (sel->target) { + case V4L2_SEL_TGT_CROP: + mutex_lock(&imx214->mutex); + sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel->pad, + sel->which); + mutex_unlock(&imx214->mutex); + return 0; - mutex_lock(&imx214->mutex); - sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel->pad, - sel->which); - mutex_unlock(&imx214->mutex); - return 0; + case V4L2_SEL_TGT_NATIVE_SIZE: + sel->r.top = 0; + sel->r.left = 0; + sel->r.width = IMX214_NATIVE_WIDTH; + sel->r.height = IMX214_NATIVE_HEIGHT; + return 0; + + case V4L2_SEL_TGT_CROP_DEFAULT: + case V4L2_SEL_TGT_CROP_BOUNDS: + sel->r.top = IMX214_PIXEL_ARRAY_TOP; + sel->r.left = IMX214_PIXEL_ARRAY_LEFT; + sel->r.width = IMX214_PIXEL_ARRAY_WIDTH; + sel->r.height = IMX214_PIXEL_ARRAY_HEIGHT; + return 0; + } + + return -EINVAL; } static int imx214_entity_init_cfg(struct v4l2_subdev *subdev,