跳到主要内容

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 内部结构如下图所示:

PL 部分芯片内硬件架构图

PMC 硬件说明

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 的配置。

BoardConfig 配置项

增加后需要重新 lunch 板级以实现环境变量的更新。

提示

这个配置修改将会启用 BOOT0 中的 cfg_pl5_powon.mk 的配置,启用 CFG_PL5_PWRON=y 配置项。在 brandy/brandy-2.0/spl/board/sun252iw1p1/board.c 中会判断这个配置是否启用,如果启用则会将 PL5 保留为 PMC 配置,而不是切换为 GPIO 模式。

保留 PL5 配置代码

注意使用 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 配置

配置完成即可,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 即可配置。

配置 PMC IO

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

BOOT0 中的代码实现

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 {
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_enIRQ 开机唤醒功能使能,可使用 NMI 引脚唤醒系统(PMC 的 NMI,不是 PL5)0:禁用
1:启用
0
pmc_irq_enIRQ 中断功能使能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_drvPMC_EN0 引脚驱动能力0:档位 0
1:档位 1
2:档位 2
3:档位 3
0
pmc_pwr_en1_drvPMC_EN1 引脚驱动能力0:档位 0
1:档位 1
2:档位 2
3:档位 3
0
pmc_pwr_en2_drvPMC_EN2 引脚驱动能力0:档位 0
1:档位 1
2:档位 2
3:档位 3
0
pmc_pwr_en0_oePMC_EN0 引脚输出使能0:使能
1:不使能
0
pmc_pwr_en1_oePMC_EN1 引脚输出使能0:使能
1:不使能
0
pmc_pwr_en2_oePMC_EN2 引脚输出使能0:使能
1:不使能
0
pmc_pwr_en0_pullPMC_EN0 引脚上下拉0:关闭
1:上拉
2:下拉
0
pmc_pwr_en1_pullPMC_EN1 引脚上下拉0:关闭
1:上拉
2:下拉
0
pmc_pwr_en2_pullPMC_EN2 引脚上下拉0:关闭
1:上拉
2:下拉
0
pmc_pwron_iePOWERON 引脚输入使能0:使能
1:不使能
0
pmc_nmi_ieNMI 引脚输入使能0:使能
1:不使能
(有特殊说明,见下面 Tips)
1
pmc_resetb_ieRESET 引脚输入使能0:使能
1:不使能
(有特殊说明,见下面 Tips)
1
pmc_boot_seqPMC 上下电顺序配置(首次启动后需设置,且 RTC 不掉电)详见下表0
提示

pmc_nmi_iepmc_resetb_ie 当 PMC 启用的时候固定有效,不可关闭。PMC 启用指的是 PMC-BYP 引脚被拉高,是一个硬件行为。

PMC 上下电顺序配置

控制 pmc_boot_seq 的参数。

配置上电顺序下电顺序
0EN0 → EN1 →EN2EN2 → EN1 → EN0
1EN0 → EN2 → EN1EN1 → EN2 → EN0
2EN1 → EN0 → EN2EN2 → EN0 → EN1
3EN1 → EN2 → EN0EN0 → EN2 → EN1
4EN2 → EN0 → EN1EN1 → EN0 → EN2
5EN2 → EN1 → EN0EN0 → 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_BOOTPOWERON 按键开机
VBUS_BOOTVBUS 插入开机
IRQ_BOOTIRQ 检测开机
ALARM_BOOT闹钟开机
REBOOT重启
POWERON_WAKEPOWERON 按键唤醒
VBUS_WAKEVBUS 插入唤醒
IRQ_WAKEIRQ 检测唤醒
ALARM_WAKE闹钟唤醒
USB_WAKEUSB 中断唤醒
WUP_TIMER_POWERONWakeup timer 开机
WUP_TIMER_WAKEWakeup 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

pmc_dump_reg 节点

vbus_status

用法:cat vbus_status

例子:

cat vbus_status

VBUS 示例

关机源含义
VBUS INVBUS 插入
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

此时轻拍开发板即可唤醒系统