次の方法で共有


GPIO ベースのハードウェア リソース

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 リソースは、基になる 1 つまたは複数の GPIO ピンを所有する特定の GPIO コントローラー ドライバーにこのリソースを関連付ける WDFIOTARGET ハンドルによって表されます。

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

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

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

example assignment of gpio-based resources.

上の図では、次の 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」を参照してください。