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