一、regulator 用法
1.1、 电源管理 regulator 分成静态和动态:静态不需要改变电压电流,只需要开关电源,用在 BootLoader、frameware、kernel board 阶段等;动态是根据需要改变电压电流。
1.2、 获取设备的 regulator、dev 为驱动对应的设备指针,可以用NULL,Vcc 为电源的 ID,内核会查表找到电源 ID 对应的 regulator。如:struct regulator *ldo; ldo = regualtor_get(NULL, "act_ldo5");
regulator = regulator_get(dev, "Vcc"); //获取设备 regulator
1.3、 regulator_put(regulator); //释放regulator
1.4、 int regulator_enable(regulator); //使能电源输出。调用之前也可能已经使能了。所以用下面函数判断。
1.5、 int regulator_is_enabled(regulator); //判断是否使能, >0 表示已经使能。
1.6、 int regulator_disable(regulator); //关闭电源输出。但是未必立刻关闭,有可能存在电源共享的场景。
1.7、int regulator_force_disable(regulator); //强制关闭电源。
1.8、int regulator_set_volatage(regulator, min_uV, max_uV); //调节电压的最小和最大输出。如果接下去调用 regulator_enable,那么这个值马上就生效,如果调用 regulator_disable 等其他的,要等到下一次调用 regulator_enable 时才能生效。
1.9、int regulator_get_voltage(regulator); //通过此接口获取配置的输出电压。
实例如下:
regulator_set_voltage(ldo_28, 2800000, 2800000); //设置电压
regulator_enable(ldo_28); //使能
int value = regulator_get_voltage(ldo_28); //获取电压值
regulator_put(ldo_28); //释放
二、具体使用实例
2.1 设备树配置如下
ldo8: ldo8 {
regulator-compatible = "LDO8";
regulator-name = "ldo8_1v5";
regulator-min-microvolt = <1500000>;
regulator-max-microvolt = <1600000>;
//regulator-boot-on; //boot 时打开
//regulator-always-on; //一直打开
sleep-slot = <15>;
poweron-slot = <0x20>;
};
2.2 驱动源码如下
//打开
struct regulator *reg;
reg = devm_regulator_get(&i2c->dev, "ldo8_1v5");
regulator_set_volatage(reg, 1500000, 1500000);
regulator_enable(reg);
//关闭
struct regulator *reg;
reg = devm_regualtor_get(&i2c->dev, "ldo8_1v5");
regulator_disable(reg);