3. 在 Linux 中启用对 Bt8x8 硬件的支持

3.1. Bttv 驱动程序

自 2.2.0 版本以来,基于 Bt8x8 硬件的驱动程序一直是 Linux 内核 的一部分,如果您没有重新编译或以其他方式将系统的库存内核替换为自定义版本,则很可能已经在您运行的内核中启用。如果不可用,可以通过两种方式启用 Bt8x8 支持

3.1.1. 模块还是内置内核?

如果未经修改,安装在您的 Linux 系统上的库存内核很可能已经支持基于 Bt8x8 的硬件。该驱动程序将作为可加载模块存在,或者存在于已运行的内核中。一个简单的判断方法是使用 dmesg 命令管道到 less (为了便于查看),以查找系统启动时驱动程序已加载的确认信息

   $ dmesg | less

...这可能会产生如下内容,具体取决于您的 Bt8x8 芯片组功能和内核版本(在本例中为 2.6)

   Jan 26 19:40:04 localhost kernel: bttv: driver version 0.9.15 loaded
   Jan 26 19:40:04 localhost kernel: bttv: using 8 buffers with 2080k 
      (520 pages) each for capture
   Jan 26 19:40:04 localhost kernel: bttv: Bt8xx card found (0).
   Jan 26 19:40:04 localhost kernel: ACPI: PCI interrupt 0000:02:09.0[A] -> 
      GSI 17 (level, low) -> IRQ 17
   Jan 26 19:40:04 localhost kernel: bttv0: Bt878 (rev 2) at 0000:02:09.0, 
      irq: 17, latency: 32, mmio: 0xe7000000
   Jan 26 19:40:04 localhost kernel: bttv0: detected: Hauppauge WinTV 
      [card=10], PCI subsystem ID is 0070:13eb
   Jan 26 19:40:04 localhost kernel: bttv0: using: Hauppauge (bt878) [card=10, 
      autodetected]
   Jan 26 19:40:04 localhost kernel: bttv0: using tuner=2
   Jan 26 19:40:04 localhost kernel: tuner: chip found at addr 0xc2 i2c-bus 
      bt878 #0 [sw]
   Jan 26 19:40:04 localhost kernel: tuner: type set to 2 (Philips NTSC 
      (FI1236, FM1236 and compatibles)) by bt878 #0 [sw]

如果您没有看到它,您感兴趣的特定驱动程序模块可能可用,但不一定在此时加载。如果您知道模块的名称,请尝试使用find; 在本例中,我们正在寻找 'bttv' 模块

   $ find /lib/modules -name bttv.o

请注意,在 2.4 系列之前,模块具有后缀.o; 对于 2.6+ 系列内核,这已被替换为.ko.

您可以通过在命令行输入以下内容来获取所有可用模块的列表

 
   $ ls -R /lib/modules/`uname -r`/kernel 

其中 `uname -r`,用反引号括起来,是您的内核版本号。以下输出是一个您可能在 Bttv 就绪内核中找到的示例,其中所有内容都作为模块加载(为了简洁而编辑)

   /lib/modules/2.6.8/kernel/drivers/media/video:
    btcx-risc.ko    ir-kbd-i2c.ko  tda9875.ko  tvaudio.ko      video-buf.ko
    bttv.ko         msp3400.ko     tda9887.ko  v4l1-compat.ko  videodev.ko
    ir-kbd-gpio.ko  tda7432.ko     tuner.ko    v4l2-common.ko

同样,您的输出可能因当前运行的内核功能而异。

一旦您知道您的硬件需要哪个模块,您就可以通过在命令行或终端窗口中键入来找出它是否已加载

   # lsmod

如上面的提示所示,您需要拥有 root 权限才能执行此操作。您应该得到类似于但不一定限于以下内容的输出

   snd_bt87x              11400  0
   tuner                  18832  0
   tvaudio                20428  0
   msp3400                22100  0
   bttv                  145804  0
   video_buf              17476  1 bttv
   i2c_algo_bit            8904  1 bttv
   v4l2_common             4928  1 bttv
   videodev                7232  2 quickcam,bttv

大多数库存内核都使用kmod编译,这可以在检测到合适的硬件时自动加载必要的模块。但是,它可能并非总是如此,因此如果您没有找到您正在寻找的特定模块,并且您认为该模块可能可用,请尝试使用 modprobe 手动加载它,如下例所示(使用bttv模块)

   # modprobe -v bttv

3.2. 未找到 Bttv 模块或内置内核支持?

如果您的运行内核或预编译的发行版内核无法解释地未启用或提供 Bt8x8 支持,您可以随时从 Linux kernel.org 源代码库获取新的内核源代码。如果您不熟悉编译自己的内核的先决条件和过程,我建议您参考 Kernel HOWTO 以获取更多信息。

如果您确实重新编译,则显然需要启用 Bttv 驱动程序本身,并且可以在 menuconfig 或 xconfig 的 2.4 及更早内核中的标题“Multimedia Devices” -> “Video for Linux”中找到它,或者在 2.6+ 系列中的“Device Drivers” -> “Multimedia Devices” -> “Video for Linux” -> “BT848 Video For Linux”中找到它。

Note

您将需要i2c子系统支持以及i2c-algo-bit.

设备支持 (i2c-dev) 不是 Bt8x8 支持所必需的。在内核版本 2.3.34 之前,i2c 不存在于内核源代码中,必须从 lm_sensors 主页 获取并应用补丁到您的源代码。

如果您运行的是 2.4 系列内核,如果您想使用连接到卡音频输出插孔的外部扬声器,则 OSS“Sound”类别中的 btaudio 是可选的,并且 2.6+ 系列中的 OSS 或 ALSA 音频系统 btaudio 驱动程序中的任何一个(或两者)也是可选的。

3.3. 使用 Bttv 硬件的配置要求

一旦您知道您的内核已启用,您可以继续进行一些小的调整,这些调整可能已经为您完成,具体取决于您的系统和发行商以及发行版功能。

3.3.1. 设备文件

如果您使用 Device Filesystem (devfs) 或 udev,您在这方面的工作可能会动态完成,但同时,设备可能在内核识别之前(即,加载必要的模块)不存在,因此请务必首先注意先前概述的先决条件。

Linux 内核需要创建一个虚拟设备节点才能访问和控制特定的硬件。此节点可能已经自动为您创建; ls -l /dev/video*(带星号)或 find /dev -name video*,甚至目视检查/dev使用您喜欢的文件管理器目录可以帮助您了解视频设备是否存在。如果是这样,您可以继续执行 Section 3.4;如果不是,您将需要手动创建它们。

如果您的 Linux 发行版可用,则创建它们的简单方法是使用MAKEDEV脚本,该脚本可能位于/dev或用于存储可执行命令的常用位置 (/bin,/sbin等等)。MAKEDEV(man MAKEDEV) 的手册页可以进一步指导您,但请注意特定于设备的命令选项。如果MAKEDEV不起作用或不存在,或者您只是喜欢以困难的方式做事,请转到下一段。

可以将设备创建为块设备(例如驱动器)、FIFO(先进先出文件或管道,如 xconsole)或字符设备,它们代表其他硬件。每个设备都有一个主设备号和一个次设备号 "坐标",以告诉内核它是什么以及在哪里访问它。这些数字不是任意的。按照惯例,主设备号 81 和次设备号 0、1、2 等分配给 Video4linux 设备,包括电视调谐器板和网络摄像头。为了创建视频设备/dev/video0,在命令行使用 mknod

   # mknod /dev/video0 c 81 0

其中 c 表示字符设备。

您可以使用以下脚本,我从内核源代码中借用(位于linux/Documentation/video4linux/bttv/MAKEDEV的源代码树中)

   #!/bin/bash
   function makedev () {
	for dev in 0 1 2 3; do echo "/dev/$1$dev:
	char 81 $[ $2 + $dev ]" rm -f /dev/$1$dev
	mknod /dev/$1$dev c 81 $[ $2 + $dev ] chmod
	666 /dev/$1$dev
   	done

   	# symlink for default device
	rm -f /dev/$1 ln -s /dev/${1}0 /dev/$1
   	}

	# see http://roadrunner.swansea.uk.linux.org/v4lapi.shtml
	echo "*** new device names ***" makedev video
	0 makedev radio 64 makedev vtx 192 makedev vbi 224
	# "*** old device names (for compatibility only) ***"
	#makedev bttv 0 #makedev bttv-fm 64 #makedev bttv-vbi 224

只需将以上内容复制并粘贴到您喜欢的编辑程序中,将其另存为 MAKEDEV 或您喜欢的任何名称,使其可执行(即,chmod u+x MAKEDEV),然后以 root 身份执行它

   # ./MAKEDEV

3.4. 组和权限

确保您的用户帐户可以在所有模块加载并创建设备节点后访问该设备是个好主意。最注重安全性的方法是为特定组添加访问权限。在我的系统上,组“video”的成员可以使用网络摄像头、扫描仪和其他照相设备。完成此操作的方法是首先更改设备的所有权/dev像这样(以 root 身份)

   # chown root.video /dev/usb/video*

...其中 root.video 是设备现在所属的所有者和组。显然,具体命令会因您的系统和设备类型而异。重要的是您更改设备节点本身的所有权,而不是符号链接;符号链接的所有权仅受更改它们指向的父设备或文件的影响。

要查看您的用户帐户是否是相关组的成员,以 root 身份发出以下命令

   # grep -e video /etc/group
您应该看到如下内容

   video:x:44:

...其中“44”是组号。由于“video”组的最后一个冒号后面没有成员,我们可以添加它们,假设用户“jhs”,使用命令

   # adduser jhs  video

此后,只需允许相关用户读取和写入设备的权限,如下所示

   # chmod g+rw /dev/v4l/video0

...其中 g+rw 表示为 g组添加 read 和 write 访问权限。有关更多信息,请参见 chmod 的文档 (man chmodinfo chmod)。