次の方法で共有


GPIO ドライバー サポートの概要

Windows 8 以降では、GPIO フレームワーク拡張機能 (GpioClx) により、GPIO コントローラー デバイス用のドライバーを記述するタスクが簡略化されます。 さらに、GpioClx により、GPIO ピンに接続される周辺機器に対してドライバー サポートが提供されます。 カーネル モード ドライバー フレームワーク (KMDF) のシステム提供の拡張機能である GpioClx では、GPIO デバイス クラスのメンバーに共通す処理タスクが実行されます。

この概説では、以下のトピックについて説明します。

GPIO コントローラー ドライバー

ハードウェア ベンダーは、GPIO コントローラーを制御するドライバーを提供します。 GPIO コントローラー ドライバーは、GPIO コントローラーのすべてのハードウェア固有の操作を管理する KMDF ドライバーです。 GPIO コントローラー ドライバーは、GpioClx と連携して、データ入力とデータ出力として構成されている GPIO ピンのグループの I/O 要求を処理します。 さらに、このドライバーは GpioClx と連携して、割り込み入力として構成される GPIO ピンからの割り込み要求を処理します。

GPIO コントローラー デバイスには、いくつかの GPIO ピンがあります。 これらのピンは、周辺機器に物理的に接続できます。 GPIO ピンは、データ入力、データ出力、または割り込み要求入力として構成できます。 通常、GPIO ピンは周辺機器専用であり、2 つ以上のデバイスによって共有されることはありません。 GPIO ピンと周辺機器の間の接続は固定されており、ユーザーが変更することはできません (たとえば、周辺機器を取り外して別のデバイスと交換するなど)。 したがって、周辺機器への GPIO ピンの割り当ては、プラットフォーム ファームウェアで記述できます。

次の図は、GPIO コントローラー ドライバーと GpioClx を示しています。

block diagram of gpio components.

GPIO コントローラー ドライバーと GpioClx は、GpioClx デバイス ドライバー インターフェイス (DDI) を介して相互に通信します。 GPIO コントローラー ドライバーは、GpioClx によって実装されるドライバー サポート メソッドを呼び出します。 GpioClx は、GPIO コントローラー ドライバーによって実装されるイベント コールバック関数を呼び出します。

GPIO コントローラー ドライバーは、GPIO コントローラー デバイスのハードウェア レジスタに直接アクセスします。

GpioClx は、GPIO ピンに物理的に接続する周辺機器のドライバーからの I/O 要求を処理します。 GpioClx は、これらの I/O 要求を単純なハードウェア操作に変換します。この操作は、GPIO コントローラー ドライバーによって実装されるイベント コールバック関数を呼び出すことで実行します。 たとえば、一連の GPIO ピンへのデータの読み取りや書き込みを行なうために、GpioClx は CLIENT_ReadGpioPinsCLIENT_WriteGpioPins などのイベント コールバック関数を呼び出します。 GpioClx は GPIO コントローラーの I/O キューを管理するため、このタスクの GPIO コントローラー ドライバーを解放します。

さらに、GpioClx は GPIO コントローラー デバイスからのプライマリ割り込みを処理し、これらの割り込みを周辺機器ドライバーによって処理されるセカンダリ割り込みにマッピングします。 プライマリ割り込みは、ハードウェア デバイスによって生成される割り込みです。 セカンダリ割り込みは、特定のプライマリ割り込みに応答してオペレーティング システムにより生成されます。 プライマリ割り込みとセカンダリ割り込みの両方は、グローバル システム割り込み (GSI) によって識別されます。 ハードウェア プラットフォームの ACPI ファームウェアは、プライマリ割り込みに GSI を割り当て、実行時にオペレーティング システムはセカンダリ割り込みに GSI を割り当てます。

たとえば、ファームウェアは GPIO コントローラーからハードウェア割り込みに GSI を割り当て、オペレーティング システムは割り込み入力として構成されている GPIO ピンに GSI を割り当てます。

GpioClx は、GPIO コントローラー デバイスからハードウェアによって生成されたプライマリ割り込みを処理する ISR を実装します。 周辺機器が GPIO ピンの割り込みをアサートし、このピンの割り込みが有効になり、マスク解除されると、GPIO コントローラーはプロセッサを中断します。 これに対して、カーネル トラップ ハンドラーは GpioClx ISR の実行をスケジュールします。 割り込みの原因となった GPIO ピンを特定するために、GpioClx ISR は、GPIO コントローラー ドライバーによって実装される CLIENT_QueryActiveInterrupts イベント コールバック関数を呼び出します。 続いて GpioClx ISR は、このピンに割り当てられている GSI を検索し、この GSI をハードウェア抽象化レイヤー (HAL) に渡します。 HAL は、この GSI に登録されている ISR を呼び出すことによって、セカンダリ割り込みを生成します。 この ISR は、最初に割り込みをアサートした周辺機器のドライバーに属します。

プライマリ割り込みとセカンダリ割り込みの詳細については、「GPIO 割り込み」を参照してください。

GPIO ピンを使用する周辺機器のドライバー

起動時に、プラグ アンド プレイ (PnP) マネージャーは PnP デバイスと非 PnP デバイスの両方をエミュレートします。 GPIO ピンへの固定接続を持つ非 PnP のデバイスの場合、PnP マネージャーはプラットフォーム ファームウェアに対してクエリを実行して、システム管理ハードウェア リソースとしてこれらのデバイスに割り当てられている GPIO ピンを判断します。

周辺機器の KMDF ドライバーは、EvtDevicePrepareHardware コールバック中に割り当てられたハードウェア リソースを受け取ります。 これらのリソースには、データ出力、データ入力、または割り込み要求入力として構成されている GPIO ピンが含まれる場合があります。

GPIO I/O リソースは、Windows 8 の新しい Windows リソースの種類です。 このリソースは、データ入力またはデータ出力として使用できる 1 つ以上の GPIO ピンのセットで構成されます。 周辺機器ドライバーが読み取りに GPIO I/O リソースを開くと、ドライバーはリソース内のすべてのピンをデータ入力として使用します。 ドライバーが書き込みに GPIO I/O リソースを開くと、ドライバーはリソース内のすべてのピンをデータ出力として使用します。 周辺機器ドライバーが一連の GPIO I/O ピンへの論理接続を開く方法を示すコード例については、次のトピックを参照してください。

KMDF ドライバーの GPIO I/O ピンへの接続

割り込み入力として構成された GPIO ピンは、通常の Windows 割り込みリソースとしてドライバーに割り当てられます。 割り込みリソースの抽象化では、割り込みがプログラム可能な割り込みコントローラーなどではなく GPIO ピンによって実装されている場合でもこれが非表示になります。 したがって、ドライバーは、他の割り込みリソースと同じように GPIO ベースの割り込みリソースを処理できます。

GPIO I/O リソースの GPIO ピンにアクセスするには、周辺機器ドライバーがこのピンへの論理接続を開く必要があります。 KMDF ドライバーは、WdfIoTargetOpen メソッドを呼び出して接続を開きます。 この接続により、ドライバーは I/O 要求を GPIO ピンに送信できます。 ドライバーは、これらのピンからデータを読み取るための IOCTL_GPIO_READ_PINS 要求 (入力ピンの場合) またはデータを書き込むための IOCTL_GPIO_WRITE_PINS 要求 (出力ピンの場合) を送信します。

割り込みリソース内の GPIO ピンから割り込みを受信するため、周辺機器ドライバーは、割り込みサービス ルーチン (ISR) を登録してこのピンによって実装される割り込みリソースから割り込みを受信する必要があります。 KMDF ドライバーは、割り込みに ISR を接続する WdfInterruptCreate メソッドを呼び出します。