汎用入出力 (GPIO)

システム オン チップ (SoC) 集積回路では、汎用 I/O (GPIO) ピンが幅広く使用されています。 SoC ベースのプラットフォームの場合、Windows は GPIO ハードウェアの一般的な抽象化を定義します。この抽象化には、Advanced Configuration and Power Interface (ACPI) 名前空間からのサポートが必要です。

GPIO の抽象化は、この記事に記載される ACPI 5.0 仕様定義でサポートされています。

GPIO コントローラーがすべての Windows プラットフォーム要件を満たしていることを確認するには、「GPIO コントローラーの要件チェックリスト」を参照してください。

GPIO コントローラー デバイス

Windows では、GPIO コントローラーがサポートされています。 GPIO コントローラーは、割り込み、入力信号、出力信号を含め、周辺機器にさまざまな機能を提供します。 GPIO 機能は、名前空間の GPIO コントローラー デバイスとしてモデル化されます。 GPIO フレームワーク拡張機能 (GpioClx) は、GPIO コントローラー デバイスをいくつかのピンのバンクにパーティション分割されているものとしてモデル化します。 各ピンのバンクには、構成可能なピンが 64 個以下あります。 GPIO コントローラー内のバンクは、コントローラーの相対 GPIO ピン空間内でのピンの位置を基準にして並べ替えられます。 たとえば、バンク 0 にはコントローラーのピン 0 ~ 31、バンク 1 にはピン 32 ~ 63 が含まれます。 すべてのバンクには同数のピンがありますが、ただし最後のバンクではこれより少数になることがあります。 ファームウェアは、システム割り込みリソースのマッピングをバンクに報告する必要があるため、ACPI ファームウェアにとってバンクは重要です。これについては、次の「GPIO 名前空間オブジェクト」章で説明します。

バンク上の各ピンには、ピンの構成方法を記述する一連のパラメーター (出力、レベル依存割り込み、デバウンス入力など) があります。

GPIO コントローラーと ActiveBoth 割り込み

一部の GPIO コントローラーには、信号の両エッジ (立ち上がり、ActiveHigh エッジ、立ち下がりエッジ、ActiveLow エッジ) で割り込みを生成する機能が備わっています。 これは、ボタン インターフェイスを含むさまざまなアプリケーションで便利です。このインターフェイスでは、ボタンを押すイベント (1 方のエッジ) とボタンを放すイベント (もう 1 方のエッジ) の両方が意味を持ちます。 この機能は、「ActiveBoth」と呼ばれます。

論理的には、ActiveBoth 信号は、一時的なアサーション (プッシュ ボタンなど) であるか、無期限に長いアサーション (ヘッドフォンのジャック挿入など) であるかに関係なく、アサート状態と非アサート状態の両方を持っています。 ActiveBoth 割り込みのエッジ検出は、GPIO コントローラー ハードウェア (ハードウェア ActiveBoth) に実装されるか、GPIO ドライバー ソフトウェア (エミュレートされた ActiveBoth) でエミュレートされる場合があります。 Windows では、ActiveBoth を実装する GPIO コントローラーでエミュレートされた ActiveBoth を使用する必要があります。 これは、すべてのシナリオで二重エッジ割り込みを確実に処理するために必要です。 ActiveBoth エミュレーションをサポートする場合、次のハードウェア要件が適用されます。

  1. ActiveBoth 割り込みをサポートする GPIO コントローラーは、レベル モードの割り込みをサポートする必要があり、ランタイム時に割り込みの極性の動的な再設定をサポートしている必要があります。

  2. I/O エラーのリスクを最小限に抑えるために、Windows では、SPB に接続された GPIO コントローラーではなく、メモリ マップされた GPIO コントローラーを使用することが推奨されます。 実際、Windows ボタン配列デバイス (PNP0C40) の場合、このデバイスの ActiveBoth GPIO 割り込みは、SPB に接続された GPIO コントローラーではなく、メモリ マップされた GPIO コントローラーに接続する必要があります。 どのボタン割り込みを ActiveBoth にするかを判断するには、「その他の ACPI 名前空間オブジェクト」トピックの「ボタン デバイス」章を参照してください。

  3. ActiveBoth 割り込みシグナルの確定的な初期状態を確立するため、Windows GPIO デバイス スタックは、ドライバーによる割り込みの接続後に生成される最初の割り込みが常に信号のアサート状態に対して行なわれるようにします。 さらに、スタックでは、すべての ActiveBoth 割り込み行のアサート状態がデフォルトで低いロジック レベル (ActiveLow エッジ) であることを前提とします。 これが使用するプラットフォームには当てはまらない場合は、コントローラーの名前空間に GPIO コントローラーのデバイス固有メソッド (_DSM) を含めることで、デフォルトをオーバーライドできます。 このメソッドの詳細については、「GPIO コントローラーのデバイス固有のメソッド (_DSM)」を参照してください。

上記の一覧の 3 番目の要件では、GPIO ピン の時点での信号がアサート状態である場合に、ActiveBoth を使用するデバイスのドライバーは割り込みを初期化 (接続) した直後に割り込みを受信する可能性があることを意味します。 これは可能であり、一部のデバイス (ヘッドフォンなど) ではその傾向が高く、また、ドライバーでサポートされている必要があります。

エミュレートされた ActiveBoth をサポートするには、GPIO コントローラー ドライバーは、CLIENT_ReconfigureInterrupt コールバック関数を実装し、ドライバーの CLIENT_QueryControllerBasicInformation コールバック関数が GpioClx に提供する基本的な情報構造で EmulateActiveBoth フラグを設定することによって、ActiveBoth エミュレーションを有効にする必要があります (「オプトイン」)。 詳細については、「汎用 I/O (GPIO) ドライバー」を参照してください。

GPIO 名前空間オブジェクト

GPIO コントローラーとそのコントローラーに接続する周辺機器は、ACPI によって列挙されます。 これらの接続は、GPIO 接続リソース記述子を使用して記述されます。 詳細については、ACPI 5.0 仕様の 6.4.3.8 章「接続記述子」を参照してください。

デバイスの識別と構成オブジェクト

GPIO コントローラー デバイスの ACPI 名前空間には、次のものが含まれます。

  • ベンダー割り当て ACPI 準拠ハードウェア ID (_HID) オブジェクト。
  • 消費された一連のリソース (_CRS) オブジェクト。
  • 名前空間に GPIO コントローラーのインスタンスが複数存在する場合 (つまり、同じデバイス識別オブジェクトを持つ 2 つ以上の名前空間ノード)、一意の ID (_UID) オブジェクト。

GPIO コントローラーの_CRSには、GPIO コントローラー内のすべてのバンクによって消費されるすべてのリソース (レジスタのアドレス空間、システム割り込みなど) が含まれています。 リソースとバンク間の割り込みのマッピングは、割り込みリソースが _CRS に一覧表示される順序で表されます。つまり、リストされている最初の割り込みはバンク 0 に割り当てられ、次にリストされている割り込みはバンク 1 に割り当てられる、などです。 バンクは割り込みリソースを共有できます。その場合、割り込みは接続される各バンクに対してバンク順に 1 回ずつ表示され、共有として構成されます。

GPIO 接続リソース記述子

周辺機器と周辺機器が接続されている GPIO ピンの間の関係は、GPIO 接続リソース記述子によってオペレーティング システムに記述されます。 これらのリソース記述子は、GPIO 割り込み接続と GPIO I/O 接続の 2 種類の GPIO 接続を定義できます。 周辺機器には、接続しているすべての GPIO I/O および割り込みピンの _CRS に GPIO 接続記述子が含まれます。 接続された割り込みがウェイク対応 (低電力アイドル状態からシステムをウェイクする機能) である場合は、ExclusiveAndWake または SharedAndWake として構成する必要があります。 詳細については、「デバイスの電源管理」を参照してください。

記述子は、ACPI 5.0 仕様の 6.4.3.8.1 章「GPIO 接続記述子」で定義されています。 これらの記述子の ASL リソース テンプレート マクロについては、ACPI 5.0 仕様の 19.5.53 章「GpioInt (GPIO 割り込み接続リソース記述子マクロ)」で説明しています。

GPIO 信号 ACPI イベント

ACPI は、プラットフォーム内のハードウェア イベントを通知して ACPI ドライバーに通信できるようにするプラットフォーム イベント モデルを定義します。 Windows では、デバイス ドライバーにプラットフォーム イベントを通信するための通知サービスを提供しています。 多くの受信トレイ ドライバーは、コントロール メソッドの電源ボタン、LID デバイス、制御方法バッテリ、サーマル ゾーンなど、ACPI で定義されたデバイスのサポートを提供するために、このサービスに依存しています。 通知の詳細については、ACPI 仕様の 5.6.5 章「GPIO-Signaled ACPI イベント」を参照してください。

SoC プラットフォームの場合、GPIO 割り込みはプラットフォーム イベントを通知するために使用されます。 ASL Notify オペレーターを使用してドライバーにイベントを通知する名前空間デバイス (「ACPI イベント ソース」デバイス) には、次の要件があります。

  • ACPI イベント信号が接続されている GPIO コントローラーの名前空間ノードには、そのピンの GpioInt リソースを ACPI イベント情報 (_AEI) オブジェクトに含める必要があります (後述の「ACPI イベント情報 (_AEI) オブジェクト」を参照)。 GpioInt リソースは、非共有 (排他) として構成する必要があります。

  • またコントローラーのノードには、_AEI オブジェクトにリストされている各ピンの Edge (_Exx)、Level (_Lxx) または Event (_EVT) コントロール メソッドも含まれていることが必要です。

ACPI ドライバーは、一覧表示されている GPIO 割り込みを処理し、それに対するエッジ、レベル、またはイベント制御メソッドを評価します。 制御メソッドは、必要に応じてハードウェア イベントを休止し、イベント ソース デバイスの名前空間ノードに必要な Notify 演算子を実行します。 続いて Windows はデバイスのドライバーに通知を送信します。 イベント制御メソッドがハードウェアにクエリを実行して発生したイベントを特定できる場合は、同じ GpioInt リソースに対して複数のイベントを通知できます。 続いて、メソッドは正しい通知コードを使用して正しいデバイスに通知する必要があります。

ACPI イベント情報 (_AEI) オブジェクト 上述したように、ACPI イベントをサポートするには、GPIO コントローラーの名前空間に _AEI オブジェクトが含まれていることが必要です。 _AEI オブジェクト (ACPI 5.0 仕様の 5.6.5.2 章を参照) は、この GPIO コントローラーを介して ACPI イベントを通知する GpioInt 記述子のみを含むリソース テンプレート バッファーを返します。 各記述子は、1 つの ACPI イベント ソース デバイスに対応し、そのデバイス専用です (デバイス間で共有されません)。

GeneralPurposeIO 操作領域 (OpRegions)

GPIO コントローラーは、多くの場合、電源とクロックの制御、デバイスでのモードの設定など、数々のプラットフォーム ハードウェア機能をサポートするためにプラットフォーム ファームウェアによって使用されます。 ASL 制御メソッドからの GPIO I/O の使用をサポートするために、ACPI 5.0 では新しい OpRegion 型「GeneralPurposeIO」が定義されています。

GeneralPurposeIO OpRegions (ACPI 5.0 仕様の 5.5.2.4.4 章を参照) は、ドライバーが I/O を処理する GPIO コントローラー デバイスの名前空間スコープ内で宣言されています。 GeneralPurposeIO フィールド宣言 (ACPI 5.0 仕様の 5.5.2.4.4.1 章を参照) は、GeneralPurposeIO OpRegion 内でアクセスされる GPIO ピンに名前を割り当てます。 GpioIO 接続リソース (ACPI 5.0 仕様の 19.5.53 章を参照) は、フィールド宣言内で特定のフィールド参照のピン番号と構成を指定するために使用されます。 接続記述子に続く名前付きフィールド ビットの合計数は、記述子にリストされているピンの数と等しいことが必要です。

OpRegion 内のフィールドは名前空間内の任意の場所で宣言でき、名前空間内の任意のメソッドからアクセスできます。 GeneralPurposeIO OpRegion へのアクセスの方向は、最初のアクセス (読み取りまたは書き込み) によって決定され、変更することはできません。

OpRegion アクセスは GPIO コントローラー デバイス ドライバー (「OpRegion ハンドラー」) によって提供されるため、メソッドは、ドライバーが使用可能になるまで OpRegion にアクセスしないように注意する必要があります。 ASL コードは、GPIO コントローラー デバイスの下に Region (_REG) メソッドを含めることで、OpRegion ハンドラーの状態を追跡できます (ACPI 5.0 仕様の 6.5.4 章を参照)。 さらに、OpRegion Dependencies (_DEP) オブジェクト (ACPI 5.0 仕様の 6.5.8 章を参照) は、必要に応じて GPIO OpRegion フィールドにアクセスするメソッドを持つ任意のデバイスで使用できます。 _DEPをいつ使用するかについては、「デバイス管理名前空間オブジェクト」トピックの「デバイスの依存関係」章を参照してください。 ドライバーには、GeneralPurposeIO OpRegions にも割り当てられている GPIO I/O リソースを割り当てないことが重要です。 操作は ASL 制御メソッドの排他的な使用となります。