PMC - 电源控制模块
V821 芯片内置 PMC(Power Control),用于系统电源控制,包括:
- DCDC/LDO/Switch等电源的开关、参数配置;
- 内部各独立供电电路的开启关闭;
- 晶振时钟源相关控制。
- 支持上电、下电、休眠、唤醒等使用场景,每个使用场景都有各自的触发源触发,并由 PowerControl 配合执行后续的系列开关动作。
PMC 的动作基本都由硬件自动完成,预留部分可配置参数由软件配置。
PMC 硬件功能配置
一般来说,PMC IO 控制的对应关系对应下表所示:
方案 | PMC_EN0/PL0 | PMC_EN1/PL1 | PMC_EN2/PL2 | PL6 | 休眠唤醒支持的模式 |
---|---|---|---|---|---|
常电/CDR方案 | PMC | GPIO | GPIO | GPIO | 支持 poweroff 关机模式 |
电池方案,不使用调压功能 | PMC | PMC | GPIO | GPIO | 支持 super standby, ultra standby, poweroff 模式 |
电池方案,使用调压功能 | PMC | PMC | PMC | GPIO | 支持 super standby, ultra standby, poweroff 模式,支持动态调压 |
电池方案,不使用调压功能,AOV | PMC | PMC | GPIO | PMC | 支持 super standby, ultra standby, poweroff 模式,支持独立控制 DRAM 电源 |
电池方案,使用调压功能,AOV | PMC | PMC | PMC | PMC | 支持 super standby, ultra standby, poweroff 模式,支持独立控制 DRAM 电源,支持动态调压 |
PMC_EN0/PL0 默认作为 PMC 功能,这个引脚在硬件设计时请尽量不用做普通 IO
常电 IPC 方案
- VDD-SYS晚于3.3V上电
- PMC_EN0/PL0:控制 VDD-SYS上电时序,建议不作为 GPIO 使用(限制较多)
- PL1~PL7 用户可作为 GPIO 使用
CDR 方案
- PMC_EN0/PL0:控制 VDD-SYS上电时序
- PL1~PL7 具备唤醒/开机功能(唤醒电平只能为1.8V)
- 唤醒源可支持做ACC DET,G-INT,VBUS-DET,PWRON(需接到PL口IO上)
- 一路12V转5V DCDC+SOC三路DCDC供电(3.3V,0.92/1V,1.5V)+一路G-SENSOR LDO供电。若AHD/CMOS需1.2V则需增加一路LDO/DCDC供电
- VBAT-RTC可直接电池或者纽扣电池供电,无需外挂LDO(电池需外挂charger芯片)
- SOC 电源输入采用 MOS 管开关方式控制,关机下可断开 DCDC 输入源,避免 DCDC 漏电影响功耗
- 关机下保持VBAT-RTC供电以及外设G-SENSOR供电其他均断电
- VBUS-DET 和 ACC 需通过隔离转换到 1.8V 接入到 PL 口 IO 实现接入唤醒/开机功能,开机后可作为普通 IO,实现 VBUS 和 ACC 状态检测
- VBAT-RTC输入电压范围 2.1~6V,单节锂电池方案,可直接接到 VBAT-RTC,实现常供 RTC 不掉电
- 纽扣电池方案,可纽扣电池直接接 VBAT-RTC,无需外挂 LDO
- 当正常关机 (hibernation),VBAT-RTC 功耗 10uA 左右,若非正常关机,异常掉电状态,VBAT-RTC 功耗 40uA 左右
- 如果对非正常关机功耗要求较高,需外挂RTC芯片降低功耗
电池IPC/门铃方案
电池IPC/门铃方案需要 4 路 DCDC,包括 3 路低静态漏电 DCDC 3.3V,0.92V/1V,1.5V + 1路普通DCDC 1.5V + 1路LDO(唤醒外设PIR等供电)+ 1路PMOS开关(3.3V非唤醒源外设/IO供电)
- DCDC1 为 RF 3.3V 供电(需低静态漏电)
- DCDC2 为 VDD-SYS 0.92V/1V 供电(需低静态漏电)
- DCDC3 为 DRAM 1.5V 供电
- DCDC4 为 RF 1.5V 供电(需低静态漏电)
- PMOS1 为 3.3V 非唤醒源外设/IO 供电
- LDO1 为唤醒源外设供电,如 PIR,Gsensor 等
- 电池为单节电池可直接接 VBAT-RTC,确保 VBAT-RTC 不掉电,若为多节电池,需额外增加降压电路,保证输入到 VBAT-RTC 在 2.1V~6V 范围内
PWR-EN0 和 EN1为硬件控制,触发唤醒源,由硬件拉高IO,EN2(PL2)为软件控制,启动时可由软件控制拉高,不需要使用可做普通IO/唤醒IO使用:
- PWR-EN0(PL0):控DCDC1-3V3(RF3.3V),DCDC4-1V5(RF1.5V),DCDC2-0V92/1V(VDD-SYS)
- PWR-EN1(PL1):控DCDC3-1V5(VCC15-DRAM),PMOS1(非唤醒源外设和IO供电)
- PWR-EN2(PL2):做双目控制DCDC2 (VDD-SYS)在休眠下调压达到休眠降功耗的作用(若无需做调压,PL2可释放出来做普通IO使用)
工作模式与电源供电方式:
- 正常工作/唤醒状态模式:PL0,PL1,(PL2)都拉高,DCDC 均开启供电
- Wi-Fi保活模式:PL0拉高,PL1,(PL2)拉低;保持VBAT-RTC(VCC18-RTC),RF供电(3.3V和1.5V),小核供电(0.92V/1V),不掉电;其他除唤醒源外电源(PMOS+DRAM1.5V)均掉电;支持 WIFI 唤醒,IO(PL2~PL7)唤醒,RTC定时唤醒
- hibernation(关机)模式:PL0,PL1,(PL2)都拉低;只保持VBAT-RTC(VCC18-RTC)不掉电;其他电源都掉电;此模式只支持IO(PL2~PL7)唤醒,RTC定时唤醒
- 休眠保活下需常供电的 DCDC 必须选用低静态漏电的 DCDC(quiescent current 5uA)
- DCDC1-3V3 (RF3.3V) ---- 考虑 WIFI 瞬态峰值较高,以及 MOS 管开启抽电电流影响,建议选用 1A 以上的 DCDC
- DCDC4-1V5 (RF1.5V) ---- 平均电流较小,瞬态较高,要求 DCDC 选择 500mA 以上
- DCDC2-0V92/1V (VDD-SYS) ---- 电流稳定,瞬态不会太高,0.8A 以上 DCDC 可满足
- DCDC3-1V5 (VCC15-DRAM) 休眠保活下常关,无静态漏电要求,带载选择 500mA 以上
- 对于其他唤醒外设供电要求,建议选用低静态漏电的 LDO
- DCDC 的分压电阻阻值建议选用百 K 级别以上,降低外围的静态漏电流
电池 WIFI AOV 方案
主要供电路径:
- 单节电池无需要另外加 DCDC 转换,可直接到后级 DCDC 上
- 唤醒外设中断需接到PL口IO上
- 输入源做VBUS和VBAT电源输入切换选择,对二极管选型要求最大正向电压在350mV@1A以内,反向漏电要求小于5uA
- 4 路 DCDC(3路低静态漏电DCDC 3.3V,0.92V/1V,1.5V+1路普通DCDC 1.5V)+3路LDO(1路LDO供唤醒外设PIR等和2路LDO供CMOS 1.8V和2.8V,若需1.2V需再增加1路LDO)+2路PMOS开关(3.3V非唤醒源外设/IO供电和CMOS供电)
其中电源方案如下:
- DCDC1 为 RF 3.3V 供电(需低静态漏电)
- DCDC2 为 VDD-SYS 0.92V/1V 供电(需低静态漏电)
- DCDC3 为 DRAM 1.5V 供电
- DCDC4 为 RF 1.5V 供电(需低静态漏电)
- PMOS1为 3.3V 非唤醒源外设/IO供电
- PMOS2 为 CMOS 供电 LDO 的 3.3V 输入源(LDO2~LDO4输入)
- LDO1 为唤醒源外设供电,如 PIR 等
- LDO2~LDO4 为 CMOS 独立供电 LDO 1.2V,1.8V,2.8V(通用设计,这里不体现)
- 电池为单节电池可直接接 VBAT-RTC,确保 VBAT-RTC 不掉电,若为多节电池,需额外增加降压电路,保证输入到 VBAT-RTC 在 2.1~6V 范围内
需要控制外部电源的 PMC 与 IO 如下:
- 电源上通过 PL0,PL1,PL2 和 PL6 控制,其中 PL0 和 PL1 为硬件控制,触发唤醒源,由硬件拉高 IO,PL2 和 PL6 为软件控制,启动时由软件控制拉高
- PL0(PWR-EN0):控DCDC1-3V3(RF3.3V),DCDC4-1V5(RF1.5V),DCDC2-0V92/1V(VDD-SYS)
- PL1(PWR-EN1):控PMOS1(非唤醒源外设和IO供电)
- PL2(PWR-EN2):做双目控制DCDC2(VDD-SYS)在休眠下调压达到休眠降功耗的作用(若无需做调压,PL2可释放出来做普通IO使用)
- PL6:控DCDC3-1V5(VCC15-DRAM),PMOS2
PMC 软件配置
在 SDK 1.1 版本,仅支持配置开关 PMC 功能,在 SDK 1.2 版本支持精细化配置 PMC 各个管脚,下面请选择对应的 SDK 参考
- SDK 1.1
- SDK 1.2
BOOT0 相关配置 - SDK1.1
首先确认当前方案使用的配置文件,这里以 perf2b 板级为例,查看 BoardConfig_nor.mk
和 BoardConfig.mk
中配置的 LICHEE_BOOT0_BIN_NAME
,分布对应 SPI NOR 方案与 eMMC 方案下使用的 BOOT0 配置。
如果 BoardConfig_nor.mk
和 BoardConfig.mk
中没有配置 LICHEE_BOOT0_BIN_NAME
,则标识方案使用默认配置,根据具体存储器件选择 mmc.mk
,spinor.mk
,nand.mk
即可
软件方案 | 存储器件 | 配置文件 |
---|---|---|
普通 | SPI NOR | brandy/brandy-2.0/spl/board/sun300iw1p1/spinor.mk |
普通 | SPI NAND | brandy/brandy-2.0/spl/board/sun300iw1p1/nand.mk |
普通 | eMMC/SD NAND | brandy/brandy-2.0/spl/board/sun300iw1p1/mmc.mk |
快起 | SPI NOR | brandy/brandy-2.0/spl/board/sun300iw1p1/spinorfastboot.mk |
快起 | eMMC/SD NAND | brandy/brandy-2.0/spl/board/sun300iw1p1/mmcfastboot.mk |
前往 brandy/brandy-2.0/spl/board/sun300iw1p1
找到配置文件
这里以 spinorpmc.mk
为例,配置项如下:
CFG_PM_ENABLE_PMC=y # 启用 PMC 功能
CFG_SUNXI_PL_1V8=y # 配置 PL 使用 1.8V 电平
CFG_PM_PMC_PL6=y # 使用 PL6 控制 DRAM 供电,AOV 方案
另外 fes 文件夹中的配置是执行 fes 时使用的,也需要配置,否则可能会出现 fes 烧录阶段无法启动的问题
RTOS 相关配置
由于 V821 休眠唤醒需要 RTOS 参与,所以需要配置 RTOS 相关
输入 mrtos menuconfig
进入 RTOS 配置页面
System components --->
aw components --->
[*] PowerManager Support --->
[*] pm enable pmc # 配置启用 PMC 功能
[ ] pm pmc using PL6 GPIO as power ctl # 配置启用 PL6 作为电源控制引脚
BOOT0 相关配置 - SDK1.2
首先确认当前方案使用的配置文件,这里以 perf2b 板级为例,查看 BoardConfig_nor.mk
和 BoardConfig.mk
中配置的 LICHEE_BOOT0_BIN_NAME
,分布对应 SPI NOR 方案与 eMMC 方案下使用的 BOOT0 配置。
如果 BoardConfig_nor.mk
和 BoardConfig.mk
中没有配置 LICHEE_BOOT0_BIN_NAME
,则标识方案使用默认配置,根据具体存储器件选择 mmc.mk
,spinor.mk
,nand.mk
即可
软件方案 | 存储器件 | 配置文件 |
---|---|---|
普通 | SPI NOR | brandy/brandy-2.0/spl/board/sun300iw1p1/spinor.mk |
普通 | SPI NAND | brandy/brandy-2.0/spl/board/sun300iw1p1/nand.mk |
普通 | eMMC/SD NAND | brandy/brandy-2.0/spl/board/sun300iw1p1/mmc.mk |
快起 | SPI NOR | brandy/brandy-2.0/spl/board/sun300iw1p1/spinorfastboot.mk |
快起 | eMMC/SD NAND | brandy/brandy-2.0/spl/board/sun300iw1p1/mmcfastboot.mk |
前往 brandy/brandy-2.0/spl/board/sun300iw1p1
找到配置文件
这里以 spinorpmc.mk
为例,配置项如下:
CFG_SUNXI_PL_1V8=y # 配置 PL 使用 1.8V 电平
CFG_PMC_EN1_FOR_PWRCTRL=y # 配置 PMC_EN1/PL1 作为 PMC 功能
CFG_PMC_EN2_FOR_PWRCTRL=y # 配置 PMC_EN2/PL2 作为 PMC 功能
CFG_PMC_PL6_FOR_PWRCTRL=y # 配置 PL6 作为 PMC 使用控制外部电源
# CFG_PMC_PL7_FOR_PWRCTRL=y # 配置 PL7 作为 PMC 使用控制外部电源(特殊设计,一般不使用,默认注释)
另外 fes 文件夹中的配置是执行 fes 时使用的,也需要配置,否则可能会出现 fes 烧录阶段无法启动的问题
RTOS 相关配置
由于 V821 休眠唤醒需要 RTOS 参与,所以需要配置 RTOS 相关
输入 mrtos menuconfig
进入 RTOS 配置页面
System components --->
aw components --->
[*] PowerManager Support --->
[*] pmc en1 for pwrctrl # 配置 PMC EN1 启用 PMC 功能
[*] pmc en2 for pwrctrl # 配置 PMC EN2 启用 PMC 功能
[*] pmc pl6 for pwrctrl # 配置 PL6 用作 PMC 功能
[ ] pmc pl7 for pwrctrl # 配置 PL7 用作 PMC 功能(特殊设计,一般不使用)
开机唤醒源的获取
在 BOOT 阶段获取唤醒源
在硬件上支持三种唤醒源,包括
- Wake UP IO
- SYS RTC
- RTC Timer
其中的唤醒源可以读取 0x4a000880
寄存器,其含义如下:
唤醒源 | 描述 | 使用场景 | 寄存器位 |
---|---|---|---|
Wake UP IO | PL0~7 中任意一个引脚,IO 唤醒 使用示例: 1. 关机后按住 POWER ON按键,唤醒系统 2. 使用 GSensor 中断脚连接 Wake UP IO 唤醒系统 | IO 按键唤醒 GSensor 唤醒 ACC 打火唤醒 | BIT(2) |
SYS RTC | 使用 RTC 进行唤醒 使用示例: 设置 10s 后唤醒系统:echo +10 > /sys/class/rtc/rtc0/wakealarm | 定时唤醒记录 长时间闹钟唤醒 时间以秒为单位 | BIT(1) |
RTC Timer | 使用 Wake UP Timer 进行唤醒 使用示例: 设置休眠后 100ms 唤醒系统:echo 700 > /sys/class/ae350_standby/time_to_wakeup_ms | 短时间唤醒 AOV 场景短时唤醒 时间以毫秒为单位 休眠开始时才计时 | BIT(0) |
在 BOOT0 中获取唤醒源
在 BOOT0 代码中可以用 readl
获取寄存器的值,并进行判断
#define SUNXI_PMU_RTC_BASE 0x4A000800
u32 startup_reg_data;
startup_reg_data = readl(SUNXI_PMU_RTC_BASE + 0x80);
if (startup_reg_data & BIT(0))
printf("wakeup_req: rtc timer\n");
if (startup_reg_data & BIT(1))
printf("wakeup_req: sysrtc\n");
if (startup_reg_data & BIT(2))
printf("wakeup_req: wakeup io\n");
启动时候也会打印日志
在 U-BOOT 中获取唤醒源
在 U-Boot 代码中可以用 readl
获取寄存器的值,并进行判断
#define SUNXI_PMU_RTC_BASE 0x4A000800
u32 startup_reg_data;
startup_reg_data = readl(SUNXI_PMU_RTC_BASE + 0x80);
if (startup_reg_data & BIT(0))
printf("wakeup_req: rtc timer\n");
if (startup_reg_data & BIT(1))
printf("wakeup_req: sysrtc\n");
if (startup_reg_data & BIT(2))
printf("wakeup_req: wakeup io\n");
在 U-BOOT 命令行可以使用 md
命令获取寄存器的值
在 RTOS 中获取唤醒源
在 RTOS 代码中可以用 readl
获取寄存器的值,并进行判断
由于 Kernel 启动过程中会清除唤醒源,请在 RTOS 启动时就记录下唤醒源,例如 cpu0_app_entry
函数入口马上记录。
#define SUNXI_PMU_RTC_BASE 0x4A000800
u32 startup_reg_data;
startup_reg_data = readl(SUNXI_PMU_RTC_BASE + 0x80);
if (startup_reg_data & BIT(0))
printf("wakeup_req: rtc timer\n");
if (startup_reg_data & BIT(1))
printf("wakeup_req: sysrtc\n");
if (startup_reg_data & BIT(2))
printf("wakeup_req: wakeup io\n");
在 U-BOOT 命令行可以使用 md
命令获取寄存器的值
在 Kernel 内获取开机&唤醒源
使用功能前需要勾选内核驱动
Allwinner BSP --->
Device Drivers --->
Misc Devices Drivers --->
<*> Allwinner startup-info driver
之后启动后便可在下面所示 SYSFS 路径查看开机唤醒源
/sys/class/sunxi_startup_info/startup_info/
获取唤醒源
使用节点即可获取唤醒源,命令如下:
cat /sys/class/sunxi_startup_info/startup_info/wakeup_source
唤醒源 | 描述 | 使用场景 |
---|---|---|
wakeup_io | PL0~7 中任意一个引脚,IO 唤醒 使用示例: 1. 关机后按住 POWER ON按键,唤醒系统 2. 使用 GSensor 中断脚连接 Wake UP IO 唤醒系统 | IO 按键唤醒 GSensor 唤醒 ACC 打火唤醒 |
sysrtc | 使用 RTC 进行唤醒 使用示例: 设置 10s 后唤醒系统:echo +10 > /sys/class/rtc/rtc0/wakealarm | 定时唤醒记录 长时间闹钟唤醒 时间以秒为单位 |
rtc_timer | 使用 Wake UP Timer 进行唤醒 使用示例: 设置休眠后 100ms 唤醒系统:echo 700 > /sys/class/ae350_standby/time_to_wakeup_ms | 短时间唤醒 AOV 场景短时唤醒 时间以毫秒为单位 休眠开始时才计时 |
空 | 本次启动不是通过唤醒源启动的 | 重置开机场景,查看 reset_source |
例如这里使用 wakeup_io
唤醒,打印如下:
获取开机源
若本次开机不是通过唤醒开机的,可以使用节点获取开机源,命令如下:
cat /sys/class/sunxi_startup_info/startup_info/reset_source
开机源 | 描述 | 使用场景 |
---|---|---|
cold_boot | 冷启动 上电启动 | 插电开机 |
rtc_wdg_rst | 看门狗触发重置开机 | 看门狗长时间未喂狗,导致重启开机 |
rtc_wdg_rst user_reboot | 用户主动执行 reboot 命令 | 用户主动执行了 reboot 命令,导致开机 |
det_rst | 由于 3V3,1V8,0V9 中任意一路电源出现异常跌落或掉电,触发重置开机 | 电源跌落掉电导致重置开机 |
pwron_rst | 使用内置 RESET 信号触发重置开机 | 内部信号触发重置开机 |
空 | 本次开机并非重置开机 | 唤醒场景,查看 wakeup_source |
例如冷启动,可以获取当前为冷启动:
输入 reboot
可以获取当前为 reboot
开机
寄存器进入 USB 升级模式
若需要软件控制进入 USB 烧录模式,需要对寄存器 0x4a0001d0
写入 0x429b0001
使下一次启动进入烧录模式。
这个寄存器写入后带电重启仍会保持,需要在烧录之前写入 0x429b0000
将其清零,否则会一直进入 USB 烧录模式
在 SPL 代码中,SPL 启动时会自动清除烧录位。
快速启动功能
V821 每次启动镜像加载成功后,启动介质ID、以及备份ID等均会被记录到寄存器 0x4a000258
中。在 poweroff
唤醒、rtc_wdg
复位场景下,通过该寄存器获取到启动介质信息,直接访问、启动,达到快起目的。该流程亦成为“热启动”。
但是当需要带电池卡升级时,这个功能会导致无法正常卡升级,此时需要清除这个寄存器的数据再重启系统。
在 BOOT0,UBOOT,RTOS 中可以这样配置:
writel(0x0, 0x4a000258);
在 Linux 中可以通过 sunxi_dump
配置
echo 0x4a000258 0x0 > /sys/class/sunxi_dump/write
异常掉电保护
V821芯片内置异常掉电保护功能,且默认启用。该功能包括VCC_DET和VSYS_DET,用于低压保护,主要应用场景如下:
- 加快上电:电源正常时,可根据实际电压情况判断是否成功上电。
- 异常处理(初次上电):在初次上电时,默认启用 VSYS_DET 功能。如果 VCC_SYS 没有电源,系统将无法完成上电过程。
- 异常处理(掉电检测):当上电后突然拔掉电源,VCC_DET 和 VSYS_DET将检测到电压下降至特定阀值,并复位整个系统。
对于正常运行的产品,在突然断电的场景下,保护 Flash 数据尤为重要。由于断电后内部电压逐渐下降,当 Flash 工作电压接近 时,可能会产生不稳定状态,特别是在 SPI Flash 正在访问时,可能会导致数据异常。因此,在此场景下,需要通过 VSYS_DET 和 VCC_DET 对芯片进行复位,确保系统正常运行。
默认情况下,软件配置异常掉电保护如下:
- VSYS_DET 配置掉电阈值 600mV 复位系统
- VCC15_DET 默认未启用
- VCC33_DET 配置上电阈值3.1V,掉电阈值 2.9V 复位系统
配置异常掉电保护功能
关闭异常掉电保护仅在调试过程中排查问题使用,量产产品使用会造成数据损坏等一系列问题,修改前请联系全志 FAE
配置异常掉电保护包括三个寄存器,包括配置 3V3 掉电阈值,和启用掉电检测功能。
- 默认上电时,默认会启用 VSYS_DET 掉电检测复位功能,禁用 VCC33_DET 掉电检测复位功能。
- 在 BOOT0 阶段,软件会配置该寄存器,启用 VSYS_DET 掉电检测复位功能,和 VCC33_DET 掉电检测复位功能。
void rtc_set_vccio_det_spare(void)
{
u32 val = 0;
/* set detection threshold to 2.9V */
val = readl(SUNXI_PMU_RTC_BASE + VCC33_DET_CTRL_REG);
val &= ~(VCCIO_THRESHOLD_MASK << 8);
val |= (VCCIO_THRESHOLD_VOLTAGE_2_9); // <- 修改这个宏
writel(val, SUNXI_PMU_RTC_BASE + VCC33_DET_CTRL_REG);
/* enable vccio debonce */
val = readl(SUNXI_PRCM_BASE + POR_RESET_CTRL_REG);
val &= ~VCC33_DET_RSTN_ENABLE;
writel(val, SUNXI_PRCM_BASE + POR_RESET_CTRL_REG);
}
修改 3V3 上电/掉电电压需要修改代码里的宏 VCCIO_THRESHOLD_VOLTAGE_2_9
配置如下:
#define VCCIO_THRESHOLD_VOLTAGE_2_7 (0 << 8) // 上电阈值2.9V,掉电阈值2.7V
#define VCCIO_THRESHOLD_VOLTAGE_2_6 (1 << 8) // 上电阈值2.8V,掉电阈值2.6V
#define VCCIO_THRESHOLD_VOLTAGE_2_8 (2 << 8) // 上电阈值3.0V,掉电阈值2.8V
#define VCCIO_THRESHOLD_VOLTAGE_2_9 (3 << 8) // 上电阈值3.1V,掉电阈值2.9V
#define VCCIO_THRESHOLD_VOLTAGE_3_0 (4 << 8) // 上电阈值3.2V,掉电阈值3.0V
#define VCCIO_THRESHOLD_VOLTAGE_3_1 (5 << 8) // 上电阈值3.3V,掉电阈值3.1V
#define VCCIO_THRESHOLD_VOLTAGE_3_2 (6 << 8) // 上电阈值3.4V,掉电阈值3.2V
#define VCCIO_THRESHOLD_VOLTAGE_3_3 (7 << 8) // 上电阈值3.5V,掉电阈值3.3V
如果需要关闭这个功能,如下修改
void rtc_set_vccio_det_spare(void)
{
u32 val = 0;
/* set detection threshold to 2.9V */
val = readl(SUNXI_PMU_RTC_BASE + VCC33_DET_CTRL_REG);
val &= ~(VCCIO_THRESHOLD_MASK << 8);
val |= (VCCIO_THRESHOLD_VOLTAGE_2_9);
writel(val, SUNXI_PMU_RTC_BASE + VCC33_DET_CTRL_REG);
/* disable vcc33 debonce */
val = readl(SUNXI_PRCM_BASE + POR_RESET_CTRL_REG);
val |= VCC33_DET_RSTN_ENABLE;
writel(val, SUNXI_PRCM_BASE + POR_RESET_CTRL_REG);
}
如果需要关闭 VSYS_DET 掉电复位功能,增加如下代码关闭功能
void rtc_set_vccio_det_spare(void)
{
u32 val = 0;
/* set detection threshold to 2.9V */
val = readl(SUNXI_PMU_RTC_BASE + VCC33_DET_CTRL_REG);
val &= ~(VCCIO_THRESHOLD_MASK << 8);
val |= (VCCIO_THRESHOLD_VOLTAGE_2_9);
writel(val, SUNXI_PMU_RTC_BASE + VCC33_DET_CTRL_REG);
/* disable vcc33 debonce */
val = readl(SUNXI_PRCM_BASE + POR_RESET_CTRL_REG);
val |= VCC33_DET_RSTN_ENABLE;
writel(val, SUNXI_PRCM_BASE + POR_RESET_CTRL_REG);
/* 关闭 VSYS_DET 掉电复位功能 */
val = readl(SUNXI_PRCM_BASE + POR_RESET_CTRL_REG);
val |= (1 << 0);
writel(val, SUNXI_PRCM_BASE + POR_RESET_CTRL_REG);
}
寄存器配置说明
- VSYS_DET 掉电/上电检测阈值:
0x4a000860
- 这个寄存器软件默认没有配置,使用默认值
600mV
掉电阈值
- 这个寄存器软件默认没有配置,使用默认值
寄存器位 | 上电默认值 | 软件配置值 | 功能 |
---|---|---|---|
31:11 | \ | \ | \ |
10:9 | 0x1 | 软件未修改 | VSYS 掉电检测阈值电压选择 00: 550mV掉电阈值 01: 600mV掉电阈值 10: 650mV掉电阈值 11: 700mV掉电阈值 |
8:0 | \ | \ | \ |
- VCC_DET 掉电/上电检测阈值:
0x4a000864
寄存器位 | 上电默认值 | 软件配置值 | 功能 |
---|---|---|---|
31:27 | \ | \ | \ |
26:24 | 0x0 | 软件未修改 | VCC15 掉电检测电压配置 000: 上电阈值1.4V,掉电阈值1.3V 001: 上电阈值1.3V,掉电阈值1.2V 010: 上电阈值1.5V,掉电阈值1.4V 011: 上电阈值1.6V,掉电阈值1.5V 100: 上电阈值1.7V,掉电阈值1.6V 101: 上电阈值1.8V,掉电阈值1.7V 110: 上电阈值1.8V,掉电阈值1.7V 111: 上电阈值1.8V,掉电阈值1.7V |
23:17 | \ | \ | \ |
16 | 0x0 | 软件未修改 | VCC15 掉电检测功能配置 0: 禁用 VCC15 掉电检测功能 1: 启用 VCC15 掉电检测功能 |
15:11 | \ | \ | \ |
10:8 | 0x0 | 0x3 | VCC33 掉电检测电压配置 000: 上电阈值2.9V,掉电阈值2.7V 001: 上电阈值2.8V,掉电阈值2.6V 010: 上电阈值3.0V,掉电阈值2.8V 011: 上电阈值3.1V,掉电阈值2.9V 100: 上电阈值3.2V,掉电阈值3.0V 101: 上电阈值3.3V,掉电阈值3.1V 110: 上电阈值3.4V,掉电阈值3.2V 111: 上电阈值3.5V,掉电阈值3.3V |
7:0 | \ | \ | \ |
- 掉电检测复位功能寄存器:
0x4a000024
寄存器位 | 上电默认值 | 软件配置值 | 功能 |
---|---|---|---|
31:5 | \ | \ | \ |
4 | 0x1 | 0x0 | VCC33_DET 掉电检测触发时是否 RESET 系统 1: 不 RESET 系统 0: RESET 系统 |
3:1 | \ | \ | \ |
0 | 0x0 | 0x0 | VSYS_DET 掉电检测触发时是否 RESET 系统 1: 不 RESET 系统 0: RESET 系统 |