Revision 10687985 devices/LightRing/main.cpp
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