跳到主要内容

Linux_PMU_DevelopmentGuide-03

3 模块使用范例

3.1 外部sysfs 节点

AXP 注册了许多外部sysfs 节点可供调试使用。

3.1.1 Regulator

有关于regulator 调试节点,主要调整各路电压输出的。

在路径/sys/class/regulator/ 下,有关于单路regulator 属性的节点可以读取数值。

文件路径功能属性设置值
regulator.X/name各路输出名字r对应的输出的名字
regulator.X/max_microvolts各路输出最大电压r对应的最大电压值,单位 uV
regulator.X/min_microvolts各路输出最小电压r对应的最小电压值,单位<br/>uV
regulator.X/state各路输出状态r对应的输出状态,<br/>enabled/disabled: 开<br/>启/关闭
regulator.X/num_users各路输出对应的设备个数r0/1/2/……

因为不同AXP 型号regulator 对应的节点不一样,因此下面将分开不同AXP 进行介绍。

• AXP717

电源名称对应表如下:

节点名字原理图名称
regulator.0dummy
regulator.1usb0-vbus
regulator.2usb1-vbus
regulator.3dcdc1
regulator.4dcdc2
regulator.5dcdc3
regulator.6dcdc4
regulator.7aldo1
regulator.8aldo2
regulator.9aldo3
regulator.10aldo4
regulator.11bldo1
regulator.12bldo2
regulator.13bldo3
regulator.14bldo4
regulator.15cldo1
regulator.16cldo2
regulator.17cldo3
regulator.18cldo4
regulator.19rtcldo
regulator.20cpusldo
regulator.21drivevbus

3.1.2 Virtual-consumer

在路径/sys/devices/platform/soc/7081400.s_twi/i2c-6/6-0034/ 下则有修改regulator 输出电压的节点。

文件路径功能属性设置值
reg-virtconsumer. X/max_microvolts设置输出最大电压rw对应的最大电压值,单 位uV
reg-virtconsumer.<br/>X/min_microvolts设置输出最小电压rw对应的最小电压值,单<br/>位uV
of_node/name各路输出名字r

因为不同AXP 型号Virtual-consumer 对应的节点不一样,因此下面将分开不同AXP 进行介绍。

• AXP717

virt-consumer 对应的电路的对应表如下:

节点名字原理图名称
reg-virt-consumer.1dcdc1
reg-virt-consumer.2dcdc2
reg-virt-consumer.3dcdc3
reg-virt-consumer.4dcdc4
reg-virt-consumer.5aldo1
reg-virt-consumer.6aldo2
reg-virt-consumer.7aldo3
reg-virt-consumer.8aldo4
reg-virt-consumer.9bldo1
reg-virt-consumer.10bldo2
reg-virt-consumer.11bldo3
reg-virt-consumer.12bldo4
reg-virt-consumer.13cldo1
reg-virt-consumer.14cldo2
reg-virt-consumer.15cldo3
reg-virt-consumer.16cldo4
reg-virt-consumer.17rtcldo
reg-virt-consumer.18cpusldo

3.1.3 Power_supply

在路径/sys/class/power_supply/ 下有power_supply 相关的调试节点,可以读出电池以及供电当前状态和设置属性。

下表是电池相关的调试节点,路径为:/sys/class/power_supply/axp2202-battery/

文件路径功能属性设置值
capacity电池剩余电量r百分比,0/1/2/……/100
capacity_alert_min低电量警告阈值r百分比
capacity_level当前充电等级r“UNKNOWN” 未知,<br/>“Critical” 接近没电,“LOW” 低<br/>电量,“NORMAL” 正常电量,<br/>“HIGH” 高电量,“FULL” 满电
charge_counter当前电池容量r单位mAh
charge_full充满电的电池容量r单位mAh
constant_charge_current恒定充电电流r单位mA
energy_full_design充满电的电池容量r单位mAh
health电池状况r“Unknown” 未知, “Good” 好,<br/>“Overheat” 过温, “Dead” 坏掉,<br/>“Over voltage” 过<br/>压,“Unspecified failure” 错误,<br/>“Cold” 冷
present电池存在r0/1:存在/不存在
serial_numberpmu 型号rstring
status电池当前状态r“Unknown” 未知, “Charging”<br/>正在充电, “Discharging” 放电,<br/>“Not charging” 未在充电,<br/>“Full” 满
temp电池温度r单位°C
temp_alert_min电池高温预警阈值r单位°C
time_to_empty_now放电剩余时间r单位min
time_to_full_now充电剩余时间r单位min
type设备类别r“battery” 电池,“Mains” 火<br/>牛,“USB”USB
voltage_now当前电压r单位uA

下表则是供电相关的节点,路径为:/sys/class/power_supply/axp2202-usb

文件路径功能属性设置值
input_current_limit输入电流限流值r单位mA
online USB是否在使用r0/1:未使用/正在使用
present USB是否接上r0/1:插上/没插上
serial_numberpmu型号rstring
type设备类别r“battery” 电<br/>池,“Mains” 火<br/>牛,“USB”USB
voltage_min_designDC 供电最小设计电压r单位uV
voltage_nowDC 供电时的电压大小r单位uV

说明

AXP717 没有使用acin,因此接入usb 或者适配器都是使用usb-power-supply 的驱动,节点也是公用的。

3.2 Regulator 使用方法

3.2.1 内核代码调用regulator 示例

以DCDC1 为例,需要设置DCDC1 最大输出电压值为3.4V,需要设置目标电压值为3V。

#include <linux/regulator/consumer.h>
struct regulator *regu= NULL;
int ret = 0;
regu= regulator_get(NULL, "axp2202_dcdc1");
if (IS_ERR(regu)) &#123;
pr_err("%s: some error happen, fail to get regulator \n", __func__);
goto exit;
&#125;
//set output voltage to 3V
ret = regulator_set_voltage(regu, 3000000, 3400000);
if (0 != ret) &#123;
pr_err("%s: some error happen, fail to set regulator voltage!\n", __func__);
goto exit;
&#125;
//enalbe regulator
ret = regulator_enable(regu);
if (0 != ret) &#123;
pr_err("%s: some error happen, fail to enable regulator!\n", __func__);
goto exit;
&#125;
//disalbe regulator
ret = regulator_disable(regu);
if (0 != ret) &#123;
pr_err("%s: some error happen, fail to disable regulator!\n", __func__);
goto exit;
&#125;
//put regulater, when module exit
regulator_put(regu);

技巧 regulator_get 调用有两种方法: 第一种就是直接获取dts 中regulator 的句柄,比如说axp2202_dcdc1。调用regulator_get 时第一个参数不需要配置设备,直接写NULL。 第二种是在dts 的设备里配置regulator 的节点,比如说dts 某个设备里配置regulator0 = "axp2202/_dcdc1";,该设备调用时写法为:regulator_get(dev, "regulator0");。

3.2.2 Regulator shell 命令使用示例

AXP regulator 可以通过shell 命令控制和设置其开关以及输出电压,各路文件节点建立在在/sys/devices/platform 目录下

• AXP717

AXP717 可控的节点可参考上面virtual 章节Virtual-consumer

以设置DCDC1 输出最大电压为3.3V,设置目标电压为3.0V 为例做说明。

cd /sys/devices/platform/soc/7081400.s_twi/i2c-6/6-0034/reg-virt-consumer.1
cat of_node/name //确认是否为DCDC1
//设置输出电压为3.0V
echo 3300000 > max_microvolts
echo 3000000 > min_microvolts
//关闭输出
echo 3300000 > max_microvolts
echo 3000000 > min_microvolts
echo 0 > min_microvolts

3.2.3 usb_count 查看

根据上面Regulator 章节Regulator 找到对应的regulator 节点,这里以dcdc1 为例,其节点名称为regulator.3,则在/sys/class/regulator 目录下就有个

regulator.3 目录,regulator.3目录有个num_users 节点,cat 此节点就可以获得当前use_count 值。

cat /sys/class/regulator/regulator.3/num_users

num_uesrs 代表当前有多少设备使用了regulator 节点用来控制输出电压。