在imx6ull接入ov2640

在imx6ull接入ov26401 硬件连接 ov2640 模组 imx6ull 摄像头模块接口 注意两个引脚 CSI PWDN CSI RESET 在 ov2640 的 datasheet 中关于上电顺序有如下说明 ov2640 正常上电时 Reset 引脚应该为高 PDWN 为低电平 问题 1

大家好,我是讯享网,很高兴认识大家。

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 = <>; 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,终于每一个像素点都有有效数据。具体为什么图像传大了就存在大量无效数据,笔者暂时也没有弄明白原因。

最后贴一个效果图:

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

小讯
上一篇 2025-01-12 08:00
下一篇 2025-03-06 15:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/34639.html