From d37d26bee3e26ce55e8049f1d2c5f8f97e54b08a Mon Sep 17 00:00:00 2001 From: armink Date: Mon, 21 Aug 2017 21:41:40 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E3=80=90=E5=A2=9E=E5=8A=A0=E3=80=91e?= =?UTF-8?q?f=5Ferase=5Fspec=5Fuser=5Fapp=20=E5=8F=8A=20ef=5Fcopy=5Fspec=5F?= =?UTF-8?q?app=5Ffrom=5Fbak=20=E4=B8=A4=E4=B8=AA=20API=20=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E5=BD=93=E7=94=A8=E6=88=B7=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E4=B8=8E=E5=A4=87=E4=BB=BD=E5=8C=BA=E4=B8=8D?= =?UTF-8?q?=E5=9C=A8=E5=90=8C=E4=B8=80=E4=B8=AA=20Flash=20=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=E4=BD=BF=E7=94=A8=E8=BF=99=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=20API=20=EF=BC=8C=E5=AF=B9=E7=94=A8=E6=88=B7=E7=9A=84=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E7=A8=8B=E5=BA=8F=E8=BF=9B=E8=A1=8C=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: armink --- docs/zh/api.md | 40 ++++++++++++++++++++++++++++++++++---- easyflash/inc/easyflash.h | 6 +++++- easyflash/src/ef_iap.c | 41 ++++++++++++++++++++++++++++++++------- 3 files changed, 75 insertions(+), 12 deletions(-) diff --git a/docs/zh/api.md b/docs/zh/api.md index e6c9180..d7d65c8 100644 --- a/docs/zh/api.md +++ b/docs/zh/api.md @@ -124,7 +124,24 @@ EfErrCode ef_erase_user_app(uint32_t user_app_addr, size_t user_app_size) |user_app_addr |用户应用程序入口地址| |user_app_size |用户应用程序大小| -#### 1.3.3 擦除Bootloader +#### 1.3.3 通过用户指定的擦除方法来擦除应用程序 + +当用户的应用程序与备份区 **不在同一个** Flash 时,则需要用户额外指定擦除应用程序的方法。而 `ef_erase_user_app` 会使用移植文件中的 `ef_port_erase` 方法进行擦除,除此之外的其余功能,两个方法均一致。 + +注意:请不要在应用程序中调用该方法 + +```C +EfErrCode ef_erase_spec_user_app(uint32_t user_app_addr, size_t app_size, + EfErrCode (*app_erase)(uint32_t addr, size_t size)); +``` + +|参数 |描述| +|:----- |:----| +|user_app_addr |用户应用程序入口地址| +|user_app_size |用户应用程序大小| +|app_erase |用户指定应用程序擦写方法| + +#### 1.3.4 擦除Bootloader 注意:请不要在Bootloader中调用该方法 @@ -137,7 +154,7 @@ EfErrCode ef_erase_bl(uint32_t bl_addr, size_t bl_size) |bl_addr |Bootloader入口地址| |bl_size |Bootloader大小| -#### 1.3.4 写数据到备份区 +#### 1.3.5 写数据到备份区 为下载程序到备份区定制的Flash连续写方法。 注意:写之前请先确认Flash已进行擦除。 @@ -156,7 +173,7 @@ EfErrCode ef_write_data_to_bak(uint8_t *data, |cur_size |之前已写入到备份区中的数据大小(字节)| |total_size |需要写入到备份区的数据总大小(字节)| -#### 1.3.5 从备份拷贝应用程序 +#### 1.3.6 从备份拷贝应用程序 将备份区已下载好的应用程序拷贝至用户应用程序起始地址。 注意: @@ -172,7 +189,22 @@ EfErrCode ef_copy_app_from_bak(uint32_t user_app_addr, size_t app_size) |user_app_addr |用户应用程序入口地址| |user_app_size |用户应用程序大小| -#### 1.3.6 从备份拷贝Bootloader +#### 1.3.7 通过用户指定的写操作方法来拷贝应用程序 + +当用户的应用程序与备份区 **不在同一个** Flash 时,则需要用户额外指定写应用程序的方法。而 `ef_copy_app_from_bak` 会使用移植文件中的 `ef_port_write` 方法进行写操作,除此之外的其余功能,两个方法均一致。 + +```C +EfErrCode ef_copy_spec_app_from_bak(uint32_t user_app_addr, size_t app_size, + EfErrCode (*app_write)(uint32_t addr, const uint32_t *buf, size_t size)) +``` + +|参数 |描述| +|:----- |:----| +|user_app_addr |用户应用程序入口地址| +|user_app_size |用户应用程序大小| +|app_write |用户指定应用程序写操作方法| + +#### 1.3.8 从备份拷贝Bootloader 将备份区已下载好的Bootloader拷贝至Bootloader起始地址。 注意: diff --git a/easyflash/inc/easyflash.h b/easyflash/inc/easyflash.h index c66c7cc..9848ff2 100644 --- a/easyflash/inc/easyflash.h +++ b/easyflash/inc/easyflash.h @@ -67,7 +67,7 @@ if (!(EXPR)) \ while (1); \ } /* EasyFlash software version number */ -#define EF_SW_VERSION "3.0.2" +#define EF_SW_VERSION "3.0.3" typedef struct _ef_env{ char *key; @@ -111,10 +111,14 @@ EfErrCode ef_set_and_save_env(const char *key, const char *value); /* ef_iap.c */ EfErrCode ef_erase_bak_app(size_t app_size); EfErrCode ef_erase_user_app(uint32_t user_app_addr, size_t user_app_size); +EfErrCode ef_erase_spec_user_app(uint32_t user_app_addr, size_t app_size, + EfErrCode (*app_erase)(uint32_t addr, size_t size)); EfErrCode ef_erase_bl(uint32_t bl_addr, size_t bl_size); EfErrCode ef_write_data_to_bak(uint8_t *data, size_t size, size_t *cur_size, size_t total_size); EfErrCode ef_copy_app_from_bak(uint32_t user_app_addr, size_t app_size); +EfErrCode ef_copy_spec_app_from_bak(uint32_t user_app_addr, size_t app_size, + EfErrCode (*app_write)(uint32_t addr, const uint32_t *buf, size_t size)); EfErrCode ef_copy_bl_from_bak(uint32_t bl_addr, size_t bl_size); uint32_t ef_get_bak_app_start_addr(void); #endif diff --git a/easyflash/src/ef_iap.c b/easyflash/src/ef_iap.c index 81b3fcd..b51a483 100644 --- a/easyflash/src/ef_iap.c +++ b/easyflash/src/ef_iap.c @@ -80,19 +80,20 @@ EfErrCode ef_erase_bak_app(size_t app_size) { return result; } - /** - * Erase user old application + * Erase user old application by using specified erase function. * * @param user_app_addr application entry address * @param app_size application size + * @param app_erase user specified application erase function * * @return result */ -EfErrCode ef_erase_user_app(uint32_t user_app_addr, size_t app_size) { +EfErrCode ef_erase_spec_user_app(uint32_t user_app_addr, size_t app_size, + EfErrCode (*app_erase)(uint32_t addr, size_t size)) { EfErrCode result = EF_NO_ERR; - result = ef_port_erase(user_app_addr, app_size); + result = app_erase(user_app_addr, app_size); switch (result) { case EF_NO_ERR: { EF_INFO("Erased user application OK.\n"); @@ -108,6 +109,18 @@ EfErrCode ef_erase_user_app(uint32_t user_app_addr, size_t app_size) { return result; } +/** + * Erase user old application by using default `ef_port_erase` function. + * + * @param user_app_addr application entry address + * @param app_size application size + * + * @return result + */ +EfErrCode ef_erase_user_app(uint32_t user_app_addr, size_t app_size) { + return ef_erase_spec_user_app(user_app_addr, app_size, ef_port_erase); +} + /** * Erase old bootloader * @@ -171,14 +184,16 @@ EfErrCode ef_write_data_to_bak(uint8_t *data, size_t size, size_t *cur_size, } /** - * Copy backup area application to application entry. + * Copy backup area application to application entry by using specified write function. * * @param user_app_addr application entry address * @param app_size application size + * @param app_write user specified application write function * * @return result */ -EfErrCode ef_copy_app_from_bak(uint32_t user_app_addr, size_t app_size) { +EfErrCode ef_copy_spec_app_from_bak(uint32_t user_app_addr, size_t app_size, + EfErrCode (*app_write)(uint32_t addr, const uint32_t *buf, size_t size)) { size_t cur_size; uint32_t app_cur_addr, bak_cur_addr; EfErrCode result = EF_NO_ERR; @@ -190,7 +205,7 @@ EfErrCode ef_copy_app_from_bak(uint32_t user_app_addr, size_t app_size) { app_cur_addr = user_app_addr + cur_size; bak_cur_addr = ef_get_bak_app_start_addr() + cur_size; ef_port_read(bak_cur_addr, buff, sizeof(buff)); - result = ef_port_write(app_cur_addr, buff, sizeof(buff)); + result = app_write(app_cur_addr, buff, sizeof(buff)); if (result != EF_NO_ERR) { break; } @@ -210,6 +225,18 @@ EfErrCode ef_copy_app_from_bak(uint32_t user_app_addr, size_t app_size) { return result; } +/** + * Copy backup area application to application entry by using default `ef_port_write` function. + * + * @param user_app_addr application entry address + * @param app_size application size + * + * @return result + */ +EfErrCode ef_copy_app_from_bak(uint32_t user_app_addr, size_t app_size) { + return ef_copy_spec_app_from_bak(user_app_addr, app_size, ef_port_write); +} + /** * Copy backup area bootloader to bootloader entry. *