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)