From ae079c1fc5d990ba55714d4b3a51b19f96edaec4 Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期四, 24 四月 2025 16:01:43 +0800
Subject: [PATCH] 改为中断来低电平触发发送当前扫描数据,3s内扫描不到的会退出,串口来55 AA 75 70 64 61 74 65,进入升级模式

---
 01_SDK/nimble/host/smp_bt/mcumgr/img_mgmt/port/mynewt/src/mynewt_img_mgmt.c |  104 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 92 insertions(+), 12 deletions(-)

diff --git a/01_SDK/nimble/host/smp_bt/mcumgr/img_mgmt/port/mynewt/src/mynewt_img_mgmt.c b/01_SDK/nimble/host/smp_bt/mcumgr/img_mgmt/port/mynewt/src/mynewt_img_mgmt.c
index 8a00910..91dde11 100644
--- a/01_SDK/nimble/host/smp_bt/mcumgr/img_mgmt/port/mynewt/src/mynewt_img_mgmt.c
+++ b/01_SDK/nimble/host/smp_bt/mcumgr/img_mgmt/port/mynewt/src/mynewt_img_mgmt.c
@@ -26,6 +26,8 @@
 #include "FreeRTOS.h"
 #include "task.h"
 
+#define FLASH_TIMING_OPTIMIZE_EN  1
+
 #define SPLIT_NMGR_OP_SPLIT 0
 
 /** Attempt to boot the contents of slot 0. */
@@ -91,6 +93,13 @@
 struct flash_area g_code_area;
 struct flash_area g_swap_area;
 
+#if FLASH_TIMING_OPTIMIZE_EN
+uint8_t flash_page[256] = {0};
+uint32_t flash_page_data_len = 0;
+uint32_t flash_offset = 0;
+struct flash_area *flash_area = NULL;
+#endif
+
 int
 flash_area_is_empty(const struct flash_area *fa, bool *empty)
 {
@@ -127,6 +136,23 @@
     return 0;
 }
 
+#if FLASH_TIMING_OPTIMIZE_EN
+void img_mgmt_post_handler(void)
+{
+	if(flash_area && flash_page_data_len)
+	{
+		taskENTER_CRITICAL();
+	    FMC_WriteStream(FLCTL, flash_area->fa_off + flash_offset, flash_page, flash_page_data_len);
+		taskEXIT_CRITICAL();
+		
+		//printf("[W] write flash data end - addr:0x%08X, offset:0x%04X len = %d\n", flash_area->fa_off , flash_offset, flash_page_data_len);
+	}
+	
+	flash_page_data_len = 0;
+	flash_area = NULL;
+}
+#endif
+
 int
 flash_area_write(const struct flash_area *fa, uint32_t off, const void *src,
     uint32_t len)
@@ -137,10 +163,52 @@
         ret = -1;
         return ret;
     }
+	
+#if FLASH_TIMING_OPTIMIZE_EN	
+    uint8_t *p = (uint8_t *)src;
 
+	if(flash_area == NULL){
+		flash_offset = off;
+		flash_area   = (struct flash_area *)fa;
+		
+		//printf("[E] write flash data - addr:0x%08X, offset:0x%04X len = %d\n", fa->fa_off , flash_offset, len);
+	}
+
+	#define min(x, y)   (x) <(y) ? (x) : (y); 
+	
+	while(len > 0)
+	{
+		uint32_t fragLen = min(len, 256 - flash_page_data_len);
+		
+		memcpy(flash_page + flash_page_data_len, p, fragLen);
+		flash_page_data_len += fragLen;
+		
+		if(flash_page_data_len == 256)
+		{
+			taskENTER_CRITICAL();
+			ret = FMC_WriteStream(FLCTL, fa->fa_off + flash_offset, flash_page, 256);
+			taskEXIT_CRITICAL();
+			
+			//printf("[W] write flash data - addr:0x%08X, offset:0x%04X len = %d\n", fa->fa_off , flash_offset, 256);
+
+			flash_offset += 256;
+			flash_page_data_len = 0;
+		}
+		
+		p += fragLen;
+		if(len > fragLen){
+			len -= fragLen;
+		}else{
+			len = 0;
+		}
+	}
+	
+	return 0;
+#else
     taskENTER_CRITICAL();
     ret = FMC_WriteStream(FLCTL, fa->fa_off + off, (void *)src, len);
     taskEXIT_CRITICAL();
+#endif
     return ret;
 }
 
@@ -153,10 +221,21 @@
         ret = -1;
         return ret;
     }
-   
+	
+	//printf("[W] Erase Flash - start addr: 0x%08X, len: 0x%04x\r\n", fa->fa_off + off, len);
+	
+#if FLASH_TIMING_OPTIMIZE_EN
+	flash_offset = 0;
+	flash_area = NULL;
+	flash_page_data_len = 0;
+	memset(flash_page, 0xFF, 256);
+#else
+
     taskENTER_CRITICAL();
     ret = FMC_EraseCodeArea(FLCTL, fa->fa_off + off, len);
     taskEXIT_CRITICAL();
+#endif
+	
     return ret;
 }
 
@@ -227,22 +306,23 @@
     return (slot+1);
 }
 
-
-#define SIZE_BOOTLOADER            		0xA000
-#define SIZE_FIXED_APP_IMAGE            0x37000
-#define APP_IMAGE_SIZE					SIZE_FIXED_APP_IMAGE
-
 void flash_area_init(void)
 {
     g_code_area.fa_device_id = FLASH_AREA_IMAGE_0;
-    g_code_area.fa_id = FLASH_AREA_IMAGE_0;
-    g_code_area.fa_off = SIZE_BOOTLOADER;
-    g_code_area.fa_size = APP_IMAGE_SIZE;
+    g_code_area.fa_id 	= FLASH_AREA_IMAGE_0;
+    g_code_area.fa_off  = CONFIG_FLASH_PARTITION_APP_ADDR; 
+    g_code_area.fa_size = CONFIG_FLASH_PARTITION_APP_SIZE;
     
     g_swap_area.fa_device_id = FLASH_AREA_IMAGE_1;
-    g_swap_area.fa_id = FLASH_AREA_IMAGE_1;
-    g_swap_area.fa_off = (SIZE_BOOTLOADER + SIZE_FIXED_APP_IMAGE);
-    g_swap_area.fa_size = APP_IMAGE_SIZE;
+    g_swap_area.fa_id 	= FLASH_AREA_IMAGE_1;
+    g_swap_area.fa_off 	= CONFIG_FLASH_PARTITION_APP_BACKUP_ADDR;
+    g_swap_area.fa_size = CONFIG_FLASH_PARTITION_APP_BACKUP_SIZE;
+
+#if FLASH_TIMING_OPTIMIZE_EN
+	taskENTER_CRITICAL();
+    FMC_EraseCodeArea(FLCTL, g_swap_area.fa_off, CONFIG_FLASH_PARTITION_APP_SIZE);
+    taskEXIT_CRITICAL();
+#endif
 }
 
 int split_app_active_get(void)

--
Gitblit v1.9.3