V861 PMC 使用指南
概述
编写目的
提供全志 V861 平台 PMC 模块的硬件设计,软件适配的相关说明文档。
适用范围
| 产品名称 | 内核版本 | 备注 |
|---|---|---|
| V861 系列 | Linux-6.6 | 需要芯片封装支持 PMC 功能 |
相关人员
需关注全志 V861 平台 PMC 模块的硬件设计,软件开发者,测试者和第三方人员。
PMC模块
PMC 模块功能
PMC 模块是芯片内部支持控制低功耗场景的应用,实现上下电以及不同场景的供电管理。其功能如下:
- POWERON 按键开机/唤醒/中断功能
- VBUS 插入开机/唤醒/中断功能
- 首次开机后可配置IRQ中断引脚开机/唤醒/中断功能
- 首次开机后可配置闹钟开机/唤醒
- 异常掉电检测功能
- 上下电顺序可配,休眠状态电源可配置单独MASK
- POWERON 按键长按强制关机/重启/仅产生中断功能
- 记录开机/关机源
- Watchdog 复位支持可配重启/仅产生全局复位/输出到引脚
PL 组 IO 芯片内硬件架构
-
PL 组的每个IO 都可以作为普通 GPIO或 唤醒引脚(Wake Up IO 使用。
-
PL0、PL1、PL2 还可以切换为 PMC 功能引脚,不过一旦切换为 PMC 功能,它们就不能再用作 GPIO 或 Wake Up IO
-
默认情况下,PL0、PL1、PL2 口都是 PMC 功能,可以在 BOOT0 阶段配置切换回 GPIO 功能
-
只有当 PMC-BYP 引脚被拉高,并且软件里也设置为 PMC 模式时,PL0、PL1、PL2 口才会真正切换为 PMC 功能,否则将没有任何作用。
-
如果 PMC-BYP 拉低,即使软件设置为 PMC 模式,PMC 功能也不会生效
-
PL 口的 IO 还支持 IO HOLD 功能,在 VSYS 掉电后能保持原有电平状态
-
此外,PMC 功能是否启用完全由 PMC-BYP 引脚电平决定:
- 拉高:启用 PMC 功能
- 拉低:禁用 PMC 功能
-
PL5 引脚复用了 TEST 功能和 NMI POWERON 功能。
- 冷启动上电时,切勿拉高 PL5,否则会进入 TEST 模式。
- PL5 会在芯片启动或唤醒时自动拉高,可用来控制外部 DCDC电源上电。例如为 3.3V 外设供电或 VSYS 系统供电。
- PL5 寄存器配置默认为 NMI POWERON 功能,软件会自动切换到 GPIO 模式,但是如果需要继续使用 PL5 作为上电控制则需要配置软件将其保留为 NMI POWERON 功能。
PL 组 GPIO 内部结构如下图所示:

PMC 硬件说明

- AP-ESET:PMC 复位信号,外接上拉电阻上拉,开机状态下按下,可复位 PMC 寄存器,复位系统
- PWR-STARTUP:开机使能,关机状态下,接高电平触发 PWR_EN 输出高电平;开机后,可提供节点获取开机源
- PWR-ON:开/关机按键,外接上拉;开机状态下,接低电平识别短按长按,长按 10S 关机,PWR-EN 悬空,外部下拉电阻到地
- PWR_EN:总共三组 PWR_EN pin 脚,默认为输出 1.8v,可在设备树通过配置 standby_param 控制休眠时要关闭哪组 PWR_EN 的输出
- NMI:IRQ 开机信号,关机状态下,接低电平触发 PWR_EN 输出高电平
PL5 NMI POWERON 功能配置
如果不使用 PMC,只需要 PL5 上电拉高并维持供电,需要配置 BoardConfig 中的 LICHEE_SPL_BOARD_MK 条目,增加 all-cfg_pl5_powon 的配置。

增加后需要重新 lunch 板级以实现环境变量的更新。
这个配置修改将会启用 BOOT0 中的 cfg_pl5_powon.mk 的配置,启用 CFG_PL5_PWRON=y 配置项。在 brandy/brandy-2.0/spl/board/sun252iw1p1/board.c 中会判断这个配置是否启用,如果启用则会将 PL5 保留为 PMC 配置,而不是切换为 GPIO 模式。

注意使用 PL5 NMI 功能请与全志 FAE 联系,获取其详细的使用方法。
PMC 模块配置
PMC 快速切换
SDK 支持使用 quick_config 命令一键切换到 PMC 模式,包括三个引脚功能:
- PWR_EN0
- PWR_EN1
- PWR_EN2
这三个脚支持任意排列组合,请根据硬件形态配置开启关闭,此处 V881_PERF1 板级使用了 PWR_EN0 和 PWR_EN1,则运行 quick_config
quick_config pmu_set_to_pmc_pl0
quick_config pmu_set_to_pmc_pl1
配置完成即可,quick_config 将自动配置 BOOT0,内核,设备树。
PMC 模块 BOOT0 配置
BOOT0 主要是配置使用哪几个 IO 作为 PMC,硬件上电的时候寄存器默认的值是 PL0,PL1,PL2 都是 PMC 模式,默认不是 GPIO 模式。一般来说 PMC 模块不会完全用完 IO,多余的 IO 可以留着作为 GPIO 使用。这里以 PMC_EN0,PMC_EN1 作为 PMC 功能为例,讲解如何配置 PMC IO 作为 PMC。其他 IO 释放作为普通 GPIO 使用。
修改板级目录下的 BoardConfig,包括 NOR 的和非 NOR 的配置,增加 LICHEE_SPL_BOARD_MK 中加上 all-cfg_pl0_pmc all-cfg_pl1_pmc 即可配置。

配置项目将在 BOOT0 中配置宏 CFG_PMC_EN0_FOR_PWRCTRL 和 CFG_PMC_EN1_FOR_PWRCTRL,控制寄存器是否需要切换到 PMC 功能。

PMC 模块内核配置
PMC 模块的内核配置包括
CONFIG_AW_MFD_PMC
CONFIG_AW_REGULATOR_PMC
CONFIG_AW_PMC_POWER
CONFIG_REGULATOR
如果需要使用 PMC 的 POWERKEY 功能,需要同时配置
CONFIG_AW_INPUT_PMC_PEK
配置项如下:
- CONFIG_AW_MFD_PMC
Allwinner BSP --->
Device Drivers --->
PMIC Drivers --->
<*> X-Powers PMC MMIO PMICs
<*> SUNXI PMC regulator
<*> X-Powers SUNXI_PMC power button driver
<*> PMC power supply driver

内核设备树配置
下面是 PMC 的完整示例配置,包括三个部分:
&pmc {
pmc_irq_boot_en = <1>;
pmc_irq_en = <1>;
pmc_alarm_waleup_en = <0>;
pmc_on2off_extra_en = <0>;
pmc_vbus_wakeup_en = <0>;
pmc_vbus_control_en = <0>;
pmc_boot_seq = <0>;
pmc_hw_clk_gating = <0>;
wup_timer_wake_en = <1>;
status = "okay";
};
&pmc_powerkey {
pmu_powkey_off_time = <6000>;
pmu_powkey_off_func = <0>;
pmu_powkey_off_en = <1>;
pmu_powkey_long_time = <1500>;
pmu_powkey_on_time = <512>;
wakeup_rising;
status = "okay";
};
&pmc_usb_power_supply {
pmu_usbpc_vol = <4600>;
pmu_usbpc_cur = <500>;
pmu_usbad_vol = <4600>;
pmu_usbad_cur = <2500>;
wakeup_usb_in;
wakeup_usb_out;
status = "okay";
};
PMC 功能配置项
配置设备树节点 pmc,具体配置项含义如下表:
| 参数名称 | 功能说明 | 配置内容 | 默认值 |
|---|---|---|---|
| pmc_irq_boot_en | IRQ 开机唤醒功能使能,可使用 NMI 引脚唤醒系统(PMC 的 NMI,不是 PL5) | 0:禁用 1:启用 | 0 |
| pmc_irq_en | IRQ 中断功能使能 | 0:禁用 1:启用 | 0 |
| pmc_alarm_wakeup_en | 闹钟开机唤醒功能使能 | 0:禁用 1:启用 | 0 |
| pmc_on2off_extra_en | 开机状态下异常掉电时的处理控制: 启用时,异常掉电 PMC跳转到关机状态; 未启用时,PMC 保持原状态 | 0:禁用 1:启用 | 0 |
| pmc_vbus_control_en | 开机状态下 VBUS 插入后,若强制关机,控制关机后是否自动重新上电 | 0:禁用 1:启用 | 1 |
| pmc_vbus_wakeup_en | 待机状态下,是否允许通过插入 VBUS 唤醒系统 | 0:禁用 1:启用 | 1 |
| pmc_hw_clk_gating | 是否启用 PMC 硬件自动控制时钟 Gating 功能 | 0:禁用 1:启用 | 0 |
| pmc_pwr_en0_drv | PMC_EN0 引脚驱动能力 | 0:档位 0 1:档位 1 2:档位 2 3:档位 3 | 0 |
| pmc_pwr_en1_drv | PMC_EN1 引脚驱动能力 | 0:档位 0 1:档位 1 2:档位 2 3:档位 3 | 0 |
| pmc_pwr_en2_drv | PMC_EN2 引脚驱动能力 | 0:档位 0 1:档位 1 2:档位 2 3:档位 3 | 0 |
| pmc_pwr_en0_oe | PMC_EN0 引脚输出使能 | 0:使能 1:不使能 | 0 |
| pmc_pwr_en1_oe | PMC_EN1 引脚输出使能 | 0:使能 1:不使能 | 0 |
| pmc_pwr_en2_oe | PMC_EN2 引脚输出使能 | 0:使能 1:不使能 | 0 |
| pmc_pwr_en0_pull | PMC_EN0 引脚上下拉 | 0:关闭 1:上拉 2:下拉 | 0 |
| pmc_pwr_en1_pull | PMC_EN1 引脚上下拉 | 0:关闭 1:上拉 2:下拉 | 0 |
| pmc_pwr_en2_pull | PMC_EN2 引脚上下拉 | 0:关闭 1:上拉 2:下拉 | 0 |
| pmc_pwron_ie | POWERON 引脚输入使能 | 0:使能 1:不使能 | 0 |
| pmc_nmi_ie | NMI 引脚输入使能 | 0:使能 1:不使能 (有特殊说明,见下面 Tips) | 1 |
| pmc_resetb_ie | RESET 引脚输入使能 | 0:使能 1:不使能 (有特殊说明,见下面 Tips) | 1 |
| pmc_boot_seq | PMC 上下电顺序配置(首次启动后需设置,且 RTC 不掉电) | 详见下表 | 0 |
pmc_nmi_ie 和 pmc_resetb_ie 当 PMC 启用的时候固定有效,不可关闭。PMC 启用指的是 PMC-BYP 引脚被拉高,是一个硬件行为。
PMC 上下电顺序配置
控制 pmc_boot_seq 的参数。
| 配置 | 上电顺序 | 下电顺序 |
|---|---|---|
| 0 | EN0 → EN1 →EN2 | EN2 → EN1 → EN0 |
| 1 | EN0 → EN2 → EN1 | EN1 → EN2 → EN0 |
| 2 | EN1 → EN0 → EN2 | EN2 → EN0 → EN1 |
| 3 | EN1 → EN2 → EN0 | EN0 → EN2 → EN1 |
| 4 | EN2 → EN0 → EN1 | EN1 → EN0 → EN2 |
| 5 | EN2 → EN1 → EN0 | EN0 → EN1 → EN2 |
POWERON 按键功能配置项
| 参数名称 | 功能说明 | 配置内容 | 默认值 |
|---|---|---|---|
| pmu_powkey_off_time | 控制按下多长时间后响应关机(poweroff)事件 | 单位:ms 支持 6s,8s,16s | 6000 |
| pmu_powkey_off_func | 控制关机事件的功能类型,未配置时默认执行关机操作 | 0:关机 1:复位系统 2:仅触发中断 | 0 |
| pmu_powkey_off_en | 控制按键关机功能是否启用 | 0:禁用 1:启用 | 1 |
| pmu_powkey_long_time | 控制按键长按时间阈值(ponlevel) | 单位:ms 支持 1s,1.5s,2s,2.5s | 1500 |
| pmu_powkey_on_time | 控制按键按下多长时间后开机 | 单位:ms 支持 128,256,512,1s,2s | 512 |
| wakeup_rising | 控制“按键弹起”是否能唤醒系统 | 配置该属性即启用 注释掉该属性则禁用 | — |
| wakeup_falling | 控制“按键按下”是否能唤醒系统 | 配置该属性即启用 注释掉该属性则禁用 | — |
PMC 节点说明
PMC 提供了一个 sys 节点以供获取 PMC 相关信息,位于 /sys/class/pmc/ 下。其包括以下4个节点:
| 节点 | 功能 |
|---|---|
| debug_mask | 调试 MASK 配置(弃用) |
| pmc_reg | 打印指定的 PMC 寄存器 |
| powoff_status | 显示关机源 |
| powon_status | 显示开机源 |
| pmc_status | 查看 PMC 是否启用(PMC Bypass 引脚是否浮空) |
| vbus_status | 检查 PMC VBUS 是否接入 |
这里以常用的四个模块作为说明:
powoff_status
用法:cat powoff_status
例子:
cat powoff_status
| 关机源 | 含义 |
|---|---|
| FIRST_POWEROFF | 首次关机状态 |
| LONGPRESS_POWEROFF | 长按 POWERON 关机 |
| LONGPRESS_REBOOT | 长按 POWERON 重启 |
| WDT_REBOOT | 看门狗重启 |
| ABNORMAL_POWER_LOSS | 异常掉电 |
| SOFT_POWEROFF | 软件配置关机 |
| SOFT_REBOOT | 软件配置重启 |
powon_status
用法:cat powon_status
例子:
cat powon_status
| 开机源 | 含义 |
|---|---|
| RESET_STATUS | 复位状态 |
| POWERON_BOOT | POWERON 按键开机 |
| VBUS_BOOT | VBUS 插入开机 |
| IRQ_BOOT | IRQ 检测开机 |
| ALARM_BOOT | 闹钟开机 |
| REBOOT | 重启 |
| POWERON_WAKE | POWERON 按键唤醒 |
| VBUS_WAKE | VBUS 插入唤醒 |
| IRQ_WAKE | IRQ 检测唤醒 |
| ALARM_WAKE | 闹钟唤醒 |
| USB_WAKE | USB 中断唤醒 |
| WUP_TIMER_POWERON | Wakeup timer 开机 |
| WUP_TIMER_WAKE | Wakeup timer 唤醒 |
pmc_reg
用法:echo [reg] > pmc_reg; cat pmc_reg
例子:查看 PMC 0x10 寄存器的值
echo 0x10 > pmc_reg;cat pmc_reg
PMC 寄存器定义如下
#define PAD_CTRL_REG (0x00)
#define PMC_CTRL_EN_REG (0x08)
#define PMC_DLY_CTRL_REG (0x0C)
#define SW_CFG_REG (0x10)
#define PWRON_INT_EN_REG (0x14)
#define PMC_STATUS_REG (0x18)
#define PWR_EN_CFG_REG (0x28)
#define RST_DLY_SEL_REG (0x2C)
#define PMC_BYP_ST_REG (0x48)
#define PMC_ADDR_EXT (0x0F8)
pmc_dump_reg
打印全部寄存器的值
例子:查看全部寄存器的值
cat pmc_dump_reg

vbus_status
用法:cat vbus_status
例子:
cat vbus_status
| 关机源 | 含义 |
|---|---|
| VBUS IN | VBUS 插入 |
| NO VBUS | 没有 VBUS |
PMC 常见问题
Q:配置PMC之后,长按POWERON重启,而不是关机
请检查此时 VBUS 是否有电,NMI,RESET 是否配置正确
(1)如果 VBUS 有电,检查配置
pmc_vbus_wakeup_en = <0>; # 在开机状态 VBUS 插入后,如果出现强制关机的情况,关机后VBUS不自动开机。
pmu_powkey_off_time = <6000>; # 正确配置长按时间
pmu_powkey_off_func = <0>; # 长按按键为关机模式
(2)如果配置正确,检查关机的时候 RESET,NMI 信号是否正确拉高
Q:PMC 搭配 GSensor 实现抖动唤醒如何配置
这里以 V881 PERF1 开发板为例,开发板板载 DA380 加速度传感器作为演示
(1)配置中断唤醒功能
pmc_irq_boot_en = <1>;
pmc_irq_en = <1>;
(2)配置传感器
通过遍历 /sys/class/input/inputX/name 节点获取 DA380 配置节点,如下是 /sys/class/input/input3。
cat /sys/class/input/input3/name
配置灵敏度,其中数值 高:0x99,中:0xC0,低:0xF3,关闭:0xF01
echo 0xC0 > /sys/class/input/input3/slope_th
开启中断功能
echo 1 > /sys/class/input/input3/int2_enable

(3)测试
先进入休眠模式
echo mem > /sys/power/state
此时轻拍开发板即可唤醒系统,此时配置系统关机
poweroff -f
此时轻拍开发板即可唤醒系统