当前位置:   article > 正文

linux kernel 摄像头驱动_ov5640驱动

ov5640驱动
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>;
		};
	};
};  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

![在这里插入图片描述](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

	>;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

csi节点使用摄像头总线

&csi {
	status = "okay";

	port {
		csi1_ep: endpoint {
			remote-endpoint = <&ov5640_ep>;
		};
	};
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

2 修改kernel配置

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

gedit drivers/media/v4l2-core/Kconfig 
  • 1

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

在这里插入图片描述

打开menuconfig配置选项

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

将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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

编译内核和设备树

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

在这里插入图片描述

编译成功
将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/
  • 1
  • 2

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

在这里插入图片描述

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

3 v4l-utils工具安装

apt install v4l-utils
  • 1

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

 #执行命令
 v4l2-ctl --list-devices
  • 1
  • 2

在这里插入图片描述

查看摄像头所有参数

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

在这里插入图片描述

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

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

在这里插入图片描述

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
  • 1

#在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
  • 1

显示结果:

在这里插入图片描述

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 ./
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

unmount.sh的内容

#!/bin/bash
echo "UNMOUNTING"
sudo umount proc
sudo umount sys
sudo umount dev/pts
sudo umount dev
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

在这里插入图片描述

给ubuntu base安装依赖库

apt-get install cmake libjpeg8-dev
  • 1

在这里插入图片描述

进入mjpg-streamer-master

在这里插入图片描述

执行make

在这里插入图片描述

现在主机退出挂载

在这里插入图片描述

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

在这里插入图片描述

查看 start.sh的内容

vi start.sh 
  • 1

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

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

因为我的摄像头的格式是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
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

执行start.sh脚本

在这里插入图片描述

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

http://192.168.4.108:8080/
  • 1

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

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/263297
推荐阅读
相关标签
  

闽ICP备14008679号