Revision 1a8fb642 core/src/aos_main.cpp
core/src/aos_main.cpp | ||
---|---|---|
40 | 40 |
/******************************************************************************/ |
41 | 41 |
|
42 | 42 |
/** |
43 |
* @brief Event mask to identify I/O events.
|
|
43 |
* @brief Event mask to identify GPIO events.
|
|
44 | 44 |
*/ |
45 |
#define IOEVENT_MASK EVENT_MASK(0)
|
|
45 |
#define GPIOEVENT_MASK EVENT_MASK(0)
|
|
46 | 46 |
|
47 | 47 |
/** |
48 | 48 |
* @brief Event mask to identify OS events. |
... | ... | |
116 | 116 |
/******************************************************************************/ |
117 | 117 |
|
118 | 118 |
/** |
119 |
* @brief Listener object for I/O events.
|
|
119 |
* @brief Listener object for GPIO events.
|
|
120 | 120 |
*/ |
121 |
static event_listener_t _eventListenerIO; |
|
121 |
static event_listener_t _eventListenerGPIO;
|
|
122 | 122 |
|
123 | 123 |
/** |
124 | 124 |
* @brief Listener object for OS events. |
... | ... | |
126 | 126 |
static event_listener_t _eventListenerOS; |
127 | 127 |
|
128 | 128 |
#if defined(MODULE_HAL_PROGIF) || defined(__DOXYGEN__) |
129 |
|
|
129 | 130 |
/** |
130 | 131 |
* @brief I/O channel for the programmer interface. |
131 | 132 |
*/ |
... | ... | |
444 | 445 |
continue; |
445 | 446 |
} |
446 | 447 |
// if an IO event occurred |
447 |
if (eventmask & _eventListenerIO.events) { |
|
448 |
ioflags = chEvtGetAndClearFlags(&_eventListenerIO); |
|
448 |
if (eventmask & _eventListenerGPIO.events) {
|
|
449 |
ioflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
|
|
449 | 450 |
aosDbgPrintf("INFO: IO evt (0x%08X)\n", ioflags); |
450 | 451 |
// a power-down event occurred |
451 |
if (ioflags & MODULE_SSSP_EVENTFLAGS_PD) {
|
|
452 |
if (ioflags & MODULE_SSSP_EVENTFLAG_PD) { |
|
452 | 453 |
aosDbgPrintf("PD evt\n"); |
453 | 454 |
// deactivate S and UP |
454 | 455 |
aosDbgPrintf("disabling S\n"); |
455 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
|
456 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF); |
|
456 | 457 |
#if (AMIROOS_CFG_SSSP_STACK_END != true) |
457 | 458 |
aosDbgPrintf("disabling UP\n"); |
458 |
apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
|
|
459 |
apalControlGpioSet(&moduleSsspGpioUP, APAL_GPIO_OFF);
|
|
459 | 460 |
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */ |
460 | 461 |
// set shutdown flag and exit the loop |
461 | 462 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
462 | 463 |
break; |
463 | 464 |
} |
464 | 465 |
// the S signal was deactivated |
465 |
if (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC) {
|
|
466 |
if (ioflags & MODULE_SSSP_EVENTFLAG_S) {
|
|
466 | 467 |
apalControlGpioState_t sstate; |
467 |
apalControlGpioGet(&moduleSsspGpioSync, &sstate);
|
|
468 |
apalControlGpioGet(&moduleSsspGpioS, &sstate); |
|
468 | 469 |
if (sstate == APAL_GPIO_ON) { |
469 | 470 |
aosDbgPrintf("S evt (enabled)\n"); |
470 | 471 |
} else { |
... | ... | |
541 | 542 |
} |
542 | 543 |
// activate S |
543 | 544 |
aosDbgPrintf("enabling S\n"); |
544 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
|
|
545 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_ON); |
|
545 | 546 |
#if (AMIROOS_CFG_SSSP_STACK_START == true) |
546 | 547 |
// proceed immediately |
547 | 548 |
stage = STAGE_3_2; |
... | ... | |
573 | 574 |
eventmask &= ~(eventListenerTimeout.events); |
574 | 575 |
// activate S |
575 | 576 |
aosDbgPrintf("enabling S\n"); |
576 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
|
|
577 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_ON); |
|
577 | 578 |
#if (AMIROOS_CFG_SSSP_STACK_START == true) |
578 | 579 |
// proceed |
579 | 580 |
stage = STAGE_3_2; |
... | ... | |
629 | 630 |
if (eventmask & eventListenerDelay.events) { |
630 | 631 |
// activate UP |
631 | 632 |
aosDbgPrintf("enabling UP\n"); |
632 |
apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
|
|
633 |
apalControlGpioSet(&moduleSsspGpioUP, APAL_GPIO_ON);
|
|
633 | 634 |
// deactivate S |
634 | 635 |
aosDbgPrintf("disabling S\n"); |
635 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
|
636 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF); |
|
636 | 637 |
// explicitely clear timeout event flag |
637 | 638 |
chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE); |
638 | 639 |
eventmask &= ~(eventListenerTimeout.events); |
... | ... | |
712 | 713 |
} |
713 | 714 |
|
714 | 715 |
// if an IO event was received (DN signal) |
715 |
if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_DN)) {
|
|
716 |
if ((eventmask & _eventListenerGPIO.events) && (ioflags & MODULE_SSSP_EVENTFLAG_DN)) {
|
|
716 | 717 |
aosDbgPrintf("DN evt\n"); |
717 | 718 |
// reset timeout timer |
718 | 719 |
chVTReset(&timerTimeout); |
... | ... | |
737 | 738 |
#if (AMIROOS_CFG_SSSP_STACK_END != true) |
738 | 739 |
// activate UP |
739 | 740 |
aosDbgPrintf("enabling UP\n"); |
740 |
apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_ON);
|
|
741 |
apalControlGpioSet(&moduleSsspGpioUP, APAL_GPIO_ON);
|
|
741 | 742 |
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */ |
742 | 743 |
// deactivate S |
743 | 744 |
aosDbgPrintf("disabling S\n"); |
744 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
|
745 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF); |
|
745 | 746 |
// reset the timeout timer |
746 | 747 |
chVTSet(&timerTimeout, chTimeUS2I(AOS_SYSTEM_SSSP_TIMEOUT), _ssspTimerCallback, &eventSourceTimeout); |
747 | 748 |
chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE); |
... | ... | |
787 | 788 |
aos.sssp.stage = AOS_SSSP_STARTUP_3_4; |
788 | 789 |
|
789 | 790 |
// if an IO event was received (S signal) |
790 |
if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC)) {
|
|
791 |
if ((eventmask & _eventListenerGPIO.events) && (ioflags & MODULE_SSSP_EVENTFLAG_S)) {
|
|
791 | 792 |
// reset the timeout timer |
792 | 793 |
chVTReset(&timerTimeout); |
793 | 794 |
chEvtWaitAnyTimeout(eventListenerTimeout.events, TIME_IMMEDIATE); |
... | ... | |
843 | 844 |
|
844 | 845 |
// deactivate S |
845 | 846 |
aosDbgPrintf("disabling SYNC\n"); |
846 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
|
847 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF); |
|
847 | 848 |
// invalidate module ID |
848 | 849 |
aos.sssp.moduleId = 0; |
849 | 850 |
|
850 | 851 |
// if an IO event was received (S signal) |
851 |
if ((eventmask & _eventListenerIO.events) && (ioflags & MODULE_SSSP_EVENTFLAGS_SYNC)) {
|
|
852 |
if ((eventmask & _eventListenerGPIO.events) && (ioflags & MODULE_SSSP_EVENTFLAG_S)) {
|
|
852 | 853 |
aosDbgPrintf("sequence aborted\n"); |
853 | 854 |
// exit the sequence |
854 | 855 |
flags.loop = false; |
... | ... | |
886 | 887 |
// reset all control signals |
887 | 888 |
#if (AMIROOS_CFG_SSSP_STACK_END != true) |
888 | 889 |
aosDbgPrintf("disabling UP\n"); |
889 |
apalControlGpioSet(&moduleSsspGpioUp, APAL_GPIO_OFF);
|
|
890 |
apalControlGpioSet(&moduleSsspGpioUP, APAL_GPIO_OFF);
|
|
890 | 891 |
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */ |
891 | 892 |
aosDbgPrintf("disabling S\n"); |
892 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
|
893 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF); |
|
893 | 894 |
aosSysGetUptime(&uptime); |
894 | 895 |
aosDbgPrintf("done\t%04ums\n", (uint32_t)(uptime / MICROSECONDS_PER_MILLISECOND)); |
895 | 896 |
|
... | ... | |
905 | 906 |
// local variables |
906 | 907 |
eventmask_t eventmask = 0; |
907 | 908 |
eventflags_t eventflags = 0; |
908 |
eventflags_t ioeventflagsmask = AMIROOS_CFG_MAIN_LOOP_IOEVENT_MASK;
|
|
909 |
eventflags_t gpioeventflagsmask = AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK;
|
|
909 | 910 |
aos_shutdown_t shutdown = AOS_SHUTDOWN_NONE; |
910 | 911 |
#if defined(AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES) |
911 | 912 |
AMIROOS_CFG_MAIN_EXTRA_THREAD_VARIABLES |
... | ... | |
977 | 978 |
|
978 | 979 |
/* event associations */ |
979 | 980 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
980 |
ioeventflagsmask |= MODULE_SSSP_EVENTFLAGS_PD | MODULE_SSSP_EVENTFLAGS_SYNC;
|
|
981 |
gpioeventflagsmask |= MODULE_SSSP_EVENTFLAG_PD | MODULE_SSSP_EVENTFLAG_S;
|
|
981 | 982 |
#if (AMIROOS_CFG_SSSP_STACK_START != true) |
982 |
ioeventflagsmask |= MODULE_SSSP_EVENTFLAGS_DN;
|
|
983 |
gpioeventflagsmask |= MODULE_SSSP_EVENTFLAG_DN;
|
|
983 | 984 |
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */ |
984 | 985 |
#if (AMIROOS_CFG_SSSP_STACK_END != true) |
985 |
ioeventflagsmask |= MODULE_SSSP_EVENTFLAGS_UP;
|
|
986 |
gpioeventflagsmask |= MODULE_SSSP_EVENTFLAG_UP;
|
|
986 | 987 |
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */ |
987 | 988 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
988 |
if (ioeventflagsmask != 0) { |
|
989 |
chEvtRegisterMaskWithFlags(&aos.events.io, &_eventListenerIO, IOEVENT_MASK, ioeventflagsmask);
|
|
989 |
if (gpioeventflagsmask != 0) {
|
|
990 |
chEvtRegisterMaskWithFlags(&aos.events.gpio, &_eventListenerGPIO, GPIOEVENT_MASK, gpioeventflagsmask);
|
|
990 | 991 |
} |
991 | 992 |
chEvtRegisterMask(&aos.events.os, &_eventListenerOS, OSEVENT_MASK); |
992 | 993 |
|
... | ... | |
1073 | 1074 |
|
1074 | 1075 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
1075 | 1076 |
/* SSSP startup OS synchronization phase (end of startup stage 2) */ |
1076 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (eventmask = aosSysSsspStartupOsInitSyncCheck(&_eventListenerIO)) != 0) { |
|
1077 |
while ((shutdown == AOS_SHUTDOWN_NONE) && (eventmask = aosSysSsspStartupOsInitSyncCheck(&_eventListenerGPIO)) != 0) {
|
|
1077 | 1078 |
/* |
1078 | 1079 |
* This code is executed if the received event was not about the SYS_SYNC control signal. |
1079 | 1080 |
* The returned event could be caused by any listener (not only the argument). |
1080 | 1081 |
*/ |
1081 |
// IO event |
|
1082 |
if (eventmask & _eventListenerIO.events) { |
|
1083 |
eventflags = chEvtGetAndClearFlags(&_eventListenerIO); |
|
1082 |
// GPIO event
|
|
1083 |
if (eventmask & _eventListenerGPIO.events) {
|
|
1084 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
|
|
1084 | 1085 |
// PD event |
1085 |
if (eventflags & MODULE_SSSP_EVENTFLAGS_PD) {
|
|
1086 |
if (eventflags & MODULE_SSSP_EVENTFLAG_PD) { |
|
1086 | 1087 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
1087 | 1088 |
} else { |
1088 | 1089 |
#if defined(MODULE_SSSP_STARTUP_2_2_IOEVENT_HOOK) |
... | ... | |
1225 | 1226 |
#endif /* defined(AMIROOS_CFG_MAIN_LOOP_HOOK_0) */ |
1226 | 1227 |
|
1227 | 1228 |
switch (eventmask) { |
1228 |
// if this was an I/O event
|
|
1229 |
case IOEVENT_MASK: |
|
1229 |
// if this was an GPIO event
|
|
1230 |
case GPIOEVENT_MASK:
|
|
1230 | 1231 |
// evaluate flags |
1231 |
eventflags = chEvtGetAndClearFlags(&_eventListenerIO); |
|
1232 |
eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
|
|
1232 | 1233 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
1233 | 1234 |
// PD event |
1234 |
if (eventflags & MODULE_SSSP_EVENTFLAGS_PD) {
|
|
1235 |
if (eventflags & MODULE_SSSP_EVENTFLAG_PD) { |
|
1235 | 1236 |
shutdown = AOS_SHUTDOWN_PASSIVE; |
1236 | 1237 |
} |
1237 | 1238 |
// all other events |
1238 |
#if defined(MODULE_MAIN_LOOP_IO_EVENT)
|
|
1239 |
#if defined(MODULE_MAIN_LOOP_GPIOEVENT)
|
|
1239 | 1240 |
else { |
1240 |
MODULE_MAIN_LOOP_IO_EVENT(eventflags);
|
|
1241 |
MODULE_MAIN_LOOP_GPIOEVENT(eventflags);
|
|
1241 | 1242 |
} |
1242 |
#endif /* defined(MODULE_MAIN_LOOP_IO_EVENT) */
|
|
1243 |
#endif /* defined(MODULE_MAIN_LOOP_GPIOEVENT) */
|
|
1243 | 1244 |
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
1244 |
#if defined(MODULE_MAIN_LOOP_IO_EVENT)
|
|
1245 |
MODULE_MAIN_LOOP_IO_EVENT(eventflags);
|
|
1246 |
#endif /* defined(MODULE_MAIN_LOOP_IO_EVENT) */
|
|
1245 |
#if defined(MODULE_MAIN_LOOP_GPIOEVENT)
|
|
1246 |
MODULE_MAIN_LOOP_GPIOEVENT(eventflags);
|
|
1247 |
#endif /* defined(MODULE_MAIN_LOOP_GPIOEVENT) */
|
|
1247 | 1248 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
1248 | 1249 |
break; |
1249 | 1250 |
|
Also available in: Unified diff