Revision c53ef0b1 core/src/aos_main.cpp

View differences:

core/src/aos_main.cpp
49 49

  
50 50
#if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
51 51

  
52

  
53
#if (AMIROOS_CFG_SSSP_MSI == true) || defined(__DOXYGEN__)
54

  
55
/**
56
 * @brief   Event mask to identify SSSP timeout events (MSI only).
57
 */
58
#define EVENTMASK_SSSPTIMEOUT                   EVENT_MASK(2)
59

  
60
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
61

  
52 62
/**
53
 * @brief   Event mask to identify SSSP timer events.
63
 * @brief   Event mask to identify SSSP delay events.
54 64
 */
55
#define EVENTMASK_SSSPTIMER                     EVENT_MASK(2)
65
#define EVENTMASK_SSSPDELAY                     EVENT_MASK(3)
56 66

  
57 67
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
58 68

  
......
273 283
  /* event associations */
274 284
#if (AMIROOS_CFG_SSSP_ENABLE == true)
275 285
  {
276
    eventflags_t flagsmask = AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK | MODULE_SSSP_EVENTFLAG_PD | MODULE_SSSP_EVENTFLAG_S;
286
    eventflags_t flagsmask = AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK | moduleSsspEventflagPD() | moduleSsspEventflagS();
277 287
#if (AMIROOS_CFG_SSSP_MSI == true)
278 288
#if (AMIROOS_CFG_SSSP_STACK_START != true)
279
    flagsmask |= MODULE_SSSP_EVENTFLAG_DN;
289
    flagsmask |= moduleSsspEventflagDN();
280 290
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
281 291
#if (AMIROOS_CFG_SSSP_STACK_END != true)
282
    flagsmask |= MODULE_SSSP_EVENTFLAG_UP;
292
    flagsmask |= moduleSsspEventflagUP();
283 293
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
284 294
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
285 295
    chEvtRegisterMaskWithFlags(&aos.events.gpio, &_eventListenerGPIO, EVENTMASK_GPIO, flagsmask);
......
305 315

  
306 316
  // proceed to startup stage 1.2
307 317
#if (AMIROOS_CFG_SSSP_MASTER == true)
308
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
318
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, EVENTMASK_SSSPDELAY, &eventmask) != AOS_SUCCESS)) {
309 319
    /*
310 320
     * This code is executed if the received event was not about the delay.
311 321
     * The received event could be casued by any listener.
......
314 324
    if (eventmask & _eventListenerGPIO.events) {
315 325
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
316 326
      // PD event
317
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
327
      if (eventflags & moduleSsspEventflagPD()) {
318 328
        shutdown = AOS_SHUTDOWN_PASSIVE;
319 329
      } else {
320 330
#if defined(MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK)
......
339 349
  }
340 350
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
341 351
  if (shutdown == AOS_SHUTDOWN_NONE) {
342
    aosSsspProceed(NULL, 0, 0, NULL);
352
    aosSsspProceed(NULL, 0, NULL);
343 353
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_1_2);
344 354
  }
345 355
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
346 356

  
347 357
  // proceed to startup stage 1.3
348
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
358
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
349 359
    /*
350 360
     * This code is executed if the received event was not about a deactivation of the snychronization signal.
351 361
     * The received event could be caused by any listener.
......
354 364
    if (eventmask & _eventListenerGPIO.events) {
355 365
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
356 366
      // PD event
357
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
367
      if (eventflags & moduleSsspEventflagPD()) {
358 368
        shutdown = AOS_SHUTDOWN_PASSIVE;
359 369
      } else {
360 370
#if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK)
......
380 390

  
381 391
  // proceed to startup stage 2.1
382 392
#if (AMIROOS_CFG_SSSP_MASTER == true)
383
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
393
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, EVENTMASK_SSSPDELAY, &eventmask) != AOS_SUCCESS)) {
384 394
    /*
385 395
     * This code is executed if the received event was not about the delay.
386 396
     * The received event could be caused by any listener.
......
389 399
    if (eventmask & _eventListenerGPIO.events) {
390 400
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
391 401
      // PD event
392
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
402
      if (eventflags & moduleSsspEventflagPD()) {
393 403
        shutdown = AOS_SHUTDOWN_PASSIVE;
394 404
      } else {
395 405
#if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK)
......
410 420
    }
411 421
  }
412 422
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
413
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
423
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
414 424
    /*
415 425
     * This code is executed if the received event was not about a deactivation of the snychronization signal.
416 426
     * The received event could be caused by any listener.
......
419 429
    if (eventmask & _eventListenerGPIO.events) {
420 430
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
421 431
      // PD event
422
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
432
      if (eventflags & moduleSsspEventflagPD()) {
423 433
        shutdown = AOS_SHUTDOWN_PASSIVE;
424 434
      } else {
425 435
#if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK)
......
525 535

  
526 536
  // proceed to startup stage 2.2
527 537
#if (AMIROOS_CFG_SSSP_MASTER == true)
528
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
538
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, EVENTMASK_SSSPDELAY, &eventmask) != AOS_SUCCESS)) {
529 539
    /*
530 540
     * This code is executed if the received event was not about the delay.
531 541
     * The received event could be caused by any listener.
......
534 544
    if (eventmask & _eventListenerGPIO.events) {
535 545
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
536 546
      // PD event
537
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
547
      if (eventflags & moduleSsspEventflagPD()) {
538 548
        shutdown = AOS_SHUTDOWN_PASSIVE;
539 549
      } else {
540 550
#if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK)
......
559 569
  }
560 570
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
561 571
  if (shutdown == AOS_SHUTDOWN_NONE) {
562
    aosSsspProceed(NULL, 0, 0, NULL);
572
    aosSsspProceed(NULL, 0, NULL);
563 573
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_2_2);
564 574
  }
565 575
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
566 576

  
567 577
  // proceed to startup stage 3 (MSI is enabled), or to operation phase (no MSI)
568
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
578
  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
569 579
    /*
570 580
     * This code is executed if the received event was not about a deactivation of the snychronization signal.
571 581
     * The received event could be caused by any listener.
......
574 584
    if (eventmask & _eventListenerGPIO.events) {
575 585
      eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
576 586
      // PD event
577
      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
587
      if (eventflags & moduleSsspEventflagPD()) {
578 588
        shutdown = AOS_SHUTDOWN_PASSIVE;
579 589
      } else {
580 590
#if defined(MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK)
......
596 606
  }
597 607
  if (shutdown == AOS_SHUTDOWN_NONE) {
598 608
#if (AMIROOS_CFG_SSSP_MSI == true)
599
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_1);
609
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3);
600 610
#else /* (AMIROOS_CFG_SSSP_MSI == true) */
601 611
    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_OPERATION);
602 612
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
......
607 617
   */
608 618

  
609 619
#if (AMIROOS_CFG_SSSP_MSI == true)
610

  
611
  //TODO: MSI
620
  {
621
    // initialize temporary MSI data
622
    aos_ssspmsidata_t msidata;
623
    aosSsspMsiInit(&msidata, EVENTMASK_SSSPDELAY, EVENTMASK_SSSPTIMEOUT, &_eventListenerGPIO);
624

  
625
    // execute module stack initialization (MSI) but react to unrelated events as well
626
    while ((shutdown == AOS_SHUTDOWN_NONE) && (aos.sssp.stage != AOS_SSSP_STAGE_OPERATION)) {
627
      // execute MSI routine
628
      aosSsspMsi(&msidata, &eventmask);
629
      // handly event (if any)
630
      if (eventmask) {
631
        // GPIO event
632
        if (eventmask & _eventListenerGPIO.events) {
633
          eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
634
          // PD event
635
          if (eventflags & moduleSsspEventflagPD()) {
636
            shutdown = AOS_SHUTDOWN_PASSIVE;
637
          } else {
638
  #if defined(MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK)
639
            MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK(eventmask, eventflags);
640
  #else /* defined(MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK) */
641
            /* silently ignore any other GPIO events */
642
  #endif /* defined(MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK) */
643
          }
644
        }
645
        // OS event
646
        else if (eventmask & _eventListenerOS.events) {
647
          eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
648
          _unexpectedEventError(eventmask, eventflags);
649
        }
650
        // unknown event
651
        else {
652
          _unexpectedEventError(eventmask, 0);
653
        }
654
      }
655
    }
656
  }
612 657

  
613 658
#if (HAL_USE_RTC == TRUE)
614 659

  
......
640 685

  
641 686
#if (AMIROOS_CFG_SSSP_ENABLE == true)
642 687
  /* ignore all SSSP signal events, except for PD and configured events */
643
  eventflags = MODULE_SSSP_EVENTFLAG_S;
688
  eventflags = moduleSsspEventflagS();
644 689
#if (AMIROOS_CFG_SSSP_MSI == true)
645 690
#if (AMIROOS_CFG_SSSP_STACK_START != true)
646
  eventflags |= MODULE_SSSP_EVENTFLAG_DN;
691
  eventflags |= moduleSsspEventflagDN();
647 692
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
648 693
#if (AMIROOS_CFG_SSSP_STACK_END != true)
649
  eventflags |= MODULE_SSSP_EVENTFLAG_UP;
694
  eventflags |= moduleSsspEventflagUP();
650 695
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
651 696
#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
652 697
  eventflags &= ~((eventflags_t)AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK);
......
677 722
        eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
678 723
#if (AMIROOS_CFG_SSSP_ENABLE == true)
679 724
        // PD event
680
        if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
725
        if (eventflags & moduleSsspEventflagPD()) {
681 726
          aosSsspShutdownInit(false);
682 727
          shutdown = AOS_SHUTDOWN_PASSIVE;
683 728
        }
......
742 787
     * Note that events for the optional signals UP and DN are not enabled as they are not utilized during SSSP shutdown phase.
743 788
     */
744 789
    chSysLock();
745
    _eventListenerGPIO.wflags |= MODULE_SSSP_EVENTFLAG_S;
790
    _eventListenerGPIO.wflags |= moduleSsspEventflagS();
746 791
    chSysUnlock();
747 792

  
748 793
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
......
816 861
#if (AMIROOS_CFG_SSSP_ENABLE == true)
817 862

  
818 863
  // proceed to SSSP shutdown stage 1.3
819
  aosSsspProceed(NULL, 0, 0, NULL);
864
  aosSsspProceed(NULL, 0, NULL);
820 865
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_1_3);
821 866

  
822 867
#if (AMIROOS_CFG_SSSP_SHUTDOWN == true)
......
828 873
   */
829 874

  
830 875
  // proceed to SSSP shutdown stage 2.1
831
  while (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS) {
876
  while (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS) {
832 877
    /*
833 878
     * This code is executed if the received event was not about a deactivation of the synchronization signal.
834 879
     * The received event could be caused by any listener.
......
855 900
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_1);
856 901

  
857 902
  // proceed to SSSP shutdown stage 2.2
858
  aosSsspProceed(NULL, 0, 0, &eventmask);
903
  aosSsspProceed(NULL, 0, &eventmask);
859 904
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_2);
860 905
  if (shutdown == AOS_SHUTDOWN_PASSIVE) {
861 906
    aosDbgPrintf("%s request received\n", eventmask ? "shutdown" : "restart");
......
875 920
    unsigned int identifier = 0;
876 921

  
877 922
    // receive the identifier, which specifies the type of shutdown/restart
878
    while ((eventmask = aosSsspShutdownWaitForIdentifierPulse(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_SSSPTIMER, &identifier)) != EVENTMASK_SSSPTIMER) {
923
    while ((eventmask = aosSsspShutdownWaitForIdentifierPulse(&_eventListenerGPIO, moduleSsspEventflagS(), EVENTMASK_SSSPDELAY, &identifier)) != EVENTMASK_SSSPDELAY) {
879 924
      // GPIO event
880 925
      if (eventmask & _eventListenerGPIO.events) {
881 926
        eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
......
901 946
  }
902 947

  
903 948
  // proceed to SSSP shutdown stage 2.3
904
  aosSsspProceed(NULL, 0, 0, NULL);
949
  aosSsspProceed(NULL, 0, NULL);
905 950
  aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_3);
906 951

  
907 952
  /*

Also available in: Unified diff