/******************************************************************************* 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