GpioClx I/O と割り込みインターフェイス
通常、GPIO コントローラーのクライアントは、GPIO ピンに接続される周辺機器のドライバーです。 これらのドライバーでは、低帯域幅のデータ チャネル、デバイス選択の出力、および割り込み要求の入力として GPIO ピンが使用されます。 周辺機器のドライバーにより、データ入力またはデータ出力として構成されている GPIO ピンへの論理接続が開かれます。 これらの接続を使用して、これらのピンに I/O 要求が送信されます。 さらに、周辺機器のドライバーでは、割り込み要求の入力として構成されている GPIO ピンに、割り込みサービス ルーチンを論理的に接続できます。
GPIO ピンは、システムで管理されるハードウェア リソースです。 周辺機器ドライバーがデバイスを起動する前に、プラグ アンド プレイ (PnP) マネージャーはこのドライバーにハードウェア リソースの一覧を割り当てます。 ハードウェア リソースのこの一覧には、次のようなものが含まれます。
- GPIO I/O リソース。 このリソースは、データ入力またはデータ出力として構成されている 1 つ以上の GPIO ピンのセットです。 GPIO I/O リソースは、Windows 8 以降の新しい Windows リソースの種類です。
- 割り込み。 この割り込みリソースは、割り込み入力として構成された GPIO ピンとして実装される場合がありますが、代わりに設定可能な割り込みコントローラーまたはプロセッサ パッケージの専用割り込みピンとして実装される場合もあります。 ハードウェア抽象化レイヤー (HAL) 割り込み抽象化では、これらの実装の詳細が非表示になります。クライアント ドライバーは無視しても問題ありません。
周辺機器ドライバーは、データ入力または出力として GPIO ピンのセットを使用する前に、これらのピンへの論理接続を開く必要があります。 たとえば、カーネル モード ドライバー インターフェイス (KMDF) ドライバーは、WDFIOTARGET ハンドルを取得して接続を識別します。 ドライバーはこのハンドルを使用して、ピンに I/O 要求を送信します。 具体的には、クライアント ドライバーは、出力ピンへのデータの書き込みおよび入力ピンからのデータの読み取りを行うために、IOCTL_GPIO_WRITE_PINS および IOCTL_GPIO_READ_PINS の I/O コントロール要求を送信します。 一連の GPIO I/O ピンに接続する方法を示すコード例については、次のトピックを参照してください。
割り込みリソースを使用して割り込みを受信するには、周辺機器ドライバーは割り込みサービス ルーチン (ISR) を割り込みに論理的に接続する必要があります。 たとえば、カーネル モード ドライバーは、WdfInterruptCreate メソッドまたは IoConnectInterruptEx ルーチンを呼び出してこの接続を行うことができます。 接続後、周辺機器が GPIO ピンまたは割り込みコントローラー入力に割り込み要求を通知すると、ドライバーの ISR が実行されます。 割り込みについての詳細は、「割り込みオブジェクトの作成」を参照してください。
GPIO フレームワーク拡張機能 (GpioClx) は、クライアントである周辺機器ドライバーの I/O 接続と割り込み接続の両方を管理します。 PnP マネージャーは、異なるクライアント ドライバーに GPIO コントローラー デバイス上の GPIO ピンの異なるグループを割り当てることができます。 これらのピンの一部はデータ入力またはデータ出力として構成され、別の一部は割り込み要求入力として構成されます。
クライアント ドライバーが割り込み要求を受信したり、I/O 要求を GPIO ピンに送信したりすると、GpioClx は GPIO コントローラー ドライバーによって実装されるイベント コールバック関数を呼び出します。 これらのコールバックは、GPIO コントローラー デバイスのハードウェア レジスタにアクセスします。 これらの関数呼び出しにより、GpioClx はデータ入力の読み取り、データ出力への書き込み、割り込み要求の管理を行います (割り込み入力として構成されている GPIO ピンのクエリ、有効化、マスク化、クリアなど)。
GpioClx は、クライアントによって開かれた I/O および割り込み接続を管理するために必要なすべての処理を実行します。 GPIO コントローラー ドライバーは、これらの接続の管理を GpioClx に委任することで、GPIO コントローラー デバイス内のハードウェア レジスタにアクセスする比較的単純なタスクのみを行ないます。 GPIO コントローラー ドライバーは、特定のアクセスが行われるクライアント ドライバーを認識する必要はありません。