VSF Documented
vsf_eda_bmpevt.c
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18
19/*============================ INCLUDES ======================================*/
20
22
23#if VSF_USE_KERNEL == ENABLED && defined(__EDA_GADGET__)
24
25/*============================ MACROS ========================================*/
26/*============================ MACROFIED FUNCTIONS ===========================*/
27/*============================ TYPES =========================================*/
28/*============================ GLOBAL VARIABLES ==============================*/
29/*============================ LOCAL VARIABLES ===============================*/
30/*============================ PROTOTYPES ====================================*/
31
32VSF_CAL_SECTION(".text.vsf.kernel.__vsf_teda_cancel_timer")
34
35/*============================ IMPLEMENTATION ================================*/
36
37#if VSF_KERNEL_CFG_SUPPORT_SYNC == ENABLED
38
39#if VSF_KERNEL_CFG_SUPPORT_BITMAP_EVENT == ENABLED
40/*-----------------------------------------------------------------------------*
41 * vsf_bmpevt_t *
42 *-----------------------------------------------------------------------------*/
43
44VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_adapter_set")
45static void __vsf_eda_bmpevt_adapter_set(vsf_bmpevt_adapter_t *this_ptr)
46{
47 VSF_KERNEL_ASSERT(this_ptr != NULL);
48 vsf_eda_bmpevt_set(this_ptr->bmpevt_host, this_ptr->mask);
49}
50
51VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_adapter_eda_init")
52static vsf_err_t __vsf_eda_bmpevt_adapter_eda_init(vsf_bmpevt_adapter_eda_t *this_ptr)
53{
54 VSF_KERNEL_ASSERT(this_ptr != NULL);
55 return vsf_eda_init(&this_ptr->eda);
56}
57
58VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_adapter_sync_evthander")
59static void __vsf_eda_bmpevt_adapter_sync_evthander(vsf_eda_t *eda, vsf_evt_t evt)
60{
61 VSF_KERNEL_ASSERT(eda != NULL);
64
65 switch (evt) {
66 case VSF_EVT_INIT:
67 if (vsf_eda_sync_decrease(adapter_sync->sync, -1)) {
68 break;
69 }
70 case VSF_EVT_SYNC:
71 __vsf_eda_bmpevt_adapter_set((vsf_bmpevt_adapter_t *)adapter_sync);
72 break;
73 }
74}
75
76#if __IS_COMPILER_GCC__
77# pragma GCC diagnostic push
78# pragma GCC diagnostic ignored "-Wcast-align"
79#elif __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
80# pragma clang diagnostic push
81# pragma clang diagnostic ignored "-Wcast-align"
82#endif
83
84VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_adapter_sync_init")
85static vsf_err_t __vsf_eda_bmpevt_adapter_sync_init(vsf_bmpevt_adapter_t *this_ptr)
86{
87 VSF_KERNEL_ASSERT(this_ptr != NULL);
88 // GCC: -Wcast-align
89 vsf_bmpevt_adapter_eda_t *adapter_eda = (vsf_bmpevt_adapter_eda_t *)this_ptr;
90
91 adapter_eda->eda.fn.evthandler = __vsf_eda_bmpevt_adapter_sync_evthander;
92 return __vsf_eda_bmpevt_adapter_eda_init(adapter_eda);
93}
94
95VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_adapter_sync_reset")
96static vsf_err_t __vsf_eda_bmpevt_adapter_sync_reset(vsf_bmpevt_adapter_t *this_ptr)
97{
98 // GCC: -Wcast-align
99 vsf_bmpevt_adapter_sync_t *adapter_sync = (vsf_bmpevt_adapter_sync_t *)this_ptr;
100 VSF_KERNEL_ASSERT(this_ptr != NULL);
101 vsf_sync_t *sync = adapter_sync->sync;
102
103 if (sync->max_union.bits.manual_rst) {
104 return vsf_eda_sync_decrease(sync, -1);
105 }
106 return __vsf_eda_bmpevt_adapter_eda_init((vsf_bmpevt_adapter_eda_t *)adapter_sync);
107}
108
109VSF_CAL_SECTION(".data.vsf.kernel.vsf_eda_bmpevt_adapter_sync_op")
111 .init = __vsf_eda_bmpevt_adapter_sync_init,
112 .reset = __vsf_eda_bmpevt_adapter_sync_reset,
113};
114
115VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_adapter_bmpevt_evthander")
116static void __vsf_eda_bmpevt_adapter_bmpevt_evthander(vsf_eda_t *eda, vsf_evt_t evt)
117{
118 vsf_bmpevt_adapter_bmpevt_t *adapter_bmpevt;
119 VSF_KERNEL_ASSERT(eda != NULL);
120 adapter_bmpevt = (vsf_bmpevt_adapter_bmpevt_t *)
122
123 switch (evt) {
124 case VSF_EVT_INIT:
125 if (vsf_eda_bmpevt_pend(adapter_bmpevt->bmpevt, &adapter_bmpevt->pender, -1)) {
126 break;
127 }
128 case VSF_EVT_SYNC:
129 __vsf_eda_bmpevt_adapter_set((vsf_bmpevt_adapter_t *)adapter_bmpevt);
130 break;
131 }
132}
133
134VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_adapter_bmpevt_init")
135static vsf_err_t __vsf_eda_bmpevt_adapter_bmpevt_init(vsf_bmpevt_adapter_t *this_ptr)
136{
137 // GCC: -Wcast-align
138 vsf_bmpevt_adapter_eda_t *adapter_eda = (vsf_bmpevt_adapter_eda_t *)this_ptr;
139
140 VSF_KERNEL_ASSERT(this_ptr != NULL);
141 adapter_eda->eda.fn.evthandler = __vsf_eda_bmpevt_adapter_bmpevt_evthander;
142 return __vsf_eda_bmpevt_adapter_eda_init(adapter_eda);
143}
144
145VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_adapter_bmpevt_reset")
146static vsf_err_t __vsf_eda_bmpevt_adapter_bmpevt_reset(vsf_bmpevt_adapter_t *this_ptr)
147{
148 // GCC: -Wcast-align
149 vsf_bmpevt_adapter_bmpevt_t *adapter_bmpevt = (vsf_bmpevt_adapter_bmpevt_t *)this_ptr;
150 VSF_KERNEL_ASSERT(this_ptr != NULL);
151
152 vsf_eda_bmpevt_reset(adapter_bmpevt->bmpevt, adapter_bmpevt->pender.mask);
153 return __vsf_eda_bmpevt_adapter_eda_init((vsf_bmpevt_adapter_eda_t *)adapter_bmpevt);
154}
155#if __IS_COMPILER_GCC__
156# pragma GCC diagnostic pop
157#elif __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
158# pragma clang diagnostic pop
159#endif
160
161VSF_CAL_SECTION(".data.vsf.kernel.vsf_eda_bmpevt_adapter_bmpevt_op")
163 .init = __vsf_eda_bmpevt_adapter_bmpevt_init,
164 .reset = __vsf_eda_bmpevt_adapter_bmpevt_reset,
165};
166
167VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_remove_pender")
168static void __vsf_eda_bmpevt_remove_pender(vsf_bmpevt_t *this_ptr, vsf_bmpevt_pender_t *pender)
169{
170 VSF_KERNEL_ASSERT((this_ptr != NULL) && (pender != NULL) && (pender->eda_pending != NULL));
171
172 vsf_protect_t lock_status = vsf_protect_sched();
173 __vsf_dlist_remove_imp(&this_ptr->pending_list, &pender->eda_pending->pending_node);
174 vsf_unprotect_sched(lock_status);
175}
176
177VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_poll")
178static bool __vsf_eda_bmpevt_poll(vsf_bmpevt_t *this_ptr, vsf_bmpevt_pender_t *pender)
179{
180 uint_fast32_t cur_mask;
182
183 VSF_KERNEL_ASSERT((this_ptr != NULL) && (pender != NULL));
184
185 cur_mask = this_ptr->value & pender->mask;
186 if (pender->op == VSF_BMPEVT_AND) {
187 if (cur_mask == pender->mask) {
188 err = VSF_ERR_NONE;
189 }
190 } else {
191 if (cur_mask) {
192 err = VSF_ERR_NONE;
193 }
194 }
195
196 if (!err) {
197 vsf_eda_bmpevt_reset(this_ptr, cur_mask & this_ptr->auto_reset);
198 }
199 return (err == VSF_ERR_NONE);
200}
201
202VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_post_evt")
203static void __vsf_eda_bmpevt_post_evt(vsf_bmpevt_t *this_ptr, vsf_dlist_node_t *node, vsf_evt_t evt)
204{
205 bool is_poll_event = evt == VSF_EVT_SYNC_POLL;
206
207 if (!node) {
208 poll_end:
209 if (is_poll_event) {
210 bool is_to_repoll;
211 vsf_protect_t lock_status = vsf_protect_sched();
212 is_to_repoll = this_ptr->state.bits.is_to_repoll;
213 if (!is_to_repoll) {
214 this_ptr->state.bits.is_polling = false;
215 }
216 vsf_unprotect_sched(lock_status);
217
218 if (is_to_repoll) {
219 goto repoll;
220 }
221 }
222 } else {
223 while (node != NULL) {
224 if (is_poll_event && this_ptr->state.bits.is_to_repoll) {
225 repoll:
226 this_ptr->state.bits.is_to_repoll = false;
227 __vsf_eda_bmpevt_post_evt(this_ptr, this_ptr->pending_list.head, evt);
228 return;
229 }
230
231 vsf_eda_t *eda = __vsf_dlist_get_host(vsf_eda_t, pending_node, node);
232 if (!vsf_eda_post_evt(eda, evt)) {
233 break;
234 } else {
235 node = node->next;
236 }
237 }
238 if (NULL == node) {
239 goto poll_end;
240 }
241 }
242}
243
244VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_cancel_start")
245static void __vsf_eda_bmpevt_cancel_start(vsf_bmpevt_t *this_ptr)
246{
247 VSF_KERNEL_ASSERT(this_ptr != NULL);
248
249 vsf_protect_t lock_status = vsf_protect_sched();
250 this_ptr->state.bits.is_cancelling = true;
251 vsf_unprotect_sched(lock_status);
252
253 __vsf_eda_bmpevt_post_evt(this_ptr, this_ptr->pending_list.head, VSF_EVT_SYNC_CANCEL);
254}
255
256VSF_CAL_SECTION(".text.vsf.kernel.__vsf_eda_bmpevt_poll_start")
257static void __vsf_eda_bmpevt_poll_start(vsf_bmpevt_t *this_ptr)
258{
259 bool is_polling;
260
261 VSF_KERNEL_ASSERT(this_ptr != NULL);
262
263 vsf_protect_t lock_status = vsf_protect_sched();
264 is_polling = this_ptr->state.bits.is_polling;
265 if (is_polling) {
266 this_ptr->state.bits.is_to_repoll = true;
267 } else {
268 this_ptr->state.bits.is_polling = true;
269 }
270 vsf_unprotect_sched(lock_status);
271
272 if (!is_polling) {
273 __vsf_eda_bmpevt_post_evt(this_ptr, this_ptr->pending_list.head, VSF_EVT_SYNC_POLL);
274 }
275}
276
277VSF_CAL_SECTION(".text.vsf.kernel.vsf_eda_bmpevt_init")
279{
280 vsf_bmpevt_adapter_t *adapter;
281 uint_fast8_t i;
282 VSF_KERNEL_ASSERT(this_ptr != NULL && adapter_count <= 32);
283
284 vsf_dlist_init(&this_ptr->pending_list);
285 this_ptr->state.flag = 0;
286 this_ptr->value = 0;
287 this_ptr->cancelled_value = 0;
288 this_ptr->state.bits.adapter_count = adapter_count;
289
290 for (i = 0; i < this_ptr->state.bits.adapter_count; i++) {
291 adapter = this_ptr->adapters[i];
292 if (adapter != NULL) {
293 adapter->bmpevt_host = this_ptr;
294 if (adapter->op->init != NULL) {
295 adapter->op->init(adapter);
296 }
297 }
298 }
299 return VSF_ERR_NONE;
300}
301
302VSF_CAL_SECTION(".text.vsf.kernel.vsf_eda_bmpevt_reset")
304{
305 vsf_bmpevt_adapter_t *adapter;
306 uint_fast8_t i;
307 VSF_KERNEL_ASSERT(this_ptr != NULL);
308
309 mask &= this_ptr->value;
310 vsf_protect_t lock_status = vsf_protect_sched();
311 this_ptr->value &= ~mask;
312 vsf_unprotect_sched(lock_status);
313
314 for (i = 0; i < this_ptr->state.bits.adapter_count; i++) {
315 adapter = this_ptr->adapters[i];
316 if ((mask & (1 << i)) && (adapter != NULL)) {
317 if (adapter->op->reset != NULL) {
318 adapter->op->reset(adapter);
319 }
320 }
321 }
322 return VSF_ERR_NONE;
323}
324
325VSF_CAL_SECTION(".text.vsf.kernel.vsf_eda_bmpevt_cancel")
327{
328 VSF_KERNEL_ASSERT(this_ptr != NULL);
329
330 vsf_protect_t lock_status = vsf_protect_sched();
331 this_ptr->cancelled_value |= mask;
332 vsf_unprotect_sched(lock_status);
333
334 __vsf_eda_bmpevt_cancel_start(this_ptr);
335 return VSF_ERR_NONE;
336}
337
338VSF_CAL_SECTION(".text.vsf.kernel.vsf_eda_bmpevt_set")
340{
341 VSF_KERNEL_ASSERT(this_ptr != NULL);
342
343 vsf_protect_t lock_status = vsf_protect_sched();
344 this_ptr->value |= mask;
345 vsf_unprotect_sched(lock_status);
346
347 __vsf_eda_bmpevt_poll_start(this_ptr);
348 return VSF_ERR_NONE;
349}
350
351VSF_CAL_SECTION(".text.vsf.kernel.vsf_eda_bmpevt_pend")
353{
354 vsf_protect_t orig;
355 vsf_eda_t *eda;
356
357 VSF_KERNEL_ASSERT((this_ptr != NULL) && (pender != NULL));
358
359 if (0 == timeout) {
360 if (__vsf_eda_bmpevt_poll(this_ptr, pender)) {
361 return VSF_ERR_NONE;
362 } else {
363 return VSF_ERR_NOT_READY;
364 }
365 }
366
367 eda = pender->eda_pending = vsf_eda_get_cur();
368 VSF_KERNEL_ASSERT(eda != NULL);
369
370 vsf_dlist_init_node(vsf_eda_t, pending_node, eda);
371
372 orig = vsf_protect_sched();
373 if (pender->mask & this_ptr->cancelled_value) {
375 return VSF_ERR_FAIL;
376 }
377
378 __vsf_dlist_add_to_tail_imp(&this_ptr->pending_list, &eda->pending_node);
379 __vsf_eda_set_timeout(eda, timeout);
381
382 __vsf_eda_bmpevt_poll_start(this_ptr);
383 return VSF_ERR_NOT_READY;
384}
385
386#if __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
387# pragma clang diagnostic push
388# pragma clang diagnostic ignored "-Wcast-align"
389#endif
390
391#if __IS_COMPILER_GCC__
392# pragma GCC diagnostic push
393# pragma GCC diagnostic ignored "-Wcast-align"
394#endif
395
396VSF_CAL_SECTION(".text.vsf.kernel.vsf_eda_bmpevt_poll")
398 vsf_bmpevt_pender_t *pender,
399 vsf_evt_t evt)
400{
402 vsf_eda_t *eda;
403
404 VSF_KERNEL_ASSERT( (this_ptr != NULL)
405 && (pender != NULL)
406 && (pender->eda_pending == vsf_eda_get_cur()));
407 eda = pender->eda_pending;
408
409#if VSF_KERNEL_CFG_EDA_SUPPORT_TIMER == ENABLED
410 if (evt == VSF_EVT_TIMER) {
411 __vsf_eda_bmpevt_remove_pender(this_ptr, pender);
412 reason = VSF_SYNC_TIMEOUT;
413 } else
414#endif
415 if (evt == VSF_EVT_SYNC_CANCEL) {
416 if (this_ptr->cancelled_value && pender->mask) {
417 __vsf_eda_bmpevt_remove_pender(this_ptr, pender);
418 reason = VSF_SYNC_CANCEL;
419 } else {
420 reason = VSF_SYNC_PENDING;
421 }
422 __vsf_eda_bmpevt_post_evt(this_ptr, eda->pending_node.next, evt);
423 } else if (evt == VSF_EVT_SYNC_POLL) {
424 if (__vsf_eda_bmpevt_poll(this_ptr, pender)) {
425 __vsf_eda_bmpevt_remove_pender(this_ptr, pender);
426 reason = VSF_SYNC_GET;
427 } else {
428 reason = VSF_SYNC_PENDING;
429 }
430 __vsf_eda_bmpevt_post_evt(this_ptr, eda->pending_node.next, evt);
431 } else {
432 VSF_KERNEL_ASSERT(false);
433 }
434 if (reason != VSF_SYNC_PENDING) {
435#if VSF_KERNEL_CFG_EDA_SUPPORT_TIMER == ENABLED
437#endif
438 eda->flag.state.is_limitted = false;
439 }
440 return reason;
441}
442
443#if __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
444# pragma clang diagnostic pop
445#endif
446
447#if __IS_COMPILER_GCC__
448# pragma GCC diagnostic pop
449#endif
450
451
452#endif // VSF_KERNEL_CFG_SUPPORT_BITMAP_EVENT
453
454#endif
455
456
457#endif
#define VSF_CAL_SECTION(__SEC)
Definition __compiler.h:181
#define vsf_container_of(__ptr, __type, __member)
Definition __type.h:164
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NONE
none error
Definition __type.h:44
@ VSF_ERR_NOT_READY
service not ready yet
Definition __type.h:43
@ VSF_ERR_FAIL
failed
Definition __type.h:51
Definition vsf_eda.h:930
Definition vsf_eda.h:916
const vsf_bmpevt_adapter_op_t * op
Definition vsf_eda.h:921
Definition vsf_eda.h:942
uint32_t mask
Definition vsf_eda.h:947
Definition vsf_eda.h:957
Definition vsf_eda.h:766
Definition vsf_eda.h:864
Definition vsf_eda.h:834
__le16 timeout
Definition ieee80211.h:94
#define NULL
Definition stddef.h:52
unsigned char uint_fast8_t
Definition stdint.h:23
unsigned int uint_fast32_t
Definition stdint.h:27
Definition vsf_eda.h:1076
vsf_bmpevt_adapter_eda_t vsf_bmpevt_t * bmpevt
Definition vsf_eda.h:1078
vsf_bmpevt_pender_t pender
Definition vsf_eda.h:1079
Definition vsf_eda.h:908
vsf_err_t(* reset)(vsf_bmpevt_adapter_t *pthis)
Definition vsf_eda.h:910
vsf_err_t(* init)(vsf_bmpevt_adapter_t *pthis)
Definition vsf_eda.h:909
Definition vsf_eda.h:1071
vsf_bmpevt_adapter_eda_t vsf_sync_t * sync
Definition vsf_eda.h:1073
Definition vsf_list.h:888
void sync(void)
Definition vsf_linux_fs.c:2146
uintalu_t vsf_protect_t
Definition vsf_arch_abstraction.h:53
vsf_err_t vsf_eda_post_evt(vsf_eda_t *pthis, vsf_evt_t evt)
Definition vsf_eda.c:923
vsf_eda_t * vsf_eda_get_cur(void)
Definition vsf_eda.c:410
int16_t vsf_evt_t
Definition vsf_eda.h:654
vsf_err_t vsf_eda_bmpevt_reset(vsf_bmpevt_t *pthis, uint_fast32_t mask)
vsf_err_t vsf_eda_bmpevt_cancel(vsf_bmpevt_t *pthis, uint_fast32_t mask)
#define VSF_BMPEVT_AND
Definition vsf_eda.h:906
vsf_err_t vsf_eda_bmpevt_set(vsf_bmpevt_t *pthis, uint_fast32_t mask)
@ VSF_EVT_SYNC_CANCEL
Definition vsf_eda.h:616
@ VSF_EVT_SYNC
Definition vsf_eda.h:615
@ VSF_EVT_SYNC_POLL
Definition vsf_eda.h:617
@ VSF_EVT_INIT
Definition vsf_eda.h:605
@ VSF_EVT_TIMER
Definition vsf_eda.h:612
const vsf_bmpevt_adapter_op_t vsf_eda_bmpevt_adapter_bmpevt_op
vsf_err_t vsf_eda_bmpevt_init(vsf_bmpevt_t *pthis, uint_fast8_t adapter_count)
vsf_err_t vsf_eda_sync_decrease(vsf_sync_t *pthis, vsf_timeout_tick_t timeout)
vsf_err_t vsf_eda_bmpevt_pend(vsf_bmpevt_t *pthis, vsf_bmpevt_pender_t *pender, vsf_timeout_tick_t timeout)
VSF_KERNEL_TIMEOUT_TICK_T vsf_timeout_tick_t
Definition vsf_eda.h:592
vsf_sync_reason_t vsf_eda_bmpevt_poll(vsf_bmpevt_t *pthis, vsf_bmpevt_pender_t *pender, vsf_evt_t evt)
const vsf_bmpevt_adapter_op_t vsf_eda_bmpevt_adapter_sync_op
#define vsf_eda_init(__eda,...)
Definition vsf_eda.h:166
vsf_err_t __vsf_teda_cancel_timer(vsf_teda_t *pthis)
vsf_sync_reason_t
Definition vsf_eda.h:1053
@ VSF_SYNC_GET
Definition vsf_eda.h:1057
@ VSF_SYNC_FAIL
Definition vsf_eda.h:1054
@ VSF_SYNC_CANCEL
Definition vsf_eda.h:1058
@ VSF_SYNC_TIMEOUT
Definition vsf_eda.h:1055
@ VSF_SYNC_PENDING
Definition vsf_eda.h:1056
#define VSF_KERNEL_ASSERT
Definition vsf_kernel_cfg.h:32
void __vsf_dlist_add_to_tail_imp(vsf_dlist_t *this_ptr, vsf_dlist_node_t *node)
Definition vsf_list.c:210
void __vsf_dlist_remove_imp(vsf_dlist_t *this_ptr, vsf_dlist_node_t *node)
Definition vsf_list.c:290
#define vsf_dlist_init_node( __host_type, __member, __item_ptr)
Definition vsf_list.h:717
#define __vsf_dlist_get_host(__host_type, __member, __node_ptr)
Definition vsf_list.h:271
#define vsf_dlist_init(__list_ptr)
Definition vsf_list.h:702
#define vsf_protect_sched()
Definition vsf_os.h:88
#define vsf_unprotect_sched(__prot)
Definition vsf_os.h:89