31.2. PCMCIA 详述

以下小节概述了 PCMCIA 设备插入机器时,Linux 系统中会发生什么。组件会相互作用,要支持 PCMCIA 设备需满足许多要求。

以下是 Linux 中 PCMCIA 初始化进程的非常粗略的概述:

  1. PCMCIA 桥(或插槽)必须按 第 31.2.1 节 “桥初始化” 中描述的那样正确设置。前提条件有:

    • 该桥的适当驱动程序

    • PC 卡的额外 I/O 和内存范围

  2. 正确设置桥后,桥的驱动程序检测到卡的存在,并按 第 31.2.2 节 “卡的初始化” 中的描述触发其初始化:

    1. 确定卡的类型。

    2. 提供正确的电压。

    3. 向卡指派 I/O 和内存范围,及 IRQ 行。

    4. 通过绑定适当的卡驱动程序,触发卡或设备的初始化。

    5. 对于某些卡,需要上载卡信息结构 (CIS)。

  3. 最后,设置接口本身使之可用。有关详细信息,请参见 第 31.2.3 节 “接口设置”

31.2.1. 桥初始化

多数 PCMCIA 桥是 PCI 设备,同样处理。桥的初始化过程可总结如下:

  1. 热插拔创建 PCI 事件。

  2. udev 调用 /sbin/hwup 装载驱动程序。/sbin/hwup/etc/sysconfig/hardware 中检查现有设备配置。如果找到了适当的配置,将使用那个配置。否则,/sbin/hwup 用内核提供的 modalias 字符串调用 modprobe,装载驱动程序模块。

  3. 发送新的热插拔事件(每个 PCMCIA 插槽一个)。

  4. 如果只使用 CardBus 卡,将省略以下步骤:

    1. pcmcia_socket 事件触发 udev 调用 /sbin/hwup 并装载 pcmcia 内核模块。

    2. /etc/pcmcia/config.opts 中指定的所有 I/O 和内存范围都将添加到插槽。

    3. 内核中的卡服务检查这些范围。如果 /etc/pcmcia/config.opts 中的内存范围错误,该步骤将使机器崩溃。有关如何调试和修复该故障的信息,请参阅 第 31.3.1 节 “PCMCIA 引起的机器崩溃”

成功完成这些步骤后,桥就完全初始化了。此后,桥本身按以下小节中所述进行初始化。

31.2.2. 卡的初始化

插入 PCMCIA 卡导致的事件可归纳如下:

  1. 发生一个热插拔事件。对于 PC 卡,这是 pcmcia 事件。对于 CardBus 卡,这是 pci 事件。

  2. 对于任何事件,udev 调用 /sbin/hwup 装载驱动程序模块。模块名称要么在 /etc/sysconfig/hardware 下的 hwcfg* 文件中指定,或通过 modprobe modalias

  3. 如果需要,设备初始化将触发固件热插拔事件。将搜索固件并装载它。

  4. 设备驱动程序注册接口。

完成这些步骤后,系统继续按下节描述的继续设置接口。

如果您的卡是 PC 卡,可能需要 /etc/sysconfig/pcmcia 中以下参数中的一些,以便完全支持它,使之无故障运行。

PCMCIA_LOAD_CIS

PC 卡的固件称为 CIS(卡信息结构)。它提供了卡的额外实施细节。hwup 检查卡的内置 CIS 的完整性,如果卡的 CIS 证明有缺陷,尝试从磁盘装入其他 CIS。默认设置是 yes。要禁用从磁盘装载 CIS,将这个变量设置为no

PCMCIA_ALLOW_FUNC_MATCH

Linux 设备驱动程序包含一个设备 ID 表,该表告诉驱动程序要处理哪个设备。这意味着只支持其标识为内核所支持的那些设备。要支持其标识未列出的那些卡,可使用功能匹配。这意味着驱动程序不是由标识选择,而是由卡(例如网卡)的功能选择,可对具有该功能的任何插入的 PC 卡(例如网卡)作出响应。默认设置是 yes。要禁用功能匹配,将这个变量设置为no

PCMCIA_COLDPLUG_REINSERT

引导前已插入的卡有时无法检测到。为防止发生这种情况,将 PCMCIA_COLDPLUG_REINSERT 设置为 yes 将卡软弹出并软插入。默认设置是 no

31.2.3. 接口设置

根据卡类型,成功完成初始化后将注册不同接口。接口注册是由 udev 的 hotplug 处理的。有关 udev 和 hotplug 的详细信息,请参阅 第 12 章 使用 udev 进行动态内核设备管理