VSF Documented
vsf_swi_template.inc
Go to the documentation of this file.
1/*******************************************************************************
2Please read the "vsf_swi_template.h" header file for usage
3*******************************************************************************/
4
5#define __VSF_HEADER_ONLY_SHOW_ARCH_INFO__
6#include "hal/driver/driver.h"
7#undef __VSF_HEADER_ONLY_SHOW_ARCH_INFO__
8
9#define __VSF_HAL_SHOW_VENDOR_INFO__
10#include "hal/driver/driver.h"
11
13
14#if __IS_COMPILER_IAR__
16# pragma diag_suppress=pe111
17#endif
18
19#if !defined(__VSF_HAL_SWI_NUM)
21# define __VSF_DEV_SWI_NUM VSF_DEV_SWI_NUM
22#elif __VSF_HAL_SWI_NUM > VSF_ARCH_SWI_NUM
23# if (__VSF_HAL_SWI_NUM - VSF_ARCH_SWI_NUM) > VSF_DEV_SWI_NUM
24# define MFUNC_IN_U8_DEC_VALUE (VSF_DEV_SWI_NUM)
25# else
26# define MFUNC_IN_U8_DEC_VALUE (__VSF_HAL_SWI_NUM - VSF_ARCH_SWI_NUM)
27# endif
29# define __VSF_DEV_SWI_NUM MFUNC_OUT_DEC_STR
30#else
31# define __VSF_DEV_SWI_NUM 0
32#endif
33
34#define __MCU_SWI(__N, __VALUE) \
35 VSF_CAL_ROOT VSF_CAL_ISR(SWI##__N##_IRQHandler) \
36 { \
37 if (__mcu_common.swi[__N].handler != NULL) { \
38 __mcu_common.swi[__N].handler(__mcu_common.swi[__N].param); \
39 } \
40 }
41
42/*============================ MACROFIED FUNCTIONS ===========================*/
43/*============================ TYPES =========================================*/
44
45#if __VSF_DEV_SWI_NUM > 0
46static const IRQn_Type __mcu_soft_irq[VSF_DEV_SWI_NUM] = {
48};
49
50struct __mcu_common_t {
51 struct {
52 vsf_swi_handler_t *handler;
53 void *param;
54 } swi[__VSF_DEV_SWI_NUM];
55};
56typedef struct __mcu_common_t __mcu_common_t;
57#endif
58
59/*============================ GLOBAL VARIABLES ==============================*/
60/*============================ LOCAL VARIABLES ===============================*/
61
62#if __VSF_DEV_SWI_NUM > 0
63static __mcu_common_t __mcu_common;
64#endif
65
66/*============================ PROTOTYPES ====================================*/
67
68#if defined(WEAK_VSF_USR_SWI_INIT_EXTERN) \
69 && defined(WEAK_VSF_USR_SWI_INIT)
70WEAK_VSF_USR_SWI_INIT_EXTERN
71#endif
72
73#if defined(WEAK_VSF_USR_SWI_TRIGGER_EXTERN) \
74 && defined(WEAK_VSF_USR_SWI_TRIGGER)
75WEAK_VSF_USR_SWI_TRIGGER_EXTERN
76#endif
77
78/*============================ IMPLEMENTATION ================================*/
79
80// SWI
81#if __VSF_DEV_SWI_NUM > 0
83
84static VSF_CAL_ALWAYS_INLINE vsf_err_t __vsf_drv_swi_init(uint_fast8_t idx,
85 vsf_arch_prio_t priority,
86 vsf_swi_handler_t *handler,
87 void *param)
88{
89 if (idx < __VSF_DEV_SWI_NUM) {
90 if (handler != NULL) {
91 __mcu_common.swi[idx].handler = handler;
92 __mcu_common.swi[idx].param = param;
93
94 NVIC_SetPriority(__mcu_soft_irq[idx], priority);
95 NVIC_EnableIRQ(__mcu_soft_irq[idx]);
96 } else {
97 NVIC_DisableIRQ(__mcu_soft_irq[idx]);
98 }
99 return VSF_ERR_NONE;
100 }
101 VSF_HAL_ASSERT(false);
102 return VSF_ERR_FAIL;
103}
104
105static VSF_CAL_ALWAYS_INLINE void __vsf_drv_swi_trigger(uint_fast8_t idx)
106{
107 if (idx < __VSF_DEV_SWI_NUM) {
108 NVIC_SetPendingIRQ(__mcu_soft_irq[idx]);
109 return;
110 }
111 VSF_HAL_ASSERT(false);
112}
113#endif
114
115#if __VSF_HAL_SWI_NUM > 0 || !defined(__VSF_HAL_SWI_NUM)
116// SWI
117
118VSF_CAL_WEAK(vsf_usr_swi_trigger)
120{
121 VSF_HAL_ASSERT(false);
122}
123
125{
126#if __VSF_HAL_SWI_NUM > VSF_ARCH_SWI_NUM || !defined(__VSF_HAL_SWI_NUM)
127# if __VSF_DEV_SWI_NUM > 0
128 if (idx < __VSF_DEV_SWI_NUM) {
129 __vsf_drv_swi_trigger(idx);
130 return;
131 }
132 idx -= __VSF_DEV_SWI_NUM;
133# endif
134
135# if (__VSF_HAL_SWI_NUM > VSF_ARCH_SWI_NUM + __VSF_DEV_SWI_NUM) \
136 || !defined(__VSF_HAL_SWI_NUM)
137# ifndef WEAK_VSF_USR_SWI_TRIGGER
139# else
140 WEAK_VSF_USR_SWI_TRIGGER(idx);
141# endif
142# else
143 VSF_HAL_ASSERT(false);
144# endif
145#else
146 VSF_HAL_ASSERT(false);
147#endif
148}
149
150VSF_CAL_WEAK(vsf_usr_swi_init)
152 vsf_arch_prio_t priority,
153 vsf_swi_handler_t *handler,
154 void *param)
155{
156 VSF_HAL_ASSERT(false);
157 return VSF_ERR_FAIL;
158}
159
161 vsf_arch_prio_t priority,
162 vsf_swi_handler_t *handler,
163 void *param)
164{
165#if __VSF_HAL_SWI_NUM > VSF_ARCH_SWI_NUM || !defined(__VSF_HAL_SWI_NUM)
166# if __VSF_DEV_SWI_NUM > 0
167 if (idx < __VSF_DEV_SWI_NUM) {
168 return __vsf_drv_swi_init(idx, priority, handler, param);
169 }
170 idx -= __VSF_DEV_SWI_NUM;
171# endif
172
173# if (__VSF_HAL_SWI_NUM > VSF_ARCH_SWI_NUM + __VSF_DEV_SWI_NUM) \
174 || !defined(__VSF_HAL_SWI_NUM)
175# ifndef WEAK_VSF_USR_SWI_INIT
176 return vsf_usr_swi_init(idx, priority, handler, param);
177# else
178 return WEAK_VSF_USR_SWI_INIT(idx, priority, handler, param);
179# endif
180# else
181 VSF_HAL_ASSERT(false);
182 return VSF_ERR_FAIL;
183# endif
184#else
185 VSF_HAL_ASSERT(false);
186 return VSF_ERR_FAIL;
187#endif
188}
189#endif
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NONE
none error
Definition __type.h:44
@ VSF_ERR_FAIL
failed
Definition __type.h:51
void vsf_usr_swi_trigger(uint_fast8_t idx)
Definition __common.c:119
vsf_err_t vsf_usr_swi_init(uint_fast8_t idx, vsf_arch_prio_t priority, vsf_swi_handler_t *handler, void *param)
Definition __common.c:147
#define __VSF_DEV_SWI_NUM
when there is no defined __VSF_HAL_SWI_NUM, use the maximum available value
Definition __common.c:25
vsf_arch_prio_t
Definition cortex_a_generic.h:88
enum IRQn IRQn_Type
#define VSF_DEV_SWI_LIST
Definition device.h:40
#define NULL
Definition stddef.h:52
unsigned char uint_fast8_t
Definition stdint.h:23
void vsf_drv_usr_swi_trigger(uint_fast8_t idx)
Definition vsf_arch_abstraction.c:459
vsf_err_t vsf_drv_usr_swi_init(uint_fast8_t idx, vsf_arch_prio_t priority, vsf_swi_handler_t *handler, void *param)
Definition vsf_arch_abstraction.c:493
#define VSF_DEV_SWI_NUM
Definition vsf_arch_abstraction.h:125
vsf_irq_handler_t vsf_swi_handler_t
Definition vsf_arch_abstraction.h:51
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
#define VSF_MREPEAT(__COUNT, __MACRO, __PARAM)
Definition vsf_repeat_macro.h:51