Power Architecture

SoC has an advanced Power Management Controller (PMC), which can flexibly power up different power domains of the chip, to achieve the best balance between chip performance and power consumption.

There are generally three main power domains in the digital system of the SoC: AON, SYSON, and SOC.

Functions in different power domains will be turned off differently in different power-saving modes.

Power-Saving Mode

Ameba SoC supports two low power modes:

  • Sleep mode

    • Clock Gating (CG): Shuts off the clock to the SOC domain while retaining its power supply.

    • Power Gating (PG): Shuts off the power supply to the SOC domain.

  • Deep-Sleep mode

    • Shuts off the power supply to both the SYSON domain and SOC domain. Compared to sleep mode, deep-sleep mode turns off more power domains, resulting in lower power consumption.

Tickless is a low power feature of FreeRTOS. When the system is idle, the CPU will be paused (without disabling clock and power). Both sleep mode and deep sleep mode workflows are based on Tickless.

The following table explains power-saving related terms.

Mode

AON domain

SYSON domain

SOC domain

Description

Tickless

ON

ON

ON

  • FreeRTOS low power feature

  • CPU periodically enters WFI, and exits WFI when interrupts happen.

  • Radio status can be configured off/periodically on/always on, which depends on the application.

Sleep

ON

ON

  • CG:ON

  • PG:OFF

  • A power saving mode on chip level, including clock-gating mode and power-gating mode.

  • CPU can restore stack status when the system exits from sleep mode.

  • The system RAM will be retained, and the data in system RAM will not be lost.

Deep-Sleep

ON

OFF

OFF

  • A more power-saving mode on chip-level.

  • CPU cannot restore stack status. When the system exits from deep-sleep mode, the CPU follows the reboot process.

  • The system RAM will not be retained.

  • The retention SRAM will not be power off.

Tickless for FreeRTOS

The FreeRTOS supports a low-power feature called Tickless. It is implemented in an idle task which has the lowest priority. That is, it is invoked when there is no other task under running.

Note

  • configUSE_TICKLESS_IDLE must be enabled for power-saving application because sleep mode flow is based on Tickless.

  • Unlike the original FreeRTOS, We don’t wake up based on the xEpectedIdleTime.

../../_images/freertos_tickless_in_an_idle_task.svg

FreeRTOS Tickless in an idle task

The figure above shows idle task code flow. In idle task, it will check sleep conditions (wakelock, sysactive_time, details in Section Wakelock APIs and pmu_set_sysactive_time) to determine whether needs to enter sleep mode or not.

  • If not, the CPU will execute an ARM instruction WFI (wait for interrupt) which makes the CPU suspend until the interrupt happens. Normally systick interrupt resumes it. This is the software Tickless.

  • If yes, it will execute the function freertos_pre_sleep_processing() to enter sleep mode or deep-sleep mode.

Note

  • Even FreeRTOS time control like software timer or vTaskDelay is set, it still enters the sleep mode if meeting the requirement as long as the idle task is executed.

Wi-Fi Power Saving

The WiFi STA power saving modes defined in the IEEE 802.11 specification include the following key features:

  • Enter doze state when no data is being sent or received.

  • enter awake state for receiving AP beacon frame

  • Utilizes beacon TIM (Traffic Indication Map) for data management

During the station’s sleep period, it cannot receive any data frames. Therefore, the AP must buffer any pending frames, and the STA must periodically wake up to check for beacon frames.

../../_images/wifi_timeline_of_power_saving.svg

Power Saving Mode Timeline

Based on the above standard IEEE 802.11 power saving mechanism, the Ameba IC provides three WiFi power saving modes:

Mode

Full Name

Description

LPS

Legacy Power Save

Switches between awake and doze states under WiFi connection, periodically turns the transceiver on or off for power saving.

WoWLAN

Wake on Wireless LAN

Allows the SoC system to enter sleep mode while maintaining WiFi connectivity. The system can be woken up by unicast packets, broadcast/multicast packets (optional), or AP disconnect event.

IPS

Inactive Power Save

Implements a complete power-down state when not connected.

Entry and exit conditions for WiFi power saving modes:

Mode

User Configuration

Entry and Exit Conditions

LPS

wifi_user_config.lps_enable

Under wifi connection state, automatically enter or exit LPS mode by traffic falling below or exceeding a defined threshold

WoWLAN

Default support

Under WiFi connection, automatically enters or exits WoWLAN mode along with AP core sleep or active mode.

IPS

wifi_user_config.ips_enable

Enters or exits when WiFi connects or disconnects.

Wakeup Source

The following table lists the wakeup sources that can be used to wake up the system under different power modes.

Wakeup source

Sleep CG

Sleep PG

Deep-Sleep

Restriction

WLAN

X

BT

X

IPC

X

Only KM0 can use the IPC to wake up KM4.

Basic Timer4~7

X

PMC Timer

X

For internal usage

UART0~2

X

  • When using UART as a wakeup source, the Rx clock source can only be OSC2M, and do not turn off OSC4M during sleep.

  • When the baudrate is larger than 115200, it is not recommended to use UART as a wakeup source.

  • The portion of the command used to wake up that exceeds the FIFO depth (64B) will be lost.

LOGUART

X

When using LOGUART as a wakeup source:

  • If the Rx clock source is XTAL40M, do not turn off XTAL or OSC4M during sleep.

  • If the Rx clock source is OSC2M, do not turn off OSC4M during sleep.

  • The portion of the command used to wake up that exceeds the FIFO depth (16B) will be lost.

GPIO

X

I2C

X

CAP_TOUCH

X

ADC

X

SDIO

X

Key-Scan

X

BOR

PWR_DOWN

AON_TIMER

AON_WAKEPIN

RTC

Entering Sleep Mode

Sleep mode is based on FreeRTOS Tickless, thus it is recommended to enter sleep mode by releasing the wakelock.

  1. Initialize the specific peripheral.

  2. Enable and register the peripheral’s interrupt.

  3. Set sleep_wevent_config[] in ambea_sleepcfg.c, and the interrupt should be registered on the same CPU selected by sleep_wevent_config[].

  4. For peripherals that need special clock settings, set ps_config[] in ameba_sleepcfg.c if needed.

  5. Register sleep/wakeup callback if needed.

  6. Enter sleep mode by releasing the wakelock in application core (AP) (PMU_OS needs to be released since it is acquired by default when boot).

  7. Clear the peripheral’s interrupt when wakeup.

Entering Deep-Sleep Mode

Deep-Sleep can also be entered from FreeRTOS Tickless flow.

When the system boots, AP holds the deepwakelock PMU_OS, thus freertos_ready_to_dsleep() will be checked fail and the system does not enter deep-sleep mode in idle task by default. Since freertos_ready_to_dsleep() will be checked only after freertos_ready_to_sleep() is checked pass, both the wakelock and deepwakelock need to be released for entering deep-sleep mode.

Configuration:

  1. Initialize the related peripheral and enable its interrupt.

  2. Set sleep_wakepin_config[] in ameba_sleepcfg.c when using AON wakepin as a wakeup source.

  3. Enter deep-sleep mode by releasing the deepwakelock and wakelock in AP.

Power-Saving Configuration

Please reference User Config chapter for detail information.

UART and LOGUART

For peripherals that require specific clock settings, such as UART and LOGUART, the configuration procedures are described in the following sections.

  1. Initialize UART/LOGUART and enable their interrupts.

  2. Set the wake-up source: In sleep_wevent_config[], configure the wake-up source (WAKE_SRC_UART0/WAKE_SRC_UART1/WAKE_SRC_UART2_BT/WAKE_SRC_UART_LOG) and specify the CPU to be woken up (WAKEUP_KM4 or WAKEUP_KM0). Ensure the interrupt is registered on the CPU to be woken up.

  3. Select the clock source:

    1. XTAL: In ps_config[], set xtal_mode_in_sleep to XTAL_Normal and set keep_OSC4M_on to TRUE.

    2. OSC2M: In ps_config[], set keep_OSC4M_on to TRUE.

  4. Set the operating voltage: In ps_config[], set sleep_to_08V to TRUE.

  5. Enter sleep mode by releasing the wake lock on KM4 (PMU_OS needs to be released because it is acquired by default at system startup).

  6. Clear the UART/LOGUART interrupt after waking up.

Note

  • When using UART as a wake-up source, the following limitations apply:

  • The Rx clock source can only be OSC2M, and OSC4M must not be turned off during sleep. It is not recommended to use UART as a wake-up source when the baud rate is greater than 115200.

    • Before sleep, you need to call the API RCC_PeriphClockSource_UART(UARTx_DEV, UART_RX_CLK_OSC_LP) to switch the clock to OSC2M.

    • If higher baud rate is required after waking up, you can use the API RCC_PeriphClockSource_UART(UARTx_DEV, UART_RX_CLK_XTAL_40M) to switch to XTAL40M Rx clock.

  • Any part of commands used for wake-up that exceed the FIFO depth (64 bytes) will be lost.

  • When using LOGUART as a wake-up source, the following limitations apply:

  • If the Rx clock source is OSC2M, OSC4M must not be turned off during sleep.

    • Before sleep, you need to call the API RCC_PeriphClockSource_LOGUART(LOGUART_CLK_OSC_LP) to switch the clock to OSC2M.

    • If higher baud rate is required after waking up, you can use the API RCC_PeriphClockSource_LOGUART(LOGUART_CLK_XTAL_40M) to switch to XTAL40M Rx clock.

  • If the Rx clock source is XTAL40M, XTAL must not be turned off during sleep.

  • Any part of commands used for wake-up that exceed the FIFO depth (16 bytes) will be lost.