Revision 1678f270 core/src/aos_system.c
| core/src/aos_system.c | ||
|---|---|---|
| 1 | 1 |
/* |
| 2 | 2 |
AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform. |
| 3 |
Copyright (C) 2016..2018 Thomas Schöpping et al.
|
|
| 3 |
Copyright (C) 2016..2019 Thomas Schöpping et al.
|
|
| 4 | 4 |
|
| 5 | 5 |
This program is free software: you can redistribute it and/or modify |
| 6 | 6 |
it under the terms of the GNU General Public License as published by |
| ... | ... | |
| 79 | 79 |
*/ |
| 80 | 80 |
static systime_t _synctime; |
| 81 | 81 |
|
| 82 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 83 |
#if (AMIROOS_CFG_SSSP_MASTER == true) || defined(__DOXYGEN__) |
|
| 82 |
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER == true)) || defined(__DOXYGEN__) |
|
| 84 | 83 |
/** |
| 85 | 84 |
* @brief Timer to drive the SYS_SYNC signal for system wide time synchronization according to SSSP. |
| 86 | 85 |
*/ |
| 87 | 86 |
static virtual_timer_t _syssynctimer; |
| 88 | 87 |
|
| 89 |
#endif |
|
| 90 |
|
|
| 91 | 88 |
/** |
| 92 | 89 |
* @brief Last uptime of system wide time synchronization. |
| 93 | 90 |
*/ |
| 94 | 91 |
static aos_timestamp_t _syssynctime; |
| 95 | 92 |
#endif |
| 96 | 93 |
|
| 97 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 98 |
#if ((AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true)) || defined(__DOXYGEN__) |
|
| 94 |
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true)) || defined(__DOXYGEN__) |
|
| 99 | 95 |
/** |
| 100 | 96 |
* @brief Offset between local clock and system wide synchronization signal. |
| 101 | 97 |
*/ |
| ... | ... | |
| 105 | 101 |
* @brief Weighting factor for the low-pass filter used for calculating the @p _syssyncskew value. |
| 106 | 102 |
*/ |
| 107 | 103 |
#define SYSTEM_SYSSYNCSKEW_LPFACTOR (0.1f / AOS_SYSTEM_TIME_RESOLUTION) |
| 108 |
#endif |
|
| 109 |
#endif |
|
| 104 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) */ |
|
| 110 | 105 |
|
| 111 | 106 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__) |
| 112 | 107 |
/** |
| ... | ... | |
| 146 | 141 |
* @brief Shell command to shutdown the system. |
| 147 | 142 |
*/ |
| 148 | 143 |
static aos_shellcommand_t _shellcmd_shutdown = {
|
| 144 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 149 | 145 |
/* name */ "system:shutdown", |
| 146 |
#else |
|
| 147 |
/* name */ "module:shutdown", |
|
| 148 |
#endif |
|
| 150 | 149 |
/* callback */ _shellcmd_shutdowncb, |
| 151 | 150 |
/* next */ NULL, |
| 152 | 151 |
}; |
| ... | ... | |
| 242 | 241 |
|
| 243 | 242 |
// print static information about module and operating system |
| 244 | 243 |
_printSystemInfoSeparator(stream, '=', SYSTEM_INFO_WIDTH); |
| 244 |
#ifdef BOARD_VERSION |
|
| 245 | 245 |
_printSystemInfoLine(stream, "Module", SYSTEM_INFO_NAMEWIDTH, "%s (v%s)", BOARD_NAME, BOARD_VERSION); |
| 246 |
#else |
|
| 247 |
_printSystemInfoLine(stream, "Module", SYSTEM_INFO_NAMEWIDTH, "%s", BOARD_NAME); |
|
| 248 |
#endif |
|
| 246 | 249 |
#ifdef PLATFORM_NAME |
| 247 | 250 |
_printSystemInfoLine(stream, "Platform", SYSTEM_INFO_NAMEWIDTH, "%s", PLATFORM_NAME); |
| 248 | 251 |
#endif |
| ... | ... | |
| 253 | 256 |
_printSystemInfoSeparator(stream, '-', SYSTEM_INFO_WIDTH); |
| 254 | 257 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
| 255 | 258 |
_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); |
| 259 |
#else |
|
| 260 |
_printSystemInfoLine(stream, "AMiRo-OS" , SYSTEM_INFO_NAMEWIDTH, "%u.%u.%u %s", AMIROOS_VERSION_MAJOR, AMIROOS_VERSION_MINOR, AMIROOS_VERSION_PATCH, AMIROOS_RELEASE_TYPE); |
|
| 256 | 261 |
#endif |
| 257 | 262 |
_printSystemInfoLine(stream, "AMiRo-LLD" , SYSTEM_INFO_NAMEWIDTH, "%u.%u.%u %s (periphAL %u.%u)", AMIRO_LLD_VERSION_MAJOR, AMIRO_LLD_VERSION_MINOR, AMIRO_LLD_VERSION_PATCH, AMIRO_LLD_RELEASE_TYPE, PERIPHAL_VERSION_MAJOR, PERIPHAL_VERSION_MINOR); |
| 258 | 263 |
_printSystemInfoLine(stream, "ChibiOS/RT" , SYSTEM_INFO_NAMEWIDTH, "%u.%u.%u %s", CH_KERNEL_MAJOR, CH_KERNEL_MINOR, CH_KERNEL_PATCH, (CH_KERNEL_STABLE == 1) ? "stable" : "non-stable"); |
| ... | ... | |
| 264 | 269 |
// print static information about the bootloader |
| 265 | 270 |
_printSystemInfoSeparator(stream, '-', SYSTEM_INFO_WIDTH); |
| 266 | 271 |
if (BL_CALLBACK_TABLE_ADDRESS->magicNumber == BL_MAGIC_NUMBER) {
|
| 267 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 268 | 272 |
_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, |
| 269 | 273 |
(BL_CALLBACK_TABLE_ADDRESS->vBootloader.identifier == BL_VERSION_ID_AMiRoBLT_Release) ? "stable" : |
| 270 | 274 |
(BL_CALLBACK_TABLE_ADDRESS->vBootloader.identifier == BL_VERSION_ID_AMiRoBLT_ReleaseCandidate) ? "release candidate" : |
| ... | ... | |
| 273 | 277 |
(BL_CALLBACK_TABLE_ADDRESS->vBootloader.identifier == BL_VERSION_ID_AMiRoBLT_PreAlpha) ? "pre-alpha" : |
| 274 | 278 |
"<release type unknown>", |
| 275 | 279 |
BL_CALLBACK_TABLE_ADDRESS->vSSSP.major, BL_CALLBACK_TABLE_ADDRESS->vSSSP.minor); |
| 276 |
|
|
| 280 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 277 | 281 |
if (BL_CALLBACK_TABLE_ADDRESS->vSSSP.major != AOS_SYSTEM_SSSP_VERSION_MAJOR) {
|
| 278 | 282 |
if (stream) {
|
| 279 | 283 |
chprintf(stream, "WARNING: Bootloader and AMiRo-OS implement incompatible SSSP versions!\n"); |
| ... | ... | |
| 293 | 297 |
|
| 294 | 298 |
// print dynamic information about the module |
| 295 | 299 |
_printSystemInfoSeparator(stream, '-', SYSTEM_INFO_WIDTH); |
| 296 |
#if (AMIROOS_CFG_SSSP_ENABLE == true)
|
|
| 300 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 297 | 301 |
if (aos.sssp.moduleId != 0) {
|
| 298 | 302 |
_printSystemInfoLine(stream, "Module ID", SYSTEM_INFO_NAMEWIDTH, "%u", aos.sssp.moduleId); |
| 299 | 303 |
} else {
|
| ... | ... | |
| 508 | 512 |
chprintf(stream, "%10u seconds\n", (uint8_t)(uptime % MICROSECONDS_PER_MINUTE / MICROSECONDS_PER_SECOND)); |
| 509 | 513 |
chprintf(stream, "%10u milliseconds\n", (uint16_t)(uptime % MICROSECONDS_PER_SECOND / MICROSECONDS_PER_MILLISECOND)); |
| 510 | 514 |
chprintf(stream, "%10u microseconds\n", (uint16_t)(uptime % MICROSECONDS_PER_MILLISECOND / MICROSECONDS_PER_MICROSECOND)); |
| 511 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 512 |
#if (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) |
|
| 515 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) |
|
| 513 | 516 |
chprintf(stream, "SSSP synchronization offset: %.3fus per %uus\n", _syssyncskew, AMIROOS_CFG_SSSP_SYSSYNCPERIOD); |
| 514 | 517 |
#endif /* AMIROOS_CFG_SSSP_MASTER != true && AMIROOS_CFG_PROFILE == true */ |
| 515 | 518 |
_printSystemInfoSeparator(stream, '=', SYSTEM_INFO_WIDTH); |
| 516 |
#endif |
|
| 519 |
|
|
| 517 | 520 |
#if (AMIROOS_CFG_SHELL_ENABLE == true) |
| 518 | 521 |
// print shell info |
| 519 | 522 |
chprintf(stream, "System shell information:\n"); |
| 520 | 523 |
chprintf(stream, "\tnumber of commands: %u\n", aosShellCountCommands(&aos.shell)); |
| 521 | 524 |
chprintf(stream, "\tmaximum line width: %u characters\n", aos.shell.linesize); |
| 522 | 525 |
chprintf(stream, "\tmaximum #arguments: %u\n", aos.shell.arglistsize); |
| 526 |
#if (AMIROOS_CFG_DBG == true) |
|
| 523 | 527 |
chprintf(stream, "\tshell thread stack size: %u bytes\n", aosThdGetStacksize(aos.shell.thread)); |
| 524 | 528 |
#if (CH_DBG_FILL_THREADS == TRUE) |
| 525 | 529 |
chprintf(stream, "\tstack peak utilization: %u bytes (%.2f%%)\n", aosThdGetStackPeakUtilization(aos.shell.thread), (float)aosThdGetStackPeakUtilization(aos.shell.thread) / (float)aosThdGetStacksize(aos.shell.thread) * 100.0f); |
| 526 | 530 |
#endif /* CH_DBG_FILL_THREADS == TRUE */ |
| 531 |
#endif /* AMIROOS_CFG_DBG == true */ |
|
| 527 | 532 |
_printSystemInfoSeparator(stream, '=', SYSTEM_INFO_WIDTH); |
| 528 | 533 |
#endif /* AMIROOS_CFG_SHELL_ENABLE == true */ |
| 529 | 534 |
|
| ... | ... | |
| 545 | 550 |
{
|
| 546 | 551 |
aosDbgCheck(stream != NULL); |
| 547 | 552 |
|
| 553 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 548 | 554 |
// print help text |
| 549 | 555 |
if (argc != 2 || strcmp(argv[1], "--help") == 0) {
|
| 550 | 556 |
chprintf(stream, "Usage: %s OPTION\n", argv[0]); |
| ... | ... | |
| 592 | 598 |
return AOS_INVALID_ARGUMENTS; |
| 593 | 599 |
} |
| 594 | 600 |
} |
| 601 |
#else /* AMIROOS_CFG_SSSP_ENABLE == false */ |
|
| 602 |
(void)argv; |
|
| 603 |
(void)argc; |
|
| 604 |
|
|
| 605 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN); |
|
| 606 |
chThdTerminate(chThdGetSelfX()); |
|
| 607 |
return AOS_OK; |
|
| 608 |
#endif /* AMIROOS_CFG_SSSP_ENABLE */ |
|
| 595 | 609 |
} |
| 596 | 610 |
|
| 597 | 611 |
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__) |
| ... | ... | |
| 618 | 632 |
#endif /* AMIROOS_CFG_TESTS_ENABLE == true */ |
| 619 | 633 |
#endif /* AMIROOS_CFG_SHELL_ENABLE == true */ |
| 620 | 634 |
|
| 635 |
// suppress warning in case no interrupt GPIOs are defined |
|
| 636 |
#pragma GCC diagnostic push |
|
| 637 |
#pragma GCC diagnostic ignored "-Wunused-function" |
|
| 621 | 638 |
/** |
| 622 | 639 |
* @brief Generic callback function for GPIO interrupts. |
| 623 | 640 |
* |
| ... | ... | |
| 628 | 645 |
aosDbgCheck((args != NULL) && (*((iopadid_t*)args) < sizeof(eventflags_t) * 8)); |
| 629 | 646 |
|
| 630 | 647 |
chSysLockFromISR(); |
| 631 |
chEvtBroadcastFlagsI(&aos.events.io, (eventflags_t)1 << *((iopadid_t*)args));
|
|
| 648 |
chEvtBroadcastFlagsI(&aos.events.io, AOS_IOEVENT_FLAG(*((iopadid_t*)args)));
|
|
| 632 | 649 |
chSysUnlockFromISR(); |
| 633 | 650 |
|
| 634 | 651 |
return; |
| 635 | 652 |
} |
| 653 |
#pragma GCC diagnostic pop |
|
| 636 | 654 |
|
| 637 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 638 |
#if (AMIROOS_CFG_SSSP_MASTER != true) || defined(__DOXYGEN__) |
|
| 655 |
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER != true)) || defined(__DOXYGEN__) |
|
| 639 | 656 |
/** |
| 640 | 657 |
* @brief Callback function for the Sync signal interrupt. |
| 641 | 658 |
* |
| ... | ... | |
| 672 | 689 |
} |
| 673 | 690 |
} |
| 674 | 691 |
// broadcast event |
| 675 |
chEvtBroadcastFlagsI(&aos.events.io, (eventflags_t)1 << *((iopadid_t*)args));
|
|
| 692 |
chEvtBroadcastFlagsI(&aos.events.io, AOS_IOEVENT_FLAG(*((iopadid_t*)args)));
|
|
| 676 | 693 |
chSysUnlockFromISR(); |
| 677 | 694 |
|
| 678 | 695 |
return; |
| 679 | 696 |
} |
| 680 |
#endif |
|
| 681 |
#endif |
|
| 697 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER != true) */ |
|
| 682 | 698 |
|
| 683 | 699 |
/** |
| 684 | 700 |
* @brief Callback function for the uptime accumulation timer. |
| ... | ... | |
| 701 | 717 |
|
| 702 | 718 |
return; |
| 703 | 719 |
} |
| 704 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 705 |
#if (AMIROOS_CFG_SSSP_MASTER == true) || defined (__DOXYGEN__)
|
|
| 720 |
|
|
| 721 |
#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER == true)) || defined (__DOXYGEN__)
|
|
| 706 | 722 |
/** |
| 707 | 723 |
* @brief Periodic system synchronization callback function. |
| 708 | 724 |
* @details Toggles the SYS_SYNC signal and reconfigures the system synchronization timer. |
| ... | ... | |
| 736 | 752 |
|
| 737 | 753 |
return; |
| 738 | 754 |
} |
| 739 |
#endif |
|
| 740 |
#endif |
|
| 755 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MASTER == true) */ |
|
| 741 | 756 |
|
| 742 | 757 |
/** |
| 743 | 758 |
* @brief AMiRo-OS system initialization. |
| ... | ... | |
| 756 | 771 |
|
| 757 | 772 |
/* set local variables */ |
| 758 | 773 |
chVTObjectInit(&_systimer); |
| 774 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 759 | 775 |
_synctime = 0; |
| 760 | 776 |
_uptime = 0; |
| 761 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 762 | 777 |
#if (AMIROOS_CFG_SSSP_MASTER == true) |
| 763 | 778 |
chVTObjectInit(&_syssynctimer); |
| 764 | 779 |
_syssynctime = 0; |
| ... | ... | |
| 766 | 781 |
#if (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) |
| 767 | 782 |
_syssyncskew = 0.0f; |
| 768 | 783 |
#endif |
| 769 |
#endif |
|
| 784 |
#else /* AMIROOS_CFG_SSSP_ENABLE == false */ |
|
| 785 |
// start the uptime counter |
|
| 786 |
chSysLock(); |
|
| 787 |
_synctime = chVTGetSystemTimeX(); |
|
| 788 |
_uptime = 0; |
|
| 789 |
chVTSetI(&_systimer, SYSTIMER_PERIOD, &_uptimeCallback, NULL); |
|
| 790 |
chSysUnlock(); |
|
| 791 |
#endif /* AMIROOS_CFG_SSSP_ENABLE */ |
|
| 770 | 792 |
|
| 771 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 772 | 793 |
/* initialize aos configuration */ |
| 794 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 773 | 795 |
aos.sssp.stage = AOS_SSSP_STARTUP_2_1; |
| 774 | 796 |
aos.sssp.moduleId = 0; |
| 775 | 797 |
#endif |
| ... | ... | |
| 778 | 800 |
chEvtObjectInit(&aos.events.os); |
| 779 | 801 |
|
| 780 | 802 |
/* interrupt setup */ |
| 803 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 781 | 804 |
// PD signal |
| 782 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 783 | 805 |
palSetPadCallback(moduleSsspGpioPd.gpio->port, moduleSsspGpioPd.gpio->pad, _intCallback, &moduleSsspGpioPd.gpio->pad); |
| 784 | 806 |
palEnablePadEvent(moduleSsspGpioPd.gpio->port, moduleSsspGpioPd.gpio->pad, APAL2CH_EDGE(moduleSsspGpioPd.meta.edge)); |
| 785 | 807 |
// SYNC signal |
| ... | ... | |
| 799 | 821 |
palSetPadCallback(moduleSsspGpioUp.gpio->port, moduleSsspGpioUp.gpio->pad, _intCallback, &moduleSsspGpioUp.gpio->pad); |
| 800 | 822 |
palEnablePadEvent(moduleSsspGpioUp.gpio->port, moduleSsspGpioUp.gpio->pad, APAL2CH_EDGE(moduleSsspGpioUp.meta.edge)); |
| 801 | 823 |
#endif |
| 802 |
#endif |
|
| 824 |
#endif /* AMIROOS_CFG_SSSP_ENABLE == true */
|
|
| 803 | 825 |
#ifdef MODULE_INIT_INTERRUPTS |
| 804 | 826 |
// further interrupt signals |
| 805 | 827 |
MODULE_INIT_INTERRUPTS(); |
| ... | ... | |
| 821 | 843 |
#if (AMIROOS_CFG_TESTS_ENABLE == true) |
| 822 | 844 |
aosShellAddCommand(&aos.shell, &_shellcmd_kerneltest); |
| 823 | 845 |
#endif |
| 824 |
#endif |
|
| 846 |
#endif /* AMIROOS_CFG_SHELL_ENABLE == true */
|
|
| 825 | 847 |
|
| 826 | 848 |
return; |
| 827 | 849 |
} |
| ... | ... | |
| 847 | 869 |
chSysUnlock(); |
| 848 | 870 |
} |
| 849 | 871 |
#endif |
| 850 |
#endif |
|
| 872 |
#endif /* AMIROOS_CFG_SSSP_ENABLE == true */
|
|
| 851 | 873 |
|
| 852 | 874 |
// print system information; |
| 853 | 875 |
_printSystemInfo((BaseSequentialStream*)&aos.iostream); |
| ... | ... | |
| 864 | 886 |
|
| 865 | 887 |
return; |
| 866 | 888 |
} |
| 867 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 889 |
|
|
| 890 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__) |
|
| 868 | 891 |
/** |
| 869 | 892 |
* @brief Implements the SSSP startup synchronization step. |
| 870 | 893 |
* |
| ... | ... | |
| 915 | 938 |
return m; |
| 916 | 939 |
} |
| 917 | 940 |
} |
| 918 |
#endif |
|
| 941 |
#endif /* AMIROOS_CFG_SSSP_ENABLE == true */
|
|
| 919 | 942 |
|
| 920 | 943 |
/** |
| 921 | 944 |
* @brief Retrieves the system uptime. |
| ... | ... | |
| 983 | 1006 |
// update the system SSSP stage |
| 984 | 1007 |
aos.sssp.stage = AOS_SSSP_SHUTDOWN_1_1; |
| 985 | 1008 |
|
| 986 |
// activate the SYS_PD control signal only, if this module initiated the shutdown |
|
| 987 | 1009 |
chSysLock(); |
| 1010 |
// activate the SYS_PD control signal only, if this module initiated the shutdown |
|
| 988 | 1011 |
if (shutdown != AOS_SHUTDOWN_PASSIVE) {
|
| 989 | 1012 |
apalControlGpioSet(&moduleSsspGpioPd, APAL_GPIO_ON); |
| 990 | 1013 |
} |
| 991 | 1014 |
// activate the SYS_SYNC signal |
| 992 | 1015 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON); |
| 993 | 1016 |
chSysUnlock(); |
| 994 |
#endif |
|
| 1017 |
#endif /* AMIROOS_CFG_SSSP_ENABLE == true */
|
|
| 995 | 1018 |
|
| 996 | 1019 |
switch (shutdown) {
|
| 997 | 1020 |
case AOS_SHUTDOWN_PASSIVE: |
| ... | ... | |
| 1014 | 1037 |
chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_RESTART); |
| 1015 | 1038 |
aosprintf("restarting system...\n");
|
| 1016 | 1039 |
break; |
| 1017 |
// must never occur |
|
| 1018 |
case AOS_SHUTDOWN_NONE: |
|
| 1019 |
default: |
|
| 1040 |
// must never occur
|
|
| 1041 |
case AOS_SHUTDOWN_NONE:
|
|
| 1042 |
default:
|
|
| 1020 | 1043 |
break; |
| 1021 | 1044 |
} |
| 1045 |
|
|
| 1022 | 1046 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
| 1023 | 1047 |
// update the system SSSP stage |
| 1024 | 1048 |
aos.sssp.stage = AOS_SSSP_SHUTDOWN_1_2; |
| 1025 | 1049 |
#endif |
| 1050 |
|
|
| 1026 | 1051 |
return; |
| 1027 | 1052 |
} |
| 1028 | 1053 |
|
| ... | ... | |
| 1060 | 1085 |
// disable all interrupts |
| 1061 | 1086 |
irqDeinit(); |
| 1062 | 1087 |
|
| 1063 |
#if (AMIROOS_CFG_SSSP_ENABLE == true)
|
|
| 1088 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
|
| 1064 | 1089 |
// update the system SSSP stage |
| 1065 | 1090 |
aos.sssp.stage = AOS_SSSP_SHUTDOWN_1_3; |
| 1066 | 1091 |
#endif |
| 1067 | 1092 |
|
| 1068 |
// call bootloader callback depending on arguments |
|
| 1069 |
switch (shutdown) {
|
|
| 1070 |
case AOS_SHUTDOWN_PASSIVE: |
|
| 1071 |
BL_CALLBACK_TABLE_ADDRESS->cbHandleShutdownRequest(); |
|
| 1072 |
break; |
|
| 1073 |
case AOS_SHUTDOWN_HIBERNATE: |
|
| 1074 |
BL_CALLBACK_TABLE_ADDRESS->cbShutdownHibernate(); |
|
| 1075 |
break; |
|
| 1076 |
case AOS_SHUTDOWN_DEEPSLEEP: |
|
| 1077 |
BL_CALLBACK_TABLE_ADDRESS->cbShutdownDeepsleep(); |
|
| 1078 |
break; |
|
| 1079 |
case AOS_SHUTDOWN_TRANSPORTATION: |
|
| 1080 |
BL_CALLBACK_TABLE_ADDRESS->cbShutdownTransportation(); |
|
| 1081 |
break; |
|
| 1082 |
case AOS_SHUTDOWN_RESTART: |
|
| 1083 |
BL_CALLBACK_TABLE_ADDRESS->cbShutdownRestart(); |
|
| 1084 |
break; |
|
| 1085 |
// must never occur |
|
| 1086 |
case AOS_SHUTDOWN_NONE: |
|
| 1087 |
default: |
|
| 1088 |
break; |
|
| 1093 |
// validate bootloader |
|
| 1094 |
if ((BL_CALLBACK_TABLE_ADDRESS->magicNumber == BL_MAGIC_NUMBER) && |
|
| 1095 |
(BL_CALLBACK_TABLE_ADDRESS->vBootloader.major == BL_VERSION_MAJOR) && |
|
| 1096 |
(BL_CALLBACK_TABLE_ADDRESS->vBootloader.minor >= BL_VERSION_MINOR)) {
|
|
| 1097 |
// call bootloader callback depending on arguments |
|
| 1098 |
switch (shutdown) {
|
|
| 1099 |
case AOS_SHUTDOWN_PASSIVE: |
|
| 1100 |
BL_CALLBACK_TABLE_ADDRESS->cbHandleShutdownRequest(); |
|
| 1101 |
break; |
|
| 1102 |
case AOS_SHUTDOWN_HIBERNATE: |
|
| 1103 |
BL_CALLBACK_TABLE_ADDRESS->cbShutdownHibernate(); |
|
| 1104 |
break; |
|
| 1105 |
case AOS_SHUTDOWN_DEEPSLEEP: |
|
| 1106 |
BL_CALLBACK_TABLE_ADDRESS->cbShutdownDeepsleep(); |
|
| 1107 |
break; |
|
| 1108 |
case AOS_SHUTDOWN_TRANSPORTATION: |
|
| 1109 |
BL_CALLBACK_TABLE_ADDRESS->cbShutdownTransportation(); |
|
| 1110 |
break; |
|
| 1111 |
case AOS_SHUTDOWN_RESTART: |
|
| 1112 |
BL_CALLBACK_TABLE_ADDRESS->cbShutdownRestart(); |
|
| 1113 |
break; |
|
| 1114 |
// must never occur |
|
| 1115 |
case AOS_SHUTDOWN_NONE: |
|
| 1116 |
default: |
|
| 1117 |
break; |
|
| 1118 |
} |
|
| 1119 |
} else {
|
|
| 1120 |
// fallback if bootloader was found to be invalid |
|
| 1121 |
aosprintf("Bootloader incompatible or not available!\n");
|
|
| 1122 |
chThdSleep(TIME_INFINITE); |
|
| 1089 | 1123 |
} |
| 1090 | 1124 |
|
| 1091 | 1125 |
return; |
Also available in: Unified diff