/** * * \file * * \brief WINC OTA Upgrade API Interface. * * Copyright (c) 2016-2017 Atmel Corporation. All rights reserved. * * \asf_license_start * * \page License * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * \asf_license_stop * */ #ifndef __M2M_OTA_H__ #define __M2M_OTA_H__ /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* INCLUDES *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ #include "common/include/nm_common.h" #include "driver/include/m2m_types.h" #include "driver/source/nmdrv.h" /**@addtogroup WlanEnums DataTypes * @ingroup m2m_wifi */ /* @{ */ /*! @typedef void (*tpfOtaNotifCb) (tstrOtaUpdateInfo *); @brief A callback to get notification about a potential OTA update. @param[in] pstrOtaUpdateInfo A structure to provide notification payload. @sa tstrOtaUpdateInfo @warning The notification is not supported (Not implemented yet) */ typedef void (*tpfOtaNotifCb) (tstrOtaUpdateInfo * pstrOtaUpdateInfo); /*! @typedef void (*tpfOtaUpdateCb) (uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus); @brief A callback to get OTA status update, the callback provide the status type and its status. The OTA callback provides the download status, the switch to the downloaded firmware status and roll-back status. @param[in] u8OtaUpdateStatusType Possible values are listed in tenuOtaUpdateStatusType. @param[in] u8OtaUpdateStatus Possible values are listed as enumerated by @ref tenuOtaUpdateStatus. @see tenuOtaUpdateStatusType tenuOtaUpdateStatus */ typedef void (*tpfOtaUpdateCb) (uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus); /**@}*/ /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* FUNCTION PROTOTYPES *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ #ifdef __cplusplus extern "C" { #endif /** @defgroup OtaInitFn m2m_ota_init * @ingroup WLANAPI * Synchronous initialization function for the OTA layer by registering the update callback. * The notification callback is not supported at the current version. Calling this API is a * MUST for all the OTA API's. */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb,tpfOtaNotifCb pfOtaNotifCb) @param [in] pfOtaUpdateCb OTA Update callback function @param [in] pfOtaNotifCb OTA notify callback function @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. */ NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb,tpfOtaNotifCb pfOtaNotifCb); /**@}*/ /** @defgroup OtaNotifStFn m2m_ota_notif_set_url * @ingroup WLANAPI * Set the OTA notification server URL, the functions need to be called before any check for update */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); @param [in] u8Url Set the OTA notification server URL, the functions need to be called before any check for update. @warning Calling m2m_ota_init is required Notification Server is not supported in the current version (function is not implemented) @see m2m_ota_init @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. */ NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); /**@}*/ /** @defgroup OtaNotifCheckFn m2m_ota_notif_check_for_update * @ingroup WLANAPI * Synchronous function to check for the OTA update using the Notification Server * URL. Function is not implemented (not supported at the current version) * */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_notif_check_for_update(void); @warning Function is not implemented (not supported at the current version) @sa m2m_ota_init m2m_ota_notif_set_url @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. */ NMI_API sint8 m2m_ota_notif_check_for_update(void); /**@}*/ /** @defgroup OtaSched m2m_ota_notif_sched * @ingroup WLANAPI * Schedule OTA notification Server check for update request after specific number of days */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); @param [in] u32Period Period in days @sa m2m_ota_init m2m_ota_notif_check_for_update m2m_ota_notif_set_url @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. */ NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); /**@}*/ /** @defgroup OtaStartUpdatefn m2m_ota_start_update * @ingroup WLANAPI * Request OTA start update using the downloaded URL, the OTA module will download the OTA image and ensure integrity of the image, * and update the validity of the image in control structure. Switching to that image requires calling @ref m2m_ota_switch_firmware API. * As a prerequisite @ref m2m_ota_init should be called before using @ref m2m_ota_start(). */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); @param [in] u8DownloadUrl The download firmware URL, you get it from device info according to the application server @warning Calling this API does not guarantee OTA WINC image update, It depends on the connection with the download server and the validity of the image. If the API response is failure this may invalidate the roll-back image if it was previously valid, since the WINC does not have any internal memory except the flash roll-back image location to validate the downloaded image from @see m2m_ota_init tpfOtaUpdateCb @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. \section Example The example shows an example of how the OTA image update is carried out. @code static void OtaUpdateCb(uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus) { if(u8OtaUpdateStatusType == DL_STATUS) { if(u8OtaUpdateStatus == OTA_STATUS_SUCSESS) { //switch to the upgraded firmware m2m_ota_switch_firmware(); } } else if(u8OtaUpdateStatusType == SW_STATUS) { if(u8OtaUpdateStatus == OTA_STATUS_SUCSESS) { M2M_INFO("Now OTA successfully done"); //start the host SW upgrade then system reset is required (Reinitialize the driver) } } } void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) { case M2M_WIFI_REQ_DHCP_CONF: { //after successfully connection, start the over air upgrade m2m_ota_start_update(OTA_URL); } break; default: break; } int main (void) { tstrWifiInitParam param; tstr1xAuthCredentials gstrCred1x = AUTH_CREDENTIALS; nm_bsp_init(); m2m_memset((uint8*)¶m, 0, sizeof(param)); param.pfAppWifiCb = wifi_event_cb; //Initialize the WINC Driver ret = m2m_wifi_init(¶m); if (M2M_SUCCESS != ret) { M2M_ERR("Driver Init Failed <%d>\n",ret); while(1); } //Initialize the OTA module m2m_ota_init(OtaUpdateCb,NULL); //connect to AP that provide connection to the OTA server m2m_wifi_default_connect(); while(1) { //Handle the app state machine plus the WINC event handler while(m2m_wifi_handle_events(NULL) != M2M_SUCCESS) { } } } @endcode */ NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); /**@}*/ /** @defgroup OtaStartUpdatefn m2m_ota_start_update_crt * @ingroup WLANAPI * Request OTA start for cortus application image using the downloaded URL, the OTA module will download the OTA image and ensure integrity of the image, * and update the validity of the image in control structure. Switching to that image requires calling @ref m2m_ota_switch_crt API. * As a prerequisite @ref m2m_ota_init should be called before using @ref m2m_ota_start_update_crt(). */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_start_update_crt(uint8 * u8DownloadUrl); @param [in] u8DownloadUrl The cortus application image url. @warning Calling this API does not guarantee cortus application image update, It depends on the connection with the download server and the validity of the image. If the API response is failure this may invalidate the roll-back image if it was previously valid, since the WINC does not have any internal memory except the flash roll-back image location to validate the downloaded image from @see m2m_ota_init tpfOtaUpdateCb @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. */ NMI_API sint8 m2m_ota_start_update_crt(uint8 * u8DownloadUrl); /**@}*/ /** @defgroup OtaRollbackfn m2m_ota_rollback * @ingroup WLANAPI Request OTA Roll-back to the old (other) WINC image, the WINC firmware will check the validation of the Roll-back image and switch to it if it is valid. If the API response is success, system restart is required (re-initialize the driver with hardware rest) update the host driver version may be required if it is did not match the minimum version supported by the WINC firmware. */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_rollback(void); @sa m2m_ota_init m2m_ota_start_update @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. */ NMI_API sint8 m2m_ota_rollback(void); /**@}*/ /** @defgroup OtaRollbackfn m2m_ota_rollback_crt * @ingroup WLANAPI Request Cortus application OTA Roll-back to the old (other) cortus application image, the WINC firmware will check the validation of the Roll-back image and switch to it if it is valid. If the API response is success, system restart is required (re-initialize the driver with hardware rest) update the host driver version may be required. */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_rollback_crt(void); @sa m2m_ota_init m2m_ota_start_update_crt @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. */ NMI_API sint8 m2m_ota_rollback_crt(void); /**@}*/ /** @defgroup OtaAbortfn m2m_ota_abort * @ingroup WLANAPI Request abort of current OTA download. The WINC firmware will terminate the OTA download if one is in progress. If no download is in progress, the API will respond with failure. */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_abort(void); @return The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. */ NMI_API sint8 m2m_ota_abort(void); /**@}*/ /**@}*/ /** @defgroup OtaSwitchFirmware m2m_ota_switch_firmware * @ingroup WLANAPI * Switch to the upgraded Firmware, that API will update the control structure working image to the upgraded image take effect will be on the next system restart */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_switch_firmware(void); @warning It is important to note that if the API succeeds, system restart is required (re-initializing the driver with hardware reset) updating the host driver version may be required if it does not match the minimum driver version supported by the WINC's firmware. @sa m2m_ota_init m2m_ota_start_update @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. */ NMI_API sint8 m2m_ota_switch_firmware(void); /**@}*/ /**@}*/ /** @defgroup OtaSwitchFirmware m2m_ota_switch_crt * @ingroup WLANAPI * Switch to the upgraded cortus application, that API will update the control structure working image to the upgraded image take effect will be on the next system restart */ /**@{*/ /*! @fn \ NMI_API sint8 m2m_ota_switch_firmware(void); @warning It is important to note that if the API succeeds, system restart is required (re-initializing the driver with hardware reset) updating the host driver version may be required if it does not match the minimum driver version supported by the WINC's firmware. @sa m2m_ota_init m2m_ota_start_update_crt @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. */ NMI_API sint8 m2m_ota_switch_crt(void); /*! @fn \ NMI_API sint8 m2m_ota_get_firmware_version(void); @brief Get the OTA Firmware version. @return The function SHALL return 0 for success and a negative value otherwise. */ NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); /**@}*/ NMI_API sint8 m2m_ota_test(void); #ifdef __cplusplus } #endif #endif /* __M2M_OTA_H__ */