即插即用硬件
很可能您或您认识的人都接触过即插即用 (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 软件包
转储所有可能的值
选择您的资源
测试配置
编译内核驱动程序
在启动时启用设备
大多数最新的 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)
安装将创建 isapnp 和 pnpdump 程序以及它们随附的 man 页面和示例配置文件。
在您编译并安装了 isapnptools 之后,就该配置您的设备了。这是通过创建一个配置文件来完成的,该文件解释了设备及其将使用的资源。关于 isapnptools 的优点是它可以为您构建此文件。然后您进入并玩“多项选择”(正如作者所说)。
要创建配置文件,请运行 pnpdump 程序。它扫描所有 ISA 即插即用设备和所有可能的配置。这些值以所需的文件格式转储到标准输出 (STDOUT)。这是我用来以 root 身份创建文件的命令
/sbin/pnpdump > /etc/isapnp.conf
该程序在我这里失败了几次,但这主要是由于其他系统错误。如果您使用了我的命令,您现在应该在 /etc 中有一个配置文件。文件的开头应该类似于列表 1。配置文件的其余部分将包含它找到的不同设备的 sections。现在您需要选择设备将使用哪些资源。
配置文件起初可能看起来有点令人困惑,但只需要稍微解读一下。设备 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 设备,例如调制解调器和网卡。相同的技术也可以应用于这些卡。
