902 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			902 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | 
						|
 | 
						|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | 
						|
be copied by any method or incorporated into another program without
 | 
						|
the express written consent of Aerospace C.Power. This Information or any portion
 | 
						|
thereof remains the property of Aerospace C.Power. The Information contained herein
 | 
						|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | 
						|
liability for its use in any way and conveys no license or title under
 | 
						|
any patent or copyright and makes no representation or warranty that this
 | 
						|
Information is free from patent or copyright infringement.
 | 
						|
 | 
						|
****************************************************************************/
 | 
						|
 | 
						|
/* os_shim header files */
 | 
						|
#include "os_types_api.h"
 | 
						|
#include "os_timer_api.h"
 | 
						|
#include "os_utils_api.h"
 | 
						|
 | 
						|
#include "iot_errno_api.h"
 | 
						|
#include "proto_645.h"
 | 
						|
#include "proto_69845.h"
 | 
						|
#include "iot_bsrm_common.h"
 | 
						|
#include "iot_bsrm_pm_upgrade_img.h"
 | 
						|
 | 
						|
#if IOT_BSRM_PM_UPGRADE_ENABLE
 | 
						|
 | 
						|
/* pm upgrade cmd retry max count */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_RETRY_MAX_CNT           (3)
 | 
						|
 | 
						|
/* resend pm miss image data max count */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_RESEND_MAX_CNT          (2)
 | 
						|
 | 
						|
/* define pm upgrade status */
 | 
						|
/* meter upgrade idle */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_STATE_IDLE              (0)
 | 
						|
/* check meter version */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_STATE_CHECK_VER         (1)
 | 
						|
/* translate upgrade file info */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_INFO    (2)
 | 
						|
/* translate upgrade data */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_DATA    (3)
 | 
						|
/* query upgrade file status info */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_STATE_QUERY_INFO        (4)
 | 
						|
/* exe upgrade */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_STATE_EXE               (5)
 | 
						|
 | 
						|
/* default timeout time for upgrade cmd response, uint is 1ms. */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_DEFAULT_RSP_TIMEOUT     (2000)
 | 
						|
 | 
						|
/* the timeout time for broadcast data timeout, uint is 1ms. */
 | 
						|
#define IOT_BSRM_PM_UPGRADE_BROADCAST_TIMEOUT       (1000)
 | 
						|
 | 
						|
/* bsrm pm upgrade info */
 | 
						|
typedef struct _iot_bsrm_pm_upgrade_info {
 | 
						|
    /* upgrade pm status see - IOT_BSRM_PM_UPGRADE_STATE_XXX */
 | 
						|
    uint8_t state;
 | 
						|
    /* retry upgrade cmd count */
 | 
						|
    uint8_t retry_cnt   : 4,
 | 
						|
    /* resend miss transfile data count */
 | 
						|
            resend_cnt  : 4;
 | 
						|
    /* transfile block index */
 | 
						|
    uint16_t block_index;
 | 
						|
    /* total block count */
 | 
						|
    uint16_t block_cnt;
 | 
						|
    /* img bitmap */
 | 
						|
    uint8_t *bitmap;
 | 
						|
    /* img bitmap size */
 | 
						|
    uint16_t bitmap_size;
 | 
						|
} iot_bsrm_pm_upgrade_info_t;
 | 
						|
 | 
						|
static iot_bsrm_pm_upgrade_info_t *g_pm_upgrade_info = NULL;
 | 
						|
 | 
						|
static uint32_t iot_bsrm_pm_upgrade_get_block_to_resend(uint16_t src_index,
 | 
						|
    uint16_t *dec_index)
 | 
						|
{
 | 
						|
    if (src_index >= g_pm_upgrade_info->block_cnt) {
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    /* check if pm received all block in the window */
 | 
						|
    for (; src_index < g_pm_upgrade_info->block_cnt; ++src_index) {
 | 
						|
        /* bit7~bit0 is index0~index7 */
 | 
						|
        if (0 == (g_pm_upgrade_info->bitmap[src_index >> 3] &
 | 
						|
            (0x80 >> (src_index & 0x7)))) {
 | 
						|
            break;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if (src_index == g_pm_upgrade_info->block_cnt) {
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
    iot_bsrm_printf("%s  rsc data: %08x, index: %d \n",
 | 
						|
        __FUNCTION__, g_pm_upgrade_info->bitmap[src_index >> 3],
 | 
						|
        src_index);
 | 
						|
    *dec_index = src_index;
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
static iot_pkt_t *iot_bsrm_pm_upgrade_build_69845_check_pkt()
 | 
						|
{
 | 
						|
    server_addr_info_t server = {0};
 | 
						|
    proto_69845_app_get_req_info_t req = {0};
 | 
						|
    req.type = PROTO_69845_APP_GET_NORMAL;
 | 
						|
    req.piid.priority = PROTO_69845_APP_PIID_PRIORITY_GENERAL;
 | 
						|
    req.piid.sn = 0;
 | 
						|
    req.oad.oi = PROTO_69845_APP_OI_ELE_ID;
 | 
						|
    req.oad.attribute_id = 3;
 | 
						|
    req.oad.attribute_char = 0;
 | 
						|
    req.oad.element_index = 0;
 | 
						|
    server.len = IOT_MAC_ADDR_LEN;
 | 
						|
    server.type = PROTO_69845_SA_TYPE_WILDCARD;
 | 
						|
    iot_mac_addr_cpy(server.addr, proto_645_any_addr);
 | 
						|
    return proto_69845_build_get_req_msg(&req, &server);
 | 
						|
}
 | 
						|
 | 
						|
static iot_pkt_t *iot_bsrm_pm_upgrade_build_69845_fileinfo_pkt()
 | 
						|
{
 | 
						|
    iot_pkt_t *pkt = NULL;
 | 
						|
    proto_69845_app_action_req_single_t *req_info;
 | 
						|
    uint8_t file_info_data[128] = { 0 }, *app_data;
 | 
						|
    uint16_t i;
 | 
						|
    uint32_t local_ver = iot_bsrm_pm_get_local_img_version();
 | 
						|
    uint32_t size = iot_bsrm_pm_get_local_img_size();
 | 
						|
    uint32_t crc = iot_bsrm_pm_get_local_img_crc();
 | 
						|
    server_addr_info_t server_info = {0};
 | 
						|
    char ver_string[16];
 | 
						|
 | 
						|
    server_info.len = PROTO_69845_SA_LEN;
 | 
						|
    server_info.type = PROTO_69845_SA_TYPE_WILDCARD;
 | 
						|
    iot_mac_addr_cpy(server_info.addr, proto_645_any_addr);
 | 
						|
 | 
						|
    req_info = (proto_69845_app_action_req_single_t *)file_info_data;
 | 
						|
    req_info->omd.method_id = PROTO_OMD_TRANSFILE_INFO_START_METHOD_ID;
 | 
						|
    req_info->omd.oi = PROTO_69845_APP_OI_FILETRANS_BLOCK;
 | 
						|
    req_info->omd.operation_mode = 0;
 | 
						|
 | 
						|
    req_info->data.data_type = PROTO_69845_APP_DATA_STRUCTURE;
 | 
						|
    app_data = (file_info_data + sizeof(*req_info));
 | 
						|
    i = 0;
 | 
						|
    app_data[i++] = 6;
 | 
						|
    /* file info, type is struct */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_STRUCTURE;
 | 
						|
    app_data[i++] = 6;
 | 
						|
    /* src file path, type is visible string */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_VISIBLE_STRING;
 | 
						|
    app_data[i++] = 1;
 | 
						|
    /* src file is null */
 | 
						|
    app_data[i++] = 0x30;
 | 
						|
    /* destination file path, type is visible string */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_VISIBLE_STRING;
 | 
						|
    app_data[i++] = 1;
 | 
						|
    /* destination file is null */
 | 
						|
    app_data[i++] = 0x30;
 | 
						|
    /* file size type is double long unsigned */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_DOUBLE_LONG_UNSIGNED;
 | 
						|
    iot_uint32_to_bytes(size, app_data + i, 1);
 | 
						|
    i += PROTO_69845_METER_DATA_DOUBLE_LONG_LEN;
 | 
						|
    /* file attribute, type is bit-string size 3, bit0 - 1 read, 0 not read;
 | 
						|
       bit1 - 1 write, 0 not write; bit2 - 1 exe, 0 not exe.
 | 
						|
     */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_BIT_STRING;
 | 
						|
    app_data[i++] = 3;
 | 
						|
    app_data[i++] = 0;
 | 
						|
    /* file version, type is visible string */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_VISIBLE_STRING;
 | 
						|
    /* local image version */
 | 
						|
    app_data[i] = iot_sprintf(ver_string, "%d", local_ver);
 | 
						|
    os_mem_cpy(app_data + i + 1, ver_string, app_data[i]);
 | 
						|
    i += app_data[i] + 1;
 | 
						|
    /* file type, type is enum, 0 - local file, 1 - other file */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_ENUM;
 | 
						|
    app_data[i++] = 0;
 | 
						|
    /* translate block size, type is  long unsigned */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_LONG_UNSIGNED;
 | 
						|
    iot_uint16_to_bytes(IOT_BSRM_PM_UPGRADE_BLOCK_SIZE, app_data + i, 1);
 | 
						|
    i += PROTO_69845_METER_DATA_LONG_LEN;
 | 
						|
    /* check type, type is struct */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_STRUCTURE;
 | 
						|
    app_data[i++] = 2;
 | 
						|
    /* check mode, type is enum, 0 - crc, 1 -mdt, 2 - sha1, 255 - other */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_ENUM;
 | 
						|
    app_data[i++] = 0;
 | 
						|
    /* check value, type is octet-string */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_OCTET_STRING;
 | 
						|
    app_data[i++] = sizeof(crc);
 | 
						|
    iot_uint16_to_bytes(crc, app_data + i, 1);
 | 
						|
    i += sizeof(crc);
 | 
						|
    /* compatible soft version, type is array visible string */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_ARRAY;
 | 
						|
    app_data[i++] = 1;
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_VISIBLE_STRING;
 | 
						|
    /* compatible soft version default 0 */
 | 
						|
    app_data[i] = iot_sprintf(ver_string, "0", local_ver);
 | 
						|
    os_mem_cpy(app_data + i + 1, ver_string, app_data[i]);
 | 
						|
    i += app_data[i] + 1;
 | 
						|
 | 
						|
    /* compatible hardware version, type is array visible string */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_ARRAY;
 | 
						|
    app_data[i++] = 1;
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_VISIBLE_STRING;
 | 
						|
    /* compatible hardware version default 0 */
 | 
						|
    app_data[i] = iot_sprintf(ver_string, "0", local_ver);
 | 
						|
    os_mem_cpy(app_data + i + 1, ver_string, app_data[i]);
 | 
						|
    i += app_data[i] + 1;
 | 
						|
 | 
						|
    /* loader id type is octet string */
 | 
						|
    app_data[i++] = PROTO_69845_APP_DATA_OCTET_STRING;
 | 
						|
    app_data[i++] = 1;
 | 
						|
    app_data[i++] = 0;
 | 
						|
    pkt = proto_69845_build_action_req_single_msg(req_info, i,
 | 
						|
        &server_info);
 | 
						|
    iot_bsrm_printf("%s size: %lu \n", __FUNCTION__, size);
 | 
						|
    return pkt;
 | 
						|
}
 | 
						|
 | 
						|
static iot_pkt_t *iot_bsrm_pm_upgrade_build_69845_query_pkt()
 | 
						|
{
 | 
						|
    server_addr_info_t server = {0};
 | 
						|
    proto_69845_app_get_req_info_t req = {0};
 | 
						|
    req.type = PROTO_69845_APP_GET_NORMAL;
 | 
						|
    req.piid.priority = PROTO_69845_APP_PIID_PRIORITY_GENERAL;
 | 
						|
    req.piid.sn = 0;
 | 
						|
    req.oad.oi = PROTO_69845_APP_OI_FILETRANS_BLOCK;
 | 
						|
    req.oad.attribute_id = 4;
 | 
						|
    req.oad.attribute_char = 0;
 | 
						|
    req.oad.element_index = 0;
 | 
						|
    server.len = IOT_MAC_ADDR_LEN;
 | 
						|
    server.type = PROTO_69845_SA_TYPE_WILDCARD;
 | 
						|
    iot_mac_addr_cpy(server.addr, proto_645_any_addr);
 | 
						|
    return proto_69845_build_get_req_msg(&req, &server);
 | 
						|
}
 | 
						|
 | 
						|
static iot_pkt_t *iot_bsrm_pm_upgrade_build_69845_exe_pkt()
 | 
						|
{
 | 
						|
    iot_pkt_t *pkt = NULL;
 | 
						|
    proto_69845_app_action_req_single_t *req_info;
 | 
						|
    uint8_t file_info_data[64] = { 0 };
 | 
						|
    proto_69845_app_data_time_s_t *times;
 | 
						|
    server_addr_info_t server_info = {0};
 | 
						|
 | 
						|
    server_info.len = PROTO_69845_SA_LEN;
 | 
						|
    server_info.type = PROTO_69845_SA_TYPE_WILDCARD;
 | 
						|
    iot_mac_addr_cpy(server_info.addr, proto_645_any_addr);
 | 
						|
 | 
						|
    req_info = (proto_69845_app_action_req_single_t *)file_info_data;
 | 
						|
    req_info->omd.method_id = 13;
 | 
						|
    req_info->omd.oi = PROTO_69845_APP_OI_FILETRANS_BLOCK;
 | 
						|
    req_info->omd.operation_mode = 0;
 | 
						|
 | 
						|
    req_info->data.data_type = PROTO_69845_APP_DATA_TIME_S;
 | 
						|
    times = (proto_69845_app_data_time_s_t*)(file_info_data +
 | 
						|
        sizeof(*req_info));
 | 
						|
    times->year = 0xffff;
 | 
						|
    times->month = 0xff;
 | 
						|
    times->day = 0xff;
 | 
						|
    times->hour = 0xff;
 | 
						|
    times->minute = 0xff;
 | 
						|
    times->second = 0xff;
 | 
						|
    pkt = proto_69845_build_action_req_single_msg(req_info, sizeof(*times),
 | 
						|
        &server_info);
 | 
						|
    return pkt;
 | 
						|
}
 | 
						|
 | 
						|
static iot_pkt_t *iot_bsrm_pm_upgrade_build_69845_transfile_data_pkt()
 | 
						|
{
 | 
						|
    proto_69845_app_action_req_single_t *req_info;
 | 
						|
    proto_69845_app_len_descript_t *len_desc;
 | 
						|
    uint16_t len;
 | 
						|
    uint8_t *data, *app_data;
 | 
						|
    uint8_t reason = 0;
 | 
						|
    uint16_t i = 0;
 | 
						|
    server_addr_info_t server_info = { 0 };
 | 
						|
    iot_pkt_t *pkt = NULL, *tmp_pkt = NULL;
 | 
						|
    const uint8_t *img_data = NULL;
 | 
						|
 | 
						|
    /* proto_69845_app_action_req_single_t + 1 byte struct
 | 
						|
     * element unmber + 1 byte element1 long-unsigned type + 2 byte
 | 
						|
     * long_unsigned size + 1 byte element2 octet-string + 1 byte octet-string
 | 
						|
     * len descript + 2 byte octet string length +
 | 
						|
     * IOT_BSRM_PM_UPGRADE_BLOCK_SIZE byte block data
 | 
						|
     */
 | 
						|
    len = sizeof(*req_info) + sizeof(*len_desc) + 7 +
 | 
						|
        IOT_BSRM_PM_UPGRADE_BLOCK_SIZE;
 | 
						|
 | 
						|
    tmp_pkt = iot_pkt_alloc(len, IOT_BSRM_MID);
 | 
						|
    if (!tmp_pkt) {
 | 
						|
        reason = 1;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    data = iot_pkt_data(tmp_pkt);
 | 
						|
 | 
						|
    req_info = (proto_69845_app_action_req_single_t *)data;
 | 
						|
    req_info->omd.method_id = PROTO_OMD_TRANSFILE_DATA_METHOD_ID;
 | 
						|
    req_info->omd.oi = PROTO_69845_APP_OI_FILETRANS_BLOCK;
 | 
						|
    req_info->omd.operation_mode = 0;
 | 
						|
 | 
						|
    req_info->data.data_type = PROTO_69845_APP_DATA_STRUCTURE;
 | 
						|
    app_data = data + sizeof(*req_info);
 | 
						|
    /* element cnt in structure, it's always 2 */
 | 
						|
    *(app_data + i) = 2;
 | 
						|
    i++;
 | 
						|
    /* element1, block number, type is  long-unsigned */
 | 
						|
    *(app_data + i) = PROTO_69845_APP_DATA_LONG_UNSIGNED;
 | 
						|
    i++;
 | 
						|
    /* long-unsigned size, 2 bytes */
 | 
						|
    iot_uint16_to_bytes(g_pm_upgrade_info->block_index, app_data + i, 1);
 | 
						|
    i += PROTO_69845_METER_DATA_LONG_LEN;
 | 
						|
    /* element2, block data, type is octet-string */
 | 
						|
    *(app_data + i) = PROTO_69845_APP_DATA_OCTET_STRING;
 | 
						|
    i++;
 | 
						|
 | 
						|
    /* get data length, ready to fillwith length sigment */
 | 
						|
    len = (uint16_t)iot_bsrm_pm_get_local_img_data(&img_data,
 | 
						|
        IOT_BSRM_PM_UPGRADE_BLOCK_SIZE, g_pm_upgrade_info->block_index);
 | 
						|
    if (len >= 0x80) {
 | 
						|
        /* octet-string length descript,
 | 
						|
         * proto_69845_app_len_descript_t, length byte is 2B
 | 
						|
         */
 | 
						|
        len_desc = (proto_69845_app_len_descript_t *)(app_data + i);
 | 
						|
        len_desc->mub_flag = 1;
 | 
						|
        len_desc->byte_num = 0x02;
 | 
						|
        i += sizeof(*len_desc);
 | 
						|
        /* block data length */
 | 
						|
        iot_uint16_to_bytes(len, app_data + i, 1);
 | 
						|
        i += 2;
 | 
						|
    } else {
 | 
						|
        *(app_data + i) = len;
 | 
						|
        i++;
 | 
						|
    }
 | 
						|
    /* block data */
 | 
						|
    IOT_ASSERT(len);
 | 
						|
    os_mem_cpy(app_data + i, img_data, len);
 | 
						|
    iot_data_reverse(app_data + i, len);
 | 
						|
    i += len;
 | 
						|
    server_info.len = 1;
 | 
						|
    server_info.addr[0] = PROTO_69845_SA_BROADCAST_ADD;
 | 
						|
    server_info.type = PROTO_69845_SA_TYPE_BROADCAST;
 | 
						|
    pkt = proto_69845_build_action_req_single_msg(req_info, i,
 | 
						|
        &server_info);
 | 
						|
 | 
						|
out:
 | 
						|
    if (tmp_pkt) {
 | 
						|
        iot_pkt_free(tmp_pkt);
 | 
						|
    }
 | 
						|
    iot_bsrm_printf("%s state: %d, reason: %d, index: %d, len: %d\n",
 | 
						|
        __FUNCTION__, g_pm_upgrade_info->state, reason,
 | 
						|
        g_pm_upgrade_info->block_index, len);
 | 
						|
    return pkt;
 | 
						|
}
 | 
						|
 | 
						|
static uint8_t iot_bsrm_handle_pm_upgrade_check_ver(
 | 
						|
    proto_69845_frame_head_info_t *hdr_698, apdu_info_t *apdu_desc)
 | 
						|
{
 | 
						|
    uint8_t done = 0;
 | 
						|
    uint8_t reason = 0;
 | 
						|
    uint32_t oad_value;
 | 
						|
    proto_69845_apdu_t *apdu;
 | 
						|
    proto_69845_apdu_get_rsp_t *get_rsp;
 | 
						|
    proto_69845_app_result_normal_t *normal_resp;
 | 
						|
    proto_69845_ver_info_uint_t *ver_app_data;
 | 
						|
    uint32_t local_ver;
 | 
						|
    uint8_t pm_ver[16] = { 0 };
 | 
						|
 | 
						|
    if (hdr_698->ctrl.dir_prm != PROTO_69845_D_P_SERVER_RESPONSE) {
 | 
						|
        reason = 1;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    apdu = (proto_69845_apdu_t *)apdu_desc->ptr;
 | 
						|
    if (apdu_desc->len < (sizeof(*apdu) + sizeof(*get_rsp) +
 | 
						|
        sizeof(*normal_resp) + sizeof(*ver_app_data))) {
 | 
						|
        reason = 2;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    if (apdu->type != PROTO_69845_S_APP_GET_RESP) {
 | 
						|
        reason = 3;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    get_rsp = (proto_69845_apdu_get_rsp_t *)apdu->data;
 | 
						|
    if (get_rsp->type != PROTO_69845_APP_GET_NORMAL) {
 | 
						|
        reason = 4;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    normal_resp = (proto_69845_app_result_normal_t *)get_rsp->data;
 | 
						|
    oad_value = iot_bytes_to_uint32((uint8_t *)&normal_resp->oad.oi, 1);
 | 
						|
    if (PROTO_69845_APP_OAD_VERSION != oad_value) {
 | 
						|
        reason = 5;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    if (normal_resp->get_result.result_type !=
 | 
						|
        PROTO_69845_APP_GET_RESULT_DATA) {
 | 
						|
        reason = 6;
 | 
						|
        goto fail;
 | 
						|
    }
 | 
						|
    ver_app_data = (proto_69845_ver_info_uint_t *)
 | 
						|
        (normal_resp->get_result.result);
 | 
						|
    if (ver_app_data->data0_type != PROTO_69845_APP_DATA_STRUCTURE) {
 | 
						|
        reason = 7;
 | 
						|
        goto fail;
 | 
						|
    }
 | 
						|
    if (ver_app_data->cnt < PROTO_69845_GET_VERSION_CNT) {
 | 
						|
        reason = 8;
 | 
						|
        goto fail;
 | 
						|
    }
 | 
						|
    local_ver = iot_bsrm_pm_get_local_img_version();
 | 
						|
    os_mem_cpy(pm_ver, ver_app_data->soft_ver, sizeof(ver_app_data->soft_ver));
 | 
						|
    g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_INFO;
 | 
						|
    iot_bsrm_printf("%s local ver:0x%04x - %lu, pm ver: %s\n", __FUNCTION__,
 | 
						|
        local_ver, local_ver, pm_ver);
 | 
						|
    done = 1;
 | 
						|
    goto out;
 | 
						|
fail:
 | 
						|
    done = 1;
 | 
						|
    iot_bsrm_set_pm_upgrade_guard_code(0);
 | 
						|
    g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_IDLE;
 | 
						|
out:
 | 
						|
    iot_bsrm_printf("%s state: %d, reason: %d, done: %d\n", __FUNCTION__,
 | 
						|
        g_pm_upgrade_info->state, reason, done);
 | 
						|
    return done;
 | 
						|
}
 | 
						|
 | 
						|
static uint8_t iot_bsrm_handle_pm_upgrade_fileinfo_rsp(
 | 
						|
    proto_69845_frame_head_info_t *hdr_698, apdu_info_t *apdu_desc)
 | 
						|
{
 | 
						|
    uint8_t done = 0;
 | 
						|
    uint8_t reason = 0;
 | 
						|
    proto_69845_apdu_t *apdu;
 | 
						|
    proto_69845_app_action_resp_t *act_resp;
 | 
						|
    proto_69845_app_action_resp_normal_t *act_resp_single;
 | 
						|
    uint32_t oad_value;
 | 
						|
 | 
						|
    if (hdr_698->ctrl.dir_prm != PROTO_69845_D_P_SERVER_RESPONSE) {
 | 
						|
        reason = 1;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    apdu = (proto_69845_apdu_t *)apdu_desc->ptr;
 | 
						|
    if (apdu_desc->len < (sizeof(*apdu) + sizeof(*act_resp) +
 | 
						|
        sizeof(*act_resp_single))) {
 | 
						|
        reason = 2;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    if (apdu->type != PROTO_69845_S_APP_ACTION_RESP) {
 | 
						|
        reason = 3;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    act_resp = (proto_69845_app_action_resp_t*)apdu->data;
 | 
						|
    if (act_resp->data_type != PROTO_69845_APP_ACTION_NORMAL) {
 | 
						|
        reason = 4;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    act_resp_single = (proto_69845_app_action_resp_normal_t*)act_resp->data;
 | 
						|
    oad_value = iot_bytes_to_uint32((uint8_t*)&act_resp_single->result.omd.oi,
 | 
						|
        1);
 | 
						|
    if (PROTO_69845_APP_OAD_TRANSFILE_START != oad_value) {
 | 
						|
        reason = 5;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    if (act_resp_single->result.dar != PROTO_69845_APP_DAR_SUCCESS) {
 | 
						|
        reason = 6;
 | 
						|
        iot_bsrm_printf("%s result dar: %d , exit upgrade \n", __FUNCTION__,
 | 
						|
            g_pm_upgrade_info->state, act_resp_single->result.dar);
 | 
						|
        iot_bsrm_set_pm_upgrade_guard_code(0);
 | 
						|
        g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_IDLE;
 | 
						|
    } else {
 | 
						|
        g_pm_upgrade_info->block_index = 0;
 | 
						|
        g_pm_upgrade_info->resend_cnt = 0;
 | 
						|
        g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_DATA;
 | 
						|
    }
 | 
						|
    done = 1;
 | 
						|
out:
 | 
						|
    iot_bsrm_printf("%s state: %d, reason: %d, done: %d\n", __FUNCTION__,
 | 
						|
        g_pm_upgrade_info->state, reason, done);
 | 
						|
    return done;
 | 
						|
}
 | 
						|
 | 
						|
static uint8_t iot_bsrm_handle_pm_upgrade_check_exe(
 | 
						|
    proto_69845_frame_head_info_t *hdr_698, apdu_info_t *apdu_desc)
 | 
						|
{
 | 
						|
    uint8_t done = 0;
 | 
						|
    uint8_t reason = 0;
 | 
						|
    proto_69845_apdu_t *apdu;
 | 
						|
    proto_69845_app_action_resp_t *act_resp;
 | 
						|
    proto_69845_app_action_resp_normal_t *act_resp_single;
 | 
						|
    uint32_t oad_value;
 | 
						|
 | 
						|
    if (hdr_698->ctrl.dir_prm != PROTO_69845_D_P_SERVER_RESPONSE) {
 | 
						|
        reason = 1;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    apdu = (proto_69845_apdu_t *)apdu_desc->ptr;
 | 
						|
    if (apdu_desc->len < (sizeof(*apdu) + sizeof(*act_resp) +
 | 
						|
        sizeof(*act_resp_single))) {
 | 
						|
        reason = 2;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    if (apdu->type != PROTO_69845_S_APP_ACTION_RESP) {
 | 
						|
        reason = 3;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    act_resp = (proto_69845_app_action_resp_t*)apdu->data;
 | 
						|
    if (act_resp->data_type != PROTO_69845_APP_ACTION_NORMAL) {
 | 
						|
        reason = 4;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    act_resp_single = (proto_69845_app_action_resp_normal_t*)act_resp->data;
 | 
						|
    oad_value = iot_bytes_to_uint32((uint8_t *)&act_resp_single->result.omd.oi,
 | 
						|
        1);
 | 
						|
    if (PROTO_69845_APP_OAD_TRANSFILE_EXE != oad_value) {
 | 
						|
        reason = 5;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    if (act_resp_single->result.dar != PROTO_69845_APP_DAR_SUCCESS) {
 | 
						|
        reason = 6;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_IDLE;
 | 
						|
    iot_bsrm_set_pm_upgrade_guard_code(0);
 | 
						|
    iot_bsrm_printf("%s upgrade done\n", __FUNCTION__);
 | 
						|
    done = 1;
 | 
						|
out:
 | 
						|
    iot_bsrm_printf("%s state: %d, reason: %d, done: %d\n", __FUNCTION__,
 | 
						|
        g_pm_upgrade_info->state, reason, done);
 | 
						|
    return done;
 | 
						|
}
 | 
						|
 | 
						|
static uint8_t iot_bsrm_handle_pm_upgrade_transfile_status_rsp(
 | 
						|
    proto_69845_frame_head_info_t *hdr_698, apdu_info_t *apdu_desc)
 | 
						|
{
 | 
						|
    uint8_t done = 0;
 | 
						|
    uint8_t reason = 0;
 | 
						|
    uint32_t oad_value;
 | 
						|
    proto_69845_apdu_t *apdu;
 | 
						|
    proto_69845_app_result_normal_t *normal_resp;
 | 
						|
    proto_69845_apdu_get_rsp_t *get_rsp;
 | 
						|
    proto_69845_app_len_descript_t *desc_len;
 | 
						|
    uint8_t *app_data;
 | 
						|
    uint16_t app_len;
 | 
						|
    uint16_t i = 0;
 | 
						|
    uint16_t miss_index = 0;
 | 
						|
    uint32_t bitmap_len;
 | 
						|
    uint8_t *bitmap_ptr;
 | 
						|
 | 
						|
    if (hdr_698->ctrl.dir_prm != PROTO_69845_D_P_SERVER_RESPONSE) {
 | 
						|
        reason = 1;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    apdu = (proto_69845_apdu_t *)apdu_desc->ptr;
 | 
						|
    if (apdu_desc->len < (sizeof(*apdu) + sizeof(*get_rsp) +
 | 
						|
        sizeof(*normal_resp) + sizeof(*desc_len))) {
 | 
						|
        reason = 2;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    app_len = apdu_desc->len - (sizeof(*apdu) + sizeof(*get_rsp) +
 | 
						|
        sizeof(*normal_resp) + sizeof(*desc_len));
 | 
						|
    if (apdu->type != PROTO_69845_S_APP_GET_RESP) {
 | 
						|
        reason = 3;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    get_rsp = (proto_69845_apdu_get_rsp_t *)apdu->data;
 | 
						|
    if (get_rsp->type != PROTO_69845_APP_GET_NORMAL) {
 | 
						|
        reason = 4;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    normal_resp = (proto_69845_app_result_normal_t *)get_rsp->data;
 | 
						|
    if (normal_resp->get_result.result_type !=
 | 
						|
        PROTO_69845_APP_GET_RESULT_DATA) {
 | 
						|
        reason = 5;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    oad_value = iot_bytes_to_uint32((uint8_t *)&normal_resp->oad.oi, 1);
 | 
						|
    if (PROTO_69845_APP_OAD_TRANSFILE_STATUS != oad_value) {
 | 
						|
        reason = 6;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    app_data = normal_resp->get_result.result;
 | 
						|
    if (*app_data != PROTO_69845_APP_DATA_BIT_STRING) {
 | 
						|
        reason = 7;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    i++;
 | 
						|
    desc_len = (proto_69845_app_len_descript_t *)(app_data + i);
 | 
						|
    if (desc_len->mub_flag == 0) {
 | 
						|
        bitmap_len = *(app_data + i);
 | 
						|
        bitmap_ptr = app_data + i + 1;
 | 
						|
    } else if (desc_len->byte_num == 1) {
 | 
						|
        if (app_len < 1) {
 | 
						|
            reason = 8;
 | 
						|
            goto out;
 | 
						|
        }
 | 
						|
        i++;
 | 
						|
        bitmap_len = *(app_data + i);
 | 
						|
        bitmap_ptr = app_data + i + 1;
 | 
						|
        app_len--;
 | 
						|
    } else if (desc_len->byte_num == 2) {
 | 
						|
        if (app_len < 2) {
 | 
						|
            reason = 9;
 | 
						|
            goto out;
 | 
						|
        }
 | 
						|
        i++;
 | 
						|
        bitmap_len = iot_bytes_to_uint16(app_data + i, 1);
 | 
						|
        bitmap_ptr = app_data + i + 2;
 | 
						|
        app_len -= 2;
 | 
						|
    } else {
 | 
						|
        reason = 10;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    if (bitmap_len < g_pm_upgrade_info->bitmap_size) {
 | 
						|
        reason = 11;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    if (app_len < g_pm_upgrade_info->bitmap_size) {
 | 
						|
        reason = 12;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    os_mem_cpy(g_pm_upgrade_info->bitmap, bitmap_ptr,
 | 
						|
        g_pm_upgrade_info->bitmap_size);
 | 
						|
 | 
						|
    if ((g_pm_upgrade_info->resend_cnt++ > IOT_BSRM_PM_UPGRADE_RESEND_MAX_CNT)
 | 
						|
        || (iot_bsrm_pm_upgrade_get_block_to_resend(
 | 
						|
        g_pm_upgrade_info->block_index, &miss_index) != ERR_OK)) {
 | 
						|
        g_pm_upgrade_info->block_index = 0;
 | 
						|
        g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_EXE;
 | 
						|
    } else {
 | 
						|
        g_pm_upgrade_info->block_index = miss_index;
 | 
						|
        g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_DATA;
 | 
						|
    }
 | 
						|
    done = 1;
 | 
						|
out:
 | 
						|
    iot_bsrm_printf("%s state: %d, reason: %d, done: %d\n",
 | 
						|
        __FUNCTION__, g_pm_upgrade_info->state, reason, done);
 | 
						|
    return done;
 | 
						|
}
 | 
						|
 | 
						|
uint8_t iot_bsrm_handle_pm_upgrade_resp(iot_pkt_t *pkt)
 | 
						|
{
 | 
						|
    uint8_t *data;
 | 
						|
    uint32_t len = 0;
 | 
						|
    uint8_t reason = 0;
 | 
						|
    uint8_t done = 0;
 | 
						|
    apdu_info_t apdu_desc;
 | 
						|
    proto_69845_frame_head_info_t *hdr_698 = NULL;
 | 
						|
    uint16_t miss_index;
 | 
						|
 | 
						|
    IOT_ASSERT(g_pm_upgrade_info);
 | 
						|
 | 
						|
    if ((g_pm_upgrade_info->state == IOT_BSRM_PM_UPGRADE_STATE_IDLE) ||
 | 
						|
        (g_pm_upgrade_info->state ==
 | 
						|
        IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_DATA)) {
 | 
						|
        goto check_resp;
 | 
						|
    }
 | 
						|
 | 
						|
    if (NULL == pkt) {
 | 
						|
        reason = 1;
 | 
						|
        if (g_pm_upgrade_info->retry_cnt++ >
 | 
						|
            IOT_BSRM_PM_UPGRADE_RETRY_MAX_CNT) {
 | 
						|
            iot_bsrm_set_pm_upgrade_guard_code(0);
 | 
						|
            g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_IDLE;
 | 
						|
            reason = 2;
 | 
						|
        }
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    data = iot_pkt_data(pkt);
 | 
						|
    len = iot_pkt_data_len(pkt);
 | 
						|
    if (ERR_OK != proto_69845_parse(&data, &len, &hdr_698, &apdu_desc)) {
 | 
						|
        reason = 3;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
check_resp:
 | 
						|
    switch (g_pm_upgrade_info->state) {
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_CHECK_VER:
 | 
						|
    {
 | 
						|
        done = iot_bsrm_handle_pm_upgrade_check_ver(hdr_698, &apdu_desc);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_INFO:
 | 
						|
    {
 | 
						|
        done = iot_bsrm_handle_pm_upgrade_fileinfo_rsp(hdr_698, &apdu_desc);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_DATA:
 | 
						|
    {
 | 
						|
        if (iot_bsrm_pm_upgrade_get_block_to_resend(
 | 
						|
            g_pm_upgrade_info->block_index + 1, &miss_index) == ERR_OK) {
 | 
						|
            g_pm_upgrade_info->block_index = miss_index;
 | 
						|
        } else {
 | 
						|
            /* transfile done, query bitmap next */
 | 
						|
            g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_QUERY_INFO;
 | 
						|
        }
 | 
						|
        done = 1;
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_QUERY_INFO:
 | 
						|
    {
 | 
						|
        done = iot_bsrm_handle_pm_upgrade_transfile_status_rsp(hdr_698,
 | 
						|
            &apdu_desc);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_EXE:
 | 
						|
    {
 | 
						|
        done = iot_bsrm_handle_pm_upgrade_check_exe(hdr_698, &apdu_desc);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_IDLE:
 | 
						|
    {
 | 
						|
        done = 1;
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
out:
 | 
						|
    if (done) {
 | 
						|
        g_pm_upgrade_info->retry_cnt = 0;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_bsrm_printf("%s state: %d, reason: %d done: %d\n", __FUNCTION__,
 | 
						|
        g_pm_upgrade_info->state, reason, done);
 | 
						|
 | 
						|
    if (pkt) {
 | 
						|
        iot_pkt_free(pkt);
 | 
						|
    }
 | 
						|
 | 
						|
    return done;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_bsrm_handle_pm_upgrade_req(uint32_t *timeout)
 | 
						|
{
 | 
						|
    iot_pkt_t *pkt = NULL;
 | 
						|
    uint32_t ret = ERR_FAIL;
 | 
						|
 | 
						|
    if (!g_pm_upgrade_info) {
 | 
						|
        return ret;
 | 
						|
    }
 | 
						|
    *timeout = IOT_BSRM_PM_UPGRADE_DEFAULT_RSP_TIMEOUT;
 | 
						|
    switch (g_pm_upgrade_info->state) {
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_CHECK_VER:
 | 
						|
    {
 | 
						|
        pkt = iot_bsrm_pm_upgrade_build_69845_check_pkt();
 | 
						|
        if (NULL == pkt) {
 | 
						|
            ret = ERR_NOMEM;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_INFO:
 | 
						|
    {
 | 
						|
        pkt = iot_bsrm_pm_upgrade_build_69845_fileinfo_pkt();
 | 
						|
        if (NULL == pkt) {
 | 
						|
            ret = ERR_NOMEM;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_QUERY_INFO:
 | 
						|
    {
 | 
						|
        g_pm_upgrade_info->block_index = 0;
 | 
						|
        pkt = iot_bsrm_pm_upgrade_build_69845_query_pkt();
 | 
						|
        if (NULL == pkt) {
 | 
						|
            ret = ERR_NOMEM;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_EXE:
 | 
						|
    {
 | 
						|
        pkt = iot_bsrm_pm_upgrade_build_69845_exe_pkt();
 | 
						|
        if (NULL == pkt) {
 | 
						|
            ret = ERR_NOMEM;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_TRANSFILE_DATA:
 | 
						|
    {
 | 
						|
        *timeout = IOT_BSRM_PM_UPGRADE_BROADCAST_TIMEOUT;
 | 
						|
        pkt = iot_bsrm_pm_upgrade_build_69845_transfile_data_pkt();
 | 
						|
        if (NULL == pkt) {
 | 
						|
            ret = ERR_NOMEM;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_BSRM_PM_UPGRADE_STATE_IDLE:
 | 
						|
    {
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
 | 
						|
    if (pkt) {
 | 
						|
        ret = ERR_OK;
 | 
						|
        iot_bsrm_uart_send(pkt);
 | 
						|
    }
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_bsrm_pm_upgrade_init()
 | 
						|
{
 | 
						|
    uint32_t ret = ERR_OK;
 | 
						|
    uint32_t size = iot_bsrm_pm_get_local_img_size();
 | 
						|
    uint32_t block_cnt;
 | 
						|
 | 
						|
    if (iot_bsrm_get_pm_upgrade_guard_code() !=
 | 
						|
        IOT_BSRM_PM_UPGRADE_GUARD_CODE) {
 | 
						|
        iot_bsrm_printf("%s invalid upgrade flag\n", __FUNCTION__);
 | 
						|
        return ret;
 | 
						|
    }
 | 
						|
    if (!size) {
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    if (g_pm_upgrade_info) {
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    g_pm_upgrade_info = os_mem_malloc(IOT_BSRM_MID, sizeof(*g_pm_upgrade_info));
 | 
						|
    if (g_pm_upgrade_info == NULL) {
 | 
						|
        ret = ERR_NOMEM;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    block_cnt = (size + IOT_BSRM_PM_UPGRADE_BLOCK_SIZE - 1) /
 | 
						|
        IOT_BSRM_PM_UPGRADE_BLOCK_SIZE;
 | 
						|
    g_pm_upgrade_info->bitmap_size = (uint16_t)((block_cnt + 8 - 1) / 8);
 | 
						|
    g_pm_upgrade_info->block_cnt = block_cnt;
 | 
						|
    g_pm_upgrade_info->bitmap = os_mem_malloc(IOT_BSRM_MID,
 | 
						|
        g_pm_upgrade_info->bitmap_size);
 | 
						|
    if (g_pm_upgrade_info->bitmap == NULL) {
 | 
						|
        ret = ERR_NOMEM;
 | 
						|
        goto bitmap_fail;
 | 
						|
    }
 | 
						|
    os_mem_set(g_pm_upgrade_info->bitmap, 0, g_pm_upgrade_info->bitmap_size);
 | 
						|
    g_pm_upgrade_info->state = IOT_BSRM_PM_UPGRADE_STATE_CHECK_VER;
 | 
						|
    g_pm_upgrade_info->retry_cnt = 0;
 | 
						|
    g_pm_upgrade_info->block_index = 0;
 | 
						|
    g_pm_upgrade_info->resend_cnt = 0;
 | 
						|
    goto out;
 | 
						|
 | 
						|
bitmap_fail:
 | 
						|
    os_mem_free(g_pm_upgrade_info);
 | 
						|
    g_pm_upgrade_info = NULL;
 | 
						|
out:
 | 
						|
    if (ERR_OK == ret) {
 | 
						|
        iot_bsrm_printf("%s success, size: %lu, block cnt: %d\n", __FUNCTION__,
 | 
						|
            size, g_pm_upgrade_info->block_cnt);
 | 
						|
    } else {
 | 
						|
        iot_bsrm_printf("%s fail\n", __FUNCTION__);
 | 
						|
    }
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
void iot_bsrm_pm_upgrade_deinit()
 | 
						|
{
 | 
						|
    if (!g_pm_upgrade_info) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    if (g_pm_upgrade_info->bitmap) {
 | 
						|
        os_mem_free(g_pm_upgrade_info->bitmap);
 | 
						|
        g_pm_upgrade_info->bitmap = NULL;
 | 
						|
    }
 | 
						|
    os_mem_free(g_pm_upgrade_info);
 | 
						|
    g_pm_upgrade_info = NULL;
 | 
						|
}
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
uint8_t iot_bsrm_handle_pm_upgrade_resp(iot_pkt_t *pkt)
 | 
						|
{
 | 
						|
    uint8_t done  = 1;
 | 
						|
 | 
						|
    if (pkt) {
 | 
						|
        iot_pkt_free(pkt);
 | 
						|
    }
 | 
						|
    return done;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_bsrm_handle_pm_upgrade_req(uint32_t *timeout)
 | 
						|
{
 | 
						|
    (void)timeout;
 | 
						|
    return ERR_FAIL;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_bsrm_pm_upgrade_init()
 | 
						|
{
 | 
						|
    if (iot_bsrm_get_pm_upgrade_guard_code() ==
 | 
						|
        IOT_BSRM_PM_UPGRADE_GUARD_CODE) {
 | 
						|
        iot_bsrm_set_pm_upgrade_guard_code(0);
 | 
						|
        iot_bsrm_printf("%s support pm upgrade, clean pm upgrade flag\n",
 | 
						|
            __FUNCTION__);
 | 
						|
    }
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
void iot_bsrm_pm_upgrade_deinit()
 | 
						|
{
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#endif /* IOT_BSRM_PM_UPGRADE_ENABLE */
 | 
						|
 |