diff --git a/src/components/firmwarevalidator/FirmwareValidator.cpp b/src/components/firmwarevalidator/FirmwareValidator.cpp index 5a63b6b4b0..27577e6da3 100644 --- a/src/components/firmwarevalidator/FirmwareValidator.cpp +++ b/src/components/firmwarevalidator/FirmwareValidator.cpp @@ -5,16 +5,44 @@ using namespace Pinetime::Controllers; +FirmwareValidator::FirmwareValidator(Pinetime::Controllers::FS& fs) : fs {fs} { +} + bool FirmwareValidator::IsValidated() const { auto* imageOkPtr = reinterpret_cast(validBitAdress); return (*imageOkPtr) == validBitValue; } void FirmwareValidator::Validate() { - if (!IsValidated()) + if (!IsValidated()) { Pinetime::Drivers::InternalFlash::WriteWord(validBitAdress, validBitValue); + + const char* thisVersion = Version::GitCommitHash(); + lfs_file_t autovalidateFile; + if (fs.FileOpen(&autovalidateFile, "/.system/autovalidator.dat", LFS_O_WRONLY | LFS_O_CREAT) != LFS_ERR_OK) { + return; + } + fs.FileWrite(&autovalidateFile, reinterpret_cast(thisVersion), commitHashBufferLength); + fs.FileClose(&autovalidateFile); + } } void FirmwareValidator::Reset() { NVIC_SystemReset(); } + +// make sure to call this after fs.Init() was already called or the fs read will +// fail and nothing happens here. +void FirmwareValidator::AutoValidate() { + const std::string thisVersion = Version::GitCommitHash(); + char validVersion[commitHashBufferLength]; + lfs_file_t autovalidateFile; + if (fs.FileOpen(&autovalidateFile, "/.system/autovalidator.dat", LFS_O_RDONLY) != LFS_ERR_OK) { + return; + } + fs.FileRead(&autovalidateFile, reinterpret_cast(validVersion), commitHashBufferLength); + fs.FileClose(&autovalidateFile); + if (thisVersion.compare(validVersion) == 0) { + Validate(); + } +} diff --git a/src/components/firmwarevalidator/FirmwareValidator.h b/src/components/firmwarevalidator/FirmwareValidator.h index ce644f9792..d70cdd031e 100644 --- a/src/components/firmwarevalidator/FirmwareValidator.h +++ b/src/components/firmwarevalidator/FirmwareValidator.h @@ -1,19 +1,29 @@ #pragma once #include +#include + +#include "components/fs/FS.h" +#include "Version.h" namespace Pinetime { namespace Controllers { class FirmwareValidator { public: + FirmwareValidator(Pinetime::Controllers::FS& fs); + void Validate(); + void AutoValidate(); bool IsValidated() const; void Reset(); private: + Pinetime::Controllers::FS& fs; + static constexpr uint32_t validBitAdress {0x7BFE8}; static constexpr uint32_t validBitValue {1}; + static constexpr uint32_t commitHashBufferLength = (uint32_t) std::char_traits::length(Version::GitCommitHash()) + 1; }; } } diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 6671ac9e51..7d05a83f70 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -76,6 +76,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, Controllers::Settings& settingsController, + Pinetime::Controllers::FirmwareValidator& validator, Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::AlarmController& alarmController, @@ -92,6 +93,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, notificationManager {notificationManager}, heartRateController {heartRateController}, settingsController {settingsController}, + validator {validator}, motorController {motorController}, motionController {motionController}, alarmController {alarmController}, diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index 2f276eaf9e..261d8c0a5d 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -32,6 +32,7 @@ namespace Pinetime { namespace Controllers { class Settings; + class FirmwareValidator; class Battery; class Ble; class DateTime; @@ -61,6 +62,7 @@ namespace Pinetime { Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, Controllers::Settings& settingsController, + Pinetime::Controllers::FirmwareValidator& validator, Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::AlarmController& alarmController, @@ -91,6 +93,7 @@ namespace Pinetime { Pinetime::Controllers::NotificationManager& notificationManager; Pinetime::Controllers::HeartRateController& heartRateController; Pinetime::Controllers::Settings& settingsController; + Pinetime::Controllers::FirmwareValidator validator; Pinetime::Controllers::MotorController& motorController; Pinetime::Controllers::MotionController& motionController; Pinetime::Controllers::AlarmController& alarmController; @@ -99,7 +102,6 @@ namespace Pinetime { Pinetime::Controllers::FS& filesystem; Pinetime::Drivers::SpiNorFlash& spiNorFlash; - Pinetime::Controllers::FirmwareValidator validator; Pinetime::Components::LittleVgl lvgl; Pinetime::Controllers::Timer timer; diff --git a/src/displayapp/DisplayAppRecovery.cpp b/src/displayapp/DisplayAppRecovery.cpp index bcb8db0e9d..1bd2745247 100644 --- a/src/displayapp/DisplayAppRecovery.cpp +++ b/src/displayapp/DisplayAppRecovery.cpp @@ -19,6 +19,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, Pinetime::Controllers::NotificationManager& /*notificationManager*/, Pinetime::Controllers::HeartRateController& /*heartRateController*/, Controllers::Settings& /*settingsController*/, + Pinetime::Controllers::FirmwareValidator& /*validator*/, Pinetime::Controllers::MotorController& /*motorController*/, Pinetime::Controllers::MotionController& /*motionController*/, Pinetime::Controllers::AlarmController& /*alarmController*/, diff --git a/src/displayapp/DisplayAppRecovery.h b/src/displayapp/DisplayAppRecovery.h index 162ff2575e..c325ff35b0 100644 --- a/src/displayapp/DisplayAppRecovery.h +++ b/src/displayapp/DisplayAppRecovery.h @@ -23,6 +23,7 @@ namespace Pinetime { namespace Controllers { class Settings; + class FirmwareValidator; class Battery; class Ble; class DateTime; @@ -55,6 +56,7 @@ namespace Pinetime { Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, Controllers::Settings& settingsController, + Pinetime::Controllers::FirmwareValidator& validator, Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::AlarmController& alarmController, diff --git a/src/main.cpp b/src/main.cpp index 24f13caddd..0da8c65173 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,6 +36,7 @@ #include "components/datetime/DateTimeController.h" #include "components/heartrate/HeartRateController.h" #include "components/fs/FS.h" +#include "components/firmwarevalidator/FirmwareValidator.h" #include "drivers/Spi.h" #include "drivers/SpiMaster.h" #include "drivers/SpiNorFlash.h" @@ -98,6 +99,7 @@ Pinetime::Applications::HeartRateTask heartRateApp(heartRateSensor, heartRateCon Pinetime::Controllers::FS fs {spiNorFlash}; Pinetime::Controllers::Settings settingsController {fs}; +Pinetime::Controllers::FirmwareValidator validator {fs}; Pinetime::Controllers::MotorController motorController {}; Pinetime::Controllers::DateTime dateTimeController {settingsController}; @@ -118,6 +120,7 @@ Pinetime::Applications::DisplayApp displayApp(lcd, notificationManager, heartRateController, settingsController, + validator, motorController, motionController, alarmController, @@ -140,6 +143,7 @@ Pinetime::System::SystemTask systemTask(spi, motionController, motionSensor, settingsController, + validator, heartRateController, displayApp, heartRateApp, diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index eb013d6d1a..458c088517 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -46,6 +46,7 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi, Pinetime::Controllers::MotionController& motionController, Pinetime::Drivers::Bma421& motionSensor, Controllers::Settings& settingsController, + Pinetime::Controllers::FirmwareValidator& validator, Pinetime::Controllers::HeartRateController& heartRateController, Pinetime::Applications::DisplayApp& displayApp, Pinetime::Applications::HeartRateTask& heartRateApp, @@ -65,6 +66,7 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi, heartRateSensor {heartRateSensor}, motionSensor {motionSensor}, settingsController {settingsController}, + validator {validator}, heartRateController {heartRateController}, motionController {motionController}, displayApp {displayApp}, @@ -111,6 +113,7 @@ void SystemTask::Work() { spiNorFlash.Wakeup(); fs.Init(); + validator.AutoValidate(); nimbleController.Init(); diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index 0060e36096..cf71481c74 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -17,6 +17,7 @@ #include "components/ble/NotificationManager.h" #include "components/alarm/AlarmController.h" #include "components/fs/FS.h" +#include "components/firmwarevalidator/FirmwareValidator.h" #include "touchhandler/TouchHandler.h" #include "buttonhandler/ButtonHandler.h" #include "buttonhandler/ButtonActions.h" @@ -67,6 +68,7 @@ namespace Pinetime { Pinetime::Controllers::MotionController& motionController, Pinetime::Drivers::Bma421& motionSensor, Controllers::Settings& settingsController, + Pinetime::Controllers::FirmwareValidator& validator, Pinetime::Controllers::HeartRateController& heartRateController, Pinetime::Applications::DisplayApp& displayApp, Pinetime::Applications::HeartRateTask& heartRateApp, @@ -107,6 +109,7 @@ namespace Pinetime { Pinetime::Drivers::Hrs3300& heartRateSensor; Pinetime::Drivers::Bma421& motionSensor; Pinetime::Controllers::Settings& settingsController; + Pinetime::Controllers::FirmwareValidator& validator; Pinetime::Controllers::HeartRateController& heartRateController; Pinetime::Controllers::MotionController& motionController;