mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-18 16:27:34 +01:00
Reviews
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace Bootloader {
|
||||
AboutMenu();
|
||||
|
||||
void setup() override;
|
||||
void post_open() override {};
|
||||
void postOpen() override {};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
#include <bootloader/boot.h>
|
||||
#include <ion.h>
|
||||
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <bootloader/interface/src/menu.h>
|
||||
#include <bootloader/interface/menus/about.h>
|
||||
#include <bootloader/interface/menus/installer.h>
|
||||
#include <bootloader/slots/slot.h>
|
||||
|
||||
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);
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Bootloader {
|
||||
InstallerMenu();
|
||||
|
||||
void setup() override;
|
||||
void post_open() override {};
|
||||
void postOpen() override {};
|
||||
|
||||
static DfuMenu * SlotsDFU();
|
||||
static DfuMenu * BootloaderDFU();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Bootloader {
|
||||
SlotRecoveryMenu(USBData * usbData);
|
||||
|
||||
void setup() override;
|
||||
void post_open() override;
|
||||
void postOpen() override;
|
||||
private:
|
||||
const USBData * m_data;
|
||||
};
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Bootloader {
|
||||
WarningMenu();
|
||||
|
||||
void setup() override;
|
||||
void post_open() override {};
|
||||
void postOpen() override {};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user