次の方法で共有


GPIO-Based ハードウェア リソース

Windows 8 以降では、GPIO コントローラー ドライバーによって制御される汎用 I/O (GPIO) ピンは、システム管理ハードウェア リソースとして他のドライバーで使用できます。 データ入力またはデータ出力として構成されるピンである GPIO I/O ピンは、新しい Windows リソースの種類 である GPIO I/O リソースとして使用できます。 さらに、割り込み要求入力として構成されているピンである GPIO 割り込みピンは、通常の Windows 割り込みリソースとして使用できます。

GPIO I/O リソースは、周辺機器のドライバーが読み取りまたは書き込みを行うことができる 1 つ以上の GPIO ピンのセットを表します。 Windows では、抽象 GPIO I/O リソースを操作するために周辺機器ドライバーを記述できるように、GPIO I/O ピンの基になる実装に関する詳細が非表示になります。 これらの抽象リソースを使用する周辺機器ドライバーは、リソースを実装する GPIO コントローラー ハードウェアに関係なく、プラットフォーム間で動作できます。 GPIO I/O リソースは、基になる GPIO ピンまたはピンを所有する特定の GPIO コントローラー ドライバーにこのリソースを関連付ける WDFIOTARGET ハンドルによって表されます。

通常、GPIO コントローラーの I/O ピンは、コントローラー ハードウェアの機能と、ピンに物理的に接続されているデバイスに応じて、入力用または出力用に構成できます。 したがって、ドライバーは、書き込み操作または読み取り操作のためにこのピンへの論理接続を開くことができますが、両方を開くわけではありません。 ただし、この制約は、GPIO フレームワーク拡張機能 (GpioClx) ではなく、ハードウェアによって課されます。 入力と出力の両方に対して I/O ピンを構成できるハードウェアの場合、GpioClx は、ドライバーが読み取りと書き込みの両方の操作のためにピンへの論理接続を開くようにします。

割り込み要求入力として構成されている GPIO ピンの場合、割り込み要求が割り込みコントローラーまたは専用割り込み要求行ではなく GPIO ピンによって実装されるという事実は、オペレーティング システムによって完全に抽象化されます。 GPIO 割り込みは、抽象割り込みリソースとして周辺機器ドライバーに表示されます。 これらのリソースの抽象化は、GPIO ドライバー スタックとハードウェア抽象化レイヤー (HAL) によってサポートされます。 したがって、割り込みリソースを使用する周辺機器ドライバーは、これらのリソースの基になる実装に関する詳細をほとんど無視できます。 詳細については、「 GPIO 割り込み」を参照してください。

次の図は、2 つの周辺機器ドライバーへの GPIO ベースのリソースの割り当ての例を示しています。

gpio ベースのリソースの割り当ての例。

上の図では、次の 3 つの GPIO ベースのリソースに周辺機器ドライバー A が割り当てられます。

  • 2 つのデータ入力ピン
  • データ出力ピン
  • 割り込み入力ピン

次の 2 つの GPIO ベースのリソースが周辺機器ドライバー B に割り当てられます。

  • データ入力ピン
  • 割り込み入力ピン

ドライバー A と B は、 EvtDevicePrepareHardware コールバック関数で割り当てられたリソースを受け取ります。 ドライバーが 1 つ以上の GPIO I/O ピンのセットをリソースとして受け取った場合、ドライバーはこれらのピンへの接続を開いてアクセスできます。 ドライバーは、接続を識別する WDFIOTARGET ハンドルを取得し、これらのピンとの間で読み取りまたは書き込みを行うために、このハンドルに I/O 要求を送信します。

一連の GPIO I/O ピンに接続し、このピンに I/O 要求を送信する方法を示すコード例については、次のトピックを参照してください。

KMDF ドライバーを GPIO I/O ピンに接続する

どちらのトピックでも、コード例の IoRoutine 関数は、 ReadOperation パラメーター値に応じて、読み取りまたは書き込み用に GPIO I/O ピン リソースを開きます。 リソースが読み取り用に開かれている場合 (DesiredAccess = GENERIC_READ)、リソース内のピンは入力として構成され、ピン リソースに送信された IOCTL_GPIO_READ_PINS 要求は、これらのピンの入力値を読み取ります。 GpioClx では IOCTL_GPIO_WRITE_PINS 要求を入力ピンのセットに送信することを許可せず、そのような要求を STATUS_GPIO_OPERATION_DENIED エラー状態で処理します。 同様に、ピン リソースが書き込み用に開かれている場合 (DesiredAccess = GENERIC_WRITE)、リソース内のピンが出力として構成され、ピン リソースに送信された IOCTL_GPIO_WRITE_PINS 要求によって、これらのピンを駆動する出力ラッチの値が設定されます。 通常、一連の出力ピンに IOCTL_GPIO_READ_PINS 要求を送信すると、出力ラッチに書き込まれた最後の値が読み取られます。

割り込みリソースを使用して割り込みを受信するには、クライアント ドライバーは割り込みサービス ルーチン (ISR) を割り込みに接続する必要があります。 通常、ドライバーは 、WdfInterruptCreate メソッド (または場合によっては 、IoConnectInterruptEx ルーチン) を呼び出すことによって、この接続を行います。 KMDF 割り込みの詳細については、「 割り込みオブジェクトの作成」を参照してください。

ハードウェア プラットフォームに動的に接続したり、ハードウェア プラットフォームから切断したりできるプラグ アンド プレイ デバイスとは対照的に、GPIO コントローラー デバイスは永続的に接続されます。 さらに、GPIO ピンと周辺機器の間の接続は永続的であると見なされます。 (または、周辺機器をスロットから取り外すことができる場合、スロットはこのデバイス専用です)。そのため、使用可能な GPIO リソースは固定されており、プラットフォーム ファームウェアで指定できます。 同様に、GPIO リソースを使用する周辺機器ドライバーは、専用の GPIO リソース セットを使用するものと見なされます。 したがって、これらのデバイス ドライバーのリソース要件は、プラットフォーム ファームウェアで指定できます。

プラットフォーム ファームウェアが GPIO ピンのセットを GPIO I/O リソースとして指定する場合、ファームウェアは、このリソース内のピンを読み取り、書き込み、または読み取りと書き込みの両方で開くことができるかどうかを示します。

周辺機器ドライバーが複数の GPIO I/O リソースを使用する場合、このドライバーは、PnP マネージャーによってこれらのリソースが列挙される順序を認識する必要があります。 たとえば、ドライバーが 2 つの GPIO I/O ピンを使用しているが、これらのピンに個別にアクセスする必要がある場合、プラットフォーム ファームウェアは、各ピンを個別の GPIO I/O リソースとして記述する必要があります。 PnP マネージャーは、これらのリソースを、ドライバーで想定される順序と一致する必要がある、プラットフォーム ファームウェアで説明されている順序で列挙します。

周辺機器ドライバーが GPIO I/O リソースへの接続を開いた後、このドライバーがこの接続に送信する IOCTL_GPIO_READ_PINS または IOCTL_GPIO_WRITE_PINS 要求は、リソース内のすべてのピンにアクセスします。 ドライバーがこれらのピンのサブセットにのみアクセスする必要がある場合は、このサブセットを別のリソースとしてドライバーに割り当てる必要があります。

要求出力バッファー 内の ビットへのデータ入力ピンのマッピングなど、IOCTL_GPIO_READ_PINS要求の詳細については、 IOCTL_GPIO_READ_PINSを参照してください。 要求入力バッファー 内の ビットとデータ出力ピンのマッピングなど、IOCTL_GPIO_WRITE_PINS要求の詳細については、 IOCTL_GPIO_WRITE_PINSを参照してください。