Revision 10687985 devices/LightRing/main.cpp

View differences:

devices/LightRing/main.cpp
23 23

  
24 24
Global global;
25 25

  
26
struct blVersion_t {
27
  const uint8_t identifier;
28
  const uint8_t major;
29
  const uint8_t minor;
30
  const uint8_t patch;
31
} __attribute__((packed));
32

  
26 33
void shellRequestShutdown(BaseSequentialStream* chp, int argc, char *argv[]) {
27 34

  
28 35
  chprintf(chp, "shellRequestShutdown\n");
......
430 437

  
431 438
void shellRequestGetBootloaderInfo(BaseSequentialStream* chp, int argc, char *argv[]) {
432 439
  // check the magic number
433
  if (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR)) == BL_MAGIC_NUMBER) {
434
    chprintf(chp, "Bootloader version:  %u.%u.%u\n",
435
             *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))),
436
             *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (2*4))),
437
             *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (3*4))));
438
    chprintf(chp, "Callback functions:\n");if (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))) == 0 && *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (2*4))) == 2) {
439
      chprintf(chp, "\thibernate:      %s\n", *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (4*4))) ? "available" : "unsupported");
440
      chprintf(chp, "\tdeepsleep:      %s\n", *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (5*4))) ? "available" : "unsupported");
441
      chprintf(chp, "\ttransportation: %s\n", *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (6*4))) ? "available" : "unsupported");
442
      chprintf(chp, "\trestart:        %s\n", *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (10*4))) ? "available" : "unsupported");
443
    } else if (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))) == 0 && *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (2*4))) == 3) {
444
      chprintf(chp, "\thibernate:      %s\n", *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (4*4))) ? "available" : "unsupported");
445
      chprintf(chp, "\tdeepsleep:      %s\n", *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (5*4))) ? "available" : "unsupported");
446
      chprintf(chp, "\ttransportation: %s\n", *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (6*4))) ? "available" : "unsupported");
447
      chprintf(chp, "\trestart:        %s\n", *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (7*4))) ? "available" : "unsupported");
448
      chprintf(chp, "\thandle request: %s\n", *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (8*4))) ? "available" : "unsupported");
449
    }
450
  } else {
451
    chprintf((BaseSequentialStream*) &SD1, "Bootloader deprecated\n");
440
  switch (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR))) {
441
    case (('A'<<24) | ('-'<<16) | ('B'<<8) | ('L'<<0)):
442
      chprintf((BaseSequentialStream*) &SD1, "Bootloader %u.%u.%u\n",
443
               ((blVersion_t*)(BL_CALLBACK_TABLE_ADDR + (1*4)))->major,
444
               ((blVersion_t*)(BL_CALLBACK_TABLE_ADDR + (1*4)))->minor,
445
               ((blVersion_t*)(BL_CALLBACK_TABLE_ADDR + (1*4)))->patch);
446
      break;
447

  
448
    case BL_MAGIC_NUMBER:
449
      chprintf((BaseSequentialStream*) &SD1, "Bootloader %u.%u.%u\n",
450
               *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))),
451
               *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))),
452
               *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))));
453
      break;
454

  
455
    default:
456
      chprintf((BaseSequentialStream*) &SD1, "Bootloader incompatible\n");
457
      break;
452 458
  }
453 459

  
454 460
  return;
......
500 506

  
501 507
  chprintf((BaseSequentialStream*) &SD1, "\n");
502 508
  chprintf((BaseSequentialStream*) &SD1, BOARD_NAME " " BOARD_VERSION "\n");
503
  if (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR)) == BL_MAGIC_NUMBER) {
504
    chprintf((BaseSequentialStream*) &SD1, "Bootloader %u.%u.%u\n",
505
             *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))),
506
             *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (2*4))),
507
             *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (3*4))));
508
  } else {
509
    chprintf((BaseSequentialStream*) &SD1, "Bootloader deprecated\n");
509
  switch (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR))) {
510
    case (('A'<<24) | ('-'<<16) | ('B'<<8) | ('L'<<0)):
511
      chprintf((BaseSequentialStream*) &SD1, "Bootloader %u.%u.%u\n",
512
               ((blVersion_t*)(BL_CALLBACK_TABLE_ADDR + (1*4)))->major,
513
               ((blVersion_t*)(BL_CALLBACK_TABLE_ADDR + (1*4)))->minor,
514
               ((blVersion_t*)(BL_CALLBACK_TABLE_ADDR + (1*4)))->patch);
515
      break;
516

  
517
    case BL_MAGIC_NUMBER:
518
      chprintf((BaseSequentialStream*) &SD1, "Bootloader %u.%u.%u\n",
519
               *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))),
520
               *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))),
521
               *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))));
522
      break;
523

  
524
    default:
525
      chprintf((BaseSequentialStream*) &SD1, "Bootloader incompatible\n");
526
      break;
510 527
  }
511 528
  chprintf((BaseSequentialStream*) &SD1, "ChibiOS " CH_KERNEL_VERSION "\n");
512 529
  // make sure that the info text is completetly printed
......
572 589
//    testFade();
573 590
//    testBrightness();
574 591
    if (shutdown_now != SHUTDOWN_NONE) {
575
      if (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR)) != BL_MAGIC_NUMBER) {
592
      if ((*((uint32_t*)(BL_CALLBACK_TABLE_ADDR)) != (('A'<<24) | ('-'<<16) | ('B'<<8) | ('L'<<0))) && (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR)) != BL_MAGIC_NUMBER)) {
576 593
        chprintf((BaseSequentialStream*) &SD1, "ERROR: unable to shut down (bootloader deprecated).\n");
577 594
        shutdown_now = SHUTDOWN_NONE;
578 595
      } else {
579 596
        uint32_t blCallbackPtrAddr = BL_CALLBACK_TABLE_ADDR;
580
        if (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))) == 0 && *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (2*4))) == 2) {
597
        // handle bootloader version 0.2.x
598
        if ((*((uint32_t*)(BL_CALLBACK_TABLE_ADDR)) == BL_MAGIC_NUMBER) &&
599
            (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))) == 0 && *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (2*4))) == 2)) {
581 600
          switch (shutdown_now) {
582 601
            case SHUTDOWN_TRANSPORTATION:
583 602
              blCallbackPtrAddr += 6 * 4;
......
596 615
              blCallbackPtrAddr = 0;
597 616
              break;
598 617
          }
599
        } else if (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))) == 0 && *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (2*4))) == 3) {
618
        }
619
        // handle bootloader version 0.3.x
620
        else if ((*((uint32_t*)(BL_CALLBACK_TABLE_ADDR)) == BL_MAGIC_NUMBER) &&
621
                 (*((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (1*4))) == 0 && *((uint32_t*)(BL_CALLBACK_TABLE_ADDR + (2*4))) == 3)) {
622
          switch (shutdown_now) {
623
            case SHUTDOWN_TRANSPORTATION:
624
              blCallbackPtrAddr += 6 * 4;
625
              break;
626
            case SHUTDOWN_DEEPSLEEP:
627
              blCallbackPtrAddr += 5 * 4;
628
              break;
629
            case SHUTDOWN_HIBERNATE:
630
              blCallbackPtrAddr += 4 * 4;
631
              break;
632
            case SHUTDOWN_RESTART:
633
              blCallbackPtrAddr += 7 * 4;
634
              break;
635
            case SHUTDOWN_HANDLE_REQUEST:
636
              blCallbackPtrAddr += 8 * 4;
637
              break;
638
            default:
639
              blCallbackPtrAddr = 0;
640
              break;
641
          }
642
        }
643
        // handle bootloader version 1.0.x
644
        else if ((*((uint32_t*)(BL_CALLBACK_TABLE_ADDR)) == (('A'<<24) | ('-'<<16) | ('B'<<8) | ('L'<<0))) &&
645
                 ((blVersion_t*)(BL_CALLBACK_TABLE_ADDR + (1*4)))->major == 1 && ((blVersion_t*)(BL_CALLBACK_TABLE_ADDR + (1*4)))->minor == 0) {
600 646
          switch (shutdown_now) {
601 647
            case SHUTDOWN_TRANSPORTATION:
602 648
              blCallbackPtrAddr += 6 * 4;
......
620 666
        }
621 667

  
622 668
        void (*blCallback)(void) = NULL;
623
        if (blCallbackPtrAddr) {
669
        if (blCallbackPtrAddr > BL_CALLBACK_TABLE_ADDR) {
624 670
          blCallback = (void (*)(void))(*((uint32_t*)blCallbackPtrAddr));
625 671

  
626 672
          if (!blCallback) {
......
640 686
          }
641 687

  
642 688
        } else {
643
          chprintf((BaseSequentialStream*)&SD1, "ERROR: invalid shutdown requested (%u).\n", shutdown_now);
689
          chprintf((BaseSequentialStream*) &SD1, "ERROR: invalid shutdown requested (%u).\n", shutdown_now);
644 690
          shutdown_now = SHUTDOWN_NONE;
645 691
        }
646 692
      }

Also available in: Unified diff