GPIO コントローラーのピンのバンクへのパーティション分割
ドライバー開発者は、オプションとして、汎用 I/O (GPIO) コントローラー デバイスを GPIO ピンの 2 つ以上のバンクにパーティション分割できます。 たとえば、64 個の GPIO ピンを持つ GPIO コントローラー デバイスは、GPIO コントローラー ドライバーで、それぞれ 32 個の GPIO ピンを持つ 2 つのバンクとして記述できます。 開発者は、GPIO コントローラー デバイスのすべてのバンクを管理する 1 つのドライバーを提供できます。このドライバーは通常、1 つのデバイス オブジェクトを使用してデバイス全体を表します。 ただし、デバイスの一部またはすべてのバンクは、デバイスの他のバンクとは別に管理できます。
通常、GPIO コントローラー ドライバーは、次のいずれかの理由で GPIO コントローラーを 2 つ以上のバンクにパーティション分割することを選択します。
- バンク内の GPIO ピンの電源状態は、他のバンクのピンとは別に管理できます。
- GPIO コントローラーのピンの合計数は 64 以上です。
GPIO フレームワーク拡張機能 (GpioClx) でサポートされる最大のバンク サイズは 64 ピンです。 64 個以上のピンを含む GPIO コントローラー デバイスは、ドライバーによって 2 つ以上のバンクにパーティション分割する必要があり、それぞれに 64 個以下のピンが含まれている必要があります。
GPIO コントローラーをバンクにパーティション分割する方法を決定するために、GpioClx は CLIENT_QueryControllerBasicInformation イベント コールバック関数を呼び出します。 この関数は、GPIO コントローラー ドライバーによって実装され、GPIO コントローラーの属性と機能を記述する CLIENT_CONTROLLER_BASIC_INFORMATION 構造体を提供します。 この構造体の 2 つのメンバーである TotalPins と NumberOfPinsPerBank は、GPIO コントローラーのピンをバンクに分割する方法を指定します。 TotalPins は GPIO コントローラー内のピンの合計数を指定し、NumberOfPinsPerBank はバンクあたりのピン数を指定します。 コントローラ内のバンクの数を N とすると、バンクには 0 から N – 1 の番号が付けられます。 最後のバンク (つまり、バンク番号 N - 1) を除くすべてのバンクには、NumberOfPinsPerBank メンバーで指定するピンの数を含める必要があります。 最後のバンクは、1 から NumberOfPinsPerBank までの任意の数のピンを持つことができます。
GpioClx は、TotalPins メンバーと NumberOfPinsPerBank メンバーの値から GPIO コントローラー内のバンクの合計数を決定します。 GpioClx は、次の整数式を使用してバンクの合計数を計算します。
(TotalPins + NumberOfPinsPerBank – 1) / NumberOfPinsPerBank 一部の GPIO コントローラー デバイスでは、デバイス内のピンのバンクをオンにしたり、同じデバイス内の他のバンクとは別に低電力状態に切り替えたりすることができます。 したがって、特定のバンクがアイドル状態の場合、このバンクを低電力状態に切り替えて消費電力を削減できます。 このようなデバイスに対応するために、GpioClx ではコンポーネント レベルの電源管理がサポートされています。 GpioClx は、コンポーネント レベルで 2 つの電源状態の F0 (完全にオン) と F1 (低電力またはオフ) を定義します。
GPIO ピンのバンクがコンポーネント レベルの電源管理をサポートしているかを判断するため、GpioClx は CLIENT_QuerySetControllerInformation イベント コールバック関数を呼び出します。 この関数の InputBuffer パラメーターは、CLIENT_CONTROLLER_QUERY_SET_INFORMATION_INPUT 構造体へのポインターです。 電源管理情報を要求するため、呼び出し元はこの構造体の RequestType メンバーを QueryBankPowerInformation に設定します。
GPIO バンクがコンポーネント レベルの電源管理をサポートする場合、GpioClx では、バンクがアイドル状態のときに F1 電源状態への移行が有効になります。 バンクが F1 状態に入る前に、GpioClx は CLIENT_SaveBankHardwareContext イベント コールバック関数を呼び出して、バンクのハードウェア コンテキスト (主にレジスタの内容) を保存するようにドライバーに指示します。 後にバンクが F0 状態に入ると、GpioClx は CLIENT_RestoreBankHardwareContext イベント コールバック関数を呼び出して、前に保存したハードウェア コンテキストを復元するようにドライバーに指示します。