31.2. 深入探討 PCMCIA

下列章節概述將 PCMCIA 裝置插入您的電腦時,Linux 系統的反應行為。若要支援 PCMCIA 裝置,元件必須能夠互動,而且必須符合許多需求。

Linux 中 PCMCIA 初始化程序的極簡大綱如下:

  1. 必須依 節 31.2.1, "橋接器初始化" 所述方式正確設定 PCMCIA 橋接器 (或插槽)。需求為:

    • 供橋接器使用的適當驅動程式

    • 供 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 裝置,而且會被視為是 PCI 裝置。橋接器初始化程序可摘要說明如下:

  1. Hotplug 建立 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 中可能需要以下部分參數,該 PC 卡才能完全受到支援,正常運作:

PCMCIA_LOAD_CIS

PC 上的韌體被稱為 CIS (卡片資訊結構)。它提供了卡片額外的執行細節。hwup 會檢查卡片內建 CIS 的完整性,如果卡片的 CIS 經證實確有瑕疵,它會嘗試從磁碟載入其他 CIS。預設值是 yes。若要關閉從磁碟載入 CIS,請將此變數設定為 no

PCMCIA_ALLOW_FUNC_MATCH

Linux 裝置驅動程式包含裝置 ID 表,可告訴驅動程式要處理哪些裝置。這意味著,系統只支援核心已知其 ID 的裝置。若要支援 ID 不在表格中的卡片,您可以使用功能配對。這是指不依照 ID,而依照卡片的功能 (例如網路卡) 選取驅動程式,而且它必須負責處理具有該功能的任何插入 PC 卡 (例如網路卡)。預設值是 yes。若要停用功能配對,請將此變數設定為 no

PCMCIA_COLDPLUG_REINSERT

系統有時候會偵測不到開機前已插入的卡片。為了防止這樣的情形發生,請將 PCMCIA_COLDPLUG_REINSERT 設定為 yes,使系統執行卡片的軟退出和軟插入。預設值是 no

31.2.3. 介面設定

成功完成初始化後,會根據卡片類型註冊不同的介面。介面註冊由 udev 的 hotplug 處理。如需有關 udev 和 hotplug 的詳細資訊,請參閱 章 12, 使用 udev 的動態核心裝置管理