Power Manager#

Introduction#

The Power Manager is a platform-level software module that manages the system's power states. The power state requirements are set by the different software modules (drivers, stacks, application code, etc...). Power Manager also offers a notification mechanism through which any piece of software module can be notified of power state transitions through callbacks.

Initialization

Power Manager must be initialized before any call to the Power Manager API. If sl_system is used, only sl_system_init() must be called, otherwise sl_si91x_power_manager_init() must be called manually.

Power Manager Architecture

Power manager architecturePower manager architecture

Add and remove requirements

The driver/application can add and remove power state requirements at runtime. Adding requirement function calls changes the power state. Removing requirement function calls will not have any effect for state transition. sl_si91x_power_manager_add_peripheral_requirement()

sl_si91x_power_manager_remove_peripheral_requirement()

Subscribe to events

It is possible to get notified when the system transitions from a power state to another power state. This can allow to do some operations depending on which level the system goes, such as saving/restoring context. sl_si91x_power_manager_subscribe_ps_transition_event()

sl_si91x_power_manager_unsubscribe_ps_transition_event()

Memory Footprint Analysis

  • Memory footprint analysis helps in understanding the memory usage of the application.

  • It includes details about stack, heap, and global/static memory usage.

  • Tools like map files or IDE-specific memory analyzers can be used to analyze the memory footprint.

  • Optimizing memory usage ensures efficient resource utilization and avoids memory overflows.

  • In this example, ensure that the stack size (3072 bytes) and other memory allocations are sufficient for the application's requirements.

Tickless idle Mode

  • Application Task: This represents tasks running in your application. These tasks might call vTaskDelay or other blocking functions, leading the scheduler to consider them idle.

  • Scheduler (Idle): When no tasks are ready to run, the scheduler enters an idle state.

  • Check for Idle: The scheduler checks if FreeRTOS tickless mode is enabled (configUSE_TICKLESS_IDLE=1) and if all tasks are blocked.

  • Suspend Ticks & Enter Sleep: If conditions are met, the scheduler calls vPortSuppressTicksAndSleep to:

    • Disable the system tick interrupt.

    • start a timer to track the sleep duration.

    • Enter a low-power mode using MCU power management features (e.g., Wait For Interrupt instruction).

  • Wakeup Interrupt: An interrupt (event or timer) wakes up the MCU.

  • Scheduler Update: The scheduler calculates the sleep duration and adjusts the system tick counter accordingly.

  • Resume Scheduler & Tasks: The scheduler resumes the tick interrupt and exits the low-power mode. Tasks become ready to run again.

  • Application Code: Application tasks continue execution based on the updated system time.

Tickless idle modeTickless idle mode

Sleep

When the software has no more operations and only needs to wait for an event, the software must call sl_si91x_power_manager_sleep().

Query callback functions

Is OK to sleep

Between the time sl_si91x_power_manager_sleep() is called and the MCU goes to sleep, an ISR may occur and require the system to resume at that time instead of sleeping. In this case, a callback is called in a critical section to validate that the MCU can go to sleep.

The function sl_si91x_power_manager_is_ok_to_sleep() will be generated automatically by Simplicity Studio's wizard. The function will look at multiple software modules from the SDK to make a decision. The application can contribute to the decision by defining the function app_is_ok_to_sleep(). If any of the software modules (including the application via app_is_ok_to_sleep()) return false, the process of entering in sleep will be aborted.

Sleep on ISR exit

When the system enters sleep, the only way to wake it up is via an interrupt or exception. By default, Power Manager will assume that when an interrupt occurs and the corresponding ISR has been executed, the system must not go back to sleep. However, in the case where all the processing related to this interrupt is performed in the ISR, it is possible to go back to sleep by using this hook.

The function sl_si91x_power_manager_sleep_on_isr_exit() will be generated automatically by Simplicity Studio's wizard. The function will look at multiple software modules from the SDK to make a decision. The application can contribute to the decision by defining the function app_sleep_on_isr_exit(). The generated function will make a decision based on the value returned by the different software modules (including the application via app_sleep_on_isr_exit()):

  • SL_SI91X_POWER_MANAGER_ISR_IGNORE: if the software module did not cause the system wakeup and/or doesn't want to contribute to the decision.

  • SL_SI91X_POWER_MANAGER_ISR_SLEEP: if the software module did cause the system wakeup, but the system should go back to sleep.

  • SL_SI91X_POWER_MANAGER_ISR_WAKEUP: if the software module did cause the system wakeup, and the system should not go back to sleep.

If any software module returned SL_SI91X_POWER_MANAGER_ISR_SLEEP and none returned SL_SI91X_POWER_MANAGER_ISR_WAKEUP, the system will go back to sleep. Any other combination will cause the system not to go back to sleep.

Peripheral init/deinit sequence for sleep/wakeupPeripheral init/deinit sequence for sleep/wakeup

Debugging feature

By installing the Power Manager debug component and setting the configuration define SL_SI91X_POWER_MANAGER_DEBUG to 1, it is possible to record the requirements currently set and their owner. It is possible to print a table at any time that lists all the added requirements and their owner. This table can be printed by calling the function: Make sure to add the following define

#define CURRENT_MODULE_NAME // Module printable name here

to any application code source file that adds and removes requirements.


Configuration#

Power Manager allows configuration of RAM retention, peripheral states, wakeup sources, and clock scaling.


Usage#

Usage Example

#define EM_EVENT_MASK_ALL  (SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS4
                            | SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS4
                            | SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS3
                            | SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS3
                            | SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS2
                            | SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS2
                            | SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_SLEEP)

static void power_manager_app(void)
{
sl_status_t status;
sl_power_manager_ps_transition_event_handle_t handle;
sl_power_manager_ps_transition_event_info_t info = { .event_mask = PS_EVENT_MASK, .on_event = transition_callback };


// Subscribe the state transition callback events, the ored value of flag and function pointer is passed in this API.
status = sl_si91x_power_manager_subscribe_ps_transition_event(&handle, &info);
if (status != SL_STATUS_OK) {
  // If status is not OK, return with the error code.
  return;
 }
// Configuring the RAM retention used for sleep-wakeup.
sl_power_ram_retention_config_t config;
 config.configure_ram_banks = true;
 config.m4ss_ram_banks      = SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_8 | SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_9 | SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_10;
 config.ulpss_ram_banks     = SL_SI91X_POWER_MANAGER_ULPSS_RAM_BANK_2 | SL_SI91X_POWER_MANAGER_ULPSS_RAM_BANK_3;
 // RAM retention modes are configured and passed into this API.
 status = sl_si91x_power_manager_configure_ram_retention(&config);
 if (status != SL_STATUS_OK) {
 // If status is not OK, return with the error code.
  return;
 }

// Change state to PS2
sl_si91x_power_manager_add_ps_requirement(SL_SI91X_POWER_MANAGER_PS2);

// CODE BLOCK //

// Change state to PS4
// Removed PS2 requirement as it is no longer required.
sl_si91x_power_manager_remove_ps_requirement(SL_SI91X_POWER_MANAGER_PS2);
sl_si91x_power_manager_add_ps_requirement(SL_SI91X_POWER_MANAGER_PS2);

// SLEEP_WAKEUP

// Initialize wakeup source
// Replace the wakeup source peripheral macro defined in sl_si91x_power_manager.h file
// It sets the below peripheral as wakeup source
sl_si91x_power_manager_set_wakeup_source(WAKEUP_SOURCE, true);
sl_si91x_power_manager_sleep();
}

Modules#

sl_power_ram_retention_config_t

sl_power_peripheral_t

sl_power_manager_ps_transition_event_info_t

sl_power_manager_ps_transition_event_handle_t

Enumerations#

enum
SL_SI91X_POWER_MANAGER_PS0 = 0
SL_SI91X_POWER_MANAGER_PS1
SL_SI91X_POWER_MANAGER_PS2
SL_SI91X_POWER_MANAGER_PS3
SL_SI91X_POWER_MANAGER_PS4
SL_SI91X_POWER_MANAGER_SLEEP
SL_SI91X_POWER_MANAGER_STANDBY
LAST_ENUM_POWER_STATE
}

Enumeration for the power states.

enum
SL_SI91X_POWER_MANAGER_POWERSAVE
SL_SI91X_POWER_MANAGER_PERFORMANCE
LAST_ENUM_CLOCK_SCALING
}

Enumeration for clock scaling parameters.

enum
SL_SI91X_POWER_MANAGER_ISR_IGNORE = (1UL << 0UL)
SL_SI91X_POWER_MANAGER_ISR_SLEEP = (1UL << 1UL)
SL_SI91X_POWER_MANAGER_ISR_WAKEUP = (1UL << 2UL)
}

On ISR Exit Hook answer.

Typedefs#

typedef uint32_t

Mask of all the event(s) to listen to.

typedef void(*
sl_power_manager_ps_transition_on_event_t)(sl_power_state_t from, sl_power_state_t to)

Typedef for the user-supplied callback function which is called when a power state transition occurs.

Functions#

sl_status_t

To initialize the Power Manager service.

__STATIC_INLINE void

To disable the interrupts.

__STATIC_INLINE void

To enable the interrupts.

__STATIC_INLINE sl_status_t

To add a requirement on power states.

__STATIC_INLINE sl_status_t

To remove requirement on power states.

sl_status_t

To configure the clock scaling.

the clock scaling mode in PS4 and PS3 power state.

sl_status_t
sl_si91x_power_manager_add_peripheral_requirement(sl_power_peripheral_t *peripheral)

Adds the peripheral requirement.

sl_status_t
sl_si91x_power_manager_remove_peripheral_requirement(sl_power_peripheral_t *peripheral)

To remove the peripheral requirement.

sl_status_t
sl_si91x_power_manager_subscribe_ps_transition_event(sl_power_manager_ps_transition_event_handle_t *event_handle, const sl_power_manager_ps_transition_event_info_t *event_info)

To register a callback to be called on given power state transition(s).

sl_status_t
sl_si91x_power_manager_unsubscribe_ps_transition_event(sl_power_manager_ps_transition_event_handle_t *event_handle, const sl_power_manager_ps_transition_event_info_t *event_info)

To unregister an event callback handle on power state transition.

sl_status_t

To move into sleep mode and wait for the peripheral to be set as a wakeup source to trigger and wake up the M4 SoC.

void

To move into standby state and wait for the interrupt.

sl_status_t
sl_si91x_power_manager_set_wakeup_sources(uint32_t source, boolean_t add)

To configure the wakeup sources.

sl_status_t
sl_si91x_power_manager_configure_ram_retention(sl_power_ram_retention_config_t *config)

To retain the RAM in low power state either by using size or RAM bank as input parameters.

To return the current power state.

uint8_t *

To get the current requirements on all the power states.

sl_status_t

Requests the PS1 state requirement during tickless idle mode.

sl_status_t

Remove the PS1 state request during tickless idle mode.

bool

Get the current ps1 state request status from the power manager during tickless idle mode.

sl_status_t

Requests the standby state during tickless idle mode.

sl_status_t

Remove the standby state request during tickless idle mode.

bool

Get the current standby state request status during tickless idle mode.

void

To de-initialize the Power Manager service.

void

To print a table that describes the current requirements on each power state and their owner.

Macros#

#define
SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS4 (1 << 0)

sl power manager event transition for entering PS4 state.

#define
SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS4 (1 << 1)

sl power manager event transition for leaving PS4 state.

#define
SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS3 (1 << 2)

sl power manager event transition for entering PS3 state.

#define
SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS3 (1 << 3)

sl power manager event transition for leaving PS3 state.

#define
SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS2 (1 << 4)

sl power manager event transition for entering PS2 state.

#define
SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS2 (1 << 5)

sl power manager event transition for leaving PS2 state.

#define
SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS1 (1 << 6)

sl power manager event transition for leaving PS1 state.

#define
SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_SLEEP (1 << 7)

sl power manager event transition for leaving sleep state.

#define
SL_SI91X_POWER_MANAGER_EVENT_TRANSITION_LEAVING_STANDBY (1 << 8)

Event transition for leaving standby state.

#define
SL_SI91X_POWER_MANAGER_DST_WAKEUP DST_BASED_WAKEUP

Deep Sleep Timer based wakeup source.

#define
SL_SI91X_POWER_MANAGER_WIRELESS_WAKEUP WIRELESS_BASED_WAKEUP

Wireless based wakeup source.

#define
SL_SI91X_POWER_MANAGER_GPIO_WAKEUP GPIO_BASED_WAKEUP

GPIO based wakeup source.

#define
SL_SI91X_POWER_MANAGER_COMPARATOR_WAKEUP COMPR_BASED_WAKEUP

Comparator based wakeup source.

#define
SL_SI91X_POWER_MANAGER_SYSRTC_WAKEUP SYSRTC_BASED_WAKEUP

Sysrtc based wakeup source.

#define
SL_SI91X_POWER_MANAGER_ULPSS_WAKEUP ULPSS_BASED_WAKEUP

ULP peripheral based wakeup source.

#define
SL_SI91X_POWER_MANAGER_SDCSS_WAKEUP SDCSS_BASED_WAKEUP

SDC (Sensor data collector) based wakeup source.

#define
SL_SI91X_POWER_MANAGER_ALARM_WAKEUP ALARM_BASED_WAKEUP

Alarm based wakeup source.

#define
SL_SI91X_POWER_MANAGER_SEC_WAKEUP SEC_BASED_WAKEUP

Second based wakeup source.

#define
SL_SI91X_POWER_MANAGER_MSEC_WAKEUP MSEC_BASED_WAKEUP

Milli second based wakeup source.

#define
SL_SI91X_POWER_MANAGER_WDT_WAKEUP WDT_INTR_BASED_WAKEUP

Watchdog interrupt based wakeup source.

#define
SL_SI91X_POWER_MANAGER_M4SS_PG_EFUSE M4SS_PWRGATE_ULP_EFUSE_PERI

M4SS EFUSE Power Gate.

#define
SL_SI91X_POWER_MANAGER_M4SS_PG_RPDMA M4SS_PWRGATE_ULP_RPDMA

M4SS RPDMA Power Gate.

#define
SL_SI91X_POWER_MANAGER_M4SS_PG_SDIO_SPI M4SS_PWRGATE_ULP_SDIO_SPI

M4SS SDIO SPI Power Gate.

#define
SL_SI91X_POWER_MANAGER_M4SS_PG_QSPI M4SS_PWRGATE_ULP_QSPI_ICACHE

M4SS QSPI and ICACHE Power Gate.

#define
SL_SI91X_POWER_MANAGER_M4SS_PG_IID M4SS_PWRGATE_ULP_IID

M4SS IID Power Gate.

#define
SL_SI91X_POWER_MANAGER_M4SS_PG_M4_DEBUG M4SS_PWRGATE_ULP_M4_DEBUG_FPU

M4SS M4 Debug Power Gate.

#define
SL_SI91X_POWER_MANAGER_M4SS_PG_M4_CORE M4SS_PWRGATE_ULP_M4_CORE

M4SS M4 Core Power Gate.

#define
SL_SI91X_POWER_MANAGER_M4SS_PG_EXTERNAL_ROM M4SS_PWRGATE_ULP_EXT_ROM

M4SS External ROM Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_MISC ULPSS_PWRGATE_ULP_MISC

ULP Miscellaneous Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_CAP ULPSS_PWRGATE_ULP_CAP

DEPRECATED - ULP Capacitive Touch Sensor Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_UART ULPSS_PWRGATE_ULP_UART

ULP UART Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_SSI ULPSS_PWRGATE_ULP_SSI

ULP SSI Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_I2S ULPSS_PWRGATE_ULP_I2S

ULP I2S Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_I2C ULPSS_PWRGATE_ULP_I2C

ULP I2C Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_AUX ULPSS_PWRGATE_ULP_AUX

ULP AUX Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_IR ULPSS_PWRGATE_ULP_IR

ULP IR Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_UDMA ULPSS_PWRGATE_ULP_UDMA

ULP UDMA Power Gate.

#define
SL_SI91X_POWER_MANAGER_ULPSS_PG_FIM ULPSS_PWRGATE_ULP_FIM

ULP FIM Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_MCUBFFS SLPSS_PWRGATE_ULP_MCUBFFS

NPSS MCU BFFS (Battery FF's) Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_MCUFSM SLPSS_PWRGATE_ULP_MCUFSM

NPSS MCU FSM Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_MCURTC SLPSS_PWRGATE_ULP_MCURTC

NPSS MCU RTC (Real Time Clock) Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_MCUWDT SLPSS_PWRGATE_ULP_MCUWDT

NPSS MCU WDT (Watchdog Timer) Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_MCUPS SLPSS_PWRGATE_ULP_MCUPS

NPSS MCU Process Sensor Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_MCUTS SLPSS_PWRGATE_ULP_MCUTS

NPSS MCU Temperature Sensor Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_MCUSTORE1 SLPSS_PWRGATE_ULP_MCUSTORE1

NPSS MCU Storage 1 Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_MCUSTORE2 SLPSS_PWRGATE_ULP_MCUSTORE2

NPSS MCU Storage 2 Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_MCUSTORE3 SLPSS_PWRGATE_ULP_MCUSTORE3

NPSS MCU Storage 3 Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_TIMEPERIOD SLPSS_PWRGATE_ULP_TIMEPERIOD

NPSS Time Period Power Gate.

#define
SL_SI91X_POWER_MANAGER_NPSS_PG_NWPAPB_MCU_CTRL SLPSS_PWRGATE_ULP_NWPAPB_MCU_CTRL

NPSS MCU APB Control Power Gate.

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_1 RAM_BANK_0

4 KB (Bank 1 of first 192k chunk)

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_2 RAM_BANK_1

4 KB (Bank 2 of first 192k chunk)

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_3 RAM_BANK_2

4 KB (Bank 3 of first 192k chunk)

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_4 RAM_BANK_3

4 KB (Bank 4 of first 192k chunk)

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_5 RAM_BANK_4

4 KB (Bank 5 of first 192k chunk)

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_6 RAM_BANK_5

32 KB (Bank 6-7 of first 192k chunk)

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_7 RAM_BANK_6

64 KB (Bank 9-11 of first 192k chunk)

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_8 RAM_BANK_7

64 KB (Bank 12-15 of first 192k chunk)

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_9 RAM_BANK_8

64 KB (Bank 1-4 of second 192k chunk)

#define
SL_SI91X_POWER_MANAGER_M4SS_RAM_BANK_10 RAM_BANK_9

64 KB (Bank 1-4 of third 192k chunk)

#define
SL_SI91X_POWER_MANAGER_ULPSS_RAM_BANK_1 ULPSS_2K_BANK_0

2 KB

#define
SL_SI91X_POWER_MANAGER_ULPSS_RAM_BANK_2 ULPSS_2K_BANK_1

2 KB

#define
SL_SI91X_POWER_MANAGER_ULPSS_RAM_BANK_3 ULPSS_2K_BANK_2

2 KB

#define
SL_SI91X_POWER_MANAGER_ULPSS_RAM_BANK_4 ULPSS_2K_BANK_3

2 KB

Enumeration Documentation#

sl_power_state_t#

sl_power_state_t

Enumeration for the power states.

Enumerator
SL_SI91X_POWER_MANAGER_PS0

PS0 Power State.

SL_SI91X_POWER_MANAGER_PS1

PS1 Power State.

SL_SI91X_POWER_MANAGER_PS2

PS2 Power State.

SL_SI91X_POWER_MANAGER_PS3

PS3 Power State.

SL_SI91X_POWER_MANAGER_PS4

PS4 Power State.

SL_SI91X_POWER_MANAGER_SLEEP

Sleep.

SL_SI91X_POWER_MANAGER_STANDBY

Standby.

LAST_ENUM_POWER_STATE

Last enum for validation.


sl_clock_scaling_t#

sl_clock_scaling_t

Enumeration for clock scaling parameters.

Enumerator
SL_SI91X_POWER_MANAGER_POWERSAVE

Minimum supported frequency in a power state.

SL_SI91X_POWER_MANAGER_PERFORMANCE

Maximum supported frequency in a power state.

LAST_ENUM_CLOCK_SCALING

Last enum for validation.


sl_si91x_power_manager_on_isr_exit_t#

sl_si91x_power_manager_on_isr_exit_t

On ISR Exit Hook answer.

Enumerator
SL_SI91X_POWER_MANAGER_ISR_IGNORE

The module did not trigger an ISR and it does not want to contribute to the decision.

SL_SI91X_POWER_MANAGER_ISR_SLEEP

The module was the one that caused the system wakeup and the system SHOULD go back to sleep.

SL_SI91X_POWER_MANAGER_ISR_WAKEUP

The module was the one that caused the system wakeup and the system MUST NOT go back to sleep.


Typedef Documentation#

sl_power_manager_ps_transition_event_t#

typedef uint32_t sl_power_manager_ps_transition_event_t

Mask of all the event(s) to listen to.


sl_power_manager_ps_transition_on_event_t#

typedef void(* sl_power_manager_ps_transition_on_event_t) (sl_power_state_t from, sl_power_state_t to) )(sl_power_state_t from, sl_power_state_t to)

Typedef for the user-supplied callback function which is called when a power state transition occurs.

Parameters
TypeDirectionArgument NameDescription
N/Afrom

Power state we are leaving.

N/Ato

Power state we are entering.

This typedef defines a callback function that is called when a power state transition occurs.


Function Documentation#

sl_si91x_power_manager_init#

sl_status_t sl_si91x_power_manager_init (void )

To initialize the Power Manager service.

Parameters
TypeDirectionArgument NameDescription
voidN/A

The application is configured to start in the PS3 Powersave state with a clock frequency of 40MHz.

Note

  • The Power Manager initialization is automatically handled within the sl_service_init() function. Users do not need to manually initialize the Power Manager, ensuring a hassle-free setup process.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_ALREADY_INITIALIZED - Power Manager is already initialized.

For more information on status codes, see [SL STATUS DOCUMENTATION](


sl_si91x_power_manager_core_entercritical#

__STATIC_INLINE void sl_si91x_power_manager_core_entercritical (void )

To disable the interrupts.

Parameters
TypeDirectionArgument NameDescription
voidN/A

Disables all interrupts by setting PRIMASK. Fault exception handlers will still be enabled.


sl_si91x_power_manager_core_exitcritical#

__STATIC_INLINE void sl_si91x_power_manager_core_exitcritical (void )

To enable the interrupts.

Parameters
TypeDirectionArgument NameDescription
voidN/A

Enables interrupts by clearing PRIMASK.


sl_si91x_power_manager_add_ps_requirement#

__STATIC_INLINE sl_status_t sl_si91x_power_manager_add_ps_requirement (sl_power_state_t state)

To add a requirement on power states.

Parameters
TypeDirectionArgument NameDescription
sl_power_state_t[in]state

Power state to add requirement: sl_power_state_t

  • SL_POWER_MANAGER_PS4

  • SL_POWER_MANAGER_PS3

  • SL_POWER_MANAGER_PS2

  • SL_POWER_MANAGER_PS1

The default state for the Power Manager is PS3. The maximum number of requirements that can be added is 255. The Power Manager switches to the state if it is a valid transition. Before transitioning from one state to another, make sure to remove requirements of previous states if any were added. If an invalid state requirement is added, it returns SL_STATUS_INVALID_PARAMETER. If the Power Manager service is not initialized, it returns SL_STATUS_NOT_INITIALIZED. To initialize, call sl_si91x_power_manager_init. To get the requirements on all power states, call sl_si91x_power_manager_get_requirement_table. To know the current power state, use sl_si91x_power_manager_get_current_state.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_NOT_INITIALIZED - Power Manager is not initialized.

    • SL_STATUS_INVALID_PARAMETER - Invalid parameter is passed.

For more information on status codes, see [SL STATUS DOCUMENTATION](


sl_si91x_power_manager_remove_ps_requirement#

__STATIC_INLINE sl_status_t sl_si91x_power_manager_remove_ps_requirement (sl_power_state_t state)

To remove requirement on power states.

Parameters
TypeDirectionArgument NameDescription
sl_power_state_t[in]state

Power state to remove requirement: sl_power_state_t

  • SL_POWER_MANAGER_PS4

  • SL_POWER_MANAGER_PS3

  • SL_POWER_MANAGER_PS2

  • SL_POWER_MANAGER_PS1

Default state for Power Manager is PS3. Requirements added to a power state must be removed in pairs to ensure proper state transitions. If a requirement is added for a specific power state (e.g., PS4) and not removed, the application will be unable to transition to a lower power state. For instance, if a requirement on PS4 is added but not removed, the Power Manager will remain in PS4 and cannot transition to a lower power state.

Note

  • : If the current state is PS4 and no other requirements are added, removing the PS4 requirement will cause the device to remain in its last active state, which in this case is PS4.

Returns

  • sl_status_t Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_NOT_INITIALIZED - The Power Manager is not initialized.

    • SL_STATUS_INVALID_PARAMETER - Invalid parameter is passed.

For more information on status codes, see [SL STATUS DOCUMENTATION](


sl_si91x_power_manager_set_clock_scaling#

sl_status_t sl_si91x_power_manager_set_clock_scaling (sl_clock_scaling_t mode)

To configure the clock scaling.

Parameters
TypeDirectionArgument NameDescription
sl_clock_scaling_t[in]mode

Clock scaling mode (of type sl_clock_scaling_t).

PS4 and PS3 states are supported only. Possible values for clock scaling are:

  • POWERSAVE and PERFORMANCE

  • PS4 Performance: 180 MHz clock

  • PS4 Power-save: 100 MHz clock

  • PS3 Performance: 80 MHz clock

  • PS3 Power-save: 40 MHz clock

  • For PS2 state, 20 MHz clock is default.

If the Power Manager service is not initialized, it returns SL_STATUS_NOT_INITIALIZED. To initialize, call sl_si91x_power_manager_init.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_NOT_INITIALIZED - Power Manager is not initialized.

    • SL_STATUS_INVALID_PARAMETER - Invalid parameter is passed.

    • SL_STATUS_INVALID_CONFIGURATION - Invalid configuration of mode.

For more information on status codes, see [SL STATUS DOCUMENTATION](


sl_si91x_power_manager_get_clock_scaling#

sl_clock_scaling_t sl_si91x_power_manager_get_clock_scaling (void )

the clock scaling mode in PS4 and PS3 power state.

Parameters
TypeDirectionArgument NameDescription
voidN/A

Possible return values: * SL_SI91X_POWER_MANAGER_POWERSAVE (Minimum supported frequency in a power state) SL_SI91X_POWER_MANAGER_PERFORMANCE (Maximum supported frequency in a power state)

Returns

  • The following values are returned:

    • sl_clock_scaling_t enum value indicating current clock scaling mode


sl_si91x_power_manager_add_peripheral_requirement#

sl_status_t sl_si91x_power_manager_add_peripheral_requirement (sl_power_peripheral_t * peripheral)

Adds the peripheral requirement.

Parameters
TypeDirectionArgument NameDescription
sl_power_peripheral_t *[in]peripheral

Structure for different peripherals sl_power_peripheral_t.

Power on the peripherals the valid peripherals passed in the structure. Structure member possible values: sl_power_peripheral_t

  • m4ss_peripheral -> Accepts masked value of m4ss peripherals.

  • ulpss_peripheral -> Accepts masked value of ulpss peripherals.

  • npss_peripheral -> Accepts masked value of npss peripherals. The values of enums can be combined by using 'OR' operator and then passed to the variable.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_INVALID_STATE (0x0002) - Not a valid transition.

    • SL_STATUS_NOT_INITIALIZED - Power Manager is not initialized.

    • SL_STATUS_INVALID_PARAMETER - Invalid parameter is passed.

Note

  • The user must take care of the initialization of the peripherals added.

For more information on status codes, see [SL STATUS DOCUMENTATION](


sl_si91x_power_manager_remove_peripheral_requirement#

sl_status_t sl_si91x_power_manager_remove_peripheral_requirement (sl_power_peripheral_t * peripheral)

To remove the peripheral requirement.

Parameters
TypeDirectionArgument NameDescription
sl_power_peripheral_t *[in]peripheral

Structure for different peripherals sl_power_peripheral_t.

Powers off the peripherals specified in the structure. Valid peripherals are passed in the structure sl_power_peripheral_t. The structure members can have the following values:

  • m4ss_peripheral -> Accepts masked value of M4SS peripherals.

  • ulpss_peripheral -> Accepts masked value of ULPSS peripherals.

  • npss_peripheral -> Accepts masked value of NPSS peripherals.

The values of enums can be combined using the 'OR' operator and then passed to the variable.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_NOT_INITIALIZED - Power Manager is not initialized.

    • SL_STATUS_INVALID_PARAMETER - Invalid parameter is passed.

For more information on status codes, see [SL STATUS DOCUMENTATION](


sl_si91x_power_manager_subscribe_ps_transition_event#

sl_status_t sl_si91x_power_manager_subscribe_ps_transition_event (sl_power_manager_ps_transition_event_handle_t * event_handle, const sl_power_manager_ps_transition_event_info_t * event_info)

To register a callback to be called on given power state transition(s).

Parameters
TypeDirectionArgument NameDescription
sl_power_manager_ps_transition_event_handle_t *[in]event_handle

Event handle (no initialization needed).

const sl_power_manager_ps_transition_event_info_t *[in]event_info

Event info structure that contains the event mask and the callback that must be called.

If the Power Manager service is not initialized, it returns SL_STATUS_NOT_INITIALIZED. To initialize, call sl_si91x_power_manager_init.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_NOT_INITIALIZED - Power Manager is not initialized.

    • SL_STATUS_NULL_POINTER - Null pointer is passed.

For more information on status codes, see [SL STATUS DOCUMENTATION](

Note

  • Adding and removing power state transition requirement(s) from a callback on a transition event is not supported.

  • The parameters passed must be persistent, meaning that they need to survive until the callback fires.

  • An ASSERT is thrown if the handle is not found.

Usage example:

#define PS_EVENT_MASK          (  SL_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS4 \
                                | SL_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS4  \
                                | SL_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS3 \
                                | SL_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS3  \
                                | SL_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS2 \
                                | SL_POWER_MANAGER_EVENT_TRANSITION_LEAVING_PS2  \
                                | SL_POWER_MANAGER_EVENT_TRANSITION_ENTERING_PS0 \
                                | SL_POWER_MANAGER_EVENT_TRANSITION_LEAVING_SLEEP)

sl_power_manager_ps_transition_event_handle_t handle;
sl_power_manager_ps_transition_event_info_t info = { .event_mask = PS_EVENT_MASK,
                                                     .on_event   = transition_callback };

void transition_callback(sl_power_state_t from, sl_power_state_t to)
{
  [...]
}

void main(void)
{
  sl_status_t status;

  status = sl_si91x_power_manager_init();
  // Validate the status

  status = sl_si91x_power_manager_subscribe_ps_transition_event(&handle, &info);
  // Validate the status
}

sl_si91x_power_manager_unsubscribe_ps_transition_event#

sl_status_t sl_si91x_power_manager_unsubscribe_ps_transition_event (sl_power_manager_ps_transition_event_handle_t * event_handle, const sl_power_manager_ps_transition_event_info_t * event_info)

To unregister an event callback handle on power state transition.

Parameters
TypeDirectionArgument NameDescription
sl_power_manager_ps_transition_event_handle_t *[in]event_handle

Event handle which must be unregistered (must have been registered previously).

const sl_power_manager_ps_transition_event_info_t *[in]event_info

Event info structure that contains the event mask and the callback that must be called.

If the Power Manager service is not initialized, it returns SL_STATUS_NOT_INITIALIZED. To initialize, call sl_si91x_power_manager_init.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_NOT_INITIALIZED - Power Manager is not initialized.

    • SL_STATUS_NULL_POINTER - Null pointer is passed. For more information on status codes, see SL STATUS DOCUMENTATION.

For more information on status codes, refer to SL STATUS DOCUMENTATION. Note

  • An ASSERT is thrown if the handle is not found.


sl_si91x_power_manager_sleep#

sl_status_t sl_si91x_power_manager_sleep (void )

To move into sleep mode and wait for the peripheral to be set as a wakeup source to trigger and wake up the M4 SoC.

Parameters
TypeDirectionArgument NameDescription
voidN/A

It supports PS4, PS3, and PS2 only; it cannot enter sleep mode from any other active states. If any error occurs, it returns the error code and does not transition to sleep mode.

Note

  • This function expects and calls a callback with the following signature: boolean_t sl_si91x_power_manager_is_ok_to_sleep(void). This function can be used to cancel a sleep action and handle the possible race condition where an ISR that would cause a wakeup is triggered right after the decision to call sl_si91x_power_manager_sleep() has been made.

This function also expects and calls a callback with the following signature: boolean_t sl_si91x_power_manager_isr_wakeup(void) after wakeup from sleep. The possible return values are:

  • SL_SI91X_POWER_MANAGER_ISR_IGNORE

  • SL_SI91X_POWER_MANAGER_ISR_SLEEP

  • SL_SI91X_POWER_MANAGER_ISR_WAKEUP

Note

  • It can end up in an infinite sleep-wakeup loop if continuously SL_SI91X_POWER_MANAGER_ISR_SLEEP return value is passed.

  • Pre-conditions:

    • sl_si91x_power_manager_init

    • sl_si91x_power_manager_configure_ram_retention

    • sl_si91x_power_manager_set_wakeup_sources

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_NOT_INITIALIZED - Power Manager is not initialized.

    • SL_STATUS_INVALID_PARAMETER - Invalid parameter is passed.

    • SL_STATUS_INVALID_STATE (0x0002) - Not a valid transition.

For more information on status codes, see [SL STATUS DOCUMENTATION](


sl_si91x_power_manager_standby#

void sl_si91x_power_manager_standby (void )

To move into standby state and wait for the interrupt.

Parameters
TypeDirectionArgument NameDescription
voidN/A

Note

  • Applications using RTOS with tickless mode enabled must not call this API. This API is not supposed to be used directly in the application and is called automatically when the system is in an idle state with tickless mode.

Standby transition is possible from PS4, PS3, and PS2 states only. Transition from sleep, PS1, or PS0 is not supported.


sl_si91x_power_manager_set_wakeup_sources#

sl_status_t sl_si91x_power_manager_set_wakeup_sources (uint32_t source, boolean_t add)

To configure the wakeup sources.

Parameters
TypeDirectionArgument NameDescription
uint32_t[in]source

(uint32_t) Wakeup sources.

boolean_t[in]add

(boolean_t) True enables and false disables the wakeup source.

Once the wakeup source is set by the Universal Configurator (UC), the Power Manager automatically handles the initialization, User need to install the appropriate wakeup component based on the configured wakeup source.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_NOT_INITIALIZED - Power Manager is not initialized.

    • SL_STATUS_INVALID_PARAMETER - Invalid parameter is passed.

For more information on status codes, see [SL STATUS DOCUMENTATION](


sl_si91x_power_manager_configure_ram_retention#

sl_status_t sl_si91x_power_manager_configure_ram_retention (sl_power_ram_retention_config_t * config)

To retain the RAM in low power state either by using size or RAM bank as input parameters.

Parameters
TypeDirectionArgument NameDescription
sl_power_ram_retention_config_t *[in]config

Structure for the parameters of RAM retention sl_power_ram_retention_config_t.

Structure member possible values: sl_power_ram_retention_config_t

  • configure_ram_banks -> Boolean to switch between RAM Bank retentions. Either by size or by RAM bank number.

    • Enable -> Use RAM Bank Number.

    • Disable -> Use Size.

  • m4ss_ram_size_kb -> Retains M4SS RAM banks according to the size.

    • Less than 320 KB (Enter 100 for 100 KB).

  • ulpss_ram_size_kb -> Retains ULPSS RAM banks according to the size.

    • Less than 8 KB (Enter 5 for 5 KB).

  • ram_bank_number -> Retains the M4SS and ULPSS RAM Bank using bank number.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK - Success.

    • SL_STATUS_NOT_INITIALIZED - Power Manager is not initialized.

    • SL_STATUS_NULL_POINTER - Null pointer is passed.

For more information on status codes, see [SL STATUS DOCUMENTATION](


sl_si91x_power_manager_get_current_state#

sl_power_state_t sl_si91x_power_manager_get_current_state (void )

To return the current power state.

Parameters
TypeDirectionArgument NameDescription
voidN/A

Possible return values:

  • 2: SL_POWER_MANAGER_PS2, ///< PS2 Power State

  • 3: SL_POWER_MANAGER_PS3, ///< PS3 Power State

  • 4: SL_POWER_MANAGER_PS4, ///< PS4 Power State

Returns

  • sl_power_state_t enum value indicating the current power state.


sl_si91x_power_manager_get_requirement_table#

uint8_t * sl_si91x_power_manager_get_requirement_table (void )

To get the current requirements on all the power states.

Parameters
TypeDirectionArgument NameDescription
voidN/A

It returns 5 values starting from PS0 to PS4.

Returns

  • Pointer to a uint8_t type array which contains 5 elements.

Usage example:

void main()
{
  uint8_t *requirement_table;
  sl_si91x_power_manager_init();
  requirement_table = sl_si91x_power_manager_get_requirement_table();
  DEBUGOUT("PS4: %d, PS3: %d, PS2: %d, PS1: %d, PS0: %d", 
           requirement_table[4], 
           requirement_table[3], 
           requirement_table[2], 
           requirement_table[1], 
           requirement_table[0]); 
}

Retrieve the power state requirement table for the power manager.

This function provides access to the power state requirement table, which is used to manage and track the power state requirements of various components or modules in the system. The table contains information about the power states or dependencies required by different modules.

Note

  • The returned pointer points to a table managed internally by the power manager. Ensure that the table is not modified directly to avoid unexpected behavior.

Returns

  • Pointer to the power state requirement table.


This API can be used to query the current power state requirements of the system and make decisions based on the power states of various components. For example, it can be used in scenarios where power optimization or power state transitions are required.


sl_si91x_power_manager_request_ps1_state#

sl_status_t sl_si91x_power_manager_request_ps1_state (void )

Requests the PS1 state requirement during tickless idle mode.

Parameters
TypeDirectionArgument NameDescription
voidN/A

This function requests the PS1 power state from the power manager during tickless idle mode. If the system is in the IDLE state, it transitions into the PS1 state.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK (0x0000) - PS1 state requirement successfully added.

    • SL_STATUS_INVALID_STATE (0x0002) - Invalid request to add PS1 state.

    • SL_STATUS_NOT_INITIALIZED (0x0011) - Power manager service is not initialized.

    • SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter.


sl_si91x_power_manager_remove_ps1_state_request#

sl_status_t sl_si91x_power_manager_remove_ps1_state_request (void )

Remove the PS1 state request during tickless idle mode.

Parameters
TypeDirectionArgument NameDescription
voidN/A

This function removes the PS1 state request from the power manager during tickless idle mode.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK (0x0000) - Ps1 state requirement successfully removed.

    • SL_STATUS_INVALID_STATE (0x0002) - Invalid request to remove PS1 state.

    • SL_STATUS_NOT_INITIALIZED (0x0011) - Power manager service is not initialized.

    • SL_STATUS_INVALID_PARAMETER (0x0021) - Invalid parameter.


sl_si91x_power_manager_get_ps1_state_status#

bool sl_si91x_power_manager_get_ps1_state_status (void )

Get the current ps1 state request status from the power manager during tickless idle mode.

Parameters
TypeDirectionArgument NameDescription
voidN/A

This function indicates whether a PS1 state request has been added to the power manager during tickless idle mode.

Returns

  • Status code indicating the result:

    • true - PS1 state requirement is added.

    • false - PS1 state requirement is not added.


sl_si91x_power_manager_request_standby_state#

sl_status_t sl_si91x_power_manager_request_standby_state (void )

Requests the standby state during tickless idle mode.

Parameters
TypeDirectionArgument NameDescription
voidN/A

This function requests the standby power state from the power manager during tickless idle mode. If the system is in the IDLE state, it transitions into the standby state.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK (0x0000) - Standby state requirement successfully added.

    • SL_STATUS_INVALID_STATE (0x0002) - Invalid request to add standby state.


sl_si91x_power_manager_remove_standby_state_request#

sl_status_t sl_si91x_power_manager_remove_standby_state_request (void )

Remove the standby state request during tickless idle mode.

Parameters
TypeDirectionArgument NameDescription
voidN/A

This function removes the standby state request from the power manager during tickless idle mode.

Returns

  • Status code indicating the result:

    • SL_STATUS_OK (0x0000) : Standby state requirement successfully removed.

    • SL_STATUS_INVALID_STATE (0x0002) - Invalid request to remove standby state.


sl_si91x_power_manager_get_standby_state_status#

bool sl_si91x_power_manager_get_standby_state_status (void )

Get the current standby state request status during tickless idle mode.

Parameters
TypeDirectionArgument NameDescription
voidN/A

This function indicates whether a standby state request has been added to the power manager during tickless idle mode.

Returns

  • Status code indicating the result:

    • true : Standby state requirement is added.

    • false : Standby state requirement is not added.


sl_si91x_power_manager_deinit#

void sl_si91x_power_manager_deinit (void )

To de-initialize the Power Manager service.

Parameters
TypeDirectionArgument NameDescription
voidN/A

It clears all the power requirements and callback event subscriptions. If the Power Manager service is not initialized, it returns SL_STATUS_NOT_INITIALIZED. To initialize, call sl_si91x_power_manager_init.


sl_si91x_power_manager_debug_print_ps_requirements#

void sl_si91x_power_manager_debug_print_ps_requirements (void )

To print a table that describes the current requirements on each power state and their owner.

Parameters
TypeDirectionArgument NameDescription
voidN/A