平台:Ubuntu-16.04
$uname -a
Linux vbox-pc 4.15.0-112-generic #113~16.04.1-Ubuntu SMP Fri Jul 10 04:37:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
可以看到内核版本是4.15.0,
去www.kernel.org找同版本的内核,如果没有请找最相近的内核代码
下载完后,解压,把linux-4.15\drivers\media\platform\vivid复制到ubuntu下。
修改vivid下的Makefile,改成如下:
KERN_DIR = /usr/src/linux-headers-4.15.0-112-generic
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
# SPDX-License-Identifier: GPL-2.0
vivid-objs := 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
ifeq ($(CONFIG_VIDEO_VIVID_CEC),y)
vivid-objs += vivid-cec.o
endif
obj-m += vivid.o
注意:KERN_DIR改成/usr/src/目录下与uname -a相同的内核版本。
然后编译
$make
不出意外会报错:
make -C /usr/src/linux-headers-4.15.0-112-generic M=`pwd` modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-112-generic'
CC [M] /home/vbox/workspace/test/vivid/vivid-ctrls.o
/home/vbox/workspace/test/vivid/vivid-ctrls.c: In function ‘vivid_vid_cap_s_ctrl’:
/home/vbox/workspace/test/vivid/vivid-ctrls.c:346:3: error: ‘V4L2_COLORSPACE_ADOBERGB’ undeclared (first use in this function)
V4L2_COLORSPACE_ADOBERGB,
^
/home/vbox/workspace/test/vivid/vivid-ctrls.c:346:3: note: each undeclared identifier is reported only once for each function it appears in
scripts/Makefile.build:330: recipe for target '/home/vbox/workspace/test/vivid/vivid-ctrls.o' failed
make[2]: *** [/home/vbox/workspace/test/vivid/vivid-ctrls.o] Error 1
Makefile:1582: recipe for target '_module_/home/vbox/workspace/test/vivid' failed
make[1]: *** [_module_/home/vbox/workspace/test/vivid] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-112-generic'
Makefile:4: recipe for target 'all' failed
make: *** [all] Error 2
报V4L2_COLORSPACE_ADOBERGB未定义,那就简单粗暴地把用到V4L2_COLORSPACE_ADOBERGB的地方注销掉,就两个地方。
$sudo apt-get install xawtv
$sudo modprobe vivid
$sudo rmmod vivid
$sudo insmod vivid.ko <== vivid.ko是刚编译出来的ko
为什么modprobe了驱动,又rmmod呢?
因为modprobe vivid会自动安装vivid.ko所依赖的其他ko,比如videobuf2-core.ko、v4l2-common.ko、videobuf-core.ko等等,较多,不想一个一个insmod,那就modprobe吧,直接insmod vivid.ko会报错。但为什么又rmmod,是因为modprobe默认insmod /lib/modules/目录下的vivid.ko,不是刚编译出来的,所以rmmod掉,然后insmod 刚编译出来的vivid.ko。当然,把编译出来的vivd.ko替换掉/lib/modules/下面的也可以。
开始采集图像。
$xawtv -c /dev/video0