总述

   最近在看摄像头驱动,需要配置虚拟摄像头的驱动,但是教程里面是linux2.6内核的,实际电脑的是Ubuntu16,内核是linux4.15版本,从2.6到4.15内核好多文件发生了变化,所以我们该怎么操作呢?下面就让我给大家介绍一哈,怎么下载最新的内核并进行编译成虚拟摄像头驱动。


 

1 查看并下载源码

使用命令查看当前系统的内核

uname -a

Linux lyn 4.15.0-117-generic #118~16.04.1-Ubuntu SMP Tue Sep 8 14:54:40 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

 

linux 摄像头监控motion linux开启摄像头_linux 摄像头监控motion

 

 

linux 摄像头监控motion linux开启摄像头_摄像头驱动_02

linux 摄像头监控motion linux开启摄像头_linux_03

 

可以看到内核版本是4.15,然后我们就可以去下载源码去了

 

去www.kernel.org找同版本的内核,如果没有请找最相近的内核代码

linux 摄像头监控motion linux开启摄像头_linux_04

linux 摄像头监控motion linux开启摄像头_linux_05

 

linux 摄像头监控motion linux开启摄像头_摄像头驱动_06

linux 摄像头监控motion linux开启摄像头_加载_07

 

linux 摄像头监控motion linux开启摄像头_linux_08

linux 摄像头监控motion linux开启摄像头_加载_09

因为我的版本已经是4.15属于v4.x,所以选择了v4.x进入

 

linux 摄像头监控motion linux开启摄像头_加载_10

linux 摄像头监控motion linux开启摄像头_linux_11

最后用网页搜索选择了4.15的一个版本进行了下载

 

linux 摄像头监控motion linux开启摄像头_linux_12

linux 摄像头监控motion linux开启摄像头_linux 摄像头监控motion_13

 

tar xzf linux-4.15.1.tar.gz 解压文件

 

linux 摄像头监控motion linux开启摄像头_linux_14

新版本的linux下已经更名为vivid,可以用find寻找一下目录

 

linux 摄像头监控motion linux开启摄像头_linux_15

linux 摄像头监控motion linux开启摄像头_加载_16

之后就把

linux-4.15.1/drivers/media/platform/vivid/

目录下所有文件拷贝的一个文件夹下

 

linux 摄像头监控motion linux开启摄像头_linux_17

linux 摄像头监控motion linux开启摄像头_linux_18

 

 

2 进行VIVID驱动编译

首先我们看一下,在vivid文件目录下本来的Makefile文件,这个Makefile编译之后选项配置由CONFIG_VIDEO_VIVID这个变量控制,显然不符合我们的要求

linux 摄像头监控motion linux开启摄像头_linux_19

linux 摄像头监控motion linux开启摄像头_linux_20

 

    首先编译我们需要选择编译的内核目录,首先我在linux的usr(usr被称为是Unix System Resource,即Unix系统资源的缩写。/usr 是系统核心所在,包含了所有的共享文件。它是 unix 系统中最重要的目录之一,涵盖了二进制文件,各种文档,各种头文件,还有各种库文件;还有诸多程序,例如 ftp,telnet 等等。)目录下寻找。

 

cd /usr/src/linux......

 

linux 摄像头监控motion linux开启摄像头_加载_21

这样就可以看到对应的内核目录了

linux 摄像头监控motion linux开启摄像头_摄像头驱动_22

linux 摄像头监控motion linux开启摄像头_加载_23

 

经过添加内核目录,然后添加上需要编译的文件,一个简单的驱动Makefile就做好了,当然这个也不是最完美的,请听我一一道来。

KERN_DIR = /usr/src/linux-headers-4.15.0-118-generic

all:
  make -C $(KERN_DIR) M=`pwd` modules
clean:
  make -C $(KERN_DIR) M=`pwd` modules clean
  rm -rf modules.order

obj-m := vivid-core.o vivid-ctrls.o vivid-vid-common.o vivid-vbi-gen.o \
                vivid-vid-cap.o vivid-vid-out.o vivid-kthread-cap.o vivid-kthread-out.o \
                vivid-radio-rx.o vivid-radio-tx.o vivid-radio-common.o \
                vivid-rds-gen.o vivid-sdr-cap.o vivid-vbi-cap.o vivid-vbi-out.o \
                vivid-osd.o vivid-cec.o

 

linux 摄像头监控motion linux开启摄像头_linux 摄像头监控motion_24

 

开始进行编译,出现一个error

 

/work/driver_and_test/vivid/vivid-ctrls.c:In function ‘vivid_vid_cap_s_ctrl’:
/work/driver_and_test/vivid/vivid-ctrls.c:346:3:error: ‘V4L2_COLORSPACE_ADOBERGB’ undeclared (first use in this function)
  V4L2_COLORSPACE_ADOBERGB,
   ^
/work/driver_and_test/vivid/vivid-ctrls.c:346:3:note: each undeclared identifier is reported only once for each function itappears in
scripts/Makefile.build:337: recipe fortarget '/work/driver_and_test/vivid/vivid-ctrls.o' failed
make[2]: ***[/work/driver_and_test/vivid/vivid-ctrls.o] Error 1

 

linux 摄像头监控motion linux开启摄像头_加载_25

出现了未定义V4L2_COLORSPACE_ADOBERGB变量的error

但是在正则表达式去搜索文件定义的时候发现vivid目录下所有文件都没有定义过,所以我直接选择进行出问题的地方进行注释

 

linux 摄像头监控motion linux开启摄像头_加载_26

linux 摄像头监控motion linux开启摄像头_摄像头驱动_27

 

vi vivid-ctrls.c +346 //注释掉相关定义

 

linux 摄像头监控motion linux开启摄像头_摄像头驱动_28

linux 摄像头监控motion linux开启摄像头_linux_29

linux 摄像头监控motion linux开启摄像头_linux 摄像头监控motion_30

 

继续编译出现另一处类似的错误,继续注释掉

linux 摄像头监控motion linux开启摄像头_linux_31

linux 摄像头监控motion linux开启摄像头_linux_32

linux 摄像头监控motion linux开启摄像头_摄像头驱动_33

linux 摄像头监控motion linux开启摄像头_linux 摄像头监控motion_34

linux 摄像头监控motion linux开启摄像头_加载_35

linux 摄像头监控motion linux开启摄像头_加载_36

 

不过这次用这个Makefile编译完之后,我们编译出了好多个.ko文件,在实际加载驱动时候很不方便

 

linux 摄像头监控motion linux开启摄像头_摄像头驱动_37

linux 摄像头监控motion linux开启摄像头_linux_38

 

所以我们需要重新修改Makefile文件,把vivid目录下的文件都编译成一个.o文件,按然后再编译为一个.ko文件

MakeFile内容如下所示:

linux 摄像头监控motion linux开启摄像头_加载_39

linux 摄像头监控motion linux开启摄像头_加载_40

编译结果如下,只有一个vivid,ko文件

 

linux 摄像头监控motion linux开启摄像头_linux 摄像头监控motion_41

linux 摄像头监控motion linux开启摄像头_加载_42

 

3 测试体验效果

首先我们先安装xawtv

xawtv是用于使用电视调谐器或卫星接收卡(DVB-S)观看和录制电视和网络摄像头的软件。xawtv可在类似Unix的操作系统上运行,并已获得GPL许可。

维基百科

 

sudo apt-get install xawtv

 

linux 摄像头监控motion linux开启摄像头_摄像头驱动_43

linux 摄像头监控motion linux开启摄像头_摄像头驱动_44

linux 摄像头监控motion linux开启摄像头_linux 摄像头监控motion_45

 

sudo modprobe vivid     
//安装自带vivid及依赖,这里先使用modprobr加载vivid,会将其依赖一并加载,然后再卸载vivid,最后加载上我们编译的vivid.ko
sudo rmmod  vivid        //卸载自带的vivid
sudo insmod./vivid.ko  //安装自己编译的vivid.ko

 

linux 摄像头监控motion linux开启摄像头_linux_46

 

linux 摄像头监控motion linux开启摄像头_加载_47

linux 摄像头监控motion linux开启摄像头_摄像头驱动_48

 


xawtv -h           //帮助信息
xawtv -c/dev/videoX   //指定设备
xawtv -noalsa        //关闭声卡启动
xawtv          //运行摄像头

 

linux 摄像头监控motion linux开启摄像头_linux 摄像头监控motion_49

如图所示,虚拟摄像头就开始运行起来了。

linux 摄像头监控motion linux开启摄像头_加载_50

linux 摄像头监控motion linux开启摄像头_加载_51

 

 

 这就是我分享的linux4.15内核下的虚拟摄像头配置,如果大家有什么更好的思路,欢迎分享交流哈。