Linux驱动--PMIC_RK809
PMIC
PMIC(Power Management IC)又称电源管理IC,是一种特定用途的集成电路,其功能是为主系统作管理电源等工作。电源管理芯片一般包括几个部分,DC-DC(降压转换器);LDO(线性稳压器)
DCDC 和LDO 区别
DCDC:输入电压范围较宽,响应必LDO较差
LDO:稳定性好,负载不能太大,输入输出电压差不能太大
RK809 PMIC功能
RK809 支持使用功能:
- regulator 功能:控制各路 DCDC、LDO 电源状态;
- rtc 功能:提供时钟计时、定时等功能;
- gpio 功能:可当普通 gpio 使用,有pinctrl的功能;
- pwrkey 功能:检测 power 按键的按下/释放,可以为 AP 节省一个 gpio;
- clk 功能:有两个32.768KHZ时钟输出,一个不可以控常开,一个是软件可控;
- codec 功能:采样率最高支持到192KHZ,支持16bit和32bit,支持DAC、ADC PDM等
RK809 集成 5 个大电流 DCDC、9 个 LDO、2 个 开关SWITCH、 1个
RTC、1个 高性能CODEC。这些使用需要在dts中进行配置
PMIC 有 3 种工作模式
PMIC normal 模式
系统正常运行时 PMIC 处于 normal 模式,此时 pmic_sleep 为低电平。PMIC sleep 模式
系统休眠时需要待机功耗尽量低,PMIC 会切到 sleep 模式减低自身功耗,这时候一般会降低某些
路的输出电压,或者直接关闭输出,这可以根据实际产品需求进行配置。系统待机时 AP 通过 I2C
指令把 pmic_sleep 配置成 sleep 模式,然后拉高 pmic_sleep 即可让 PMIC 进入 sleep 状态;当
SoC 唤醒时 pmic_sleep 恢复为低电平,PMIC 退出休眠模式。PMIC shutdown 模式
当系统进入关机流程的时候,PMIC 需要完成整个系统的电源下电操作。AP 通过 I2C 指令把
pmic_sleep 配置成 shutdown 模式,然后拉高 pmic_sleep 即可让 PMIC 进入 shutdown 状态
I2C 地址:
7 位从机地址:0x20
DTS配置解析
参考
1 | regulators { |
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 | drivers/mfd/rk808.c |
函数接口
如下几个接口基本可以满足日常使用,包括 regulator 开、关、电压设置、电压获取等:
- 获取 regulator:
struct regulator *regulator_get(struct device *dev, const char *id)
dev 默认填写 NULL 即可,id 对应 dts 里的 regulator-name 属性。
- 释放 regulator
void regulator_put(struct regulator *regulator)
- 打开 regulator
int regulator_enable(struct regulator *regulator)
- 关闭 regulator
int regulator_disable(struct regulator *regulator)
- 获取 regulator 电压
int regulator_get_voltage(struct regulator *regulator)
- 设置 regulator 电压
int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)
传入的参数时保证 min_uV = max_uV,由调用者保证。