即插即用硬件

作者:David Cantrell

很可能您或您认识的人都接触过即插即用 (PnP) 硬件。这些设备就像“传统”设备,只是它们没有跳线来配置资源(即 IRQ、DMA 和 I/O 地址)。PnP 卡期望计算机(无论是 BIOS 还是操作系统)来查找和配置该卡。这是一个绝妙的主意,但为什么呢?

大多数 Linux 用户喜欢配置他们的计算机——亲自动手操作硬件。另一方面,有些用户希望他们的计算机早上开机后就能立即使用,无需任何干预。这类用户也会向计算机添加硬件,但不希望花费时间查找空闲资源并进行设置。PnP 硬件非常适合他。

用户可以购买一个即插即用设备,将其插入计算机,配置就会自动完成。自动配置的理念被设计到了 PCI 总线中,它是较新的通用总线。不幸的是,大多数用户仍然依赖于行业定义的标准架构;即 ISA 总线。它工作良好,但仍然存在局限性。最值得注意的是,在设计 ISA 时没有考虑即插即用。

即插即用标准的设计者决定将即插即用扩展到 ISA 设备。如果有一种检测和配置方案来查找这些设备并为用户设置它们,那不是很好吗?想想计算机将会变得多么容易!因此,设计者建立了一个方案来查找 ISA 卡,并将其配置为卡上的跳线资源。硬件供应商喜欢这个想法,并决定通过建议移除所有跳线来配合。

现在我们有了一个功能齐全的 ISA 总线即插即用系统,对吗?嗯,不完全是。在完全成熟之前,它还有一段路要走。在即插即用 ISA 完全没有问题地工作之前,PCI 架构将在未来几年内占据主导地位。目前,我们必须使用这些即插即用 ISA 设备,同时哀悼我们心爱的跳线的逝去。

使用即插即用设备

PnP ISA 设备可以在 Linux 下以多种方式使用。内核可以在加载任何其他驱动程序之前找到并配置它们。这种方法有时无法找到所有设备并初始化设备。它还需要使用 PnP 附加组件之一来修补内核。

另一种方法,我推荐的方法,是在用户级别使用初始化程序。您创建一个配置文件,其中包含您的设备,并指定每个设备要使用的资源。然后,此文件由初始化实用程序读取,该实用程序配置设备。但是,此方法确实需要将这些设备的驱动程序编译为内核模块。

我尝试过几个用户级别的配置程序,我发现最简单和最可靠的是 isapnptools 软件包。此程序旨在在具有或不具有 PnP 兼容 BIOS 的系统上工作。它也不会干扰“传统” ISA 设备(带有跳线的设备);至少,我没有遇到过这个问题。

作为一个例子,我将配置一个 PnP 声卡并加载它的驱动程序。我假设您可以安装该卡并且您对 Linux 有一定的了解。以下是设置过程的基本概述

  • 获取 isapnptools 软件包

  • 转储所有可能的值

  • 选择您的资源

  • 测试配置

  • 编译内核驱动程序

  • 在启动时启用设备

获取 isapnptools 软件包

大多数最新的 Linux 发行版都带有 isapnptools 软件包。但是,您可能需要从 isapnptools 网页 http://www.roestock.demon.co.uk/isapnptools/ 获取最新版本。在撰写本文时,最新版本是 1.17。

下载文件后,解压内容并编译它。某些系统可能需要编辑 Makefile。查看包含的 INSTALL 文件以获取更多信息。作为 root 用户,我使用了以下命令来编译和安装软件包

tar xvzf isapnptools-1.17.tar.gz
cd isapnptools-1.17
make
make install (as root)

安装将创建 isapnppnpdump 程序以及它们随附的 man 页面和示例配置文件。

转储所有可能的值

在您编译并安装了 isapnptools 之后,就该配置您的设备了。这是通过创建一个配置文件来完成的,该文件解释了设备及其将使用的资源。关于 isapnptools 的优点是它可以为您构建此文件。然后您进入并玩“多项选择”(正如作者所说)。

要创建配置文件,请运行 pnpdump 程序。它扫描所有 ISA 即插即用设备和所有可能的配置。这些值以所需的文件格式转储到标准输出 (STDOUT)。这是我用来以 root 身份创建文件的命令

/sbin/pnpdump > /etc/isapnp.conf

列表 1. 配置文件开始

该程序在我这里失败了几次,但这主要是由于其他系统错误。如果您使用了我的命令,您现在应该在 /etc 中有一个配置文件。文件的开头应该类似于列表 1。配置文件的其余部分将包含它找到的不同设备的 sections。现在您需要选择设备将使用哪些资源。

选择您的资源

配置文件起初可能看起来有点令人困惑,但只需要稍微解读一下。设备 section 的基本布局如列表 2 所示。默认情况下,该设备的所有可能资源的列表都将位于设备 section 中。基本上,只需取消注释设备将使用的资源的行。这些行用 # 标记注释。

列表 2. 设备 Section

编辑此文件需要了解一些关于要配置的设备的信息。通常,设备的用户手册会列出使用该设备所需的资源。在我的例子中,对于 Sound Blaster AWE32,我需要一个基本 I/O 地址、一个 IRQ、一个 8 位 DMA 通道、一个 16 位 DMA 通道和一个 MIDI 合成器 I/O 地址。我的卡上还有其他资源,但在这个例子中我没有使用它们。

列表 2 中的示例设备 section 显示了我为我的卡选择的资源。我为基本 I/O 地址选择了 0x0220,为 IRQ 通道选择了 5,为 8 位 DMA 通道选择了 1,为 16 位 DMA 通道选择了 5,为 MIDI I/O 选择了 0x0330。

请注意,I/O 地址称为 IO 0 和 IO 1,DMA 通道称为 DMA 0 和 DMA 1。这可能使将正确的值映射到 8 位 DMA 和 16 位 DMA 有点困难。但是,如果您在运行 pnpdump 后阅读您的配置文件,并查看设备用户手册中的默认资源设置,您可以轻松地将它们匹配起来。

在我的例子中,我知道 DMA 0 对应于 8 位 DMA,因为只有 8 位 DMA 的值可以是 1。因此,另一个设置一定是 16 位 DMA 通道。IO 设置也是如此;IO 0 必须是基本 I/O 地址,因为 MIDI I/O 地址永远不能是 0x0220。

一旦您取消注释了您需要的行,请确保 (ACT Y) 行被取消注释;否则,您的设备将不会被配置。

测试配置

您现在已经完成了 Linux 下 PnP 配置的困难部分。最好在继续之前测试您的 PnP 配置。您要确保 isapnp 可以使用您设置的资源正确初始化卡。假设 isapnp 在 /sbin 中,执行此命令来测试您的配置

/sbin/isapnp /etc/isapnp.conf

如果没有错误消息,您的配置应该可以正常工作。如果您确实收到资源冲突错误,那么现在是返回并编辑该配置文件的最佳时机。最好现在让它工作,而不是以后再处理它。尝试调整资源设置,直到找到那些在测试配置时不会产生错误的设置。

编译内核驱动程序

现在我们准备好进行有趣的部分了。大多数 Linux 发行版都会附带编译为模块的各种设备驱动程序。有关模块的更多信息,请参阅内核文档。基本上,模块只是一个可以添加到已运行内核的设备驱动程序。这为用户提供了很大的灵活性,正是模块使我们能够使用 PnP 设备。

PnP 设备必须在加载驱动程序之前初始化,因此使用模块是必要的。它们是内核中唯一可以在内核启动后加载的部分。

您的发行版可能已经包含您想要使用的设备的模块。在声卡的情况下,您可能正在从头开始编译一个。在我的示例中,我使用 Sound Blaster AWE32。我的发行版中包含的设备驱动程序是 /lib/modules/2.0.35/misc/sound.o。

如果您必须重新编译,请务必根据 isapnp.conf 文件中设置的资源为驱动程序设置任何资源。您始终可以在加载模块时传递资源值,但拥有默认值总是很好。

要加载我的 PnP 声卡的驱动程序,我执行了以下操作

/sbin/isapnp /etc/isapnp.conf
/sbin/modprobe sound.o io=0x0220 irq=5 dma=1\
   dma1=5

如果一切顺利,您应该加载了一个驱动程序并使其与该设备一起工作。通过键入以下内容检查以确保模块已加载

/sbin/lsmod
如果这是一个声卡,请尝试播放声音文件。对于网卡,尝试使用 ifconfig 启动设备。此时设备应该可以工作了。
在启动时启用设备

既然您的 PnP 卡在 Linux 下工作了,如果在启动时自动设置这些设备,那不是很好吗?我将以上两行添加到我的 /etc/rc.d/rc.local 文件中,以便每次启动系统时都加载我的声音驱动程序。

这个例子使用了我所认为的在使用 Linux 时最常见的即插即用情况——声卡。还存在其他 PnP 设备,例如调制解调器和网卡。相同的技术也可以应用于这些卡。

资源

Plug-and-Play Hardware
David Cantrell 是佐治亚理工学院的计算机科学本科生。他自 1997 年以来一直使用 Linux。David 花费大量时间在他的电脑上,但也喜欢去他最喜欢的墨西哥餐厅和午夜电影。他喜欢滑水、背包旅行和观看“辛普森一家”。可以通过电子邮件 david@burdell.org 与他联系。
加载 Disqus 评论