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 | 101 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 92 insertions(+), 9 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 8e5e2ec..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 @@ -21,11 +21,12 @@ #include "mgmt/mgmt.h" #include "img_mgmt/img_mgmt_impl.h" #include "img_mgmt/img_mgmt.h" -#include "image_map_config.h" #include "sysflash/sysflash.h" #include "img_mgmt/image.h" #include "FreeRTOS.h" #include "task.h" + +#define FLASH_TIMING_OPTIMIZE_EN 1 #define SPLIT_NMGR_OP_SPLIT 0 @@ -92,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) { @@ -128,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) @@ -138,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; } @@ -154,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; } @@ -228,18 +306,23 @@ return (slot+1); } - 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