第四章 硬體系統架構
4.2 PCI 介面
(一) PCI 介面簡介
Intel 公 司 於 1992 年 制 定 了 PCI(Peripheral Component Interface)匯 流 排 規 格 , 以 確 保 市 場 上 各 種 不 同 功 能 處 理 器 區 域 匯 流 排 架 構 上 的 相 容 性 (目 前 最 新 版 本 為 3.0 版 )。 PCI 匯 流 排 上 裝 置 可 彼 此 間 或 者 與 系 統 記 憶 體 間 快 速 存 取 。 所 有 匯 流 排 讀 寫 的 傳 輸 皆 能 用 burst 方 式 來 執 行 , 由 匯 流 排 主 控 端 (Bus Master)來 決 定 burst 的 長 度 。 在 資 料 交 易 開 始 時 , 被 控 端 (Target) 會 被 指 定 起 始 位 址 與 交 易 型 態 , 但 不 告 知 Target 其 傳 輸 長 度 , 當 Master 準 備 傳 輸 資 料 時 , 會 通 知 Target 此 資 料 是 否 為 最 後 一 筆 (由 FRAMEn 訊 號 告 知 ),傳 完 最 後 一 筆 交 易 即 完 成 。 效 率 上 明 顯 較 ISA 或 是 VESA 等 介 面 好 , 現 今 已 成 為 PC 準 系 統 標 準 匯 流 排 規 格 。 而 顯 示 介 面 (AGP)可 視 為 PCI 介 面 之 延 伸,主 要 提 供 高 頻 寬 給 予 圖 形 介 面 所 使 用 , 而 現 今 最 新 的 顯 示 介 面 PCI-Express 亦是以 PCI 匯 流 排 為 基 礎 之 延 伸 介 面 。
PCI 裝 置 可 分 類 為 被 控 端 (Target)、 主 控 端 (Master)、 初 始 端 (Initator)三 種 。 一 般 PC 準 系 統 中 , 初 始 端 與 主 控 端 可 視 為 同 一 裝 置 (Initator 亦 具 備 Master 之 權 限 ),都 可 以 控 制 PCI 匯 流 排 , PC 準 系 統 中 之 北 橋 晶 片 通 常 內 定 為 初 始 端 (Initator), PCI 匯 流 排 可 支 援 多 Master 匯 流 排 , 權 限 判 別 由 匯 流 排 仲 裁 者 (bus arbiter)亦即是 Initator 判 定 。 若 匯 流 排 上 無 相 關 PCI Master 功 能 晶 片 之 匯 流 排 , 則 系 統 內 僅 有 之 主 控 端 (Master)即 為 初 始 端 (Initator)。
業 系 統 控 制 北 橋 晶 片 作 為 初 始 端 (Initator) 及 主 控 端 號 (FRAMEn、 TRDYn、 IRDYn、 STOPn、 DEVSELn、 IDSEL 等 )、 以 及 Error 訊 號 (PERRn、 SERRn)與 系 統 訊 號 (CLK、 RSTn)等 。 另
PCI 接 腳 邏 輯 定 義 可 分 輸 入 接 腳、輸 出 接 腳、三 態 邏 輯 接 腳 (Tri-State)、 保 持 式 三 態 邏 輯 接 腳 (Sustain Tri-State)與 開 汲 極 (Open Drain)等 五 種 型 態 。 保 持 式 三 態 邏 輯 接 腳 操 作 需 特 別 注 意 , 此 接 腳 只 能 被 一 個 裝 置 驅 動 , 不 驅 動 訊 號 時 , 必 須 拉 高 訊 號 一 個 時 脈 週 期 後 浮 接 , 此 外 如 同 開 汲 極 一 樣 , 還 必 須 增 加 提 升 電 阻 使 得 再 浮 接 時 仍 保 持 高 電 壓 準 位 。 由 於 晶 片 包 裝 接 腳 有 限 , 故 晶 片 外 匯 流 排 規 格 多 採 雙 向 多 工 型 態 共 用 接 腳 以 節 省 pin 腳 使 用 。 而 此 類 接 腳 在 換 邊 驅 動 時 需 要 一 段 兩 邊 都 不 驅 動 時 間 呈 現 開 汲 極 狀 態 , 此 時 稱 為 反 轉 週 期 (因 Sustain Tri-State 型 態 所 致 )。 許 多 PCI 匯 流 排 訊 號 亦 屬 此 類 , 如 位 址 與 資 料 共 用 接 腳 (AD[32:0])、 資 料 致 能 與 命 令 共 用 接 腳 (CBEn [3:0])等 。
本 文 中 ” PCI Development Board” 所 使 用 到 的 PCI 訊 號 功 能 定 義 與 驅 動 規 則 於 4.3 中 再 作 詳 細 介 紹 。 關 於 其 他 PCI 匯 流 排 的 規 格 請 參 照 PCI Special Interest Group (PCI-SIG) 制 定 的 ” PCI Local Bus Specifiation,Revision 3.0 ” 文 件 [11]。
(三) PCI 驅動程序
對 PC 端 而 言 每 個 PCI 裝 置 都 有 三 個 識 別 編 號 , 分 為 匯 流 排 編 號 ( bus number)、 裝 置 編 號 ( device number)、 功 能 編 號 ( function number)。 在 PCI 的 規 格 中 , 允 許 系 統 最 多 可 接 256 組 匯 流 排 ( PC 上 只 使 用 一 組 ), 每 組 匯 流 排 最 多 可 接 32 種 裝 置 , 而 每 種 裝 置 可 以 有 多 達 8 項 功 能 。 每 項 功 能 的 編 號 可 以 是 一 組 16-bit 的 二 進 位 碼 數 值,或 是 由 兩 個 8-bit 的 二 進 位 碼 所 組 成 的 數 值 。
每 個 裝 置 的 硬 體 電 路 必 須 要 能 回 應 關 於 三 組 定 址 空 間
( address space ) 的 查 詢 , 分 別 是 : 記 憶 體 位 置 ( memory location )、 I/O 埠 與 組 態 暫 存 器 ( configuration register)。 前 兩 組 定 址 空 間 由 同 一 PCI 匯 流 排 上 的 所 有 裝 置 共 享,也 就 是 說,當 你 在 存 取 某 記 憶 體 位 置( 或 某 I/O 埠 ) 時 , 所 有 的 裝 置 會 同 時 看 到 該 匯 流 排 週 期 ( bus cycle); 而 組 態 空 間 ( configuration space) 是 依 據 擴 充 槽 ( slot) 的 位 置 而 來 的 , 每 擴 充 槽 都 各 有 一 專 用 的 啟 用 線 路 ( enable wire ), 供 規 劃 組 態 時 使 用 。 因 此 , PCI 控 制 器 ( PCI controller) 可 以 在 某 個 時 間 點 存 取 特 定 的 介 面 卡 , 而 不 會 產 生 位 址 衝 突 的 狀 況 。 每 個 PCI 裝 置 擁 有 4 支 中 斷 接 腳 , 主 機 板 的 電 路 會 將 這 些 接 腳 連 到 處 理 器 的 IRQ 線 路 。 雖 然 處 理 器 的 IRQ 線 路 有 數 量 的 限 制 , 但 由 於 裝 置 可 共 用 相 同 的 中 斷 訊 號,因 此 PCI 介 面 卡 的 數 量 可 以 不 受 IRQ 線 路 數 量 的 限 制 。
在 PCI 匯 流 排 中 , 由 於 I/O 空 間 採 用 32-bit 的 位 址 匯 流 排 , 所 以 可 定 址 的 空 間 高 達 4 GB。 在 記 憶 體 定 址 空 間 方 面 , 則 採 用 32-bit 或 64-bit 方 式 位 址 。 通 常 每 個 裝 置 都 有 其 獨 特 的 位 址 , 但 是 也 有 可 能 發 生 兩 個 裝 置 有 相 同 的 位 址 , 造 成 兩 邊 都 無 法 順 利 運 作 。 所 以 在 規 劃 組 態 的 時 候 設 定 為 系 統 指 定 位 址 , 就 可 以 重 新 對 應 ( remap) PCI 裝 置 所 提 供 的 I/O 與 記 憶 位 址 區 。 而 在 開 機 時 就 是 用 這 個 機 制 來 對 裝 置 初 始 化 , 以 避 免 位 址 衝 突 。 至 於 這 些 區 域 的 位 址 到 底 被 重 新 對 應 到 何 處 , 則 可 以 在 組 態 空 間 內 讀 到 相 關 資 訊 , 驅 動 程 式 只 要 依 據 從 組 態 暫 存 器 所 取 得 的 資 訊 , 就 能 安 全 地 存 取 週 邊 了 。
在 PCI 組 態 空 間 中 , 每 個 裝 置 有 256 bytes 的 空 間 來 存
放 其 功 能 資 訊 , 而 且 組 態 暫 存 器 的 佈 局 也 有 標 準 規 範 。 每 種 功 能 的 代 碼 是 4 bytes, 彼 此 不 會 重 覆 , 而 驅 動 程 式 可 以 利 用 裝 置 獨 特 的 代 碼 來 識 別 裝 置 。 總 之 , 可 以 用 實 體 的 排 列 方 式 來 找 出 裝 置 介 面 卡 , 然 後 再 找 出 對 應 的 組 態 暫 存 器 , 最 後 再 用 所 取 得 的 資 訊 來 識 別 PCI 裝 置,這 樣 即 可 進 行 後 續 的 操 作 。
在 系 統 開 機 階 段 PCI 裝 置 在 此 時 就 已 完 成 組 態 的 設 定 。 當 電 源 開 始 供 應 PCI 裝 置 時 , 其 實 硬 體 仍 處 於 關 閉 的 狀 態 , 也 就 是 說 , 裝 置 只 能 對 組 態 規 劃 ( configuration transaction) 作 回 應 , 因 此 當 開 啟 電 源 時 , 裝 置 沒 有 任 何 記 憶 體 或 I/O 埠 會 對 應 到 電 腦 的 定 址 空 間;而 每 一 種 裝 置 專 屬 的 特 性 , 像 是 中 斷 線 路 , 也 都 是 失 效 的 。 但 每 片 符 合 PCI 規 格 的 PC 主 機 板 , 一 定 會 配 備 內 含 PCI 功 能 的 韌 體
( firmware ), 例 如 BIOS 等 。 所 以 就 算 處 理 器 的 指 令 集
( instruction set) 沒 有 提 供 存 取 裝 置 組 態 空 間 的 能 力 時 , 韌 體 還 是 能 存 取 裝 置 所 屬 的 組 態 空 間 。
在 系 統 啟 動 時 , 韌 體 會 去 規 劃 每 個 PCI 週 邊 的 組 態 , 為 裝 置 所 需 的 任 何 位 址 空 間 配 置 一 個 安 全 的 地 方 。 在 此 之 後 , 每 當 裝 置 驅 動 程 式 存 取 裝 置,裝 置 的 記 憶 體 與 I/O 位 址 就 已 經 對 應 到 處 理 器 的 定 址 空 間 中 。 驅 動 程 式 也 可 修 改 預 設 安 排 方 式 。 當 作 業 系 統 (OS)載 入 Driver 到 記 憶 體 後 , 驅 動 程 式 的 初 始 碼 (initial code)會 藉 由 制 造 商 識 別 碼 (Vendor ID)、裝置識 別碼(Device ID)來呼叫 PCI BIOS 以發出找尋相關裝置的請求。同時 也利用類別碼(Class code)找尋該裝置是否存在(000000h 代表裝置不 存在,本例中類別碼 FF0000h 為不符合已定義類別裝置)。若同樣的制 造 商 識 別 碼 (Vendor ID)、裝置識別碼(Device ID)有一個以上時,
PCI BIOS 會將這些匯 流 排 編 號( bus number)、裝 置 編 號( device number )、 功 能 編 號 ( function number ) 傳 回 驅 動 程 式 , 而 後 驅 動 程 式 藉 由 呼 叫 PCI BIOS 的 服 務 (service)及 編 號 存 取 該 裝 置 的 組 態 空 間 以 得 知 須 配 置 的 資 源 。
本 例 中 PCI 裝 置 使 用 32 位 元 PCI 介 面 , 規 劃 為 被 動 端 (Target) , 工 作 頻 率 為 33MHz 。 其 開 機 初 始 組 態 暫 存 器
( configuration register ) 如 表 4.1 所 示 ( 位 址 空 間 全 部 256Byte, 只 有 前 64Byte 有 被 定 義 使 用 )。 驅 動 程 序 為 系 統 讀 取 裝 置 組 態 空 間 後 配 置 兩 塊 記 憶 體 空 間 與 一 個 中 斷 向 量 。 第 一 塊 記 憶 體 空 間 為 256Mbyte,主 要 作 為 記 憶 體 映 射 區 (存 放 擷 取 影 像 資 料 )。第 二 塊 記 憶 體 空 間 為 1Kbyte,規 劃 作 為 PCI 裝 置 之 控 制 命 令 暫 存 區 。 將 配 置 的 第 一 塊 記 憶 體 空 間 起 始 位 址 寫 回 Base Address Register 0 (BAR0) 組 態 暫 存 器 ( 位 址 13h~10h), 將 第 二 塊 記 憶 體 空 間 起 始 位 址 寫 回 Base Address Register 1 (BAR1)組 態 暫 存 器 (位 址 17h~14h), 如 此 即 算 完 成 記 憶 體 映 射 。 另 外 命 令 暫 存 器 (Command Register) 需 填 入 0142h ( 位 址 05h~04h) , 指 定 PCI 裝 置 功 能 ( only target memory access ), 最 後 再 將 中 斷 向 量 填 入 3Ch 位 置 , 如 此 即 算 完 成 PCI 裝 置 的 驅 動 。 完 成 驅 動 後 可 透 過 BAR0 與 BAR1 的 存 取 來 控 制 PCI 裝 置 的 動 作 。 應 用 程 式 將 擷 取 影 像 寫 入 BAR0 後 , 只 需 向 BAR1 寫 入 啟 動 命 令 , 車 道 偵 測 程 序 即 開 始 進 行 , 之 後 應 用 程 式 監 測 (讀 取 )BAR1 回 應 狀 態 可 知 程 序 執 行 完 成 , 之 後 再 從 BAR0 中 讀 回 偵 測 資 訊 偵 測 程 序 即 告 完 成 。
表 4.1 PCI 組 態 暫 存 器 初 始 狀 態 列 表
pci bus configuration register (開機初始狀態) Byte
Status Register Command Register 04H
04 20 00 00
Class Code Revision ID
08H
FF 00 00 01
BIST Header Type Latency Timer Cache Line Size
0CH 00 00 00 00
Subsystem ID Subsystem Vendor ID 2CH
00 00 00 00
Expansion ROM Base Address Register 30H
Maximum Latency Minimum Grant Interrupt Pin Interrupt Line 3CH