#include "include.h" #define TRACE_EN 0 #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif extern u32 code_area_addr; extern u32 res_area_addr; extern bool cache_init_flag; const uint8_t *bt_rf_get_inq_param(void) { return NULL; } const uint8_t *bt_rf_get_param(void) { return (const uint8_t *)&xcfg_cb.rf_pa_gain; } #define CODE_BASE_ADDR (USERBOOT_SIZE + 0x2000) #define RES_BASE_ADDR (CODE_BASE_ADDR + CODE_SIZE) //库里面初始化调用,弱定义,设置代码启动地址 u8 rsp_adv_data[31]; void cache_addr_init() { code_area_addr = CODE_BASE_ADDR; res_area_addr = RES_BASE_ADDR; u8 sot_flag = 0; os_spiflash_read(&sot_flag, OTA_FLAG_ADDR, 1); os_spiflash_read(rsp_adv_data, OTA_FLAG_ADDR + 1, 32); printf("SOT_FLAG[%x][%x][%x][%x]\n", sot_flag,OTA_FLAG_ADDR,RES_BASE_ADDR,FLASH_UI_BASE); printf("rsp_adv_data\n"); print_r(rsp_adv_data, 31); if(rsp_adv_data[0] != 0x1e && rsp_adv_data[1] != 0xff) { sot_flag = 0xff; } //是否进用户主程序标志位 cache_init_flag = sot_flag;//(bool)sot_flag; //0xff表示重启后进主程序,0x00表示重启后进升级驱动 } /*******************bin文件更新code示例工程********************* *此例程事先将升级程序储存在flash,读取升级数据进行程序更新 *实际使用无需app无线发送,需要替换数据传输接口***\ *升级文件分三部分(app.bin/res.bin/ui.bin) *app.bin:代码区 ----起始地址:CODE_BASE_ADDR *res.bin:提示音/EQ资源----起始地址:RES_BASE_ADDR *ui.bin: 表盘/字库资源 ----起始地址:UI_BASE_ADDR *升级步骤:详见ota_demo *1.write_code_init(); //写入code前需初始化相关buf *2.write_code_start(0,CODE_BASE_ADDR, file_len); //设置app.bin区域地址和大小,CODE_BASE_ADDR:初始地址,file_len:文件大小;需512byte对齐 *3.write_code(test_buf); //循环写入app.bin数据 *4.write_code_verify(); //校验数据是否正确 *5.write_code_init(); //写入code前需初始化相关buf *6.write_code_start(0,RES_BASE_ADDR, res_len); //设res.bin区域地址和大小,RES_BASE_ADDR:初始地址,res_len:文件大小;需512byte对齐 *7.write_code(test_buf); //循环写入app.bin数据 *8.write_code_verify(); //校验数据是否正确 *9.以上步骤为app.bin和res.bin升级步骤,flash擦读写操作已经整合函数,10.以下为ui升级步骤 *10.ui升级区域不设值加解密,用标准flash擦读写接口即可,详见api_flash.h *擦:void os_spiflash_erase(u32 addr); *读:uint os_spiflash_read(void *buf, u32 addr, uint len); *写:void spiflash_program(void *buf, u32 addr, uint len); */ u8 test_buf[512] AT(.buf.test); AT(.com_text.spiflash) bool ota_demo(void) { //升级文件中app.bin存放位置和大小 int file_addr = 0x100000; int file_len = 0x61400; //升级文件中res.bin存放位置和大小 int res_addr = 0x100000; int res_len = 0x0; int i; //buf初始化 write_code_init(); //写入code区数据 TRACE("write_code\n"); //设置app.bin初始存放地址 write_code_start(0, CODE_BASE_ADDR, file_len); //读取升级数据,写入app.bin数据 for (i=0; i