pinebuds/services/nv_section/userdata_section/nvrecord_ota.c

178 lines
4.9 KiB
C

/**
* @file nvrecord_ota.c
* @author BES AI team
* @version 0.1
* @date 2020-04-21
*
* @copyright Copyright (c) 2015-2020 BES Technic.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*/
/*****************************header include********************************/
#include "string.h"
#include "nv_section_dbg.h"
#include "nvrecord_ota.h"
#include "ota_common.h"
#ifdef BISTO_ENABLED
#include "nvrecord_gsound.h"
#endif
/*********************external function declearation************************/
/************************private macro defination***************************/
/************************private type defination****************************/
/**********************private function declearation************************/
/************************private variable defination************************/
static NV_OTA_INFO_T *nvrecord_ota_p = NULL;
/****************************function defination****************************/
void nv_record_ota_init(void)
{
if (NULL == nvrecord_ota_p)
{
nvrecord_ota_p = nvrecord_extension_p->ota_info;
}
}
void nv_record_ota_get_ptr(void **ptr)
{
*ptr = nvrecord_ota_p;
}
void nv_record_ota_update_breakpoint(uint8_t user,
uint8_t deviceIndex,
uint32_t otaOffset)
{
NV_OTA_INFO_T *pOta = &nvrecord_ota_p[deviceIndex];
bool update = false;
ASSERT(OTA_STAGE_ONGOING == pOta->otaStatus,
"try to update break point when OTA not in progress");
uint32_t lock = nv_record_pre_write_operation();
if (user != pOta->user)
{
LOG_I("OTA user update:%d->%d", pOta->user, user);
pOta->user = user;
update = true;
}
if (otaOffset != pOta->breakPoint)
{
LOG_I("OTA break point update:%x->%x", pOta->breakPoint, otaOffset);
pOta->breakPoint = otaOffset;
update = true;
}
nv_record_post_write_operation(lock);
if (update)
{
nv_record_extension_update();
nv_record_execute_async_flush();
}
}
bool nv_record_ota_update_info(uint8_t user,
uint8_t deviceIndex,
uint8_t status,
uint32_t totalImageSize,
const char *session)
{
NV_OTA_INFO_T *pOta = &nvrecord_ota_p[deviceIndex];
LOG_I("%s", __func__);
LOG_I("ota_status:%d->%d, user:%d, device_index:%d, imageSize:%d, version:%s",
pOta->otaStatus,
status,
user,
deviceIndex,
totalImageSize,
session);
bool ret = true;
bool update = false;
#ifdef GSOUND_HOTWORD_ENABLED
if ((OTA_USER_COLORFUL == user) &&
(OTA_DEVICE_HOTWORD == deviceIndex))
{
ret = nv_record_gsound_rec_is_model_insert_allowed(session);
}
#endif
if (ret)
{
uint32_t lock = nv_record_pre_write_operation();
if (!memcmp(pOta->version, session, strlen(session) + 1))
{
memset(pOta->version,
0,
ARRAY_SIZE(pOta->version));
update = true;
}
if (pOta->otaStatus != status)
{
pOta->otaStatus = status;
update = true;
LOG_I("update device %d ota status to %d",
deviceIndex,
pOta->otaStatus);
}
if (OTA_STAGE_IDLE == status)
{
if (0 != pOta->breakPoint)
{
pOta->breakPoint = 0;
update = true;
}
}
else if (OTA_STAGE_ONGOING == status)
{
ASSERT(totalImageSize, "Received total image size is 0.");
ASSERT(session, "Received session pointer is NULL.");
if (pOta->imageSize != totalImageSize)
{
pOta->imageSize = totalImageSize;
update = true;
}
}
else if (OTA_STAGE_DONE == status)
{
ASSERT(totalImageSize == pOta->imageSize,
"total image size changed:%d->%d.", pOta->imageSize, totalImageSize);
if (totalImageSize != pOta->breakPoint)
{
pOta->breakPoint = totalImageSize;
update = true;
}
}
nv_record_post_write_operation(lock);
if (update)
{
LOG_I("will update info into flash.");
nv_record_extension_update();
nv_record_execute_async_flush();
}
}
return ret;
}