Просмотр исходного кода

fixup iap align fault

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao 5 лет назад
Родитель
Сommit
a325fd3229
3 измененных файлов с 65 добавлено и 4 удалено
  1. 5 3
      Application/app/iap.c
  2. 54 0
      Application/bsp/fmc_flash.c
  3. 6 1
      Application/bsp/fmc_flash.h

+ 5 - 3
Application/app/iap.c

@@ -30,7 +30,7 @@ void process_iap_message(can_frame_t *frame, int len){
 				protocol_send_ack(frame->head.can_addr, frame->key, 1);
 				break;
 			}
-			fmc_erase_image();
+			fmc_write_image_begin();
 			_write_position = 0;
 			_write_success = 0;
 			protocol_send_ack(frame->head.can_addr, frame->key, 0);
@@ -41,6 +41,7 @@ void process_iap_message(can_frame_t *frame, int len){
 			data = frame->data;
 			break;
 		case CAN_KEY_IAP_CHECK:
+			fmc_write_image_end();
 			data_len = iap_check_image(frame->data, len);
 			data = frame->data;
 			break;
@@ -83,8 +84,9 @@ void _reboot_timer_handler(shark_timer_t *t){
 
 static int iap_write_image(uint8_t *data, int len){
 	int w_pos = shark_decode_u24(data);
-	if (w_pos == _write_position) {
-		fmc_write_image(data + 3, len - 3);
+
+	if (w_pos == _write_position && len > 3) {
+		fmc_write_image_continue(data + 3, len - 3);
 		_write_position += len - 3;
 	}
 	data[0] = 0;

+ 54 - 0
Application/bsp/fmc_flash.c

@@ -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;
 }

+ 6 - 1
Application/bsp/fmc_flash.h

@@ -1,9 +1,10 @@
 #ifndef _FMC_FLASH_H__
 #define _FMC_FLASH_H__
 #include <stdint.h>
+#include "libs/shark_types.h"
 
 void fmc_write_sn(uint8_t *sn, int len);
-void fmc_read_sn(uint8_t *sn, int *len);
+void fmc_read_sn(uint8_t *sn, int len);
 
 void fmc_write_data(uint8_t *data, int len);
 void fmc_read_data(uint8_t *data, int len);
@@ -17,5 +18,9 @@ uint32_t fmc_iap_image_addr(void);
 void fmc_iap_write_magic(uint32_t magic);
 uint32_t gd32_flash_size(void);
 
+void fmc_write_image_begin(void);
+void fmc_write_image_continue(const u8 *data, int len);
+void fmc_write_image_end(void);
+
 #endif /* _FMC_FLASH_H__ */