SPB 周邊設備驅動器概觀
SPB 周邊設備驅動器會控制連接到簡單周邊總線 (SPB) 的周邊裝置。 此裝置的硬體緩存器只能透過SPB取得。 若要讀取或寫入裝置,驅動程式必須將 I/O 要求傳送至 SPB 控制器。 只有此控制器可以透過SPB起始往返裝置的數據傳輸。
從 Windows 8 開始,Windows 提供簡單周邊總線上周邊裝置的驅動程序支援。 I 2C 和 SPI 等SPB 通常用於連線到低速感測器裝置,例如加速計、GPS 裝置和電池電量監視器。 本概觀說明 SPB 周邊設備驅動器如何與其他系統元件合作,控制 SPB 連接的周邊裝置。
您可以建置 SPB 周邊設備驅動器,以使用 使用者模式驅動程式架構 (UMDF) 或 內核模式驅動程式架構 (KMDF)。 如需開發 UMDF 驅動程式的詳細資訊,請參閱 開始使用 UMDF。 如需開發 KMDF 驅動程式的詳細資訊,請參閱 開始使用內核模式驅動程序架構。
裝置組態資訊
SPB 連線周邊裝置的硬體緩存器不會對應記憶體。 裝置只能透過SPB控制器來存取,而SPB控制器會透過SPB來序列傳輸資料。 若要執行 I/O 作業,SPB 周邊設備驅動器會將 I/O 要求傳送至裝置,而 SPB 控制器會執行完成這些要求所需的數據傳輸。 如需可傳送至SPB上周邊裝置之 I/O 要求的詳細資訊,請參閱 使用SPB I/O要求介面。
下圖顯示SPB在此案例中,I2C 總線會將兩個周邊裝置連線到晶片上系統 (SoC) 模組的硬體組態範例。 周邊裝置位於SoC模組外部,並連線到模組上的四個針腳。 SoC 模組包含主要處理器(未顯示),加上 I2C 控制器和一 般用途 I/O (GPIO) 控制器。 處理器會使用 I2C 控制器,以序列方式從兩個周邊裝置來回傳輸數據。 來自這些裝置的中斷要求行會連線到設定為中斷輸入的兩個 GPIO 針腳。 當裝置發出中斷要求訊號時,GPIO 控制器會將中斷轉接至處理器。
由於此範例中的 GPIO 控制器和 I2C 控制器已整合到 SoC 模組中,因此其硬體緩存器會經過記憶體對應,而且可由處理器直接存取。 不過,處理器只能透過I2C 控制器間接存取兩個周邊裝置的硬體緩存器。
SPB 不是 隨插即用 (PnP) 總線,因此無法用來自動偵測及設定插入總線的新裝置。 SPB 連線裝置的總線和中斷連線通常永久。 即使裝置可以從插槽中卸除,此位置通常也專用於裝置。 此外,SPB 不提供頻內硬體路徑,以將總線上的周邊裝置中斷要求轉送至總線控制器。 相反地,中斷的硬體路徑與總線控制器不同。
硬體平臺的廠商會將SPB連線周邊裝置的設定資訊儲存在平臺ACPI韌體中。 在系統啟動期間, ACPI 驅動程式會 列舉 PnP 管理員總線上的裝置。 針對每個列舉裝置,ACPI 會提供裝置總線和中斷連線的相關信息。 PnP 管理員會將此資訊儲存在稱為資源中樞的數據存放區中。
裝置啟動時,PnP 管理員會為裝置的驅動程式提供一組 硬體資源 ,以封裝資源中樞為裝置儲存的組態資訊。 這些資源包括連線標識碼和中斷號碼。 線上標識碼會封裝總線連線資訊,例如SPB控制器、總線位址和總線時鐘頻率。 在 I/O 要求可以傳送至裝置之前,驅動程式必須先使用連線標識碼來開啟裝置的邏輯連線。 插斷號碼是 Windows 中斷資源,驅動程式可以連接其中斷服務例程 (ISR)。 驅動程式可以輕鬆地從一個硬體平臺移植到另一個硬體平臺,因為聯機標識符和插斷號碼是高階抽象概念,可隱藏有關實體總線和中斷聯機的平臺特定資訊。
軟體和硬體層
下圖顯示將SPB上的周邊裝置連線到使用裝置之應用程式程式的軟體和硬體層。 此範例中的SPB周邊設備驅動器是UMDF驅動程式。 周邊裝置(圖表底部)是感測器裝置(例如加速計)。 如上圖所示,周邊裝置會連線到 I2C 總線,並透過 GPIO 控制器上的針腳發出中斷要求訊號。
灰色顯示的三個區塊是系統提供的模組。 從 Windows 7 開始, 感測器類別擴充 功能可作為 UMDF 的感測器特定擴充功能。 從 Windows 8 開始, SPB 架構延伸模組 (SpbCx) 和 GPIO 架構延伸模組 (GpioClx) 可做為 KMDF 的延伸模組 ,分別執行 SPB 控制器和 GPIO 控制器專屬的函式。
在上圖頂端,應用程式會呼叫感測器 API 或位置 API 中的方法,以與感測器裝置通訊。 透過這些呼叫,應用程式可以將 I/O 要求傳送至裝置,並從裝置接收事件通知。 如需這些 API 的詳細資訊,請參閱 Windows 中的感測器和位置平台簡介。
當應用程式呼叫需要與SPB周邊設備驅動器通訊的方法時,感測器 API 或位置 API 會建立 I/O 要求,並將其傳送至 SPB 周邊設備驅動器。 感測器類別擴充模組可協助驅動程式處理這些 I/O 要求。 當驅動程式收到新的 I/O 要求時,驅動程式會立即將要求交給感測器類別延伸模組,這會將要求排入佇列,直到驅動程式準備好處理它為止。 如果來自應用程式的 I/O 要求需要將資料傳送到周邊裝置或從周邊裝置傳輸,SPB 周邊設備驅動器會為此傳輸建立 I/O 要求,並將要求傳送至 I2C 控制器。 這類要求是由SpbCx和I2C控制器驅動程式共同處理。
SpbCx 是系統提供的元件,可管理 SPB 控制器的 I/O 要求佇列,例如此範例中的 I2C 控制器。 由控制器的硬體廠商提供的 I2C 控制器驅動程式會管理 I2C 控制器中的所有硬體特定作業。 例如,控制器驅動程式會存取控制器的記憶體對應硬體緩存器,以透過 I2C 總線起始往返周邊裝置的數據傳輸。
當發生需要SPB周邊設備驅動器或使用者模式應用程式注意的硬體事件時,周邊裝置會發出中斷要求訊號。 周邊裝置的中斷線會連線到設定為接收中斷要求的 GPIO 針腳。 當裝置向 GPIO 針腳發出中斷訊號時,GPIO 控制器會向處理器發出中斷訊號。 為了回應此中斷,核心的插斷陷阱處理程式會呼叫 GpioClx 的 ISR。 此 ISR 會查詢 GPIO 控制器驅動程式,然後存取 GPIO 控制器的記憶體對應硬體快取器,以識別中斷的 GPIO 針腳。 為了讓插斷無聲,GPIO 控制器驅動程式會清除(如果中斷是邊緣觸發的),或遮罩(如果已觸發層級),則插斷要求位於 GPIO 針腳。 當陷阱處理程式傳回時,必須讓插斷停止,以防止處理器再次接受相同的插斷。 針對層級觸發的中斷,SPB 周邊設備驅動器中的ISR必須存取周邊裝置的硬體緩存器,才能清除中斷,才能解除遮罩 GPIO 針腳。
在核心的插斷陷阱處理程式傳回之前,它會排程SPB周邊設備驅動器中的ISR,以在IRQL = PASSIVE_LEVEL執行。 從 Windows 8 開始,UMDF 驅動程式可以將其 ISR 連接到驅動程式接收為抽象 Windows 中斷資源的中斷;如需詳細資訊,請參閱 處理中斷。 若要判斷要呼叫哪一個ISR,操作系統會查閱指派給中斷 GPIO 針腳的虛擬中斷,並尋找連線到中斷的ISR。 此虛擬中斷標示為 上圖中的次要 中斷。 相反地,GPIO 控制器的硬體中斷會標示為 主要 中斷。
由於SPB周邊設備驅動器中的ISR會在被動層級執行,因此ISR可以使用同步I/O要求來存取周邊裝置中的硬體緩存器。 ISR 可以封鎖,直到這些要求完成為止。 以相對較高的優先順序執行ISR應該儘快傳回,並將中斷的所有背景處理延遲到優先順序較低的背景工作例程。
為了回應次要中斷,SPB 周邊設備驅動器會在感測器類別擴充功能中張貼事件,這會透過感測器 API 或位置 API 通知事件的使用者模式應用程式。