i.MX6ULL的CSI(CMOS Sensor Interface),即,CMOS传感器接口,是一种摄像头并行数据接口,支持8-bit/10-bit/16-bit Bayer,YUV,YCrCb,RGB数据输入,也支持CCIR656格式数据输入。ELF 1开发板支持8位并行DVP接口的数字摄像头OV5640。
硬件原理
CSI_DATA0—CSI_DATA7是CSI数据信号引脚;
CSI_PIXCLK是像素时钟;
CSI_MCLK为摄像头提供主时钟,保证功能实现;
CSI_HSYNC、CSI_VSYNC作为摄像头的行场扫描模式信号,提供行场信息;
IIC2_SDA和IIC2_SCL用来配置摄像头设备地址为0x30;
CSI_PWDN是CSI的电源使能引脚,由SN74HC595D扩展芯片控制。
IOMUX配置
NXP官方的i.MX6ULL EVK板,使用的CSI接口与ELF 1开发板一致,所以,已经配置好CSI接口和I2C2的的IOMUX:
修改设备节点
ELF 1的摄像头和NXP官方使用的方案一致,都是OV5640摄像头,但硬件设计略有区别,需要做出一些改动。
根节点下csi节点:
I2C2节点下内容如下,Elf1底板上给OV5640做了硬件复位,无需软件复位,因此,需要对设备树做出一些修改,去掉复位部分以及修改电源引脚:
|
ov5640: ov5640@3c { compatible = "ovti,ov5640"; reg = <0x3c>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_csi1>; clocks = <&clks IMX6UL_CLK_CSI>; clock-names = "csi_mclk"; pwn-gpios = <&gpio_spi 4 1>; /* rst-gpios = <&gpio_spi 5 0>;*/ csi_id = <0>; mclk = <24000000>; mclk_source = <0>; status = "okay"; port { ov5640_ep: endpoint { remote-endpoint = <&csi1_ep>; }; }; }; |
效果如下:
reg = <0x3c>;摄像头设备的I2C地址
clocks = <&clks IMX6UL_CLK_CSI>;配置CSI时钟
clock-names = "csi_mclk";时钟名称
pwn-gpios = <&gpio_spi 4 1>;摄像头电源使能引脚,由SN74HC595D 的QE控制。
rst-gpios = <&gpio_spi 5 0>;摄像头复位引脚,此引脚没有用到,所以注释掉此属性。
csi_id = <0>;CSI ID
mclk = <24000000>;摄像头主时钟设置为24M
mclk_source = <0>;时钟源
配置OV5640驱动
在内核源码当中已经集成了OV5640的驱动,路径为:drivers/media/platform/mxc/subdev/ov5640.c。但这个驱动需要修改后才能使用,在ELF 1的资料包当中,提供了修改好的版本,路径为:ELF 1开发板资料包
877