赞
踩
1 | 综合篇 | 点我 |
---|---|---|
2 | uboot移植 | 点我 |
3 | uboot lcd驱动 | 点我 |
4 | kernel移植 | 点我 |
5 | kernel lcd驱动 | 点我 |
6 | 摄像头驱动 | 点我 |
7 | ubuntu base移植 | 点我 |
8 | 挂载网络文件系统 | 点我 |
9 | qt移植 | 点我 |
10 | 搭建qt交叉编译 | 点我 |
11 | wifi移植 | 点我 |
笔者所使用的ov5640摄像头,和Linux通信使用的是CSI和I2C协议
开发板摄像头接口原理图:
打开前面的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>;
};
};
};
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>;
};
};
};
打开 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设备
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
可以使用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
显示结果:
下载源码: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/
就可以查看摄像头的内容了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。