PMIC

PMIC(Power Management IC)又称电源管理IC,是一种特定用途的集成电路,其功能是为主系统作管理电源等工作。电源管理芯片一般包括几个部分,DC-DC(降压转换器);LDO(线性稳压器)

DCDC 和LDO 区别
DCDC:输入电压范围较宽,响应必LDO较差
LDO:稳定性好,负载不能太大,输入输出电压差不能太大

RK809 PMIC功能

RK809 支持使用功能:

  1. regulator 功能:控制各路 DCDC、LDO 电源状态;
  2. rtc 功能:提供时钟计时、定时等功能;
  3. gpio 功能:可当普通 gpio 使用,有pinctrl的功能;
  4. pwrkey 功能:检测 power 按键的按下/释放,可以为 AP 节省一个 gpio;
  5. clk 功能:有两个32.768KHZ时钟输出,一个不可以控常开,一个是软件可控;
  6. codec 功能:采样率最高支持到192KHZ,支持16bit和32bit,支持DAC、ADC PDM等

RK809 集成 5 个大电流 DCDC、9 个 LDO、2 个 开关SWITCH、 1个
RTC、1个 高性能CODEC。这些使用需要在dts中进行配置

PMIC 有 3 种工作模式

  1. PMIC normal 模式
    系统正常运行时 PMIC 处于 normal 模式,此时 pmic_sleep 为低电平。

  2. PMIC sleep 模式
    系统休眠时需要待机功耗尽量低,PMIC 会切到 sleep 模式减低自身功耗,这时候一般会降低某些
    路的输出电压,或者直接关闭输出,这可以根据实际产品需求进行配置。系统待机时 AP 通过 I2C
    指令把 pmic_sleep 配置成 sleep 模式,然后拉高 pmic_sleep 即可让 PMIC 进入 sleep 状态;当
    SoC 唤醒时 pmic_sleep 恢复为低电平,PMIC 退出休眠模式。

  3. PMIC shutdown 模式
    当系统进入关机流程的时候,PMIC 需要完成整个系统的电源下电操作。AP 通过 I2C 指令把
    pmic_sleep 配置成 shutdown 模式,然后拉高 pmic_sleep 即可让 PMIC 进入 shutdown 状态

I2C 地址:
7 位从机地址:0x20

DTS配置解析
参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
regulators {
vdd_logic: DCDC_REG1 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1350000>;
regulator-init-microvolt = <900000>;
regulator-ramp-delay = <6001>;
regulator-initial-mode = <0x2>;
regulator-name = "vdd_logic";
regulator-state-mem {
regulator-off-in-suspend;
};
};

vdda0v9_image: LDO_REG1 {
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <900000>;
regulator-max-microvolt = <900000>;
regulator-name = "vdda0v9_image";
regulator-state-mem {
regulator-off-in-suspend;
};
};



vcc_3v3: SWITCH_REG1 {
regulator-always-on;
regulator-boot-on;
regulator-name = "vcc_3v3";
regulator-state-mem {
regulator-off-in-suspend;
};
};


regulator-compatible :驱动注册时需要匹配的名字,不能改动,否则会加载失败;
regulator-name :电源的名字,建议和硬件图上保持一致,使用 regulator_get 接口时需要匹配
这个名字;
regulator-init-microvolt :u-boot阶段的初始化电压,kernel阶段无效;
regulator-min-microvolt :运行时可以调节的最小电压;
regulator-max-microvolt :运行时可以调节的最大电压;
regulator-initial-mode :运行时 DCDC 的工作模式,一般配置为 1。 1:force pwm,2: auto pwm/pfm;
regulator-mode :休眠时 DCDC 的工作模式,一般配置为 2。1:force pwm, 2:auto pwm/pfm;
regulator-initial-state :suspend 时的模式,必须配置成 3;
regulator-boot-on :存在这个属性时,在注册 regulator 的时候就会使能这路电源;
regulator-always-on :存在这个属性时,表示运行时不允许关闭这路电源且会在注册的时候使
能这路电源;
regulator-ramp-delay :DCDC 的电压上升时间,固定配置为 12500;
regulator-on-in-suspend :休眠时保持上电状态,想要关闭该路电源,则改成”regulator-off-in-
suspend”;
regulator-suspend-microvolt :休眠不断电情况下的待机电压。

驱动

源文件

1
2
3
4
5
6
drivers/mfd/rk808.c
drivers/input/misc/rk8xx-pwrkey.c
drivers/rtc/rtc-rk808.c
drivers/gpio/gpio-rk8xx.c
drivers/regulator/rk808-regulator.c
drivers/clk/clk-rk808.c

函数接口
如下几个接口基本可以满足日常使用,包括 regulator 开、关、电压设置、电压获取等:

  1. 获取 regulator:

struct regulator *regulator_get(struct device *dev, const char *id)
dev 默认填写 NULL 即可,id 对应 dts 里的 regulator-name 属性。

  1. 释放 regulator

void regulator_put(struct regulator *regulator)

  1. 打开 regulator

int regulator_enable(struct regulator *regulator)

  1. 关闭 regulator

int regulator_disable(struct regulator *regulator)

  1. 获取 regulator 电压

int regulator_get_voltage(struct regulator *regulator)

  1. 设置 regulator 电压

int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)
传入的参数时保证 min_uV = max_uV,由调用者保证。