Skip to content

Commit d85df33

Browse files
committed
fmc: more error handling
1 parent 523726f commit d85df33

File tree

4 files changed

+24
-34
lines changed

4 files changed

+24
-34
lines changed

src/driver/fmc.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,4 @@ void fmc_erase();
2424

2525
flash_word_t fmc_read(uint32_t addr);
2626
void fmc_read_buf(uint32_t offset, uint8_t *data, uint32_t size);
27-
28-
void fmc_write(uint32_t addr, flash_word_t value);
2927
void fmc_write_buf(uint32_t addr, uint8_t *data, uint32_t size);

src/driver/mcu/at32/fmc.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "driver/fmc.h"
22

3+
#include "core/failloop.h"
34
#include "core/project.h"
45

56
#define FLASH_PTR(offset) (_config_flash + FLASH_ALIGN(offset))
@@ -22,22 +23,27 @@ flash_word_t fmc_read(uint32_t addr) {
2223
return *((flash_word_t *)(_config_flash + addr));
2324
}
2425

25-
void fmc_read_buf(uint32_t offset, uint8_t *data, uint32_t size) {
26-
flash_word_t *ptr = (flash_word_t *)data;
26+
void fmc_read_buf(uint32_t start, uint8_t *data, uint32_t size) {
27+
if (size < FLASH_WORD_SIZE || (size % FLASH_WORD_SIZE) || (start + size) > sizeof(_config_flash)) {
28+
fmc_lock();
29+
failloop(FAILLOOP_FAULT);
30+
}
2731

32+
flash_word_t *ptr = (flash_word_t *)data;
2833
for (uint32_t i = 0; i < (size / sizeof(flash_word_t)); i++) {
29-
ptr[i] = fmc_read(offset + i * sizeof(flash_word_t));
34+
ptr[i] = fmc_read(start + i * sizeof(flash_word_t));
3035
}
3136
}
3237

33-
void fmc_write(uint32_t addr, flash_word_t value) {
34-
flash_word_program((uint32_t)FLASH_PTR(addr), value);
35-
}
38+
void fmc_write_buf(uint32_t start, uint8_t *data, uint32_t size) {
39+
if (size < FLASH_WORD_SIZE || (size % FLASH_WORD_SIZE) || (start + size) > sizeof(_config_flash)) {
40+
fmc_lock();
41+
failloop(FAILLOOP_FAULT);
42+
}
3643

37-
void fmc_write_buf(uint32_t offset, uint8_t *data, uint32_t size) {
3844
flash_word_t *ptr = (flash_word_t *)data;
3945
for (uint32_t i = 0; i < (size / FLASH_WORD_SIZE); i++) {
40-
const uint32_t addr = (uint32_t)FLASH_PTR(offset + i * FLASH_WORD_SIZE);
46+
const uint32_t addr = (uint32_t)FLASH_PTR(start + i * FLASH_WORD_SIZE);
4147
flash_word_program(addr, ptr[i]);
4248
}
4349
}

src/driver/mcu/native/fmc.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,6 @@ void fmc_read_buf(uint32_t addr, uint8_t *data, uint32_t size) {
4141
fclose(file);
4242
}
4343

44-
void fmc_write(uint32_t addr, flash_word_t value) {
45-
FILE *file = open_file();
46-
fseek(file, addr, SEEK_SET);
47-
fwrite(&value, sizeof(flash_word_t), 1, file);
48-
fclose(file);
49-
}
50-
5144
void fmc_write_buf(uint32_t addr, uint8_t *data, uint32_t size) {
5245
FILE *file = open_file();
5346
fseek(file, addr, SEEK_SET);

src/driver/mcu/stm32/fmc.c

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -55,33 +55,26 @@ flash_word_t fmc_read(uint32_t addr) {
5555
return *((flash_word_t *)(_config_flash + addr));
5656
}
5757

58-
void fmc_read_buf(uint32_t offset, uint8_t *data, uint32_t size) {
59-
flash_word_t *ptr = (flash_word_t *)data;
58+
void fmc_read_buf(uint32_t start, uint8_t *data, uint32_t size) {
59+
if (size < FLASH_WORD_SIZE || (size % FLASH_WORD_SIZE) || (start + size) > sizeof(_config_flash)) {
60+
fmc_lock();
61+
failloop(FAILLOOP_FAULT);
62+
}
6063

64+
flash_word_t *ptr = (flash_word_t *)data;
6165
for (uint32_t i = 0; i < (size / sizeof(flash_word_t)); i++) {
62-
ptr[i] = fmc_read(offset + i * sizeof(flash_word_t));
66+
ptr[i] = fmc_read(start + i * sizeof(flash_word_t));
6367
}
6468
}
6569

66-
void fmc_write(uint32_t offset, flash_word_t value) {
67-
#ifdef STM32H7
68-
uint8_t data[FLASH_WORD_SIZE];
69-
memcpy(data, &value, sizeof(flash_word_t));
70-
71-
HAL_StatusTypeDef result = HAL_FLASH_Program(PROGRAM_TYPE, (uint32_t)FLASH_PTR(offset), (uint64_t)(uint32_t)(data));
72-
#else
73-
HAL_StatusTypeDef result = HAL_FLASH_Program(PROGRAM_TYPE, (uint32_t)FLASH_PTR(offset), value);
74-
#endif
75-
76-
if (result != HAL_OK) {
70+
void fmc_write_buf(uint32_t start, uint8_t *data, uint32_t size) {
71+
if (size < FLASH_WORD_SIZE || (size % FLASH_WORD_SIZE) || (start + size) > sizeof(_config_flash)) {
7772
fmc_lock();
7873
failloop(FAILLOOP_FAULT);
7974
}
80-
}
8175

82-
void fmc_write_buf(uint32_t offset, uint8_t *data, uint32_t size) {
8376
for (uint32_t i = 0; i < (size / FLASH_WORD_SIZE); i++) {
84-
const uint32_t addr = (uint32_t)FLASH_PTR(offset + i * FLASH_WORD_SIZE);
77+
const uint32_t addr = (uint32_t)FLASH_PTR(start + i * FLASH_WORD_SIZE);
8578

8679
#ifdef STM32H7
8780
const uint32_t ptr = (uint32_t)(data + i * FLASH_WORD_SIZE);

0 commit comments

Comments
 (0)