1、【增加】ef_erase_spec_user_app 及 ef_copy_spec_app_from_bak 两个 API 方法,当用户应用程序与备份区不在同一个 Flash 时,可使用这两个 API ,对用户的应用程序进行独立操作。

Signed-off-by: armink <armink.ztl@gmail.com>
pull/15/head
armink 8 years ago
parent f6435525db
commit d37d26bee3

@ -124,7 +124,24 @@ EfErrCode ef_erase_user_app(uint32_t user_app_addr, size_t user_app_size)
|user_app_addr |用户应用程序入口地址| |user_app_addr |用户应用程序入口地址|
|user_app_size |用户应用程序大小| |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中调用该方法 注意请不要在Bootloader中调用该方法
@ -137,7 +154,7 @@ EfErrCode ef_erase_bl(uint32_t bl_addr, size_t bl_size)
|bl_addr |Bootloader入口地址| |bl_addr |Bootloader入口地址|
|bl_size |Bootloader大小| |bl_size |Bootloader大小|
#### 1.3.4 写数据到备份区 #### 1.3.5 写数据到备份区
为下载程序到备份区定制的Flash连续写方法。 为下载程序到备份区定制的Flash连续写方法。
注意写之前请先确认Flash已进行擦除。 注意写之前请先确认Flash已进行擦除。
@ -156,7 +173,7 @@ EfErrCode ef_write_data_to_bak(uint8_t *data,
|cur_size |之前已写入到备份区中的数据大小(字节)| |cur_size |之前已写入到备份区中的数据大小(字节)|
|total_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_addr |用户应用程序入口地址|
|user_app_size |用户应用程序大小| |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起始地址。 将备份区已下载好的Bootloader拷贝至Bootloader起始地址。
注意: 注意:

@ -67,7 +67,7 @@ if (!(EXPR)) \
while (1); \ while (1); \
} }
/* EasyFlash software version number */ /* EasyFlash software version number */
#define EF_SW_VERSION "3.0.2" #define EF_SW_VERSION "3.0.3"
typedef struct _ef_env{ typedef struct _ef_env{
char *key; char *key;
@ -111,10 +111,14 @@ EfErrCode ef_set_and_save_env(const char *key, const char *value);
/* ef_iap.c */ /* ef_iap.c */
EfErrCode ef_erase_bak_app(size_t app_size); 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_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_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, EfErrCode ef_write_data_to_bak(uint8_t *data, size_t size, size_t *cur_size,
size_t total_size); size_t total_size);
EfErrCode ef_copy_app_from_bak(uint32_t user_app_addr, size_t app_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); EfErrCode ef_copy_bl_from_bak(uint32_t bl_addr, size_t bl_size);
uint32_t ef_get_bak_app_start_addr(void); uint32_t ef_get_bak_app_start_addr(void);
#endif #endif

@ -80,19 +80,20 @@ EfErrCode ef_erase_bak_app(size_t app_size) {
return result; return result;
} }
/** /**
* Erase user old application * Erase user old application by using specified erase function.
* *
* @param user_app_addr application entry address * @param user_app_addr application entry address
* @param app_size application size * @param app_size application size
* @param app_erase user specified application erase function
* *
* @return result * @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; EfErrCode result = EF_NO_ERR;
result = ef_port_erase(user_app_addr, app_size); result = app_erase(user_app_addr, app_size);
switch (result) { switch (result) {
case EF_NO_ERR: { case EF_NO_ERR: {
EF_INFO("Erased user application OK.\n"); 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; 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 * 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 user_app_addr application entry address
* @param app_size application size * @param app_size application size
* @param app_write user specified application write function
* *
* @return result * @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; size_t cur_size;
uint32_t app_cur_addr, bak_cur_addr; uint32_t app_cur_addr, bak_cur_addr;
EfErrCode result = EF_NO_ERR; 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; app_cur_addr = user_app_addr + cur_size;
bak_cur_addr = ef_get_bak_app_start_addr() + cur_size; bak_cur_addr = ef_get_bak_app_start_addr() + cur_size;
ef_port_read(bak_cur_addr, buff, sizeof(buff)); 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) { if (result != EF_NO_ERR) {
break; break;
} }
@ -210,6 +225,18 @@ EfErrCode ef_copy_app_from_bak(uint32_t user_app_addr, size_t app_size) {
return result; 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. * Copy backup area bootloader to bootloader entry.
* *

Loading…
Cancel
Save