次の方法で共有


GPIO コントローラー ドライバーの割り込み同期

GPIO コントローラー ドライバーは、GPIO_CLX_AcquireInterruptLock メソッドと GPIO_CLX_ReleaseInterruptLock メソッドを呼び出して、GPIO フレームワーク拡張機能 (GpioClx) によって内部的に実装される割り込みロックを取得および解放することができます。 IRQL = PASSIVE_LEVEL で実行されるドライバー コードは、これらのメソッドを呼び出して GpioClx の割り込みサービス ルーチン (ISR) と同期できます。 GpioClx は、GPIO コントローラー内のピンの各バンクに個別の割り込みロックを割り当てます。

GPIO コントローラーのハードウェア レジスタがメモリ マップされている場合、GpioClx の ISR は DIRQL で特定のドライバー実装イベント コールバック関数を呼び出します。GpioClx は、残りのコールバック関数を PASSIVE_LEVEL で呼び出します。 レジスタのバンクにアクセスするパッシブ レベルのコールバック関数では、割り込みロックを使用して、DIRQL で実行されて同じレジスタにアクセスするコールバック関数と同期することが必要になる場合があります。

たとえば、パッシブ レベルの CLIENT_EnableInterrupt コールバック機能と CLIENT_DisableInterrupt コールバック関数は、DIRQL で実行される他の割り込み関連のコールバック ルーチンの操作に影響を与えるハードウェア設定を変更します。 CLIENT_EnableInterrupt 関数と CLIENT_DisableInterrupt 関数は、通常、バンク割り込みロックを使用してレジスタ アクセスを同期します。

GpioClx は、DIRQL で発生する割り込み関連および I/O 関連のコールバックを自動的にシリアル化します。 GpioClx は、DIRQL でコールバック関数を呼び出す前にターゲット バンクの割り込みロックを取得し、関数が戻った後にロックを解放します。 DIRQL で呼び出されたコールバック関数が GPIO_CLX_AcquireInterruptLock を呼び出してバンク割り込みロックを再取得しようとするとエラーになります。

同様に、GpioClx は、PASSIVE_LEVEL で発生するコールバックを自動的にシリアル化します。 GpioClx は、バンクごとに待機ロックを内部的に実装します。 GpioClx は、PASSIVE_LEVEL でコールバック関数を呼び出す前にターゲット バンクの待機ロックを取得し、関数が戻ったときにロックを解放します。 メモリ マップされた GPIO コントローラーの場合、GpioClx はドライバーの代わりにバンク待機ロックを管理しますが、ドライバーがロックを明示的に取得して解放するようにはできません。

ただし、メモリ マップされていない GPIO コントローラーの場合、GPIO_CLX_AcquireInterruptLock および GPIO_CLX_ReleaseInterruptLock は割り込みロックではなく待機ロックを取得して解放します。 GpioClx は、GPIO コントローラーのピンのバンクごとに個別の待機ロックを実装します。 レジスタはメモリ マップされないため、I²C などのシリアル バスを介してレジスタにアクセスできるように、すべての割り込み関連および I/O 関連のコールバック関数が PASSIVE_LEVEL で呼び出されます。 GpioClx は、これらいずれかのコールバック関数を呼び出す前にターゲット バンクの待機ロックを取得し、関数が戻った後にロックを解放します。

メモリ マップされていないコントローラーのコールバック関数が GPIO_CLX_AcquireInterruptLock を呼び出してバンク待機ロックを再取得しようとするとエラーになります。 ただし、コールバック関数の外部にあるパッシブ レベルのドライバー コードは、GPIO_CLX_XxxInterruptLock メソッドを呼び出してコールバック関数と同期できます。 GpioClx は、PASSIVE_LEVEL ですべての割り込み関連および I/O 関連のコールバック関数を呼び出すため、バンク待機ロックがメモリ マップされていないコントローラーのバンク割り込みロックに効果的に置き換わります。

メモリ マップされていないコントローラーのもう 1 つのオプションは、コントローラー ドライバーが待機ロックのセットを実装することです。 これらの待機ロックを使用すると、コールバック ルーチンは、GpioClx によって実装された待機ロックよりも、共有リソースのよりきめ細かいロックとロック解除を実行できます。

CLIENT_QueryControllerBasicInformation コールバック ルーチンの呼び出し中、GPIO コントローラー ドライバーは、コントローラー レジスタがメモリ マップされているかを GpioClx に報告します。 詳細については、CLIENT_CONTROLLER_BASIC_INFORMATIONMemoryMappedController フラグの説明を参照してください。

割り込みロックと待機ロックの詳細については、「フレームワーク ロックの使用」を参照してください。

次の表では、レジスタがメモリ マップされている場合に、PASSIVE_LEVELではなく DIRQL で呼び出されるコールバック関数の詳細な説明を示しています。 表下の注釈では、パッシブ レベルのコールバック関数で割り込みロックを使用する必要がある場合について説明しています。

割り込み入力として構成されている GPIO ピンをサポートするため、GPIO コントローラー ドライバーは、これらのピンを介して割り込み要求を管理するイベント コールバック関数のセットを実装します。 次の表の中央の列は、GPIO コントローラーのハードウェア レジスタがメモリ マップされている場合に関数が呼び出される IRQL を示しています。 右端の列は、レジスタがメモリ マップされておらずにシリアル バス経由でアクセスする必要がある場合に関数が呼び出される IRQL を示します。

コールバック関数 メモリ マップされている場合の IRQL (MemoryMappedController = 1) シリアルでアクセスする場合の IRQL (MemoryMappedController = 0)

CLIENT_EnableInterrupt

CLIENT_DisableInterrupt

PASSIVE_LEVEL

(注 1 を参照)。

PASSIVE_LEVEL

(注 2 を参照)。

CLIENT_ClearActiveInterrupts

CLIENT_MaskInterrupts

CLIENT_QueryActiveInterrupts

CLIENT_QueryEnabledInterrupts

CLIENT_ReconfigureInterrupt

CLIENT_UnmaskInterrupt

DIRQL

(注 3 を参照)。

PASSIVE_LEVEL

(注 4 を参照)。

CLIENT_PreProcessControllerInterrupt

DIRQL

(注 5 を参照)。

DIRQL

(注 6 を参照)。

ノート

  1. GpioClx は、このコールバック関数を呼び出す前にバンク割り込みロックを取得しません。 コールバック関数は、必要に応じてバンク割り込みロックを取得して、DIRQL で実行されるコールバック関数と共有するレジスタのアクセスを同期できます。

  2. GpioClx は、PASSIVE_LEVELで呼び出される他の割り込み関連および I/O 関連のコールバック関数と共にこのコールバック関数の呼び出しをシリアル化します。 したがって、コールバック関数は、バンク待機ロックの取得を試みません。

  3. GpioClx は、このコールバック関数を呼び出す前にバンク割り込みロックを取得し、関数が戻った後にロックを解放します。 したがって、コールバック関数は、バンク割り込みロックの取得を試みません。

  4. GpioClx は、PASSIVE_LEVELで呼び出される他の割り込み関連および I/O 関連のコールバック関数と共にこのコールバック関数の呼び出しをシリアル化します。 したがって、コールバック関数は、バンク待機ロックの取得を試みません。

  5. GpioClx は、このコールバック関数を呼び出す前にバンク割り込みロックを取得し、関数が戻った後にロックを解放します。 したがって、コールバック関数は、バンク割り込みロックの取得を試みません。

  6. GpioClx は、このコールバック関数を呼び出す前にバンク割り込みロックを取得しません。 GPIO コントローラー ドライバーは、必要な同期を提供する役割を担います。

データ I/O ピンとして構成された GPIO ピンをサポートするために、GPIO コントローラー ドライバーは、これらのピンを介して I/O 操作を管理するイベント コールバック関数のセットを実装します。 次の表の中央の列は、GPIO コントローラーのハードウェア レジスタがメモリ マップされている場合に関数が呼び出される IRQL を示しています。 右端の列は、レジスタがメモリ マップされておらずにシリアル バス経由でアクセスする必要がある場合に関数が呼び出される IRQL を示します。

コールバック関数 メモリ マップされている場合の IRQL (MemoryMappedController = 1) シリアルでアクセスする場合の IRQL (MemoryMappedController = 0)

CLIENT_ConnectIoPins

CLIENT_DisconnectIoPins

PASSIVE_LEVEL

(注 1 を参照)。

PASSIVE_LEVEL

(注 2 を参照)。

CLIENT_ReadGpioPins

CLIENT_ReadGpioPinsUsingMask

CLIENT_WriteGpioPins

CLIENT_WriteGpioPinsUsingMask

DIRQL

(注 3 を参照)。

PASSIVE_LEVEL

(注 4 を参照)。

ノート

  1. GpioClx は、このコールバック関数を呼び出す前にバンク割り込みロックを取得しません。 コールバック関数は、必要に応じて割り込みロックを取得して、DIRQL で実行されるコールバック関数と共有するレジスタのアクセスを同期できます。

  2. GpioClx は、PASSIVE_LEVELで呼び出される他の割り込み関連および I/O 関連のコールバック関数と共にこのコールバック関数の呼び出しをシリアル化します。 したがって、コールバック関数は、バンク待機ロックの取得を試みません。

  3. GpioClx は、このコールバック関数を呼び出す前にバンク割り込みロックを取得し、関数が戻った後にロックを解放します。 したがって、コールバック関数は、バンク割り込みロックの取得を試みません。

  4. GpioClx は、PASSIVE_LEVELで呼び出される他の割り込み関連および I/O 関連のコールバック関数と共にこのコールバック関数の呼び出しをシリアル化します。 したがって、コールバック関数は、バンク待機ロックの取得を試みません。

I/O および割り込み操作を実行する GPIO コントローラーを設定するために、GPIO コントローラー ドライバーは、コントローラーを初期化する一連のイベント コールバック関数を実装します。 次の表の中央の列は、GPIO コントローラーのハードウェア レジスタがメモリ マップされている場合に関数が呼び出される IRQL を示しています。 右端の列は、レジスタがメモリ マップされておらずにシリアル バス経由でアクセスする必要がある場合に関数が呼び出される IRQL を示します。

コールバック関数 メモリ マップされている場合の IRQL (MemoryMappedController = 1) シリアルでアクセスする場合の IRQL (MemoryMappedController = 0)

CLIENT_PrepareController

CLIENT_ReleaseController

CLIENT_StartController

CLIENT_StopController

CLIENT_QueryControllerBasicInformation

CLIENT_QuerySetControllerInformation

PASSIVE_LEVEL

(注 1 を参照)。

PASSIVE_LEVEL

(注 2 を参照)。

ノート

  1. GpioClx がこれらのコールバック関数のいずれかを呼び出す場合、バンク割り込みロックは使用できません。 したがって、これらのコールバック関数は、バンク割り込みロックの取得を試みません。

  2. これらのコールバック関数が呼び出されるとき、GpioClx バンク待機ロックは使用できません。 したがって、ドライバーは、これらのコールバック関数を同期するバンク待機ロックの取得を試みません。

GPIO コントローラーでデバイスの電源状態を変更できるようにするために、GPIO コントローラー ドライバーは、これらの変更中にハードウェア設定を保存および復元するための一連のイベント コールバック関数を実装します。 次の表の中央の列は、GPIO コントローラーのハードウェア レジスタがメモリ マップされている場合に関数が呼び出される IRQL を示しています。 右端の列は、レジスタがメモリ マップされておらずにシリアル バス経由でアクセスする必要がある場合に関数が呼び出される IRQL を示します。

コールバック関数 メモリ マップされている場合の IRQL (MemoryMappedController = 1) シリアルでアクセスする場合の IRQL (MemoryMappedController = 0)

CLIENT_RestoreBankHardwareContext

CLIENT_SaveBankHardwareContext

DIRQL または HIGH_LEVEL

(注釈を参照)。

サポートされていません。

ノート

  • 通常の F 状態への移行の場合: 保存 / 復元コールバック関数は DIRQL で GpioClx によって保持されているバンク割り込みロックを使用して呼び出されます。 したがって、コールバック関数もバンク割り込みロックの取得を試みません。
  • 重要な F 状態への移行の場合: 電源エンジン プラグイン (PEP) が呼び出されると、GPIO 状態を保存および復元するために保存 / 復元コールバックが呼び出されます。 保存 / 復元コールバック関数は、最後のプロセッサのコンテキストで HIGH_LEVEL に呼び出されてアイドル状態に移行します。これは、プラットフォームのディープ アイドル移行シーケンスの後半で発生します。 したがって、コールバック関数もバンク割り込みロックの取得を試みません。

F 状態に関する詳細については、「コンポーネント レベルの電源管理」を参照してください。 PEP の詳細については、「PoFxPowerControl」を参照してください。

他のコールバック関数

GPIO コントローラーがコントローラー固有の操作をサポートできるようにするには、GPIO コントローラー ドライバーが CLIENT_ControllerSpecificFunction イベント コールバック関数を実装します。 次の表の中央の列は、GPIO コントローラーのハードウェア レジスタがメモリ マップされている場合に関数が呼び出される IRQL を示しています。 右端の列は、レジスタがメモリ マップされておらずにシリアル バス経由でアクセスする必要がある場合に関数が呼び出される IRQL を示します。

コールバック関数 メモリ マップされている場合の IRQL (MemoryMappedController = 1) シリアルでアクセスする場合の IRQL (MemoryMappedController = 0)

CLIENT_ControllerSpecificFunction

PASSIVE_LEVEL

(注 1 を参照)。

PASSIVE_LEVEL

(注 2 を参照)。

ノート

  1. GpioClx は、このコールバック関数を呼び出す前にバンク割り込みロックを取得しません。 コールバック関数は、必要に応じてバンク割り込みロックを取得して、DIRQL で実行されるコールバック関数と共有するレジスタのアクセスを同期できます。

  2. GpioClx は、PASSIVE_LEVELで呼び出される他の割り込み関連および I/O 関連のコールバック関数と共にこのコールバック関数の呼び出しをシリアル化します。 したがって、コールバック関数は、バンク待機ロックの取得を試みません。