为方便技术交流探讨,特建一个QQ群:47954837 ,欢迎加入!
接上篇文章,目前编译出基 CortexM0的 差分算法库,供开发者下载,交流学习使用,以下是库的头文件。
/******************************************************************************
*
* ota-rle_x3.lib 使用须知
*
* 1.ota-rle_x3.lib(以下称该库)支持在内存受限系统的差分文件的解压还原算法,
* 主要应用于单片机(不限于)的差分升级领域,版权属于开发者所有;
* 2.该库免费提供给开发者交流、学习、研究使用,请勿私自应用于商业领域,如若违
* 反使用条款,版权所有者有权进行法律追溯;
* 3.禁止对该库的反编译、解密等破坏原程序设计的违法操作;
* 4.允许以交流、学习、研究使用为目的的复制与传播,但在转载时不可更改该文件内
* 容,包含该库的使用须知;
* 5.该库所有权属于@QQ172569891所有人。 26/11/2020 上海
*
*******************************************************************************/
/*******************************************************************************
* ota-rle_x3.lib 使用说明
* 1.使用该库需要调用2个函数,unpack_init(),注册5个回调函数,分别是old
* app的flash_read,patch包 flash_read,new包的 flash_read,new包的flash_write,
* 事件回调函数(如 接收到 E_SUCCESS表示文件还原成功,并通过param告知用户新固件
* 的长度,方便用户做后续的flash搬运操作);unpack_start();启动差分包还原算法,
* 执行结果通过回调告知
* 2.flash_read&flash_write 回调函数原型见是 buffer_in_cb&buffer_out_cb,其中offset
* 代表相应flash存储位置的便宜地址(非绝对地址,用户需要在回调中增加相应偏移,以指向
* 实际的物理地址,如 old_flash 的绝对起始地址在0x8001000,用户在进行flash操作的时候要
* 加上这个偏移)
* 3.主要的内存消耗:= MAX_CHUNK_BUFFER_SIZE*3 + MAX_FLASH_RW_SECTOR_SIZE*2
*
* 4.文件压缩工具请进QQ群 47954837索要
********************************************************************************/
#ifndef __HEADFILE_RLE_X3_UNPACK__
#define __HEADFILE_RLE_X3_UNPACK__
#include <string.h>
#ifndef NULL
#define NULL 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define ALGORITHM_VER "122001"
#define PID_VID 0x052C0001 //厂家&产品 ID
#define MAX_APP_FLASH_SIZE 100*1024UL //应用程序的最大flash分配空间
#define ENABLE_DEBUG_MSG TRUE //调试信息打印功能开关
#define MAX_CHUNK_BUFFER_SIZE 128 //文件解压缓存大小,不小于128
#define MAX_FLASH_RW_SECTOR_SIZE 256 //flash 读写操作大小,不小于128
typedef enum
{
E_SUCCESS,
E_FILE_HEAD_ERR,
E_PID_VID_ERR,
E_FLASH_NOT_ENOUGH_ERR,
E_DIFF_ALGORITHM_ERR,
E_FILE_CRC32_ERR,
E_FILE_CHECK_ERR,
E_PARAMS_ERR,
E_FILE_ERROR,
E_FILE_CRC_ERR,
E_PATCH_CTRL_ERR,
E_PATCH_OFFSET_ERR,
E_PATCH_RW_LEN_ERR,
E_PATCH_NOUTRANGE_ERR,
E_PATCH_CRC_ERR,
}state_en;
typedef int (*buffer_in_cb)(int offset,char *in,int len);
typedef int (*buffer_out_cb)(int offset,char *out,int len);
typedef void (*ota_event_cb)(int event_id,int param);
state_en unpack_init(buffer_in_cb old_f,buffer_in_cb patch_f,
buffer_in_cb r_new_f,buffer_out_cb new_f,
ota_event_cb event_cb);
void unpack_start();
#endif