linux kernel 摄像头驱动

本文详细介绍了如何在Linux平台移植和配置OmniVision OV5640摄像头,涉及设备树修改、kernel配置、V4L2支持、gstreamer应用及mjpg-streamer流媒体服务器搭建。通过步骤教你完成从硬件接入到实时视频流的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1综合篇点我
2uboot移植点我
3uboot lcd驱动点我
4kernel移植点我
5kernel lcd驱动点我
6摄像头驱动点我
7ubuntu base移植点我
8挂载网络文件系统点我
9qt移植点我
10搭建qt交叉编译点我
11wifi移植点我

笔者所使用的ov5640摄像头,和Linux通信使用的是CSI和I2C协议

在这里插入图片描述

1 修改设备树

开发板摄像头接口原理图:

在这里插入图片描述

打开前面的imx6ull-user-emmc.dts文件
在i2c节点中添加

#address-cells = <1>;
#size-cells = <0>;        
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 6 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>;
		};
	};
};  

![在这里插入图片描述](https://img-blog.csdnimg.cn/5416a23b0fdb45738996ae2e1148b33b.png

iomuxc的pinctrl_csi1子节点内容修改为:

pinctrl_csi1: csi1grp {
	fsl,pins = <
		MX6UL_PAD_CSI_MCLK__CSI_MCLK		0x1b088
		MX6UL_PAD_CSI_PIXCLK__CSI_PIXCLK	0x1b088
		MX6UL_PAD_CSI_VSYNC__CSI_VSYNC		0x1b088
		MX6UL_PAD_CSI_HSYNC__CSI_HSYNC		0x1b088
		MX6UL_PAD_CSI_DATA00__CSI_DATA02	0x1b088
		MX6UL_PAD_CSI_DATA01__CSI_DATA03	0x1b088
		MX6UL_PAD_CSI_DATA02__CSI_DATA04	0x1b088
		MX6UL_PAD_CSI_DATA03__CSI_DATA05	0x1b088
		MX6UL_PAD_CSI_DATA04__CSI_DATA06	0x1b088
		MX6UL_PAD_CSI_DATA05__CSI_DATA07	0x1b088
		MX6UL_PAD_CSI_DATA06__CSI_DATA08	0x1b088
		MX6UL_PAD_CSI_DATA07__CSI_DATA09	0x1b088

	>;
};

在这里插入图片描述

csi节点使用摄像头总线

&csi {
	status = "okay";

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

在这里插入图片描述

2 修改kernel配置

打开 v4l2-core文件下的Kconfig文件

gedit drivers/media/v4l2-core/Kconfig 

找到 VIDEOBUF2_DMA_CONTIG 这个配置选项,可以看到这个选项虽然tristate类型,但是却没有说明语句,导致在menuconfig无法显示出来给我们配置,我们可以手动加入说明语句让它在menuconfig显示出来,也可以在下面添加"default y"默认编译进内核中

在这里插入图片描述

打开menuconfig配置选项

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

将V4L platform devices 的配置修改如下

-> Device Drivers
	-> <*> Multimedia support
		->[ * ]   V4L platform devices  ---> 
        	-> <*>   MXC Video For Linux Video Output                                                                                                
           	-> <*>   MXC Video For Linux Video Capture             
           		amera/V4L2 PRP Features support  --->            
           		 	-> <*> OmniVision ov5640 camera support                            
					-> < > OmniVision ov5642 camera support                                            
 					-> <*> OmniVision ov5640 camera support using mipi     
 					-> < > Analog Device adv7180 TV Decoder Input support                              
 				    -> <*> Select Overlay Rounting (Queue ipu device for overlay library)  --->       
 				    -> <*> Pre-processor Encoder library                           
 				    -> <*> IPU CSI Encoder library                                             
        	-> <*>   IPU v4l2 output support                    
        	-> <*>   MXC PxP V4L2 driver
        	-> <*>   CSI camera support                                                                                                              
        	-> <*>   OmniVision ov5640 camera support 

编译内核和设备树

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 

在这里插入图片描述

编译成功
将zImage和imx6ull-user-emmc.dtb文件拷贝到挂载网络文件系统的文件夹下,设置网络文件系统可参考《挂载网络文件系统》这边文章

cp arch/arm/boot/zImage /home/work/imx6ull/rootfs/zImage/
cp arch/arm/boot/dts/imx6ull-user-emmc.dtb /home/work/imx6ull/rootfs/zImage/

给开发板重新上电进入系统

在这里插入图片描述

可以看到/dev/下连个两个video设备

3 v4l-utils工具安装

apt install v4l-utils

查看可用的视频设备,其中/dev/video0对应OV5640的物理设备

 #执行命令
 v4l2-ctl --list-devices

在这里插入图片描述

查看摄像头所有参数

 #执行命令
 sudo v4l2-ctl -d  /dev/video0 --all

在这里插入图片描述

查看摄像头所支持的分辨率

 #执行命令
 v4l2-ctl --list-formats-ext -d /dev/video0

在这里插入图片描述

4 安装gstreamer

可以使用gstreamer对摄像头做个简单测试,安装命令如下

apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools

#在LCD屏幕上显示摄像头的内容

gst-launch-1.0 -v v4l2src device=/dev/video0 ! "video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, framerate=(fraction)15/1" ! videoconvert ! fbdevsink

显示结果:

在这里插入图片描述

5 搭建mjpeg-streamer流媒体服务器

下载源码:https://github.com/chen3135/mjpg-streamer
在主机中下载好之后将文件拷贝到主机创建给开发板的挂载板网络文件系统中的opt下解压

在这里插入图片描述

解压之后得到的文件

在这里插入图片描述

解压之后回到网络文件系统的根目录

在这里插入图片描述

这里有一个主机挂载ubuntu base的脚本和退出挂载的脚本
mount.sh的内容

#/bin/bash
sudo mount -t proc /proc proc
sudo mount -t sysfs /sys sys
sudo mount -o bind /dev dev
sudo mount -o bind /dev/pts dev/pts
sudo chroot ./

unmount.sh的内容

#!/bin/bash
echo "UNMOUNTING"
sudo umount proc
sudo umount sys
sudo umount dev/pts
sudo umount dev

在主机中执行执行mount.sh挂载ubuntu base

在这里插入图片描述

给ubuntu base安装依赖库

apt-get install cmake libjpeg8-dev

在这里插入图片描述

进入mjpg-streamer-master

在这里插入图片描述

执行make

在这里插入图片描述

现在主机退出挂载

在这里插入图片描述

现在启动开发板,在开发板中进入/opt/mjpg-streamer-master

在这里插入图片描述

查看 start.sh的内容

vi start.sh 

查看发现里面只有这个语句是有用的

./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -u  -f 50" -o "./output_hh ttp.so -w ./www"

因为我的摄像头的格式是YUYV的格式,所以在我这里需要加上-y 1指定格式,否则会报错

-y 1 表示使用 V4L2_PIX_FMT_YUYV
-y 2 表示使用 V4L2_PIX_FMT_YVYU
-y 3 表示使用 V4L2_PIX_FMT_UYVV
-y 4 表示使用 V4L2_PIX_FMT_VYUY

在这里插入图片描述

执行start.sh脚本

在这里插入图片描述

我开发板的ip是192.168.4.108,在win11下用浏览器打开

http://192.168.4.108:8080/

就可以查看摄像头的内容了

在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值