410 lines
11 KiB
C
410 lines
11 KiB
C
//#include "update_lib.h"
|
||
#include "app_config.h"
|
||
#include "update.h"
|
||
#include "uart.h"
|
||
#include "update_loader_download.h"
|
||
#include "system/fs/fs.h"
|
||
#include "smartbox_update.h"
|
||
#include "JL_rcsp_protocol.h"
|
||
#include "classic/tws_api.h"
|
||
#include "os/os_api.h"
|
||
|
||
#include <string.h>
|
||
|
||
//#if (OTA_TWS_SAME_TIME_ENABLE && SMART_BOX_EN && USER_APP_EN)
|
||
|
||
#include "smartbox_update_tws.h"
|
||
|
||
#if TCFG_USER_TWS_ENABLE
|
||
#include "bt_tws.h"
|
||
#endif
|
||
|
||
#if (SMART_BOX_EN)
|
||
|
||
#define LOG_TAG "[RCSP-UPDATE]"
|
||
#define LOG_INFO_ENABLE
|
||
#define LOG_ERROR_ENABLE
|
||
#include "system/debug.h"
|
||
|
||
typedef enum __DEVICE_REFRESH_FW_STATUS {
|
||
DEVICE_UPDATE_STA_SUCCESS = 0, //升级成功(default)
|
||
DEVICE_UPDATE_STA_VERIFY_ERR, //升级完校验代码出错(default)
|
||
DEVICE_UPDATE_STA_FAIL, //升级失败(default)
|
||
DEVICE_UPDATE_STA_KEY_ERR, //加密key不匹配
|
||
DEVICE_UPDATE_STA_FILE_ERR, //升级文件出错
|
||
DEVICE_UPDATE_STA_TYPE_ERR, //升级类型出错,仅code_type;
|
||
//DEVICE_UPDATE_STA_MAX_ERR,
|
||
DEVICE_UPDATE_STA_LOADER_DOWNLOAD_SUCC = 0x80,
|
||
} DEVICE_UPDATE_STA;
|
||
|
||
typedef enum {
|
||
UPDATA_START = 0x00,
|
||
UPDATA_REV_DATA,
|
||
UPDATA_STOP,
|
||
} UPDATA_BIT_FLAG;
|
||
|
||
|
||
typedef struct _rcsp_update_param_t {
|
||
u32 state;
|
||
u32 read_len;
|
||
u32 need_rx_len;
|
||
u8 *read_buf;
|
||
void (*resume_hdl)(void *priv);
|
||
int (*sleep_hdl)(void *priv);
|
||
u32(*data_send_hdl)(void *priv, u32 offset, u16 len);
|
||
u32(*send_update_status_hdl)(void *priv, u8 state);
|
||
u32 file_offset;
|
||
u8 seek_type;
|
||
} rcsp_update_param_t;
|
||
|
||
extern const int support_dual_bank_update_en;
|
||
|
||
static rcsp_update_param_t rcsp_update_param;
|
||
#define __this (&rcsp_update_param)
|
||
|
||
static u8 *bt_read_buf = NULL;
|
||
static u16 g_bt_read_len = 0;
|
||
static u32 rcsp_file_offset = 0;
|
||
static u8 rcsp_seek_type = 0;
|
||
|
||
//NOTE:测试盒的定义和本sdk文件系统的seek_type定义不一样;
|
||
enum {
|
||
BT_SEEK_SET = 0x01,
|
||
BT_SEEK_CUR = 0x02,
|
||
|
||
BT_SEEK_TYPE_UPDATE_LEN = 0x10,
|
||
};
|
||
|
||
void tws_api_auto_role_switch_disable();
|
||
void tws_api_auto_role_switch_enable();
|
||
|
||
int rcsp_f_seek(void *fp, u8 type, u32 offset)
|
||
{
|
||
if (type == SEEK_SET) {
|
||
__this->file_offset = offset;
|
||
__this->seek_type = BT_SEEK_SET;
|
||
} else if (type == SEEK_CUR) {
|
||
__this->file_offset += offset;
|
||
__this->seek_type = BT_SEEK_CUR;
|
||
}
|
||
|
||
/* lib_printf("---------UPDATA_seek type %d, offsize %d----------\n", bt_seek_type, bt_file_offset); */
|
||
return 0;//FR_OK;
|
||
}
|
||
|
||
static u16 rcsp_f_stop(u8 err);
|
||
|
||
#define RETRY_TIMES 3
|
||
u8 get_rcsp_connect_status();
|
||
u16 rcsp_f_read(void *fp, u8 *buff, u16 len)
|
||
{
|
||
//printf("===rcsp_read:%x %x\n", __this->file_offset, len);
|
||
u8 retry_cnt = 0;
|
||
|
||
__this->need_rx_len = len;
|
||
__this->state = UPDATA_REV_DATA;
|
||
__this->read_len = 0;
|
||
__this->read_buf = buff;
|
||
|
||
#if((OTA_TWS_SAME_TIME_ENABLE && (SMART_BOX_EN)))
|
||
if ((tws_ota_control(OTA_TYPE_GET) == OTA_TWS) &&
|
||
(tws_api_get_tws_state() & TWS_STA_SIBLING_DISCONNECTED)) {
|
||
//假如TWS一起升级,TWS断开了,返回失败
|
||
r_printf("tws disconn, stop update");
|
||
rcsp_f_stop(DEVICE_UPDATE_STA_FAIL);
|
||
return (u16) - 1;
|
||
}
|
||
#endif
|
||
|
||
__RETRY:
|
||
if (!get_rcsp_connect_status()) { //如果已经断开连接直接返回-1
|
||
return -1;
|
||
}
|
||
__this->data_send_hdl(fp, __this->file_offset, len);
|
||
|
||
while (!((0 == __this->state) && (__this->read_len == len))) {
|
||
if (__this->sleep_hdl && get_rcsp_connect_status()) {
|
||
__this->sleep_hdl(NULL);
|
||
} else {
|
||
len = -1;
|
||
break;
|
||
}
|
||
|
||
if (!((0 == __this->state) && (__this->read_len == len))) {
|
||
if (retry_cnt++ > RETRY_TIMES) {
|
||
len = (u16) - 1;
|
||
break;
|
||
} else {
|
||
goto __RETRY;
|
||
}
|
||
}
|
||
}
|
||
|
||
if ((u16) - 1 != len) {
|
||
__this->file_offset += len;
|
||
}
|
||
|
||
|
||
return len;
|
||
}
|
||
|
||
u16 rcsp_f_open(void)
|
||
{
|
||
log_info(">>>rcsp_f_open\n");
|
||
__this->file_offset = 0;
|
||
__this->seek_type = BT_SEEK_SET;
|
||
return 1;
|
||
}
|
||
|
||
u16 rcsp_send_update_len(u32 update_len)
|
||
{
|
||
/* while (0 == (bit(updata_start) & bt_updata_get_flag())); */
|
||
/* bt_updata_clr_flag(updata_start); //clr flag */
|
||
return 1;
|
||
}
|
||
|
||
enum {
|
||
BT_UPDATE_OVER = 0,
|
||
BT_UPDATE_KEY_ERR,
|
||
BT_UPDATE_CONNECT_ERR,
|
||
};
|
||
|
||
static u8 update_result_handle(u8 err)
|
||
{
|
||
u8 res = DEVICE_UPDATE_STA_LOADER_DOWNLOAD_SUCC;
|
||
|
||
#if OTA_TWS_SAME_TIME_ENABLE
|
||
tws_api_auto_role_switch_enable();
|
||
#endif
|
||
|
||
if (err & UPDATE_RESULT_FLAG_BITMAP) {
|
||
switch (err & 0x7f) {
|
||
//升级文件错误
|
||
case UPDATE_RESULT_FILE_SIZE_ERR:
|
||
case UPDATE_RESULT_LOADER_SIZE_ERR:
|
||
case UPDATE_RESULT_REMOTE_FILE_HEAD_ERR:
|
||
case UPDATE_RESULT_LOCAL_FILE_HEAD_ERR:
|
||
case UPDATE_RESULT_FILE_OPERATION_ERR:
|
||
case UPDATE_RESULT_NOT_FIND_TARGET_FILE_ERR:
|
||
case UPDATE_RESULT_PRODUCT_INFO_NOT_MATCH:
|
||
res = DEVICE_UPDATE_STA_FILE_ERR;
|
||
break;
|
||
//文件内容校验失败
|
||
case UPDATE_RESULT_LOADER_VERIFY_ERR:
|
||
case UPDATE_RESULT_FLASH_DATA_VERIFY_ERR:
|
||
res = DEVICE_UPDATE_STA_VERIFY_ERR;
|
||
break;
|
||
|
||
}
|
||
} else if (BT_UPDATE_OVER == err) {
|
||
if (support_dual_bank_update_en) {
|
||
res = DEVICE_UPDATE_STA_SUCCESS;
|
||
} else {
|
||
res = DEVICE_UPDATE_STA_LOADER_DOWNLOAD_SUCC;
|
||
}
|
||
} else if (BT_UPDATE_KEY_ERR == err) {
|
||
res = DEVICE_UPDATE_STA_KEY_ERR;
|
||
} else {
|
||
res = DEVICE_UPDATE_STA_FAIL;
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
static u16 rcsp_f_stop(u8 err)
|
||
{
|
||
/* while (0 == (bit(updata_start) & bt_updata_get_flag())); */
|
||
/* bt_updata_clr_flag(updata_start); //clr flag */
|
||
|
||
err = update_result_handle(err);
|
||
log_info(">>>rcsp_stop\n");
|
||
__this->state = UPDATA_STOP;
|
||
|
||
if (__this->data_send_hdl) {
|
||
__this->data_send_hdl(NULL, 0, 0);
|
||
}
|
||
|
||
while (!(0 == __this->state)) {
|
||
if (__this->sleep_hdl && get_rcsp_connect_status()) {
|
||
if (__this->sleep_hdl(NULL) == OS_TIMEOUT) {
|
||
break;
|
||
}
|
||
} else {
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (__this->send_update_status_hdl) {
|
||
__this->send_update_status_hdl(NULL, err);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
#if((OTA_TWS_SAME_TIME_ENABLE && (SMART_BOX_EN)))
|
||
void db_update_notify_fail_to_phone()
|
||
{
|
||
if (get_rcsp_connect_status()) {
|
||
rcsp_f_stop(DEVICE_UPDATE_STA_FAIL);
|
||
}
|
||
}
|
||
#endif
|
||
|
||
__attribute__((weak))
|
||
void user_change_ble_conn_param(u8 param_index)
|
||
{
|
||
|
||
}
|
||
|
||
static int rcsp_notify_update_content_size(void *priv, u32 size)
|
||
{
|
||
int err;
|
||
|
||
u8 data[4];
|
||
|
||
WRITE_BIG_U32(data, size);
|
||
|
||
user_change_ble_conn_param(0);
|
||
|
||
log_info("send content_size:%x\n", size);
|
||
err = JL_CMD_send(JL_OPCODE_NOTIFY_UPDATE_CONENT_SIZE, data, sizeof(data), JL_NEED_RESPOND);
|
||
|
||
return err;
|
||
}
|
||
|
||
void rcsp_update_handle(u8 state, void *buf, int len)
|
||
{
|
||
/* log_info("R"); */
|
||
if (state != __this->state) {
|
||
log_error(">>>rcsp state err\n");
|
||
return;
|
||
}
|
||
|
||
switch (state) {
|
||
case UPDATA_REV_DATA:
|
||
if (__this->read_buf) {
|
||
memcpy(__this->read_buf, buf, len);
|
||
__this->read_len = len;
|
||
__this->state = 0;
|
||
}
|
||
break;
|
||
|
||
case UPDATA_STOP:
|
||
__this->state = 0;
|
||
break;
|
||
}
|
||
|
||
if (__this->resume_hdl) {
|
||
__this->resume_hdl(NULL);
|
||
}
|
||
}
|
||
|
||
void rcsp_resume(void)
|
||
{
|
||
if (__this->resume_hdl) {
|
||
__this->resume_hdl(NULL);
|
||
}
|
||
}
|
||
|
||
static void rcsp_update_resume_hdl_register(void (*resume_hdl)(void *priv), void (*sleep_hdl)(void *priv))
|
||
{
|
||
__this->resume_hdl = resume_hdl;
|
||
__this->sleep_hdl = sleep_hdl;
|
||
}
|
||
|
||
void rcsp_update_data_api_register(u32(*data_send_hdl)(void *priv, u32 offset, u16 len), u32(*send_update_status_hdl)(void *priv, u8 state))
|
||
{
|
||
__this->data_send_hdl = data_send_hdl;
|
||
__this->send_update_status_hdl = send_update_status_hdl;
|
||
}
|
||
|
||
void rcsp_ch_update_init(void (*resume_hdl)(void *priv), int (*sleep_hdl)(void *priv))
|
||
{
|
||
log_info("------------rcsp_ch_update_init\n");
|
||
|
||
rcsp_update_resume_hdl_register(resume_hdl, sleep_hdl);
|
||
//register_receive_fw_update_block_handle(rcsp_updata_handle);
|
||
}
|
||
|
||
const update_op_api_t rcsp_update_op = {
|
||
.ch_init = rcsp_ch_update_init,
|
||
.f_open = rcsp_f_open,
|
||
.f_read = rcsp_f_read,
|
||
.f_seek = rcsp_f_seek,
|
||
.f_stop = rcsp_f_stop,
|
||
.notify_update_content_size = rcsp_notify_update_content_size,
|
||
};
|
||
|
||
#if((OTA_TWS_SAME_TIME_ENABLE && (SMART_BOX_EN)))
|
||
const update_op_api_t rcsp_tws_update_op = {
|
||
.ch_init = rcsp_ch_update_init,
|
||
.f_open = rcsp_f_open,
|
||
.f_read = rcsp_f_read,
|
||
.f_seek = rcsp_f_seek,
|
||
.f_stop = rcsp_f_stop,
|
||
.notify_update_content_size = rcsp_notify_update_content_size,
|
||
|
||
//for tws ota
|
||
.tws_ota_start = tws_ota_open,
|
||
.tws_ota_data_send = tws_ota_data_send_m_to_s,
|
||
.tws_ota_err = tws_ota_err_callback,
|
||
.enter_verfiy_hdl = tws_ota_enter_verify,
|
||
.exit_verify_hdl = tws_ota_exit_verify,
|
||
.update_boot_info_hdl = tws_ota_updata_boot_info_over,
|
||
};
|
||
#endif
|
||
|
||
extern void set_jl_update_flag(u8 flag);
|
||
static void rcsp_update_state_cbk(int type, u32 state, void *priv)
|
||
{
|
||
update_ret_code_t *ret_code = (update_ret_code_t *)priv;
|
||
log_info("state:%x err:%x\n", ret_code->stu, ret_code->err_code);
|
||
switch (state) {
|
||
case UPDATE_CH_EXIT:
|
||
if (UPDATE_DUAL_BANK_IS_SUPPORT()) {
|
||
if ((0 == ret_code->stu) && (0 == ret_code->err_code)) {
|
||
set_jl_update_flag(1);
|
||
log_info(">>>rcsp update succ\n");
|
||
update_result_set(UPDATA_SUCC);
|
||
|
||
} else {
|
||
update_result_set(UPDATA_DEV_ERR);
|
||
log_info(">>>rcsp update succ\n");
|
||
}
|
||
} else {
|
||
if ((0 == ret_code->stu) && (0 == ret_code->err_code)) {
|
||
set_jl_update_flag(1);
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
void rcsp_update_loader_download_init(int update_type, void (*result_cbk)(void *priv, u8 type, u8 cmd))
|
||
{
|
||
#if((OTA_TWS_SAME_TIME_ENABLE && (SMART_BOX_EN)))
|
||
tws_api_auto_role_switch_disable();
|
||
if ((tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED) && support_dual_bank_update_en) { //双备份才支持tws同步升级
|
||
extern int tws_ota_init(void);
|
||
tws_ota_init();
|
||
app_update_loader_downloader_init(
|
||
update_type,
|
||
result_cbk,
|
||
NULL,
|
||
&rcsp_tws_update_op);
|
||
} else
|
||
#endif
|
||
{
|
||
update_mode_info_t info = {
|
||
.type = update_type,
|
||
.state_cbk = rcsp_update_state_cbk,
|
||
.p_op_api = &rcsp_update_op,
|
||
.task_en = 1,
|
||
};
|
||
app_active_update_task_init(&info);
|
||
}
|
||
|
||
}
|
||
|
||
#endif //(OTA_TWS_SAME_TIME_ENABLE && (SMART_BOX_EN))
|