V4L2 mode for Raspberry Pi/zh

From wiki_veye
Jump to navigation Jump to search

English

如何在树莓派平台使用VEYE和CS系列摄像头模组(V4L2模式)

1 概述

针对VEYE系列和CS系列摄像头模组在树莓派平台的使用方式,我们提供了类似raspicam模式的应用层开源软件——veye_raspicam软件

该系列软件,无需驱动支持,对piOS不同版本的兼容性好。

但是,我们认为V4L2驱动模式,也有比较广泛的应用场合。两种模式不能同时使用,具体体现在驱动是否安装上。后文会有详细描述。

本文描述怎样在树莓派平台,通过V4L2方式调用VEYE系列和CS系列的摄像头模组。

2 硬件准备及安装

VEYE系列的硬件准备及安装

CS系列的硬件准备及安装

3 树莓派系统配置

树莓派系统配置

4 驱动安装

4.1 下载驱动包

git clone https://github.com/veyeimaging/raspberrypi_v4l2.git

4.2 安装驱动

cd raspberrypi_v4l2/release/

chmod +x *

sudo ./install_driver.sh [camera module]

camera module:可以是veye327,csimx307,cssc132,veyecam2m等。

备注:veyecam2m是新版本驱动,可以替代veye327,支持VEYE系列200w分辨率的所有模组。

然后重启树莓派。

Note: For VEYE-MIPI-IMX327S or VEYE-MIPI-IMX462, please make sure hdver must >= 0x5.

http://wiki.veye.cc/index.php/VEYE-MIPI-IMX327S_version_log

4.3 卸载驱动

如需更换为raspicam模式,或者想要更换成其他摄像头模组型号的驱动,必须要先卸载现在的驱动。

sudo ./uninstall_driver.sh [camera module]

camera module:可以是veye327,csimx307,cssc132等。

4.4 列出支持的模式

v4l2-ctl --list-formats-ext

5 摄像头状态验证

以veye327为例:

dmesg | grep veye

可以看到:

veye327 camera probed
并且/dev/video0 节点存在,证明摄像头状态正常。

如果采用veyecam2m驱动,会提示sensor型号及版型,如:

camera id is veyecam2m

sensor is IMX327

board type is ONE board

veyecam2m camera probed

6 使用VLC预览图像

1. Open VLC with command line vlc , or click the icon to launch.

2. Hit the (Play) button to call the open media window.

3. In Capture Device >> Device Selection >> Video device name, select the camera video node.

4. Hit Advanced Options... button

5. In Advanced Options window >> Video input chroma format, type UYUV.

6. Type in the width and height, for example, 1920 and 1080.

7. Hit OK to save the settings and see the video feed.

Play camera using VLC on RPI
Play camera using VLC on RPI

7 Gstreamer应用范例

export DISPLAY=:0

  • 安装gstreamer

sudo apt-get install gstreamer1.0-tools

sudo apt-get install libx264-dev libjpeg-dev

sudo apt-get install libgstreamer1.0-dev \

     libgstreamer-plugins-base1.0-dev \

     libgstreamer-plugins-bad1.0-dev \

     gstreamer1.0-plugins-ugly \

     gstreamer1.0-tools \

     gstreamer1.0-gl \

     gstreamer1.0-gtk3

  • 抓拍一张图片(VEYE-MIPI-327,CS-MIPI-IMX307 @1080p mode)

gst-launch-1.0 v4l2src num-buffers=1 device=/dev/video0 ! 'video/x-raw, format=(string)UYVY, width=1920,height=1080' ! jpegenc ! filesink location=test_image.jpg

  • 视频预览(VEYE-MIPI-327,CS-MIPI-IMX307 @1080p mode)

gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080,framerate=(fraction)30/1" ! videoconvert ! autovideosink sync=false -v

  • 视频预览(CS-MIPI-IMX307,CS-MIPI-SC132 @720p mode)

gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=(string)UYVY, width=(int)1280, height=(int)720,framerate=(fraction)60/1" ! videoconvert ! autovideosink sync=false -v

  • 视频预览(CS-MIPI-IMX307,CS-MIPI-SC132 @vga mode)

gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=(string)UYVY, width=(int)640, height=(int)480" ! videoconvert ! autovideosink sync=false -v

  • 视频预览(CS-MIPI-SC132 @1280*1080@45 mode)

gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=(string)UYVY, width=(int)1280, height=(int)1080,framerate=(fraction)45/1" ! videoconvert ! autovideosink sync=false -v

  • 帧率测试(VEYE-MIPI-327,CS-MIPI-IMX307 @1080p mode)

gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080,framerate=(fraction)30/1" ! videoconvert ! fpsdisplaysink video-sink=fakesink -v

8 参数控制软件包使用

由于我们的摄像头参数自由度比较高,并没有采用V4L2参数进行控制,而是使用脚本进行参数配置。

https://github.com/veyeimaging/raspberrypi/tree/master/i2c_cmd

VEYE系列参数控制软件包使用说明
CS系列参数控制软件包使用说明

9 CM4的补充说明

cm4支持两路摄像头同时使用,采用上面的步骤安装的dtbo将只能使用CAM1。如需使用两路摄像头,请按如下步骤:

9.1 更新dt-blob.bin

wget https://www.raspberrypi.org/documentation/hardware/computemodule/dt-blob-dualcam.bin

sudo cp dt-blob-dualcam.bin /boot/dt-blob.bin

9.2 更新双摄像头的dtbo

以csimx307,5.10.17-v7l+版本kernel为例:

sudo cp raspberrypi_v4l2/release/driver_bin/5.10.17-v7l+/csimx307-dual-cm4.dtbo /boot/overlays/csimx307.dtbo

sudo reboot

9.3 设备文件说明

CM4模块采用两路I2C分别与两个摄像头通信。

description i2c bus num video node
CAM0 0 video0
CAM1 10 video2

注:只连一个摄像头,无论CAM0还是CAM1,都是video0。

9.4 gstreamer应用范例

export DISPLAY=:0

  • CAM0视频预览(VEYE-MIPI-327,CS-MIPI-IMX307 @1080p mode)

gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080,framerate=(fraction)30/1" ! videoconvert ! fpsdisplaysink videosink=autovideosink sync=false text-overlay=false -v

  • CAM1视频预览(VEYE-MIPI-327,CS-MIPI-IMX307 @1080p mode)

gst-launch-1.0 v4l2src device=/dev/video2 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080,framerate=(fraction)30/1" ! videoconvert ! fpsdisplaysink videosink=autovideosink sync=false text-overlay=false -v

10 源代码编译方法

本节主要参考资料为官方piOS编译方法。我们采用交叉编译的方法,5.4.72版本32bitOS为例进行说明。

以下操作均在ubuntu PC上进行。

10.1 开发环境准备

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

sudo apt install crossbuild-essential-armhf

10.2 下载标准版本

10.2.1 首先,请确认自己的树莓派上的piOS版本:
  • Release version

$ uname -a

Linux raspberrypi 5.4.72-v7l+ #1356 SMP Thu Oct 22 13:57:51 BST 2020 armv7l GNU/Linux

  • Code tag

$ cp /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz ./

gunzip changelog.Debian.gz

查看最上面一条,确定代码tag。

10.2.2 有两种方法可以得到自己想要的版本的源码:

在PC上:

1. 采用git获取到对应branch上的对应tag版本代码

git clone --branch rpi-5.4.y https://github.com/raspberrypi/linux

git checkout raspberrypi-kernel_1.20201022-1

PS:以上两条命令请替换为自己对应的版本。

2. 直接从如下链接手动下载对应tag的版本代码

https://github.com/raspberrypi/linux/tags

10.3 patch我们的驱动代码

  • Driver source code

camera驱动源码路径为: linux/drivers/media/i2c,将camera驱动的源码放到对应目录。

  • Modify the the Makefile and Kconfig files

修改同路径下的Config和Makefile,增加对应camera驱动。

  • dts file

dts文件路径为:linux/arch/arm/boot/dts/overlays,将[camera]-overlay.dts文件放到此路径。

  • Modify dts Makefile

修改同路径下的Makefile,增加对应dts编译选项。

10.4 编译

10.4.1 编译准备

export ARCH=arm

export CROSS_COMPILE=arm-linux-gnueabihf-

不同树莓派的编译选项不同,区别如下:

  • Raspberry Pi 1, Pi Zero, Pi Zero W, and Compute Module default build configuration

KERNEL=kernel

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

  • Raspberry Pi 2, Pi 3, Pi 3+, and Compute Module 3 default build configuration

KERNEL=kernel7

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

  • Raspberry Pi 4 default build configuration

KERNEL=kernel7l

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

10.4.2 增加编译选项

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

增加对应camera模块驱动的编译选项,linux5.4版本路径为driver-->multimedia-->i2c;

5.10版本kernel的路径是Device Drivers --> Multimedia Support --> Media ancillary drivers --> Camera sensor devices。

10.4.3 编译输出

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4

11 参考资料

  • 树莓派的piOS编译方案:

https://www.raspberrypi.org/documentation/linux/kernel/building.md

12 本文历史记录

- 20211125

增加VLC播放图像一节