次の方法で共有


汎用 I/O (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 つのエッジ) とボタンリリース イベント (反対側の端) の両方が意味を持ちます。 この機能は"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 名前空間オブジェクト」トピックの「Button devices」セクションを参照してください。

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

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

エミュレートされた ActiveBoth をサポートするには、GPIO コントローラー ドライバーは、CLIENT_ReconfigureInterruptコールバック関数を実装し、ドライバーの CLIENT_QueryControllerBasicInformation コールバック関数が GpioClx に提供する基本的な情報構造で EmulateActiveBoth フラグを設定することによって、ActiveBoth エミュレーションを有効にする必要があります ("オプトイン")。 詳細については、「 General-Purpose 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 仕様の「GpioInt (GPIO 割り込み接続リソース記述子マクロ)」セクション 19.5.53 で説明されています。

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 イベント ソース デバイスに対応し、そのデバイス専用です (デバイス間で共有されません)。

ジェネラルパーパスIO操作領域 (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 リソースが割り当てられないことが重要です。 Opregionは、ASL制御メソッド専用で使用されます。