SmartSnippets DA1459x SDK
hw_wkup_v2.h
Go to the documentation of this file.
1 
42 #ifndef HW_WKUP_V2_H_
43 #define HW_WKUP_V2_H_
44 
45 
46 #if dg_configUSE_HW_WKUP
47 
48 #include <stdbool.h>
49 #include <stdint.h>
50 #include "sdk_defs.h"
51 #include "hw_gpio.h"
52 
53 #define HW_WKUP_POL_P0_BASE_REG (volatile uint32_t *)(&WAKEUP->WKUP_POL_P0_REG)
54 #define HW_WKUP_SELECT_KEY_P0_BASE_REG (volatile uint32_t *)(&WAKEUP->WKUP_SELECT_P0_REG)
55 #define HW_WKUP_SELECT_GPIO_P0_BASE_REG (volatile uint32_t *)(&WAKEUP->WKUP_SEL_GPIO_P0_REG)
56 #define HW_WKUP_SELECT1_GPIO_P0_BASE_REG (volatile uint32_t *)(&WAKEUP->WKUP_SEL1_GPIO_P0_REG)
57 
65 #define HW_WKUP_REG_FIELD_MASK(reg, field) \
66  (WAKEUP_WKUP_##reg##_REG_##field##_Msk)
67 
75 #define HW_WKUP_REG_FIELD_POS(reg, field) \
76  (WAKEUP_WKUP_##reg##_REG_##field##_Pos)
77 
87 #define HW_WKUP_REG_GETF(reg, field) \
88  ((WAKEUP->WKUP_##reg##_REG & (WAKEUP_WKUP_##reg##_REG_##field##_Msk)) >> (WAKEUP_WKUP_##reg##_REG_##field##_Pos))
89 
98 #define HW_WKUP_REG_SETF(reg, field, new_val) \
99  WAKEUP->WKUP_##reg##_REG = ((WAKEUP->WKUP_##reg##_REG & ~(WAKEUP_WKUP_##reg##_REG_##field##_Msk)) | \
100  ((WAKEUP_WKUP_##reg##_REG_##field##_Msk) & ((new_val) << (WAKEUP_WKUP_##reg##_REG_##field##_Pos))))
101 
106 typedef enum {
115 
121 typedef struct {
122  uint8_t debounce;
123  uint32_t pin_wkup_state[HW_GPIO_PORT_MAX];
124  uint32_t pin_gpio_state[HW_GPIO_PORT_MAX];
125  uint32_t pin_trigger[HW_GPIO_PORT_MAX];
126  uint32_t gpio_sense[HW_GPIO_PORT_MAX];
127 } wkup_config;
128 
133 typedef enum {
139 
144 typedef enum {
150 
159 
160 typedef void (*hw_wkup_interrupt_cb)(void);
161 
173 void hw_wkup_init(const wkup_config *cfg);
174 
184 void hw_wkup_configure(const wkup_config *cfg);
185 
198 void hw_wkup_register_key_interrupt(hw_wkup_interrupt_cb cb, uint32_t prio);
199 
212 void hw_wkup_register_gpio_p0_interrupt(hw_wkup_interrupt_cb cb, uint32_t prio);
213 
226 void hw_wkup_register_gpio_p1_interrupt(hw_wkup_interrupt_cb cb, uint32_t prio);
227 
228 
236 
243 __STATIC_INLINE void hw_wkup_reset_key_interrupt(void)
244 {
245  WAKEUP->WKUP_RESET_IRQ_REG = 1;
246 }
247 
252 void hw_wkup_handler(void);
253 
262 __STATIC_INLINE void hw_wkup_set_key_debounce_time(uint8_t time_ms)
263 {
264  ASSERT_WARNING(time_ms <= 63);
265  HW_WKUP_REG_SETF(CTRL, WKUP_DEB_VALUE, time_ms);
266 }
267 
274 __STATIC_INLINE uint8_t hw_wkup_get_key_debounce_time(void)
275 {
276  return HW_WKUP_REG_GETF(CTRL, WKUP_DEB_VALUE);
277 }
278 
288 
298 {
299  uint32_t polarity = (*(HW_WKUP_POL_P0_BASE_REG + port) & (0x1 << pin)) >> pin;
300  uint32_t key_enabled = (*(HW_WKUP_SELECT_KEY_P0_BASE_REG + port) & (0x1 << pin)) >> pin;
301  uint32_t gpio_enabled = (*(HW_WKUP_SELECT_GPIO_P0_BASE_REG + port) & (0x1 << pin)) >> pin;
302 
303  if (key_enabled) {
305  }
306  else if (gpio_enabled) {
307  if ((*(HW_WKUP_SELECT1_GPIO_P0_BASE_REG + port) & (0x1 << pin)) >> pin) {
308  return polarity ? HW_WKUP_TRIG_EDGE_LO : HW_WKUP_TRIG_EDGE_HI;
309  }
310  return polarity ? HW_WKUP_TRIG_LEVEL_LO : HW_WKUP_TRIG_LEVEL_HI;
311  }
312  else {
313  return HW_WKUP_TRIG_DISABLED;
314  }
315 }
316 
323 __STATIC_INLINE void hw_wkup_emulate_key_hit(void)
324 {
325  HW_WKUP_REG_SETF(CTRL, WKUP_SFT_KEYHIT, 1);
326  HW_WKUP_REG_SETF(CTRL, WKUP_SFT_KEYHIT, 0);
327 }
328 
335 __STATIC_INLINE void hw_wkup_enable_key_irq(void)
336 {
337  HW_WKUP_REG_SETF(CTRL, WKUP_ENABLE_IRQ, 1);
338 }
339 
344 __STATIC_INLINE void hw_wkup_disable_key_irq(void)
345 {
346  HW_WKUP_REG_SETF(CTRL, WKUP_ENABLE_IRQ, 0);
347 }
348 
353 __STATIC_INLINE void hw_wkup_freeze_key_timer(void)
354 {
355  GPREG->SET_FREEZE_REG = GPREG_SET_FREEZE_REG_FRZ_WKUPTIM_Msk;
356 }
357 
362 __STATIC_INLINE void hw_wkup_unfreeze_key_timer(void)
363 {
364  GPREG->RESET_FREEZE_REG = GPREG_RESET_FREEZE_REG_FRZ_WKUPTIM_Msk;
365 }
366 
377 __STATIC_INLINE uint32_t hw_wkup_get_gpio_status(HW_GPIO_PORT port)
378 {
379  switch (port) {
380  case HW_GPIO_PORT_0:
381  return HW_WKUP_REG_GETF(STATUS_P0, WKUP_STAT_P0);
382  case HW_GPIO_PORT_1:
383  return HW_WKUP_REG_GETF(STATUS_P1, WKUP_STAT_P1);
384  default:
385  ASSERT_WARNING(0);// Invalid argument
386  return 0; // Should never reach here
387  }
388 }
389 
400 __STATIC_INLINE void hw_wkup_clear_gpio_status(HW_GPIO_PORT port, uint32_t status)
401 {
402  switch (port) {
403  case HW_GPIO_PORT_0:
404  HW_WKUP_REG_SETF(CLEAR_P0, WKUP_CLEAR_P0, status);
405  break;
406  case HW_GPIO_PORT_1:
407  HW_WKUP_REG_SETF(CLEAR_P1, WKUP_CLEAR_P1, status);
408  break;
409  default:
410  ASSERT_WARNING(0);//Invalid argument
411  }
412 }
413 
414 
415 
416 #endif /* dg_configUSE_HW_WKUP */
417 #endif /* HW_WKUP_V2_H_ */
418 
hw_wkup_emulate_key_hit
__STATIC_INLINE void hw_wkup_emulate_key_hit(void)
Emulate key hit.
Definition: hw_wkup_v2.h:323
hw_wkup_enable_key_irq
__STATIC_INLINE void hw_wkup_enable_key_irq(void)
Enable WKUP Key interrupts.
Definition: hw_wkup_v2.h:335
hw_wkup_configure
void hw_wkup_configure(const wkup_config *cfg)
Configure peripheral.
HW_WKUP_TRIG_LEVEL_LO_DEB
Definition: hw_wkup_v2.h:109
HW_WKUP_TRIG_DISABLED
Definition: hw_wkup_v2.h:107
hw_wkup_set_trigger
void hw_wkup_set_trigger(HW_GPIO_PORT port, HW_GPIO_PIN pin, HW_WKUP_TRIGGER trigger)
Configure a gpio or key trigger event.
HW_WKUP_HIBERN_PIN
HW_WKUP_HIBERN_PIN
Wake up from hibernation controller pin settings.
Definition: hw_wkup_v2.h:133
HW_WKUP_HIBERN_POLARITY
HW_WKUP_HIBERN_POLARITY
Wake up from hibernation pin polarity settings.
Definition: hw_wkup_v2.h:144
HW_GPIO_PORT_1
Definition: hw_gpio.h:98
sdk_defs.h
Central include header file with platform definitions.
hw_wkup_register_key_interrupt
void hw_wkup_register_key_interrupt(hw_wkup_interrupt_cb cb, uint32_t prio)
Register KEY interrupt handler.
hw_wkup_clear_gpio_status
__STATIC_INLINE void hw_wkup_clear_gpio_status(HW_GPIO_PORT port, uint32_t status)
Clear latch status.
Definition: hw_wkup_v2.h:400
GPREG_SET_FREEZE_REG_FRZ_WKUPTIM_Msk
#define GPREG_SET_FREEZE_REG_FRZ_WKUPTIM_Msk
Definition: DA1459x-00.h:3298
HW_GPIO_PIN
HW_GPIO_PIN
GPIO pin number.
Definition: hw_gpio.h:106
wkup_config::debounce
uint8_t debounce
Definition: hw_wkup_v2.h:122
HW_WKUP_HIBERN_P0_14_ONLY
Definition: hw_wkup_v2.h:135
HW_GPIO_PORT
HW_GPIO_PORT
GPIO port number.
Definition: hw_gpio.h:96
hw_wkup_get_key_debounce_time
__STATIC_INLINE uint8_t hw_wkup_get_key_debounce_time(void)
Get current debounce time.
Definition: hw_wkup_v2.h:274
hw_wkup_get_trigger
__STATIC_INLINE HW_WKUP_TRIGGER hw_wkup_get_trigger(HW_GPIO_PORT port, HW_GPIO_PIN pin)
Get gpio or key trigger configuration.
Definition: hw_wkup_v2.h:297
hw_wkup_handler
void hw_wkup_handler(void)
Interrupt handler.
hw_wkup_register_gpio_p0_interrupt
void hw_wkup_register_gpio_p0_interrupt(hw_wkup_interrupt_cb cb, uint32_t prio)
Register GPIO P0 interrupt handler.
HW_GPIO_PORT_MAX
Definition: hw_gpio.h:99
HW_WKUP_TRIG_EDGE_LO
Definition: hw_wkup_v2.h:113
HW_WKUP_HIBERN_P0_14_ACTIVE_LOW_ONLY
Definition: hw_wkup_v2.h:146
HW_WKUP_REG_SETF
#define HW_WKUP_REG_SETF(reg, field, new_val)
Set the value of a field of an WKUP register.
Definition: hw_wkup_v2.h:98
hw_wkup_get_gpio_status
__STATIC_INLINE uint32_t hw_wkup_get_gpio_status(HW_GPIO_PORT port)
Get port status on last wake up.
Definition: hw_wkup_v2.h:377
HW_WKUP_REG_GETF
#define HW_WKUP_REG_GETF(reg, field)
Get the value of a field of an WKUP register.
Definition: hw_wkup_v2.h:87
HW_WKUP_TRIG_EDGE_HI
Definition: hw_wkup_v2.h:112
hw_wkup_register_gpio_p1_interrupt
void hw_wkup_register_gpio_p1_interrupt(hw_wkup_interrupt_cb cb, uint32_t prio)
Register GPIO P1 interrupt handler.
hw_wkup_set_key_debounce_time
__STATIC_INLINE void hw_wkup_set_key_debounce_time(uint8_t time_ms)
Set debounce time.
Definition: hw_wkup_v2.h:262
HW_WKUP_HIBERN_BOTH_PINS_ACTIVE_HIGH
Definition: hw_wkup_v2.h:145
HW_WKUP_TRIGGER
HW_WKUP_TRIGGER
Key and gpio trigger types.
Definition: hw_wkup_v2.h:106
hw_wkup_init
void hw_wkup_init(const wkup_config *cfg)
Initialize peripheral.
hw_wkup_reset_key_interrupt
__STATIC_INLINE void hw_wkup_reset_key_interrupt(void)
Reset key interrupt.
Definition: hw_wkup_v2.h:243
hw_gpio.h
Definition of API for the GPIO Low Level Driver.
HW_WKUP_TRIG_LEVEL_HI
Definition: hw_wkup_v2.h:110
HW_WKUP_HIBERN_BOTH_PINS
Definition: hw_wkup_v2.h:137
HW_WKUP_HIBERN_BOTH_PINS_ACTIVE_LOW
Definition: hw_wkup_v2.h:148
HW_WKUP_HIBERN_P1_04_ACTIVE_LOW_ONLY
Definition: hw_wkup_v2.h:147
HW_WKUP_TRIG_LEVEL_HI_DEB
Definition: hw_wkup_v2.h:108
hw_wkup_disable_key_irq
__STATIC_INLINE void hw_wkup_disable_key_irq(void)
Disable WKUP interrupts.
Definition: hw_wkup_v2.h:344
HW_WKUP_TRIG_LEVEL_LO
Definition: hw_wkup_v2.h:111
hw_wkup_unfreeze_key_timer
__STATIC_INLINE void hw_wkup_unfreeze_key_timer(void)
Unfreeze wakeup controller timer.
Definition: hw_wkup_v2.h:362
hw_wkup_freeze_key_timer
__STATIC_INLINE void hw_wkup_freeze_key_timer(void)
Freeze wakeup timer.
Definition: hw_wkup_v2.h:353
HW_WKUP_HIBERN_P1_04_ONLY
Definition: hw_wkup_v2.h:136
hw_wkup_unregister_interrupts
void hw_wkup_unregister_interrupts(void)
Unregister interrupt handlers.
HW_GPIO_PORT_0
Definition: hw_gpio.h:97
wkup_config
Wakeup Controller configuration.
Definition: hw_wkup_v2.h:121
GPREG_RESET_FREEZE_REG_FRZ_WKUPTIM_Msk
#define GPREG_RESET_FREEZE_REG_FRZ_WKUPTIM_Msk
Definition: DA1459x-00.h:3274
HW_WKUP_HIBERN_PIN_NONE
Definition: hw_wkup_v2.h:134
hw_wkup_configure_hibernation
void hw_wkup_configure_hibernation(HW_WKUP_HIBERN_PIN pin, HW_WKUP_HIBERN_POLARITY pol)
Configure wake up from hibernation block.