The i.MX93 processor provides a Camera Sensor Interface (CSI) module that captures a MPI-CSI input and saves the pixels into memory.

On the ConnectCore 93 Development Kit:

  • A MIPI CSI-2 connector is available.

The BSP includes support for the Omnivision ov5640 CSI camera model.

The i.MX93 processor supports a Parallel Camera interface that is not supported at the moment.

Kernel configuration

You can manage the CSI driver support and Video4Linux (V4L2) capture driver through the following kernel configuration options:

  • IMX8 Media Device Driver (CONFIG_IMX8_MEDIA_DEVICE)

  • IMX8 Image Sensor Interface Core Driver (CONFIG_IMX8_ISI_CORE)

  • IMX93 MIPI CSI2 DWC Controller (CONFIG_DWC_MIPI_CSI2_HOST)

  • OmniVision OV5640 sensor support (CONFIG_VIDEO_OV5640)

These options are enabled as built-in on the default ConnectCore 93 kernel configuration file.

Kernel driver

The drivers for CSI capture are located at:

File Description

drivers/staging/media/imx/imx8-media-dev.c

IMX8 Media Device Driver

drivers/staging/media/imx/imx8-isi-core.c

IMX8 Image Sensor Interface Core Driver

drivers/staging/media/imx/dwc-mipi-csi2.c

IMX93 MIPI CSI2 DWC Controller

drivers/media/i2c/ov5640.c

OmniVision OV5640 sensor support

Device tree bindings and customization

Common bindings for video receiver and transmitter interfaces are described at Documentation/devicetree/bindings/media/video-interfaces.yaml.

The device tree must contain entries for:

  • The V4L2 capture interface

  • The camera sensor

  • The IOMUX

V4L2 capture interface (CSI)

ConnectCore 93 Development Kit device tree
&mipi_csi {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";

	/* Camera 0 MIPI CSI */
	port@0 {
		reg = <0>;
		mipi_csi0_ep: endpoint {
			remote-endpoint = <&ov5640_mipi_ep>;
			data-lanes = <2>;
			cfg-clk-range = <28>;
			hs-clk-range = <0x16>;
			bus-type = <4>;
		};
	};
};

Camera sensor (LPI2C3 slave)

ConnectCore 93 Development Kit device tree
&lpi2c3 {

	[...]

	/* MIPI-CSI camera */
	ov5640_mipi: ov5640_mipi@3c {
		compatible = "ovti,ov5640";
		reg = <0x3c>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_mipi>;
		clocks = <&mipi_csi_xtal24m>;
		clock-names = "xclk";
		csi_id = <0>;
		powerdown-gpios = <&gpio2 22 GPIO_ACTIVE_LOW>;
		mclk = <24000000>;
		mclk_source = <0>;
		mipi_csi;
		status = "okay";
		port {
			ov5640_mipi_ep: endpoint {
				remote-endpoint = <&mipi_csi0_ep>;
				data-lanes = <1 2>;
				clocks-lanes = <0>;
			};
		};
	};
};

[...]

	/* fixed 24MHz crystal for mipi camera */
	mipi_csi_xtal24m: mipi_csi_xtal24m {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <24000000>;
		clock-output-names = "xtal_24MHz";
	};

IOMUX configuration

ConnectCore 93 Development Kit device tree
&iomuxc {
	[...]

	/* MIPI Camera */
	pinctrl_mipi: mipi {
		fsl,pins = <
			/* MIPI_CSI_RESET_N */
			MX93_PAD_GPIO_IO22__GPIO2_IO22		0x31e
		>;
	};

	[...]
};

Use the camera

Identify the camera

When the camera is connected to the ConnectCore 93 Development Kit, the system identifies the camera sensor on the I2C bus and assigns a video device node /dev/videoX to it, where X is an integer number. You can determine the device index assigned to the camera on the kernel boot-up messages:

[    2.454301] mx8-img-md: Registered mxc_isi.0.capture as /dev/video0
[    2.460675] mx8-img-md: Registered sensor subdevice: ov5640 2-003c (1)
[    2.467215] mx8-img-md: created link [mxc_isi.0] => [mxc_isi.0.capture]
[    2.473849] mx8-img-md: created link [mxc-mipi-csi2.0] => [mxc_isi.0]
[    2.480303] mx8-img-md: created link [ov5640 2-003c] => [mxc-mipi-csi2.0]
[    2.487102] mxc-md 42800000.bus:camera: mxc_md_create_links
The following examples assume the camera is /dev/video0.

Preview a camera image using gstreamer

Capture the camera image and preview it using gstreamer and Wayland sink:

# gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=720 ! waylandsink

Take a picture with the camera using gstreamer

Capture a still image with the camera and save it using gstreamer:

# gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 ! video/x-raw,width=1280,height=720 ! jpegenc ! filesink location=sample.jpg

To show the captured image using gstreamer:

# gst-launch-1.0 filesrc location=sample.jpg ! jpegdec ! imagefreeze ! waylandsink

Record a video with the camera using gstreamer

Capture a moving image with the camera and save it using gstreamer:

# gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=90 ! video/x-raw,width=1280,height=720 ! avimux ! filesink location=output.avi