以下小节概述了 PCMCIA 设备插入机器时,Linux 系统中会发生什么。 组件会相互作用,要支持 PCMCIA 设备需满足许多要求。
以下是 Linux 中 PCMCIA 初始化进程的非常粗略的概述:
PCMCIA 桥(或插槽)必须按 第 26.2.1 节 “桥初始化” 中描述的那样正确设置。 前提条件有:
该桥的适当驱动程序
PC 卡的额外 I/O 和内存范围
正确设置桥后,桥的驱动程序检测到卡的存在,并按 第 26.2.2 节 “卡的初始化” 中的描述触发其初始化:
确定卡的类型。
提供正确的电压。
向卡指派 I/O 和内存范围,及 IRQ 行。
通过绑定适当的卡驱动程序,触发卡或设备的初始化。
对于某些卡,需要上载卡信息结构 (CIS)。
最后,设置接口本身使之可用。 有关详细信息,请参见 第 26.2.3 节 “接口设置”。
多数 PCMCIA 桥是 PCI 设备,同样处理。 桥的初始化过程可总结如下:
热插拔创建 PCI 事件。
udev 调用 /sbin/hwup 装载驱动程序。 /sbin/hwup 在 /etc/sysconfig/hardware 中检查现有设备配置。 如果找到了适当的配置,将使用那个配置。 否则,/sbin/hwup 用内核提供的 modalias 字符串调用 modprobe,装载驱动程序模块。
发送新的热插拔事件(每个 PCMCIA 插槽一个)。
如果只使用 CardBus 卡,将省略以下步骤:
pcmcia_socket 事件触发 udev 调用 /sbin/hwup 并装载 pcmcia 内核模块。
/etc/pcmcia/config.opts 中指定的所有 I/O 和内存范围都将添加到插槽。
内核中的卡服务检查这些范围。 如果 /etc/pcmcia/config.opts 中的内存范围错误,该步骤将使机器崩溃。 有关如何调试和修复该故障的信息,请参阅 第 26.3.1 节 “PCMCIA 引起的机器崩溃”。
成功完成这些步骤后,桥就完全初始化了。 此后,桥本身按以下小节中所述进行初始化。
插入 PCMCIA 卡导致的事件可归纳如下:
发生一个热插拔事件。 对于 PC 卡,这是 pcmcia 事件。 对于 CardBus 卡,这是 pci 事件。
对于任何事件,udev 调用 /sbin/hwup 装载驱动程序模块。 模块名称要么在 /etc/sysconfig/hardware 下的 hwcfg* 文件中指定,或通过 modprobe modalias。
如果需要,设备初始化将触发固件热插拔事件。 将搜索固件并装载它。
设备驱动程序注册接口。
完成这些步骤后,系统按下一节中的描述继续进行接口设置。
如果您的卡是 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。
根据卡类型,成功完成初始化后将注册不同接口。 接口注册是由 udev 的 hotplug 处理的。 有关 udev 和 hotplug 的详细信息,请参阅 第 21 章 使用 udev 进行动态内核设备管理。