190 lines
6.3 KiB
C
190 lines
6.3 KiB
C
/*******************************************************************************
|
|
WINC3400 IoT OTA Interface.
|
|
|
|
File Name:
|
|
m2m_ota.c
|
|
|
|
Summary:
|
|
WINC3400 IoT OTA Interface
|
|
|
|
Description:
|
|
WINC3400 IoT OTA Interface
|
|
*******************************************************************************/
|
|
|
|
//DOM-IGNORE-BEGIN
|
|
/*******************************************************************************
|
|
* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries.
|
|
*
|
|
* Subject to your compliance with these terms, you may use Microchip software
|
|
* and any derivatives exclusively with Microchip products. It is your
|
|
* responsibility to comply with third party license terms applicable to your
|
|
* use of third party software (including open source software) that may
|
|
* accompany Microchip software.
|
|
*
|
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
|
|
* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
|
|
* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
|
|
* PARTICULAR PURPOSE.
|
|
*
|
|
* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
|
* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
|
|
* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
|
|
* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
|
|
* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
|
|
* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
|
*******************************************************************************/
|
|
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
INCLUDES
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
#include "nm_common.h"
|
|
#include "m2m_types.h"
|
|
#include "m2m_ota.h"
|
|
#include "m2m_wifi.h"
|
|
#include "m2m_hif.h"
|
|
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
MACROS
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
DATA TYPES
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
static tpfOtaUpdateCb gpfOtaUpdateCb = NULL;
|
|
|
|
/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
|
|
FUNCTION PROTOTYPES
|
|
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
|
|
|
|
/**
|
|
@fn m2m_ota_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr)
|
|
@brief Internal OTA call back function.
|
|
@param[in] u8OpCode
|
|
HIF Opcode type.
|
|
@param[in] u16DataSize
|
|
HIF data length.
|
|
@param[in] u32Addr
|
|
HIF address.
|
|
*/
|
|
static void m2m_ota_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr)
|
|
{
|
|
int8_t s8Ret = M2M_SUCCESS;
|
|
if (u8OpCode == M2M_OTA_RESP_UPDATE_STATUS)
|
|
{
|
|
tstrOtaUpdateStatusResp strOtaUpdateStatusResp;
|
|
memset((uint8_t*)&strOtaUpdateStatusResp, 0, sizeof(tstrOtaUpdateStatusResp));
|
|
s8Ret = hif_receive(u32Addr, (uint8_t*)&strOtaUpdateStatusResp, sizeof(tstrOtaUpdateStatusResp), 0);
|
|
if(s8Ret == M2M_SUCCESS)
|
|
{
|
|
if(gpfOtaUpdateCb)
|
|
gpfOtaUpdateCb(strOtaUpdateStatusResp.u8OtaUpdateStatusType, strOtaUpdateStatusResp.u8OtaUpdateStatus);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
M2M_ERR("Invalid OTA resp %d ?\r\n", u8OpCode);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
@fn int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb)
|
|
@brief Initialize the OTA layer.
|
|
@param[in] pfOtaUpdateCb
|
|
OTA Update callback function.
|
|
@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise.
|
|
*/
|
|
int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb)
|
|
{
|
|
int8_t ret = M2M_SUCCESS;
|
|
|
|
if (pfOtaUpdateCb) {
|
|
gpfOtaUpdateCb = pfOtaUpdateCb;
|
|
} else {
|
|
M2M_ERR("Invalid OTA update callback\r\n");
|
|
}
|
|
|
|
hif_register_cb(M2M_REQ_GROUP_OTA, m2m_ota_cb);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/*!
|
|
@fn int8_t m2m_ota_start_update(unsigned char * pcDownloadUrl)
|
|
@brief Request OTA start update using the downloaded URL.
|
|
@param[in] pcDownloadUrl
|
|
The download firmware URL, you get it from device info.
|
|
@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise.
|
|
*/
|
|
int8_t m2m_ota_start_update(unsigned char *pcDownloadUrl)
|
|
{
|
|
int8_t ret = M2M_SUCCESS;
|
|
uint16_t u16DurlSize = strlen((char*)pcDownloadUrl) + 1;
|
|
|
|
ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_START_UPDATE, pcDownloadUrl, u16DurlSize, NULL, 0, 0);
|
|
return ret;
|
|
}
|
|
|
|
/*!
|
|
@fn int8_t m2m_ota_rollback(void)
|
|
@brief Request OTA Rollback image.
|
|
@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise.
|
|
*/
|
|
int8_t m2m_ota_rollback(void)
|
|
{
|
|
int8_t ret = M2M_SUCCESS;
|
|
tstrM2mRev strRev;
|
|
|
|
ret = m2m_ota_get_firmware_version(&strRev);
|
|
if(ret == M2M_SUCCESS)
|
|
{
|
|
if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE)
|
|
{
|
|
ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ROLLBACK, NULL, 0, NULL, 0, 0);
|
|
}
|
|
else
|
|
{
|
|
ret = M2M_ERR_FAIL;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/*!
|
|
@fn int8_t m2m_ota_abort(void)
|
|
@brief Request OTA Abort.
|
|
@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise.
|
|
*/
|
|
int8_t m2m_ota_abort(void)
|
|
{
|
|
int8_t ret = M2M_SUCCESS;
|
|
ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ABORT, NULL, 0, NULL, 0, 0);
|
|
return ret;
|
|
}
|
|
|
|
/*!
|
|
@fn int8_t m2m_ota_switch_firmware(void)
|
|
@brief Switch to the upgraded Firmware.
|
|
@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise.
|
|
*/
|
|
int8_t m2m_ota_switch_firmware(void)
|
|
{
|
|
int8_t ret = M2M_SUCCESS;
|
|
tstrM2mRev strRev;
|
|
|
|
ret = m2m_ota_get_firmware_version(&strRev);
|
|
if(ret == M2M_SUCCESS)
|
|
{
|
|
if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE)
|
|
{
|
|
ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_SWITCH_FIRMWARE, NULL, 0, NULL, 0, 0);
|
|
}
|
|
else
|
|
{
|
|
ret = M2M_ERR_FAIL;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
//DOM-IGNORE-END
|