Some adjustments

Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
Pol Henarejos
2022-01-19 01:16:59 +01:00
parent b6eaac895d
commit af7ef7856b

29
flash.c
View File

@@ -42,6 +42,8 @@
#include "hardware/flash.h" #include "hardware/flash.h"
#include "tusb.h" #include "tusb.h"
extern void low_flash_available();
/* /*
* Flash memory map * Flash memory map
* *
@@ -67,7 +69,7 @@
* <two pages> * <two pages>
*/ */
#define FLASH_DATA_POOL_HEADER_SIZE 2 #define FLASH_DATA_POOL_HEADER_SIZE FLASH_PAGE_SIZE
#define FLASH_DATA_POOL_SIZE (2048*1024) #define FLASH_DATA_POOL_SIZE (2048*1024)
static uint16_t flash_page_size; static uint16_t flash_page_size;
@@ -79,7 +81,7 @@ const uint8_t flash_data[4] __attribute__ ((section (".gnuk_data"))) = {
0x00, 0x00, 0xff, 0xff 0x00, 0x00, 0xff, 0xff
}; };
#define FLASH_TARGET_OFFSET (4096 * 1024) // DATA starts at the mid of flash #define FLASH_TARGET_OFFSET (PICO_FLASH_SIZE_BYTES >> 1) // DATA starts at the mid of flash
const uint8_t *flash_addr_key_storage_start = (const uint8_t *) (XIP_BASE + FLASH_TARGET_OFFSET); const uint8_t *flash_addr_key_storage_start = (const uint8_t *) (XIP_BASE + FLASH_TARGET_OFFSET);
@@ -172,6 +174,7 @@ void
flash_activate (void) flash_activate (void)
{ {
flash_program_halfword ((uintptr_t)FLASH_ADDR_DATA_STORAGE_START, 0); flash_program_halfword ((uintptr_t)FLASH_ADDR_DATA_STORAGE_START, 0);
low_flash_available();
} }
@@ -260,6 +263,7 @@ flash_copying_gc (void)
generation++; generation++;
flash_program_halfword ((uintptr_t)dst, generation); flash_program_halfword ((uintptr_t)dst, generation);
flash_erase_page ((uintptr_t)src); flash_erase_page ((uintptr_t)src);
low_flash_available();
return 0; return 0;
} }
@@ -312,6 +316,8 @@ flash_do_write_internal (const uint8_t *p, int nr, const uint8_t *data, int len)
if (flash_program_halfword (addr, hw) != 0) if (flash_program_halfword (addr, hw) != 0)
flash_warning ("DO WRITE ERROR"); flash_warning ("DO WRITE ERROR");
} }
low_flash_available();
} }
const uint8_t * const uint8_t *
@@ -374,6 +380,9 @@ flash_do_release (const uint8_t *do_data)
/* Fill 0x0000 for "tag_number and length" word */ /* Fill 0x0000 for "tag_number and length" word */
if (flash_program_halfword (addr_tag, 0) != 0) if (flash_program_halfword (addr_tag, 0) != 0)
flash_warning ("fill-zero tag_nr failure"); flash_warning ("fill-zero tag_nr failure");
//CAUTION: flash_do_release is followed by a flash_write. Thus, we can avoid a single write
//low_flash_available();
} }
@@ -435,6 +444,7 @@ flash_key_write (uint8_t *key_addr,
addr += 2; addr += 2;
} }
low_flash_available();
return 0; return 0;
} }
@@ -464,6 +474,8 @@ flash_key_fill_zero_as_released (uint8_t *key_addr, int key_size)
for (i = 0; i < key_size/2; i++) for (i = 0; i < key_size/2; i++)
flash_program_halfword (addr + i*2, 0); flash_program_halfword (addr + i*2, 0);
low_flash_available();
} }
void void
@@ -486,6 +498,7 @@ void
flash_clear_halfword (uintptr_t addr) flash_clear_halfword (uintptr_t addr)
{ {
flash_program_halfword (addr, 0); flash_program_halfword (addr, 0);
low_flash_available();
} }
@@ -493,6 +506,7 @@ void
flash_put_data_internal (const uint8_t *p, uint16_t hw) flash_put_data_internal (const uint8_t *p, uint16_t hw)
{ {
flash_program_halfword ((uintptr_t)p, hw); flash_program_halfword ((uintptr_t)p, hw);
low_flash_available();
} }
void void
@@ -507,6 +521,7 @@ flash_put_data (uint16_t hw)
} }
flash_program_halfword ((uintptr_t)p, hw); flash_program_halfword ((uintptr_t)p, hw);
low_flash_available();
} }
@@ -520,12 +535,14 @@ flash_bool_clear (const uint8_t **addr_p)
flash_program_halfword ((uintptr_t)p, 0); flash_program_halfword ((uintptr_t)p, 0);
*addr_p = NULL; *addr_p = NULL;
low_flash_available();
} }
void void
flash_bool_write_internal (const uint8_t *p, int nr) flash_bool_write_internal (const uint8_t *p, int nr)
{ {
flash_program_halfword ((uintptr_t)p, nr); flash_program_halfword ((uintptr_t)p, nr);
low_flash_available();
} }
const uint8_t * const uint8_t *
@@ -542,6 +559,7 @@ flash_bool_write (uint8_t nr)
} }
flash_program_halfword ((uintptr_t)p, hw); flash_program_halfword ((uintptr_t)p, hw);
low_flash_available();
return p; return p;
} }
@@ -558,6 +576,7 @@ flash_enum_write_internal (const uint8_t *p, int nr, uint8_t v)
uint16_t hw = nr | (v << 8); uint16_t hw = nr | (v << 8);
flash_program_halfword ((uintptr_t)p, hw); flash_program_halfword ((uintptr_t)p, hw);
low_flash_available();
} }
const uint8_t * const uint8_t *
@@ -574,6 +593,7 @@ flash_enum_write (uint8_t nr, uint8_t v)
} }
flash_program_halfword ((uintptr_t)p, hw); flash_program_halfword ((uintptr_t)p, hw);
low_flash_available();
return p; return p;
} }
@@ -617,6 +637,7 @@ flash_cnt123_write_internal (const uint8_t *p, int which, int v)
flash_program_halfword ((uintptr_t)p+2, 0xc3c3); flash_program_halfword ((uintptr_t)p+2, 0xc3c3);
else /* v == 3 */ else /* v == 3 */
flash_program_halfword ((uintptr_t)p+2, 0); flash_program_halfword ((uintptr_t)p+2, 0);
low_flash_available();
} }
void void
@@ -651,6 +672,7 @@ flash_cnt123_increment (uint8_t which, const uint8_t **addr_p)
flash_program_halfword ((uintptr_t)p, hw); flash_program_halfword ((uintptr_t)p, hw);
} }
low_flash_available();
} }
void void
@@ -665,6 +687,7 @@ flash_cnt123_clear (const uint8_t **addr_p)
p -= 2; p -= 2;
flash_program_halfword ((uintptr_t)p, 0); flash_program_halfword ((uintptr_t)p, 0);
*addr_p = NULL; *addr_p = NULL;
low_flash_available();
} }
@@ -681,6 +704,7 @@ flash_erase_binary (uint8_t file_id)
if (FLASH_CH_CERTIFICATE_SIZE > flash_page_size) if (FLASH_CH_CERTIFICATE_SIZE > flash_page_size)
flash_erase_page ((uintptr_t)p + flash_page_size); flash_erase_page ((uintptr_t)p + flash_page_size);
} }
low_flash_available();
return 0; return 0;
} }
@@ -732,6 +756,7 @@ flash_write_binary (uint8_t file_id, const uint8_t *data,
addr += 2; addr += 2;
} }
low_flash_available();
return 0; return 0;
} }
} }