Revision c53ef0b1 core/src/aos_main.cpp
core/src/aos_main.cpp | ||
---|---|---|
49 | 49 |
|
50 | 50 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__) |
51 | 51 |
|
52 |
|
|
53 |
#if (AMIROOS_CFG_SSSP_MSI == true) || defined(__DOXYGEN__) |
|
54 |
|
|
55 |
/** |
|
56 |
* @brief Event mask to identify SSSP timeout events (MSI only). |
|
57 |
*/ |
|
58 |
#define EVENTMASK_SSSPTIMEOUT EVENT_MASK(2) |
|
59 |
|
|
60 |
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */ |
|
61 |
|
|
52 | 62 |
/** |
53 |
* @brief Event mask to identify SSSP timer events.
|
|
63 |
* @brief Event mask to identify SSSP delay events.
|
|
54 | 64 |
*/ |
55 |
#define EVENTMASK_SSSPTIMER EVENT_MASK(2)
|
|
65 |
#define EVENTMASK_SSSPDELAY EVENT_MASK(3)
|
|
56 | 66 |
|
57 | 67 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
58 | 68 |
|
... | ... | |
273 | 283 |
/* event associations */ |
274 | 284 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
275 | 285 |
{ |
276 |
eventflags_t flagsmask = AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK | MODULE_SSSP_EVENTFLAG_PD | MODULE_SSSP_EVENTFLAG_S;
|
|
286 |
eventflags_t flagsmask = AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK | moduleSsspEventflagPD() | moduleSsspEventflagS();
|
|
277 | 287 |
#if (AMIROOS_CFG_SSSP_MSI == true) |
278 | 288 |
#if (AMIROOS_CFG_SSSP_STACK_START != true) |
279 |
flagsmask |= MODULE_SSSP_EVENTFLAG_DN;
|
|
289 |
flagsmask |= moduleSsspEventflagDN();
|
|
280 | 290 |
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */ |
281 | 291 |
#if (AMIROOS_CFG_SSSP_STACK_END != true) |
282 |
flagsmask |= MODULE_SSSP_EVENTFLAG_UP;
|
|
292 |
flagsmask |= moduleSsspEventflagUP();
|
|
283 | 293 |
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */ |
284 | 294 |
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */ |
285 | 295 |
chEvtRegisterMaskWithFlags(&aos.events.gpio, &_eventListenerGPIO, EVENTMASK_GPIO, flagsmask); |
... | ... | |
305 | 315 |
|
306 | 316 |
// proceed to startup stage 1.2 |
307 | 317 |
#if (AMIROOS_CFG_SSSP_MASTER == true) |
308 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
|
|
318 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, EVENTMASK_SSSPDELAY, &eventmask) != AOS_SUCCESS)) {
|
|
309 | 319 |
/* |
310 | 320 |
* This code is executed if the received event was not about the delay. |
311 | 321 |
* The received event could be casued by any listener. |
... | ... | |
314 | 324 |
if (eventmask & _eventListenerGPIO.events) { |
315 | 325 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO); |
316 | 326 |
// PD event |
317 |
if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
|
|
327 |
if (eventflags & moduleSsspEventflagPD()) {
|
|
318 | 328 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
319 | 329 |
} else { |
320 | 330 |
#if defined(MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK) |
... | ... | |
339 | 349 |
} |
340 | 350 |
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
341 | 351 |
if (shutdown == AOS_SHUTDOWN_NONE) { |
342 |
aosSsspProceed(NULL, 0, 0, NULL);
|
|
352 |
aosSsspProceed(NULL, 0, NULL); |
|
343 | 353 |
aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_1_2); |
344 | 354 |
} |
345 | 355 |
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
346 | 356 |
|
347 | 357 |
// proceed to startup stage 1.3 |
348 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
|
|
358 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) { |
|
349 | 359 |
/* |
350 | 360 |
* This code is executed if the received event was not about a deactivation of the snychronization signal. |
351 | 361 |
* The received event could be caused by any listener. |
... | ... | |
354 | 364 |
if (eventmask & _eventListenerGPIO.events) { |
355 | 365 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO); |
356 | 366 |
// PD event |
357 |
if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
|
|
367 |
if (eventflags & moduleSsspEventflagPD()) {
|
|
358 | 368 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
359 | 369 |
} else { |
360 | 370 |
#if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) |
... | ... | |
380 | 390 |
|
381 | 391 |
// proceed to startup stage 2.1 |
382 | 392 |
#if (AMIROOS_CFG_SSSP_MASTER == true) |
383 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
|
|
393 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, EVENTMASK_SSSPDELAY, &eventmask) != AOS_SUCCESS)) {
|
|
384 | 394 |
/* |
385 | 395 |
* This code is executed if the received event was not about the delay. |
386 | 396 |
* The received event could be caused by any listener. |
... | ... | |
389 | 399 |
if (eventmask & _eventListenerGPIO.events) { |
390 | 400 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO); |
391 | 401 |
// PD event |
392 |
if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
|
|
402 |
if (eventflags & moduleSsspEventflagPD()) {
|
|
393 | 403 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
394 | 404 |
} else { |
395 | 405 |
#if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) |
... | ... | |
410 | 420 |
} |
411 | 421 |
} |
412 | 422 |
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
413 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
|
|
423 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) { |
|
414 | 424 |
/* |
415 | 425 |
* This code is executed if the received event was not about a deactivation of the snychronization signal. |
416 | 426 |
* The received event could be caused by any listener. |
... | ... | |
419 | 429 |
if (eventmask & _eventListenerGPIO.events) { |
420 | 430 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO); |
421 | 431 |
// PD event |
422 |
if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
|
|
432 |
if (eventflags & moduleSsspEventflagPD()) {
|
|
423 | 433 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
424 | 434 |
} else { |
425 | 435 |
#if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK) |
... | ... | |
525 | 535 |
|
526 | 536 |
// proceed to startup stage 2.2 |
527 | 537 |
#if (AMIROOS_CFG_SSSP_MASTER == true) |
528 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
|
|
538 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, EVENTMASK_SSSPDELAY, &eventmask) != AOS_SUCCESS)) {
|
|
529 | 539 |
/* |
530 | 540 |
* This code is executed if the received event was not about the delay. |
531 | 541 |
* The received event could be caused by any listener. |
... | ... | |
534 | 544 |
if (eventmask & _eventListenerGPIO.events) { |
535 | 545 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO); |
536 | 546 |
// PD event |
537 |
if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
|
|
547 |
if (eventflags & moduleSsspEventflagPD()) {
|
|
538 | 548 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
539 | 549 |
} else { |
540 | 550 |
#if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK) |
... | ... | |
559 | 569 |
} |
560 | 570 |
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
561 | 571 |
if (shutdown == AOS_SHUTDOWN_NONE) { |
562 |
aosSsspProceed(NULL, 0, 0, NULL);
|
|
572 |
aosSsspProceed(NULL, 0, NULL); |
|
563 | 573 |
aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_2_2); |
564 | 574 |
} |
565 | 575 |
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
566 | 576 |
|
567 | 577 |
// proceed to startup stage 3 (MSI is enabled), or to operation phase (no MSI) |
568 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
|
|
578 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) { |
|
569 | 579 |
/* |
570 | 580 |
* This code is executed if the received event was not about a deactivation of the snychronization signal. |
571 | 581 |
* The received event could be caused by any listener. |
... | ... | |
574 | 584 |
if (eventmask & _eventListenerGPIO.events) { |
575 | 585 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO); |
576 | 586 |
// PD event |
577 |
if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
|
|
587 |
if (eventflags & moduleSsspEventflagPD()) {
|
|
578 | 588 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
579 | 589 |
} else { |
580 | 590 |
#if defined(MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK) |
... | ... | |
596 | 606 |
} |
597 | 607 |
if (shutdown == AOS_SHUTDOWN_NONE) { |
598 | 608 |
#if (AMIROOS_CFG_SSSP_MSI == true) |
599 |
aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_1);
|
|
609 |
aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3); |
|
600 | 610 |
#else /* (AMIROOS_CFG_SSSP_MSI == true) */ |
601 | 611 |
aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_OPERATION); |
602 | 612 |
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */ |
... | ... | |
607 | 617 |
*/ |
608 | 618 |
|
609 | 619 |
#if (AMIROOS_CFG_SSSP_MSI == true) |
610 |
|
|
611 |
//TODO: MSI |
|
620 |
{ |
|
621 |
// initialize temporary MSI data |
|
622 |
aos_ssspmsidata_t msidata; |
|
623 |
aosSsspMsiInit(&msidata, EVENTMASK_SSSPDELAY, EVENTMASK_SSSPTIMEOUT, &_eventListenerGPIO); |
|
624 |
|
|
625 |
// execute module stack initialization (MSI) but react to unrelated events as well |
|
626 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (aos.sssp.stage != AOS_SSSP_STAGE_OPERATION)) { |
|
627 |
// execute MSI routine |
|
628 |
aosSsspMsi(&msidata, &eventmask); |
|
629 |
// handly event (if any) |
|
630 |
if (eventmask) { |
|
631 |
// GPIO event |
|
632 |
if (eventmask & _eventListenerGPIO.events) { |
|
633 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO); |
|
634 |
// PD event |
|
635 |
if (eventflags & moduleSsspEventflagPD()) { |
|
636 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
|
637 |
} else { |
|
638 |
#if defined(MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK) |
|
639 |
MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK(eventmask, eventflags); |
|
640 |
#else /* defined(MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK) */ |
|
641 |
/* silently ignore any other GPIO events */ |
|
642 |
#endif /* defined(MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK) */ |
|
643 |
} |
|
644 |
} |
|
645 |
// OS event |
|
646 |
else if (eventmask & _eventListenerOS.events) { |
|
647 |
eventflags = chEvtGetAndClearFlags(&_eventListenerOS); |
|
648 |
_unexpectedEventError(eventmask, eventflags); |
|
649 |
} |
|
650 |
// unknown event |
|
651 |
else { |
|
652 |
_unexpectedEventError(eventmask, 0); |
|
653 |
} |
|
654 |
} |
|
655 |
} |
|
656 |
} |
|
612 | 657 |
|
613 | 658 |
#if (HAL_USE_RTC == TRUE) |
614 | 659 |
|
... | ... | |
640 | 685 |
|
641 | 686 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
642 | 687 |
/* ignore all SSSP signal events, except for PD and configured events */ |
643 |
eventflags = MODULE_SSSP_EVENTFLAG_S;
|
|
688 |
eventflags = moduleSsspEventflagS();
|
|
644 | 689 |
#if (AMIROOS_CFG_SSSP_MSI == true) |
645 | 690 |
#if (AMIROOS_CFG_SSSP_STACK_START != true) |
646 |
eventflags |= MODULE_SSSP_EVENTFLAG_DN;
|
|
691 |
eventflags |= moduleSsspEventflagDN();
|
|
647 | 692 |
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */ |
648 | 693 |
#if (AMIROOS_CFG_SSSP_STACK_END != true) |
649 |
eventflags |= MODULE_SSSP_EVENTFLAG_UP;
|
|
694 |
eventflags |= moduleSsspEventflagUP();
|
|
650 | 695 |
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */ |
651 | 696 |
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */ |
652 | 697 |
eventflags &= ~((eventflags_t)AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK); |
... | ... | |
677 | 722 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO); |
678 | 723 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
679 | 724 |
// PD event |
680 |
if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
|
|
725 |
if (eventflags & moduleSsspEventflagPD()) {
|
|
681 | 726 |
aosSsspShutdownInit(false); |
682 | 727 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
683 | 728 |
} |
... | ... | |
742 | 787 |
* Note that events for the optional signals UP and DN are not enabled as they are not utilized during SSSP shutdown phase. |
743 | 788 |
*/ |
744 | 789 |
chSysLock(); |
745 |
_eventListenerGPIO.wflags |= MODULE_SSSP_EVENTFLAG_S;
|
|
790 |
_eventListenerGPIO.wflags |= moduleSsspEventflagS();
|
|
746 | 791 |
chSysUnlock(); |
747 | 792 |
|
748 | 793 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
... | ... | |
816 | 861 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
817 | 862 |
|
818 | 863 |
// proceed to SSSP shutdown stage 1.3 |
819 |
aosSsspProceed(NULL, 0, 0, NULL);
|
|
864 |
aosSsspProceed(NULL, 0, NULL); |
|
820 | 865 |
aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_1_3); |
821 | 866 |
|
822 | 867 |
#if (AMIROOS_CFG_SSSP_SHUTDOWN == true) |
... | ... | |
828 | 873 |
*/ |
829 | 874 |
|
830 | 875 |
// proceed to SSSP shutdown stage 2.1 |
831 |
while (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS) {
|
|
876 |
while (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS) { |
|
832 | 877 |
/* |
833 | 878 |
* This code is executed if the received event was not about a deactivation of the synchronization signal. |
834 | 879 |
* The received event could be caused by any listener. |
... | ... | |
855 | 900 |
aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_1); |
856 | 901 |
|
857 | 902 |
// proceed to SSSP shutdown stage 2.2 |
858 |
aosSsspProceed(NULL, 0, 0, &eventmask);
|
|
903 |
aosSsspProceed(NULL, 0, &eventmask); |
|
859 | 904 |
aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_2); |
860 | 905 |
if (shutdown == AOS_SHUTDOWN_PASSIVE) { |
861 | 906 |
aosDbgPrintf("%s request received\n", eventmask ? "shutdown" : "restart"); |
... | ... | |
875 | 920 |
unsigned int identifier = 0; |
876 | 921 |
|
877 | 922 |
// receive the identifier, which specifies the type of shutdown/restart |
878 |
while ((eventmask = aosSsspShutdownWaitForIdentifierPulse(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_SSSPTIMER, &identifier)) != EVENTMASK_SSSPTIMER) {
|
|
923 |
while ((eventmask = aosSsspShutdownWaitForIdentifierPulse(&_eventListenerGPIO, moduleSsspEventflagS(), EVENTMASK_SSSPDELAY, &identifier)) != EVENTMASK_SSSPDELAY) {
|
|
879 | 924 |
// GPIO event |
880 | 925 |
if (eventmask & _eventListenerGPIO.events) { |
881 | 926 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO); |
... | ... | |
901 | 946 |
} |
902 | 947 |
|
903 | 948 |
// proceed to SSSP shutdown stage 2.3 |
904 |
aosSsspProceed(NULL, 0, 0, NULL);
|
|
949 |
aosSsspProceed(NULL, 0, NULL); |
|
905 | 950 |
aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_3); |
906 | 951 |
|
907 | 952 |
/* |
Also available in: Unified diff