|
|
@@ -1,4 +1,5 @@
|
|
|
#include "gd32f3x0_libopt.h"
|
|
|
+#include "fmc_flash.h"
|
|
|
|
|
|
#if defined (GD32F30X_HD) || defined (GD32F30X_XD) || defined (GD32F30X_CL)
|
|
|
#define FMC_FLAG_PGERR FMC_FLAG_BANK0_PGERR
|
|
|
@@ -21,6 +22,10 @@ static uint32_t _maigc_addr(void);
|
|
|
static uint32_t _image_addr(void);
|
|
|
static uint32_t _image_write_addr = 0;
|
|
|
static uint32_t _image_read_addr = 0;
|
|
|
+
|
|
|
+static u8 _image_write_cache[4];
|
|
|
+static u8 _image_write_remain;
|
|
|
+
|
|
|
void fmc_write_sn(uint8_t *sn, int len){
|
|
|
_fmc_erase_addr(_sn_addr(), len);
|
|
|
_fmc_write_data(_sn_addr(), sn, len);
|
|
|
@@ -48,6 +53,55 @@ void fmc_write_image(uint8_t *data, int len){
|
|
|
_image_write_addr += len;
|
|
|
}
|
|
|
|
|
|
+void fmc_write_image_begin(void)
|
|
|
+{
|
|
|
+ _image_write_addr = _image_addr();
|
|
|
+ _image_write_remain = 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void fmc_write_image_flush(void)
|
|
|
+{
|
|
|
+ u32 value = *(u32 *) _image_write_cache;
|
|
|
+
|
|
|
+ if ((_image_write_addr % one_page_size) == 0) {
|
|
|
+ fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
|
|
|
+ fmc_page_erase(_image_write_addr);
|
|
|
+ }
|
|
|
+
|
|
|
+ fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
|
|
|
+ fmc_word_program(_image_write_addr, value);
|
|
|
+
|
|
|
+ _image_write_remain = 0;
|
|
|
+ _image_write_addr += 4;
|
|
|
+}
|
|
|
+
|
|
|
+void fmc_write_image_continue(const u8 *data, int len)
|
|
|
+{
|
|
|
+ const u8 *data_end;
|
|
|
+
|
|
|
+ fmc_unlock();
|
|
|
+
|
|
|
+ for (data_end = data + len; data < data_end; data++) {
|
|
|
+ if (_image_write_remain >= sizeof(_image_write_cache)) {
|
|
|
+ fmc_write_image_flush();
|
|
|
+ }
|
|
|
+
|
|
|
+ _image_write_cache[_image_write_remain] = *data;
|
|
|
+ _image_write_remain++;
|
|
|
+ }
|
|
|
+
|
|
|
+ fmc_lock();
|
|
|
+}
|
|
|
+
|
|
|
+void fmc_write_image_end(void)
|
|
|
+{
|
|
|
+ if (_image_write_remain > 0) {
|
|
|
+ fmc_unlock();
|
|
|
+ fmc_write_image_flush();
|
|
|
+ fmc_lock();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void fmc_start_read_image(void){
|
|
|
_image_read_addr = 0;
|
|
|
}
|