summaryrefslogtreecommitdiffstatshomepage
path: root/stmhal/storage.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-04-18 16:27:53 +0100
committerDamien George <damien.p.george@gmail.com>2015-04-18 21:40:59 +0100
commit6be0bbb886de613adfbd3b653e44e25fbb3569c5 (patch)
treec541a3ae6e57c84fdabb6b38cf8a8b5015e0a9b5 /stmhal/storage.c
parent5a11086d64cfc824958fbf382251c83d83d4e6ee (diff)
downloadmicropython-6be0bbb886de613adfbd3b653e44e25fbb3569c5.tar.gz
micropython-6be0bbb886de613adfbd3b653e44e25fbb3569c5.zip
stmhal: Add support for flash filesystem on F401 MCUs.
It uses a 16k cache buffer and so the filesystem size is limited.
Diffstat (limited to 'stmhal/storage.c')
-rw-r--r--stmhal/storage.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/stmhal/storage.c b/stmhal/storage.c
index be5e400ed7..d3dc82a330 100644
--- a/stmhal/storage.c
+++ b/stmhal/storage.c
@@ -34,10 +34,26 @@
#include "flash.h"
#include "storage.h"
+#if defined(STM32F405xx)
+
#define CACHE_MEM_START_ADDR (0x10000000) // CCM data RAM, 64k
#define FLASH_PART1_START_BLOCK (0x100)
#define FLASH_PART1_NUM_BLOCKS (224) // 16k+16k+16k+64k=112k
#define FLASH_MEM_START_ADDR (0x08004000) // sector 1, 16k
+#define FLASH_SECTOR_SIZE_MAX (0x10000) // 64k max, size of CCM
+
+#elif defined(STM32F401xE)
+
+STATIC byte flash_cache_mem[0x4000] __attribute__((aligned(4))); // 16k
+#define CACHE_MEM_START_ADDR (&flash_cache_mem[0])
+#define FLASH_PART1_START_BLOCK (0x100)
+#define FLASH_PART1_NUM_BLOCKS (128) // 16k+16k+16k+16k(of64k)=64k
+#define FLASH_MEM_START_ADDR (0x08004000) // sector 1, 16k
+#define FLASH_SECTOR_SIZE_MAX (0x4000) // 16k max due to size of cache buffer
+
+#else
+#error "no storage support for this MCU"
+#endif
#define FLASH_FLAG_DIRTY (1)
#define FLASH_FLAG_FORCE_WRITE (2)
@@ -62,6 +78,9 @@ static uint8_t *flash_cache_get_addr_for_write(uint32_t flash_addr) {
uint32_t flash_sector_start;
uint32_t flash_sector_size;
uint32_t flash_sector_id = flash_get_sector_info(flash_addr, &flash_sector_start, &flash_sector_size);
+ if (flash_sector_size > FLASH_SECTOR_SIZE_MAX) {
+ flash_sector_size = FLASH_SECTOR_SIZE_MAX;
+ }
if (flash_cache_sector_id != flash_sector_id) {
flash_cache_flush();
memcpy((void*)CACHE_MEM_START_ADDR, (const void*)flash_sector_start, flash_sector_size);