SPB 周辺機器ドライバーの概要
SPB 周辺機器デバイス ドライバーは、SPB (simple peripheral bus) に接続された周辺機器を制御します。 このデバイスのハードウェア レジスターは、SPB を介してのみ利用できます。 デバイスに対して読み取りまたは書き込みを行うには、ドライバーから SPB コントローラーに I/O 要求を送信する必要があります。 このコントローラーのみが、デバイスとの間で SPB を経由したデータ転送を開始できます。
Windows 8 以降、Windows は単純な周辺機器バス (SPB) 上の周辺機器のドライバー サポートを提供します。 I2C や SPI などの SPB は、加速度計、GPS デバイス、バッテリ レベルのモニターなど、低速センサー デバイスの接続に広く使用されています。 この概要では、SPB 周辺機器ドライバーが他のシステム コンポーネントと連携して、SPB に接続された周辺機器を制御する方法について説明します。
SPB 周辺機器ドライバーは、ユーザー モード ドライバー フレームワーク (UMDF) またはカーネル モード ドライバー フレームワーク (KMDF) を使用するように構築できます。 UMDF ドライバーの開発の詳細については、UMDF の概要に関するページを参照してください。 KMDF ドライバーの開発の詳細については、「カーネル モード ドライバー フレームワークの概要」を参照してください。
デバイスの構成情報
SPB に接続された周辺機器のハードウェア レジスタはメモリ マップされません。 デバイスには SPB コントローラーを介してのみアクセスでき、コントローラーは、SPB 経由でデバイスとの間でデータを順次転送します。 I/O 操作を実行するには、SPB 周辺機器ドライバーは、デバイスに I/O 要求を送信し、SPB コント ローラーは、これらの要求を完了するために必要なデータ転送を実行します。 SPB 上の周辺機器に送信できる I/O 要求の詳細については、「SPB I/O 要求インターフェイスの使用」を参照してください。
次の図は、SPB (この場合は I2C バス) が 2つの周辺機器を System on a Chip (SoC) モジュールに接続するハードウェア構成の例を示しています。 周辺機器は SoC モジュールの外部にあり、モジュールの 4 つのピンに接続します。 SoC モジュールには、メイン プロセッサ (図示せず) に加えて、I2C コントローラーと汎用 I/O (GPIO) コントローラーが含まれています。 プロセッサは、I2C コントローラを使用して、2 つの周辺機器との間でデータをシリアルに送信します。 これらのデバイスからの割り込み要求ラインは、割り込み入力として構成されている 2 つの GPIO ピンに接続されます。 デバイスが割り込み要求を通知すると、GPIO コントローラーは割り込みをプロセッサに中継します。
この例の GPIO コントローラーと I2C コントローラーは SoC モジュールに統合されているため、ハードウェア レジスタはメモリマップされ、プロセッサから直接アクセスできます。 ただし、プロセッサは、I2C コントローラーを介して、2 つの周辺機器のハードウェア レジスタにのみ間接的にアクセスできます。
SPB は プラグ アンド プレイ (PnP) バスではないため、バスに接続されている新しいデバイスを自動的に検出して構成するのに使用することはできません。 SPB に接続されたデバイスのバス接続と割り込み接続は、多くの場合永続的です。 デバイスをスロットから取り外すことができる場合でも、このスロットは通常、デバイス専用です。 さらに、SPB は、バス上の周辺機器からバス コントローラーに割り込み要求を中継するためのインバンド ハードウェア パスは提供していません。 その代わり、割り込みのハードウェア パスはバス コントローラーとは別です。
ハードウェア プラットフォームのベンダーは、SPB に接続された周辺機器の構成情報をプラットフォームの ACPI ファームウェアに格納します。 システムの起動中、ACPI ドライバーは、PnP マネージャーのバス上のデバイス を列挙します。 ACPI は、列挙されたデバイスごとに、デバイスのバスと割り込み接続に関する情報を提供します。 PnP マネージャーは、リソース ハブと呼ばれるデータストアにこの情報を 格納します。
デバイスが起動すると、PnP マネージャーは、リソース ハブがデバイスに格納する構成情報をカプセル化するハードウェア リソースのセットをデバイスのドライバーに提供します。 これらのリソースには、接続 ID と割り込み番号が含まれています。 接続 ID は、SPB コントローラー、バス アドレス、バス クロック周波数などのバス接続情報をカプセル化します。 I/O 要求をデバイスに送信する前に、ドライバーは最初に接続 ID を使用してデバイスへの論理接続を開く必要があります。 割り込み番号は、ドライバーが割り込みサービス ルーチン (ISR) を接続できる Windows 割り込みリソースです。 接続 ID と割り込み番号は、物理バスと割り込み接続に関するプラットフォーム固有の情報を非表示にする高度な抽象化であるため、ドライバーを 1 つのハードウェア プラットフォームから別のプラットフォームに簡単に移植できます。
ソフトウェアレイヤーとハードウェアレイヤー
次のブロック図は、SPB 上の周辺機器をデバイスを使用するアプリケーション プログラムに接続するソフトウェアとハードウェアのレイヤーを示しています。 この例の SPB 周辺機器ドライバーは UMDF ドライバーです。 周辺機器 (図の下部) はセンサー デバイス (加速度計など) です。 前の図と同様に、周辺機器は I2C バスに接続され、GPIO コントローラー上のピンを介して割り込み要求を通知します。
灰色で示されている 3 つのブロックは、システムが提供するモジュールです。 Windows 7 以降では、センサー クラス拡張機能は、UMDF のセンサー固有の拡張機能として使用できます。 Windows 8 以降では、SPB フレームワーク拡張機能 (SpbCx) と GPIO フレームワーク拡張機能 (GpioClx) は、それぞれ SPB コントローラーと GPIO コントローラーに固有の機能を実行する KMDF の拡張機能として使用できます。
上の図の上部で、アプリケーションは Sensor API または Location API のメソッドを呼び出してセンサー デバイスと通信します。 これらの呼び出しを通じて、アプリケーションはデバイスに I/O 要求を送信し、デバイスからイベント通知を受信できます。 これらの API の詳細については、「Windows のセンサーと場所プラットフォームの概要」を参照してください。
アプリケーションが SPB 周辺機器ドライバーとの通信を必要とするメソッドを呼び出すと、Sensor API または Location API によって I/O 要求が作成され、SPB 周辺機器ドライバーに送信されます。 センサー クラス拡張モジュールは、これらの I/O 要求を処理するドライバーを支援します。 ドライバーが新しい I/O 要求を受信すると、ドライバーはすぐにセンサー クラス拡張機能に要求を受け取り、ドライバーが処理する準備ができるまで要求がキューに入れられます。 アプリケーションからの I/O 要求で周辺機器との間でデータの転送が必要な場合、SPB 周辺機器ドライバーは、この転送の I/O 要求を作成し、I2C コントローラーに要求を送信します。 このような要求は、SpbCx と I2C コントローラー ドライバーによって共同で処理されます。
SpbCx は、この例の I2C コントローラーなど、SPB コントローラーの I/O 要求のキューを管理するシステム提供のコンポーネントです。 I2C コントローラー ドライバーは、コントローラーのハードウェア ベンダーによって提供され、I2C コントローラー内のすべてのハードウェア固有の操作を管理します。 たとえば、コントローラー ドライバーは、I2C バス経由で周辺機器との間でデータ転送を開始するために、コントローラーのメモリマップされたハードウェア レジスタにアクセスします。
周辺機器は、SPB 周辺機器ドライバーまたはユーザー モード アプリケーションからの注意が必要なハードウェア イベントが発生したときに割り込み要求を通知します。 周辺機器からの割り込みラインは、割り込み要求を受信するように構成された GPIO ピンに接続されます。 デバイスが GPIO ピンに割り込みを通知すると、GPIO コントローラーはプロセッサに割り込みを通知します。 この割り込みに応答して、カーネルの割り込みトラップ ハンドラーは GpioClx の ISR を呼び出します。 この ISR は、GPIO コントローラー ドライバーに対してクエリを実行し、GPIO コントローラーのメモリマップされたハードウェア レジスタにアクセスして、割り込み GPIO ピンを識別します。 割り込みを無音にするには、GPIO コントローラー ドライバーは、GPIO ピンで割り込み要求をクリアするか (割り込みがエッジ によってトリガーされた場合)、または (レベルによってトリガーされた場合) 割り込み要求をマスクします。 トラップ ハンドラーが戻ったときにプロセッサが同じ割り込みを再度実行しないように、割り込みを無音にする必要があります。 レベルによってトリガーされる割り込みの場合、SPB 周辺機器ドライバーの ISR は、GPIO ピンをマスク解除する前に割り込みをクリアする周辺機器のハードウェア レジスタにアクセスする必要があります。
カーネルの割り込みトラップ ハンドラーが戻る前に、IRQL = PASSIVE_LEVEL で実行するように SPB 周辺機器ドライバーの ISR をスケジュールします。 Windows 8 以降、UMDF ドライバーは、ドライバーが抽象 Windows 割り込みリソースとして受け取る割り込みに ISR を接続できます。詳細については、「割り込みの処理」を参照してください。 呼び出す ISR を決定するために、オペレーティング システムは割り込み GPIO ピンに割り当てられている仮想割り込みを検索し、割り込みに接続されている ISR を探します。 この仮想割り込みは、前の図のセカンダリ割り込みとしてラベル付けされています。 これに対し、GPIO コントローラーからのハードウェア割り込みは、プライマリ割り込みとしてラベル付けされます。
SPB 周辺機器ドライバーの ISR はパッシブ レベルで実行されるため、ISR は同期 I/O 要求を使用して周辺機器のハードウェア レジスタにアクセスできます。 ISR は、これらの要求が完了するまでブロックできます。 ISR は比較的高い優先度で実行されるため、できるだけ早く返し、割り込みのすべてのバックグラウンド処理を優先順位の低いワーカー ルーチンに延期する必要があります。
セカンダリ割り込みに応答して、SPB 周辺機器ドライバーはセンサー クラス拡張機能でイベントを投稿し、Sensor API または Location API を介してユーザー モード アプリケーションにイベントが通知されます。