Revision 6b53f6bf os/core/src/aos_system.c

View differences:

os/core/src/aos_system.c
54 54
#endif /* AMIROOS_CFG_TESTS_ENABLE == true */
55 55

  
56 56
/**
57
 * @brief   PD signal GPIO.
58
 */
59
static apalControlGpio_t* _gpioPd;
60

  
61
/**
62
 * @brief   Sync signal GPIO.
63
 */
64
static apalControlGpio_t* _gpioSync;
65

  
66
/**
67 57
 * @brief   Timer to accumulate system uptime.
68 58
 */
69 59
static virtual_timer_t _systimer;
......
92 82

  
93 83
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__)
94 84
/**
95
 * @brief   System shell.
96
 */
97
static aos_shell_t _shell;
98

  
99
/**
100 85
 * @brief   Shell thread working area.
101 86
 */
102 87
THD_WORKING_AREA(_shell_wa, AMIROOS_CFG_SHELL_STACKSIZE);
......
153 138
/**
154 139
 * @brief   Global system object.
155 140
 */
156
aos_system_t aos = {
157
  /* SSSP stage       */ AOS_SSSP_STARTUP_2_1,
158
  /* I/O stream       */ {
159
    /* channel          */ NULL,
160
  },
161
  /* event            */ {
162
    /* I/O              */ {
163
      /* source           */ {
164
        /* next listener    */ NULL,
165
      },
166
      /* flagsSignalPd    */ 0,
167
      /* flagsSignalSync  */ 0,
168
    },
169
    /* OS               */ {
170
      /* source           */ {
171
        /* next listener    */ NULL,
172
      }
173
    },
174
  },
175
#if (AMIROOS_CFG_SHELL_ENABLE == true)
176
  /* shell            */ &_shell,
177
#endif
178
};
141
aos_system_t aos;
179 142

  
180 143
/**
181 144
 * @brief   Print a separator line.
......
328 291
          if (argc > 3) {
329 292
            // handle the option
330 293
            if (strcmp(argv[3], "text") == 0) {
331
              aos.shell->config &= ~AOS_SHELL_CONFIG_PROMPT_MINIMAL;
294
              aos.shell.config &= ~AOS_SHELL_CONFIG_PROMPT_MINIMAL;
332 295
              retval = AOS_OK;
333 296
            }
334 297
            else if (strcmp(argv[3], "minimal") == 0) {
335
              aos.shell->config |= AOS_SHELL_CONFIG_PROMPT_MINIMAL;
298
              aos.shell.config |= AOS_SHELL_CONFIG_PROMPT_MINIMAL;
336 299
              retval = AOS_OK;
337 300
            }
338 301
            else if (strcmp(argv[3], "notime") == 0) {
339
              aos.shell->config &= ~(AOS_SHELL_CONFIG_PROMPT_UPTIME | AOS_SHELL_CONFIG_PROMPT_DATETIME);
302
              aos.shell.config &= ~(AOS_SHELL_CONFIG_PROMPT_UPTIME | AOS_SHELL_CONFIG_PROMPT_DATETIME);
340 303
              retval = AOS_OK;
341 304
            }
342 305
            else if (strcmp(argv[3], "uptime") == 0) {
343
              aos.shell->config &= ~AOS_SHELL_CONFIG_PROMPT_DATETIME;
344
              aos.shell->config |= AOS_SHELL_CONFIG_PROMPT_UPTIME;
306
              aos.shell.config &= ~AOS_SHELL_CONFIG_PROMPT_DATETIME;
307
              aos.shell.config |= AOS_SHELL_CONFIG_PROMPT_UPTIME;
345 308
              retval = AOS_OK;
346 309
            }
347 310
            else if (strcmp(argv[3], "date&time") == 0) {
348
              aos.shell->config &= ~AOS_SHELL_CONFIG_PROMPT_UPTIME;
349
              aos.shell->config |= AOS_SHELL_CONFIG_PROMPT_DATETIME;
311
              aos.shell.config &= ~AOS_SHELL_CONFIG_PROMPT_UPTIME;
312
              aos.shell.config |= AOS_SHELL_CONFIG_PROMPT_DATETIME;
350 313
              retval = AOS_OK;
351 314
            }
352 315
            else {
......
360 323
          // there must be a further argument
361 324
          if (argc > 3) {
362 325
            if (strcmp(argv[3], "casesensitive") == 0) {
363
              aos.shell->config |= AOS_SHELL_CONFIG_MATCH_CASE;
326
              aos.shell.config |= AOS_SHELL_CONFIG_MATCH_CASE;
364 327
              retval = AOS_OK;
365 328
            }
366 329
            else if (strcmp(argv[3], "caseinsensitive") == 0) {
367
              aos.shell->config &= ~AOS_SHELL_CONFIG_MATCH_CASE;
330
              aos.shell.config &= ~AOS_SHELL_CONFIG_MATCH_CASE;
368 331
              retval = AOS_OK;
369 332
            }
370 333
          }
......
374 337
      else {
375 338
        chprintf(stream, "current shell configuration:\n");
376 339
        chprintf(stream, "  prompt text:   %s\n",
377
                 (aos.shell->prompt != NULL) ? aos.shell->prompt : "n/a");
340
                 (aos.shell.prompt != NULL) ? aos.shell.prompt : "n/a");
378 341
        char time[10];
379
        switch (aos.shell->config & (AOS_SHELL_CONFIG_PROMPT_UPTIME | AOS_SHELL_CONFIG_PROMPT_DATETIME)) {
342
        switch (aos.shell.config & (AOS_SHELL_CONFIG_PROMPT_UPTIME | AOS_SHELL_CONFIG_PROMPT_DATETIME)) {
380 343
          case AOS_SHELL_CONFIG_PROMPT_UPTIME:
381 344
            strcpy(time, "uptime"); break;
382 345
          case AOS_SHELL_CONFIG_PROMPT_DATETIME:
......
385 348
            strcpy(time, "no time"); break;
386 349
        }
387 350
        chprintf(stream, "  prompt style:  %s, %s\n",
388
                 (aos.shell->config & AOS_SHELL_CONFIG_PROMPT_MINIMAL) ? "minimal" : "text",
351
                 (aos.shell.config & AOS_SHELL_CONFIG_PROMPT_MINIMAL) ? "minimal" : "text",
389 352
                 time);
390 353
        chprintf(stream, "  input method:  %s\n",
391
                 (aos.shell->config & AOS_SHELL_CONFIG_INPUT_OVERWRITE) ? "replace" : "insert");
354
                 (aos.shell.config & AOS_SHELL_CONFIG_INPUT_OVERWRITE) ? "replace" : "insert");
392 355
        chprintf(stream, "  text matching: %s\n",
393
                 (aos.shell->config & AOS_SHELL_CONFIG_MATCH_CASE) ? "case sensitive" : "case insensitive");
356
                 (aos.shell.config & AOS_SHELL_CONFIG_MATCH_CASE) ? "case sensitive" : "case insensitive");
394 357
        retval = AOS_OK;
395 358
      }
396 359
    }
......
536 499
  // handle argument
537 500
  else {
538 501
    if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--hibernate") == 0) {
539
      chEvtBroadcastFlags(&aos.events.os.source, AOS_SYSTEM_EVENTFLAGS_HIBERNATE);
502
      chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_HIBERNATE);
540 503
      chThdTerminate(currp);
541 504
      return AOS_OK;
542 505
    }
543 506
    else if (strcmp(argv[1], "-d") == 0 || strcmp(argv[1], "--deepsleep") == 0) {
544
      chEvtBroadcastFlags(&aos.events.os.source, AOS_SYSTEM_EVENTFLAGS_DEEPSLEEP);
507
      chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_DEEPSLEEP);
545 508
      chThdTerminate(currp);
546 509
      return AOS_OK;
547 510
    }
548 511
    else if (strcmp(argv[1], "-t") == 0 || strcmp(argv[1], "--transportation") == 0) {
549
      chEvtBroadcastFlags(&aos.events.os.source, AOS_SYSTEM_EVENTFLAGS_TRANSPORTATION);
512
      chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_TRANSPORTATION);
550 513
      chThdTerminate(currp);
551 514
      return AOS_OK;
552 515
    }
553 516
    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--restart") == 0) {
554
      chEvtBroadcastFlags(&aos.events.os.source, AOS_SYSTEM_EVENTFLAGS_RESTART);
517
      chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_RESTART);
555 518
      chThdTerminate(currp);
556 519
      return AOS_OK;
557 520
    }
......
598 561
static void _signalPdCallback(EXTDriver* extp, expchannel_t channel)
599 562
{
600 563
  (void)extp;
601
  (void)channel;
602 564

  
603 565
  chSysLockFromISR();
604
  chEvtBroadcastFlagsI(&aos.events.io.source, aos.events.io.flagsSignalPd);
566
  chEvtBroadcastFlagsI(&aos.events.io, (1 << channel));
605 567
  chSysUnlockFromISR();
606 568

  
607 569
  return;
......
616 578
static void _signalSyncCallback(EXTDriver* extp, expchannel_t channel)
617 579
{
618 580
  (void)extp;
619
  (void)channel;
620 581

  
621 582
#if (AMIROOS_CFG_SSSP_MASTER == true)
622 583
  chSysLockFromISR();
623
  chEvtBroadcastFlagsI(&aos.events.io.source, aos.events.io.flagsSignalSync);
584
  chEvtBroadcastFlagsI(&aos.events.io, (1 << channel));
624 585
  chSysUnlockFromISR();
625 586
#else
626 587
  apalControlGpioState_t s_state;
......
630 591
  // get current uptime
631 592
  aosSysGetUptimeX(&uptime);
632 593
  // read signal S
633
  apalControlGpioGet(_gpioSync, &s_state);
594
  apalControlGpioGet(&moduleSsspGpioSync, &s_state);
634 595
  // if S was toggled from on to off during SSSP operation phase
635
  if (aos.ssspStage == AOS_SSSP_OPERATION && s_state == APAL_GPIO_OFF) {
596
  if (aos.sssp.stage == AOS_SSSP_OPERATION && s_state == APAL_GPIO_OFF) {
636 597
    // align the uptime with the synchronization period
637 598
    if (uptime % AMIROOS_CFG_SSSP_SYSSYNCPERIOD < AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2) {
638 599
      _uptime -= uptime % AMIROOS_CFG_SSSP_SYSSYNCPERIOD;
......
641 602
    }
642 603
  }
643 604
  // broadcast event
644
  chEvtBroadcastFlagsI(&aos.events.io.source, aos.events.io.flagsSignalSync);
605
  chEvtBroadcastFlagsI(&aos.events.io, (1 << channel));
645 606
  chSysUnlockFromISR();
646 607
#endif
647 608

  
......
686 647

  
687 648
  chSysLockFromISR();
688 649
  // read and toggle signal S
689
  apalControlGpioGet(_gpioSync, &s_state);
650
  apalControlGpioGet(&moduleSsspGpioSync, &s_state);
690 651
  s_state = (s_state == APAL_GPIO_ON) ? APAL_GPIO_OFF : APAL_GPIO_ON;
691
  apalControlGpioSet(_gpioSync, s_state);
652
  apalControlGpioSet(&moduleSsspGpioSync, s_state);
692 653
  // if S was toggled from off to on
693 654
  if (s_state == APAL_GPIO_ON) {
694 655
    // reconfigure the timer precisely, because the logically falling edge (next interrupt) snychronizes the system time
......
711 672
 * @brief   AMiRo-OS system initialization.
712 673
 * @note    Must be called from the system control thread (usually main thread).
713 674
 *
714
 * @param[in] extDrv        Pointer to the interrupt driver.
715
 * @param[in] extCfg        Configuration for the interrupt driver.
716
 * @param[in] gpioPd        GPIO of the PD signal.
717
 * @param[in] gpioSync      GPIO of the Sync signal
718
 * @param[in] evtFlagsPd    Event flags to be set when a PD interrupt occurs.
719
 * @param[in] evtFlagsSync  Event flags to be set when a Sync interrupt occurs.
720 675
 * @param[in] shellPrompt   String to be printed as prompt of the system shell.
721
 * @param[in] stdio         Default (usually physically) interface for I/O like shell.
722 676
 */
723
void aosSysInit(EXTDriver* extDrv,
724
                EXTConfig* extCfg,
725
                apalControlGpio_t* gpioPd,
726
                apalControlGpio_t* gpioSync,
727
                eventflags_t evtFlagsPd,
728
                eventflags_t evtFlagsSync,
729
                const char* shellPrompt)
677
#if (AMIROOS_CFG_SHELL_ENABLE == true) || defined(__DOXYGEN__)
678
void aosSysInit(const char* shellPrompt)
679
#else
680
void aosSysInit(void)
681
#endif
730 682
{
731
  // check arguments
732
  aosDbgCheck(extDrv != NULL);
733
  aosDbgCheck(extCfg != NULL);
734
  aosDbgCheck(gpioPd != NULL);
735
  aosDbgCheck(gpioSync != NULL);
736

  
737 683
  // set control thread to maximum priority
738 684
  chThdSetPriority(AOS_THD_CTRLPRIO);
739 685

  
740 686
  // set local variables
741
  _gpioPd = gpioPd;
742
  _gpioSync = gpioSync;
743 687
  chVTObjectInit(&_systimer);
744 688
  _synctime = 0;
745 689
  _uptime = 0;
......
749 693
#endif
750 694

  
751 695
  // set aos configuration
752
  aos.ssspStage = AOS_SSSP_STARTUP_2_1;
696
  aos.sssp.stage = AOS_SSSP_STARTUP_2_1;
697
  aos.sssp.moduleId = 0;
753 698
  aosIOStreamInit(&aos.iostream);
754
  chEvtObjectInit(&aos.events.io.source);
755
  chEvtObjectInit(&aos.events.os.source);
756
  aos.events.io.flagsSignalPd = evtFlagsPd;
757
  aos.events.io.flagsSignalSync = evtFlagsSync;
699
  chEvtObjectInit(&aos.events.io);
700
  chEvtObjectInit(&aos.events.os);
758 701

  
759 702
  // setup external interrupt system
760
  extCfg->channels[gpioPd->gpio->pad].cb = _signalPdCallback;
761
  extCfg->channels[gpioSync->gpio->pad].cb = _signalSyncCallback;
762
  extStart(extDrv, extCfg);
703
  moduleHalExtConfig.channels[moduleSsspGpioPd.gpio->pad].cb = _signalPdCallback;
704
  moduleHalExtConfig.channels[moduleSsspGpioSync.gpio->pad].cb = _signalSyncCallback;
705
  extStart(&MODULE_HAL_EXT, &moduleHalExtConfig);
763 706

  
764 707
#if (AMIROOS_CFG_SHELL_ENABLE == true)
765 708
  // init shell
766
  aosShellInit(aos.shell,
767
               &aos.events.os.source,
709
  aosShellInit(&aos.shell,
710
               &aos.events.os,
768 711
               shellPrompt,
769 712
               _shell_line,
770 713
               AMIROOS_CFG_SHELL_LINEWIDTH,
771 714
               _shell_arglist,
772 715
               AMIROOS_CFG_SHELL_MAXARGS);
773 716
  // add system commands
774
  aosShellAddCommand(aos.shell, &_shellcmd_config);
775
  aosShellAddCommand(aos.shell, &_shellcmd_info);
776
  aosShellAddCommand(aos.shell, &_shellcmd_shutdown);
717
  aosShellAddCommand(&aos.shell, &_shellcmd_config);
718
  aosShellAddCommand(&aos.shell, &_shellcmd_info);
719
  aosShellAddCommand(&aos.shell, &_shellcmd_shutdown);
777 720
#if (AMIROOS_CFG_TESTS_ENABLE == true)
778
  aosShellAddCommand(aos.shell, &_shellcmd_kerneltest);
721
  aosShellAddCommand(&aos.shell, &_shellcmd_kerneltest);
779 722
#endif
780
#else
781
  (void)shellPrompt;
782 723
#endif
783 724

  
784 725
  return;
......
790 731
inline void aosSysStart(void)
791 732
{
792 733
  // update the system SSSP stage
793
  aos.ssspStage = AOS_SSSP_OPERATION;
734
  aos.sssp.stage = AOS_SSSP_OPERATION;
794 735

  
795 736
  // print system information;
796 737
  _printSystemInfo((BaseSequentialStream*)&aos.iostream);
......
798 739

  
799 740
#if (AMIROOS_CFG_SHELL_ENABLE == true)
800 741
  // start system shell thread
801
  aos.shell->thread = chThdCreateStatic(_shell_wa, sizeof(_shell_wa), AMIROOS_CFG_SHELL_THREADPRIO, aosShellThread, aos.shell);
742
  aos.shell.thread = chThdCreateStatic(_shell_wa, sizeof(_shell_wa), AMIROOS_CFG_SHELL_THREADPRIO, aosShellThread, &aos.shell);
802 743
#endif
803 744

  
804 745
  return;
......
822 763
  apalControlGpioState_t s;
823 764

  
824 765
  // update the system SSSP stage
825
  aos.ssspStage = AOS_SSSP_STARTUP_2_2;
766
  aos.sssp.stage = AOS_SSSP_STARTUP_2_2;
826 767

  
827 768
  // deactivate the sync signal to indicate that the module is ready (SSSPv1 stage 2.1 of startup phase)
828
  apalControlGpioSet(_gpioSync, APAL_GPIO_OFF);
769
  apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
829 770

  
830 771
  // wait for any event to occur (do not apply any filter in order not to miss any event)
831 772
  m = chEvtWaitOne(ALL_EVENTS);
832 773
  f = chEvtGetAndClearFlags(syncEvtListener);
833
  apalControlGpioGet(_gpioSync, &s);
774
  apalControlGpioGet(&moduleSsspGpioSync, &s);
834 775

  
835 776
  // if the event was a system event,
836 777
  //   and it was fired because of the SysSync control signal,
837 778
  //   and the SysSync control signal has been deactivated
838 779
  if (m & syncEvtListener->events &&
839
      f == aos.events.io.flagsSignalSync &&
780
      f == MODULE_SSSP_EVENTFLAGS_SYNC &&
840 781
      s == APAL_GPIO_OFF) {
841 782
    chSysLock();
842 783
#if (AMIROOS_CFG_SSSP_MASTER == true)
......
922 863
#endif
923 864

  
924 865
  // update the system SSSP stage
925
  aos.ssspStage = AOS_SSSP_SHUTDOWN_1_1;
866
  aos.sssp.stage = AOS_SSSP_SHUTDOWN_1_1;
926 867

  
927 868
  // activate the SYS_PD control signal only, if this module initiated the shutdown
928 869
  chSysLock();
929 870
  if (shutdown != AOS_SHUTDOWN_PASSIVE) {
930
    apalControlGpioSet(_gpioPd, APAL_GPIO_ON);
871
    apalControlGpioSet(&moduleSsspGpioPd, APAL_GPIO_ON);
931 872
  }
932 873
  // activate the SYS_SYNC signal
933
  apalControlGpioSet(_gpioSync, APAL_GPIO_ON);
874
  apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
934 875
  chSysUnlock();
935 876

  
936 877
  switch (shutdown) {
937 878
    case AOS_SHUTDOWN_PASSIVE:
938
      chEvtBroadcastFlags(&aos.events.os.source, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN);
879
      chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_SHUTDOWN);
939 880
      aosprintf("shutdown request received...\n");
940 881
      break;
941 882
    case AOS_SHUTDOWN_HIBERNATE:
942
      chEvtBroadcastFlags(&aos.events.os.source, AOS_SYSTEM_EVENTFLAGS_HIBERNATE);
883
      chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_HIBERNATE);
943 884
      aosprintf("shutdown to hibernate mode...\n");
944 885
      break;
945 886
    case AOS_SHUTDOWN_DEEPSLEEP:
946
      chEvtBroadcastFlags(&aos.events.os.source, AOS_SYSTEM_EVENTFLAGS_DEEPSLEEP);
887
      chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_DEEPSLEEP);
947 888
      aosprintf("shutdown to deepsleep mode...\n");
948 889
      break;
949 890
    case AOS_SHUTDOWN_TRANSPORTATION:
950
      chEvtBroadcastFlags(&aos.events.os.source, AOS_SYSTEM_EVENTFLAGS_TRANSPORTATION);
891
      chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_TRANSPORTATION);
951 892
      aosprintf("shutdown to transportation mode...\n");
952 893
      break;
953 894
    case AOS_SHUTDOWN_RESTART:
954
      chEvtBroadcastFlags(&aos.events.os.source, AOS_SYSTEM_EVENTFLAGS_RESTART);
895
      chEvtBroadcastFlags(&aos.events.os, AOS_SYSTEM_EVENTFLAGS_RESTART);
955 896
      aosprintf("restarting system...\n");
956 897
      break;
957 898
   // must never occur
......
961 902
  }
962 903

  
963 904
  // update the system SSSP stage
964
  aos.ssspStage = AOS_SSSP_SHUTDOWN_1_2;
905
  aos.sssp.stage = AOS_SSSP_SHUTDOWN_1_2;
965 906

  
966 907
  return;
967 908
}
......
972 913
void aosSysStop(void)
973 914
{
974 915
#if (AMIROOS_CFG_SHELL_ENABLE == true)
975
  chThdWait(aos.shell->thread);
916
  chThdWait(aos.shell.thread);
976 917
#endif
977 918

  
978 919
  return;
......
1003 944
  extStop(extDrv);
1004 945

  
1005 946
  // update the system SSSP stage
1006
  aos.ssspStage = AOS_SSSP_SHUTDOWN_1_3;
947
  aos.sssp.stage = AOS_SSSP_SHUTDOWN_1_3;
1007 948

  
1008 949
  // call bootloader callback depending on arguments
1009 950
  switch (shutdown) {

Also available in: Unified diff