Skip to content

Commit cc497ac

Browse files
committed
FirmwareValidator: automatically validate previously validated image on revert
1 parent 3e23ee7 commit cc497ac

9 files changed

+57
-2
lines changed

src/components/firmwarevalidator/FirmwareValidator.cpp

+29-1
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,44 @@
55

66
using namespace Pinetime::Controllers;
77

8+
FirmwareValidator::FirmwareValidator(Pinetime::Controllers::FS& fs) : fs {fs} {
9+
}
10+
811
bool FirmwareValidator::IsValidated() const {
912
auto* imageOkPtr = reinterpret_cast<uint32_t*>(validBitAdress);
1013
return (*imageOkPtr) == validBitValue;
1114
}
1215

1316
void FirmwareValidator::Validate() {
14-
if (!IsValidated())
17+
if (!IsValidated()) {
1518
Pinetime::Drivers::InternalFlash::WriteWord(validBitAdress, validBitValue);
19+
20+
const char* thisVersion = Version::GitCommitHash();
21+
lfs_file_t autovalidateFile;
22+
if (fs.FileOpen(&autovalidateFile, "/autovalidator.bin", LFS_O_WRONLY | LFS_O_CREAT) != LFS_ERR_OK) {
23+
return;
24+
}
25+
fs.FileWrite(&autovalidateFile, reinterpret_cast<const uint8_t*>(thisVersion), commitHashBufferLength);
26+
fs.FileClose(&autovalidateFile);
27+
}
1628
}
1729

1830
void FirmwareValidator::Reset() {
1931
NVIC_SystemReset();
2032
}
33+
34+
// make sure to call this after fs.Init() was already called or the fs read will
35+
// fail and nothing happens here.
36+
void FirmwareValidator::AutoValidate() {
37+
const std::string thisVersion = Version::GitCommitHash();
38+
char validVersion[commitHashBufferLength];
39+
lfs_file_t autovalidateFile;
40+
if (fs.FileOpen(&autovalidateFile, "/autovalidator.bin", LFS_O_RDONLY) != LFS_ERR_OK) {
41+
return;
42+
}
43+
fs.FileRead(&autovalidateFile, reinterpret_cast<uint8_t*>(validVersion), commitHashBufferLength);
44+
fs.FileClose(&autovalidateFile);
45+
if (thisVersion.compare(validVersion) == 0) {
46+
Validate();
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
#pragma once
22

33
#include <cstdint>
4+
#include <string>
5+
6+
#include "components/fs/FS.h"
7+
#include "Version.h"
48

59
namespace Pinetime {
610
namespace Controllers {
711
class FirmwareValidator {
812
public:
13+
FirmwareValidator(Pinetime::Controllers::FS& fs);
14+
915
void Validate();
16+
void AutoValidate();
1017
bool IsValidated() const;
1118

1219
void Reset();
1320

1421
private:
22+
Pinetime::Controllers::FS& fs;
23+
1524
static constexpr uint32_t validBitAdress {0x7BFE8};
1625
static constexpr uint32_t validBitValue {1};
26+
static constexpr uint32_t commitHashBufferLength = (uint32_t) std::char_traits<char>::length(Version::GitCommitHash()) + 1;
1727
};
1828
}
1929
}

src/displayapp/DisplayApp.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
7676
Pinetime::Controllers::NotificationManager& notificationManager,
7777
Pinetime::Controllers::HeartRateController& heartRateController,
7878
Controllers::Settings& settingsController,
79+
Pinetime::Controllers::FirmwareValidator& validator,
7980
Pinetime::Controllers::MotorController& motorController,
8081
Pinetime::Controllers::MotionController& motionController,
8182
Pinetime::Controllers::AlarmController& alarmController,
@@ -92,6 +93,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
9293
notificationManager {notificationManager},
9394
heartRateController {heartRateController},
9495
settingsController {settingsController},
96+
validator {validator},
9597
motorController {motorController},
9698
motionController {motionController},
9799
alarmController {alarmController},

src/displayapp/DisplayApp.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ namespace Pinetime {
3232

3333
namespace Controllers {
3434
class Settings;
35+
class FirmwareValidator;
3536
class Battery;
3637
class Ble;
3738
class DateTime;
@@ -61,6 +62,7 @@ namespace Pinetime {
6162
Pinetime::Controllers::NotificationManager& notificationManager,
6263
Pinetime::Controllers::HeartRateController& heartRateController,
6364
Controllers::Settings& settingsController,
65+
Pinetime::Controllers::FirmwareValidator& validator,
6466
Pinetime::Controllers::MotorController& motorController,
6567
Pinetime::Controllers::MotionController& motionController,
6668
Pinetime::Controllers::AlarmController& alarmController,
@@ -91,6 +93,7 @@ namespace Pinetime {
9193
Pinetime::Controllers::NotificationManager& notificationManager;
9294
Pinetime::Controllers::HeartRateController& heartRateController;
9395
Pinetime::Controllers::Settings& settingsController;
96+
Pinetime::Controllers::FirmwareValidator validator;
9497
Pinetime::Controllers::MotorController& motorController;
9598
Pinetime::Controllers::MotionController& motionController;
9699
Pinetime::Controllers::AlarmController& alarmController;
@@ -99,7 +102,6 @@ namespace Pinetime {
99102
Pinetime::Controllers::FS& filesystem;
100103
Pinetime::Drivers::SpiNorFlash& spiNorFlash;
101104

102-
Pinetime::Controllers::FirmwareValidator validator;
103105
Pinetime::Components::LittleVgl lvgl;
104106
Pinetime::Controllers::Timer timer;
105107

src/displayapp/DisplayAppRecovery.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
1919
Pinetime::Controllers::NotificationManager& /*notificationManager*/,
2020
Pinetime::Controllers::HeartRateController& /*heartRateController*/,
2121
Controllers::Settings& /*settingsController*/,
22+
Pinetime::Controllers::FirmwareValidator& /*validator*/,
2223
Pinetime::Controllers::MotorController& /*motorController*/,
2324
Pinetime::Controllers::MotionController& /*motionController*/,
2425
Pinetime::Controllers::AlarmController& /*alarmController*/,

src/displayapp/DisplayAppRecovery.h

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace Pinetime {
2323

2424
namespace Controllers {
2525
class Settings;
26+
class FirmwareValidator;
2627
class Battery;
2728
class Ble;
2829
class DateTime;
@@ -55,6 +56,7 @@ namespace Pinetime {
5556
Pinetime::Controllers::NotificationManager& notificationManager,
5657
Pinetime::Controllers::HeartRateController& heartRateController,
5758
Controllers::Settings& settingsController,
59+
Pinetime::Controllers::FirmwareValidator& validator,
5860
Pinetime::Controllers::MotorController& motorController,
5961
Pinetime::Controllers::MotionController& motionController,
6062
Pinetime::Controllers::AlarmController& alarmController,

src/main.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "components/datetime/DateTimeController.h"
3737
#include "components/heartrate/HeartRateController.h"
3838
#include "components/fs/FS.h"
39+
#include "components/firmwarevalidator/FirmwareValidator.h"
3940
#include "drivers/Spi.h"
4041
#include "drivers/SpiMaster.h"
4142
#include "drivers/SpiNorFlash.h"
@@ -98,6 +99,7 @@ Pinetime::Applications::HeartRateTask heartRateApp(heartRateSensor, heartRateCon
9899

99100
Pinetime::Controllers::FS fs {spiNorFlash};
100101
Pinetime::Controllers::Settings settingsController {fs};
102+
Pinetime::Controllers::FirmwareValidator validator {fs};
101103
Pinetime::Controllers::MotorController motorController {};
102104

103105
Pinetime::Controllers::DateTime dateTimeController {settingsController};
@@ -118,6 +120,7 @@ Pinetime::Applications::DisplayApp displayApp(lcd,
118120
notificationManager,
119121
heartRateController,
120122
settingsController,
123+
validator,
121124
motorController,
122125
motionController,
123126
alarmController,
@@ -140,6 +143,7 @@ Pinetime::System::SystemTask systemTask(spi,
140143
motionController,
141144
motionSensor,
142145
settingsController,
146+
validator,
143147
heartRateController,
144148
displayApp,
145149
heartRateApp,

src/systemtask/SystemTask.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi,
4646
Pinetime::Controllers::MotionController& motionController,
4747
Pinetime::Drivers::Bma421& motionSensor,
4848
Controllers::Settings& settingsController,
49+
Pinetime::Controllers::FirmwareValidator& validator,
4950
Pinetime::Controllers::HeartRateController& heartRateController,
5051
Pinetime::Applications::DisplayApp& displayApp,
5152
Pinetime::Applications::HeartRateTask& heartRateApp,
@@ -65,6 +66,7 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi,
6566
heartRateSensor {heartRateSensor},
6667
motionSensor {motionSensor},
6768
settingsController {settingsController},
69+
validator {validator},
6870
heartRateController {heartRateController},
6971
motionController {motionController},
7072
displayApp {displayApp},
@@ -111,6 +113,7 @@ void SystemTask::Work() {
111113
spiNorFlash.Wakeup();
112114

113115
fs.Init();
116+
validator.AutoValidate();
114117

115118
nimbleController.Init();
116119

src/systemtask/SystemTask.h

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "components/ble/NotificationManager.h"
1818
#include "components/alarm/AlarmController.h"
1919
#include "components/fs/FS.h"
20+
#include "components/firmwarevalidator/FirmwareValidator.h"
2021
#include "touchhandler/TouchHandler.h"
2122
#include "buttonhandler/ButtonHandler.h"
2223
#include "buttonhandler/ButtonActions.h"
@@ -67,6 +68,7 @@ namespace Pinetime {
6768
Pinetime::Controllers::MotionController& motionController,
6869
Pinetime::Drivers::Bma421& motionSensor,
6970
Controllers::Settings& settingsController,
71+
Pinetime::Controllers::FirmwareValidator& validator,
7072
Pinetime::Controllers::HeartRateController& heartRateController,
7173
Pinetime::Applications::DisplayApp& displayApp,
7274
Pinetime::Applications::HeartRateTask& heartRateApp,
@@ -107,6 +109,7 @@ namespace Pinetime {
107109
Pinetime::Drivers::Hrs3300& heartRateSensor;
108110
Pinetime::Drivers::Bma421& motionSensor;
109111
Pinetime::Controllers::Settings& settingsController;
112+
Pinetime::Controllers::FirmwareValidator& validator;
110113
Pinetime::Controllers::HeartRateController& heartRateController;
111114
Pinetime::Controllers::MotionController& motionController;
112115

0 commit comments

Comments
 (0)