Patchwork ARM: mx25_3ds: Add camera support

login
register
mail settings
Submitter Fabio Estevam
Date Nov. 27, 2012, 1:21 p.m.
Message ID <1354022509-20505-1-git-send-email-fabio.estevam@freescale.com>
Download mbox | patch
Permalink /patch/202215/
State New
Headers show

Comments

Fabio Estevam - Nov. 27, 2012, 1:21 p.m.
mx25_3ds board has a OV2640 camera sensor.

Add support for it.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
---
 arch/arm/mach-imx/mach-mx25_3ds.c |   85 +++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)
Baruch Siach - Nov. 28, 2012, 6:05 a.m.
Hi Fabio,

On Tue, Nov 27, 2012 at 11:21:49AM -0200, Fabio Estevam wrote:
> mx25_3ds board has a OV2640 camera sensor.
> 
> Add support for it.
> 
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>

Good to see some activity on i.MX25 camera support. Did you test video capture 
with a latest kernel?  You have surely noticed that i.MX25 support in the 
mx2_camera driver is marked BROKEN since 087c78a8.

baruch
Fabio Estevam - Nov. 29, 2012, 12:38 p.m.
Hi Baruch,

On Wed, Nov 28, 2012 at 4:05 AM, Baruch Siach <baruch@tkos.co.il> wrote:

> Good to see some activity on i.MX25 camera support. Did you test video capture
> with a latest kernel?  You have surely noticed that i.MX25 support in the
> mx2_camera driver is marked BROKEN since 087c78a8.

I basically checked that mx2_camera can be probed:

soc-camera-pdrv soc-camera-pdrv.0: Probing soc-camera-pdrv.0
mx2-camera imx25-camera.0: Camera driver attached to camera 0
ov2640 0-0030: ov2640 Product ID 26:42 Manufacturer ID 7f:a2
i2c i2c-0: OV2640 Probed
mx2-camera imx25-camera.0: Camera driver detached from camera 0
mx2-camera imx25-camera.0: MX2 Camera (CSI) driver probed, clock
frequency: 22166666

Tried a Gstreamer pipeline but it is failing, but this Gstreamer issue
is not mx25 related as I saw the same issue with mx27/mx31.

Do you still have access to a mx25pdk?

I will try v4l-utils when I get a chance.

Regards,

Fabio Estevam
Baruch Siach - Nov. 29, 2012, 12:43 p.m.
Hi Fabio,

On Thu, Nov 29, 2012 at 10:38:36AM -0200, Fabio Estevam wrote:
> On Wed, Nov 28, 2012 at 4:05 AM, Baruch Siach <baruch@tkos.co.il> wrote:
> 
> > Good to see some activity on i.MX25 camera support. Did you test video capture
> > with a latest kernel?  You have surely noticed that i.MX25 support in the
> > mx2_camera driver is marked BROKEN since 087c78a8.
> 
> I basically checked that mx2_camera can be probed:
> 
> soc-camera-pdrv soc-camera-pdrv.0: Probing soc-camera-pdrv.0
> mx2-camera imx25-camera.0: Camera driver attached to camera 0
> ov2640 0-0030: ov2640 Product ID 26:42 Manufacturer ID 7f:a2
> i2c i2c-0: OV2640 Probed
> mx2-camera imx25-camera.0: Camera driver detached from camera 0
> mx2-camera imx25-camera.0: MX2 Camera (CSI) driver probed, clock
> frequency: 22166666
> 
> Tried a Gstreamer pipeline but it is failing, but this Gstreamer issue
> is not mx25 related as I saw the same issue with mx27/mx31.
> 
> Do you still have access to a mx25pdk?

Not anymore, unfortunately.

> I will try v4l-utils when I get a chance.

Thanks. Keep me posted.

baruch
Guennadi Liakhovetski - Nov. 29, 2012, 1:02 p.m.
On Thu, 29 Nov 2012, Fabio Estevam wrote:

> Hi Baruch,
> 
> On Wed, Nov 28, 2012 at 4:05 AM, Baruch Siach <baruch@tkos.co.il> wrote:
> 
> > Good to see some activity on i.MX25 camera support. Did you test video capture
> > with a latest kernel?  You have surely noticed that i.MX25 support in the
> > mx2_camera driver is marked BROKEN since 087c78a8.
> 
> I basically checked that mx2_camera can be probed:
> 
> soc-camera-pdrv soc-camera-pdrv.0: Probing soc-camera-pdrv.0
> mx2-camera imx25-camera.0: Camera driver attached to camera 0
> ov2640 0-0030: ov2640 Product ID 26:42 Manufacturer ID 7f:a2
> i2c i2c-0: OV2640 Probed
> mx2-camera imx25-camera.0: Camera driver detached from camera 0
> mx2-camera imx25-camera.0: MX2 Camera (CSI) driver probed, clock
> frequency: 22166666
> 
> Tried a Gstreamer pipeline but it is failing, but this Gstreamer issue
> is not mx25 related as I saw the same issue with mx27/mx31.

Can you try mplayer?

Thanks
Guennadi

> Do you still have access to a mx25pdk?
> 
> I will try v4l-utils when I get a chance.
> 
> Regards,
> 
> Fabio Estevam
> 

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
Guennadi Liakhovetski - Jan. 2, 2013, 12:26 p.m.
Hi Fabio

On Thu, 29 Nov 2012, Fabio Estevam wrote:

> Hi Baruch,
> 
> On Wed, Nov 28, 2012 at 4:05 AM, Baruch Siach <baruch@tkos.co.il> wrote:
> 
> > Good to see some activity on i.MX25 camera support. Did you test video capture
> > with a latest kernel?  You have surely noticed that i.MX25 support in the
> > mx2_camera driver is marked BROKEN since 087c78a8.
> 
> I basically checked that mx2_camera can be probed:
> 
> soc-camera-pdrv soc-camera-pdrv.0: Probing soc-camera-pdrv.0
> mx2-camera imx25-camera.0: Camera driver attached to camera 0
> ov2640 0-0030: ov2640 Product ID 26:42 Manufacturer ID 7f:a2
> i2c i2c-0: OV2640 Probed
> mx2-camera imx25-camera.0: Camera driver detached from camera 0
> mx2-camera imx25-camera.0: MX2 Camera (CSI) driver probed, clock
> frequency: 22166666
> 
> Tried a Gstreamer pipeline but it is failing, but this Gstreamer issue
> is not mx25 related as I saw the same issue with mx27/mx31.
> 
> Do you still have access to a mx25pdk?
> 
> I will try v4l-utils when I get a chance.

So, what's the real status of mx25 camera? Is it really working or only 
probing? As you certainly understand, successful probing is by no means a 
sufficient indication of a driver being functional.

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/

Patch

diff --git a/arch/arm/mach-imx/mach-mx25_3ds.c b/arch/arm/mach-imx/mach-mx25_3ds.c
index b1b03aa..ae25f01 100644
--- a/arch/arm/mach-imx/mach-mx25_3ds.c
+++ b/arch/arm/mach-imx/mach-mx25_3ds.c
@@ -37,6 +37,8 @@ 
 #include <asm/memory.h>
 #include <asm/mach/map.h>
 
+#include <media/soc_camera.h>
+
 #include "common.h"
 #include "devices-imx25.h"
 #include "hardware.h"
@@ -115,12 +117,85 @@  static iomux_v3_cfg_t mx25pdk_pads[] = {
 	MX25_PAD_GPIO_A__CAN1_TX,
 	MX25_PAD_GPIO_B__CAN1_RX,
 	MX25_PAD_D14__GPIO_4_6,	/* CAN_PWDN */
+
+	/* CSI */
+	MX25_PAD_CSI_D2__CSI_D2,
+	MX25_PAD_CSI_D3__CSI_D3,
+	MX25_PAD_CSI_D4__CSI_D4,
+	MX25_PAD_CSI_D5__CSI_D5,
+	MX25_PAD_CSI_D6__CSI_D6,
+	MX25_PAD_CSI_D7__CSI_D7,
+	MX25_PAD_CSI_D8__CSI_D8,
+	MX25_PAD_CSI_D9__CSI_D9,
+	MX25_PAD_CSI_HSYNC__CSI_HSYNC,
+	MX25_PAD_CSI_MCLK__CSI_MCLK,
+	MX25_PAD_CSI_PIXCLK__CSI_PIXCLK,
+	MX25_PAD_CSI_VSYNC__CSI_VSYNC,
+	MX25_PAD_A19__GPIO_2_5,		/* CSI_PWDN */
+	MX25_PAD_A20__GPIO_2_6,		/* CMOS_RESET_B */
+};
+
+#define MX25_3DS_GPIO_CAMERA_PW	IMX_GPIO_NR(2, 5)
+#define MX25_3DS_GPIO_CAMERA_RST	IMX_GPIO_NR(2, 6)
+
+static struct gpio mx25_3ds_camera_gpios[] = {
+	{ MX25_3DS_GPIO_CAMERA_PW, GPIOF_OUT_INIT_HIGH, "camera-power" },
+	{ MX25_3DS_GPIO_CAMERA_RST, GPIOF_OUT_INIT_HIGH, "camera-reset" },
+};
+
+static const struct mx2_camera_platform_data mx25pdk_camera_pdata = {
+	.flags =  MX2_CAMERA_HSYNC_HIGH |
+		  MX2_CAMERA_GATED_CLOCK |
+		  MX2_CAMERA_PCLK_SAMPLE_RISING,
+	.clk = 13000000,
 };
 
 static const struct fec_platform_data mx25_fec_pdata __initconst = {
 	.phy    = PHY_INTERFACE_MODE_RMII,
 };
 
+static int mx25_3ds_camera_power(struct device *dev, int on)
+{
+	gpio_set_value(MX25_3DS_GPIO_CAMERA_PW, on ? 0 : 1);
+
+	if (!on)
+		goto out;
+
+	/* If enabled, give a reset impulse */
+	gpio_set_value(MX25_3DS_GPIO_CAMERA_RST, 0);
+	msleep(20);
+	gpio_set_value(MX25_3DS_GPIO_CAMERA_RST, 1);
+	msleep(100);
+
+out:
+	return 0;
+}
+
+static struct i2c_board_info mx25_3ds_i2c_camera = {
+	I2C_BOARD_INFO("ov2640", 0x30),
+};
+
+static struct soc_camera_link iclink_ov2640 = {
+	.bus_id		= 0,
+	.board_info	= &mx25_3ds_i2c_camera,
+	.i2c_adapter_id	= 0,
+	.power		= mx25_3ds_camera_power,
+	.regulators	= NULL,
+	.num_regulators	= 0,
+};
+
+static struct platform_device mx25_3ds_ov2640 = {
+	.name	= "soc-camera-pdrv",
+	.id	= 0,
+	.dev	= {
+		.platform_data = &iclink_ov2640,
+	},
+};
+
+static struct platform_device *devices[] __initdata = {
+	&mx25_3ds_ov2640,
+};
+
 #define FEC_ENABLE_GPIO		IMX_GPIO_NR(2, 3)
 #define FEC_RESET_B_GPIO	IMX_GPIO_NR(4, 8)
 
@@ -250,6 +325,16 @@  static void __init mx25pdk_init(void)
 
 	gpio_request_one(MX25PDK_CAN_PWDN, GPIOF_OUT_INIT_LOW, "can-pwdn");
 	imx25_add_flexcan0(NULL);
+
+	platform_add_devices(devices, ARRAY_SIZE(devices));
+
+	/* CSI */
+	if (gpio_request_array(mx25_3ds_camera_gpios,
+			       ARRAY_SIZE(mx25_3ds_camera_gpios))) {
+		pr_err("Failed to request camera gpios");
+		iclink_ov2640.power = NULL;
+	} else
+		imx25_add_mx2_camera(&mx25pdk_camera_pdata);
 }
 
 static void __init mx25pdk_timer_init(void)