Revision cda14729 core/src/aos_system.c

View differences:

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