Linux电压和电流调节器框架
关于
该框架旨在提供一个标准的内核接口,用于控制电压和电流调节器。
其目的是允许系统动态控制调节器的功率输出,以节省电力并延长电池寿命。这适用于电压调节器(可以控制输出电压)和电流沉(可以控制电流限制)。
术语
本文档中使用的一些术语:
- 调节器Regulator
向其他设备提供电源的电子设备。大多数调节器可以启用和禁用其输出,而有些可以控制其输出电压和/或电流。
输入电压 -> 调节器 -> 输出电压 - PMIC
电源管理集成电路。包含多个调节器并通常包含其他子系统。 - 消费者
由调节器供电的电子设备。消费者可以分为两种类型:
静态:消费者不会改变其供电电压或电流限制。它只需要启用或禁用其电源。其供电电压由硬件、引导加载程序、固件或内核板初始化代码设置。
动态:消费者需要根据操作需求改变其供电电压或电流限制。 - 电源域由调节器的输出电源、开关或另一个电源域供电的电子电路。供电调节器可能位于开关之后。例如:
调节器 -+-> 开关-1 -+-> 开关-2 --> [消费者A] | | | +-> [消费者B], [消费者C] | +-> [消费者D], [消费者E]
- 这表示一个调节器和三个电源域:
- 域1:开关-1,消费者D和E。
- 域2:开关-2,消费者B和C。
- 域3:消费者A。
- 这代表了一个“供应”关系:
域1 --> 域2 --> 域3。
一个电源域可能有由其他调节器供电的调节器。例如:
调节器-1 -+-> 调节器-2 -+-> [消费者A] | +-> [消费者B]
- 这给我们两个调节器和两个电源域:
- 域1:调节器-2,消费者B。
- 域2:消费者A。
- 以及一个“供应”关系:
- 域1 --> 域2
- 约束约束用于定义性能和硬件保护的功率级别。约束存在于三个级别:调节器级别:由调节器硬件操作参数定义,并在调节器数据手册中指定。例如:
- 输出电压范围为800mV -> 3500mV。
- 调节器电流输出限制为20mA @ 5V,但在10V时为10mA。
- 电源域级别:由内核级别的板初始化代码在软件中定义。用于将电源域限制在特定的功率范围内。例如:
- 域1电压为3300mV
- 域2电压为1400mV -> 1600mV
- 域3电流限制为0mA -> 20mA。
- 消费者级别:由消费者驱动程序动态设置电压或电流限制级别。
例如,消费者背光驱动程序请求将电流从5mA增加到10mA以增加液晶显示屏的亮度。这通过以下级别传递:
消费者:需要增加液晶显示屏亮度。查找并请求亮度表中的下一个电流mA值(基于相同参考设备的不同个性的消费者驱动程序可能被多次使用)。
电源域:新的电流限制是否在该域的操作限制内以及系统状态内(例如,电池电源、USB电源)。
调节器域:新的电流限制是否在输入/输出电压的调节器操作参数内。
如果调节器请求通过了所有约束测试,则应用新的调节器值。
设计
该框架设计并针对SoC(系统片上集成电路)设备,但也可能与非SoC设备相关,并分为以下四个接口:
- 消费者驱动程序接口。
该接口使用类似于内核时钟接口的API,消费者驱动程序可以获取和释放调节器(就像目前可以获取和释放时钟一样),并获取/设置电压、电流限制、模式、启用和禁用。这应该允许消费者完全控制其供电电压和电流限制。如果不使用,这也可以进行编译,因此驱动程序可以在没有基于调节器的电源控制的系统中重复使用。
请参阅调节器消费者驱动程序接口 - 调节器驱动程序接口。
这允许调节器驱动程序注册其调节器并向核心提供操作。它还具有用于向客户端传播调节器事件的通知器调用链。
请参阅调节器驱动程序接口 - 机器接口。
该接口用于机器特定代码,允许为每个调节器创建电压/电流域(带约束)。它还可以提供调节器约束,以防止由于客户端驱动程序错误导致的过电压或过电流而造成设备损坏。它还允许创建调节器树,其中一些调节器由其他调节器供电(类似于时钟树)。
请参阅调节器机器驱动程序接口 - 用户空间ABI。
该框架还通过sysfs向用户空间导出大量有用的电压/电流/工作模式数据,可用于帮助监视设备的功耗和状态。
请参阅文档/ABI/testing/sysfs-class-regulator