SmartSnippets DA1459x SDK
hw_pdc.h
Go to the documentation of this file.
1 
42 #ifndef HW_PDC_H_
43 #define HW_PDC_H_
44 
45 #if dg_configUSE_HW_PDC
46 
47 #include <sdk_defs.h>
48 
49 #define PDC_IRQn PDC_M33_IRQn
50 
51 #define HW_PDC_LUT_SIZE (12)
52 #define HW_PDC_INVALID_LUT_INDEX (0xFFFF)
53 #define HW_PDC_UNUSED_LUT_ENTRY_VALUE (0UL)
54 #define HW_PDC_FILTER_DONT_CARE (0xFF)
55 
58 typedef enum {
64 
68 typedef enum {
83 
87 typedef enum {
92 
96 typedef enum {
102 
106 typedef enum {
107  HW_PDC_ERROR_NONE = 0,
108  HW_PDC_ERROR_INVALID_LUT_ENTRY,
109  HW_PDC_ERROR_INVALID_PARAM
110 } HW_PDC_ERROR;
111 
115 typedef struct {
121 
125 typedef enum {
127  HW_PDC_PD_SYS_BLOCKED = REG_MSK(PDC, PDC_CONFIG_REG, PD_SYS_WKUP_CONFIG),
128  HW_PDC_PD_RAD_BLOCKED = REG_MSK(PDC, PDC_CONFIG_REG, PD_RAD_WKUP_CONFIG),
129  HW_PDC_ALL_BLOCKED_EXCEPT_FCU = REG_MSK(PDC, PDC_CONFIG_REG, TRIG_SELECT_CONFIG),
131 
135 typedef struct {
136  uint8_t num;
139 
146 #define HW_PDC_LUT_ENTRY_FIELD_MASK(field) \
147  (PDC_PDC_CTRL0_REG_##field##_Msk)
148 
155 #define HW_PDC_LUT_ENTRY_FIELD_POS(field) \
156  (PDC_PDC_CTRL0_REG_##field##_Pos)
157 
165 #define HW_PDC_LUT_ENTRY_FIELD_VAL(field, val) \
166  (((val) << HW_PDC_LUT_ENTRY_FIELD_POS(field)) & HW_PDC_LUT_ENTRY_FIELD_MASK(field))
167 
168 #define HW_PDC_LUT_ENTRY_VAL(trig_select, trig_id, wakeup_master, flags) \
169  ( \
170  HW_PDC_LUT_ENTRY_FIELD_VAL(TRIG_SELECT, trig_select) \
171  | HW_PDC_LUT_ENTRY_FIELD_VAL(TRIG_ID, trig_id) \
172  | HW_PDC_LUT_ENTRY_FIELD_VAL(PDC_MASTER, wakeup_master) \
173  | flags \
174  )
175 
176 /*
177  * Shorthand macros
178  */
179 #define HW_PDC_TRIGGER_FROM_PORT0(pin, wakeup_master, flags) \
180  HW_PDC_LUT_ENTRY_VAL(HW_PDC_TRIG_SELECT_P0_GPIO, pin, wakeup_master, flags)
181 
182 #define HW_PDC_TRIGGER_FROM_PORT1(pin, wakeup_master, flags) \
183  HW_PDC_LUT_ENTRY_VAL(HW_PDC_TRIG_SELECT_P1_GPIO, pin, wakeup_master, flags)
184 
185 #define HW_PDC_TRIGGER_FROM_PERIPH(peripheral, wakeup_master, flags) \
186  HW_PDC_LUT_ENTRY_VAL(HW_PDC_TRIG_SELECT_PERIPHERAL, peripheral, wakeup_master, flags)
187 
188 #define HW_PDC_TRIGGER_FROM_MASTER(wakeup_master, flags) \
189  HW_PDC_LUT_ENTRY_VAL(HW_PDC_TRIG_SELECT_MASTER, HW_PDC_PERIPH_TRIG_ID_MASTERONLY, \
190  wakeup_master, flags)
191 
199 __STATIC_INLINE uint32_t hw_pdc_read_entry(uint32_t idx)
200 {
201  ASSERT_ERROR(idx < HW_PDC_LUT_SIZE);
202 
203  return *(&PDC->PDC_CTRL0_REG + idx);
204 }
205 
216 __RETAINED_CODE uint32_t hw_pdc_add_entry(uint32_t lut_entry);
217 
227 uint32_t hw_pdc_remove_entry(uint32_t idx);
228 
232 __STATIC_INLINE uint32_t hw_pdc_get_pending(void)
233 {
234  return PDC->PDC_PENDING_REG;
235 }
236 
240 __STATIC_INLINE uint32_t hw_pdc_get_pending_cm33(void)
241 {
242  return PDC->PDC_PENDING_CM33_REG;
243 }
244 
248 __STATIC_INLINE uint32_t hw_pdc_get_pending_cmac(void)
249 {
250  return PDC->PDC_PENDING_CMAC_REG;
251 }
252 
253 
259 __STATIC_INLINE void hw_pdc_acknowledge(uint32_t idx)
260 {
261  ASSERT_ERROR(idx < HW_PDC_LUT_SIZE);
262 
263  PDC->PDC_ACKNOWLEDGE_REG= idx;
264 }
265 
273 void hw_pdc_write_entry(uint32_t idx, uint32_t value);
274 
284 __STATIC_INLINE HW_PDC_ERROR hw_pdc_set_pending(uint32_t idx)
285 {
286  if (idx >= HW_PDC_LUT_SIZE) {
287  return HW_PDC_ERROR_INVALID_PARAM;
288  }
289 
290  if ((hw_pdc_read_entry(idx) & HW_PDC_LUT_ENTRY_FIELD_MASK(PDC_MASTER)) == 0) {
291  return HW_PDC_ERROR_INVALID_LUT_ENTRY;
292  }
293 
294  PDC->PDC_SET_PENDING_REG = idx;
295 
296  return HW_PDC_ERROR_NONE;
297 }
298 
304 __STATIC_FORCEINLINE bool hw_pdc_is_pending(uint32_t idx)
305 {
306  ASSERT_ERROR(idx < HW_PDC_LUT_SIZE);
307 
308  return !!(PDC->PDC_PENDING_REG & (1 << idx));
309 }
310 
314 void hw_pdc_ack_all_pending_cm33(void);
315 
321 void hw_pdc_lut_reset(void);
322 
332 
351 uint32_t hw_pdc_find_entry(uint32_t trig_select, uint32_t trig_id,
352  uint32_t wakeup_master, uint32_t flags, uint32_t start);
358 __STATIC_FORCEINLINE void hw_pdc_set_blocked_triggers(HW_PDC_BLOCKED_TRIG blocked)
359 {
360  PDC->PDC_CONFIG_REG = blocked;
361 }
362 
369 {
370  return PDC->PDC_CONFIG_REG;
371 }
372 
373 #endif /* dg_configUSE_HW_PDC */
374 #endif /* HW_PDC_H_ */
375 
hw_pdc_entry_t::trig_id
HW_PDC_PERIPH_TRIG_ID trig_id
Definition: hw_pdc.h:117
hw_pdc_entry_t
PDC entry.
Definition: hw_pdc.h:115
HW_PDC_LUT_ENTRY_EN_TMR
Definition: hw_pdc.h:99
hw_pdc_get_pending_cm33
__STATIC_INLINE uint32_t hw_pdc_get_pending_cm33(void)
Get all PDC LUT entries pending for CM33.
Definition: hw_pdc.h:240
HW_PDC_PERIPH_TRIG_ID_MAC_TIMER
Definition: hw_pdc.h:75
HW_PDC_TRIG_SELECT
HW_PDC_TRIG_SELECT
Selects which wakeup source bank is selected as a trigger in a PDC LUT entry.
Definition: hw_pdc.h:58
hw_pdc_lut_reset
void hw_pdc_lut_reset(void)
Reset PDC Lookup table.
hw_pdc_lut_keep_t::num
uint8_t num
Definition: hw_pdc.h:136
hw_pdc_ack_all_pending_cm33
void hw_pdc_ack_all_pending_cm33(void)
Acknowledge all PDC LUT entries pending for CM33.
HW_PDC_ALL_BLOCKED_EXCEPT_FCU
Definition: hw_pdc.h:129
ASSERT_ERROR
#define ASSERT_ERROR(a)
Assert as error macro.
Definition: sdk_defs.h:422
HW_PDC_LUT_ENTRY_EN_COM
Definition: hw_pdc.h:97
hw_pdc_set_pending
__STATIC_INLINE HW_PDC_ERROR hw_pdc_set_pending(uint32_t idx)
Set a PDC LUT entry as pending.
Definition: hw_pdc.h:284
HW_PDC_PERIPH_TRIG_ID_MASTERONLY
Definition: hw_pdc.h:81
hw_pdc_remove_entry
uint32_t hw_pdc_remove_entry(uint32_t idx)
Remove a dynamically added PDC LUT entry.
PDC_PDC_CTRL0_REG_EN_COM_Msk
#define PDC_PDC_CTRL0_REG_EN_COM_Msk
Definition: DA1459x-00.h:3984
sdk_defs.h
Central include header file with platform definitions.
HW_PDC_RESET_BLOCKED_TRIGGERS
Definition: hw_pdc.h:126
HW_PDC_PERIPH_TRIG_ID_FCU_IRQ
Definition: hw_pdc.h:79
hw_pdc_acknowledge
__STATIC_INLINE void hw_pdc_acknowledge(uint32_t idx)
Acknowledge a PDC LUT entry.
Definition: hw_pdc.h:259
PDC_PDC_CTRL0_REG_EN_TMR_Msk
#define PDC_PDC_CTRL0_REG_EN_TMR_Msk
Definition: DA1459x-00.h:3988
HW_PDC_PERIPH_TRIG_ID_RFDIAG
Definition: hw_pdc.h:77
hw_pdc_lut_keep_t
PDC entries that will be kept after deep sleep.
Definition: hw_pdc.h:135
hw_pdc_set_blocked_triggers
__STATIC_FORCEINLINE void hw_pdc_set_blocked_triggers(HW_PDC_BLOCKED_TRIG blocked)
Set PDC configuration register.
Definition: hw_pdc.h:358
HW_PDC_MASTER_INVALID
Definition: hw_pdc.h:88
hw_pdc_lut_keep_t::keep
hw_pdc_entry_t * keep
Definition: hw_pdc.h:137
PDC_PDC_CTRL0_REG_EN_XTAL_Msk
#define PDC_PDC_CTRL0_REG_EN_XTAL_Msk
Definition: DA1459x-00.h:3990
hw_pdc_get_pending_cmac
__STATIC_INLINE uint32_t hw_pdc_get_pending_cmac(void)
Get all PDC LUT entries pending for CMAC.
Definition: hw_pdc.h:248
HW_PDC_MASTER_CMAC
Definition: hw_pdc.h:90
hw_pdc_add_entry
__RETAINED_CODE uint32_t hw_pdc_add_entry(uint32_t lut_entry)
Add a PDC LUT entry dynamically.
hw_pdc_write_entry
void hw_pdc_write_entry(uint32_t idx, uint32_t value)
Write a value in specific PDC LUT index.
HW_PDC_PERIPH_TRIG_ID_RTC_ALARM
Definition: hw_pdc.h:73
HW_PDC_PERIPH_TRIG_ID_TIMER4
Definition: hw_pdc.h:72
HW_PDC_LUT_ENTRY_EN_PER
Definition: hw_pdc.h:98
hw_pdc_entry_t::trig_select
HW_PDC_TRIG_SELECT trig_select
Definition: hw_pdc.h:116
HW_PDC_PERIPH_TRIG_ID_RTC_TIMER
Definition: hw_pdc.h:74
HW_PDC_TRIG_SELECT_MASTER
Definition: hw_pdc.h:62
hw_pdc_entry_t::flags
HW_PDC_LUT_ENTRY_EN flags
Definition: hw_pdc.h:119
HW_PDC_PD_SYS_BLOCKED
Definition: hw_pdc.h:127
HW_PDC_PERIPH_TRIG_ID
HW_PDC_PERIPH_TRIG_ID
Peripheral PDC trigger IDs.
Definition: hw_pdc.h:68
REG_MSK
#define REG_MSK(base, reg, field)
Access register field mask.
Definition: sdk_defs.h:583
HW_PDC_PD_RAD_BLOCKED
Definition: hw_pdc.h:128
hw_pdc_read_entry
__STATIC_INLINE uint32_t hw_pdc_read_entry(uint32_t idx)
Read value from specific PDC LUT index.
Definition: hw_pdc.h:199
HW_PDC_MASTER_CM33
Definition: hw_pdc.h:89
hw_pdc_find_entry
uint32_t hw_pdc_find_entry(uint32_t trig_select, uint32_t trig_id, uint32_t wakeup_master, uint32_t flags, uint32_t start)
Get the first PDC LUT entry index matching specific criteria.
HW_PDC_LUT_ENTRY_FIELD_MASK
#define HW_PDC_LUT_ENTRY_FIELD_MASK(field)
Get the mask of a field of a PDC LUT entry.
Definition: hw_pdc.h:146
hw_pdc_is_pending
__STATIC_FORCEINLINE bool hw_pdc_is_pending(uint32_t idx)
Check if a PDC LUT entry is pending.
Definition: hw_pdc.h:304
HW_PDC_PERIPH_TRIG_ID_TIMER3_QDEC
Definition: hw_pdc.h:71
HW_PDC_TRIG_SELECT_P1_GPIO
Definition: hw_pdc.h:60
HW_PDC_PERIPH_TRIG_ID_FAST_WKUP
Definition: hw_pdc.h:80
hw_pdc_get_blocked_triggers
__STATIC_FORCEINLINE HW_PDC_BLOCKED_TRIG hw_pdc_get_blocked_triggers()
get PDC configuration register
Definition: hw_pdc.h:368
HW_PDC_MASTER
HW_PDC_MASTER
PDC master IDs.
Definition: hw_pdc.h:87
HW_PDC_PERIPH_TRIG_ID_TIMER2
Definition: hw_pdc.h:70
hw_pdc_entry_t::wakeup_master
HW_PDC_MASTER wakeup_master
Definition: hw_pdc.h:118
HW_PDC_LUT_ENTRY_EN_XTAL
Definition: hw_pdc.h:100
HW_PDC_PERIPH_TRIG_ID_COMBO
Definition: hw_pdc.h:78
HW_PDC_PERIPH_TRIG_ID_TIMER
Definition: hw_pdc.h:69
hw_pdc_lut_keep
void hw_pdc_lut_keep(hw_pdc_lut_keep_t *keep)
Keep only the selected PDC Lookup table entries.
PDC_PDC_CTRL0_REG_EN_PER_Msk
#define PDC_PDC_CTRL0_REG_EN_PER_Msk
Definition: DA1459x-00.h:3986
hw_pdc_get_pending
__STATIC_INLINE uint32_t hw_pdc_get_pending(void)
Get all PDC LUT entries pending for any master.
Definition: hw_pdc.h:232
HW_PDC_TRIG_SELECT_P0_GPIO
Definition: hw_pdc.h:59
HW_PDC_PERIPH_TRIG_ID_XTAL32MRDY
Definition: hw_pdc.h:76
HW_PDC_TRIG_SELECT_PERIPHERAL
Definition: hw_pdc.h:61
HW_PDC_LUT_ENTRY_EN
HW_PDC_LUT_ENTRY_EN
PDC LUT entry enable bits.
Definition: hw_pdc.h:96
HW_PDC_ERROR
HW_PDC_ERROR
PDC LLD error codes.
Definition: hw_pdc.h:106
HW_PDC_BLOCKED_TRIG
HW_PDC_BLOCKED_TRIG
blocked PDC triggers
Definition: hw_pdc.h:125