devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mylene JOSSERAND <mylene.josserand@free-electrons.com>
To: Yong Deng <yong.deng@magewell.com>
Cc: maxime.ripard@free-electrons.com,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Rob Herring <robh+dt@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>, Chen-Yu Tsai <wens@csie.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	"David S. Miller" <davem@davemloft.net>,
	Hans Verkuil <hverkuil@xs4all.nl>, Arnd Bergmann <arnd@arndb.de>,
	Hugues Fruchet <hugues.fruchet@st.com>,
	Yannick Fertre <yannick.fertre@st.com>,
	Philipp Zabel <p.zabel@pengutronix.de>,
	Benoit Parrot <bparrot@ti.com>,
	Benjamin Gaignard <benjamin.gaignard@linaro.org>,
	Jean-Christophe Trotin <jean-christophe.trotin@st.com>,
	Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com>,
	Minghsiu Tsai <minghsiu.tsai@mediatek.com>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	Robert
Subject: Re: [PATCH v2 1/3] media: V3s: Add support for Allwinner CSI.
Date: Fri, 22 Sep 2017 10:44:13 +0200	[thread overview]
Message-ID: <20170922104413.5d7d64e7@dell-desktop.home> (raw)
In-Reply-To: <1501131697-1359-2-git-send-email-yong.deng@magewell.com>

Hello Yong,

Thank you for these drivers!

I tested it with an OV5640 camera on an Nanopi M1 plus (Allwinner H3)
and I noticed that I got a frame correctly displayed only on a half of
the frame's size.

It is related to your "sun6i_csi_set_window" function (see
below).

> Allwinner V3s SoC have two CSI module. CSI0 is used for MIPI interface
> and CSI1 is used for parallel interface. This is not documented in
> datasheet but by testing and guess.
> 
> This patch implement a v4l2 framework driver for it.
> 
> Currently, the driver only support the parallel interface. MIPI-CSI2,
> ISP's support are not included in this patch.
> 
> Signed-off-by: Yong Deng <yong.deng@magewell.com>
> ---
>  drivers/media/platform/Kconfig                   |   1 +
>  drivers/media/platform/Makefile                  |   2 +
>  drivers/media/platform/sun6i-csi/Kconfig         |   9 +
>  drivers/media/platform/sun6i-csi/Makefile        |   3 +
>  drivers/media/platform/sun6i-csi/sun6i_csi.c     | 545
> +++++++++++++++ drivers/media/platform/sun6i-csi/sun6i_csi.h     |
> 203 ++++++ drivers/media/platform/sun6i-csi/sun6i_csi_v3s.c | 827
> +++++++++++++++++++++++
> drivers/media/platform/sun6i-csi/sun6i_csi_v3s.h | 206 ++++++
> drivers/media/platform/sun6i-csi/sun6i_video.c   | 663
> ++++++++++++++++++ drivers/media/platform/sun6i-csi/sun6i_video.h
> |  61 ++ 10 files changed, 2520 insertions(+) create mode 100644
> drivers/media/platform/sun6i-csi/Kconfig create mode 100644
> drivers/media/platform/sun6i-csi/Makefile create mode 100644
> drivers/media/platform/sun6i-csi/sun6i_csi.c create mode 100644
> drivers/media/platform/sun6i-csi/sun6i_csi.h create mode 100644
> drivers/media/platform/sun6i-csi/sun6i_csi_v3s.c create mode 100644
> drivers/media/platform/sun6i-csi/sun6i_csi_v3s.h create mode 100644
> drivers/media/platform/sun6i-csi/sun6i_video.c create mode 100644
> drivers/media/platform/sun6i-csi/sun6i_video.h
> 
> diff --git a/drivers/media/platform/Kconfig
> b/drivers/media/platform/Kconfig index 0c741d1..8371a87 100644
> --- a/drivers/media/platform/Kconfig
> +++ b/drivers/media/platform/Kconfig
> @@ -143,6 +143,7 @@ source "drivers/media/platform/am437x/Kconfig"
>  source "drivers/media/platform/xilinx/Kconfig"
>  source "drivers/media/platform/rcar-vin/Kconfig"
>  source "drivers/media/platform/atmel/Kconfig"
> +source "drivers/media/platform/sun6i-csi/Kconfig"
>  

<snip>

> +static void sun6i_csi_set_format(struct sun6i_csi_dev *sdev)
> +{
> +	struct sun6i_csi *csi = &sdev->csi;
> +	u32 cfg;
> +	u32 val;
> +
> +	regmap_read(sdev->regmap, CSI_CH_CFG_REG, &cfg);
> +
> +	cfg &= ~(CSI_CH_CFG_INPUT_FMT_MASK |
> +		 CSI_CH_CFG_OUTPUT_FMT_MASK | CSI_CH_CFG_VFLIP_EN |
> +		 CSI_CH_CFG_HFLIP_EN | CSI_CH_CFG_FIELD_SEL_MASK |
> +		 CSI_CH_CFG_INPUT_SEQ_MASK);
> +
> +	val = get_csi_input_format(csi->config.code,
> csi->config.pixelformat);
> +	cfg |= CSI_CH_CFG_INPUT_FMT(val);
> +
> +	val = get_csi_output_format(csi->config.code,
> csi->config.field);
> +	cfg |= CSI_CH_CFG_OUTPUT_FMT(val);
> +
> +	val = get_csi_input_seq(csi->config.code,
> csi->config.pixelformat);
> +	cfg |= CSI_CH_CFG_INPUT_SEQ(val);
> +
> +	if (csi->config.field == V4L2_FIELD_TOP)
> +		cfg |= CSI_CH_CFG_FIELD_SEL_FIELD0;
> +	else if (csi->config.field == V4L2_FIELD_BOTTOM)
> +		cfg |= CSI_CH_CFG_FIELD_SEL_FIELD1;
> +	else
> +		cfg |= CSI_CH_CFG_FIELD_SEL_BOTH;
> +
> +	regmap_write(sdev->regmap, CSI_CH_CFG_REG, cfg);
> +}
> +
> +static void sun6i_csi_set_window(struct sun6i_csi_dev *sdev)
> +{
> +	struct sun6i_csi_config *config = &sdev->csi.config;
> +	u32 bytesperline_y;
> +	u32 bytesperline_c;
> +	int *planar_offset = sdev->planar_offset;
> +
> +	regmap_write(sdev->regmap, CSI_CH_HSIZE_REG,
> +		     CSI_CH_HSIZE_HOR_LEN(config->width) |
> +		     CSI_CH_HSIZE_HOR_START(0));
> +	regmap_write(sdev->regmap, CSI_CH_VSIZE_REG,
> +		     CSI_CH_VSIZE_VER_LEN(config->height) |
> +		     CSI_CH_VSIZE_VER_START(0));

In my case, the HOR_LEN and VER_LEN were not correctly configured.

They were configured to width and height (640 * 480) but as I was
using a YUYV format, the pixel's size is 2 bytes so the
horizontal/vertical lines' lengths were divided by 2.

Currently, I fixed that by getting the number of bytes per pixel with
"v4l2_pixformat_get_bpp()":

+       int bytes_pixel;
+
+       bytes_pixel = v4l2_pixformat_get_bpp(config->pixelformat) / 8;
 
        regmap_write(sdev->regmap, CSI_CH_HSIZE_REG,
-                    CSI_CH_HSIZE_HOR_LEN(config->width) |
+                    CSI_CH_HSIZE_HOR_LEN(config->width * bytes_pixel) |
                     CSI_CH_HSIZE_HOR_START(0));
        regmap_write(sdev->regmap, CSI_CH_VSIZE_REG,
-                    CSI_CH_VSIZE_VER_LEN(config->height) |
+                    CSI_CH_VSIZE_VER_LEN(config->height * bytes_pixel)
  | CSI_CH_VSIZE_VER_START(0));

There is certainly a nicer way to handle that.

> +
> +	planar_offset[0] = 0;
> +	switch(config->pixelformat) {
> +	case V4L2_PIX_FMT_HM12:
> +	case V4L2_PIX_FMT_NV12:
> +	case V4L2_PIX_FMT_NV21:
> +	case V4L2_PIX_FMT_NV16:
> +	case V4L2_PIX_FMT_NV61:
> +		bytesperline_y = config->width;
> +		bytesperline_c = config->width;
> +		planar_offset[1] = bytesperline_y * config->height;
> +		planar_offset[2] = -1;
> +		break;
> +	case V4L2_PIX_FMT_YUV420:
> +	case V4L2_PIX_FMT_YVU420:
> +		bytesperline_y = config->width;
> +		bytesperline_c = config->width / 2;
> +		planar_offset[1] = bytesperline_y * config->height;
> +		planar_offset[2] = planar_offset[1] +
> +				bytesperline_c * config->height / 2;
> +		break;
> +	case V4L2_PIX_FMT_YUV422P:
> +		bytesperline_y = config->width;
> +		bytesperline_c = config->width / 2;
> +		planar_offset[1] = bytesperline_y * config->height;
> +		planar_offset[2] = planar_offset[1] +
> +				bytesperline_c * config->height;
> +		break;
> +	default: /* raw */
> +		bytesperline_y =
> (v4l2_pixformat_get_bpp(config->pixelformat) *
> +				  config->width) / 8;
> +		bytesperline_c = 0;
> +		planar_offset[1] = -1;
> +		planar_offset[2] = -1;
> +		break;
> +	}
> +
> +	regmap_write(sdev->regmap, CSI_CH_BUF_LEN_REG,
> +		     CSI_CH_BUF_LEN_BUF_LEN_C(bytesperline_c) |
> +		     CSI_CH_BUF_LEN_BUF_LEN_Y(bytesperline_y));
> +}
> +
> +static int get_supported_pixformats(struct sun6i_csi *csi,
> +				    const u32 **pixformats)
> +{
> +	if (pixformats != NULL)
> +		*pixformats = supported_pixformats;
> +
> +	return ARRAY_SIZE(supported_pixformats);
> +}
> +
> +static bool is_format_support(struct sun6i_csi *csi, u32 pixformat,
> +			      u32 mbus_code)
> +{
> +	struct sun6i_csi_dev *sdev = sun6i_csi_to_dev(csi);
> +
> +	return __is_format_support(sdev, pixformat, mbus_code);
> +}
> +
> +static int set_power(struct sun6i_csi *csi, bool enable)
> +{
> +	struct sun6i_csi_dev *sdev = sun6i_csi_to_dev(csi);
> +	struct regmap *regmap = sdev->regmap;
> +	int ret;
> +
> +	if (!enable) {
> +		regmap_update_bits(regmap, CSI_EN_REG,
> CSI_EN_CSI_EN, 0); +
> +		clk_disable_unprepare(sdev->clk_ram);
> +		clk_disable_unprepare(sdev->clk_mod);
> +		clk_disable_unprepare(sdev->clk_ahb);
> +		reset_control_assert(sdev->rstc_ahb);
> +		return 0;
> +	}
> +
> +	ret = clk_prepare_enable(sdev->clk_ahb);
> +	if (ret) {
> +		dev_err(sdev->dev, "Enable ahb clk err %d\n", ret);
> +		return ret;
> +	}
> +
> +	ret = clk_prepare_enable(sdev->clk_mod);
> +	if (ret) {
> +		dev_err(sdev->dev, "Enable csi clk err %d\n", ret);
> +		return ret;
> +	}
> +
> +	ret = clk_prepare_enable(sdev->clk_ram);
> +	if (ret) {
> +		dev_err(sdev->dev, "Enable clk_dram_csi clk err
> %d\n", ret);
> +		return ret;
> +	}
> +
> +	if (!IS_ERR_OR_NULL(sdev->rstc_ahb)) {
> +		ret = reset_control_deassert(sdev->rstc_ahb);
> +		if (ret) {
> +			dev_err(sdev->dev, "reset err %d\n", ret);
> +			return ret;
> +		}
> +	}
> +
> +	regmap_update_bits(regmap, CSI_EN_REG, CSI_EN_CSI_EN,
> CSI_EN_CSI_EN); +
> +	return 0;
> +}

<snip>

Thank you in advance!

Best regards,

-- 
Mylène Josserand, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

  parent reply	other threads:[~2017-09-22  8:44 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-27  5:01 [PATCH v2 0/3] Initial Allwinner V3s CSI Support Yong Deng
2017-07-27  5:01 ` [PATCH v2 1/3] media: V3s: Add support for Allwinner CSI Yong Deng
     [not found]   ` <1501131697-1359-2-git-send-email-yong.deng-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-07-27 12:16     ` Baruch Siach
2017-07-27 12:25       ` Maxime Ripard
     [not found]         ` <20170727122551.qca4atjeet6whfrs-ZC1Zs529Oq4@public.gmane.org>
2017-07-31  0:47           ` Yong
2017-07-28 16:02     ` Maxime Ripard
2017-07-30  6:08       ` Baruch Siach
2017-07-31  1:48         ` Yong
2017-07-31  5:13           ` Baruch Siach
2017-08-21 20:21         ` Maxime Ripard
     [not found]           ` <20170821202145.kmxancepyq55v3o2-ZC1Zs529Oq4@public.gmane.org>
2017-08-23  2:41             ` Yong
2017-08-23 19:24               ` Maxime Ripard
2017-08-24  1:43                 ` Yong
     [not found]       ` <20170728160233.xooevio4hoqkgfaq-ZC1Zs529Oq4@public.gmane.org>
2017-07-31  3:16         ` Yong
2017-08-22 17:43           ` Maxime Ripard
     [not found]             ` <20170822174339.6woauylgzkgqxygk-ZC1Zs529Oq4@public.gmane.org>
2017-08-23  2:32               ` Yong
     [not found]                 ` <20170823103216.e43283308c195c4a80d929fa-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-08-25 13:41                   ` Maxime Ripard
     [not found]                     ` <20170825134114.rwttrmzw5gbtwdx2-ZC1Zs529Oq4@public.gmane.org>
2017-08-28  7:00                       ` Yong
2017-08-21 14:37     ` Hans Verkuil
     [not found]       ` <5082b6d6-29a7-f101-8cba-13fce8983c89-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-08-22  3:01         ` Yong
     [not found]           ` <20170822110148.734c01b69dacc57fa08965d1-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-08-22  6:43             ` Hans Verkuil
     [not found]               ` <8dd8c350-cd45-5cd9-65cc-67102944811f-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-08-22  7:51                 ` Yong
2017-08-22 20:17                 ` Maxime Ripard
2017-08-22 20:52                   ` Laurent Pinchart
     [not found]                   ` <20170822201731.hyjqrbkhggaoomfl-YififvaboMKzQB+pC5nmwQ@public.gmane.org>
2017-08-23  6:52                     ` Hans Verkuil
     [not found]                       ` <3392c717-10ea-4d6e-4c25-9be0bbec004e-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-08-23  7:43                         ` Laurent Pinchart
2017-08-23 11:13                           ` icenowy
2017-09-21 13:45     ` 'Ondřej Jirman' via linux-sunxi
2017-11-21 15:48     ` Maxime Ripard
     [not found]       ` <20171121154827.5a35xa6zlqrrvkxx-ZC1Zs529Oq4@public.gmane.org>
2017-11-22  1:33         ` Yong
     [not found]           ` <20171122093306.d30fe641f269d62daa1f66b4-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-11-22  9:45             ` Maxime Ripard
     [not found]               ` <20171122094526.nqxfy2e5jzxw7nl4-ZC1Zs529Oq4@public.gmane.org>
2017-11-23  1:14                 ` Yong
     [not found]                   ` <20171123091444.4bed66dffeb36ecea8dfa706-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-11-25 16:02                     ` Maxime Ripard
     [not found]                       ` <20171125160233.skefdpkjy4peh7et-ZC1Zs529Oq4@public.gmane.org>
2017-12-04  9:45                         ` Yong
     [not found]                           ` <20171204174511.a5be3b521e9a7c7004d32d0d-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-12-15 10:50                             ` Maxime Ripard
     [not found]                               ` <20171215105047.ist7epuida2uao74-ZC1Zs529Oq4@public.gmane.org>
2017-12-15 11:01                                 ` Yong
     [not found]                                   ` <20171215190140.d4df71b202b9803baa6a1e10-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-12-15 22:14                                     ` Maxime Ripard
2017-09-22  0:57   ` 回复:[linux-sunxi] " 邓永
2017-09-22  8:44   ` Mylene JOSSERAND [this message]
     [not found]     ` <20170922104413.5d7d64e7-K8i4uRanGBt8XcdJbWeDu7NAH6kLmebB@public.gmane.org>
2017-09-22  9:08       ` Yong
2017-07-27  5:01 ` [PATCH v2 2/3] dt-bindings: media: Add Allwinner V3s Camera Sensor Interface (CSI) Yong Deng
     [not found]   ` <1501131697-1359-3-git-send-email-yong.deng-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-07-28 16:03     ` Maxime Ripard
     [not found]       ` <20170728160353.gqb2f47v6ujozvxz-ZC1Zs529Oq4@public.gmane.org>
2017-07-31  0:50         ` Yong
2017-08-03 19:14     ` Rob Herring
2017-08-07  1:00       ` Yong
2017-12-19 11:53   ` Sakari Ailus
     [not found]     ` <20171219115327.ofs5xwwimpn7x72n-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2017-12-21  2:49       ` Yong
2017-12-27 21:47         ` Sakari Ailus
     [not found]           ` <20171227214723.rcssyay2lqqjf6ty-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2017-12-28  1:04             ` Yong
2017-07-27  5:01 ` [PATCH v2 3/3] media: MAINTAINERS: add entries for Allwinner V3s CSI Yong Deng
     [not found]   ` <1501131697-1359-4-git-send-email-yong.deng-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-12-19 11:48     ` Sakari Ailus
     [not found]       ` <20171219114802.gi7db7xhm3eh4udt-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2017-12-21  2:40         ` Yong
  -- strict thread matches above, loose matches on Subject: below --
2017-07-27  3:51 [PATCH v2 0/3] Initial Allwinner V3s CSI Support Yong Deng
2017-07-27  3:51 ` [PATCH v2 1/3] media: V3s: Add support for Allwinner CSI Yong Deng
2017-07-27  3:51 ` Yong Deng
     [not found] ` <1501127474-40895-1-git-send-email-yong.deng-+3dxTMOEIRNWk0Htik3J/w@public.gmane.org>
2017-07-27  3:51   ` Yong Deng
2017-07-27  3:51   ` Yong Deng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170922104413.5d7d64e7@dell-desktop.home \
    --to=mylene.josserand@free-electrons.com \
    --cc=arnd@arndb.de \
    --cc=benjamin.gaignard@linaro.org \
    --cc=bparrot@ti.com \
    --cc=davem@davemloft.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=hugues.fruchet@st.com \
    --cc=hverkuil@xs4all.nl \
    --cc=jean-christophe.trotin@st.com \
    --cc=krzk@kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=maxime.ripard@free-electrons.com \
    --cc=mchehab@kernel.org \
    --cc=minghsiu.tsai@mediatek.com \
    --cc=p.zabel@pengutronix.de \
    --cc=ramesh.shanmugasundaram@bp.renesas.com \
    --cc=robh+dt@kernel.org \
    --cc=wens@csie.org \
    --cc=yannick.fertre@st.com \
    --cc=yong.deng@magewell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).