点击查看官方英文文档 i.MX6UL处理器提供一个CSI接口。CC6UL SBC PRO可以通过扩展槽(8位数据总线和一条时钟线,三根同步信号线(PIXCLK,HSYNC,VSYNC),以及一对GPIO控制信号线和I2C1总线)来连接摄像头。

DEY的BSP支持Omnivision OV5460摄像头模型。

内核配置

您可以通过下面内核配置选项来管理CSI驱动支持以及Video4Linux (V4L2)拍照驱动。

  • CSI camera support (CONFIG_VIDEO_MXC_CSI_CAMERA)
  • OmniVision ov5640 camera support (CONFIG_MXC_CAMERA_OV5640_V2)

以上这两个选项在DEY当中默认开启

内核驱动

文件 说明
drivers/media/platform/mxc/capture/mx6s_capture.c CSI capture driver
drivers/media/platform/mxc/capture/ov5640_v2.c Omnivision OV5640 CSI camera sensor driver

设备树绑定和定制

cc6ulsbcpro开发板所加载的设备树是imx6ul-ccimx6ulsbc-id135.dts所编译的设备树文件,该设备树主要继承了imx6ul-ccimx6ulsbc-wb.dts的相关定义。 由于单板机上CSI和USDHC2冲突,所以启用CSI之前,先禁掉microSD卡

/* USDHC2 (microSD, conflicts with eMMC) */
&usdhc2 {
  	pinctrl-assert-gpios = <&gpio5 1 GPIO_ACTIVE_LOW>;
	broken-cd;	/* no carrier detect line (use polling) */
	status = "disabled";
};

再把CSI和ov5640的设备树注释去掉,以启用它

 &csi {
	status = "okay";
 };

/*
 * CSI camera conflicts with microSD/eMMC.
 * Before enabling the camera you need to disable
 * usdhc2 node.
 */
 &ov5640 {
	status = "okay";
 };

阅读BSP章节,发现上面节点描述符和设备树上有些出入,查上级设备树的引用imx6ul-ccimx6ulsbc.dtsi,原来主要定义在这里,默认已经有相关定义(除ov5640外,还有ov5642), 这些都挂在i2c1下。注意一般摄像头模组还要用到两个GPIO,控制电源和reset的,不同模组的使能电平是高是低可能不同,要根据spec来。

&i2c1 {
    ov5640: ov5640@3c {
		compatible = "ov5640";
		reg = <0x3c>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_csi>;
		clocks = <&clks IMX6UL_CLK_CSI>;
		clock-names = "csi_mclk";
		pwn-gpios = <&mca_ioexp_gpio 22 GPIO_ACTIVE_HIGH>;    //注意你spec的电平定义
		rst-gpios = <&mca_ioexp_gpio 31 GPIO_ACTIVE_LOW>;   //默认设备树这两行引脚对应的gpio号不一样
		csi_id = <0>;
		mclk = <24000000>;
		mclk_source = <0>;
		status = "disabled";
		digi,defer-probe;
		port {
			ov5640_ep: endpoint {
				remote-endpoint = <&csi_ep>;
			};
		};

启用摄像头后,可以在log里看到下面信息(未插入摄像头时)

...
pxp-v4l2 pxp-v4l2: video output device registered as /dev/video0
pxp-v4l2 pxp-v4l2: initialized
CSI: capture device registered as /dev/video1
ov5640 0-003c: no sensor pwdn pin available
...