项目场景:

这里简述项目相关背景:

最近在准备暑期实习和秋招,准备一个Camera项目,涉及调试内核、优化开机——从启动到获取第一帧图像的时间,硬件平台为正点原子IMX6ULL开发板,摄像头为OV5640,内核基于正点原子出厂linux源码,根文件系统暂时选择正点原子出厂文件系统


项目小目标

首先实现开发板开机摄像头的自启动,后续再进行内核调试,优化开机

实现步骤如下:

一、驱动模块
1、准备工具
2、设备树配置
3、源码拷贝
4、配置文件
5、编译生成驱动模块
二、板子应用程序
三、上机实验


项目Bug

起初根据博客指引移植OV5640模块,在开发板上加载模块成功,但是使用正点原子摄像头应用编程项目代码生成的v4l2_camera可执行文件,执行./v4l2_camera /dev/video1后,程序异常返回:

ioctl error:  VIDIOV_S_FMT: invalid argument

原因分析

查资料后得知这个问题很多人遇到过,原因是采取的编码与设备的支持的编码不兼容,又从正点原子的用户快速体验文档中得知:在正点原子出厂内核 v1.6 版本之前(请在 1.2.2 小节查看出厂内核历
史版本,检查用户所处的固件版本)是不支持 RGB565 和 JPEG 采集的
,可在开发板文件系统中执行如下命令查看摄像头支持格式、分辨率及帧率

v4l2-ctl --device=/dev/video1 --list-formats-ext

笔者使用的是正点原子驱动教程使用的Linux源码,有没有可能这份内核并不支持RGB565格式呢,试试就逝世:果不其然,笔者敲下这行命令后,显示仅支持YUYV格式,而LCD显示好像是需要RGB格式的数据,这就涉及到YUYV格式和RGB格式的转换,在博客上找到了相关代码,对摄像头应用编程代码进行修改,但遗憾未成功,毕竟摄像头V4L2编程这块的知识还没去系统学习过,这个转换暂时搁置,后面再来解决,害

解决方案:

此路不通,换条路呗

换用正点原子资料包中的出厂源码,经查是V1.6版本之后的

重复上述移植模块步骤,编译出mx6s_capture和ov5640_camera两个驱动模块,并将出厂源码编译后的镜像和设备树通过tftp挂载,经测试成功显示出摄像头画面!

开机自动加载模块

摄像头驱动需要的两个模块mx6s_capture和ov5640_camera是以模块的形式存在,我们还需要配置启动文件来加载内核模块:启动文件一般位于/etc目录下,我的文件系统中内核模块配置文件存放在/etc/modprobe.d/中,进入文件夹,vi打开文件,添加mx6s_capture和ov5640_camera,保存退出即可,重启系统执行lsmod发现,摄像头模块已加载

开机启动摄像头画面获取

成功加载摄像头模块后还需要执行摄像头应用软件来调用摄像头提供的设备文件/dev/video1:同样是在/etc目录下,在/etc/rc.local文件中,添加可执行文件调用命令:添加后保存退出

cd xxx(摄像头程序所在目录)
./v4l2_camera /dev/video1

配置文件修改完后,执reboot命令重启系统,摄像头开机自启动成功!