Revision cda14729 core/src/aos_system.c
core/src/aos_system.c | ||
---|---|---|
84 | 84 |
/* |
85 | 85 |
* forward declarations |
86 | 86 |
*/ |
87 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
|
|
87 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__) |
|
88 | 88 |
static int _shellcmd_configcb(BaseSequentialStream* stream, int argc, char* argv[]); |
89 | 89 |
static int _shellcmd_infocb(BaseSequentialStream* stream, int argc, char* argv[]); |
90 | 90 |
static int _shellcmd_shutdowncb(BaseSequentialStream* stream, int argc, char* argv[]); |
91 | 91 |
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__) |
92 | 92 |
static int _shellcmd_kerneltestcb(BaseSequentialStream* stream, int argc, char* argv[]); |
93 | 93 |
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */ |
94 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
|
|
94 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */ |
|
95 | 95 |
|
96 | 96 |
/** |
97 | 97 |
* @brief Timer to accumulate system uptime. |
... | ... | |
108 | 108 |
*/ |
109 | 109 |
static systime_t _synctime; |
110 | 110 |
|
111 |
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER == true)) || defined(__DOXYGEN__) |
|
111 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__) |
|
112 |
#if (AMIROOS_CFG_SSSP_MASTER == true) || defined(__DOXYGEN__) |
|
113 |
|
|
112 | 114 |
/** |
113 | 115 |
* @brief Timer to drive the SYS_SYNC signal for system wide time synchronization according to SSSP. |
114 | 116 |
*/ |
... | ... | |
118 | 120 |
* @brief Last uptime of system wide time synchronization. |
119 | 121 |
*/ |
120 | 122 |
static aos_timestamp_t _syssynctime; |
121 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER == true) */ |
|
122 | 123 |
|
123 |
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true)) || defined(__DOXYGEN__) |
|
124 |
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
|
125 |
|
|
126 |
#if ((AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true)) || defined(__DOXYGEN__) |
|
127 |
|
|
124 | 128 |
/** |
125 | 129 |
* @brief Offset between local clock and system wide synchronization signal. |
126 | 130 |
*/ |
127 | 131 |
static float _syssyncskew; |
128 | 132 |
|
129 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) */ |
|
133 |
#endif /* (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) */ |
|
134 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
135 |
|
|
136 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__) |
|
130 | 137 |
|
131 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__) |
|
132 | 138 |
/** |
133 | 139 |
* @brief Shell thread working area. |
134 | 140 |
*/ |
... | ... | |
157 | 163 |
/** |
158 | 164 |
* @brief Shell command to shutdown the system. |
159 | 165 |
*/ |
160 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
166 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
|
|
161 | 167 |
static AOS_SHELL_COMMAND(_shellcmd_shutdown, "system:shutdown", _shellcmd_shutdowncb); |
162 | 168 |
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
163 | 169 |
static AOS_SHELL_COMMAND(_shellcmd_shutdown, "module:shutdown", _shellcmd_shutdowncb); |
164 | 170 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
165 | 171 |
|
166 | 172 |
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__) |
173 |
|
|
167 | 174 |
/** |
168 | 175 |
* @brief Shell kommand to run a test of the ChibiOS/RT kernel. |
169 | 176 |
*/ |
170 | 177 |
static AOS_SHELL_COMMAND(_shellcmd_kerneltest, "kernel:test", _shellcmd_kerneltestcb); |
178 |
|
|
171 | 179 |
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */ |
172 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
|
|
180 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */ |
|
173 | 181 |
|
174 | 182 |
/******************************************************************************/ |
175 | 183 |
/* LOCAL FUNCTIONS */ |
... | ... | |
261 | 269 |
_printSystemInfoLine(stream, "Architecture", SYSTEM_INFO_NAMEWIDTH, "%s", PORT_ARCHITECTURE_NAME); |
262 | 270 |
_printSystemInfoSeparator(stream, '-', SYSTEM_INFO_WIDTH); |
263 | 271 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
264 |
_printSystemInfoLine(stream, "AMiRo-OS" , SYSTEM_INFO_NAMEWIDTH, "%u.%u.%u %s (SSSP %u.%u)", AMIROOS_VERSION_MAJOR, AMIROOS_VERSION_MINOR, AMIROOS_VERSION_PATCH, AMIROOS_RELEASE_TYPE, AOS_SYSTEM_SSSP_VERSION_MAJOR, AOS_SYSTEM_SSSP_VERSION_MINOR);
|
|
272 |
_printSystemInfoLine(stream, "AMiRo-OS" , SYSTEM_INFO_NAMEWIDTH, "%u.%u.%u %s (SSSP %u.%u)", AMIROOS_VERSION_MAJOR, AMIROOS_VERSION_MINOR, AMIROOS_VERSION_PATCH, AMIROOS_RELEASE_TYPE, AOS_SSSP_VERSION_MAJOR, AOS_SSSP_VERSION_MINOR);
|
|
265 | 273 |
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
266 | 274 |
_printSystemInfoLine(stream, "AMiRo-OS" , SYSTEM_INFO_NAMEWIDTH, "%u.%u.%u %s", AMIROOS_VERSION_MAJOR, AMIROOS_VERSION_MINOR, AMIROOS_VERSION_PATCH, AMIROOS_RELEASE_TYPE); |
267 | 275 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
... | ... | |
273 | 281 |
_printSystemInfoLine(stream, "Compiled" , SYSTEM_INFO_NAMEWIDTH, "%s - %s", __DATE__, __TIME__); |
274 | 282 |
|
275 | 283 |
// print static information about the bootloader |
284 |
#if (AMIROOS_CFG_BOOTLOADER != AOS_BOOTLOADER_NONE) |
|
276 | 285 |
_printSystemInfoSeparator(stream, '-', SYSTEM_INFO_WIDTH); |
286 |
#endif /* (AMIROOS_CFG_BOOTLOADER != AOS_BOOTLOADER_NONE) */ |
|
287 |
#if (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT) |
|
277 | 288 |
if (BL_CALLBACK_TABLE_ADDRESS->magicNumber == BL_MAGIC_NUMBER) { |
278 | 289 |
_printSystemInfoLine(stream, "AMiRo-BLT", SYSTEM_INFO_NAMEWIDTH, "%u.%u.%u %s (SSSP %u.%u)", BL_CALLBACK_TABLE_ADDRESS->vBootloader.major, BL_CALLBACK_TABLE_ADDRESS->vBootloader.minor, BL_CALLBACK_TABLE_ADDRESS->vBootloader.patch, |
279 | 290 |
(BL_CALLBACK_TABLE_ADDRESS->vBootloader.identifier == BL_VERSION_ID_AMiRoBLT_Release) ? "stable" : |
... | ... | |
284 | 295 |
"<release type unknown>", |
285 | 296 |
BL_CALLBACK_TABLE_ADDRESS->vSSSP.major, BL_CALLBACK_TABLE_ADDRESS->vSSSP.minor); |
286 | 297 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
287 |
if (BL_CALLBACK_TABLE_ADDRESS->vSSSP.major != AOS_SYSTEM_SSSP_VERSION_MAJOR) { |
|
288 |
if (stream) { |
|
289 |
chprintf(stream, "WARNING: Bootloader and AMiRo-OS implement incompatible SSSP versions!\n"); |
|
290 |
} else { |
|
291 |
aosprintf("WARNING: Bootloader and AMiRo-OS implement incompatible SSSP versions!\n"); |
|
292 |
} |
|
298 |
if (BL_CALLBACK_TABLE_ADDRESS->vSSSP.major != AOS_SSSP_VERSION_MAJOR) { |
|
299 |
const char* msg = "WARNING: AMiRo-BLT and AMiRo-OS implement incompatible SSSP versions!\n"; |
|
300 |
stream ? chprintf(stream, msg) : aosprintf(msg); |
|
293 | 301 |
} |
294 | 302 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
295 | 303 |
_printSystemInfoLine(stream, "Compiler", SYSTEM_INFO_NAMEWIDTH, "%s %u.%u.%u", (BL_CALLBACK_TABLE_ADDRESS->vCompiler.identifier == BL_VERSION_ID_GCC) ? "GCC" : "<compiler unknown>", BL_CALLBACK_TABLE_ADDRESS->vCompiler.major, BL_CALLBACK_TABLE_ADDRESS->vCompiler.minor, BL_CALLBACK_TABLE_ADDRESS->vCompiler.patch); // TODO: support other compilers than GCC |
296 | 304 |
} else { |
297 |
if (stream) { |
|
298 |
chprintf(stream, "Bootloader incompatible or not available.\n"); |
|
299 |
} else { |
|
300 |
aosprintf("Bootloader incompatible or not available.\n"); |
|
301 |
} |
|
305 |
const char* msg = "WARNING: AMiRo-BLT incompatible or not available.\n"; |
|
306 |
stream ? chprintf(stream, "%s", msg) : aosprintf("%s", msg); |
|
302 | 307 |
} |
308 |
#endif /* (AMIROOS_CFG_BOOTLOADER == X) */ |
|
303 | 309 |
|
304 | 310 |
// print dynamic information about the module |
305 | 311 |
_printSystemInfoSeparator(stream, '-', SYSTEM_INFO_WIDTH); |
306 | 312 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
313 |
#if (AMIROOS_CFG_SSSP_MSI == true) |
|
307 | 314 |
if (aos.sssp.moduleId != 0) { |
308 | 315 |
_printSystemInfoLine(stream, "Module ID", SYSTEM_INFO_NAMEWIDTH, "%u", aos.sssp.moduleId); |
309 | 316 |
} else { |
310 | 317 |
_printSystemInfoLine(stream, "Module ID", SYSTEM_INFO_NAMEWIDTH, "not available"); |
311 | 318 |
} |
319 |
#else /* (AMIROOS_CFG_SSSP_MSI == true) */ |
|
320 |
_printSystemInfoLine(stream, "Module ID", SYSTEM_INFO_NAMEWIDTH, "not available"); |
|
321 |
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */ |
|
312 | 322 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
313 | 323 |
#if (HAL_USE_RTC == TRUE) |
314 | 324 |
_printSystemInfoLine(stream, "Date", SYSTEM_INFO_NAMEWIDTH, "%04u-%02u-%02u (%s)", |
... | ... | |
317 | 327 |
dt.tm_mday, |
318 | 328 |
(dt.tm_wday == 0) ? "Sunday" : (dt.tm_wday == 1) ? "Monday" : (dt.tm_wday == 2) ? "Tuesday" : (dt.tm_wday == 3) ? "Wednesday" : (dt.tm_wday == 4) ? "Thursday" : (dt.tm_wday == 5) ? "Friday" : "Saturday"); |
319 | 329 |
_printSystemInfoLine(stream, "Time", SYSTEM_INFO_NAMEWIDTH, "%02u:%02u:%02u", dt.tm_hour, dt.tm_min, dt.tm_sec); |
320 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) && (HAL_USE_CAN != TRUE) |
|
321 |
#if (AMIROOS_CFG_SSSP_MASTER == true) |
|
322 |
_printSystemInfoLine(stream, "", SYSTEM_INFO_NAMEWIDTH, "Date & Time were not synchronized to slave modules."); |
|
323 |
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
|
324 |
_printSystemInfoLine(stream, "", SYSTEM_INFO_NAMEWIDTH, "Date & Time were not synchronized from master module."); |
|
325 |
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
|
326 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (HAL_USE_CAN != TRUE) */ |
|
327 | 330 |
#endif /* (HAL_USE_RTC == TRUE) */ |
328 | 331 |
|
329 | 332 |
_printSystemInfoSeparator(stream, '=', SYSTEM_INFO_WIDTH); |
... | ... | |
331 | 334 |
return; |
332 | 335 |
} |
333 | 336 |
|
334 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
|
|
337 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__) |
|
335 | 338 |
/** |
336 | 339 |
* @brief Callback function for the system:config shell command. |
337 | 340 |
* |
... | ... | |
456 | 459 |
chprintf(stream, "unknown option '%s' or invalid value '%s'\n", argv[2], argv[3]); |
457 | 460 |
return AOS_INVALIDARGUMENTS; |
458 | 461 |
} |
459 |
dt.tm_wday = aosTimeDayOfWeekFromDate(dt.tm_mday, dt.tm_mon+1, dt.tm_year+1900) % 7;
|
|
462 |
dt.tm_wday = aosTimeDayOfWeekFromDate((uint16_t)dt.tm_mday, (uint8_t)dt.tm_mon+1, (uint16_t)dt.tm_year+1900) % DAYS_PER_WEEK;
|
|
460 | 463 |
aosSysSetDateTime(&dt); |
461 | 464 |
|
462 | 465 |
// read and print new date and time |
... | ... | |
554 | 557 |
} |
555 | 558 |
|
556 | 559 |
/** |
557 |
* @brief Callback function for the sytem:shutdown shell command. |
|
560 |
* @brief Callback function for the sytem:shutdown or module:shutdown shell command.
|
|
558 | 561 |
* |
559 | 562 |
* @param[in] stream The I/O stream to use. |
560 | 563 |
* @param[in] argc Number of arguments. |
... | ... | |
568 | 571 |
{ |
569 | 572 |
aosDbgCheck(stream != NULL); |
570 | 573 |
|
571 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
574 |
#if (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_NONE) |
|
575 |
|
|
576 |
(void)argv; |
|
577 |
(void)argc; |
|
578 |
|
|
579 |
// broadcast shutdown event |
|
580 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_MASK); |
|
581 |
// set terminate flag so no further prompt will be printed |
|
582 |
chThdTerminate(chThdGetSelfX()); |
|
583 |
|
|
584 |
return AOS_OK; |
|
585 |
|
|
586 |
#elif (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT) |
|
587 |
|
|
572 | 588 |
// print help text |
573 | 589 |
if (argc != 2 || strcmp(argv[1], "--help") == 0) { |
574 | 590 |
chprintf(stream, "Usage: %s OPTION\n", argv[0]); |
... | ... | |
592 | 608 |
// handle argument |
593 | 609 |
else { |
594 | 610 |
if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--hibernate") == 0) { |
595 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_HIBERNATE); |
|
611 |
// broadcast shutdown event |
|
612 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_HIBERNATE); |
|
613 |
// set terminate flag so no further prompt will be printed |
|
596 | 614 |
chThdTerminate(chThdGetSelfX()); |
597 | 615 |
return AOS_OK; |
598 | 616 |
} |
599 | 617 |
else if (strcmp(argv[1], "-d") == 0 || strcmp(argv[1], "--deepsleep") == 0) { |
600 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_DEEPSLEEP); |
|
618 |
// broadcast shutdown event |
|
619 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_DEEPSLEEP); |
|
620 |
// set terminate flag so no further prompt will be printed |
|
601 | 621 |
chThdTerminate(chThdGetSelfX()); |
602 | 622 |
return AOS_OK; |
603 | 623 |
} |
604 | 624 |
else if (strcmp(argv[1], "-t") == 0 || strcmp(argv[1], "--transportation") == 0) { |
605 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_TRANSPORTATION); |
|
625 |
// broadcast shutdown event |
|
626 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_TRANSPORTATION); |
|
627 |
// set terminate flag so no further prompt will be printed |
|
606 | 628 |
chThdTerminate(chThdGetSelfX()); |
607 | 629 |
return AOS_OK; |
608 | 630 |
} |
609 | 631 |
else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--restart") == 0) { |
610 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_RESTART); |
|
632 |
// broadcast shutdown event |
|
633 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_RESTART); |
|
634 |
// set terminate flag so no further prompt will be printed |
|
611 | 635 |
chThdTerminate(chThdGetSelfX()); |
612 | 636 |
return AOS_OK; |
613 | 637 |
} |
... | ... | |
616 | 640 |
return AOS_INVALIDARGUMENTS; |
617 | 641 |
} |
618 | 642 |
} |
619 |
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
620 |
(void)argv; |
|
621 |
(void)argc; |
|
622 | 643 |
|
623 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN); |
|
624 |
chThdTerminate(chThdGetSelfX()); |
|
625 |
return AOS_OK; |
|
626 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
644 |
#endif /* (AMIROOS_CFG_BOOTLOADER == X) */ |
|
627 | 645 |
} |
628 | 646 |
|
629 | 647 |
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__) |
648 |
|
|
630 | 649 |
/** |
631 | 650 |
* @brief Callback function for the kernel:test shell command. |
632 | 651 |
* |
... | ... | |
647 | 666 |
|
648 | 667 |
return retval; |
649 | 668 |
} |
669 |
|
|
650 | 670 |
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */ |
651 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
|
|
671 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */ |
|
652 | 672 |
|
653 | 673 |
// suppress warning in case no interrupt GPIOs are defined |
654 | 674 |
#pragma GCC diagnostic push |
... | ... | |
658 | 678 |
* |
659 | 679 |
* @param[in] args Pointer to the GPIO line identifier. |
660 | 680 |
*/ |
661 |
static void _extiCallback(void* args)
|
|
681 |
static void _gpioCallback(void* args)
|
|
662 | 682 |
{ |
663 | 683 |
aosDbgCheck((args != NULL) && (*((ioline_t*)args) != PAL_NOLINE) && (PAL_PAD(*((ioline_t*)args)) < sizeof(eventflags_t) * 8)); |
664 | 684 |
|
665 | 685 |
chSysLockFromISR(); |
666 |
chEvtBroadcastFlagsI(&aos.events.io, AOS_IOEVENT_FLAG(PAL_PAD(*((ioline_t*)args))));
|
|
686 |
chEvtBroadcastFlagsI(&aos.events.gpio, AOS_GPIOEVENT_FLAG(PAL_PAD(*((ioline_t*)args))));
|
|
667 | 687 |
chSysUnlockFromISR(); |
668 | 688 |
|
669 | 689 |
return; |
... | ... | |
671 | 691 |
#pragma GCC diagnostic pop |
672 | 692 |
|
673 | 693 |
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER != true)) || defined(__DOXYGEN__) |
694 |
|
|
674 | 695 |
/** |
675 | 696 |
* @brief Callback function for the Sync signal interrupt. |
676 | 697 |
* |
... | ... | |
680 | 701 |
{ |
681 | 702 |
aosDbgCheck((args != NULL) && (*((ioline_t*)args) != PAL_NOLINE) && (PAL_PAD(*((ioline_t*)args)) < sizeof(eventflags_t) * 8)); |
682 | 703 |
|
683 |
apalControlGpioState_t s_state;
|
|
704 |
apalControlGpioState_t state; |
|
684 | 705 |
aos_timestamp_t uptime; |
685 | 706 |
|
686 | 707 |
chSysLockFromISR(); |
708 |
|
|
687 | 709 |
// if the system is in operation phase |
688 |
if (aos.sssp.stage == AOS_SSSP_OPERATION) { |
|
710 |
if (aos.sssp.stage == AOS_SSSP_STAGE_OPERATION) {
|
|
689 | 711 |
// read signal S |
690 |
apalControlGpioGet(&moduleSsspGpioSync, &s_state);
|
|
712 |
apalControlGpioGet(&moduleSsspGpioS, &state);
|
|
691 | 713 |
// if S was toggled from on to off |
692 |
if (s_state == APAL_GPIO_OFF) {
|
|
714 |
if (state == APAL_GPIO_OFF) { |
|
693 | 715 |
// get current uptime |
694 | 716 |
aosSysGetUptimeX(&uptime); |
695 | 717 |
// align the uptime with the synchronization period |
... | ... | |
706 | 728 |
} |
707 | 729 |
} |
708 | 730 |
} |
731 |
|
|
709 | 732 |
// broadcast event |
710 |
chEvtBroadcastFlagsI(&aos.events.io, AOS_IOEVENT_FLAG(PAL_PAD(*((ioline_t*)args))));
|
|
733 |
chEvtBroadcastFlagsI(&aos.events.gpio, AOS_GPIOEVENT_FLAG(PAL_PAD(*((ioline_t*)args))));
|
|
711 | 734 |
chSysUnlockFromISR(); |
712 | 735 |
|
713 | 736 |
return; |
714 | 737 |
} |
738 |
|
|
715 | 739 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER != true) */ |
716 | 740 |
|
717 | 741 |
/** |
... | ... | |
737 | 761 |
} |
738 | 762 |
|
739 | 763 |
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER == true)) || defined (__DOXYGEN__) |
764 |
|
|
740 | 765 |
/** |
741 | 766 |
* @brief Periodic system synchronization callback function. |
742 | 767 |
* @details Toggles the SYS_SYNC signal and reconfigures the system synchronization timer. |
743 | 768 |
* |
744 |
* @param[in] par Unuesed parameters.
|
|
769 |
* @param[in] par Unused parameters. |
|
745 | 770 |
*/ |
746 | 771 |
static void _sysSyncTimerCallback(void* par) |
747 | 772 |
{ |
748 | 773 |
(void)par; |
749 | 774 |
|
750 |
apalControlGpioState_t s_state;
|
|
775 |
apalControlGpioState_t state; |
|
751 | 776 |
aos_timestamp_t uptime; |
752 | 777 |
|
753 | 778 |
chSysLockFromISR(); |
754 | 779 |
// toggle and read signal S |
755 |
apalGpioToggle(moduleSsspGpioSync.gpio);
|
|
756 |
apalControlGpioGet(&moduleSsspGpioSync, &s_state);
|
|
780 |
apalGpioToggle(moduleSsspGpioS.gpio); |
|
781 |
apalControlGpioGet(&moduleSsspGpioS, &state);
|
|
757 | 782 |
// if S was toggled from off to on |
758 |
if (s_state == APAL_GPIO_ON) {
|
|
783 |
if (state == APAL_GPIO_ON) { |
|
759 | 784 |
// reconfigure the timer precisely, because the logically falling edge (next interrupt) snychronizes the system time |
760 | 785 |
_syssynctime += AMIROOS_CFG_SSSP_SYSSYNCPERIOD; |
761 | 786 |
aosSysGetUptimeX(&uptime); |
762 | 787 |
chVTSetI(&_syssynctimer, chTimeUS2I(_syssynctime - uptime), _sysSyncTimerCallback, NULL); |
763 | 788 |
} |
764 | 789 |
// if S was toggled from on to off |
765 |
else /* if (s_state == APAL_GPIO_OFF) */ {
|
|
790 |
else /* if (state == APAL_GPIO_OFF) */ { |
|
766 | 791 |
// reconfigure the timer (lazy) |
767 | 792 |
chVTSetI(&_syssynctimer, chTimeUS2I(AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2), _sysSyncTimerCallback, NULL); |
768 | 793 |
} |
... | ... | |
770 | 795 |
|
771 | 796 |
return; |
772 | 797 |
} |
798 |
|
|
773 | 799 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER == true) */ |
774 | 800 |
|
801 |
/** |
|
802 |
* @brief Retreive the number of active threads. |
|
803 |
* |
|
804 |
* @return Number of active threads. |
|
805 |
*/ |
|
806 |
size_t _numActiveThreads(void) |
|
807 |
{ |
|
808 |
size_t threads = 0; |
|
809 |
thread_t* tp = chRegFirstThread(); |
|
810 |
while (tp) { |
|
811 |
threads += (tp->state == CH_STATE_FINAL) ? 1 : 0; |
|
812 |
tp = chRegNextThread(tp); |
|
813 |
} |
|
814 |
|
|
815 |
return threads; |
|
816 |
} |
|
817 |
|
|
775 | 818 |
/******************************************************************************/ |
776 | 819 |
/* EXPORTED FUNCTIONS */ |
777 | 820 |
/******************************************************************************/ |
... | ... | |
782 | 825 |
* |
783 | 826 |
* @param[in] shellPrompt String to be printed as prompt of the system shell. |
784 | 827 |
*/ |
785 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
|
|
828 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__) |
|
786 | 829 |
void aosSysInit(const char* shellPrompt) |
787 |
#else /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
|
|
830 |
#else /* (AMIROOS_CFG_SHELL_ENABLE == true) */ |
|
788 | 831 |
void aosSysInit(void) |
789 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
|
|
832 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */ |
|
790 | 833 |
{ |
791 | 834 |
/* set control thread to maximum priority */ |
792 | 835 |
chThdSetPriority(AOS_THD_CTRLPRIO); |
793 | 836 |
|
837 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
838 |
aosSsspInit(); |
|
839 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
840 |
|
|
794 | 841 |
/* set local variables */ |
795 | 842 |
chVTObjectInit(&_systimer); |
796 | 843 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
... | ... | |
813 | 860 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
814 | 861 |
|
815 | 862 |
/* initialize aos configuration */ |
816 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
817 |
aos.sssp.stage = AOS_SSSP_STARTUP_2_1; |
|
818 |
aos.sssp.moduleId = 0; |
|
819 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
820 | 863 |
aosIOStreamInit(&aos.iostream); |
821 |
chEvtObjectInit(&aos.events.io); |
|
864 |
chEvtObjectInit(&aos.events.gpio);
|
|
822 | 865 |
chEvtObjectInit(&aos.events.os); |
823 | 866 |
|
824 |
/* interrupt setup */ |
|
825 | 867 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
868 |
|
|
869 |
/* SSSP signal interrupt setup */ |
|
826 | 870 |
// PD signal |
827 |
palSetLineCallback(moduleSsspGpioPd.gpio->line, _extiCallback, &moduleSsspGpioPd.gpio->line);
|
|
828 |
palEnableLineEvent(moduleSsspGpioPd.gpio->line, APAL2CH_EDGE(moduleSsspGpioPd.meta.edge));
|
|
829 |
// SYNC signal
|
|
871 |
palSetLineCallback(moduleSsspGpioPD.gpio->line, _gpioCallback, &moduleSsspGpioPD.gpio->line);
|
|
872 |
palEnableLineEvent(moduleSsspGpioPD.gpio->line, APAL2CH_EDGE(moduleSsspGpioPD.meta.edge));
|
|
873 |
// S signal |
|
830 | 874 |
#if (AMIROOS_CFG_SSSP_MASTER == true) |
831 |
palSetLineCallback(moduleSsspGpioSync.gpio->line, _extiCallback, &moduleSsspGpioSync.gpio->line);
|
|
875 |
palSetLineCallback(moduleSsspGpioS.gpio->line, _gpioCallback, &moduleSsspGpioS.gpio->line);
|
|
832 | 876 |
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
833 |
palSetLineCallback(moduleSsspGpioSync.gpio->line, _signalSyncCallback, &moduleSsspGpioSync.gpio->line);
|
|
877 |
palSetLineCallback(moduleSsspGpioS.gpio->line, _signalSyncCallback, &moduleSsspGpioS.gpio->line);
|
|
834 | 878 |
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
835 |
palEnableLineEvent(moduleSsspGpioSync.gpio->line, APAL2CH_EDGE(moduleSsspGpioSync.meta.edge));
|
|
879 |
palEnableLineEvent(moduleSsspGpioS.gpio->line, APAL2CH_EDGE(moduleSsspGpioS.meta.edge));
|
|
836 | 880 |
#if (AMIROOS_CFG_SSSP_STACK_START != true) |
837 | 881 |
// DN signal |
838 |
palSetLineCallback(moduleSsspGpioDn.gpio->line, _extiCallback, &moduleSsspGpioDn.gpio->line);
|
|
839 |
palEnableLineEvent(moduleSsspGpioDn.gpio->line, APAL2CH_EDGE(moduleSsspGpioDn.meta.edge));
|
|
882 |
palSetLineCallback(moduleSsspGpioDN.gpio->line, _gpioCallback, &moduleSsspGpioDN.gpio->line);
|
|
883 |
palEnableLineEvent(moduleSsspGpioDN.gpio->line, APAL2CH_EDGE(moduleSsspGpioDN.meta.edge));
|
|
840 | 884 |
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */ |
841 | 885 |
#if (AMIROOS_CFG_SSSP_STACK_END != true) |
842 | 886 |
// UP signal |
843 |
palSetLineCallback(moduleSsspGpioUp.gpio->line, _extiCallback, &moduleSsspGpioUp.gpio->line);
|
|
844 |
palEnableLineEvent(moduleSsspGpioUp.gpio->line, APAL2CH_EDGE(moduleSsspGpioUp.meta.edge));
|
|
887 |
palSetLineCallback(moduleSsspGpioUP.gpio->line, _gpioCallback, &moduleSsspGpioUP.gpio->line);
|
|
888 |
palEnableLineEvent(moduleSsspGpioUP.gpio->line, APAL2CH_EDGE(moduleSsspGpioUP.meta.edge));
|
|
845 | 889 |
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */ |
890 |
|
|
846 | 891 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
847 | 892 |
|
848 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) |
|
893 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) |
|
894 |
|
|
849 | 895 |
/* init shell */ |
850 | 896 |
aosShellInit(&aos.shell, |
851 | 897 |
&aos.events.os, |
... | ... | |
861 | 907 |
#if (AMIROOS_CFG_TESTS_ENABLE == true) |
862 | 908 |
aosShellAddCommand(&aos.shell, &_shellcmd_kerneltest); |
863 | 909 |
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */ |
864 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */ |
|
910 |
|
|
911 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */ |
|
865 | 912 |
|
866 | 913 |
return; |
867 | 914 |
} |
... | ... | |
869 | 916 |
/** |
870 | 917 |
* @brief Starts the system and all system threads. |
871 | 918 |
*/ |
872 |
inline void aosSysStart(void)
|
|
919 |
void aosSysStart(void) |
|
873 | 920 |
{ |
874 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
875 |
// update the system SSSP stage |
|
876 |
aos.sssp.stage = AOS_SSSP_OPERATION; |
|
877 |
|
|
878 |
#if (AMIROOS_CFG_SSSP_MASTER == true) |
|
921 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER == true) |
|
879 | 922 |
{ |
880 | 923 |
chSysLock(); |
881 | 924 |
// start the system synchronization counter |
... | ... | |
886 | 929 |
chVTSetI(&_syssynctimer, chTimeUS2I((t > (AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2)) ? (t - (AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2)) : (t + (AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2))), _sysSyncTimerCallback, NULL); |
887 | 930 |
chSysUnlock(); |
888 | 931 |
} |
889 |
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
|
890 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
932 |
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) && (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
891 | 933 |
|
892 | 934 |
// print system information; |
893 | 935 |
_printSystemInfo((BaseSequentialStream*)&aos.iostream); |
894 | 936 |
aosprintf("\n"); |
895 | 937 |
|
896 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true)
|
|
938 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) |
|
897 | 939 |
// start system shell thread |
898 | 940 |
#if (CH_CFG_USE_THREADHIERARCHY == TRUE) |
899 | 941 |
aos.shell.thread = chThdCreateStatic(_shell_wa, sizeof(_shell_wa), AMIROOS_CFG_SHELL_THREADPRIO, aosShellThread, &aos.shell, &ch.mainthread); |
900 | 942 |
#else /* (CH_CFG_USE_THREADHIERARCHY == TRUE) */ |
901 | 943 |
aos.shell.thread = chThdCreateStatic(_shell_wa, sizeof(_shell_wa), AMIROOS_CFG_SHELL_THREADPRIO, aosShellThread, &aos.shell); |
902 | 944 |
#endif /* (CH_CFG_USE_THREADHIERARCHY == TRUE) */ |
903 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
|
|
945 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) */ |
|
904 | 946 |
|
905 | 947 |
return; |
906 | 948 |
} |
907 | 949 |
|
908 | 950 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__) |
951 |
|
|
909 | 952 |
/** |
910 |
* @brief Implements the SSSP startup synchronization step. |
|
911 |
* |
|
912 |
* @param[in] syncEvtListener Event listener that receives the Sync event. |
|
913 |
* |
|
914 |
* @return If another event that the listener is interested in was received, its mask is returned. |
|
915 |
* Otherwise an empty mask (0) is returned. |
|
953 |
* @brief Start the system uptime measurement. |
|
916 | 954 |
*/ |
917 |
eventmask_t aosSysSsspStartupOsInitSyncCheck(event_listener_t* syncEvtListener)
|
|
955 |
void aosSysStartUptime(void)
|
|
918 | 956 |
{ |
919 |
aosDbgCheck(syncEvtListener != NULL);
|
|
957 |
chSysLock();
|
|
920 | 958 |
|
921 |
// local variables |
|
922 |
eventmask_t m; |
|
923 |
eventflags_t f; |
|
924 |
apalControlGpioState_t s; |
|
925 |
|
|
926 |
// update the system SSSP stage |
|
927 |
aos.sssp.stage = AOS_SSSP_STARTUP_2_2; |
|
928 |
|
|
929 |
// deactivate the sync signal to indicate that the module is ready (SSSPv1 stage 2.1 of startup phase) |
|
930 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF); |
|
931 |
|
|
932 |
// wait for any event to occur (do not apply any filter in order not to miss any event) |
|
933 |
m = chEvtWaitOne(ALL_EVENTS); |
|
934 |
f = chEvtGetAndClearFlags(syncEvtListener); |
|
935 |
apalControlGpioGet(&moduleSsspGpioSync, &s); |
|
936 |
|
|
937 |
// if the event was a system event, |
|
938 |
// and it was fired because of the SysSync control signal, |
|
939 |
// and the SysSync control signal has been deactivated |
|
940 |
if (m & syncEvtListener->events && |
|
941 |
f == MODULE_SSSP_EVENTFLAGS_SYNC && |
|
942 |
s == APAL_GPIO_OFF) { |
|
943 |
chSysLock(); |
|
944 |
// start the uptime counter |
|
945 |
_synctime = chVTGetSystemTimeX(); |
|
946 |
_uptime = 0; |
|
947 |
chVTSetI(&_systimer, SYSTIMER_PERIOD, &_uptimeCallback, NULL); |
|
948 |
chSysUnlock(); |
|
959 |
// start the uptime counter |
|
960 |
_synctime = chVTGetSystemTimeX(); |
|
961 |
_uptime = 0; |
|
962 |
chVTSetI(&_systimer, SYSTIMER_PERIOD, &_uptimeCallback, NULL); |
|
949 | 963 |
|
950 |
return 0; |
|
951 |
} |
|
952 |
// an unexpected event occurred |
|
953 |
else { |
|
954 |
// reassign the flags to the event and return the event mask |
|
955 |
syncEvtListener->flags |= f; |
|
956 |
return m; |
|
957 |
} |
|
964 |
chSysUnlock(); |
|
965 |
|
|
966 |
return; |
|
958 | 967 |
} |
968 |
|
|
959 | 969 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
960 | 970 |
|
961 | 971 |
/** |
... | ... | |
963 | 973 |
* |
964 | 974 |
* @param[out] ut The system uptime. |
965 | 975 |
*/ |
966 |
inline void aosSysGetUptimeX(aos_timestamp_t* ut)
|
|
976 |
void aosSysGetUptimeX(aos_timestamp_t* ut) |
|
967 | 977 |
{ |
968 | 978 |
aosDbgCheck(ut != NULL); |
969 | 979 |
|
... | ... | |
1020 | 1030 |
aosDbgCheck(shutdown != AOS_SHUTDOWN_NONE); |
1021 | 1031 |
|
1022 | 1032 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
1033 |
|
|
1023 | 1034 |
#if (AMIROOS_CFG_SSSP_MASTER == true) |
1024 | 1035 |
// deactivate the system synchronization timer |
1025 | 1036 |
chVTReset(&_syssynctimer); |
1037 |
// activate SSSP S signal in case the synchronization timer had it deactivated. |
|
1038 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_ON); |
|
1026 | 1039 |
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
1027 | 1040 |
|
1028 |
// update the system SSSP stage |
|
1029 |
aos.sssp.stage = AOS_SSSP_SHUTDOWN_1_1; |
|
1030 |
|
|
1031 |
chSysLock(); |
|
1032 |
// activate the SYS_PD control signal only, if this module initiated the shutdown |
|
1041 |
// activate the PD signal only if this module initiated the shutdown |
|
1033 | 1042 |
if (shutdown != AOS_SHUTDOWN_PASSIVE) { |
1034 |
apalControlGpioSet(&moduleSsspGpioPd, APAL_GPIO_ON); |
|
1043 |
apalControlGpioSet(&moduleSsspGpioPD, APAL_GPIO_ON); |
|
1044 |
aosSsspShutdownInit(); |
|
1035 | 1045 |
} |
1036 |
// activate the SYS_SYNC signal |
|
1037 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON); |
|
1038 |
chSysUnlock(); |
|
1039 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
1040 | 1046 |
|
1041 | 1047 |
switch (shutdown) { |
1042 | 1048 |
case AOS_SHUTDOWN_PASSIVE: |
1043 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN); |
|
1049 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN_PASSIVE);
|
|
1044 | 1050 |
aosprintf("shutdown request received...\n"); |
1045 | 1051 |
break; |
1052 |
#if (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_NONE) |
|
1053 |
case AOS_SHUTDOWN_ACTIVE: |
|
1054 |
aosprintf("shutdown initiated...\n"); |
|
1055 |
break; |
|
1056 |
#elif (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT) |
|
1046 | 1057 |
case AOS_SHUTDOWN_HIBERNATE: |
1047 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_HIBERNATE); |
|
1048 | 1058 |
aosprintf("shutdown to hibernate mode...\n"); |
1049 | 1059 |
break; |
1050 | 1060 |
case AOS_SHUTDOWN_DEEPSLEEP: |
1051 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_DEEPSLEEP); |
|
1052 | 1061 |
aosprintf("shutdown to deepsleep mode...\n"); |
1053 | 1062 |
break; |
1054 | 1063 |
case AOS_SHUTDOWN_TRANSPORTATION: |
1055 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_TRANSPORTATION); |
|
1056 | 1064 |
aosprintf("shutdown to transportation mode...\n"); |
1057 | 1065 |
break; |
1058 | 1066 |
case AOS_SHUTDOWN_RESTART: |
1059 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_RESTART); |
|
1060 | 1067 |
aosprintf("restarting system...\n"); |
1061 | 1068 |
break; |
1062 |
// must never occur
|
|
1069 |
#endif /* (AMIROOS_CFG_BOOTLOADER == X) */
|
|
1063 | 1070 |
case AOS_SHUTDOWN_NONE: |
1064 |
default: |
|
1071 |
// must never occur |
|
1072 |
aosDbgAssert(false); |
|
1065 | 1073 |
break; |
1066 | 1074 |
} |
1067 | 1075 |
|
1068 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
1069 |
// update the system SSSP stage |
|
1070 |
aos.sssp.stage = AOS_SSSP_SHUTDOWN_1_2; |
|
1076 |
#else /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
1077 |
|
|
1078 |
aosprintf("shutdown initiated...\n"); |
|
1079 |
|
|
1071 | 1080 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
1072 | 1081 |
|
1073 | 1082 |
return; |
... | ... | |
1078 | 1087 |
*/ |
1079 | 1088 |
void aosSysStop(void) |
1080 | 1089 |
{ |
1081 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) |
|
1082 |
chThdWait(aos.shell.thread); |
|
1083 |
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */ |
|
1090 |
// wait until the calling thread is the only remaining active thread |
|
1091 |
#if (CH_CFG_NO_IDLE_THREAD == TRUE) |
|
1092 |
while (_numActiveThreads() > 1) { |
|
1093 |
#else /* (CH_CFG_NO_IDLE_THREAD == TRUE) */ |
|
1094 |
while (_numActiveThreads() > 2) { |
|
1095 |
#endif /* (CH_CFG_NO_IDLE_THREAD == TRUE) */ |
|
1096 |
aosDbgPrintf("waiting for all threads to terminate...\n"); |
|
1097 |
chThdYield(); |
|
1098 |
} |
|
1084 | 1099 |
|
1085 | 1100 |
return; |
1086 | 1101 |
} |
... | ... | |
1093 | 1108 |
return; |
1094 | 1109 |
} |
1095 | 1110 |
|
1111 |
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_SHUTDOWN != true)) || \ |
|
1112 |
((AMIROOS_CFG_SSSP_ENABLE != true) && (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT)) || \ |
|
1113 |
defined(__DOXYGEN__) |
|
1114 |
|
|
1096 | 1115 |
/** |
1097 | 1116 |
* @brief Finally shuts down the system and calls the bootloader callback function. |
1098 | 1117 |
* @note This function should be called from the thtead with highest priority. |
1099 | 1118 |
* |
1100 | 1119 |
* @param[in] shutdown Type of shutdown. |
1101 | 1120 |
*/ |
1102 |
void aosSysShutdownFinal(aos_shutdown_t shutdown)
|
|
1121 |
void aosSysShutdownToBootloader(aos_shutdown_t shutdown)
|
|
1103 | 1122 |
{ |
1104 | 1123 |
// check arguments |
1105 | 1124 |
aosDbgCheck(shutdown != AOS_SHUTDOWN_NONE); |
... | ... | |
1107 | 1126 |
// disable all interrupts |
1108 | 1127 |
irqDeinit(); |
1109 | 1128 |
|
1110 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
1111 |
// update the system SSSP stage |
|
1112 |
aos.sssp.stage = AOS_SSSP_SHUTDOWN_1_3; |
|
1113 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
1114 |
|
|
1115 |
// validate bootloader |
|
1129 |
#if (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT) |
|
1130 |
// validate AMiRo-BLT |
|
1116 | 1131 |
if ((BL_CALLBACK_TABLE_ADDRESS->magicNumber == BL_MAGIC_NUMBER) && |
1117 | 1132 |
(BL_CALLBACK_TABLE_ADDRESS->vBootloader.major == BL_VERSION_MAJOR) && |
1118 | 1133 |
(BL_CALLBACK_TABLE_ADDRESS->vBootloader.minor >= BL_VERSION_MINOR)) { |
1119 | 1134 |
// call bootloader callback depending on arguments |
1120 | 1135 |
switch (shutdown) { |
1136 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
1121 | 1137 |
case AOS_SHUTDOWN_PASSIVE: |
1122 | 1138 |
BL_CALLBACK_TABLE_ADDRESS->cbHandleShutdownRequest(); |
1123 | 1139 |
break; |
1140 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
|
1124 | 1141 |
case AOS_SHUTDOWN_HIBERNATE: |
1125 | 1142 |
BL_CALLBACK_TABLE_ADDRESS->cbShutdownHibernate(); |
1126 | 1143 |
break; |
... | ... | |
1139 | 1156 |
break; |
1140 | 1157 |
} |
1141 | 1158 |
} else { |
1142 |
// fallback if bootloader was found to be invalid
|
|
1143 |
aosprintf("Bootloader incompatible or not available!\n");
|
|
1159 |
// fallback if AMiRo-BLT was found to be invalid
|
|
1160 |
aosprintf("ERROR: AMiRo-BLT incompatible or not available!\n");
|
|
1144 | 1161 |
aosThdMSleep(10); |
1145 | 1162 |
chSysDisable(); |
1146 | 1163 |
} |
1164 |
#endif /* (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT) */ |
|
1147 | 1165 |
|
1148 | 1166 |
return; |
1149 | 1167 |
} |
1150 | 1168 |
|
1169 |
#endif /* ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_SHUTDOWN != true)) || ((AMIROOS_CFG_SSSP_ENABLE != true) && (AMIROOS_CFG_BOOTLOADER == AOS_BOOTLOADER_AMiRoBLT)) */ |
|
1170 |
|
|
1151 | 1171 |
/** |
1152 | 1172 |
* @brief Generic callback function for GPIO interrupts. |
1153 | 1173 |
* |
1154 | 1174 |
* @return Pointer to the callback function. |
1155 | 1175 |
*/ |
1156 |
palcallback_t aosSysGetStdExtiCallback(void)
|
|
1176 |
palcallback_t aosSysGetStdGpioCallback(void)
|
|
1157 | 1177 |
{ |
1158 |
return _extiCallback;
|
|
1178 |
return _gpioCallback;
|
|
1159 | 1179 |
} |
1160 | 1180 |
|
1161 | 1181 |
/** @} */ |
Also available in: Unified diff