在imx6ull中加入ov5640模块

本来觉得是一件很简单的事情但是走了很多的弯路,记录一下调试过程。

  1. 先使用正点原子提供的出厂内核把摄像头影像调试出来,然后cat /dev/video1,看一下video1牵扯到哪些模块,可以看到需要ov5640_camera.ko和 mx6s_capture.ko这两个模块。

root@ATK-IMX6U:/mnt/mxc/subdev# cat /dev/video1
[ 234.765777] ------------[ cut here ]------------
[ 234.770851] WARNING: CPU: 0 PID: 1362 at drivers/media/v4l2-core/videobuf2-core.c:2822 __vb2_init_fileio+0x124/0x31c()
[ 234.783858] Modules linked in: ov5640_camera mx6s_capture icm20608(O)
[ 234.791720] CPU: 0 PID: 1362 Comm: cat Tainted: G W O 4.1.15 #1
[ 234.798753] Hardware name: Freescale i.MX6 Ultralite (Device Tree)
[ 234.805019] [<80015dbc>] (unwind_backtrace) from [<80012748>] (show_stack+0x10/0x14)
[ 234.812783] [<80012748>] (show_stack) from [<8081e1ec>] (dump_stack+0x84/0xc4)
[ 234.820061] [<8081e1ec>] (dump_stack) from [<80036bc0>] (warn_slowpath_common+0x80/0xb0)
[ 234.828196] [<80036bc0>] (warn_slowpath_common) from [<80036c8c>] (warn_slowpath_null+0x1c/0x24)
[ 234.837019] [<80036c8c>] (warn_slowpath_null) from [<80549ac8>] (__vb2_init_fileio+0x124/0x31c)
[ 234.845760] [<80549ac8>] (__vb2_init_fileio) from [<8054a51c>] (__vb2_perform_fileio+0x498/0x5e4)
[ 234.854685] [<8054a51c>] (__vb2_perform_fileio) from [<8054a680>] (vb2_read+0x18/0x20)
[ 234.862625] [<8054a680>] (vb2_read) from [<7f004c70>] (mx6s_csi_read+0x4c/0x64 [mx6s_capture])
[ 234.871303] [<7f004c70>] (mx6s_csi_read [mx6s_capture]) from [<80532818>] (v4l2_read+0x60/0x98)
[ 234.880046] [<80532818>] (v4l2_read) from [<800e9c90>] (__vfs_read+0x20/0xd4)
[ 234.887220] [<800e9c90>] (__vfs_read) from [<800ea428>] (vfs_read+0x7c/0x104)
[ 234.894392] [<800ea428>] (vfs_read) from [<800eacc8>] (SyS_read+0x44/0x9c)
[ 234.901280] [<800eacc8>] (SyS_read) from [<8000f480>] (ret_fast_syscall+0x0/0x3c)
[ 234.915272] —[ end trace ed21faed4da06c6d ]—

以下调试都是在nxp原厂内核基础上进行的, 这是为了学习

  1. 查看ov5640_camera.ko和 mx6s_capture.ko相关的Makefile和config配置,可见内核需要配置VIDEO_MXC_CSI_CAMERA和MXC_CAMERA_OV5640两个配置项。

Makefile:
obj-$(CONFIG_VIDEO_MXC_CSI_CAMERA) += mx6s_capture.o

ov5640_camera-objs := ov5640.o
obj-$(CONFIG_MXC_CAMERA_OV5640) += ov5640_camera.o

Kconfig:
config VIDEO_MXC_CSI_CAMERA
tristate “CSI camera support”
depends on VIDEO_MXC_CAPTURE && VIDEO_V4L2
—help—
This is the video4linux2 capture driver based on CSI module.

config MXC_CAMERA_OV5640
tristate “OmniVision ov5640 camera support”
depends on VIDEO_MXC_CAPTURE && I2C
—help—
If you plan to use the ov5640 Camera with your MXC system, say Y here.

  1. 当然,仅仅配置那两项肯定是不行的,经过了几次尝试后后发现能让影像输出的配置如下。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. NXP原厂提供ov5640.c驱动文件不能自动调整ffmpeg命令设定的分辨率,所以要把ffmpeg推流的分辨率设定为驱动默认的分辨率,不然会花屏,无法辨认物体。相反正点原子出厂的ov5640.c驱动可以自动调整分辨率和帧率,所以把驱动替换成正点原子出厂的驱动ov5640.c也行。

  3. 重新使用正点原子手册《I.MX6U嵌入式Linux C应用编程指南V1.4.pdf》第三十四章 实战小项目之视频监控,把影像调试了出来。在这里插入图片描述
    后记:
    后来发现NXP源码会导致图形向左偏移,间隔十几秒移动一下。凭感觉应该是csi影像信号时序的问题。
    在这里插入图片描述
    最后查看ov5640手册,需要在ov5640_global_init_setting[]数组添加信号极性设定{0x4740, 0x21, 0, 0}。添加以后就不会再偏移了。
    在这里插入图片描述
    那么为什么ov5640要设置VSYNC和PCLK的极性呢?当然要看imx6ull的规格书了。如规格书中所示,IMX6ULL csi接口被设置成了Gated Clock Mode.

在这里插入图片描述
Gated Clock Mode是在CSI_CSICR1寄存器中设置的:
在这里插入图片描述
在这里插入图片描述
跟踪IMX6ULL的代码mx6s_capture.c我们找到了csi接口的确是被设置成了Gated Clock Mode模式。

在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值