Skip to contentSkip to conversation

Add camera (CSI) driver for MX1

PATCH In review Darius Augulis 3 participants 9 messages Apr 3, 2009

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH v4 1/1 Add camera (CSI) driver for MX1

From: Paulius Zaleckas <[email protected]>

---

 arch/arm/mach-mx1/Makefile                  |    5 
 arch/arm/mach-mx1/devices.c                 |    2 
 arch/arm/mach-mx1/ksym_mx1.c                |   18 +
 arch/arm/mach-mx1/mx1_camera_fiq.S          |   35 +
 arch/arm/plat-mxc/include/mach/memory.h     |    8 
 arch/arm/plat-mxc/include/mach/mx1_camera.h |   35 +
 drivers/media/video/Kconfig                 |   13 
 drivers/media/video/Makefile                |    1 
 drivers/media/video/mx1_camera.c            |  827 +++++++++++++++++++++++++++
 9 files changed, 941 insertions(+), 3 deletions(-)
 create mode 100644 arch/arm/mach-mx1/ksym_mx1.c
 create mode 100644 arch/arm/mach-mx1/mx1_camera_fiq.S
 create mode 100644 arch/arm/plat-mxc/include/mach/mx1_camera.h
 create mode 100644 drivers/media/video/mx1_camera.c
arch/arm/mach-mx1/Makefile +4 -1
index 5e85456..2097021 100644
@@ -6,6 +6,9 @@
 
 obj-y			+= generic.o clock.o devices.o
 
+# Support for CMOS sensor interface
+obj-$(CONFIG_MX1_VIDEO)	+= ksym_mx1.o mx1_camera_fiq.o
+
 # Power management
 obj-$(CONFIG_PM)		+= pm.o
 
@@ -15,4 +18,4 @@ endif
 
 # Specific board support
 obj-$(CONFIG_ARCH_MX1ADS) += mx1ads.o
-obj-$(CONFIG_MACH_SCB9328) += scb9328.o
\ No newline at end of file
+obj-$(CONFIG_MACH_SCB9328) += scb9328.o
arch/arm/mach-mx1/devices.c +1 -1
index 97f42d9..76d1ffb 100644
@@ -44,7 +44,7 @@ static struct resource imx_csi_resources[] = {
 static u64 imx_csi_dmamask = 0xffffffffUL;
 
 struct platform_device imx_csi_device = {
-	.name           = "imx-csi",
+	.name           = "mx1-camera",
 	.id             = 0, /* This is used to put cameras on this interface */
 	.dev		= {
 		.dma_mask = &imx_csi_dmamask,
arch/arm/mach-mx1/ksym_mx1.c new file +18 -0
new file mode 100644
index 0000000..b09ee12
@@ -0,0 +1,18 @@
+/*
+ * Exported ksyms of ARCH_MX1
+ *
+ * Copyright (C) 2008, Darius Augulis <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/platform_device.h>
+#include <linux/module.h>
+
+#include <mach/mx1_camera.h>
+
+/* IMX camera FIQ handler */
+EXPORT_SYMBOL(mx1_camera_sof_fiq_start);
+EXPORT_SYMBOL(mx1_camera_sof_fiq_end);
arch/arm/mach-mx1/mx1_camera_fiq.S new file +35 -0
new file mode 100644
index 0000000..9c69aa6
@@ -0,0 +1,35 @@
+/*
+ *  Copyright (C) 2008 Paulius Zaleckas <[email protected]>
+ *
+ *  Based on linux/arch/arm/lib/floppydma.S
+ *      Copyright (C) 1995, 1996 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/linkage.h>
+#include <asm/assembler.h>
+
+		.text
+		.global	mx1_camera_sof_fiq_end
+		.global	mx1_camera_sof_fiq_start
+mx1_camera_sof_fiq_start:
+		@ enable dma
+		ldr	r12, [r9]
+		orr	r12, r12, #0x00000001
+		str	r12, [r9]
+		@ unmask DMA interrupt
+		ldr	r12, [r8]
+		bic	r12, r12, r13
+		str	r12, [r8]
+		@ disable SOF interrupt
+		ldr	r12, [r10]
+		bic	r12, r12, #0x00010000
+		str	r12, [r10]
+		@ clear SOF flag
+		mov	r12, #0x00010000
+		str	r12, [r11]
+		@ return from FIQ
+		subs	pc, lr, #4
+mx1_camera_sof_fiq_end:
arch/arm/plat-mxc/include/mach/memory.h +8 -0
index e0783e6..eca37d0 100644
@@ -24,4 +24,12 @@
 #define PHYS_OFFSET		UL(0x80000000)
 #endif
 
+#if defined(CONFIG_MX1_VIDEO)
+/*
+ * Increase size of DMA-consistent memory region.
+ * This is required for i.MX camera driver to capture at least four VGA frames.
+ */
+#define CONSISTENT_DMA_SIZE SZ_4M
+#endif /* CONFIG_MX1_VIDEO */
+
 #endif /* __ASM_ARCH_MXC_MEMORY_H__ */
arch/arm/plat-mxc/include/mach/mx1_camera.h new file +35 -0
new file mode 100644
index 0000000..4fd6c70
@@ -0,0 +1,35 @@
+/*
+ * mx1_camera.h - i.MX1/i.MXL camera driver header file
+ *
+ * Copyright (c) 2008, Paulius Zaleckas <[email protected]>
+ * Copyright (C) 2009, Darius Augulis <[email protected]>
+ *
+ * Based on PXA camera.h file:
+ * Copyright (C) 2003, Intel Corporation
+ * Copyright (C) 2008, Guennadi Liakhovetski <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_CAMERA_H_
+#define __ASM_ARCH_CAMERA_H_
+
+#define MX1_CAMERA_DATA_HIGH	1
+#define MX1_CAMERA_PCLK_RISING	2
+#define MX1_CAMERA_VSYNC_HIGH	4
+
+extern unsigned char mx1_camera_sof_fiq_start, mx1_camera_sof_fiq_end;
+
+/**
+ * struct mx1_camera_pdata - i.MX1/i.MXL camera platform data
+ * @mclk_10khz:	master clock frequency in 10kHz units
+ * @flags:	MX1 camera platform flags
+ */
+struct mx1_camera_pdata {
+	unsigned long mclk_10khz;
+	unsigned long flags;
+};
+
+#endif /* __ASM_ARCH_CAMERA_H_ */
drivers/media/video/Kconfig +12 -1
index 76bad58..159229f 100644
@@ -746,6 +746,18 @@ config SOC_CAMERA_OV772X
 	help
 	  This is a ov772x camera driver
 
+config MX1_VIDEO
+	bool
+
+config VIDEO_MX1
+	tristate "i.MX1/i.MXL CMOS Sensor Interface driver"
+	depends on VIDEO_DEV && ARCH_MX1 && SOC_CAMERA
+	select FIQ
+	select VIDEOBUF_DMA_CONTIG
+	select MX1_VIDEO
+	---help---
+	  This is a v4l2 driver for the i.MX1/i.MXL CMOS Sensor Interface
+
 config VIDEO_MX3
 	tristate "i.MX3x Camera Sensor Interface driver"
 	depends on VIDEO_DEV && MX3_IPU && SOC_CAMERA
@@ -904,5 +916,4 @@ config USB_S2255
 	  This driver can be compiled as a module, called s2255drv.
 
 endif # V4L_USB_DRIVERS
-
 endif # VIDEO_CAPTURE_DRIVERS
drivers/media/video/Makefile +1 -0
index b904674..ba02977 100644
@@ -133,6 +133,7 @@ obj-$(CONFIG_VIDEO_CX18) += cx18/
 obj-$(CONFIG_VIDEO_VIVI) += vivi.o
 obj-$(CONFIG_VIDEO_CX23885) += cx23885/
 
+obj-$(CONFIG_VIDEO_MX1)			+= mx1_camera.o
 obj-$(CONFIG_VIDEO_MX3)			+= mx3_camera.o
 obj-$(CONFIG_VIDEO_PXA27x)		+= pxa_camera.o
 obj-$(CONFIG_VIDEO_SH_MOBILE_CEU)	+= sh_mobile_ceu_camera.o
drivers/media/video/mx1_camera.c new file +827 -0

827 lines not on this page · raw message

#1 lore raw

Changelog since V3:
- DMA buffer size decreased to 4Mbytes
- Added pdata test in set_bus_param()

#2 lore raw
In reply to Darius Augulis
Quoted 4 lines · Darius Augulis

From: Paulius Zaleckas <[email protected]>

Ok, I'll just swap these two Sob's to reflect the processing chain, add a description like

Add support for CMOS Sensor Interface on i.MX1 and i.MXL SoCs.

and fix a couple of trivial conflicts, which probably appear, because you based your patches on an MXC tree, and not on current linux-next. Wondering, if it still will work then... At least it compiles. BTW, should it really also work with IMX? Then you might want to change this

	depends on VIDEO_DEV && ARCH_MX1 && SOC_CAMERA

to

	depends on VIDEO_DEV && (ARCH_MX1 || ARCH_IMX) && SOC_CAMERA

but you can do this later, maybe, when you actually get a chance to test it on IMX (if you haven't done so yet).

Sascha, we need your ack for the ARM part.

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer

maintainer
#3 lore raw
Quoted 17 lines · Guennadi Liakhovetski
Quoted 4 lines · Darius Augulis

From: Paulius Zaleckas <[email protected]>

Ok, I'll just swap these two Sob's to reflect the processing chain, add a description like

Add support for CMOS Sensor Interface on i.MX1 and i.MXL SoCs.

and fix a couple of trivial conflicts, which probably appear, because you based your patches on an MXC tree, and not on current linux-next. Wondering, if it still will work then... At least it compiles. BTW, should it really also work with IMX? Then you might want to change this

Quoted 5 lines
	depends on VIDEO_DEV && ARCH_MX1 && SOC_CAMERA

to

	depends on VIDEO_DEV && (ARCH_MX1 || ARCH_IMX) && SOC_CAMERA

This shouldn't be necessary. ARCH_IMX does not have the platform part to make use of this driver and will never get it.

Quoted 5 lines

but you can do this later, maybe, when you actually get a chance to test it on IMX (if you haven't done so yet).

Sascha, we need your ack for the ARM part.

I'm OK with this driver: I have never worked with FIQs though so I can't say much to it.

Sascha

Signature · 4 lines
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
#4 lore raw
Quoted 22 lines · Sascha Hauer
Quoted 10 lines · Guennadi Liakhovetski
Quoted 4 lines · Darius Augulis

From: Paulius Zaleckas <[email protected]>

Ok, I'll just swap these two Sob's to reflect the processing chain, add a description like

Add support for CMOS Sensor Interface on i.MX1 and i.MXL SoCs.

Quoted 7 lines

and fix a couple of trivial conflicts, which probably appear, because you based your patches on an MXC tree, and not on current linux-next. Wondering, if it still will work then... At least it compiles. BTW, should it really also work with IMX? Then you might want to change this

	depends on VIDEO_DEV && ARCH_MX1 && SOC_CAMERA

to

	depends on VIDEO_DEV && (ARCH_MX1 || ARCH_IMX) && SOC_CAMERA

This shouldn't be necessary. ARCH_IMX does not have the platform part to make use of this driver and will never get it.

Quoted 6 lines
Quoted 3 lines

but you can do this later, maybe, when you actually get a chance to test it on IMX (if you haven't done so yet).

Sascha, we need your ack for the ARM part.

I'm OK with this driver: I have never worked with FIQs though so I can't say much to it.

At least I can confirm it worked well with 2.6.28.5 kernel version.

Quoted 3 lines

Sascha

#5 lore raw
In reply to Sascha Hauer
Quoted 4 lines · Sascha Hauer
Quoted 3 lines · Guennadi Liakhovetski

Wondering, if it still will work then... At least it compiles. BTW, should it really also work with IMX? Then you might want to change this

Quoted 8 lines
Quoted 5 lines
	depends on VIDEO_DEV && ARCH_MX1 && SOC_CAMERA

to

	depends on VIDEO_DEV && (ARCH_MX1 || ARCH_IMX) && SOC_CAMERA

This shouldn't be necessary. ARCH_IMX does not have the platform part to make use of this driver and will never get it.

Confused... Then why the whole that "IMX/MX1" in the driver? And why will it never get it - are they compatible or not? Or just there's no demand / chips are EOLed or something...

Quoted 7 lines
Quoted 4 lines

but you can do this later, maybe, when you actually get a chance to test it on IMX (if you haven't done so yet).

Sascha, we need your ack for the ARM part.

I'm OK with this driver: I have never worked with FIQs though so I can't say much to it.

Ok, I take it as an "Acked-by" then:-)

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer

maintainer
#6 lore raw
Quoted 10 lines · Guennadi Liakhovetski
Quoted 8 lines · Sascha Hauer
Quoted 7 lines · Guennadi Liakhovetski

Wondering, if it still will work then... At least it compiles. BTW, should it really also work with IMX? Then you might want to change this

	depends on VIDEO_DEV && ARCH_MX1 && SOC_CAMERA

to

Quoted 7 lines
Quoted 4 lines
Quoted 1 line
	depends on VIDEO_DEV && (ARCH_MX1 || ARCH_IMX) && SOC_CAMERA

This shouldn't be necessary. ARCH_IMX does not have the platform part to make use of this driver and will never get it.

Confused... Then why the whole that "IMX/MX1" in the driver? And why will it never get it - are they compatible or not?

Not just compatible, they are the same. A little bit of history: I originally brought i.MX1 support to the kernel in the early 2.6 days. around 2.6.25 Freescale pushed initial i.MX31 support using plat-mxc. We in turn based our i.MX27 port on this code and since then it evolved further. Darius based a new i.MX1 support on this code and now we can remove arch-imx.

Sascha

Signature · 4 lines
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
#7 lore raw
In reply to Guennadi Liakhovetski
Quoted 11 lines · Guennadi Liakhovetski
Quoted 8 lines · Sascha Hauer
Quoted 6 lines · Guennadi Liakhovetski

Wondering, if it still will work then... At least it compiles. BTW, should it really also work with IMX? Then you might want to change this

	depends on VIDEO_DEV && ARCH_MX1 && SOC_CAMERA

to

Quoted 9 lines
Quoted 5 lines
Quoted 2 lines
	depends on VIDEO_DEV && (ARCH_MX1 || ARCH_IMX) && SOC_CAMERA

This shouldn't be necessary. ARCH_IMX does not have the platform part to make use of this driver and will never get it.

Confused... Then why the whole that "IMX/MX1" in the driver? And why will it never get it - are they compatible or not? Or just there's no demand / chips are EOLed or something...

in Linux kernel "imx" is the old name of "mx1".
mx1 contains of two processors: i.MX1 and i.MXL.

Quoted 17 lines
Quoted 7 lines
Quoted 4 lines

but you can do this later, maybe, when you actually get a chance to test it on IMX (if you haven't done so yet).

Sascha, we need your ack for the ARM part.

I'm OK with this driver: I have never worked with FIQs though so I can't say much to it.

Ok, I take it as an "Acked-by" then:-)

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer

#8 lore raw
Quoted 8 lines · Darius Augulis
Quoted 4 lines · Guennadi Liakhovetski

Confused... Then why the whole that "IMX/MX1" in the driver? And why will it never get it - are they compatible or not? Or just there's no demand / chips are EOLed or something...

in Linux kernel "imx" is the old name of "mx1".
mx1 contains of two processors: i.MX1 and i.MXL.

Ah, ok, I see now. I thought i.MXL was under ARCH_IMX and _not_ ARCH_MX1. That was my confusion.

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer