|
|
@@ -67,6 +67,40 @@ uint32_t fmc_iap_image_addr(void){
|
|
|
return _image_addr();
|
|
|
}
|
|
|
|
|
|
+void fmc_iap_write_magic(uint32_t magic)
|
|
|
+{
|
|
|
+ uint32_t address = _maigc_addr();
|
|
|
+ uint32_t length, checksum, value;
|
|
|
+
|
|
|
+ value = REG32(address + 8);
|
|
|
+ if (magic == value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ length = REG32(address);
|
|
|
+ checksum = REG32(address + 4);
|
|
|
+
|
|
|
+ fmc_unlock();
|
|
|
+
|
|
|
+ if (value != 0xFFFFFFFF) {
|
|
|
+ fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
|
|
|
+ fmc_page_erase(address);
|
|
|
+
|
|
|
+ fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
|
|
|
+ fmc_word_program(address, length);
|
|
|
+
|
|
|
+ fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
|
|
|
+ fmc_word_program(address + 4, checksum);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (magic != 0xFFFFFFFF) {
|
|
|
+ fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END);
|
|
|
+ fmc_word_program(address + 8, magic);
|
|
|
+ }
|
|
|
+
|
|
|
+ fmc_lock();
|
|
|
+}
|
|
|
+
|
|
|
void fmc_write_magic(uint32_t length, uint32_t checksum, uint32_t magic){
|
|
|
uint32_t address = _maigc_addr();
|
|
|
uint32_t buff[4];
|