Linux regulator子系统分析1(基于Linux6.6)---总体概述
一、regulator子系统相关的概念说明
1.1、Regulator概念
1. Regulator(电源调节器)是什么?
电源调节器(Regulator)是一种硬件模块,用于将电源电压从一个级别转换为另一个级别。例如,电池电压可能是3.7V,但系统中的某些模块可能需要1.8V或1.2V的电压。在这种情况下,调节器通过调节输出电压来确保系统稳定运行。
调节器主要有两种类型:
- 线性调节器(LDO, Low Dropout Regulator):提供稳定的输出电压,通常效率较低,但简单且噪声较低。
- 开关调节器(Switching Regulator):效率较高,适用于较大电流的应用,但通常会产生较大的电磁干扰。
2. Regulator子系统的作用
Regulator子系统的主要作用是管理电源调节器,提供以下功能:
- 电压管理:确保各个电压轨(电压输出)为设备提供稳定的电源。
- 动态电压调整(DVFS):根据设备需求动态调整电压。例如,CPU在高负载时可能需要更高的电压,而在低负载时可以降低电压以节省能量。
- 电源启用和禁用:控制电源开关,以便在设备不需要时关闭电源,减少功耗。
- 电流限制:为不同的设备模块设置电流限制,防止过载或损坏设备。
3. Regulator子系统的主要组件
Regulator子系统在Linux内核中由多个组件组成,这些组件共同工作以管理电源调节器。主要组件包括:
Regulator设备
在Linux中,Regulator通常被表示为一个设备(struct regulator_dev
),它包含了调节器的所有信息,例如电压范围、电流限制等。
Regulator驱动
每个Regulator都有一个与之相关联的驱动程序,负责对调节器的控制。这些驱动通常由硬件厂商提供,或者由开源社区开发。驱动程序通过与硬件的接口来控制调节器的状态。
Regulator API
Linux内核提供了一套API,允许用户空间或者其他内核模块控制调节器的行为。例如,使用 regulator_enable()
启用调节器,regulator_disable()
禁用调节器,regulator_set_voltage()
设置调节器输出的电压等。
常见的Regulator API包括:
regulator_get()
:获取一个调节器设备的句柄。regulator_enable()
:启用调节器电源输出。regulator_disable()
:禁用调节器电源输出。regulator_set_voltage()
:设置调节器输出电压。regulator_get_voltage()
:获取当前调节器的输出电压。
调节器电压轨(Voltage Rail)
电压轨是指一组由同一调节器供电的电压输出。例如,1.8V电压轨可能为多个设备提供电源。一个调节器可能会为多个电压轨提供不同的输出电压。
Voltage State
调节器的电压状态通常有多个级别,可以在不同的工作模式下进行切换。调节器可以根据不同的需求切换电压。例如,在低功耗模式下,电压轨可能会降到较低的电压,而在高性能模式下,电压轨会提高。
电流限制
Regulator子系统通常也会限制其输出的最大电流,以避免过载。可以通过设置最大电流值来保护设备免受损坏。
4. 调节器的工作模式
调节器在不同的工作模式下会表现出不同的行为,以下是常见的几种工作模式:
- Normal Mode:调节器根据需求提供稳定的电压输出,通常是设备的主工作模式。
- Standby Mode:在此模式下,调节器的输出电压被降低或关闭,以节省功耗。此模式通常用于系统空闲时。
- Shutdown Mode:调节器关闭输出电压,完全切断电源。
regulator属于电源管理部分,主要实现电压、电流的输出操作,主要介绍regulator子系统的代码实现,因此我们先熟悉一些regulator子系统的相关概念。
1.2、egulator子系统的相关概念
1. Regulator(电源调节器)
如前所述,Regulator 是负责提供稳定电压输出的硬件组件,确保系统不同部件获得所需的电压。例如,一个设备可能需要多个不同的电压轨(例如1.8V、3.3V等),调节器通过控制这些电压轨来提供电源。
- Regulator 可以是 线性调节器(LDO)或 开关调节器(Buck、Boost)。
- 在Linux中,
regulator
子系统通过控制调节器的启用、禁用、设置电压等操作,来支持设备的电源需求。
2. PMIC(电源管理集成电路)
PMIC(Power Management Integrated Circuit) 是一个集成电路,集成了多个电源管理功能。它通常包括多个调节器模块(例如 LDOs 和 DCDCs),用于管理电压、调节电源、控制电池充电等任务。
- PMIC 可以控制多个电源轨,并提供额外的功能,如电池充电、功率监控等。
- 在 Linux 内核中,PMIC 通常作为设备与调节器子系统连接的一部分,提供调节器的硬件抽象。
PMIC 也可以提供 多种电源轨管理,在复杂的嵌入式设备和移动设备中非常常见,如智能手机、平板电脑和其他便携式设备。
3. Consumer(消费者)
在电源管理中,Consumer(消费者)是指需要电源的硬件模块或设备。它通过 Regulator 或 PMIC 访问电源,获取所需的电压或电流。
- Consumer 可以是 CPU、GPU、内存、显示屏、传感器等。
- 消费者 通过 regulator_get() API 来请求电源,调用 regulator_enable() 启用电源,并使用 regulator_set_voltage() 等 API 来调整电压。
每个 consumer 可能需要一个或多个电压轨,这些电压轨由调节器来提供。
4. Power Domain(电源域)
Power Domain(电源域) 是一组硬件组件,它们共享一个共同的电源或电源管理策略。电源域的概念有助于将系统中的硬件按照电源需求进行分组,以便动态控制这些硬件的电源状态。
- 每个 Power Domain 通常会有自己的 电源控制器,通过调节器来管理电源轨。
- 电源域的管理使得系统可以按需开启或关闭不同区域的电源,从而实现功耗优化。
例如,ARM架构的芯片(如 Qualcomm、NVIDIA 或其他 SOC)通常会划分多个电源域(如 CPU、电池管理、显示等),每个域可以独立控制电源。
Power Domain 是对多个调节器和硬件模块的一种分组,使得系统可以根据电源管理需求调整电源的启用状态。
电源域,regulator可以级联,不同的regulator的使用者属于相同的电源域。如下图的regulator,则包含三个电源域:
Domain1:switch-1、consumer D、Consumer E;
Domain2:switch-2、consumer B;
Domain3:consumer A、consumer C;
这三个电源域的关系如下:
Domain-1 --> Domain-2 --> Domain-3,在使用时domain-3下consumer相关的电压、电流设置需要满足这三级电源域的电压、电流约束。
5. Constraints(约束)
Constraints(约束) 是指在电源管理中定义的一些规则或限制条件,这些约束可以用来管理调节器的工作方式、调整电压等。约束主要用于:
- 限制调节器的电压范围、功率范围等。
- 确保电压和电流的设置不会违反硬件的设计限制(例如,不超过最大电压限制或最大电流限制)。
- 在动态电压调节和动态频率调节(DVFS)中,约束帮助系统根据性能和功耗需求自动调整电压和频率。
针对regulator子系统基本上就是这几个主要的概念,而linux regulator子系统的实现也是围绕着这几个概念进行子系统的框架设计的。
二、regulator子系统框架说明
针对regulator子系统主要也就包含如下几方面的设计:
- 提供Consumer driver interface接口,供各外设驱动接口调用,实现电源输出的使能、电源的动态调节等功能;
- 提供Machine interface接口,为一个regulator建立电源域(定义每一个电源域下所有consumer信息)、电源域级别的约束信息配置等;
- 提供Regulator driver interface接口,该部分是regulator子系统的主要功能,包含该regulator的访问方法(包含电源的使能、去使能、电源动态调节、regulator的约束信息、machine级别的约束信息等);
- 提供Userspace ABI接口,和其他的驱动子系统类似,regulator子系统也提供了和应用层的交互,主要结束sysfs,实现与应用层交互。
如下是regulator子系统与内核其他子系统的关联关系:
- regulator子系统的最底层为regulator device driver ,用于驱动regulator device,该regulator device driver包含操作regulator的接口、该regulator的约束信息、该regulator下domain的约束信息(这部分内容由regulator machine部分实现定义,由具体的soc board根据硬件信息,进行domain定义(该domain下使用power的consumer信息、domain的constraints等));
- 该regulator 子系统提供了consumer interface,供内核其他的驱动子系统模块使用,如regulator_get、regulator_enable等接口;
- 该regulator子系统借助sysfs,针对该regulator device相关的属性参数,均创建相应的文件,供应用层访问。
1. Regulator 子系统的组成
Regulator 子系统的核心组件包括 regulator 驱动、consumer 设备和 regulator framework。
Regulator 驱动
Regulator 驱动是控制硬件电源调节器的驱动程序。它实现了调节器的初始化、配置、控制和状态查询等操作。每个调节器通常会有一个相应的硬件驱动,能够通过 SPI、I2C 或其他通信接口控制调节器。
调节器驱动通常会使用 regulator_register() API 注册调节器,在设备树或平台代码中定义调节器的配置。
Consumer(消费者)
在电源管理中,**Consumer(消费者)**是指需要电源的硬件模块或设备。消费者设备通过与调节器框架的交互来请求所需的电压和电流,并控制电源的启用和禁用。
常见的消费者包括 CPU、GPU、内存、传感器、显示器等。这些设备通过 regulator_get() API 获取调节器,并通过其他 API(如 regulator_enable()
、regulator_set_voltage()
)进行电源管理。
Regulator Framework(调节器框架)
Regulator Framework 是调节器子系统的核心部分,它提供了与硬件调节器和消费者设备交互的 API 和管理逻辑。该框架负责调度和管理调节器的启用、禁用、设置电压等操作。它还处理调节器的状态转换、约束(Constraints)和多个调节器之间的协调等任务。
框架的关键部分包括:
- 调节器注册与初始化:通过
regulator_register()
注册调节器,内核加载时初始化调节器的相关信息。 - 电压控制:通过
regulator_set_voltage()
设置调节器的输出电压。 - 电源管理:通过调节器框架的管理功能,消费者可以按需启用或禁用调节器,减少不必要的功耗。
2.Regulator 子系统的工作流程
调节器框架和驱动程序的协作方式如下:
-
调节器驱动加载:调节器驱动在系统启动时加载并初始化,通常由硬件抽象层(如设备树)或平台代码配置。
-
消费者请求调节器:
- 在需要电源的硬件模块(如 CPU、GPU、内存等)中,驱动程序会调用
regulator_get()
API 来获取所需的调节器。通过设备树或其他方式,调节器与消费者进行绑定。
- 在需要电源的硬件模块(如 CPU、GPU、内存等)中,驱动程序会调用
-
调节器启用与配置:
- 消费者设备可以通过
regulator_enable()
启用调节器,调节器开始提供电源。 - 消费者还可以使用
regulator_set_voltage()
来调整调节器的输出电压,以满足不同硬件的需求。
- 消费者设备可以通过
-
调节器禁用:当硬件不再需要电源时,消费者可以通过
regulator_disable()
禁用调节器,从而降低功耗。 -
电源约束(Constraints):为了保证电源的稳定性,调节器和消费者之间可能存在约束。例如,某些调节器可能会被要求始终在一定电压范围内工作,或者某些设备需要多个电压轨一起工作。调节器框架提供了约束机制来确保这些规则得以遵守。
3.关键 API
以下是一些与 regulator 子系统相关的重要 API。
注册调节器
- regulator_register():注册一个调节器到系统中。此 API 由调节器驱动使用。
获取调节器
- regulator_get():消费者设备调用此函数来请求一个调节器并获取一个句柄,以便后续使用。
启用和禁用调节器
- regulator_enable():启用调节器,调节器开始提供电压。
- regulator_disable():禁用调节器,停止提供电压。
设置电压
- regulator_set_voltage():设置调节器输出的电压。此函数通常由消费者设备调用,以确保调节器为其提供适当的电压。
获取电压
- regulator_get_voltage():获取当前调节器输出的电压。
电源约束(Constraints)
- regulator_set_voltage_constraints():为调节器设置电压范围约束,确保电压不会超过或低于特定范围。
- regulator_set_current_limit():设置调节器的电流限制。