Android: 使用Linux regulator系统通过一个GPIO控制外部IC的电源
一、通过一个GPIO控制外部IC的电源,如下图,通过SDMMC0_PWR_H pin(连到CPU的GPIO0_A1)去控制sd卡的电源enable或者disable。
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); //通过此接口获取配置的输出电压。
二、dts设备树添加如下:
三、驱动添加红框里面的代码:
三、然后再在驱动里面分别通过regulator_enable、regulator_disable函数拉高或者拉低上面提到GPIO0_A1达到控制外部电源的目的。例如:
四、亲自测试成功