22. 摄像头

22.1. 使能设备树插件

想要使能OV5640摄像头需要使能74hc595和cam两个设备树插件, 同时摄像头设备树插件和LED的设备树插件用到重复的引脚,需关闭LED相关的设备树插件, 如果还想要在LCD液晶屏上显示摄像头的内容还需要使能lcd的设备树插件, 如下所示

/boot/uEnv.txt
1
2
3
4
 dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-74hc595.dtbo
 dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-cam.dtbo
 dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-lcd.dtbo
 #dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-led.dtbo

22.2. v4l-utils工具使用

v4l-utils工具安装

1
 sudo apt install v4l-utils

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

1
2
3
4
5
6
7
8
9
 #执行命令
 v4l2-ctl --list-devices

 #显示信息如下
 i.MX6S_CSI (platform:21c4000.csi):
         /dev/video1

 pxp (pxp_v4l2):
         /dev/video0

查看摄像头所有参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 #执行命令
 sudo v4l2-ctl -d  /dev/video1 --all


 #显示信息如下
 Driver Info:
         Driver name      : mx6s-csi
         Card type        : i.MX6S_CSI
         Bus info         : platform:21c4000.csi
         Driver version   : 4.19.35
         Capabilities     : 0x84200001
                 Video Capture
                 Streaming
                 Extended Pix Format
                 Device Capabilities
         Device Caps      : 0x04200001
                 Video Capture
                 Streaming
                 Extended Pix Format
 Priority: 0
 Video input : 0 (Camera: ok)
 Format Video Capture:
         Width/Height      : 0/0
         Pixel Format      : ''
         Field             : Any
         Bytes per Line    : 0
         Size Image        : 0
         Colorspace        : Default
         Transfer Function : Default (maps to Rec. 709)
         YCbCr/HSV Encoding: Default (maps to ITU-R 601)
         Quantization      : Default (maps to Full Range)
         Flags             :
 Crop Capability Video Capture:
         Bounds      : Left 0, Top 0, Width 0, Height 0
         Default     : Left 0, Top 0, Width 0, Height 0
         Pixel Aspect: 1/1
 Crop: Left 0, Top 0, Width 0, Height 0
 Streaming Parameters Video Capture:
         Capabilities     : timeperframe
         Frames per second: 30.000 (30/1)
         Read buffers     : 0

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 #执行命令
 sudo v4l2-ctl --list-formats-ext -d /dev/video1

 #显示信息如下
 ioctl: VIDIOC_ENUM_FMT
         Type: Video Capture

         [0]: 'YUYV' (YUYV 4:2:2)
                 Size: Discrete 640x480
                         Interval: Discrete 0.067s (15.000 fps)
                         Interval: Discrete 0.033s (30.000 fps)
                 Size: Discrete 320x240
                         Interval: Discrete 0.067s (15.000 fps)
                         Interval: Discrete 0.033s (30.000 fps)
                 Size: Discrete 720x480
                         Interval: Discrete 0.067s (15.000 fps)
                         Interval: Discrete 0.033s (30.000 fps)
                 Size: Discrete 720x576
                         Interval: Discrete 0.067s (15.000 fps)
                         Interval: Discrete 0.033s (30.000 fps)
                 Size: Discrete 1280x720
                         Interval: Discrete 0.067s (15.000 fps)
                         Interval: Discrete 0.033s (30.000 fps)
                 Size: Discrete 1920x1080
                         Interval: Discrete 0.067s (15.000 fps)
                 Size: Discrete 2592x1944
                         Interval: Discrete 0.067s (15.000 fps)
                 Size: Discrete 176x144
                         Interval: Discrete 0.067s (15.000 fps)
                         Interval: Discrete 0.033s (30.000 fps)
                 Size: Discrete 1024x768
                         Interval: Discrete 0.067s (15.000 fps)
                         Interval: Discrete 0.033s (30.000 fps)

22.3. 安装gstreamer

可以使用gstreamer对摄像头做个简单测试,安装命令如下 (当开发板已经烧录了带QT库镜像时不用执行)

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

22.3.1. 简单测试

使用以下命令可对摄像头进行录制视频、拍照或将摄像头的拍摄到的视频显示到显示屏上。

1
2
3
4
5
6
7
8
9
 #录制视频
 sudo gst-launch-1.0 -v v4l2src device=/dev/video1 ! "video/x-raw, format=(string)YUY2, width=(int)640,height=(int)480, framerate=(fraction)15/1" ! videoconvert ! avimux ! filesink location=webcam.avi


 #在LCD屏幕上显示摄像头的内容
 sudo gst-launch-1.0 -v v4l2src device=/dev/video1 ! "video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, framerate=(fraction)15/1" ! videoconvert ! fbdevsink

 #拍照 (拍照命令对使用OV5640摄像头有问题,建议使用 USB免驱摄像头 章节部分的用的摄像头)
 sudo gst-launch-1.0 v4l2src num-buffers=1 device=/dev/video1 ! jpegenc ! filesink location=picture.jpg

22.4. 摄像头设备树插件

野火imx6ull提供了很多的设备树插件源码,若想要修改不同的引脚作为v5640摄像头的引脚, 可参考:

设备树插件 imx-fire-cam-overlay.dts ,源码如下所示

/arch/arm/boot/dts/overlays/ebf/imx-fire-cam-overlay.dts
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 /dts-v1/;
 /plugin/;

 #include "imx6ul-pinfunc.h"
 #include "dt-bindings/gpio/gpio.h"
 #include "dt-bindings/clock/imx6ul-clock.h"
 #include "imx6ull-pinfunc-snvs.h"
 / {
     fragment@0 {
         target=<&i2c2>;
         __overlay__ {
                     #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>;
                             };
                         };
                     };
         };
     };
         fragment@1 {
             target=<&iomuxc>;
             __overlay__ {
                         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
                             >;
                     };

             };
         };
         fragment@2 {
             target = <&csi>;
             __overlay__ {
                 status = "okay";  /* 摄像头总线使能 */

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

 };

若想更改使用具有csi功能的引脚只需修改上面的标记部分的内容即可。

22.5. USB免驱摄像头

当插入UVC(全称USB Video Class)免驱摄像头时, 内核将会打印信息,使用lsusb再次查看lsusb设备时可发现多了一个新的USB设备。 同时在 /dev/ 目录下将多出新的video设备,其中 /dev/video2 则为USB摄像头设备, 不同板子的摄像头设备文件可能不同。

本实验使用的设备为 罗技 B525摄像头 (或者找其他树莓派可以使用的USB免驱摄像头)

注意得支持USB2.0的,可以先在PC上的ubuntu测试可以用再在板子上试。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 root@npi:~# lsusb
 Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
 root@npi:~# [ 1988.776119] usb 1-1.3: new high-speed USB device number 4 using ci_hdrc
 [ 1991.298210] uvcvideo: Found UVC 1.00 device HD Pro Webcam C920 (046d:082d)
 [ 1991.324787] input: HD Pro Webcam C920 as /devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.3/1-1.3:1.0/input/input3

 root@npi:~# lsusb
 Bus 001 Device 004: ID 046d:082d Logitech, Inc. HD Pro Webcam C920
 Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 root@npi:~# ls -l  /dev/video*
 crw-rw---- 1 root video 81, 0 Feb  2 10:36 /dev/video0
 crw-rw---- 1 root video 81, 1 Feb  2 10:36 /dev/video1
 crw-rw---- 1 root video 81, 2 Feb  2 10:36 /dev/video2
 crw-rw---- 1 root video 81, 3 Feb  2 10:36 /dev/video3

若提示找不到lsusb命令,可使用 sudo apt install usbutils 安装usbutils。

关于USB摄像头的相关操作与章节前面介绍的OV5640摄像头控制方式完全相同,请参照章节前面说明。