在imx6ull接入ov2640

1.硬件连接

ov2640模组: 

imx6ull摄像头模块接口

 注意两个引脚:CSI_PWDN,CSI_RESET,在ov2640的datasheet中关于上电顺序有如下说明

ov2640正常上电时,Reset引脚应该为高, PDWN为低电平。

问题1:摄像头一直没有枚举成功,i2cdetect扫不到该ic,最终定位的原因为PDWN引脚的电平不对;

实际测量PDWN引脚,电压为1.5v,理论上为低电平,具体2640的ic怎么处理的不得而知。具体的改动就是把PDWN引脚接地,强制其为低电平,改动在ov2640原理图中红色标注部分。修改后进入板端,摄像头正常接入如下:

模组的i2c地址为0x30,使用i2cdetect能扫描到该地址,笔者在此处显示为UU是因为设备树已经将该设备挂到i2c1下面了,如果没有适配设备树,在对应位置显示30也是正常的。

2.适配kernel

2.1新增ov2640的相关节点配置

    ov2640: 0v2640@0x30 {
            compatible = "ovti,ov2640";
            reg = <0x30>;
            status = "okay";
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_csi1>;
            resetb = <&gpio_spi 5 0>;
            pwdn = <&gpio_spi 6 1>;
            clocks = <&clks IMX6UL_CLK_CSI>;
            clock-names = "xvclk";
			assigned-clocks = <&clks IMX6UL_CLK_CSI>;
			assigned-clock-rates = <24000000>;
            port {
                ov2640_ep: endpoint {
                	remote-endpoint = <&csi1_ep>;
					bus-width = <8>;
                	};
                };
    };

&csi {
	status = "okay";

	port {
		csi1_ep: endpoint {
			remote-endpoint = <&ov2640_ep>;
		};
	};
};

ov2640成功probe后,在日志中会有如下打印

 问题2:只有前两条打印没有第三条打印,定位到CSI没有被probe,在编译log中搜索mx6s_capture,发现内核没有编译该文件。

2.2修改编译配置

右边为新增的编译宏

修改后,内核编译了mx6s_capture,并创建了video设备,进入板端查看设备,正常如下:

问题3:笔者原来只有video0,在应用层对video0进行操作,一直报video0不是capture设备,笔者纠结了很久,最后把video的driver字段打出来发现不对,才定位到是内核没有注册模组对应的设备。

问题4:在枚举video设备支持的图像格式时,报错,报错如下:

 修改mx6s_capture.c中的formats定义,修改后如下:

static struct mx6s_fmt formats[] = {
	{
		.name		= "UYVY-16",
		.fourcc		= V4L2_PIX_FMT_UYVY,
		.pixelformat	= V4L2_PIX_FMT_UYVY,
		.mbus_code	= MEDIA_BUS_FMT_UYVY8_2X8,
		.bpp		= 2,
	}, {
		.name		= "YUYV-16",
		.fourcc		= V4L2_PIX_FMT_YUYV,
		.pixelformat	= V4L2_PIX_FMT_YUYV,
		.mbus_code	= MEDIA_BUS_FMT_YUYV8_2X8,
		.bpp		= 2,
	}, {
		.name		= "YUV32 (X-Y-U-V)",
		.fourcc		= V4L2_PIX_FMT_YUV32,
		.pixelformat	= V4L2_PIX_FMT_YUV32,
		.mbus_code	= MEDIA_BUS_FMT_AYUV8_1X32,
		.bpp		= 4,
	}, {
		.name		= "RAWRGB8 (SBGGR8)",
		.fourcc		= V4L2_PIX_FMT_SBGGR8,
		.pixelformat	= V4L2_PIX_FMT_SBGGR8,
		.mbus_code	= MEDIA_BUS_FMT_SBGGR8_1X8,
		.bpp		= 1,
	}, {
		.name		= "RGB565_LE",
		.fourcc		= V4L2_PIX_FMT_RGB565,
		.pixelformat	= V4L2_PIX_FMT_RGB565,
		.mbus_code	= MEDIA_BUS_FMT_RGB565_2X8_LE,
		.bpp		= 2,
	}, {
		.name		= "RGB565_BE",
		.fourcc		= V4L2_PIX_FMT_RGB565,
		.pixelformat	= V4L2_PIX_FMT_RGB565,
		.mbus_code	= MEDIA_BUS_FMT_RGB565_2X8_BE,
		.bpp		= 2,
	}, {
		.name		= "JPEG",
		.fourcc		= V4L2_PIX_FMT_JPEG,
		.pixelformat	= V4L2_PIX_FMT_JPEG,
		.mbus_code	= MEDIA_BUS_FMT_JPEG_1X8,
		.bpp		= 2,
	}
};

3.适配应用层验证

 到这儿,终于出图了,又出现了新的问题。

问题5:笔者的显示屏是1024x600大小的,但是图像永远只有1024x300,获取的摄像头的原始数据300行以后的数据全为0;

设置视频格式时,改成了640x480,终于每一个像素点都有有效数据。具体为什么图像传大了就存在大量无效数据,笔者暂时也没有弄明白原因。

最后贴一个效果图:

图像清晰度很好,视频存在卡顿的情况。

你好!对于imx6ull摄像头驱动ov2640,您可以按照以下步骤进行配置和驱动: 1. 首先,确保您的imx6ull开发板已经正确连接了ov2640摄像头模块。 2. 在Linux系统中,您需要检查并确保i2c总线已经启用。可以通过命令`ls /dev/i2c*`来查看是否存在i2c设备。 3. 安装v4l2工具包,可以通过以下命令安装: ``` sudo apt-get install v4l-utils ``` 4. 下载并编译ov2640驱动源码。您可以从官方网站或GitHub上找到适用于imx6ullov2640驱动源码。 5. 在编译驱动之前,您需要为imx6ull配置适当的内核选项。打开内核配置文件(位于`/path/to/linux/source/.config`),确保以下选项已启用: ``` CONFIG_VIDEO_DEV=y CONFIG_VIDEO_V4L2_SUBDEV_API=y CONFIG_VIDEO_V4L2=y CONFIG_V4L2_MEM2MEM_DEV=y CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_DMA_SG=y ``` 6. 编译驱动代码并生成ko文件。根据驱动源码提供的说明进行编译,并生成ov2640.ko文件。 7. 将生成的ov2640.ko文件复制到imx6ull开发板上。 8. 使用`insmod`命令加载驱动: ``` sudo insmod ov2640.ko ``` 9. 确认驱动已成功加载并工作。您可以使用v4l2-ctl命令来测试摄像头: ``` v4l2-ctl -d /dev/video0 --list-formats-ext ``` 以上是一般的步骤,具体的驱动配置和编译过程可能因您使用的Linux发行版和驱动源码而有所不同。请确保在操作之前参考相关文档和指南。祝您成功驱动imx6ull摄像头ov2640!如有更多问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值