diff --git a/bootloader/boot.cpp b/bootloader/boot.cpp index 85412aa39..7b108fe09 100644 --- a/bootloader/boot.cpp +++ b/bootloader/boot.cpp @@ -36,7 +36,7 @@ void Boot::setMode(BootMode mode) { // We dont use the exam mode driver as storage for the boot mode because we need the 16k of storage x) } -void Boot::busErr() { +void Boot::busError() { if (config()->isBooting()) { config()->slot()->boot(); } @@ -61,7 +61,7 @@ bool Boot::isKernelPatched(const Slot & s) { return *(uint32_t *)(origin_isr + sizeof(uint32_t) * 4) == (uint32_t)&_fake_isr_function_start && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 5) == (uint32_t)&_fake_isr_function_start && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 6) == (uint32_t)&_fake_isr_function_start && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == (uint32_t)&_fake_isr_function_start; } -__attribute((section(".fake_isr_function"))) __attribute__((used)) void Boot::flsh_intr() { +__attribute((section(".fake_isr_function"))) __attribute__((used)) void Boot::flash_interrupt() { // a simple function } @@ -103,9 +103,9 @@ void Boot::bootSlot(Bootloader::Slot s) { // We are trying to boot epsilon, so we check the version and show an advertisement if needed const char * version = s.userlandHeader()->version(); const char * min = "18.2.4"; - int vsum = Utility::versionSum(version, strlen(version)); - int minsum = Utility::versionSum(min, strlen(min)); - if (vsum >= minsum) { + int versionSum = Utility::versionSum(version, strlen(version)); + int minimalVersionTrigger = Utility::versionSum(min, strlen(min)); + if (versionSum >= minimalVersionTrigger) { WarningMenu menu = WarningMenu(); menu.open(); return; diff --git a/bootloader/boot.h b/bootloader/boot.h index 50800f3d5..934d60d66 100644 --- a/bootloader/boot.h +++ b/bootloader/boot.h @@ -40,14 +40,14 @@ public: static bool isKernelPatched(const Slot & slot); static void patchKernel(const Slot & slot); - static void busErr(); + static void busError(); __attribute__ ((noreturn)) static void boot(); static void bootSlot(Bootloader::Slot slot); static void bootSelectedSlot(); __attribute__ ((noreturn)) static void jumpToInternalBootloader(); - __attribute((section(".fake_isr_function"))) __attribute__((used)) static void flsh_intr(); + __attribute((section(".fake_isr_function"))) __attribute__((used)) static void flash_interrupt(); static void bootloader(); static void lockInternal(); diff --git a/bootloader/boot/rt0.cpp b/bootloader/boot/rt0.cpp index 65eedf985..06221b252 100644 --- a/bootloader/boot/rt0.cpp +++ b/bootloader/boot/rt0.cpp @@ -50,7 +50,7 @@ void __attribute__((noinline)) usage_fault_handler() { } void __attribute__((noinline)) bus_fault_handler() { - Bootloader::Boot::busErr(); + Bootloader::Boot::busError(); } /* In order to ensure that this method is execute from the external flash, we diff --git a/bootloader/drivers/stm32_drivers.cpp b/bootloader/drivers/stm32_drivers.cpp index 6fd018aab..ac5d09752 100644 --- a/bootloader/drivers/stm32_drivers.cpp +++ b/bootloader/drivers/stm32_drivers.cpp @@ -1,5 +1,20 @@ #include "stm32_drivers.h" +/** + * THIS CODE COMES FROM THE STM32_HAL LIBRARY (LICENSE ABOVE) AND HAVE BEEN MODIFIED + * WE USE ONLY THE HAL_deinit, RCC_deinit and systick_deninit FUNCTIONS AND ONLY COPIED THE CODE NEEDED. + * WE NEEDED THIS CODE TO BE ABLE TO BOOT THE STM32 BOOTLOADER + */ + +/* +This software component is provided to you as part of a software package and +applicable license terms are in the Package_license file. If you received this +software component outside of a package or without applicable license terms, +the terms of the BSD-3-Clause license shall apply. +You may obtain a copy of the BSD-3-Clause at: +https://opensource.org/licenses/BSD-3-Clause +*/ + void STM32::rcc_deinit() { SET_BIT(STM_32_RCC->CR, (0x1UL << (0U))); while (READ_BIT(STM_32_RCC->CR, (0x1UL << (1U))) == 0) {} diff --git a/bootloader/drivers/stm32_drivers.h b/bootloader/drivers/stm32_drivers.h index 50f723ba6..9efa636dd 100644 --- a/bootloader/drivers/stm32_drivers.h +++ b/bootloader/drivers/stm32_drivers.h @@ -5,6 +5,12 @@ Now we include the license of the original code as required. */ +/** + * THIS CODE COMES FROM THE STM32_HAL LIBRARY (LICENSE ABOVE) AND HAVE BEEN MODIFIED + * WE USE ONLY THE HAL_deinit, RCC_deinit and systick_deninit FUNCTIONS AND ONLY COPIED THE CODE NEEDED. + * WE NEEDED THIS CODE TO BE ABLE TO BOOT THE STM32 BOOTLOADER + */ + /* This software component is provided to you as part of a software package and applicable license terms are in the Package_license file. If you received this diff --git a/bootloader/interface/menus/about.h b/bootloader/interface/menus/about.h index b4c43d57c..00f482705 100644 --- a/bootloader/interface/menus/about.h +++ b/bootloader/interface/menus/about.h @@ -9,7 +9,7 @@ namespace Bootloader { AboutMenu(); void setup() override; - void post_open() override {}; + void postOpen() override {}; }; } diff --git a/bootloader/interface/menus/crash.cpp b/bootloader/interface/menus/crash.cpp index 2124eafb3..242299bc2 100644 --- a/bootloader/interface/menus/crash.cpp +++ b/bootloader/interface/menus/crash.cpp @@ -14,7 +14,7 @@ void Bootloader::CrashMenu::setup() { m_columns[2] = ColumnBinder(&m_default_columns[2]); } -void Bootloader::CrashMenu::post_open() { +void Bootloader::CrashMenu::postOpen() { // We override the open method for (;;) { // Infinite loop diff --git a/bootloader/interface/menus/crash.h b/bootloader/interface/menus/crash.h index 50a66d486..bcb74ec81 100644 --- a/bootloader/interface/menus/crash.h +++ b/bootloader/interface/menus/crash.h @@ -9,7 +9,7 @@ namespace Bootloader { CrashMenu(const char * error); void setup() override; - void post_open() override; + void postOpen() override; private: const char * m_error; diff --git a/bootloader/interface/menus/dfu.cpp b/bootloader/interface/menus/dfu.cpp index e09598cb6..88e705e52 100644 --- a/bootloader/interface/menus/dfu.cpp +++ b/bootloader/interface/menus/dfu.cpp @@ -2,17 +2,17 @@ #include #include -Bootloader::DfuMenu::DfuMenu(const char * text, const USBData * data) : Menu(KDColorBlack, KDColorWhite, Messages::dfuTitle, Messages::mainTitle), m_submenu_text(text), m_data(data) { +Bootloader::DfuMenu::DfuMenu(const char * text, const USBData * data) : Menu(KDColorBlack, KDColorWhite, Messages::dfuTitle, Messages::mainTitle), m_submenuText(text), m_data(data) { setup(); } void Bootloader::DfuMenu::setup() { - m_default_columns[0] = Column(m_submenu_text, k_small_font, 0, true); + m_default_columns[0] = Column(m_submenuText, k_small_font, 0, true); m_columns[0] = ColumnBinder(&m_default_columns[0]); } -void Bootloader::DfuMenu::post_open() { +void Bootloader::DfuMenu::postOpen() { // We override the open method if (!m_data->getData().isProtectedInternal() && m_data->getData().isProtectedExternal()) { // Because we want to flash the internal, we will jump into the stm32 bootloader diff --git a/bootloader/interface/menus/dfu.h b/bootloader/interface/menus/dfu.h index ddb957fcb..b81739382 100644 --- a/bootloader/interface/menus/dfu.h +++ b/bootloader/interface/menus/dfu.h @@ -10,10 +10,10 @@ namespace Bootloader { DfuMenu(const char * submenu, const USBData * usbData); void setup() override; - void post_open() override; + void postOpen() override; private: - const char * m_submenu_text; + const char * m_submenuText; const USBData * m_data; }; } diff --git a/bootloader/interface/menus/home.cpp b/bootloader/interface/menus/home.cpp index c5f9bbed2..61c69f95a 100644 --- a/bootloader/interface/menus/home.cpp +++ b/bootloader/interface/menus/home.cpp @@ -52,24 +52,14 @@ bool about_submenu() { return true; } -const char * Bootloader::HomeMenu::slotA_text() { - return Slot::isFullyValid(Slot::A()) ? Messages::homeSlotASubmenu : Messages::invalidSlot; -} - -const char * Bootloader::HomeMenu::slotA_kernel_text() { - return Slot::isFullyValid(Slot::A()) ? Slot::A().kernelHeader()->patchLevel() : nullptr; -} - -const char * Bootloader::HomeMenu::slotA_version_text() { - return Slot::isFullyValid(Slot::A()) ? Slot::A().userlandHeader()->isOmega() && Slot::A().userlandHeader()->isUpsilon() ? Slot::A().userlandHeader()->upsilonVersion() : Slot::A().userlandHeader()->isOmega() ? Slot::A().userlandHeader()->omegaVersion() : Slot::A().kernelHeader()->version() : nullptr; -} - -const char * Bootloader::HomeMenu::slotA_os_text() { - if (Slot::isFullyValid(Slot::A())) { - if (Slot::A().userlandHeader()->isOmega() && Slot::A().userlandHeader()->isUpsilon()) { +const char * Bootloader::HomeMenu::getSlotOsText(Slot slot) { + if (Slot::isFullyValid(slot)) { + if (slot.userlandHeader()->isOmega() && slot.userlandHeader()->isUpsilon()) { return Messages::upsilonSlot; - } else if (Slot::A().userlandHeader()->isOmega()) { + } else if (slot.userlandHeader()->isOmega() && slot.kernelHeader()->patchLevel()[0] != '\0') { return Messages::omegaSlot; + } else if (slot.userlandHeader()->isOmega()) { + return Messages::khiSlot; } else { return Messages::epsilonSlot; } @@ -77,68 +67,43 @@ const char * Bootloader::HomeMenu::slotA_os_text() { return nullptr; } -const char * Bootloader::HomeMenu::slotKhi_text() { - return Slot::isFullyValid(Slot::Khi()) ? Messages:: homeSlotKhiSubmenu : Messages::invalidSlot; -} - -const char * Bootloader::HomeMenu::slotKhi_kernel_text() { - return Slot::isFullyValid(Slot::Khi()) ? Slot::Khi().kernelHeader()->patchLevel() : nullptr; -} - -const char * Bootloader::HomeMenu::slotKhi_os_text() { - if (Slot::isFullyValid(Slot::Khi())) { - if (Slot::Khi().userlandHeader()->isOmega() && Slot::Khi().userlandHeader()->isUpsilon()) { - return Messages::upsilonSlot; - } else if (Slot::Khi().userlandHeader()->isOmega()) { - return Messages::omegaSlot; - } else { - return Messages::epsilonSlot; +const char * Bootloader::HomeMenu::getSlotText(Slot slot) { + if(Slot::isFullyValid(slot)) { + if (slot.address() == Slot::A().address()) { + return Messages::homeSlotASubmenu; + } else if (slot.address() == Slot::Khi().address()) { + return Messages::homeSlotKhiSubmenu; + } else if (slot.address() == Slot::B().address()) { + return Messages::homeSlotBSubmenu; } } - return nullptr; + return Messages::invalidSlot; } -const char * Bootloader::HomeMenu::slotKhi_version_text() { - return Slot::isFullyValid(Slot::Khi()) ? Slot::Khi().userlandHeader()->isOmega() && Slot::Khi().userlandHeader()->isUpsilon() ? Slot::Khi().userlandHeader()->upsilonVersion() : Slot::Khi().userlandHeader()->isOmega() ? Slot::Khi().userlandHeader()->omegaVersion() : Slot::Khi().kernelHeader()->version() : nullptr; +const char * Bootloader::HomeMenu::getKernelText(Slot slot) { + return Slot::isFullyValid(slot) ? slot.kernelHeader()->patchLevel() : nullptr; } -const char * Bootloader::HomeMenu::slotB_text() { - return Slot::isFullyValid(Slot::B()) ? Messages::homeSlotBSubmenu : Messages::invalidSlot; -} - -const char * Bootloader::HomeMenu::slotB_kernel_text() { - return Slot::isFullyValid(Slot::B()) ? Slot::B().kernelHeader()->patchLevel() : nullptr; -} - -const char * Bootloader::HomeMenu::slotB_os_text() { - if (Slot::isFullyValid(Slot::B())) { - if (Slot::B().userlandHeader()->isOmega() && Slot::B().userlandHeader()->isUpsilon()) { - return Messages::upsilonSlot; - } else if (Slot::B().userlandHeader()->isOmega()) { - return Messages::omegaSlot; - } else { - return Messages::epsilonSlot; - } - } - return nullptr; -} - -const char * Bootloader::HomeMenu::slotB_version_text() { - return Slot::isFullyValid(Slot::B()) ? Slot::B().userlandHeader()->isOmega() && Slot::B().userlandHeader()->isUpsilon() ? Slot::B().userlandHeader()->upsilonVersion() : Slot::B().userlandHeader()->isOmega() ? Slot::B().userlandHeader()->omegaVersion() : Slot::B().kernelHeader()->version() : nullptr; +const char * Bootloader::HomeMenu::getVersionText(Slot slot) { + return Slot::isFullyValid(slot) ? slot.userlandHeader()->isOmega() && slot.userlandHeader()->isUpsilon() ? slot.userlandHeader()->upsilonVersion() : slot.userlandHeader()->isOmega() ? slot.userlandHeader()->omegaVersion() : slot.kernelHeader()->version() : nullptr; } void Bootloader::HomeMenu::setup() { - m_slot_columns[0] = SlotColumn(slotA_text(), slotA_kernel_text(), slotA_os_text(), slotA_version_text(), Ion::Keyboard::Key::One, k_small_font, 10, false, &slotA_submenu); - m_slot_columns[1] = SlotColumn(slotKhi_text(), slotKhi_kernel_text(), slotKhi_os_text(), slotKhi_version_text(), Ion::Keyboard::Key::Two, k_small_font, 10, false, &slotKhi_submenu); - m_slot_columns[2] = SlotColumn(slotB_text(), slotB_kernel_text(), slotB_os_text(), slotB_version_text(), Ion::Keyboard::Key::Three, k_small_font, 10, false, &slotB_submenu); - m_default_columns[0] = Column(Messages::homeInstallerSubmenu, Ion::Keyboard::Key::Four, k_small_font, 10, false, &installer_submenu); - m_default_columns[1] = Column(Messages::homeAboutSubmenu, Ion::Keyboard::Key::Five, k_small_font, 10, false, &about_submenu); - + Slot A = Slot::A(); + Slot Khi = Slot::Khi(); + Slot B = Slot::B(); - m_columns[0] = ColumnBinder(&m_slot_columns[0]); - m_columns[1] = ColumnBinder(&m_slot_columns[1]); - m_columns[2] = ColumnBinder(&m_slot_columns[2]); - m_columns[3] = ColumnBinder(&m_default_columns[0]); - m_columns[4] = ColumnBinder(&m_default_columns[1]); + m_slot_columns[0] = SlotColumn(getSlotText(A), getKernelText(A), getSlotOsText(A), getVersionText(A), Ion::Keyboard::Key::One, k_small_font, 10, false, &slotA_submenu); + m_slot_columns[1] = SlotColumn(getSlotText(Khi), getKernelText(Khi), getSlotOsText(Khi), getVersionText(Khi), Ion::Keyboard::Key::Two, k_small_font, 10, false, &slotKhi_submenu); + m_slot_columns[2] = SlotColumn(getSlotText(B), getKernelText(B), getSlotOsText(B), getVersionText(B), Ion::Keyboard::Key::Three, k_small_font, 10, false, &slotB_submenu); + m_default_columns[0] = Column(Messages::homeInstallerSubmenu, Ion::Keyboard::Key::Four, k_small_font, 10, false, &installer_submenu); + m_default_columns[1] = Column(Messages::homeAboutSubmenu, Ion::Keyboard::Key::Five, k_small_font, 10, false, &about_submenu); + + + m_columns[0] = ColumnBinder(&m_slot_columns[0]); + m_columns[1] = ColumnBinder(&m_slot_columns[1]); + m_columns[2] = ColumnBinder(&m_slot_columns[2]); + m_columns[3] = ColumnBinder(&m_default_columns[0]); + m_columns[4] = ColumnBinder(&m_default_columns[1]); } diff --git a/bootloader/interface/menus/home.h b/bootloader/interface/menus/home.h index 00de3edc3..da6f010b1 100644 --- a/bootloader/interface/menus/home.h +++ b/bootloader/interface/menus/home.h @@ -4,6 +4,7 @@ #include #include #include +#include namespace Bootloader { class HomeMenu : public Menu { @@ -11,24 +12,16 @@ namespace Bootloader { HomeMenu(); void setup() override; - void post_open() override {}; + void postOpen() override {}; static AboutMenu * aboutMenu(); static InstallerMenu * installerMenu(); private: - const char * slotA_text(); - const char * slotA_kernel_text(); - const char * slotA_os_text(); - const char * slotA_version_text(); - const char * slotKhi_text(); - const char * slotKhi_kernel_text(); - const char * slotKhi_os_text(); - const char * slotKhi_version_text(); - const char * slotB_text(); - const char * slotB_kernel_text(); - const char * slotB_os_text(); - const char * slotB_version_text(); + const char * getSlotOsText(Slot slot); + const char * getSlotText(Slot slot); + const char * getKernelText(Slot slot); + const char * getVersionText(Slot slot); }; } diff --git a/bootloader/interface/menus/installer.cpp b/bootloader/interface/menus/installer.cpp index 5f9ad8ebf..b6acf2c2e 100644 --- a/bootloader/interface/menus/installer.cpp +++ b/bootloader/interface/menus/installer.cpp @@ -20,20 +20,20 @@ Bootloader::InstallerMenu::InstallerMenu() : Menu(KDColorBlack, KDColorWhite, Me setup(); } -bool slots_submenu() { +bool slotsSubmenu() { Bootloader::InstallerMenu::SlotsDFU()->open(); return true; } -bool bootloader_submenu() { +bool bootloaderSubmenu() { Bootloader::InstallerMenu::BootloaderDFU()->open(); return true; } void Bootloader::InstallerMenu::setup() { m_default_columns[0] = Column(Messages::installerText1, k_large_font, 0, true); - m_default_columns[1] = Column(Messages::installerSlotsSubmenu, Ion::Keyboard::Key::One, k_small_font, 30, false, &slots_submenu); - m_default_columns[2] = Column(Messages::installerBootloaderSubmenu, Ion::Keyboard::Key::Two, k_small_font, 30, false, &bootloader_submenu); + m_default_columns[1] = Column(Messages::installerSlotsSubmenu, Ion::Keyboard::Key::One, k_small_font, 30, false, &slotsSubmenu); + m_default_columns[2] = Column(Messages::installerBootloaderSubmenu, Ion::Keyboard::Key::Two, k_small_font, 30, false, &bootloaderSubmenu); m_columns[0] = ColumnBinder(&m_default_columns[0]); m_columns[1] = ColumnBinder(&m_default_columns[1]); diff --git a/bootloader/interface/menus/installer.h b/bootloader/interface/menus/installer.h index c26c27cbc..dd98e4a98 100644 --- a/bootloader/interface/menus/installer.h +++ b/bootloader/interface/menus/installer.h @@ -10,7 +10,7 @@ namespace Bootloader { InstallerMenu(); void setup() override; - void post_open() override {}; + void postOpen() override {}; static DfuMenu * SlotsDFU(); static DfuMenu * BootloaderDFU(); diff --git a/bootloader/interface/menus/slot_recovery.cpp b/bootloader/interface/menus/slot_recovery.cpp index 2f142be0a..f052d6be5 100644 --- a/bootloader/interface/menus/slot_recovery.cpp +++ b/bootloader/interface/menus/slot_recovery.cpp @@ -19,7 +19,7 @@ void Bootloader::SlotRecoveryMenu::setup() { m_columns[4] = ColumnBinder(&m_default_columns[4]); } -void Bootloader::SlotRecoveryMenu::post_open() { +void Bootloader::SlotRecoveryMenu::postOpen() { // We override the open method for (;;) { Ion::USB::enable(); diff --git a/bootloader/interface/menus/slot_recovery.h b/bootloader/interface/menus/slot_recovery.h index 08676645d..4eba92844 100644 --- a/bootloader/interface/menus/slot_recovery.h +++ b/bootloader/interface/menus/slot_recovery.h @@ -10,7 +10,7 @@ namespace Bootloader { SlotRecoveryMenu(USBData * usbData); void setup() override; - void post_open() override; + void postOpen() override; private: const USBData * m_data; }; diff --git a/bootloader/interface/menus/warning.h b/bootloader/interface/menus/warning.h index d2f8a649b..f2763f203 100644 --- a/bootloader/interface/menus/warning.h +++ b/bootloader/interface/menus/warning.h @@ -10,7 +10,7 @@ namespace Bootloader { WarningMenu(); void setup() override; - void post_open() override {}; + void postOpen() override {}; }; } diff --git a/bootloader/interface/src/menu.cpp b/bootloader/interface/src/menu.cpp index 1d81287ae..d45fb8466 100644 --- a/bootloader/interface/src/menu.cpp +++ b/bootloader/interface/src/menu.cpp @@ -18,7 +18,7 @@ void Bootloader::Menu::open(bool noreturn) { uint64_t scan = 0; bool exit = false; - post_open(); + postOpen(); while(!exit && !m_forced_exit) { scan = Ion::Keyboard::scan(); diff --git a/bootloader/interface/src/menu.h b/bootloader/interface/src/menu.h index a9faccea8..f623710c2 100644 --- a/bootloader/interface/src/menu.h +++ b/bootloader/interface/src/menu.h @@ -18,7 +18,7 @@ namespace Bootloader { static const int k_columns_margin = 5; virtual void setup() = 0; - virtual void post_open() = 0; + virtual void postOpen() = 0; enum ColumnType { DEFAULT, diff --git a/bootloader/main.cpp b/bootloader/main.cpp index d5161456b..c0f0995db 100644 --- a/bootloader/main.cpp +++ b/bootloader/main.cpp @@ -50,8 +50,8 @@ __attribute__ ((noreturn)) void ion_main(int argc, const char * const argv[]) { } } - if (Bootloader::Recovery::has_crashed()) { - Bootloader::Recovery::recover_data(); + if (Bootloader::Recovery::hasCrashed()) { + Bootloader::Recovery::recoverData(); } Bootloader::Interface::drawLoading(); diff --git a/bootloader/recovery.cpp b/bootloader/recovery.cpp index 5d357de30..8c849f781 100644 --- a/bootloader/recovery.cpp +++ b/bootloader/recovery.cpp @@ -25,7 +25,7 @@ void Bootloader::Recovery::crash_handler(const char *error) { menu.open(true); } -bool Bootloader::Recovery::has_crashed() { +bool Bootloader::Recovery::hasCrashed() { bool isA = Bootloader::Slot::A().kernelHeader()->isValid() && Bootloader::Slot::A().userlandHeader()->isValid(); bool isB = Bootloader::Slot::B().kernelHeader()->isValid() && Bootloader::Slot::B().userlandHeader()->isValid(); @@ -71,7 +71,7 @@ Bootloader::Recovery::CrashedSlot Bootloader::Recovery::getSlotConcerned() { } } -void Bootloader::Recovery::recover_data() { +void Bootloader::Recovery::recoverData() { Ion::Device::Board::initPeripherals(false); Ion::Display::pushRectUniform(KDRect(0,0,320,240), KDColorWhite); Ion::Backlight::init(); diff --git a/bootloader/recovery.h b/bootloader/recovery.h index f5327c914..001f8eaab 100644 --- a/bootloader/recovery.h +++ b/bootloader/recovery.h @@ -22,8 +22,8 @@ class Recovery { static CrashedSlot getSlotConcerned(); static void crash_handler(const char * error); - static void recover_data(); - static bool has_crashed(); + static void recoverData(); + static bool hasCrashed(); }; };