78 |
78 |
*/
|
79 |
79 |
#define SSSP_STACKINIT_CANMSGID_ABORT 0x001
|
80 |
80 |
|
81 |
|
#endif /* AMIROOS_CFG_SSSP_ENABLE == true */
|
|
81 |
#else /* AMIROOS_CFG_SSSP_ENABLE == false */
|
|
82 |
|
|
83 |
/**
|
|
84 |
* @brief Default shutdown mode if SSSP is unavailable.
|
|
85 |
*/
|
|
86 |
#define AOS_SHUTDOWN_DEFAULT AOS_SHUTDOWN_DEEPSLEEP
|
|
87 |
|
|
88 |
#endif /* AMIROOS_CFG_SSSP_ENABLE */
|
82 |
89 |
|
83 |
90 |
/**
|
84 |
91 |
* @brief CAN message identifier for calender synchronization message.
|
... | ... | |
106 |
113 |
* @brief I/O shell channel for the programmer interface.
|
107 |
114 |
*/
|
108 |
115 |
static AosShellChannel _stdshellchannel;
|
109 |
|
#endif
|
110 |
|
#endif
|
|
116 |
#endif /* AMIROOS_CFG_SHELL_ENABLE == true */
|
|
117 |
#endif /* defined(MODULE_HAL_PROGIF) */
|
111 |
118 |
|
112 |
119 |
/*
|
113 |
120 |
* hook to add further static variables
|
... | ... | |
283 |
290 |
aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE;
|
284 |
291 |
sssp_modulestackinitstage_t stage = STAGE_3_1;
|
285 |
292 |
eventmask_t eventmask = 0;
|
286 |
|
eventflags_t ioflags;
|
|
293 |
eventflags_t ioflags = 0;
|
287 |
294 |
event_source_t eventSourceTimeout;
|
288 |
295 |
event_source_t eventSourceDelay;
|
289 |
296 |
event_listener_t eventListenerTimeout;
|
... | ... | |
297 |
304 |
aos_ssspmoduleid_t lastid = 0;
|
298 |
305 |
#endif
|
299 |
306 |
flags_t flags;
|
|
307 |
aos_timestamp_t uptime;
|
300 |
308 |
|
301 |
309 |
// initialize local varibles
|
302 |
310 |
chEvtObjectInit(&eventSourceTimeout);
|
... | ... | |
379 |
387 |
// reset wfe flag for the next iteration
|
380 |
388 |
flags.wfe_next = true;
|
381 |
389 |
|
382 |
|
// waiting for events may be skipped
|
|
390 |
// waiting for events (may be skipped)
|
383 |
391 |
if (flags.wfe) {
|
384 |
392 |
// wait for any event to occur
|
385 |
393 |
aosDbgPrintf("WFE...");
|
... | ... | |
387 |
395 |
aosDbgPrintf("\t0x%08X", eventmask);
|
388 |
396 |
} else {
|
389 |
397 |
aosDbgPrintf("WFE skipped");
|
|
398 |
eventmask = 0;
|
390 |
399 |
}
|
391 |
|
aos_timestamp_t uptime;
|
392 |
400 |
aosSysGetUptime(&uptime);
|
393 |
|
aosDbgPrintf("\t%04ums\n", (uint32_t)(uptime / 1000));
|
|
401 |
aosDbgPrintf("\t%04ums\n", (uint32_t)(uptime / MICROSECONDS_PER_MILLISECOND));
|
394 |
402 |
|
395 |
403 |
/*
|
396 |
404 |
* execute some general tasks and high priority events
|
... | ... | |
410 |
418 |
if (ioflags & MODULE_SSSP_EVENTFLAGS_PD) {
|
411 |
419 |
aosDbgPrintf("PD evt\n");
|
412 |
420 |
// deactivate S and UP
|
|
421 |
aosDbgPrintf("disabling S\n");
|
413 |
422 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
414 |
423 |
#if (AMIROOS_CFG_SSSP_STACK_END != true)
|
|
424 |
aosDbgPrintf("disabling UP\n");
|
415 |
425 |
apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
|
416 |
426 |
#endif
|
417 |
427 |
// set shutdown flag and exit the loop
|
... | ... | |
422 |
432 |
if (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC) {
|
423 |
433 |
apalControlGpioState_t sstate;
|
424 |
434 |
apalControlGpioGet(&moduleSsspGpioSync, &sstate);
|
425 |
|
if (sstate == APAL_GPIO_OFF) {
|
426 |
|
aosDbgPrintf("-S evt\n");
|
|
435 |
if (sstate == APAL_GPIO_ON) {
|
|
436 |
aosDbgPrintf("S evt (enabled)\n");
|
|
437 |
} else {
|
|
438 |
aosDbgPrintf("S evt (disabled)\n");
|
427 |
439 |
// either finish or abort
|
428 |
440 |
if ((stage == STAGE_3_3_WAITFORID) && (aos.sssp.moduleId != 0)) {
|
429 |
441 |
stage = STAGE_3_4_FINISH;
|
... | ... | |
447 |
459 |
}
|
448 |
460 |
// if a CAN event occurred
|
449 |
461 |
if ((eventmask & eventListenerCan.events)) {
|
|
462 |
aosDbgPrintf("CAN evt\n");
|
450 |
463 |
// fetch message
|
451 |
464 |
if (flags.wfe) {
|
452 |
465 |
canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canRxFrame, TIME_IMMEDIATE);
|
... | ... | |
465 |
478 |
}
|
466 |
479 |
// if a timeout event occurred
|
467 |
480 |
if (eventmask & eventListenerTimeout.events) {
|
|
481 |
aosDbgPrintf("timeout evt\n");
|
468 |
482 |
// is handled at the end of the loop (or must be cleared by FSM)
|
469 |
483 |
}
|
470 |
484 |
// if a delay event occurred
|
471 |
485 |
if (eventmask & eventListenerDelay.events) {
|
|
486 |
aosDbgPrintf("delay evt\n");
|
472 |
487 |
// is handled by FSM
|
473 |
488 |
}
|
474 |
489 |
|
... | ... | |
492 |
507 |
break;
|
493 |
508 |
}
|
494 |
509 |
// activate S
|
495 |
|
aosDbgPrintf("S+\n");
|
|
510 |
aosDbgPrintf("enabling S\n");
|
496 |
511 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
|
497 |
512 |
#if (AMIROOS_CFG_SSSP_STACK_START == true)
|
498 |
513 |
// proceed immediately
|
... | ... | |
524 |
539 |
chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
|
525 |
540 |
eventmask &= ~(eventListenerTimeout.events);
|
526 |
541 |
// activate S
|
527 |
|
aosDbgPrintf("S+\n");
|
|
542 |
aosDbgPrintf("enabling S\n");
|
528 |
543 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
|
529 |
544 |
#if (AMIROOS_CFG_SSSP_STACK_START == true)
|
530 |
545 |
// proceed
|
... | ... | |
567 |
582 |
#if (AMIROOS_CFG_SSSP_STACK_END == true)
|
568 |
583 |
// sequence is already over
|
569 |
584 |
// deactivate S
|
570 |
|
aosDbgPrintf("S-\n");
|
|
585 |
aosDbgPrintf("disabling S\n");
|
571 |
586 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
572 |
587 |
// proceed
|
573 |
588 |
stage = STAGE_3_3_WAITFORID;
|
... | ... | |
580 |
595 |
// if a delay event occurred
|
581 |
596 |
if (eventmask & eventListenerDelay.events) {
|
582 |
597 |
// activate UP
|
583 |
|
aosDbgPrintf("UP+\n");
|
|
598 |
aosDbgPrintf("enabling UP\n");
|
584 |
599 |
apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
|
585 |
600 |
// deactivate S
|
586 |
|
aosDbgPrintf("S-\n");
|
|
601 |
aosDbgPrintf("disabling S\n");
|
587 |
602 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
588 |
603 |
// explicitely clear timeout event flag
|
589 |
604 |
chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
|
... | ... | |
665 |
680 |
|
666 |
681 |
// if an IO event was received (DN signal)
|
667 |
682 |
if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_DN)) {
|
668 |
|
aosDbgPrintf("DN <-\n");
|
|
683 |
aosDbgPrintf("DN evt\n");
|
669 |
684 |
// reset timeout timer
|
670 |
685 |
chVTReset(&timerTimeout);
|
671 |
686 |
chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE);
|
... | ... | |
688 |
703 |
if (eventmask & eventListenerDelay.events) {
|
689 |
704 |
#if (AMIROOS_CFG_SSSP_STACK_END != true)
|
690 |
705 |
// activate UP
|
691 |
|
aosDbgPrintf("UP+\n");
|
|
706 |
aosDbgPrintf("enabling UP\n");
|
692 |
707 |
apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
|
693 |
708 |
#endif
|
694 |
709 |
// deactivate S
|
695 |
|
aosDbgPrintf("S-\n");
|
|
710 |
aosDbgPrintf("disabling S\n");
|
696 |
711 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
697 |
712 |
// reset the timeout timer
|
698 |
713 |
chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout);
|
... | ... | |
794 |
809 |
aos.sssp.stage = AOS_SSSP_STARTUP_3_4;
|
795 |
810 |
|
796 |
811 |
// deactivate S
|
797 |
|
aosDbgPrintf("S-\n");
|
|
812 |
aosDbgPrintf("disabling SYNC\n");
|
798 |
813 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
799 |
814 |
// invalidate module ID
|
800 |
815 |
aos.sssp.moduleId = 0;
|
... | ... | |
808 |
823 |
|
809 |
824 |
break;
|
810 |
825 |
} /* end of STAGE_3_4_ABORT */
|
811 |
|
}
|
|
826 |
} /* end of switch(stage) */
|
812 |
827 |
|
813 |
828 |
// fetch pending CAN message (if any)
|
814 |
829 |
if ((eventmask & eventListenerCan.events) && (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &canRxFrame, TIME_IMMEDIATE) == MSG_OK)) {
|
... | ... | |
827 |
842 |
// apply wfe value for next iteration
|
828 |
843 |
flags.wfe = flags.wfe_next;
|
829 |
844 |
} /* end of FSM loop */
|
830 |
|
aosDbgPrintf("\n");
|
831 |
845 |
|
832 |
846 |
// unregister all events (timeout, delay, CAN receive)
|
833 |
847 |
chEvtUnregister(&eventSourceTimeout, &eventListenerTimeout);
|
... | ... | |
838 |
852 |
|
839 |
853 |
// reset all control signals
|
840 |
854 |
#if (AMIROOS_CFG_SSSP_STACK_END != true)
|
|
855 |
aosDbgPrintf("disabling UP\n");
|
841 |
856 |
apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
|
842 |
857 |
#endif
|
|
858 |
aosDbgPrintf("disabling S\n");
|
843 |
859 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
|
860 |
aosSysGetUptime(&uptime);
|
|
861 |
aosDbgPrintf("done\t%04ums\n", (uint32_t)(uptime / MICROSECONDS_PER_MILLISECOND));
|
844 |
862 |
|
845 |
863 |
return shutdown;
|
846 |
864 |
}
|
... | ... | |
947 |
965 |
#else
|
948 |
966 |
chEvtRegisterMaskWithFlags(&aos.events.io, &_eventListenerIO, IOEVENT_MASK, MODULE_SSSP_EVENTFLAGS_PD | MODULE_SSSP_EVENTFLAGS_SYNC | MODULE_SSSP_EVENTFLAGS_DN | MODULE_SSSP_EVENTFLAGS_UP);
|
949 |
967 |
#endif
|
950 |
|
#else /* AMIROOS_CFG_SSSP_ENABLE == false */
|
951 |
|
chEvtRegisterMask(&aos.events.io, &_eventListenerIO, IOEVENT_MASK);
|
952 |
|
#endif /* AMIROOS_CFG_SSSP_ENABLE */
|
|
968 |
#endif /* AMIROOS_CFG_SSSP_ENABLE == true */
|
953 |
969 |
chEvtRegisterMask(&aos.events.os, &_eventListenerOS, OSEVENT_MASK);
|
954 |
970 |
|
955 |
971 |
#if defined(AMIROOS_CFG_MAIN_INIT_HOOK_5)
|
... | ... | |
1186 |
1202 |
// evaluate flags
|
1187 |
1203 |
eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
|
1188 |
1204 |
switch (eventflags) {
|
|
1205 |
#if (AMIROOS_CFG_SSSP_ENABLE == true)
|
1189 |
1206 |
case AOS_SYSTEM_EVENTFLAGS_HIBERNATE:
|
1190 |
1207 |
shutdown = AOS_SHUTDOWN_HIBERNATE;
|
1191 |
1208 |
break;
|
... | ... | |
1198 |
1215 |
case AOS_SYSTEM_EVENTFLAGS_RESTART:
|
1199 |
1216 |
shutdown = AOS_SHUTDOWN_RESTART;
|
1200 |
1217 |
break;
|
|
1218 |
#else /* AMIROOS_CFG_SSSP_ENABLE == false */
|
|
1219 |
case AOS_SYSTEM_EVENTFLAGS_SHUTDOWN:
|
|
1220 |
shutdown = AOS_SHUTDOWN_DEFAULT;
|
|
1221 |
break;
|
|
1222 |
#endif /* AMIROOS_CFG_SSSP_ENABLE */
|
1201 |
1223 |
default:
|
1202 |
1224 |
_unexpectedEventError(eventmask, eventflags);
|
1203 |
1225 |
break;
|