用于视频捕获的 Linux 内核驱动程序

用于视频捕获的 Linux 内核驱动程序

我有一款带有 USBTV007 芯片的 EasyCap 视频捕捉设备,我真的很想让它在我的小型 Linux Mint 17 笔记本电脑上运行,这样我就可以为我的 RC 产品捕捉视频。

但我不知道如何处理这个 Linux 内核驱动程序。我甚至不知道如何获取这些文件,我猜是类似 git 的东西。 http://linuxtv.org/wiki/index.php/Easycap#USBTV007_EasyCAP

我正在寻找一个对初学者友好的解释,了解如何处理这个问题:https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/media/usb/usbtv

答案1

目前市场上有各种内置 USBTV007 芯片的 Easy Cap 视频捕获设备,但 USB 设备 ID 中印有不同的供应商/产品 ID。因此,在编译其他驱动程序之前,不要使用默认随 linux 映像包提供的内置“usbtv”模块。在终端上发出以下命令

>sudo lsusb

你可能会得到类似这样的信息:

Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d71:3002 USB TV 

查找身份证1d71:3002在 lsusb 命令的输出中,如果匹配,您很幸运,您的系统可能有适合您设备的驱动程序。如果没有,也不要绝望。让我们看看您有什么唯一 ID?

ID eb1a:2861 eMPIA Technology, Inc.
ID 1c88:0007 Somagic, Inc. 
ID 1c88:003c Somagic, Inc. 
ID 1c88:003f Somagic, Inc.

以上四个 ID 匹配中的任何一个都会默认有其他不同的驱动程序已随您的内核版本提供。请仔细阅读您提到的 Linux TV 页面。

我曾经拥有一款非常罕见且新发布的设备(据我从市场来源了解到的情况)

ID 1d71:3002 USB TV 

所需的是在 usbtv 驱动程序源文件名 usbtv-core.c 上添加一行并动态重新编译它。为此,您需要拥有 usbtv 源代码以及 v4l linux 项目的各种组件。我建议您下载并使用手头的完整内核源代码,但只需在驱动程序基础上添加一行以添加设备 ID 后重新编译模块源代码。我给出了下面的分步命令。我忽略了快速完成的步骤描述。如果它让您难以理解,请告诉我。我将在稍后编辑以添加详细信息。

安装 Linux 内核编译过程中所需的所有实用程序、应用程序和库文件。以下软件包包括

make、gcc、autoconf、binutils、build-essential、libncurses-dev 以及内核的头文件。

安装所有必需的软件包后,尝试:

>cd /usr/src/linux-source-X.XX.X
>sudo cp /usr/src/linux-headers-`uname -r`/Module.symvers .
>sudo make -C  /usr/src/linux-headers-`uname -r`/ oldconfig
>sudo cp /boot/config-X.xx.x-xx-YYYY .config
>sudo make -C  /usr/src/linux-headers-`uname -r`/ prepare

如果上述步骤完成且没有任何错误,那么恭喜你。困难时期已经过去。现在通过以下方式移动到 usbtv 源文件:

cd /usr/src/linux-source-X.XX.X/drivers/media/usb/usbtv/

您将在那里找到文件名: Kconfig Makefile usbtv-audio.c usbtv-core.c usbtv.h usbtv-video.c

使用您喜欢的文本编辑器打开 usbtv-core.c 文件进行修改,并修改以下代码:

static struct usb_device_id usbtv_id_table[] = {
{ USB_DEVICE(0x1b71, 0x3002) },
{}

};

代码如下所示。

static struct usb_device_id usbtv_id_table[] = {
{ USB_DEVICE(0x1b71, 0x3002) },
{ USB_DEVICE(0x1f71, 0x3301) },
{}

};

使用行 0x1f71 作为供应商 ID 和 0x3301 作为产品 ID,您指示驱动程序在 USB 端口插入任何具有匹配 ID 标签的设备时立即加载。如果您确定设备上有 UTV007 芯片组,请尝试更改其他产品/供应商 ID。重点是让您自己的产品/供应商 ID 与驱动程序相匹配。现在尝试通过以下方式编译模块:

>sudo make -C /usr/src/linux-headers-`uname -r`/ M=$PWD prepare modules install 
>sudo depmod -a

如果此时没有错误完成,则使用命令卸载/重新加载 usbtv 模块

>sudo rmmod usbtv && sudo modprobe usbtv

在将设备连接到 USB 端口时,尝试使用命令监控 UDEV 活动

 > udevadm monitor 

插入设备后立即显示 /dev/vedio0 驱动器将表示成功。如​​果没有,请告知我们以进行进一步讨论。

附加来源:

https://linuxtv.org/wiki/index.php/Gadmei_USB_TVBox_UTV382_(id_0x1f71:0x3301) https://askubuntu.com/questions/168279/how-do-i-build-a-single-in-tree-kernel-module https://askubuntu.com/questions/17944/what-is-the-minimum-requirement-to-compile-kernel-modules

要使用自签名证书对修改后的模块进行签名:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-signing-kernel-modules-for-secure-boot.html

答案2

复制并粘贴此内容:

p=`pwd`
git clone https://github.com/simon3z/usbtv.git
cd usbtv/
cd /usr/src/linux-headers-`uname -r`
make  SUBDIRS=/root/usbtv  modules
cd /usr/src/linux-headers-`uname -r`
cd /lib/modules/`uname -r`/kernel/drivers/media/usb/usbtv/
cp $p/usbtv/usbtv.ko .

相关内容