-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathboot.cpp
More file actions
96 lines (81 loc) · 3.1 KB
/
boot.cpp
File metadata and controls
96 lines (81 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/******************************************************************************
* @file boot.cpp *
* @author Storozhenko Roman - D_EL *
* @version V1.0 *
* @date 13.02.2025 *
* @brief Bootloader *
* @copyright The MIT License (MIT). Copyright (c) 2025 Storozhenko Roman *
******************************************************************************/
/*!****************************************************************************
* Include
*/
#include <string.h>
#include <hal/clock.h>
#include <hal/flash.h>
#include <hal/crc32.h>
#include <hal/cm4.h>
#include <imageheader.h>
static bool checkProgram(const uint8_t* addr);
/*!****************************************************************************
* @brief main function
*/
int main(void){
clock_init();
crc32_init();
const uint8_t* main_flash_start = getImageStartAddress();
const uint8_t* fwstorage_flash_start = getStorageStartAddress();
size_t fwstorage_flash_size = getStorageSize();
const imageHeader_t* imageHeader = (imageHeader_t*)main_flash_start;
const imageHeader_t* storageImageHeader = (imageHeader_t*)fwstorage_flash_start;
bool upgrade = false;
if(checkProgram(fwstorage_flash_start)){
if(checkProgram(main_flash_start)){
if(imageHeader->versionMajor != storageImageHeader->versionMajor ||
imageHeader->versionMinor != storageImageHeader->versionMinor ||
imageHeader->versionPach != storageImageHeader->versionPach ||
imageHeader->valueCRC != storageImageHeader->valueCRC){
upgrade = true;
}
}else{
upgrade = true;
}
}
if(upgrade){
flash_unlock();
for(const uint8_t* p = main_flash_start; p < fwstorage_flash_start; p += FLASH_PAGE_SIZE){
flash_erasePage((void*)p);
}
flash_write((void*)main_flash_start, (void*)fwstorage_flash_start, storageImageHeader->size);
if(checkProgram(main_flash_start)){ // Verify main firmware
for(const uint8_t* p = fwstorage_flash_start; p < fwstorage_flash_start + fwstorage_flash_size; p += FLASH_PAGE_SIZE){
flash_erasePage((void*)p); // Erase page
}
}
flash_lock();
}
if(checkProgram(main_flash_start)){
uint32_t* exe = (uint32_t*)(&(main_flash_start)[imageHeader->exeOffset]);
cm4_executeprogram(exe);
}
while(1);
return 0;
}
/*!****************************************************************************
* @brief
*/
static bool checkProgram(const uint8_t* addr){
const imageHeader_t* imageHeader = (imageHeader_t*)addr;
if(imageHeader->magic != getHeaderMagic()){
return false;
}
if(imageHeader->size == 0){
return false;
}
const size_t skipbytes = 4/*CRC*/ + 4/*Size*/;
uint8_t buffer[skipbytes];
memset(buffer, 0, skipbytes);
uint32_t crc = crc32_posix(buffer, sizeof(buffer), true);
crc = crc32_posix(addr + skipbytes, imageHeader->size - skipbytes, false);
return imageHeader->valueCRC == crc;
}
/******************************** END OF FILE ********************************/