将 GPIO 控制器分区为管脚库
驱动程序开发人员可以选择将常规用途 I/O (GPIO) 控制器设备分区为两个或更多组 GPIO 引脚。 例如,具有 64 个 GPIO 引脚的 GPIO 控制器设备可由 GPIO 控制器驱动程序描述为两个库,每个库都有 32 个 GPIO 引脚。 开发人员可以提供单个驱动程序来管理 GPIO 控制器设备中的所有库,此驱动程序通常使用一个设备对象来表示整个设备。 但是,设备中的部分或所有库可以独立于设备中的其他库进行管理。
通常,GPIO 控制器驱动程序会出于以下原因之一选择将 GPIO 控制器分区为两个或多个库:
- 可以独立于其他库中的引脚管理一个库中的 GPIO 引脚的电源状态。
- GPIO 控制器中的引脚总数大于 64。
GPIO 框架扩展 (GpioClx) 支持的最大库大小为 64 个引脚。 包含超过 64 个引脚的 GPIO 控制器设备必须由驱动程序分区为两个或更多个库,每个库包含不超过 64 个引脚。
为了确定 GPIO 控制器如何分区为库,GpioClx 调用 CLIENT_QueryControllerBasicInformation 事件回调函数。 此函数由 GPIO 控制器驱动程序实现,它提供描述 GPIO 控制器的属性和功能的 CLIENT_CONTROLLER_BASIC_INFORMATION 结构。 此结构的两个成员 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 定义了两种组件级电源状态: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 事件回调函数,告知驱动程序还原以前保存的硬件上下文。