SmartSnippets DA1459x SDK
sys_power_mgr.h
Go to the documentation of this file.
1 
45 #ifndef SYS_POWER_MGR_H_
46 #define SYS_POWER_MGR_H_
47 
48 #include <stdint.h>
49 #include <stdbool.h>
50 #include "sdk_defs.h"
51 #ifdef OS_PRESENT
52 #include "osal.h"
53 #endif
54 
55 typedef enum {
56  pm_mode_active = 0,
57  pm_mode_idle,
58  pm_mode_extended_sleep,
59  pm_mode_deep_sleep,
60  pm_mode_hibernation,
61  pm_mode_sleep_max,
62 } sleep_mode_t;
63 
64 typedef enum {
65  pm_sys_wakeup_mode_normal,
66  pm_sys_wakeup_mode_fast,
67 } sys_wakeup_mode_t;
68 #ifdef OS_PRESENT
69 
70 typedef void (*periph_init_cb)(void);
71 typedef int32_t pm_id_t;
72 
73 typedef struct _adptCB {
74  bool (*ad_prepare_for_sleep)(void);
75  void (*ad_sleep_canceled)(void);
76  void (*ad_wake_up_ind)(bool);
77  void (*ad_xtalm_ready_ind)(void);
78  uint8_t ad_sleep_preparation_time;
79 } adapter_call_backs_t;
80 
81 
82 /*
83  * Variables declarations
84  */
85 
86 
90 typedef void (*comp_init_func)(void *);
91 
92 typedef struct comp_init_tree {
93  comp_init_func init_fun;
94  void *init_arg;
95  const struct comp_init_tree * const *depend;
96 } comp_init_tree_t;
97 
108 #define COMPONENT_INIT_WITH_DEPS(_comp, _init, _init_arg, _deps, _sect) \
109  __USED \
110  const comp_init_tree_t _comp = { _init, (void *)_init_arg, _deps }; \
111  __USED \
112  const comp_init_tree_t *const _comp##_ptr __attribute__((section (#_sect "_init_section"))) = &_comp; \
113 
114 
121 #define BUS_INIT(_id, _init, _init_arg) \
122  COMPONENT_INIT_WITH_DEPS(_id, (comp_init_func)_init, _init_arg, NULL, bus)
123 
131 #define DEVICE_INIT(_id, _init, _init_arg) \
132  COMPONENT_INIT_WITH_DEPS(_id, (comp_init_func)_init, _init_arg, NULL, device)
133 
134 #define ADAPTER_INIT_WITH_DEPS(_adapter, _init, _deps) \
135  COMPONENT_INIT_WITH_DEPS(_adapter, (comp_init_func)_init, NULL, _deps, adapter)
136 
147 #define ADAPTER_INIT(_adapter, _init) \
148  ADAPTER_INIT_WITH_DEPS(_adapter, _init, NULL)
149 
161 #define ADAPTER_INIT_DEP1(_adapter, _init, _dep1) \
162  extern const comp_init_tree_t _dep1; \
163  __USED \
164  const comp_init_tree_t *const _adapter##_dep[2] = { &_dep1, NULL }; \
165  ADAPTER_INIT_WITH_DEPS(_adapter, _init, _adapter##_dep)
166 
182 #define ADAPTER_INIT_DEP2(_adapter, _init, _dep1, _dep2) \
183  extern const comp_init_tree_t _dep1; \
184  extern const comp_init_tree_t _dep2; \
185  __USED \
186  const comp_init_tree_t *_adapter##_dep[3] = { &_dep1, &_dep2, NULL }; \
187  ADAPTER_INIT_WITH_DEPS(_adapter, _init, _adapter##_dep)
188 
189 /*
190  * Function declarations
191  */
192 
202 void pm_system_init(periph_init_cb peripherals_initialization);
203 
210 void pm_wait_debugger_detach(sleep_mode_t mode);
211 
212 
227 sleep_mode_t pm_sleep_mode_set(sleep_mode_t mode);
228 
235 sleep_mode_t pm_sleep_mode_get(void);
236 
250 void pm_sleep_mode_request(sleep_mode_t mode);
251 
263 void pm_sleep_mode_release(sleep_mode_t mode);
264 
275 pm_id_t pm_register_adapter(const adapter_call_backs_t *cb);
276 
285 void pm_unregister_adapter(pm_id_t id);
286 
287 
298 void pm_defer_sleep_for(pm_id_t id, uint32_t time_in_LP_cycles);
299 
300 /*
301  * \brief Put the system to idle or sleep or block in a WFI() waiting for the next tick, if neither
302  * idle nor sleep is possible.
303  *
304  * \detail Puts the system to idle or sleep, if possible. If an exit-from-idle or a wake-up is
305  * needed, it programs the Timer1 to generate an interrupt after the specified idle or sleep
306  * period. Else, the system stays forever in idle or sleep mode.
307  * If neither idle nor sleep is possible, it blocks in a WFI() call waiting for the next
308  * (already programmed) OS tick to hit.
309  *
310  * \param[in] low_power_periods The number of (prescaled) low power clock periods the OS will be
311  * idle. If it is 0 then the OS indicates that it can block forever waiting for an
312  * external event. If the system goes to sleep, then it can wake up only from an external
313  * event in this case.
314  *
315  * \warning Must be called with interrupts disabled!
316  *
317  */
318 __RETAINED_CODE void pm_sleep_enter(uint32_t low_power_periods);
319 #else
320 /*
321  * \brief Put the system to sleep
322  *
323  * \param[in] sleep_mode The desired sleep mode of the device.
324  *
325  */
326 __RETAINED_CODE bool pm_sleep_enter_no_os(sleep_mode_t sleep_mode);
327 #endif /* OS_PRESENT */
328 
346 void pm_set_wakeup_mode(bool wait_for_xtalm);
347 
356 bool pm_get_wakeup_mode(void);
357 
358 
359 /*
360  * \brief Block in a WFI() waiting for the next tick.
361  *
362  * \detail Blocks in a WFI() call waiting for the next (already programmed) OS tick to hit.
363  *
364  */
365 __RETAINED_CODE void pm_execute_wfi(void);
366 
373 void pm_set_sys_wakeup_mode(sys_wakeup_mode_t mode);
374 
381 sys_wakeup_mode_t pm_get_sys_wakeup_mode(void);
382 
391 uint8_t pm_get_sys_wakeup_cycles(void);
392 
398 __RETAINED_CODE void pm_prepare_sleep(sleep_mode_t sleep_mode);
399 
405 __RETAINED_CODE void pm_resume_from_sleep(void);
406 
407 
408 #endif /* SYS_POWER_MGR_H_ */
409 
sdk_defs.h
Central include header file with platform definitions.
pm_get_sys_wakeup_mode
sys_wakeup_mode_t pm_get_sys_wakeup_mode(void)
Returns the wake-up mode of the system.
osal.h
OS abstraction layer API.
pm_get_sys_wakeup_cycles
uint8_t pm_get_sys_wakeup_cycles(void)
Returns the number of LP clock cycles needed for wake-up.
mode
HW_GPIO_MODE mode
Definition: hw_gpio.h:211
pm_resume_from_sleep
__RETAINED_CODE void pm_resume_from_sleep(void)
Perform initialization after wake-up.
pm_get_wakeup_mode
bool pm_get_wakeup_mode(void)
Returns the wake-up mode of the system (whether the OS will be resumed with RC or XTAL).
pm_prepare_sleep
__RETAINED_CODE void pm_prepare_sleep(sleep_mode_t sleep_mode)
Prepare system for sleep.
pm_set_sys_wakeup_mode
void pm_set_sys_wakeup_mode(sys_wakeup_mode_t mode)
Sets the wake-up mode of the system.
pm_set_wakeup_mode
void pm_set_wakeup_mode(bool wait_for_xtalm)
Sets the wake-up mode of the system with respect to the system clock.