From 43e02b24ea09e99525e3dee71681943437e2e1f8 Mon Sep 17 00:00:00 2001 From: jfmartel Date: Wed, 29 Dec 2021 15:21:52 -0500 Subject: [PATCH] =?UTF-8?q?Driver=20Atwin=201.4.2=20compile.=20=20Reste=20?= =?UTF-8?q?=C3=A0=20faire=20le=20low=20level?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChaletLora.X/Source/WiFiCtrl.c | 20 +- ChaletLora.X/Source/WiFiCtrl.h | 63 +- ChaletLora.X/Source/main.c | 3 + .../Source/winc3400_142/bsp/include/nm_bsp.h | 85 + .../winc3400_142/common/include/nm_common.h | 172 + .../winc3400_142/common/include/nm_debug.h | 60 + .../winc3400_142/common/source/nm_common.c | 100 + .../winc3400_142/driver/include/ecc_types.h | 300 + .../winc3400_142/driver/include/m2m_flash.h | 188 + .../winc3400_142/driver/include/m2m_hif.h | 243 + .../winc3400_142/driver/include/m2m_ota.h | 370 + .../winc3400_142/driver/include/m2m_periph.h | 307 + .../winc3400_142/driver/include/m2m_ssl.h | 255 + .../winc3400_142/driver/include/m2m_types.h | 2745 +++ .../winc3400_142/driver/include/m2m_wifi.h | 4147 ++++ .../winc3400_142/driver/include/nmasic.h | 148 + .../winc3400_142/driver/include/nmbus.h | 137 + .../winc3400_142/driver/include/nmdrv.h | 176 + .../winc3400_142/driver/include/nmspi.h | 137 + .../winc3400_142/driver/source/m2m_flash.c | 354 + .../winc3400_142/driver/source/m2m_hif.c | 857 + .../winc3400_142/driver/source/m2m_ota.c | 190 + .../winc3400_142/driver/source/m2m_periph.c | 129 + .../winc3400_142/driver/source/m2m_ssl.c | 495 + .../winc3400_142/driver/source/m2m_wifi.c | 2061 ++ .../winc3400_142/driver/source/nmasic.c | 706 + .../Source/winc3400_142/driver/source/nmbus.c | 248 + .../Source/winc3400_142/driver/source/nmdrv.c | 410 + .../Source/winc3400_142/driver/source/nmspi.c | 960 + .../socket/include/m2m_socket_host_if.h | 347 + .../winc3400_142/socket/include/netinet_in.h | 95 + .../winc3400_142/socket/include/socket.h | 2074 ++ .../winc3400_142/socket/source/inet_addr.c | 119 + .../winc3400_142/socket/source/inet_ntop.c | 104 + .../winc3400_142/socket/source/socket.c | 1261 ++ .../spi_flash/include/spi_flash.h | 192 + .../spi_flash/include/spi_flash_map.h | 264 + .../winc3400_142/spi_flash/source/spi_flash.c | 599 + .../debug/ChaletLora.X.debug.elf | Bin 986201 -> 0 bytes .../debug/ChaletLora.X.debug.map | 5374 ----- .../production/ChaletLora.X.production.elf | Bin 898029 -> 977448 bytes .../production/ChaletLora.X.production.hex | 18034 ++++++++-------- .../production/ChaletLora.X.production.map | 4930 +++-- .../Makefile-ChaletDuinoV2_795F512H_.mk | 606 +- .../nbproject/Makefile-genesis.properties | 4 +- ChaletLora.X/nbproject/configurations.xml | 189 +- ChaletLora.X/nbproject/private/private.xml | 12 +- 47 files changed, 33181 insertions(+), 17089 deletions(-) create mode 100644 ChaletLora.X/Source/winc3400_142/bsp/include/nm_bsp.h create mode 100644 ChaletLora.X/Source/winc3400_142/common/include/nm_common.h create mode 100644 ChaletLora.X/Source/winc3400_142/common/include/nm_debug.h create mode 100644 ChaletLora.X/Source/winc3400_142/common/source/nm_common.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/ecc_types.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/m2m_flash.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/m2m_hif.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/m2m_ota.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/m2m_periph.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/m2m_ssl.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/m2m_types.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/m2m_wifi.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/nmasic.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/nmbus.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/nmdrv.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/include/nmspi.h create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/m2m_flash.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/m2m_hif.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/m2m_ota.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/m2m_periph.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/m2m_ssl.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/m2m_wifi.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/nmasic.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/nmbus.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/nmdrv.c create mode 100644 ChaletLora.X/Source/winc3400_142/driver/source/nmspi.c create mode 100644 ChaletLora.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h create mode 100644 ChaletLora.X/Source/winc3400_142/socket/include/netinet_in.h create mode 100644 ChaletLora.X/Source/winc3400_142/socket/include/socket.h create mode 100644 ChaletLora.X/Source/winc3400_142/socket/source/inet_addr.c create mode 100644 ChaletLora.X/Source/winc3400_142/socket/source/inet_ntop.c create mode 100644 ChaletLora.X/Source/winc3400_142/socket/source/socket.c create mode 100644 ChaletLora.X/Source/winc3400_142/spi_flash/include/spi_flash.h create mode 100644 ChaletLora.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h create mode 100644 ChaletLora.X/Source/winc3400_142/spi_flash/source/spi_flash.c delete mode 100644 ChaletLora.X/dist/ChaletDuinoV2_795F512H_/debug/ChaletLora.X.debug.elf delete mode 100644 ChaletLora.X/dist/ChaletDuinoV2_795F512H_/debug/ChaletLora.X.debug.map diff --git a/ChaletLora.X/Source/WiFiCtrl.c b/ChaletLora.X/Source/WiFiCtrl.c index 61e1211..33086b1 100644 --- a/ChaletLora.X/Source/WiFiCtrl.c +++ b/ChaletLora.X/Source/WiFiCtrl.c @@ -1,6 +1,6 @@ #include "WiFiCtrl.h" #include "string.h" -#include "driver/source/nmasic.h" +#include "driver/include/nmasic.h" #include //#include "socket/include/socket.h" #include "define.h" @@ -155,7 +155,7 @@ static void socket_cb(SOCKET sock, uint8 u8Msg, void *pvMsg) SendTerminalData("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n",strlen("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n")); // SendSyslogData("Terminal client connected\n",strlen("Terminal client connected\n")); printf("Terminal client connected\n"); - // m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1); } else if(sock == SyslogServerSocket) { @@ -236,7 +236,7 @@ static void socket_cb(SOCKET sock, uint8 u8Msg, void *pvMsg) TerminalSocket = -1; // SendSyslogData("Terminal client disconnected\n",strlen("Terminal client disconnected\n")); printf("Terminal client disconnected\n"); - // m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0); } else if(sock == SyslogSocket) { @@ -277,7 +277,7 @@ static void set_dev_name_to_mac(uint8 *name, uint8 *mac_addr) /* Name must be in the format WINC1500_00:00 */ uint16 len; - len = m2m_strlen(name); +// len = m2m_strlen(name); if (len >= 5) { name[len - 1] = MAIN_HEX2ASCII((mac_addr[5] >> 0) & 0x0f); name[len - 2] = MAIN_HEX2ASCII((mac_addr[5] >> 4) & 0x0f); @@ -304,7 +304,7 @@ static void wifi_cb(uint8 u8MsgType, void *pvMsg) printf("Wi-Fi connected\r\n"); #ifndef USE_STATIC_IP - m2m_wifi_request_dhcp_client(); +// m2m_wifi_request_dhcp_client(); #else m2m_wifi_set_static_ip(&mModuleIPConfig); gbConnectedWifi = true; @@ -326,7 +326,7 @@ static void wifi_cb(uint8 u8MsgType, void *pvMsg) case M2M_WIFI_REQ_DHCP_CONF: { - mCurIPAddress = *(uin32*)pvMsg; +// mCurIPAddress = *(uin32*)pvMsg; // unsigned char ip1,ip2,ip3,ip4; // ip1 = IPV4_BYTE(pu8IPAddress,0); @@ -432,11 +432,11 @@ int InitWiFi() mModuleIPConfig.u32SubnetMask = IP_TO_U32(SUBNET_MASK_1,SUBNET_MASK_2,SUBNET_MASK_3,SUBNET_MASK_4); /* Initialize the BSP. */ - nm_bsp_init(); +// nm_bsp_init(); /* Initialize Wi-Fi parameters structure. */ memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); /* Initialize Wi-Fi driver with data and status callbacks. */ - param.pfAppWifiCb = wifi_cb; + param.pfAppWifiCb = (void*) &wifi_cb; ret = m2m_wifi_init(¶m); if (M2M_SUCCESS != ret) { @@ -466,7 +466,7 @@ int InitWiFi() //Use the MAC to define the SSID of the module set_dev_name_to_mac((uint8 *)gstrM2MAPConfig.au8SSID, gau8MacAddr); - m2m_wifi_set_device_name((uint8 *)gacDeviceName, (uint8)m2m_strlen((uint8 *)gacDeviceName)); +// m2m_wifi_set_device_name((uint8 *)gacDeviceName, (uint8)m2m_strlen((uint8 *)gacDeviceName)); #ifdef USE_STATIC_IP //Use static ip --> disable dhcp client before connecting @@ -581,7 +581,7 @@ void TickWiFi() // if(IsTimerExpired(WIFI_TICK_TIMER)) // { - m2m_wifi_handle_events(NULL); + m2m_wifi_handle_events(); // TimerStart(WIFI_TICK_TIMER,1); // } diff --git a/ChaletLora.X/Source/WiFiCtrl.h b/ChaletLora.X/Source/WiFiCtrl.h index 3a124f8..354b80b 100644 --- a/ChaletLora.X/Source/WiFiCtrl.h +++ b/ChaletLora.X/Source/WiFiCtrl.h @@ -11,6 +11,67 @@ #include "driver/include/m2m_wifi.h" #include "socket/include/socket.h" +/*! +* Used for code portability. +*/ + +/*! + * @typedef void (*tpfNmBspIsr) (void); + * @brief Pointer to function.\n + * Used as a data type of ISR function registered by \ref nm_bsp_register_isr + * @return None + */ +typedef void (*tpfNmBspIsr)(void); + + /*! + * @ingroup DataTypes + * @typedef unsigned char uint8; + * @brief Range of values between 0 to 255 + */ +typedef unsigned char uint8; + + /*! + * @ingroup DataTypes + * @typedef unsigned short uint16; + * @brief Range of values between 0 to 65535 + */ +typedef unsigned short uint16; + + /*! + * @ingroup Data Types + * @typedef unsigned long uint32; + * @brief Range of values between 0 to 4294967295 + */ +typedef unsigned long uint32; + + + /*! + * @ingroup Data Types + * @typedef signed char sint8; + * @brief Range of values between -128 to 127 + */ +typedef signed char sint8; + + /*! + * @ingroup DataTypes + * @typedef signed short sint16; + * @brief Range of values between -32768 to 32767 + */ +typedef signed short sint16; + + /*! + * @ingroup DataTypes + * @typedef signed long sint32; + * @brief Range of values between -2147483648 to 2147483647 + */ + +typedef signed long sint32; + //@} + + + + + int InitWiFi(); void TickWiFi(); @@ -188,7 +249,7 @@ static tstrM2MAPConfig gstrM2MAPConfig = {MAIN_M2M_SSID, MAIN_M2M_AP_SSID_MODE, MAIN_M2M_DHCP_SERVER_IP}; -static CONST char gacHttpProvDomainName[] = MAIN_HTTP_PROV_SERVER_DOMAIN_NAME; +static const char gacHttpProvDomainName[] = MAIN_HTTP_PROV_SERVER_DOMAIN_NAME; static uint8 gau8MacAddr[] = MAIN_MAC_ADDRESS; static sint8 gacDeviceName[] = MAIN_M2M_SSID; diff --git a/ChaletLora.X/Source/main.c b/ChaletLora.X/Source/main.c index edbcb9c..a2afc7d 100644 --- a/ChaletLora.X/Source/main.c +++ b/ChaletLora.X/Source/main.c @@ -14,6 +14,9 @@ Change description. */ +//JFM WINC TODO + + #include "define.h" diff --git a/ChaletLora.X/Source/winc3400_142/bsp/include/nm_bsp.h b/ChaletLora.X/Source/winc3400_142/bsp/include/nm_bsp.h new file mode 100644 index 0000000..a22ad5c --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/bsp/include/nm_bsp.h @@ -0,0 +1,85 @@ +/******************************************************************************* + File Name: + nm_common.h + + Summary: + This module contains WINC3400 BSP APIs declarations. + + Description: + This module contains WINC3400 BSP APIs declarations. + *******************************************************************************/ + +//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. +*******************************************************************************/ +//DOM-IGNORE-END + +/** @defgroup nm_bsp BSP + @brief + Description of the BSP (Board Support Package) module. + @{ + @defgroup DataT Data Types + @defgroup BSPDefine Defines + @defgroup BSPAPI Functions + @brief + Lists the available BSP (Board Support Package) APIs. + @} + */ + +/**@addtogroup BSPDefine + @{ + */ +#ifndef _NM_BSP_H_ +#define _NM_BSP_H_ + +#define BSP_MIN(x,y) ((x)>(y)?(y):(x)) +/*!< + * Computes the minimum value between \b x and \b y. + */ +/**@}*/ //BSPDefine + +/** + * @addtogroup BSPDefine + * @{ + */ + +#ifdef _NM_BSP_BIG_END +/*! Switch endianness of 32bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_32(x) \ +((((x) & 0x000000FF) << 24) + \ +(((x) & 0x0000FF00) << 8) + \ +(((x) & 0x00FF0000) >> 8) + \ +(((x) & 0xFF000000) >> 24)) +/*! Switch endianness of 16bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_16(x) \ +((((x) & 0x00FF) << 8) + \ +(((x) & 0xFF00) >> 8)) +#else +/*! Retain endianness of 32bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_32(x) (x) +/*! Retain endianness of 16bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_16(x) (x) +#endif +/**@}*/ //BSPDefine + +#endif /*_NM_BSP_H_*/ diff --git a/ChaletLora.X/Source/winc3400_142/common/include/nm_common.h b/ChaletLora.X/Source/winc3400_142/common/include/nm_common.h new file mode 100644 index 0000000..fd420dd --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/common/include/nm_common.h @@ -0,0 +1,172 @@ +/******************************************************************************* + File Name: + nm_common.h + + Summary: + This module contains common APIs declarations. + + Description: + This module contains common APIs declarations. + *******************************************************************************/ + +//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. +*******************************************************************************/ +//DOM-IGNORE-END + +/** @defgroup COMMON Common + @{ + @defgroup COMMONDEF Defines + @defgroup COMMONAPI Functions + @} + */ + +#ifndef _NM_COMMON_H_ +#define _NM_COMMON_H_ + +#include +#include "define.h" +#include "nm_bsp.h" +#include "nm_debug.h" + +/**@addtogroup COMMONDEF + * @{ + */ + +/*states*/ +#define M2M_SUCCESS ((int8_t)0) +#define M2M_ERR_SEND ((int8_t)-1) +#define M2M_ERR_RCV ((int8_t)-2) +#define M2M_ERR_MEM_ALLOC ((int8_t)-3) +#define M2M_ERR_TIME_OUT ((int8_t)-4) +#define M2M_ERR_INIT ((int8_t)-5) +#define M2M_ERR_BUS_FAIL ((int8_t)-6) +#define M2M_NOT_YET ((int8_t)-7) +#define M2M_ERR_FIRMWARE ((int8_t)-8) +#define M2M_SPI_FAIL ((int8_t)-9) +#define M2M_ERR_FIRMWARE_bURN ((int8_t)-10) +#define M2M_ACK ((int8_t)-11) +#define M2M_ERR_FAIL ((int8_t)-12) +#define M2M_ERR_FW_VER_MISMATCH ((int8_t)-13) +#define M2M_ERR_SCAN_IN_PROGRESS ((int8_t)-14) +#define M2M_ERR_INVALID_ARG ((int8_t)-15) + +#define NBIT31 (0x80000000) +#define NBIT30 (0x40000000) +#define NBIT29 (0x20000000) +#define NBIT28 (0x10000000) +#define NBIT27 (0x08000000) +#define NBIT26 (0x04000000) +#define NBIT25 (0x02000000) +#define NBIT24 (0x01000000) +#define NBIT23 (0x00800000) +#define NBIT22 (0x00400000) +#define NBIT21 (0x00200000) +#define NBIT20 (0x00100000) +#define NBIT19 (0x00080000) +#define NBIT18 (0x00040000) +#define NBIT17 (0x00020000) +#define NBIT16 (0x00010000) +#define NBIT15 (0x00008000) +#define NBIT14 (0x00004000) +#define NBIT13 (0x00002000) +#define NBIT12 (0x00001000) +#define NBIT11 (0x00000800) +#define NBIT10 (0x00000400) +#define NBIT9 (0x00000200) +#define NBIT8 (0x00000100) +#define NBIT7 (0x00000080) +#define NBIT6 (0x00000040) +#define NBIT5 (0x00000020) +#define NBIT4 (0x00000010) +#define NBIT3 (0x00000008) +#define NBIT2 (0x00000004) +#define NBIT1 (0x00000002) +#define NBIT0 (0x00000001) + +#ifndef BIG_ENDIAN +/*! Most significant byte of 32bit word (LE) */ +#define BYTE_0(word) ((uint8_t)(((word) >> 0) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (LE) */ +#define BYTE_1(word) ((uint8_t)(((word) >> 8) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (LE) */ +#define BYTE_2(word) ((uint8_t)(((word) >> 16) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (LE) */ +#define BYTE_3(word) ((uint8_t)(((word) >> 24) & 0x000000FFUL)) +#else +/*! Most significant byte of 32bit word (BE) */ +#define BYTE_0(word) ((uint8_t)(((word) >> 24) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (BE) */ +#define BYTE_1(word) ((uint8_t)(((word) >> 16) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (BE) */ +#define BYTE_2(word) ((uint8_t)(((word) >> 8) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (BE) */ +#define BYTE_3(word) ((uint8_t)(((word) >> 0) & 0x000000FFUL)) +#endif +/**@}*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + * @ingroup COMMONAPI + * @fn int8_t hexstr_2_bytes(uint8_t *pu8Out, uint8_t *pu8In, uint8_t u8SizeOut); + * @brief Converts a string of hex characters to bytes. + * @param[out] pu8Out + * Output buffer (eg {0x11, 0x12, 0x13,...}) + * @param[in] pu8In + * Input buffer (eg {0x31, 0x31, 0x31, 0x32, 0x31, 0x33, ...}) + * @param[in] u8SizeOut + * Length of output buffer (should be half of the length of the input buffer). + * @return @ref M2M_SUCCESS if successful, M2M_ERR_INVALID_ARG otherwise (eg unrecognised hexchar in input). + */ +int8_t hexstr_2_bytes(uint8_t *pu8Out, uint8_t *pu8In, uint8_t u8SizeOut); + +/*! + * @fn void nm_sleep(uint32_t u32TimeMsec); + * @brief Used to put the host to sleep for the specified duration (in milliseconds). + * Forcing the host to sleep for extended period may lead to host not being able to respond + * to WINC board events. It is important to be considerate while choosing the sleep period. + * @param [in] u32TimeMsec + * Time unit in milliseconds. + * @pre Initialize @ref nm_bsp_init first. + * @note Implementation of this function is host dependent. + * @warning Maximum value must nor exceed 4294967295 milliseconds which is equal to 4294967.295 seconds. + * @see nm_bsp_init + * @return None + */ +void nm_sleep(uint32_t u32TimeMsec); + +/*! + * @ingroup COMMONAPI + * @fn nm_reset + * @brief Reset NMC3400 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_reset(void); +/**@}*/ +#ifdef __cplusplus +} +#endif +#endif /*_NM_COMMON_H_*/ diff --git a/ChaletLora.X/Source/winc3400_142/common/include/nm_debug.h b/ChaletLora.X/Source/winc3400_142/common/include/nm_debug.h new file mode 100644 index 0000000..1a5ee88 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/common/include/nm_debug.h @@ -0,0 +1,60 @@ +/******************************************************************************* + File Name: + nm_debug.h + + Summary: + This module contains debug API declarations. + + Description: + This module contains debug API declarations. + *******************************************************************************/ + +//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. +*******************************************************************************/ + +#ifndef _NM_DEBUG_H_ +#define _NM_DEBUG_H_ + + +//#include "wdrv_winc_debug.h" //JFM replaced include by direct definitions below +#define WDRV_DBG_VERBOSE_PRINT(...) +#define WDRV_DBG_TRACE_PRINT(...) +#define WDRV_DBG_INFORM_PRINT(...) +#define WDRV_DBG_ERROR_PRINT(...) + +/** + * @defgroup DebugDefines DebugDefines + * @ingroup WlanDefines + */ + +/**@{*/ + +#define M2M_ERR(...) WDRV_DBG_ERROR_PRINT(__VA_ARGS__) +#define M2M_INFO(...) WDRV_DBG_INFORM_PRINT(__VA_ARGS__) +#define M2M_DBG(...) WDRV_DBG_VERBOSE_PRINT(__VA_ARGS__) +#define M2M_PRINT(...) WDRV_DBG_VERBOSE_PRINT(__VA_ARGS__) + +/**@}*/ + +#endif /* _NM_DEBUG_H_ */ \ No newline at end of file diff --git a/ChaletLora.X/Source/winc3400_142/common/source/nm_common.c b/ChaletLora.X/Source/winc3400_142/common/source/nm_common.c new file mode 100644 index 0000000..a09dd72 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/common/source/nm_common.c @@ -0,0 +1,100 @@ +/******************************************************************************* + File Name: + nm_common.c + + Summary: + This module contains common APIs implementations. + + Description: + This module contains common APIs implementations. + *******************************************************************************/ + +//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. +*******************************************************************************/ + +#include "nm_common.h" +//#include "wdrv_winc_common.h" +//#include "wdrv_winc_gpio.h" + +/*! + * @fn nm_sleep + * @brief Sleep in units of mSec + * @param[IN] u32TimeMsec + * Time in milliseconds + */ +void nm_sleep(uint32_t u32TimeMsec) +{ + //JFM WINC TODO + //WDRV_MSDelay(u32TimeMsec); +} + +/*! + * @fn nm_reset + * @brief Reset NMC3400 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_reset(void) +{ + //JFM WINC TODO + //WDRV_WINC_GPIOChipEnableDeassert(); + //WDRV_WINC_GPIOResetAssert(); + nm_sleep(100); + //WDRV_WINC_GPIOChipEnableAssert(); + nm_sleep(10); + //WDRV_WINC_GPIOResetDeassert(); + nm_sleep(10); +} + +/* Convert hexchar to value 0-15 */ +static uint8_t hexchar_2_val(uint8_t ch) +{ + ch -= 0x30; + if (ch <= 9) + return ch; + ch |= 0x20; + ch -= 0x31; + if (ch <= 5) + return ch + 10; + return 0xFF; +} + +/* Convert hexstring to bytes */ +int8_t hexstr_2_bytes(uint8_t *pu8Out, uint8_t *pu8In, uint8_t u8SizeOut) +{ + while(u8SizeOut--) + { + uint8_t u8Out = hexchar_2_val(*pu8In++); + if (u8Out > 0xF) + return M2M_ERR_INVALID_ARG; + *pu8Out = u8Out * 0x10; + u8Out = hexchar_2_val(*pu8In++); + if (u8Out > 0xF) + return M2M_ERR_INVALID_ARG; + *pu8Out += u8Out; + pu8Out++; + } + return M2M_SUCCESS; +} + +//DOM-IGNORE-END diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/ecc_types.h b/ChaletLora.X/Source/winc3400_142/driver/include/ecc_types.h new file mode 100644 index 0000000..51d4065 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/ecc_types.h @@ -0,0 +1,300 @@ +/******************************************************************************* + File Name: + ecc_types.h + + Summary: + Elliptic Curve Cryptography Module Interface. + + Description: + Elliptic Curve Cryptography Module 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. +*******************************************************************************/ + +#ifndef __ECC_TYPES_H__ +#define __ECC_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + + +#define ECC_LARGEST_CURVE_SIZE (32) +/*!< + The size of the the largest supported EC. For now, assuming + the 256-bit EC is the largest supported curve type. +*/ + + +#define ECC_POINT_MAX_SIZE ECC_LARGEST_CURVE_SIZE +/*!< + Maximum size of one coordinate of an EC point. +*/ + + +#define ECC_POINT_MAX_SIZE_WORDS (ECC_POINT_MAX_SIZE / 4) +/*!< + SIZE in 32-bit words. +*/ + + +#define ECC_NUM_SUPP_CURVES ((sizeof(gastrECCSuppList)) / (sizeof(tstrEllipticCurve))) +/*!< +*/ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/**@addtogroup SSLEnums + * @{ + */ +/*! +@enum \ + tenuEcNamedCurve + +@brief EC Named Curves + + Defines a list of supported ECC named curves. +*/ +typedef enum EcNamedCurve{ + EC_SECP192R1 = 19, + /*!< + It is defined by NIST as P192 and by the SEC Group as secp192r1. + */ + EC_SECP256R1 = 23, + /*!< + It is defined by NIST as P256 and by the SEC Group as secp256r1. + */ + EC_SECP384R1 = 24, + /*!< + It is defined by NIST as P384 and by the SEC Group as secp384r1. + */ + EC_SECP521R1 = 25, + /*!< + It is defined by NIST as P521 and by the SEC Group as secp521r1. + */ + EC_UNKNOWN = 255 +}tenuEcNamedCurve; + + +/*! +@struct \ + tstrECPoint + +@brief Elliptic Curve point representation +*/ +typedef struct EcPoint{ + uint8_t X[ECC_POINT_MAX_SIZE]; + /*!< + The X-coordinate of the ec point. + */ + uint8_t Y[ECC_POINT_MAX_SIZE]; + /*!< + The Y-coordinate of the ec point. + */ + uint16_t u16Size; + /*!< + Point size in bytes (for each of the coordinates). + */ + uint16_t u16PrivKeyID; + /*!< + ID for the corresponding private key. + */ +}tstrECPoint; + + +/*! +@struct \ + tstrECDomainParam + +@brief ECC Curve Domain Parameters + + The structure defines the ECC domain parameters for curves defined over prime finite fields. +*/ +typedef struct EcDomainParam{ + uint32_t p[ECC_POINT_MAX_SIZE_WORDS]; + uint32_t a[ECC_POINT_MAX_SIZE_WORDS]; + uint32_t b[ECC_POINT_MAX_SIZE_WORDS]; + tstrECPoint G; +}tstrECDomainParam; + + +/*! +@struct \ + tstrEllipticCurve + +@brief + Definition of an elliptic curve +*/ +typedef struct{ + tenuEcNamedCurve enuType; + tstrECDomainParam strParam; +}tstrEllipticCurve; + +/*! +@enum \ + tenuEccREQ + +@brief ECC operations that may be requested by WINC. + + These are passed in the u16REQ field of @ref tstrEccReqInfo, which is used in both the request + from the WINC and the response to the WINC. +*/ +typedef enum{ + ECC_REQ_NONE, + /*!< */ + ECC_REQ_CLIENT_ECDH, + /*!< + Derive the shared secret from ECDHE key exchange as client. + */ + ECC_REQ_SERVER_ECDH, + /*!< + Derive the shared secret from ECDHE key exchange as server. + */ + ECC_REQ_GEN_KEY, + /*!< + Generate a key pair to be used in ECDHE key exchange as server. + */ + ECC_REQ_SIGN_GEN, + /*!< + Generate the signature for a given curve and value. The value needs to be retrieved via + @ref m2m_ssl_retrieve_hash. + */ + ECC_REQ_SIGN_VERIFY + /*!< + Verify a list of signatures. Each set of value/signature/key/curve information needs to be + retrieved via @ref m2m_ssl_retrieve_next_for_verifying. + */ +}tenuEccREQ; + +/*! +@struct \ + tstrEcdhReqInfo + +@brief Information relating to operations of type @ref ECC_REQ_CLIENT_ECDH, @ref ECC_REQ_GEN_KEY + and @ref ECC_REQ_SERVER_ECDH. +*/ +typedef struct{ + tstrECPoint strPubKey; + /*!< + Public key. Usage depends on type of operation. + */ + uint8_t au8Key[ECC_POINT_MAX_SIZE]; + /*!< + Pre master secret generated during operations of type @ref ECC_REQ_CLIENT_ECDH and + @ref ECC_REQ_SERVER_ECDH. + */ +}tstrEcdhReqInfo; + +/*! +@struct \ + tstrEcdsaVerifyReqInfo + +@brief Information relating to requests of type @ref ECC_REQ_SIGN_VERIFY. +*/ +typedef struct{ + uint32_t u32nSig; + /*!< + Number of sets of value/signature/key/curve information for verifying. Each set needs to be + retrieved via @ref m2m_ssl_retrieve_next_for_verifying. + */ +}tstrEcdsaVerifyReqInfo; + +/*! +@struct \ + tstrEcdsaSignReqInfo + +@brief Information relating to requests of type @ref ECC_REQ_SIGN_GEN. +*/ +typedef struct{ + uint16_t u16CurveType; + /*!< + The named curve to be used for signing, to be cast to type @ref tenuEcNamedCurve. + */ + uint16_t u16HashSz; + /*!< + The size of the value to be signed. The value needs to be retrieved via + @ref m2m_ssl_retrieve_hash. + */ +}tstrEcdsaSignReqInfo; + +/*! +@struct \ + tstrEccReqInfo + +@brief Information relating to ECC operations. + + This is used in both the request from the WINC and the response to the WINC. +*/ +typedef struct{ + uint16_t u16REQ; + /*!< + The requested ECC operation, to be cast to type @ref tenuEccREQ. + */ + uint16_t u16Status; + /*!< + The status of the operation: zero for success; non-zero for failure. + This field should be used in responses and ignored in requests. + */ + uint32_t u32UserData; + /*!< + This value is used internally. The value set in the response must match the value received + in the request. + */ + uint32_t u32SeqNo; + /*!< + This value is used internally. The value set in the response must match the value received + in the request. + */ + union{ + tstrEcdhReqInfo strEcdhREQ; + /*!< + Information relating to an operation of type @ref ECC_REQ_CLIENT_ECDH, + @ref ECC_REQ_GEN_KEY or @ref ECC_REQ_SERVER_ECDH. + */ + tstrEcdsaSignReqInfo strEcdsaSignREQ; + /*!< + Information relating to an operation of type @ref ECC_REQ_SIGN_GEN. + This field is used in requests and ignored in responses. + */ + tstrEcdsaVerifyReqInfo strEcdsaVerifyREQ; + /*!< + Information relating to an operation of type @ref ECC_REQ_SIGN_VERIFY. + This field is used in requests and ignored in responses. + */ + }; +}tstrEccReqInfo; +/**@}*/ //SSLEnums + +#endif /* __ECC_TYPES_H__ */ diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/m2m_flash.h b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_flash.h new file mode 100644 index 0000000..b279933 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_flash.h @@ -0,0 +1,188 @@ +/******************************************************************************* + WINC Flash Interface. + + File Name: + m2m_flash.h + + Summary: + WINC Flash Interface + + Description: + WINC Flash 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. +*******************************************************************************/ +// DOM-IGNORE-END + +/**@defgroup FLASHAPI Flash +*/ + +#ifndef __M2M_FLASH_H__ +#define __M2M_FLASH_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "nm_common.h" +#include "m2m_types.h" + +/**@defgroup FlashEnums Enumeration/Typedefs + * @ingroup FLASHAPI + * @{*/ + +/*! +@enum tenuWincFlashRegion + +@brief The regions of WINC flash available for accessing. +*/ +typedef enum +{ + /*! Access to the entire flash address space. */ + WINC_FLASH_REGION_RAW, + /*! Access to the active firmware region. */ + WINC_FLASH_REGION_FIRMWARE_ACTIVE, + /*! Access to the inactive firmware region. */ + WINC_FLASH_REGION_FIRMWARE_INACTIVE, + /*! Access to PLL table region. Erase is not supported for this region. */ + WINC_FLASH_REGION_PLL_TABLE, + /*! Access to gain table region. Erase is not supported for this region. */ + WINC_FLASH_REGION_GAIN_TABLE, + /*! Access to PLL and gain tables region. Erase is supported for this region. */ + WINC_FLASH_REGION_PLL_AND_GAIN_TABLES, + /*! Access to TLS root certificate region. */ + WINC_FLASH_REGION_ROOT_CERTS, + /*! Access to TLS local certificate region. */ + WINC_FLASH_REGION_LOCAL_CERTS, + /*! Access to connection parameters region. */ + WINC_FLASH_REGION_CONN_PARAM, + /*! Access to HTTP files region. This region is also erased/written by erase/write of firmware regions. */ + WINC_FLASH_REGION_HTTP_FILES, + /*! Number of regions. */ + WINC_FLASH_NUM_REGIONS +} tenuWincFlashRegion; + +/**@} +*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup FLASHFUNCTIONS Functions +* @ingroup FLASHAPI +*/ +/**@{*/ + +/*! +@fn \ + int8_t m2m_flash_erase_sector(tenuWincFlashRegion enuRegion, uint8_t u8StartSector, uint8_t u8NumSectors); + +@brief Erase one or more sectors within a WINC flash region. + +@param [in] enuRegion + Region of flash in which to erase. +@param [in] u8StartSector + Sector offset (within region) of first sector to erase. +@param [in] u8NumSectors + Number of sectors to erase. + +@return M2M_SUCCESS - The erase completed successfully. + M2M_ERR_INVALID_ARG - The parameters were invalid. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. + +*/ +int8_t m2m_flash_erase_sector(tenuWincFlashRegion enuRegion, uint8_t u8StartSector, uint8_t u8NumSectors); + +/*! +@fn \ + int8_t m2m_flash_write(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +@brief Write the number of bytes specified to a WINC flash location. + +@param [in] enuRegion + Region of flash in which to write. +@param [in] pvBuffer + Pointer to buffer containing the data to write. +@param [in] u32Offset + Byte offset (within region) of write location. +@param [in] u32Size + Number of bytes to write. + +@return M2M_SUCCESS - The write completed successfully. + M2M_ERR_INVALID_ARG - The parameters were invalid. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. + +@warning The write operation does not erase the flash device first, therefore the user + must ensure the flash region has been erased first. +*/ +int8_t m2m_flash_write(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +/*! +@fn \ + int8_t m2m_flash_read(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +@brief Read the number of bytes specified from a WINC flash location. + +@param [in] enuRegion + Region of flash from which to read. +@param [out] pvBuffer + Pointer to buffer to populate with the data being read. +@param [in] u32Offset + Byte offset (within region) of read location. +@param [in] u32Size + Number of bytes to read. + +@return M2M_SUCCESS - The read completed successfully. + M2M_ERR_INVALID_ARG - The parameters were invalid. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. +*/ +int8_t m2m_flash_read(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +/*! +@fn \ + int8_t m2m_flash_switch_firmware(void); + +@brief Switch the active and inactive firmware images. + +@return M2M_SUCCESS - The firmware switch completed successfully. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. + +*/ +int8_t m2m_flash_switch_firmware(void); + +/**@}*/ +#endif /* __M2M_FLASH_H__ */ diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/m2m_hif.h b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_hif.h new file mode 100644 index 0000000..4728429 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_hif.h @@ -0,0 +1,243 @@ +/******************************************************************************* + File Name: + m2m_hif.h + + Summary: + This module contains M2M host interface API definitions. + + Description: + This module contains M2M host interface API definitions. + *******************************************************************************/ + +//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. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _M2M_HIF_ +#define _M2M_HIF_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define M2M_HIF_MAX_PACKET_SIZE (1600 - 4) +/*!< Maximum size of the buffer could be transferred between Host and Firmware. +*/ + +#define M2M_HIF_HDR_OFFSET (sizeof(tstrHifHdr) + 4) + + +/** +* @struct tstrHifHdr +* @brief Structure to hold HIF header +*/ +typedef struct +{ + uint8_t u8Gid; /*!< Group ID */ + uint8_t u8Opcode; /*!< OP code */ + uint16_t u16Length; /*!< Payload length */ +} tstrHifHdr; + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@typedef typedef void (*tpfHifCallBack)(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr); +@brief used to point to Wi-Fi call back function depend on Arduino project or other projects. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +@param [in] grp + HIF group type. +*/ +typedef void (*tpfHifCallBack)(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr); +/** +* @fn int8_t hif_init(void *arg); +* @brief + To initialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_init(void *arg); +/** +* @fn int8_t hif_deinit(void *arg); +* @brief + To Deinitialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_deinit(void *arg); +/** +* @fn int8_t hif_check_compatibility(uint16_t u16HifInfo); +* @brief +* To check the compatibility of an image with the current driver. +* @param [in] u16HifInfo +* HIF info of image to be checked. +* @return The function shall return ZERO for compatible image and a negative value otherwise. +*/ +int8_t hif_check_compatibility(uint16_t u16HifInfo); +/** +* @fn int8_t hif_enable_access(void); +* @brief +* To enable access to HIF layer, based on HIF level of Firmware. +* This function reads HIF level directly from a register written by Firmware. +* @return The function shall return ZERO for full match operation and a negative value if operation is restricted. +*/ +int8_t hif_enable_access(void); +/** +* @fn int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode); +* @brief +* To check that a particular hif message is supported with the current driver/firmware pair. +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @return The function shall return ZERO for support and a negative value otherwise. +*/ +int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode); +/** +* @fn int8_t hif_send(uint8_t u8Gid, uint8_t u8Opcode, uint8_t *pu8CtrlBuf, uint16_t u16CtrlBufSize, + uint8_t *pu8DataBuf, uint16_t u16DataSize, uint16_t u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_send(uint8_t u8Gid, uint8_t u8Opcode, uint8_t *pu8CtrlBuf, uint16_t u16CtrlBufSize, + uint8_t *pu8DataBuf, uint16_t u16DataSize, uint16_t u16DataOffset); +/** +* @fn hif_receive +* @brief Host interface interrupt service routine +* @param [in] u32Addr +* Receive start address +* @param [out] pu8Buf +* Pointer to receive buffer. Allocated by the caller +* @param [in] u16Sz +* Receive buffer size +* @param [in] isDone +* If you don't need any more packets send True otherwise send false +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +int8_t hif_receive(uint32_t u32Addr, uint8_t *pu8Buf, uint16_t u16Sz, uint8_t isDone); +/** +* @fn hif_register_cb +* @brief + To set Callback function for every Component. + +* @param [in] u8Grp +* Group to which the Callback function should be set. + +* @param [in] fn +* function to be set to the specified group. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_register_cb(uint8_t u8Grp, tpfHifCallBack fn); +/** +* @fn int8_t hif_chip_sleep(void); +* @brief + To make the chip sleep. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_chip_sleep(void); +/** +* @fn int8_t hif_chip_wake(void); +* @brief + To Wakeup the chip. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +int8_t hif_chip_wake(void); +/*! +@fn \ + void hif_set_sleep_mode(uint8_t u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8_t u8Pstype); +/*! +@fn \ + uint8_t hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +uint8_t hif_get_sleep_mode(void); + +/** +* @fn hif_handle_isr(void) +* @brief + Handle interrupt received from WINC3400 firmware. +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t hif_handle_isr(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/m2m_ota.h b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_ota.h new file mode 100644 index 0000000..d6466d8 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_ota.h @@ -0,0 +1,370 @@ +/******************************************************************************* + WINC3400 OTA Upgrade API Interface + + File Name: + m2m_ota.h + + Summary: + WINC3400 OTA Upgrade API Interface + + Description: + WINC3400 OTA Upgrade API 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. +*******************************************************************************/ +// DOM-IGNORE-END + +/**@defgroup OTAAPI OTA + @brief + The WINC supports OTA (Over-The-Air) updates. Using the APIs described in this module, + it is possible to request an ATWINC15x0 to update its firmware, or safely rollback to + the previous firmware version.\n There are also APIs to download files and store them in + the WINC's Flash (supported by ATWINC1510 only), which can be used for Host MCU OTA + updates or accessing information stored remotely. + @{ + @defgroup OTACALLBACKS Callbacks + @brief + Lists the different callbacks that can be used during OTA updates.\n + Callbacks of type @ref tpfOtaNotifCb and @ref tpfOtaUpdateCb should be passed + onto @ref m2m_ota_init at system initialization. Other callbacks are provided + to handle the various steps of Host File Download. + + @defgroup OTADEFINE Defines + @brief + Specifies the macros and defines used by the OTA APIs. + + @defgroup OTATYPEDEF Enumerations and Typedefs + @brief + Specifies the enums and Data Structures used by the OTA APIs. + + @defgroup OTAFUNCTIONS Functions + @brief + Lists the full set of available APIs to manage OTA updates and Host File Downloads. + @} +*/ + +#ifndef __M2M_OTA_H__ +#define __M2M_OTA_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" +#include "m2m_types.h" +#include "nmdrv.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@typedef void (*tpfOtaUpdateCb)(uint8_t u8OtaUpdateStatusType, uint8_t u8OtaUpdateStatus); + +@brief + A callback to get OTA status update, the callback provides the status type and its status.\n + 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 @ref tenuOtaUpdateStatusType. + +@param[in] u8OtaUpdateStatus + Possible values are listed as enumerated by @ref tenuOtaUpdateStatus. + +@note + Executes other callbacks passed to the OTA module. + +@see + tenuOtaUpdateStatusType + tenuOtaUpdateStatus + */ +typedef void (*tpfOtaUpdateCb)(uint8_t u8OtaUpdateStatusType, uint8_t u8OtaUpdateStatus); +/**@}*/ // OTACALLBACKS + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb); + +@brief + Synchronous initialization function for the OTA layer by registering the update callback.\n + The notification callback is not supported at the current version. Calling this API is a + MUST for all the OTA API's. + +@param[in] pfOtaUpdateCb + OTA Update callback function. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_start_update(unsigned char * pcDownloadUrl); + +@brief + Request OTA start update using the download URL. The OTA module will download the OTA image, ensure integrity of the image + and update the validity of the image in the control structure. On completion, a callback of type @ref tpfOtaUpdateCb is called + (callback previously provided via @ref m2m_ota_init). Switching to the updated image additionally requires completion of + @ref m2m_ota_switch_firmware, followed by a WINC reset. + +@param[in] pcDownloadUrl + The download firmware URL, 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.\n + Calling this API invalidates any previous valid rollback image, irrespective of the result, but when + the OTA succeeds, the current image will become the rollback image after @ref m2m_ota_switch_firmware. + +@pre + @ref m2m_ota_init is a prerequisite and must have been called before using @ref m2m_ota_start_update.\n + Switching to the newly downloaded image requires calling @ref m2m_ota_switch_firmware API. + +@sa + @ref m2m_ota_init + @ref m2m_ota_switch_firmware + @ref tpfOtaUpdateCb + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + Note that successful operation in this context means the OTA update request has reached the firmware OTA module. + It does not indicate whether or not the image update succeeded. + +@section OTAExample Example + This example shows how an OTA image update and switch is carried out. + It demonstrates use of the following OTA APIs: + - @ref m2m_ota_init + - @ref tpfOtaUpdateCb + - @ref m2m_ota_start_update + - @ref m2m_ota_switch_firmware + - @ref m2m_ota_rollback + + It also makes use of @ref m2m_wifi_check_ota_rb in order to inform OTA decisions. +@code +static void OtaUpdateCb(uint8_t u8OtaUpdateStatusType, uint8_t u8OtaUpdateStatus) +{ + int8_t s8tmp; + tstrM2mRev strtmp; + M2M_INFO("%d %d\n", u8OtaUpdateStatusType, u8OtaUpdateStatus); + switch(u8OtaUpdateStatusType) + { + case DL_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCCESS) + { + M2M_INFO("OTA download succeeded\n"); + s8tmp = m2m_wifi_check_ota_rb(); + if(s8tmp == M2M_ERR_FW_VER_MISMATCH) + { + // In this case the application SHOULD update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without updating host + // driver would lead to severely limited functionality (i.e. OTA rollback only). + } + else if(s8tmp == M2M_SUCCESS) + { + // In this case the application MAY WANT TO update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without + // updating host driver may lead to suboptimal functionality. + } + else + { + M2M_INFO("Cannot recognize downloaded image\n"); + // In this case the application MUST NOT update the host driver if such an update would change the + // driver HIF Major field. Firmware switch @ref using m2m_ota_switch_firmware() is blocked. + break; + } + // Switch to the upgraded firmware + M2M_INFO("Now switching active partition...\n"); + s8tmp = m2m_ota_switch_firmware(); + } + break; + case SW_STATUS: + case RB_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCCESS) + { + M2M_INFO("Switch/Rollback succeeded\n"); + + // Start the host SW upgrade if required, then system reset is required (Reinitialize the driver) + + M2M_INFO("Now resetting the system...\n"); + system_reset(); + } + break; + } +} + +static void wifi_event_cb(uint8_t u8WiFiEvent, void *pvMsg) +{ + // ... + case M2M_WIFI_REQ_DHCP_CONF: + { + // After successful connection, start the OTA upgrade + m2m_ota_start_update(OTA_URL); + } + break; + default: + break; + // ... +} + +int main(void) +{ + tstrWifiInitParam param; + int8_t s8Ret = M2M_SUCCESS; + bool rollback_required = FALSE; + + // System init, etc should be here... + + memset((uint8_t *)¶m, 0, sizeof(param)); + param.pfAppWifiCb = wifi_event_cb; + + // Initialize the WINC Driver + s8Ret = m2m_wifi_init(¶m); + if(s8Ret == M2M_ERR_FW_VER_MISMATCH) + { + M2M_ERR("Firmware version mismatch\n"); + s8Ret = m2m_wifi_check_ota_rb(); + if(s8Ret == M2M_SUCCESS) + { + // In this case the image in the inactive partition has compatible HIF. We will switch/rollback to it + // after initializing the OTA module. + rollback_required = TRUE; + } + } + if(M2M_SUCCESS != s8Ret) + { + M2M_ERR("Driver Init Failed <%d>\n", s8Ret); + while(1); + } + // Initialize the OTA module + m2m_ota_init(OtaUpdateCb, NULL); + if(rollback_required) + { + // We need to call either @ref m2m_ota_rollback() or @ref m2m_ota_switch_firmware() (functionally equivalent). + m2m_ota_rollback(); + } + else + { + // Connect to AP that provides 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 + */ +int8_t m2m_ota_start_update(unsigned char *pcDownloadUrl); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_rollback(void); + +@brief + Request OTA Roll-back to the old (inactive) WINC image, the WINC firmware will check the validity of the inactive image + and activate it if valid. On completion, a callback of type @ref tpfOtaUpdateCb is called (application must previously have + provided the callback via @ref m2m_ota_init). If the callback indicates successful activation, the newly-activated image + will start running after next system reset. + +@warning + If rollback requires a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this API.\n + In the event of system reset with incompatible driver/firmware, compatibility can be + recovered by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ota_rollback(void); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_abort(void); + +@brief + Request the WINC to abort an OTA in progress.\n + If no download is in progress, the API will respond with failure. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for a successful operation and a negative value otherwise. + */ +int8_t m2m_ota_abort(void); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_switch_firmware(void); + +@brief + Request switch to the updated WINC image. The WINC firmware will check the validity of the + inactive image and activate it if valid. On completion, a callback of type @ref tpfOtaUpdateCb + is called (application must previously have provided the callback via @ref m2m_ota_init). + If the callback indicates successful activation, the newly-activated image will start running + after next system reset. + +@warning + If switch requires a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this API.\n + In the event of system reset with incompatible driver/firmware, compatibility can be + recovered by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ota_switch_firmware(void); + + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_OTA_H__ */ diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/m2m_periph.h b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_periph.h new file mode 100644 index 0000000..27d1051 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_periph.h @@ -0,0 +1,307 @@ +/******************************************************************************* + WINC3400 Peripherals Application Interface. + + File Name: + m2m_periph.h + + Summary: + WINC3400 Peripherals Application Interface + + Description: + WINC3400 Peripherals Application 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. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _M2M_PERIPH_H_ +#define _M2M_PERIPH_H_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" +#include "m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrPerphInitParam + +@brief + Peripheral module initialization parameters. +*/ +typedef struct { + void *arg; +} tstrPerphInitParam; + +/*! +@enum \ + tenuGpioNum + +@brief + A list of GPIO numbers configurable through the m2m_periph module. +*/ +typedef enum { + M2M_PERIPH_GPIO3, + M2M_PERIPH_GPIO4, + M2M_PERIPH_GPIO15, /*!< GPIO15 pad */ + M2M_PERIPH_GPIO16, /*!< GPIO16 pad */ + M2M_PERIPH_GPIO18, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO_MAX +} tenuGpioNum; + +/*! +@enum \ + tenuI2cMasterSclMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SCL signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_HOST_WAKEUP, /*!< I2C master SCL is available on HOST_WAKEUP. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_SD_DAT3, /*!< I2C master SCL is available on SD_DAT3 (GPIO 7). */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO13, /*!< I2C master SCL is available on GPIO 13. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO4, /*!< I2C master SCL is available on GPIO 4.*/ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_I2C_SCL, /*!< I2C master SCL is available on I2C slave SCL. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_NUM +} tenuI2cMasterSclMuxOpt; + +/*! +@enum \ + tenuI2cMasterSdaMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SDA signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_RTC_CLK, /*!< I2C master SDA is available on RTC_CLK. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_SD_CLK, /*!< I2C master SDA is available on SD_CLK (GPIO 8). */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO14, /*!< I2C master SDA is available on GPIO 14. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO6, /*!< I2C master SDA is available on GPIO 6.*/ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_I2C_SDA, /*!< I2C master SDA is available on I2C slave SDA. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_NUM +} tenuI2cMasterSdaMuxOpt; + +/*! +@struct \ + tstrI2cMasterInitParam + +@brief + I2C master configuration parameters. +@sa + tenuI2cMasterSclMuxOpt + tenuI2cMasterSdaMuxOpt +*/ +typedef struct { + uint8_t enuSclMuxOpt; /*!< SCL multiplexing option. Allowed value are defined in tenuI2cMasterSclMuxOpt */ + uint8_t enuSdaMuxOpt; /*!< SDA multiplexing option. Allowed value are defined in tenuI2cMasterSdaMuxOpt */ + uint8_t u8ClkSpeedKHz; /*!< I2C master clock speed in KHz. */ +} tstrI2cMasterInitParam; + +/*! +@enum \ + tenuI2cMasterFlags + +@brief + Bitwise-ORed flags for use in m2m_periph_i2c_master_write and m2m_periph_i2c_master_read +@sa + m2m_periph_i2c_master_write + m2m_periph_i2c_master_read +*/ +typedef enum { + I2C_MASTER_NO_FLAGS = 0x00, + /*!< No flags. */ + I2C_MASTER_NO_STOP = 0x01, + /*!< No stop bit after this transaction. Useful for scattered buffer read/write operations. */ + I2C_MASTER_NO_START = 0x02, + /*!< No start bit at the beginning of this transaction. Useful for scattered buffer read/write operations.*/ +} tenuI2cMasterFlags; + +/*! +@enum \ + tenuPullupMask + +@brief + Bitwise-ORed flags for use in m2m_perph_pullup_ctrl. +@sa + m2m_periph_pullup_ctrl + +*/ +typedef enum { + M2M_PERIPH_PULLUP_DIS_HOST_WAKEUP = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_RTC_CLK = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_IRQN = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_3 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_4 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_5 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_6 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_SD_CLK = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_SD_CMD_SPI_SCK = (1ul << 8), + M2M_PERIPH_PULLUP_DIS_SD_DAT0_SPI_TXD = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_SSN = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_RXD = (1ul << 11), + M2M_PERIPH_PULLUP_DIS_SD_DAT3 = (1ul << 12), +} tenuPullupEnable1Mask; +typedef enum { + M2M_PERIPH_PULLUP_DIS_GPIO_13 = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_GPIO_14 = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_GPIO_15 = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_16 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_17 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_18 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_19 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_GPIO_20 = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_GPIO_22 = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_GPIO_23 = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_GPIO_38 = (1ul << 25), + M2M_PERIPH_PULLUP_DIS_GPIO_39 = (1ul << 26), + M2M_PERIPH_PULLUP_DIS_GPIO_40 = (1ul << 27), + M2M_PERIPH_PULLUP_DIS_GPIO_42 = (1ul << 29), +} tenuPullupEnable2Mask; +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@fn \ + int8_t m2m_periph_init(tstrPerphInitParam * param); + +@brief + Initialize the WINC3400 peripheral driver module. + +@param [in] param + Peripheral module initialization structure. See members of tstrPerphInitParam. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tstrPerphInitParam +*/ +int8_t m2m_periph_init(tstrPerphInitParam *param); + +/*! +@fn \ + int8_t m2m_periph_gpio_set_dir(uint8_t u8GpioNum, uint8_t u8GpioDir); + +@brief + Configure a specific WINC3400 pad as a GPIO and sets its direction (input or output). + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioDir + GPIO direction: Zero = input. Non-zero = output. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +int8_t m2m_periph_gpio_set_dir(uint8_t u8GpioNum, uint8_t u8GpioDir); + +/*! +@fn \ + int8_t m2m_periph_gpio_set_val(uint8_t u8GpioNum, uint8_t u8GpioVal); + +@brief + Set an WINC3400 GPIO output level high or low. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioVal + GPIO output value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +int8_t m2m_periph_gpio_set_val(uint8_t u8GpioNum, uint8_t u8GpioVal); + +/*! +@fn \ + int8_t m2m_periph_gpio_get_val(uint8_t u8GpioNum, uint8_t * pu8GpioVal); + +@brief + Read an WINC3400 GPIO input level. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [out] pu8GpioVal + GPIO input value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +int8_t m2m_periph_gpio_get_val(uint8_t u8GpioNum, uint8_t *pu8GpioVal); + +/*! +@fn \ + int8_t m2m_periph_pullup_ctrl(uint32_t pinmask, uint8_t enable); + +@brief + Control the programmable pull-up resistor on the chip pads . + + +@param [in] pinmask + Write operation bitwise-ORed mask for which pads to control. Allowed values are defined in tenuPullupMask. + +@param [in] enable + Set to 0 to disable pull-up resistor. Non-zero will enable the pull-up. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuPullupMask +*/ +int8_t m2m_periph_pullup_ctrl(uint32_t pinmask, uint8_t enable); + +#ifdef __cplusplus +} +#endif + +#endif /* _M2M_PERIPH_H_ */ \ No newline at end of file diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/m2m_ssl.h b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_ssl.h new file mode 100644 index 0000000..df22ef7 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_ssl.h @@ -0,0 +1,255 @@ +/******************************************************************************* + File Name: + m2m_ssl.h + + Summary: + WINC SSL Interface. + + Description: + WINC SSL 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. +*******************************************************************************/ +//DOM-IGNORE-END + +/** @defgroup SSLAPI SSL + @brief + Provides a description of the SSL Layer. + @{ + @defgroup SSLCallbacks Callbacks + @brief + Provides detail on the available callbacks for the SSL Layer. + + @defgroup SSLEnums Enumerations and Typedefs + @brief + Specifies the enums and Data Structures used by the SSL APIs. + + @defgroup SSLFUNCTIONS Functions + @brief + Provides detail on the available APIs for the SSL Layer. + @} +*/ + +#ifndef __M2M_SSL_H__ +#define __M2M_SSL_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" +#include "m2m_types.h" +#include "nmdrv.h" +#include "ecc_types.h" +#include "socket.h" + +/*! +@ingroup SSLCallbacks +@typedef void (*tpfAppSSLCb)(uint8_t u8MsgType, void* pvMsg); +@brief A callback to get SSL notifications. +@param[in] u8MsgType + The type of the message received. +@param[in] pvMsg + A structure to provide notification payload. +*/ +typedef void (*tpfAppSSLCb)(uint8_t u8MsgType, void *pvMsg); + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); +@brief Initializes the SSL layer. +@param[in] pfAppSSLCb + Application SSL callback function. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8_t* pu8RspDataBuff, uint16_t u16RspDataSz); +@brief Sends ECC responses to the WINC. +@param[in] strECCResp + ECC Response struct. +@param[in] pu8RspDataBuff + Pointer of the response data to be sent. +@param[in] u16RspDataSz + Response data size. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8_t *pu8RspDataBuff, uint16_t u16RspDataSz); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_send_certs_to_winc(uint8_t* pu8Buffer, uint32_t u32BufferSz); +@brief Sends certificates to the WINC. +@param[in] pu8Buffer + Pointer to the certificates. The buffer format must match the format of @ref tstrTlsSrvSecHdr. +@param[in] u32BufferSz + Size of the certificates. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_send_certs_to_winc(uint8_t *pu8Buffer, uint32_t u32BufferSz); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] penuCurve + The named curve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. +@param[inout] pu16ValueSz + in: Size of value buffer provided by caller. + out: Size of value retrieved (provided for convenience; the value size is in fact determined by the curve). +@param[out] pu8Sig + Signature retrieved for verification. +@param[inout] pu16SigSz + in: Size of signature buffer provided by caller. + out: Size of signature retrieved (provided for convenience; the signature size is in fact determined by the curve). +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. +*/ +int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] pu16Curve + The named curve, to be cast to type @ref tenuEcNamedCurve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. + The size of the value is equal to the field size of the curve, hence is determined by pu16Curve. +@param[out] pu8Sig + Signature retrieved for verification. + The size of the signature is equal to twice the field size of the curve, hence is determined by pu16Curve. +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_retrieve_next_for_verifying is used instead. +*/ +int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz) +@brief Retrieve the value from the WINC for ECDSA signing. +@param[out] pu8Value + Value retrieved for signing. This is the digest of the message, truncated/prepended to the appropriate size. +@param[in] u16ValueSz + Size of value to be retrieved. (The application should obtain this information, + along with the curve, from the associated @ref ECC_REQ_SIGN_GEN notification.) +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + signing information is ready via @ref ECC_REQ_SIGN_GEN. + +@warning If this function returns @ref M2M_ERR_FAIL, then the value for signing is lost. +*/ +int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz); + +/*! +@ingroup SSLFUNCTIONS +@fn void m2m_ssl_stop_retrieving(void); +@brief Allow SSL driver to tidy up when the application chooses not to retrieve all available + information. + +@return None. + +@warning The application must call this function if it has been notified (via + @ref ECC_REQ_SIGN_GEN or @ref ECC_REQ_SIGN_VERIFY) that information is available for + retrieving from the WINC, but chooses not to retrieve it all. + The application must not call this function if it has retrieved all the available + information, or if a retrieve function returned @ref M2M_ERR_FAIL indicating that any + remaining information has been lost. + +@see m2m_ssl_retrieve_next_for_verifying\n + m2m_ssl_retrieve_cert\n + m2m_ssl_retrieve_hash +*/ +void m2m_ssl_stop_retrieving(void); + +/*! +@ingroup SSLFUNCTIONS +@fn NMI_API void m2m_ssl_stop_processing_certs(void); +@brief Allow SSL driver to tidy up in case application does not read all available certificates. +@return None. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_stop_retrieving is used instead. +*/ +void m2m_ssl_stop_processing_certs(void); + +/*! +@ingroup SSLFUNCTIONS +@fn void m2m_ssl_ecc_process_done(void); +@brief Allow SSL driver to tidy up after application has finished processing ECC message. + +@return None. + +@warning The application should call this function after receiving an SSL callback with message + type @ref M2M_SSL_REQ_ECC, after retrieving any related information, and before + calling @ref m2m_ssl_handshake_rsp. +*/ +void m2m_ssl_ecc_process_done(void); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP); +@brief Sets the active ciphersuites. +@details Override the default Active SSL ciphers in the SSL module with a certain combination selected by + the caller in the form of a bitmap containing the required ciphers to be on.\n + There is no need to call this function if the application will not change the default ciphersuites. +@param[in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + change. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP); + +#endif /* __M2M_SSL_H__ */ \ No newline at end of file diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/m2m_types.h b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_types.h new file mode 100644 index 0000000..8b9015e --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/m2m_types.h @@ -0,0 +1,2745 @@ +/******************************************************************************* + File Name: + m2m_types.h + + Summary: + WINC3400 Application Interface Internal Types + + Description: + WINC3400 Application Interface Internal Types + *******************************************************************************/ + +//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. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef __M2M_WIFI_TYPES_H__ +#define __M2M_WIFI_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup VERSION Version + */ +/**@defgroup VERSIONDEF Defines + * @ingroup VERSION + * @{ + */ + +/* + Layout of HIF_LEVEL fields + | x x x x x x | x x x x x x x x | + | 13:8 | 7:0 | + | HIF_MAJOR | HIF_MINOR | + | HIF_LEVEL | + + HIF compatibility (checked by driver after wifi boot). + + Check Firmware HIF_MAJOR + |___ + | Does not match Driver - Recommend either: + | > checking compatibility of Cortus image stored in inactive partition + | (m2m_wifi_check_ota_rb()) then swapping to it using OTA rollback or switch. + | > updating Host with out of band method. + |___ + Matches Driver - All APIs can be attempted. + | - Cortus image can be updated (OTA download) + | - New Host image can be retrieved (socket recv) + | + Check Firmware HIF_MINOR + |___ + | Less than Driver - Driver may refuse to execute some APIs (API would return M2M_ERR_SEND). + | - Recommend updating Cortus image using OTA download to use newer Firmware. + |___ + | Equal to Driver - Driver supports all APIs. + |___ + Greater than Driver - Driver supports all APIs. + - Recommend reviewing potential benefit of updating Host to use newer Driver. + + When an OTA update involving HIF_MAJOR change is required, the following order is recommended: + 1. m2m_ota_start_update() to store new Cortus image in inactive partition. + 2. Socket recv() to retrieve new Host image (including new WINC Driver). + 3. Application code to make Host image available in host flash. + 4. m2m_ota_switch_firmware() to switch active/inactive partition (will take effect after system_reset()). + 5. system_reset() to restart with new WINC Driver / Firmware. + Note that in the event of (unintentional) system reset after step (3), the remaining steps (4) and (5) should still be + run after the reset. +*/ +/* Selection of HIF_INFO +*/ +#define M2M_HIF_INFO_SHIFT (0) +#define M2M_HIF_INFO_MASK (0xffff) +/* Subdivision of HIF_INFO +*/ +#define M2M_HIF_BLOCK_SHIFT (14) +#define M2M_HIF_BLOCK_MASK (0x3) +#define M2M_HIF_LEVEL_SHIFT (0) +#define M2M_HIF_LEVEL_MASK (0x3fff) +/* Subdivision of HIF_LEVEL +*/ +#define M2M_HIF_MAJOR_SHIFT (8) +#define M2M_HIF_MAJOR_MASK (0x3f) +#define M2M_HIF_MINOR_SHIFT (0) +#define M2M_HIF_MINOR_MASK (0xff) + +#define M2M_GET_HIF_INFO(hif_ver) ((uint16_t)(((hif_ver) >> M2M_HIF_INFO_SHIFT) & M2M_HIF_INFO_MASK)) +#define M2M_GET_HIF_BLOCK(hif_info) ((uint8_t)(((hif_info) >> M2M_HIF_BLOCK_SHIFT) & M2M_HIF_BLOCK_MASK)) +#define M2M_GET_HIF_LEVEL(hif_info) ((uint16_t)(((hif_info) >> M2M_HIF_LEVEL_SHIFT) & M2M_HIF_LEVEL_MASK)) +#define M2M_GET_HIF_MAJOR(hif_info) ((uint8_t)(((hif_info) >> M2M_HIF_MAJOR_SHIFT) & M2M_HIF_MAJOR_MASK)) +#define M2M_GET_HIF_MINOR(hif_info) ((uint8_t)(((hif_info) >> M2M_HIF_MINOR_SHIFT) & M2M_HIF_MINOR_MASK)) + +#define M2M_MAKE_HIF_INFO(hif_level) ( \ + (((uint16_t)(hif_level) & M2M_HIF_LEVEL_MASK) << M2M_HIF_LEVEL_SHIFT) | \ + (((uint16_t)M2M_HIF_BLOCK_VALUE & M2M_HIF_BLOCK_MASK) << M2M_HIF_BLOCK_SHIFT) ) + +/*======*======*======*======* + HIF LEVEL + *======*======*======*======*/ + +#define M2M_HIF_BLOCK_VALUE (2) +/*!< Drv/Fw blocking compatibility check. + */ +#define M2M_HIF_MAJOR_VALUE (1) +/*!< Drv/Fw major compatibility check. +*/ +#define M2M_HIF_MINOR_VALUE (5) +/*!< Drv/Fw minor compatibility check. +*/ + +#define M2M_HIF_LEVEL ( \ + ((M2M_HIF_MAJOR_VALUE & M2M_HIF_MAJOR_MASK) << M2M_HIF_MAJOR_SHIFT) | \ + ((M2M_HIF_MINOR_VALUE & M2M_HIF_MINOR_MASK) << M2M_HIF_MINOR_SHIFT) \ + ) +/*!< HIF Level (Major/Minor) for Drv/Fw compatibility. +*/ + +/*======*======*======*======* + DRIVER VERSION NO INFO + *======*======*======*======*/ + +#define M2M_DRIVER_VERSION_MAJOR_NO (1) +/*!< Driver Major release version number. +*/ +#define M2M_DRIVER_VERSION_MINOR_NO (2) +/*!< Driver Minor release version number. +*/ +#define M2M_DRIVER_VERSION_PATCH_NO (0) +/*!< Driver patch release version number. +*/ + +/**@}*/ // VERSIONDEF + +/**@addtogroup WlanDefines + * @ingroup m2m_wifi + */ +/**@{*/ + +#define M2M_BUFFER_MAX_SIZE (1600UL - 4) +/*!< Maximum size for the shared packet buffer. + */ + +#define M2M_MAC_ADDRES_LEN 6 +/*!< The size of the 802 MAC address. + */ + +#define M2M_ETHERNET_HDR_OFFSET 34 +/*!< The offset of the Ethernet header within the WLAN Tx Buffer. + */ + + +#define M2M_ETHERNET_HDR_LEN 14 +/*!< Length of the Ethernet header in bytes. +*/ + + +#define M2M_MAX_SSID_LEN 33 +/*!< 1 more than the max SSID length. + This matches the size of SSID buffers (max SSID length + 1-byte length field). + */ + + +#define M2M_MAX_PSK_LEN 65 +/*!< 1 more than the WPA PSK length (in ASCII format). + This matches the size of the WPA PSK/Passphrase buffer (max ASCII contents + 1-byte length field). + Alternatively it matches the WPA PSK length (in ASCII format) + 1 byte NULL termination. + */ + +#define M2M_MIN_PSK_LEN 9 +/*!< 1 more than the minimum WPA PSK Passphrase length. + It matches the minimum WPA PSK Passphrase length + 1 byte NULL termination. + */ + +#define M2M_DEVICE_NAME_MAX 48 +/*!< Maximum Size for the device name including the NULL termination. + */ + +#define M2M_NTP_MAX_SERVER_NAME_LENGTH 32 +/*!< Maximum NTP server name length +*/ + +#define M2M_LISTEN_INTERVAL 1 +/*!< The STA uses the Listen Interval parameter to indicate to the AP how + many beacon intervals it shall sleep before it retrieves the queued frames + from the AP. +*/ + +#define MAX_HIDDEN_SITES 4 +/*!< + max number of hidden SSID supported by scan request +*/ + +#define M2M_CUST_IE_LEN_MAX 252 +/*!< The maximum size of IE (Information Element). +*/ + +#define M2M_CRED_STORE_FLAG 0x01 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials should be stored in WINC flash. +*/ +#define M2M_CRED_ENCRYPT_FLAG 0x02 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials should be encrypted when stored in WINC flash. +*/ +#define M2M_CRED_IS_STORED_FLAG 0x10 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials are stored in WINC flash. May only be set by WINC firmware. +*/ +#define M2M_CRED_IS_ENCRYPTED_FLAG 0x20 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials are encrypted in WINC flash. May only be set by WINC firmware. +*/ + +#define M2M_WIFI_CONN_BSSID_FLAG 0x01 +/*!< Flag used in @ref tstrM2mConnCredCmn to indicate that Wi-Fi connection + must be restricted to an AP with a certain BSSID. +*/ + +#define M2M_AUTH_1X_USER_LEN_MAX 100 +/*!< The maximum length (in ASCII characters) of domain name + username (including '@' or '\') + for authentication with Enterprise methods. +*/ +#define M2M_AUTH_1X_PASSWORD_LEN_MAX 256 +/*!< The maximum length (in ASCII characters) of password for authentication with Enterprise MSCHAPv2 methods. +*/ +#define M2M_AUTH_1X_PRIVATEKEY_LEN_MAX 256 +/*!< The maximum length (in bytes) of private key modulus for authentication with Enterprise TLS methods. + Private key exponent must be the same length as modulus, pre-padded with 0s if necessary. +*/ +#define M2M_AUTH_1X_CERT_LEN_MAX 1584 +/*!< The maximum length (in bytes) of certificate for authentication with Enterprise TLS methods. +*/ + +#define M2M_802_1X_UNENCRYPTED_USERNAME_FLAG 0x80 +/*!< Flag to indicate that the 802.1x user-name should be sent (unencrypted) in the initial EAP + identity response. Intended for use with EAP-TLS only. +*/ +#define M2M_802_1X_PREPEND_DOMAIN_FLAG 0x40 +/*!< Flag to indicate that the 802.1x domain name should be prepended to the user-name: + "Domain\Username". If the flag is not set then domain name is appended to the user-name: + "Username@Domain". (Note that the '@' or '\' must be included in the domain name.) +*/ +#define M2M_802_1X_MSCHAP2_FLAG 0x01 +/*!< Flag to indicate 802.1x MsChapV2 credentials: domain/user-name/password. +*/ +#define M2M_802_1X_TLS_FLAG 0x02 +/*!< Flag to indicate 802.1x TLS credentials: domain/user-name/private-key/certificate. +*/ + +#define M2M_802_1X_TLS_CLIENT_CERTIFICATE 1 +/*!< Info type used in @ref tstrM2mWifiAuthInfoHdr to indicate Enterprise TLS client certificate. +*/ +#define PSK_CALC_LEN 40 +/*!< PSK is 32 bytes generated either: + - from 64 ASCII characters + - by SHA1 operations on up to 63 ASCII characters + 40 byte array is required during SHA1 operations, so we define PSK_CALC_LEN as 40. +*/ + +/********************* + * + * WIFI GROUP requests + */ +#define M2M_CONFIG_CMD_BASE 1 +/*!< The base value of all the Host configuration commands opcodes. +*/ +#define M2M_STA_CMD_BASE 40 +/*!< The base value of all the Station mode host commands opcodes. +*/ +#define M2M_AP_CMD_BASE 70 +/*!< The base value of all the Access Point mode host commands opcodes. +*/ +/**@cond P2P_DOC + */ +#define M2M_P2P_CMD_BASE 90 +/*!< The base value of all the P2P mode host commands opcodes. +*/ +/**@endcond*/ //P2P_DOC +#define M2M_SERVER_CMD_BASE 100 +/*!< The base value of all the Power Save mode host commands codes. +*/ +#define M2M_GEN_CMD_BASE 105 +/*!< The base value of additional host wifi command opcodes. + * Usage restrictions (eg STA mode only) should always be made clear at the API layer in any case. +*/ +/********************** + * OTA GROUP requests + */ +#define M2M_OTA_CMD_BASE 100 +/*!< The base value of all the OTA mode host commands opcodes. + * The OTA messages have their own group so op codes can extended from 1 to M2M_MAX_GRP_NUM_REQ. +*/ + +#define M2M_MAX_GRP_NUM_REQ (127) +/*!< max number of request in one group equal to 127 as the last bit reserved for config or data pkt +*/ + +#define WEP_40_KEY_SIZE ((uint8_t)5) +/*!< The size in bytes of a 40-bit wep key. +*/ +#define WEP_104_KEY_SIZE ((uint8_t)13) +/*!< The size in bytes of a 104-bit wep key. +*/ + +#define WEP_40_KEY_STRING_SIZE ((uint8_t)10) +/*!< The string length of a 40-bit wep key. +*/ +#define WEP_104_KEY_STRING_SIZE ((uint8_t)26) +/*!< The string length of a 104-bit wep key. +*/ + +#define WEP_KEY_MAX_INDEX ((uint8_t)4) +/*!< WEP key index is in the range 1 to 4 inclusive. (This is decremented to + * result in an index in the range 0 to 3 on air.) +*/ +#define M2M_SCAN_DEFAULT_NUM_SLOTS (2) +/*!< The default number of scan slots used by the WINC board. +*/ +#define M2M_SCAN_DEFAULT_SLOT_TIME (20) +/*!< The active scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_PASSIVE_SLOT_TIME (300) +/*!< The passive scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_NUM_PROBE (2) +/*!< The default number of probes per slot. +*/ +#define M2M_FASTCONNECT_DEFAULT_RSSI_THRESH (-45) +/*!< The default threshold RSSI for fast reconnection to an AP. +*/ +#define M2M_SCAN_FAIL ((uint8_t)1) +/*!< Indicates the WINC board has failed to perform the scan operation. +*/ +#define M2M_JOIN_FAIL ((uint8_t)2) +/*!< Indicates the WINC board has failed to join the BSS. +*/ +#define M2M_AUTH_FAIL ((uint8_t)3) +/*!< Indicates the WINC board has failed to authenticate with the AP. +*/ +#define M2M_ASSOC_FAIL ((uint8_t)4) +/*!< Indicates the WINC board has failed to associate with the AP. +*/ + +#define M2M_SCAN_ERR_WIFI ((int8_t)-2) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_IP ((int8_t)-3) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_AP ((int8_t)-4) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_P2P ((int8_t)-5) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_WPS ((int8_t)-6) +/*!< Currently not used. +*/ + +/*======*======*======*======* + MONITORING MODE DEFINITIONS + *======*======*======*======*/ + +#define M2M_WIFI_FRAME_TYPE_ANY 0xFF +/*!< Receive any frame type when configured as Monitor Mode. +*/ +#define M2M_WIFI_FRAME_SUB_TYPE_ANY 0xFF +/*!< Receive frames with any sub type when configured as Monitor Mode. +*/ + +/*======*======*======*======* + TLS DEFINITIONS + *======*======*======*======*/ +#define TLS_FILE_NAME_MAX 48 +/*!< Maximum length for each TLS certificate file name. +*/ +#define TLS_SRV_SEC_MAX_FILES 8 +/*!< Maximum number of certificates allowed in TLS_SRV section. +*/ +#define TLS_SRV_SEC_START_PATTERN_LEN 8 +/*!< Length of certificate struct start pattern. +*/ + +/**@}*/ // WLANDefines + +/**@addtogroup OTADEFINE + * @{ + */ + +/*======*======*======*======* + OTA DEFINITIONS + *======*======*======*======*/ + +#define OTA_STATUS_VALID (0x12526285) +/*!< + Magic value in the control structure for a valid image after ROLLBACK. +*/ +#define OTA_STATUS_INVALID (0x23987718) +/*!< + Magic value in the control structure for a invalid image after ROLLBACK. +*/ +#define OTA_MAGIC_VALUE (0x1ABCDEF9) +/*!< + Magic value set at the beginning of the OTA image header. +*/ +#define OTA_SHA256_DIGEST_SIZE (32) +/*!< + SHA256 digest size in the OTA image. + The SHA256 digest is set at the beginning of image before the OTA header. +*/ +/**@}*/ // OTADEFINE + +/** +* @addtogroup WlanEnums +*/ +/**@{*/ + +/*! +@enum \ + tenuM2mReqGroup + +@brief +*/ +typedef enum { + M2M_REQ_GROUP_MAIN = 0, + M2M_REQ_GROUP_WIFI, + M2M_REQ_GROUP_IP, + M2M_REQ_GROUP_HIF, + M2M_REQ_GROUP_OTA, + M2M_REQ_GROUP_SSL, + M2M_REQ_GROUP_SIGMA, + M2M_REQ_GROUP_INTERNAL, +} tenuM2mReqGroup; + +/*! +@enum \ + tenuM2mReqpkt + +@brief +*/ +typedef enum { + M2M_REQ_CONFIG_PKT, + M2M_REQ_DATA_PKT = 0x80 /*BIT7*/ +} tenuM2mReqpkt; + +/*! +@enum \ + tenuM2mWepKeyIndex + +@brief + +*/ +typedef enum { + M2M_WIFI_WEP_KEY_INDEX_1 = ((uint8_t) 1), + /*!< Index 1 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_2, + /*!< Index 2 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_3, + /*!< Index 3 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_4, + /*!< Index 4 for WEP key Authentication */ +} tenuM2mWepKeyIndex; + +/*! +@enum \ + tenuM2mDefaultConnErrcode + +@brief + +*/ +typedef enum { + M2M_DEFAULT_CONN_INPROGRESS = ((int8_t)-23), + /*!< Failure response due to another connection being already in progress */ + M2M_DEFAULT_CONN_FAIL, + /*!< Failure to connect to the cached network */ + M2M_DEFAULT_CONN_SCAN_MISMATCH, + /*!< Failure to find any of the cached networks in the scan results. */ + M2M_DEFAULT_CONN_EMPTY_LIST + /*!< Failure due to empty network list. */ +} tenuM2mDefaultConnErrcode; + + +/*! +@enum \ + tenuM2mConnChangedErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_SCAN_FAIL = ((uint8_t)1), + /*!< Failure to perform the scan operation. */ + M2M_ERR_JOIN_FAIL, + /*!< Failure to join the BSS. */ + M2M_ERR_AUTH_FAIL, + /*!< Failure to authenticate with the AP. */ + M2M_ERR_ASSOC_FAIL, + /*!< Failure to associate with the AP. */ + M2M_ERR_CONN_INPROGRESS, + /*!< Failure due to another connection being in progress. */ +} tenuM2mConnChangedErrcode; + + +/*! +@enum \ + tenuM2mSetGainsErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_GAIN_TABLE_INVALID = ((int8_t)-10), + /*!< Failure response due to trying to use an invalid table */ + M2M_ERR_READ_GAIN_TABLE, + /*!< Failure to read gains from flash */ +} tenuM2mSetGainsErrcode; + +/*! +@enum \ + tenuM2mPwrMode + +@brief + +*/ +typedef enum { + PWR_AUTO = ((uint8_t) 1), + /*!< Automatic power mode. */ + PWR_LOW1, + /*!< Low power mode #1. RX current 60mA.*/ + PWR_LOW2, + /*!< Low power mode #2, RX current 55mA, sensitivity is less by 3dBm*/ + PWR_HIGH, + /*!< High power mode: RX current 100mA.*/ +} tenuM2mPwrMode; + +/*! +@enum \ + tenuM2mTxPwrLevel + +@brief + +*/ +typedef enum { + TX_PWR_HIGH = ((uint8_t) 1), + /*!< PPA Gain 6dbm PA Gain 18dbm */ + TX_PWR_MED, + /*!< PPA Gain 6dbm PA Gain 12dbm */ + TX_PWR_LOW, + /*!< PPA Gain 6dbm PA Gain 6dbm */ +} tenuM2mTxPwrLevel; + +/*! +@enum \ + tenuM2mConfigCmd + +@brief + This enum contains host commands used to configure the WINC board. + +*/ +typedef enum { + M2M_WIFI_REQ_RESTART = M2M_CONFIG_CMD_BASE, + /*!< Restart the WINC MAC layer, it's doesn't restart the IP layer. */ + M2M_WIFI_REQ_SET_MAC_ADDRESS, + /*!< Set the WINC mac address (not possible for production effused boards). */ + M2M_WIFI_REQ_CURRENT_RSSI, + /*!< Request the current connected AP RSSI. */ + M2M_WIFI_RESP_CURRENT_RSSI, + /*!< Response to M2M_WIFI_REQ_CURRENT_RSSI with the RSSI value. */ + M2M_WIFI_REQ_RESTRICT_BLE, + /*!< Request restrict ble. */ + M2M_WIFI_REQ_UNRESTRICT_BLE, + /*!< Request unrestrict ble. */ + M2M_WIFI_REQ_GET_CONN_INFO, + /*!< Request connection information. */ + M2M_WIFI_RESP_CONN_INFO, + /*!< Response to M2M_WIFI_REQ_GET_CONN_INFO with the connection information. */ + M2M_WIFI_REQ_SET_DEVICE_NAME, + /*!< Request to set WINC device name property. */ + M2M_WIFI_REQ_START_PROVISION_MODE_LEGACY, + /*!< Request to start provisioning mode. */ + M2M_WIFI_RESP_PROVISION_INFO, + /*!< Response to the host with the provisioning information.*/ + M2M_WIFI_REQ_STOP_PROVISION_MODE, + /*!< Request to stop provision mode. */ + M2M_WIFI_REQ_SET_SYS_TIME, + /*!< Request to set system time. */ + M2M_WIFI_REQ_ENABLE_SNTP_CLIENT, + /*!< Request to enable the simple network time protocol to get the + time from the Internet. This is required for security purposes. */ + M2M_WIFI_REQ_DISABLE_SNTP_CLIENT, + /*!< Request to disable the simple network time protocol for applications that + do not need it. */ + M2M_WIFI_RESP_MEMORY_RECOVER, + /*!< Reserved for debugging */ + M2M_WIFI_REQ_CUST_INFO_ELEMENT, + /*!< Request to add custom information to the Beacons IE. */ + M2M_WIFI_REQ_SCAN, + /*!< Request scan command. */ + M2M_WIFI_RESP_SCAN_DONE, + /*!< Response to notify scan complete. */ + M2M_WIFI_REQ_SCAN_RESULT, + /*!< Request for scan results. */ + M2M_WIFI_RESP_SCAN_RESULT, + /*!< Response to provide the scan results. */ + M2M_WIFI_REQ_SET_SCAN_OPTION, + /*!< Request to set scan options "slot time, slot number .. etc". */ + M2M_WIFI_REQ_SET_SCAN_REGION, + /*!< Request to set scan region. */ + M2M_WIFI_REQ_SET_POWER_PROFILE, + /*!< Request to set the Power Profile. */ + M2M_WIFI_REQ_SET_TX_POWER, + /*!< Request to set the TX Power. */ + M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, + /*!< Request to set the Battery Voltage. */ + M2M_WIFI_REQ_SET_ENABLE_LOGS, + /*!< Request to enable logs. */ + M2M_WIFI_REQ_GET_SYS_TIME, + /*!< Request to get system time. */ + M2M_WIFI_RESP_GET_SYS_TIME, + /*!< Response to retrieve the system time. */ + M2M_WIFI_REQ_SEND_ETHERNET_PACKET, + /*!< Request to send Ethernet packet in bypass mode. */ + M2M_WIFI_RESP_ETHERNET_RX_PACKET, + /*!< Response to receive an Ethernet packet in bypass mode. */ + M2M_WIFI_REQ_SET_MAC_MCAST, + /*!< Request to set multicast filters. */ + M2M_WIFI_REQ_BLE_API_SEND, + /*!< Request to send an Encapsulated BLE API MSG */ + M2M_WIFI_RESP_BLE_API_RECV, + /*!< Response to receive an Encapsulated BLE API MSG */ + M2M_WIFI_REQ_SET_GAIN_TABLE, + /*!< Request to use Gain table from Flash */ + M2M_WIFI_RESP_SET_GAIN_TABLE, + /*!< Response to fail to use Gain table from Flash */ + M2M_WIFI_REQ_PASSIVE_SCAN, + /*!< Request a passive scan. */ + M2M_WIFI_REQ_CONFIG_SNTP, + /*!< Configure NTP servers. */ + M2M_WIFI_REQ_START_PROVISION_MODE, + /*!< Request to start provisioning mode. */ + + /* This enum is now 'full' in the sense that (M2M_WIFI_REQ_START_PROVISION_MODE+1) == M2M_STA_CMD_BASE. + * Any new config values should be placed in tenuM2mGenCmd. */ + M2M_WIFI_MAX_CONFIG_ALL +} tenuM2mConfigCmd; + +/*! +@enum \ + tenuM2mStaCmd + +@brief + This enum contains WINC commands while in Station mode. +*/ +typedef enum { + M2M_WIFI_REQ_CONNECT = M2M_STA_CMD_BASE, + /*!< Request to connect with a specified AP. This command is deprecated in favour of @ref M2M_WIFI_REQ_CONN. + */ + M2M_WIFI_REQ_DEFAULT_CONNECT, + /*!< Request to connect with a cached AP. */ + M2M_WIFI_RESP_DEFAULT_CONNECT, + /*!< Response for the default connect.*/ + M2M_WIFI_REQ_DISCONNECT, + /*!< Request to disconnect from the AP. */ + M2M_WIFI_RESP_CON_STATE_CHANGED, + /*!< Response to indicate a change in the connection state. */ + M2M_WIFI_REQ_SLEEP, + /*!< Request to sleep. */ + M2M_WIFI_REQ_WPS_SCAN, + /*!< Request to WPS scan. */ + M2M_WIFI_REQ_WPS, + /*!< Request to start WPS. */ + M2M_WIFI_REQ_START_WPS, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_DISABLE_WPS, + /*!< Request to disable WPS. */ + M2M_WIFI_REQ_DHCP_CONF, + /*!< Response to indicate the obtained IP address.*/ + M2M_WIFI_RESP_IP_CONFIGURED, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_RESP_IP_CONFLICT, + /*!< Response to indicate a conflict in obtained IP address. + The user should re attempt the DHCP request. */ + M2M_WIFI_REQ_ENABLE_MONITORING, + /*!< Request to enable monitor mode. */ + M2M_WIFI_REQ_DISABLE_MONITORING, + /*!< Request to disable monitor mode. */ + M2M_WIFI_RESP_WIFI_RX_PACKET, + /*!< Response to indicate a packet was received in monitor mode. */ + M2M_WIFI_REQ_SEND_WIFI_PACKET, + /*!< Request to send a packet in monitor mode. */ + M2M_WIFI_REQ_LSN_INT, + /*!< Request to set the listen interval. */ + M2M_WIFI_REQ_DOZE, + /*!< Request to doze */ + M2M_WIFI_REQ_GET_PRNG, + /*!< Request PRNG. */ + M2M_WIFI_RESP_GET_PRNG, + /*!< Response for PRNG. */ + M2M_WIFI_REQ_CONN, + /*!< New command to connect with AP. + This replaces M2M_WIFI_REQ_CONNECT. (Firmware continues to handle + M2M_WIFI_REQ_CONNECT for backwards compatibility purposes.) + */ + M2M_WIFI_IND_CONN_PARAM, + /*!< Provide extra information (such as Enterprise client certificate) required for connection. */ + M2M_WIFI_MAX_STA_ALL +} tenuM2mStaCmd; + +/*! +@enum \ + tenuM2mApCmd + +@brief + This enum contains WINC commands while in AP mode. +*/ +typedef enum { + M2M_WIFI_REQ_ENABLE_AP_LEGACY = M2M_AP_CMD_BASE, + /*!< Request to enable AP mode. */ + M2M_WIFI_REQ_DISABLE_AP, + /*!< Request to disable AP mode. */ + M2M_WIFI_REQ_ENABLE_AP, + /*!< Request to enable AP mode. */ + M2M_WIFI_MAX_AP_ALL, +} tenuM2mApCmd; + +/*! +@enum \ + tenuM2mP2pCmd + +@brief + This enum contains WINC commands while in P2P mode. +*/ +typedef enum { + M2M_WIFI_REQ_P2P_INT_CONNECT = M2M_P2P_CMD_BASE, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_ENABLE_P2P, + /*!< Request to enable P2P mode.*/ + M2M_WIFI_REQ_DISABLE_P2P, + /*!< Request to disable P2P mode. */ + M2M_WIFI_REQ_P2P_REPOST, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. + */ + M2M_WIFI_MAX_P2P_ALL, +} tenuM2mP2pCmd; + + +/*! +@enum \ + tenuM2mServerCmd + +@brief + These commands are currently not supported. +*/ +typedef enum { + M2M_WIFI_REQ_CLIENT_CTRL = M2M_SERVER_CMD_BASE, + /*!< Currently not supported.*/ + M2M_WIFI_RESP_CLIENT_INFO, + /*!< Currently not supported.*/ + M2M_WIFI_REQ_SERVER_INIT, + /*!< Currently not supported.*/ + M2M_WIFI_MAX_SERVER_ALL +} tenuM2mServerCmd; + +/*! +@enum \ + tenuM2mGenCmd + +@brief + This enum contains additional WINC commands (overflow of previous enums). +*/ +typedef enum { + M2M_WIFI_REQRSP_DELETE_APID = M2M_GEN_CMD_BASE, + /*!< Request/response to delete security credentials from WINC flash. + (Processing matches @ref tenuM2mConfigCmd.) */ + M2M_WIFI_REQ_ROAMING, + /*!< Request to enable/disable wifi roaming. + (Processing matches @ref tenuM2mConfigCmd.) + */ + M2M_WIFI_REQ_SCAN_SSID_LIST, + /*!< Request scan with list of hidden SSID plus the broadcast scan. + */ + M2M_WIFI_REQ_SET_STOP_SCAN_OPTION, + /*!< Set Scan option to stop on first result. + (Processing matches @ref tenuM2mConfigCmd.) + */ + M2M_WIFI_MAX_GEN_ALL +} tenuM2mGenCmd; + + +/*! +@enum \ + tenuM2mIpCmd + +@brief + This enum contains all the WINC commands related to IP. +*/ +typedef enum { + M2M_IP_REQ_STATIC_IP_CONF = ((uint8_t) 10), + /*!< Request to set static IP.*/ + M2M_IP_REQ_ENABLE_DHCP, + /*!< Request to enable DHCP.*/ + M2M_IP_REQ_DISABLE_DHCP + /*!< Request to disable DHCP.*/ +} tenuM2mIpCmd; + +/*! +@enum \ + tenuM2mSockCmd + +@brief + This enum contains all the WINC commands related to Sockets. +*/ +typedef enum { + SOCKET_CMD_BIND = 0x41, + /*!< Socket Binding command value. */ + SOCKET_CMD_LISTEN, + /*!< Socket Listening command value. */ + SOCKET_CMD_ACCEPT, + /*!< Socket Accepting command value. */ + SOCKET_CMD_CONNECT, + /*!< Socket Connecting command value. */ + SOCKET_CMD_SEND, + /*!< Socket send command value. */ + SOCKET_CMD_RECV, + /*!< Socket Receive command value. */ + SOCKET_CMD_SENDTO, + /*!< Socket sendTo command value. */ + SOCKET_CMD_RECVFROM, + /*!< Socket ReceiveFrom command value. */ + SOCKET_CMD_CLOSE, + /*!< Socket Close command value. */ + SOCKET_CMD_DNS_RESOLVE, + /*!< Socket DNS Resolve command value. */ + SOCKET_CMD_SSL_CONNECT, + /*!< SSL-Socket Connect command value. */ + SOCKET_CMD_SSL_SEND, + /*!< SSL-Socket Send command value. */ + SOCKET_CMD_SSL_RECV, + /*!< SSL-Socket Receive command value. */ + SOCKET_CMD_SSL_CLOSE, + /*!< SSL-Socket Close command value. */ + SOCKET_CMD_SET_SOCKET_OPTION, + /*!< Set Socket Option command value. */ + SOCKET_CMD_SSL_CREATE, + SOCKET_CMD_SSL_SET_SOCK_OPT, + SOCKET_CMD_PING, + SOCKET_CMD_SSL_CONNECT_ALPN, + /*!< SSL-Socket Connect with ALPN command value. */ + SOCKET_CMD_RAW_SET_SOCK_OPT, + SOCKET_CMD_SECURE + /*!< Make secure a previously opened socket. */ +} tenuM2mSockCmd; + +/*! +@enum \ + tenuM2mSigmaCmd + +@brief + This enum contains all the WINC commands related to Sigma. +*/ +typedef enum { + M2M_SIGMA_ENABLE = ((uint8_t) 3), + /*!< Enable Sigma.*/ + M2M_SIGMA_TA_START, + /*!< Start the traffic agent.*/ + M2M_SIGMA_TA_STATS, + /*!< Get traffic statistics.*/ + M2M_SIGMA_TA_RECEIVE_STOP, + /*!< Stop receiving from the traffic agent.*/ + M2M_SIGMA_ICMP_ARP, + /*!< Send ARP.*/ + M2M_SIGMA_ICMP_RX, + /*!< Receive ICMP.*/ + M2M_SIGMA_ICMP_TX, + /*!< Transmit ICMP.*/ + M2M_SIGMA_UDP_TX, + /*!< Transmit UDP.*/ + M2M_SIGMA_UDP_TX_DEFER, + /*!< Transmit UDP defer.*/ + M2M_SIGMA_SECURITY_POLICY, + /*!< Set security policy.*/ + M2M_SIGMA_SET_SYSTIME + /*!< Set system time.*/ +} tenuM2mSigmaCmd; + +/*! +@enum \ + tenuM2mConnState + +@brief + This enum contains all the Wi-Fi connection states. +*/ +typedef enum { + M2M_WIFI_DISCONNECTED = 0, + /*!< Wi-Fi state is disconnected. */ + M2M_WIFI_CONNECTED, + /*!< Wi-Fi state is connected. */ + M2M_WIFI_ROAMED, + /*!< Wi-Fi state is roamed to new AP. */ + M2M_WIFI_UNDEF = 0xff + /*!< Undefined Wi-Fi State. */ +} tenuM2mConnState; + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi security types. +*/ +typedef enum { + M2M_WIFI_SEC_INVALID = 0, + /*!< Invalid security type. */ + M2M_WIFI_SEC_OPEN, + /*!< Wi-Fi network is not secured. */ + M2M_WIFI_SEC_WPA_PSK, + /*!< Wi-Fi network is secured with WPA/WPA2 personal(PSK). */ + M2M_WIFI_SEC_WEP, + /*!< Security type WEP (40 or 104) OPEN OR SHARED. */ + M2M_WIFI_SEC_802_1X, + /*!< Wi-Fi network is secured with WPA/WPA2 Enterprise.IEEE802.1x. */ + M2M_WIFI_NUM_AUTH_TYPES + /*!< Upper limit for enum value. */ +} tenuM2mSecType; + + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi SSID types. +*/ +typedef enum { + SSID_MODE_VISIBLE = 0, + /*!< SSID is visible to others. */ + SSID_MODE_HIDDEN + /*!< SSID is hidden. */ +} tenuM2mSsidMode; + +/*! +@enum \ + tenuM2mScanCh + +@brief + This enum contains all the Wi-Fi RF channels. +*/ +typedef enum { + M2M_WIFI_CH_1 = ((uint8_t) 1), + /*!< Channel 1. */ + M2M_WIFI_CH_2, + /*!< Channel 2. */ + M2M_WIFI_CH_3, + /*!< Channel 3. */ + M2M_WIFI_CH_4, + /*!< Channel 4. */ + M2M_WIFI_CH_5, + /*!< Channel 5. */ + M2M_WIFI_CH_6, + /*!< Channel 6. */ + M2M_WIFI_CH_7, + /*!< Channel 7. */ + M2M_WIFI_CH_8, + /*!< Channel 8. */ + M2M_WIFI_CH_9, + /*!< Channel 9. */ + M2M_WIFI_CH_10, + /*!< Channel 10. */ + M2M_WIFI_CH_11, + /*!< Channel 11. */ + M2M_WIFI_CH_12, + /*!< Channel 12. */ + M2M_WIFI_CH_13, + /*!< Channel 13. */ + M2M_WIFI_CH_14, + /*!< Channel 14. */ + M2M_WIFI_CH_ALL = ((uint8_t) 255) +} tenuM2mScanCh; + +/*! +@enum \ + tenuM2mScanRegion + +@brief + This enum contains all the Wi-Fi channel regions. +*/ +typedef enum { + REG_CH_1 = ((uint16_t) 1 << 0), + /*!< Region channel 1. */ + REG_CH_2 = ((uint16_t) 1 << 1), + /*!< Region channel 2. */ + REG_CH_3 = ((uint16_t) 1 << 2), + /*!< Region channel 3. */ + REG_CH_4 = ((uint16_t) 1 << 3), + /*!< Region channel 4. */ + REG_CH_5 = ((uint16_t) 1 << 4), + /*!< Region channel 5. */ + REG_CH_6 = ((uint16_t) 1 << 5), + /*!< Region channel 6. */ + REG_CH_7 = ((uint16_t) 1 << 6), + /*!< Region channel 7. */ + REG_CH_8 = ((uint16_t) 1 << 7), + /*!< Region channel 8. */ + REG_CH_9 = ((uint16_t) 1 << 8), + /*!< Region channel 9. */ + REG_CH_10 = ((uint16_t) 1 << 9), + /*!< Region channel 10. */ + REG_CH_11 = ((uint16_t) 1 << 10), + /*!< Region channel 11. */ + REG_CH_12 = ((uint16_t) 1 << 11), + /*!< Region channel 12. */ + REG_CH_13 = ((uint16_t) 1 << 12), + /*!< Region channel 13. */ + REG_CH_14 = ((uint16_t) 1 << 13), + /*!< Region channel 14. */ + REG_CH_ALL = ((uint16_t) 0x3FFF), + /*!< Region for all channels. */ + NORTH_AMERICA = ((uint16_t) 0x7FF), + /*!< North America region with 11 channels*/ + EUROPE = ((uint16_t) 0x1FFF), + /*!u8Status == M2M_SUCCESS) + { + tstrNetworkId strNetworkId = {NULL, pstrProvInfo->au8SSID, (uint8_t)strlen((char*)(pstrProvInfo->au8SSID)), M2M_WIFI_CH_ALL}; + tstrAuthPsk strAuthPsk = {NULL, pstrProvInfo->au8Password, (uint8_t)strlen((char*)(pstrProvInfo->au8Password))}; + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + uint8_t bEnableRedirect = 1; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[3] = 1; + + m2m_wifi_start_provision_mode(&apConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect); + +/*! +@ingroup WLANPROVISION +@fn \ + int8_t m2m_wifi_start_provision_mode_ext(tstrM2MAPModeConfig *pstrAPModeConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect); + +@brief + Asynchronous API for control of Wi-Fi provisioning functionality with extended options. + +@details + This function allows the application to start the WINC in 'provisioning mode', a special mode + that triggers the WINC to create a Wi-Fi access point, DHCP server, and HTTP server. + + The HTTP server presents a provisioning page to a connected client which lists the access points + detected in the vicinity of the WINC, and allows one of these to be selected and any appropriate + credentials to be entered. This allows a headless system to be provisioned (configured to + connect with an access point). + + Provisioning status is returned in an event @ref M2M_WIFI_RESP_PROVISION_INFO. + +@param[in] pstrAPModeConfig + AP configuration parameters as defined in @ref tstrM2MAPModeConfig configuration structure. + A NULL value passed in, will result in a negative error @ref M2M_ERR_FAIL. + +@param[in] pcHttpServerDomainName + Domain name of the HTTP Provision WEB server which others will use to load the provisioning Home page. + The domain name can have one of the following 3 forms: + - 1. "wincprov.com" + - 2. "http://wincprov.com" + - 3. "https://wincprov.com" + + The forms 1 and 2 are equivalent, they both will start a plain http server, while form 3 + will start a secure HTTP provisioning Session (HTTP over SSL connection). + +@param[in] bEnableHttpRedirect + A flag to enable/disable the HTTP redirect feature. If Secure provisioning is enabled (i.e. the server + domain name uses "https" prefix) this flag is ignored (no meaning for redirect in HTTPS). + Possible values are: + - Zero: DO NOT use HTTP Redirect. In this case the associated device could open the + provisioning page ONLY when the HTTP Provision URL of the WINC HTTP Server is + correctly written on the browser. + - Non-Zero: Use HTTP Redirect. In this case, all http traffic (http://URL) from the + associated device (Phone, PC, ...etc) will be redirected to the WINC HTTP + Provisioning Home page. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at startup. + Registering the callback is done through passing it to the initialization @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the requested connection info. + +@warning + Do not use ".local" in the pcHttpServerDomainName. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_PROVISION_INFO + m2m_wifi_stop_provision_mode + tstrM2MAPModeConfig + +@section WIFIExample12 Example + The example demonstrates a code snippet for how provisioning is triggered and the response event + received accordingly. + +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_PROVISION_INFO: + { + tstrM2MProvisionInfo *pstrProvInfo = (tstrM2MProvisionInfo*)pvMsg; + if(pstrProvInfo->u8Status == M2M_SUCCESS) + { + tstrNetworkId strNetworkId = {NULL, pstrProvInfo->au8SSID, (uint8_t)strlen((char*)(pstrProvInfo->au8SSID)), M2M_WIFI_CH_ALL}; + tstrAuthPsk strAuthPsk = {NULL, pstrProvInfo->au8Password, (uint8_t)strlen((char*)(pstrProvInfo->au8Password))}; + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPModeConfig apModeConfig; + uint8_t bEnableRedirect = 1; + + strcpy(apModeConfig.au8SSID, "WINC_SSID"); + apModeConfig.strApConfig.u8ListenChannel = 1; + apModeConfig.strApConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apModeConfig.strApConfig.u8SsidHide = 0; + + // IP Address + apModeConfig.strApConfig.au8DHCPServerIP[0] = 192; + apModeConfig.strApConfig.au8DHCPServerIP[1] = 168; + apModeConfig.strApConfig.au8DHCPServerIP[2] = 1; + apModeConfig.strApConfig.au8DHCPServerIP[3] = 1; + + // Default router IP + memcpy(apModeConfig.strApConfigExt.au8DefRouterIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // DNS Server IP + memcpy(apModeConfig.strApConfigExt.au8DNSServerIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // Subnet mask + apModeConfig.strApConfigExt.au8SubnetMask[0] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[1] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[2] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[3] = 0; + + m2m_wifi_start_provision_mode_ext(&apModeConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +int8_t m2m_wifi_start_provision_mode_ext(tstrM2MAPModeConfig *pstrAPModeConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect); + +/*! +@ingroup WLANPROVISION +@fn \ + int8_t m2m_wifi_stop_provision_mode(void); + +@brief + Synchronous API for terminating provisioning mode on the WINC. + +@details + This function will terminate any currently active provisioning mode on the WINC, returning the WINC to idle. + +@pre + An active provisioning session must be active before it is terminated through this function. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_start_provision_mode +*/ +int8_t m2m_wifi_stop_provision_mode(void); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_get_connection_info(void); + +@brief + Asynchronous API for retrieving the WINC connection status. + +@details + Requests the connection status from the WINC including information regarding any access + point to which it is currently connected, or any non-AP station that is connected to the WINC. + All information will be returned to the application via the Wi-Fi notification callback through + the event @ref M2M_WIFI_RESP_CONN_INFO. + + The connection info can be retrieved using the structure @ref tstrM2MConnInfo which contains: + - Connection Security + - Connection RSSI + - Remote MAC address + - Remote IP address + - SSID of the network (in cases where the WINC is in non-AP mode) + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to the initialization + @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the + requested connection info. + +@warning + - In case the WINC is operating in AP mode or P2P mode, the SSID field will be returned as a NULL string. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + M2M_WIFI_RESP_CONN_INFO, + tstrM2MConnInfo +@section WIFIExample2 Example + The code snippet shows an example of how wi-fi connection information is retrieved . +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CONN_INFO: + { + tstrM2MConnInfo *pstrConnInfo = (tstrM2MConnInfo*)pvMsg; + + printf("CONNECTED AP INFO\n"); + printf("SSID : %s\n",pstrConnInfo->acSSID); + printf("SEC TYPE : %d\n",pstrConnInfo->u8SecType); + printf("Signal Strength : %d\n", pstrConnInfo->s8RSSI); + printf("Local IP Address : %d.%d.%d.%d\n", + pstrConnInfo->au8IPAddr[0] , pstrConnInfo->au8IPAddr[1], pstrConnInfo->au8IPAddr[2], pstrConnInfo->au8IPAddr[3]); + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + // Get the current AP information. + m2m_wifi_get_connection_info(); + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // connect to the default AP + m2m_wifi_default_connect(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_get_connection_info(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_mac_address(uint8_t au8MacAddress[6]); + +@brief + Asynchronous API for assigning a MAC address to the WINC. + +@details + This function is intended to allow non-production software to assign a MAC address to the WINC. + +@warning + This function is intended for development use only and not for use in production software. + +@param[in] au8MacAddress + MAC Address to be provisioned to the WINC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. +*/ +int8_t m2m_wifi_set_mac_address(uint8_t au8MacAddress[6]); + +/*! +@ingroup WLANWPS +@fn \ + int8_t m2m_wifi_wps(uint8_t u8TriggerType,const char * pcPinNumber); + +@brief + Asynchronous API to engage the WINC Wi-Fi Protected Setup (enrollee) function. + +@details + This function can be called to make the WINC enter WPS (Wi-Fi Protected Setup) mode. The result + is passed to the Wi-Fi notification callback with the event @ref M2M_WIFI_REQ_WPS. + +@param[in] u8TriggerType + WPS Trigger method. This may be: + - @ref WPS_PIN_TRIGGER Push button method + - @ref WPS_PBC_TRIGGER Pin method + +@param[in] pcPinNumber + Valid only if the u8TriggerType is @ref WPS_PIN_TRIGGER, this parameter contains the PIN number. + The number must follow the format as given in the WSC1.0 specification. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@warning + This function is not allowed in AP or P2P modes. + +@pre + - A Wi-Fi notification callback of type (@ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to @ref m2m_wifi_init. + - The event @ref M2M_WIFI_REQ_WPS must be handled in the callback to receive the WPS status. + - The WINC device MUST be in IDLE or STA mode. If AP or P2P mode is active, the WPS will not be performed. + - The @ref m2m_wifi_handle_events MUST be called periodically to receive + the responses in the callback. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_REQ_WPS + tenuWPSTrigger + tstrM2MWPSInfo + +@section WIFIExample3 Example + The code snippet shows an example of how wi-fi WPS is triggered . +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_WPS: + { + tstrM2MWPSInfo *pstrWPS = (tstrM2MWPSInfo*)pvMsg; + if(pstrWPS->u8AuthType != 0) + { + // establish Wi-Fi connection + tstrNetworkId strNetworkId = {NULL, pstrWPS->au8SSID, (uint8_t)strlen((char*)(pstrWPS->au8SSID)), pstrWPS->u8Ch}; + if(pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN) + { + m2m_wifi_connect_open(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId); + } + else + { + tstrAuthPsk strAuthPsk = {NULL, pstrWPS->au8PSK, (uint8_t)strlen((char*)(pstrWPS->au8PSK))}; + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); + } + + printf("WPS SSID : %s\n",pstrWPS->au8SSID); + printf("WPS PSK : %s\n",pstrWPS->au8PSK); + printf("WPS SSID Auth Type : %s\n",pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN ? "OPEN" : "WPA/WPA2"); + printf("WPS Channel : %d\n",pstrWPS->u8Ch); + } + else + { + printf("(ERR) WPS Is not enabled OR Timed out\n"); + } + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger WPS in Push button mode. + m2m_wifi_wps(WPS_PBC_TRIGGER, NULL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_wps(uint8_t u8TriggerType, const char *pcPinNumber); + +/*! +@ingroup WLANWPS +@fn \ + int8_t m2m_wifi_wps_disable(void); + +@brief + Asynchronous API that disables Wi-Fi Protected Setup mode in the WINC. + +@pre + WINC should be already in WPS mode using @ref m2m_wifi_wps. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_wps +*/ +int8_t m2m_wifi_wps_disable(void); + +/**@cond P2P_DOC + */ +/*! +@ingroup WLANP2P +@fn \ + int8_t m2m_wifi_p2p(uint8_t u8Channel); + +@brief + Asynchronous API for enabling Wi-Fi Direct (P2P) mode in the WINC. + +@param[in] u8Channel + P2P Listen RF channel. According to the P2P standard, it must hold only one of the following values 1, 6 or 11. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_CON_STATE_CHANGED and @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@warning + - This function is not available in the WINC 3400 + - This function is not allowed in AP or STA modes. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_CON_STATE_CHANGED + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + +@section WIFIExample4 Example + The code snippet shows an example of how the p2p mode operates. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CON_STATE_CHANGED: + { + tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged*)pvMsg; + M2M_INFO("Wifi State :: %s :: ErrCode %d\n", pstrWifiState->u8CurrState? "CONNECTED":"DISCONNECTED",pstrWifiState->u8ErrCode); + + // Do something + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8_t *pu8IPAddress = (uint8_t*)pvMsg; + + printf("P2P IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger P2P + m2m_wifi_p2p(M2M_WIFI_CH_1); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_p2p(uint8_t u8Channel); + +/*! +@ingroup WLANP2P +@fn \ + int8_t m2m_wifi_p2p_disconnect(void); + +@brief + Synchronous API to disable Wi-Fi Direct (P2P) Mode on the WINC. + +@pre + The p2p mode must be enabled and active before a disconnect can be called. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_p2p +*/ +int8_t m2m_wifi_p2p_disconnect(void); +/**@endcond*/ //P2P_DOC + +/*! +@ingroup WLANAP +@fn \ + int8_t m2m_wifi_enable_ap(const tstrM2MAPConfig* pstrM2MAPConfig); + +@brief + Asynchronous API to enable access point (AKA "hot-spot") mode on the WINC. + +@details + The WINC supports the ability to operate as an access point with the following limitations: + - Only 1 station may be associated at any given time. + - Open system and WEP are the only security suites supported. + +@param[in] pstrM2MAPConfig + A structure holding the AP configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPConfig + +@section WIFIExample5 Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main function and the handling + of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8_t *pu8IPAddress = (uint8_t*)pvMsg; + + printf("Associated STA has IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[3] = 1; + + // Trigger AP + m2m_wifi_enable_ap(&apConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_enable_ap(const tstrM2MAPConfig *pstrM2MAPConfig); + +/*! +@ingroup WLANAP +@fn \ + int8_t m2m_wifi_enable_ap_ext(const tstrM2MAPModeConfig *pstrM2MAPModeConfig); + +@brief + Asynchronous API to enable access point (AKA "hot-spot") mode on the WINC with extended options. + +@details + The WINC supports the ability to operate as an access point with the following limitations: + - Only 1 station may be associated at any given time. + - Open system and WEP are the only security suites supported. + +@param[in] pstrM2MAPModeConfig + A structure holding the AP configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPModeConfig + +@section WIFIExample13 Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main function and the handling + of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8_t *pu8IPAddress = (uint8_t*)pvMsg; + + printf("Associated STA has IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPModeConfig apModeConfig; + + strcpy(apModeConfig.strApConfig.au8SSID, "WINC_SSID"); + apModeConfig.strApConfig.u8ListenChannel = 1; + apModeConfig.strApConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apModeConfig.strApConfig.u8SsidHide = 0; + + // IP Address + apModeConfig.strApConfig.au8DHCPServerIP[0] = 192; + apModeConfig.strApConfig.au8DHCPServerIP[1] = 168; + apModeConfig.strApConfig.au8DHCPServerIP[2] = 1; + apModeConfig.strApConfig.au8DHCPServerIP[3] = 1; + + // Default router IP + memcpy(apModeConfig.strApConfigExt.au8DefRouterIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // DNS Server IP + memcpy(apModeConfig.strApConfigExt.au8DNSServerIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // Subnet mask + apModeConfig.strApConfigExt.au8SubnetMask[0] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[1] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[2] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[3] = 0; + + // Trigger AP + m2m_wifi_enable_ap_ext(&apModeConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +int8_t m2m_wifi_enable_ap_ext(const tstrM2MAPModeConfig *pstrM2MAPModeConfig); + +/*! +@ingroup WLANAP +@fn \ + int8_t m2m_wifi_disable_ap(void); + +@brief + Synchronous API to disable access point mode on the WINC. + +@details + Must be called only when the AP is enabled through the @ref m2m_wifi_enable_ap + function. Otherwise the call to this function will not be useful. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_ap +*/ +int8_t m2m_wifi_disable_ap(void); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf); + +@brief + Asynchronous API to manually assign a (static) IP address to the WINC. + +@details + Assigns a static IP address to the WINC. + Typically an infrastructure access point will be able to provide an IP address to all clients + after they associate. The WINC will request configuration via DHCP automatically after + successfully connecting to an access point. + This function should only be called in the event that the network has no DHCP server or in case the application + wants to assign a predefined known IP address and the application. + This function can be used to assign a static IP address in case the application knows the specifics of the network. + The user must keep in mind that assigning a static IP address might + result in an IP address conflict. In case of an IP address conflict observed + by the WINC the user will get a response of @ref M2M_WIFI_RESP_IP_CONFLICT + in the wifi callback. The application is then responsible to either solve the + conflict or assign another IP address. + +@pre + The application must first call @ref m2m_wifi_enable_dhcp to request that DHCP functionality is + disabled prior to calling this function. + +@warning + Exercise caution using this function. + DHCP is the preferred method for configuring IP addresses. + +@param[in] pstrStaticIPConf + Pointer to a structure holding the static IP configuration (IP, Gateway, subnet mask and DNS address). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2MIPConfig +*/ +int8_t m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_request_dhcp_client(void); + +@brief + Legacy (deprecated) Asynchronous API for starting a DHCP client on the WINC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC. + +@warning + This function has been deprecated. DHCP is used automatically when the WINC connects. + +@return + This function always returns @ref M2M_SUCCESS. +*/ +int8_t m2m_wifi_request_dhcp_client(void); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_request_dhcp_server(uint8_t* addr); + +@brief + Legacy (deprecated) asynchronous function to start a DHCP client on the WINC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC. + +@param[in] addr + The address to issue to a connected client (only one client is supported) + +@warning + This function is legacy and exists only for compatibility with older applications. + DHCP server is started automatically when enabling the AP mode. + +@return + This function always returns @ref M2M_SUCCESS. +*/ +int8_t m2m_wifi_request_dhcp_server(uint8_t *addr); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_enable_dhcp(uint8_t u8DhcpEn); + +@brief + Asynchronous function to control the DHCP client functionality within the WINC. + +@details + This function allows the application to control the behaviour of the DHCP client function within + the WINC once it has associated with an access point. DHCP client functionality is enabled by + default. + +@param[in] u8DhcpEn + The state of the DHCP client feature after successful association with an access point: + - 1: Enables DHCP client after connection. + - 0: Disables DHCP client after connection. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@warning + DHCP client is enabled by default. + This Function should be called to disable DHCP client operation before using @ref m2m_wifi_set_static_ip. + +@see + m2m_wifi_set_static_ip +*/ +int8_t m2m_wifi_enable_dhcp(uint8_t u8DhcpEn); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption); + +@brief + Synchronous API for configuring the behaviour of the WINC network scanning functions. + +@details + This function allows the application to tune the scanning behaviour of the WINC using the + parameters described in @ref tstrM2MScanOption. + +@param[in] ptstrM2MScanOption; + Pointer to the structure holding the Scan Parameters. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tenuM2mScanCh + m2m_wifi_request_scan + tstrM2MScanOption +*/ +int8_t m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_set_stop_scan_on_first(uint8_t u8StopScanOption); + +@brief + Synchronous API for enabling/disabling the stop scan on first result of the WINC IC's network scanning functions. + +@details + Allows for enabling/disabling of stop scan on first result. When enabled, the WINC will stop the scan as soon as + it detects a network and return the results to the host. Setting is persistent and will need to be explicitly + reverted back by the application if it no longer wishes for it to be enabled. + +@param[in] u8StopScanOption; + Setting for enabling or disabling Stopping Scan on first result. + 1 = Enabled, 0 = Disabled (Default) + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tenuM2mScanCh + tstrM2MScanOption + tstrM2MStopScanOption + m2m_wifi_request_scan + m2m_wifi_set_scan_options +*/ +int8_t m2m_wifi_set_stop_scan_on_first(uint8_t u8StopScanOption); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_set_scan_region(uint16_t ScanRegion); + +@brief + Synchronous API for configuring the regulatory restrictions that may affect the WINC scanning behaviour. + +@details + This function sets a property called the scan region, a parameter that affects the range of + channels that the WINC may legally scan given a geographic region. + + For 2.4GHz, supported in the current release, the requested scan region cannot exceed the + maximum number of channels (14). + +@param[in] ScanRegion + @ref ASIA + @ref EUROPE + @ref NORTH_AMERICA + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tenuM2mScanRegion + m2m_wifi_request_scan +*/ +int8_t m2m_wifi_set_scan_region(uint16_t ScanRegion); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_request_scan(uint8_t ch); + +@brief + Asynchronous API to request the WINC to scan for networks. + +@details + Scan statuses are delivered to the application via the Wi-Fi event callback (@ref tpfAppWifiCb) in + three stages. The first step involves the event @ref M2M_WIFI_RESP_SCAN_DONE which, if successful, + provides the number of detected networks (access points). The application must then read the list + of access points via multiple calls to the asynchronous @ref m2m_wifi_req_scan_result API. For + each call to this function, the application will receive (step three) the event + @ref M2M_WIFI_RESP_SCAN_RESULT. + +@param[in] ch + RF Channel ID for SCAN operation. It should be set according to @ref tenuM2mScanCh, with a + value of @ref M2M_WIFI_CH_ALL to scan all channels. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registration of the callback is done via @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in + the (@ref tpfAppWifiCb) callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the + callback. + +@warning + This API is valid only for STA mode, it may be called regardless of connection state (connected or disconnected states). + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@section WIFIExample6 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult = (tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_request_scan(uint8_t ch); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_request_scan_passive(uint8_t ch); + +@brief + Similar to @ref m2m_wifi_request_scan but performs passive scanning instead of active scanning. + +@param[in] ch + RF Channel ID for SCAN operation. It should be set according to @ref tenuM2mScanCh. + With a value of @ref M2M_WIFI_CH_ALL, means to scan all channels. + + +@warning + This function is not allowed in P2P or AP modes. It works only for STA mode (both connected or disconnected states). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2MScanOption + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_request_scan + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +int8_t m2m_wifi_request_scan_passive(uint8_t ch); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_request_scan_ssid_list(uint8_t ch, uint8_t *u8SsidList); + +@brief + Asynchronous wi-fi scan request on the given channel and the hidden scan list. + +@details + The scan status is delivered in the wi-fi event callback and then the application + is to read the scan results sequentially. + The number of APs found (N) is returned in event @ref M2M_WIFI_RESP_SCAN_DONE with the number of found + APs. + The application could read the list of APs by calling the function @ref m2m_wifi_req_scan_result N times. + +@param[in] ch + RF Channel ID for SCAN operation. It should be set according to @ref tenuM2mScanCh. + With a value of @ref M2M_WIFI_CH_ALL, means to scan all channels. + +@param[in] u8SsidList + u8SsidList is a buffer containing a list of hidden SSIDs to + include during the scan. The first byte in the buffer, u8SsidList[0], + is the number of SSIDs encoded in the string. The number of hidden SSIDs + cannot exceed @ref MAX_HIDDEN_SITES. All SSIDs are concatenated in the following + bytes and each SSID is prefixed with a one-byte header containing its length. + The total number of bytes in u8SsidList buffer, including length byte, cannot + exceed 133 bytes (MAX_HIDDEN_SITES SSIDs x 32 bytes each, which is max SSID length). + For instance, encoding the two hidden SSIDs "DEMO_AP" and "TEST" + results in the following buffer content: + +@code + uint8_t u8SsidList[14]; + u8SsidList[0] = 2; // Number of SSIDs is 2 + u8SsidList[1] = 7; // Length of the string "DEMO_AP" without NULL termination + memcpy(&u8SsidList[2], "DEMO_AP", 7); // Bytes index 2-9 containing the string DEMO_AP + u8SsidList[9] = 4; // Length of the string "TEST" without NULL termination + memcpy(&u8SsidList[10], "TEST", 4); // Bytes index 10-13 containing the string TEST +@endcode + +@note + It works with STA/AP mode (connected or disconnected). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +\section WIFIExample6b Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +static void request_scan_hidden_demo_ap(void); + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + request_scan_hidden_demo_ap(); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +static void request_scan_hidden_demo_ap(void) +{ + uint8_t list[9]; + char ssid[] = "DEMO_AP"; + uint8 len = (uint8_t)(sizeof(ssid)-1); + + list[0] = 1; + list[1] = len; + memcpy(&list[2], ssid, len); // copy 7 bytes + // Scan all channels + m2m_wifi_request_scan_ssid_list(M2M_WIFI_CH_ALL, list); +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + request_scan_hidden_demo_ap(); + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_request_scan_ssid_list(uint8_t ch, uint8_t *u8Ssidlist); + +/*! +@ingroup WLANSCAN +@fn \ + uint8_t m2m_wifi_get_num_ap_found(void); + +@brief + Synchronous function to retrieve the number of AP's found during the last scan operation. + +@details + This function allows the application to recover the number of access points discovered during + the most recent scan activity. This is achieved via a global variable in the WINC driver that + is populated when receiving the @ref M2M_WIFI_RESP_SCAN_DONE event. + Function to be used in STA mode only. + +@see + m2m_wifi_request_scan + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + +@pre + m2m_wifi_request_scan must be called first to ensure up to date results are available. + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_RESP_SCAN_DONE must be handled in the callback to receive the requested scan information. + +@warning + This function must be called only in the wi-fi callback function when the events + @ref M2M_WIFI_RESP_SCAN_DONE or @ref M2M_WIFI_RESP_SCAN_RESULT are received. + Calling this function in any other place will result in undefined/outdated numbers. + +@return + Returns the number of AP's found in the last Scan Request. + +@section WIFIExample7 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +uint8_t m2m_wifi_get_num_ap_found(void); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_req_scan_result(uint8_t index); + +@brief + Asynchronous API to request the information of an access point discovered via scanning. + +@details + This function allows the information of any discovered access point to be retrieved. When a + scan is completed, the application is informed of the number of networks (access points) + discovered. Calling this function with an index, N, will return the information for the Nth + access point. The information will be returned to the application via a + @ref M2M_WIFI_RESP_SCAN_RESULT event, and the response data may be obtained through casting + the pointer (pvMsg) to @ref tstrM2mWifiscanResult. + +@param[in] index + Index for the requested result, the index range start from 0 till number of AP's found. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2mWifiscanResult + m2m_wifi_get_num_ap_found + m2m_wifi_request_scan + +@pre + - @ref m2m_wifi_request_scan must be called first to ensure up to date results are available. + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + in order to receive scan data after calling this function. Registration of the callback + is done via the @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in the callback to receive the + requested scan information. + +@warning + - This API is valid only for STA mode, it may be called regardless of the connection state (connected or disconnected). + - Calling this function without first issuing a scan request may lead to stale data being recovered. + - Application code should refrain from introducing significant delays between issuing the scan + request and scan result requests. + +@section WIFIExample8 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and + the handling of the events received in the response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_req_scan_result(uint8_t index); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_req_curr_rssi(void); + +@brief + Asynchronous API to request the current Receive Signal Strength (RSSI) of the current connection. + +@details + This function will result in the application receiving the RSSI via a + @ref M2M_WIFI_RESP_CURRENT_RSSI event. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done through passing it to @ref m2m_wifi_init + via the @ref tstrWifiInitParam initialization structure. + - The event @ref M2M_WIFI_RESP_CURRENT_RSSI must be handled in the callback to receive the requested Rssi information. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@section WIFIExample9 Example + The code snippet demonstrates how the RSSI request is called in the application's main function and the handling of the event received in the callback. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CURRENT_RSSI: + { + int8_t *rssi = (int8_t*)pvMsg; + M2M_INFO("ch rssi %d\n",*rssi); + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_req_curr_rssi(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_req_curr_rssi(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t * pu8IsValid); + +@brief + Synchronous API to query the MAC address programmed into the WINC OTP memory. + +@details + This function attempts to read the device's MAC address from the One Time Programmable (OTP) + memory on the WINC. The presence (yes or no) of a MAC address in the OTP memory and, in the case + of it being present, its value is returned via RAM pointed to by the input arguments. + + Request the MAC address stored on the One Time Programmable(OTP) memory of the device. + The function is blocking until the response is received. + +@pre + Prior call to @ref m2m_wifi_init is required before any WIFI/socket function. + +@param[out] pu8MacAddr + Output MAC address buffer 6 bytes in size. Valid only if *pu8Valid=1. + +@param[out] pu8IsValid + A boolean value set by the callee to indicate the validity of pu8MacAddr in OTP. If no MAC has + been programmed in the OTP the value of this parameter will be zero; otherwise it will be non-zero. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_get_mac_address +*/ +int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr) + +@brief + Synchronous API to retrieve the MAC address currently in use by the device. + +@details + This function obtains the MAC address that is currently in use by the device. If the function + returns with @ref M2M_SUCCESS then the content of the memory referenced by pu8MacAddr will be + populated with the 6 byte MAC address; otherwise, that memory will be left unchanged. + +@pre + Prior call to @ref m2m_wifi_init is required before any WIFI/socket function. + +@param[out] pu8MacAddr + Pointer to a buffer in memory containing a 6-byte MAC address (provided function returns @ref M2M_SUCCESS). + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + m2m_wifi_get_otp_mac_address +*/ +int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn); + +@brief + Synchronous API to set the power-save mode of the WINC. + +@details + This is one of the two synchronous power-save setting functions that allow the host MCU application + to tweak the system power consumption. Such tweaking can be done through one of two ways: + - 1) Changing the power save mode, to one of the allowed power save modes (see @ref tenuPowerSaveModes). This is done by setting the first parameter. + - 2) Configuring DTIM monitoring: Configuring beacon monitoring parameters by enabling or disabling the reception of broadcast/multicast data. + This is done by setting the second parameter. + +@param[in] PsTyp + Desired power saving mode. Supported types are enumerated in @ref tenuPowerSaveModes. + +@param[in] BcastEn + Broadcast reception enable flag. + If set to 1, the WINC will wake for each DTIM beacon to ensure broadcast traffic can be received. + If set to 0, the WINC will not wakeup at the DTIM beacon, ignoring broadcast traffic, instead it will + wake every N beacon periods, as per the negotiated Listen Interval. + +@warning + The function called once after initialization. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + tenuPowerSaveModes + m2m_wifi_get_sleep_mode + m2m_wifi_set_lsn_int +*/ +int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_request_sleep(uint32_t u32SlpReqTime); + +@brief + Asynchronous API to place the WINC into sleep mode for a specified period of time. + +@details + Power-save sleep request function, which requests the WINC device to sleep in the currently configured + power save mode, as set using @ref m2m_wifi_set_sleep_mode, for a specific time as defined by the parameter + u32SlpReqTime (measured in milliseconds). + This function should be used when the WINC is running in @ref M2M_PS_MANUAL power save mode only. + A wake up request is automatically performed by the WINC device when any host driver API function, e.g. Wi-Fi or socket operation is called. + +@param[in] u32SlpReqTime + Request sleep time in ms.\n + The best recommended sleep duration is left to be determined by the application. + Taking into account that if the application sends notifications very rarely, + sleeping for a long time can be a power-efficient decision. + In contrast, applications that are sensitive for long periods of absence can experience + performance degradation in the connection if long sleeping times are used. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@warning + - This API is currently unsupported on the WINC3400 + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +int8_t m2m_wifi_request_sleep(uint32_t u32SlpReqTime); + +/*! +@ingroup WLANPS +@fn \ + uint8_t m2m_wifi_get_sleep_mode(void); + +@brief + Synchronous API to retrieve the current power save mode of the WINC. + +@return + The current operating power saving mode. The value will be one of those from the enumerated type @ref tenuPowerSaveModes. + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +uint8_t m2m_wifi_get_sleep_mode(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength); + +@brief + Asynchronous API to set the Wi-Fi Direct "Device Name" of the WINC. + +@details + Sets the WINC device name. The name string is used as a device name in DHCP + hostname (option 12). + If a device is not set through this function a default name is assigned. + The default name is WINC-XX-YY, where XX and YY are the last 2 octets of the OTP + MAC address. If OTP (eFuse) is programmed, then the default name is WINC-00-00. + +@warning + The function called once after initialization.\n + Used for DHCP client hostname option (12).\n + Device name shall contain only characters allowed in valid internet host name as + defined in RFC 952 and 1123. + +@param[in] pu8DeviceName + Buffer holding the device name. Device name is a null terminated C string. + +@param[in] u8DeviceNameLength + Length of the device name. Should not exceed the maximum device name's + length @ref M2M_DEVICE_NAME_MAX (including null character). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. +*/ +int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP); + +@brief + Configures what NTP server the SNTP client should use. + +@details + Configures what NTP server the SNTP client should use. Only 1 server name can be provided, if the configured server name begins with an asterisk then it will be treated as a server pool. + The SNTP client can also use the NTP server provided by the DHCP server through option 42. + By default the NTP server provided by DHCP will be tried first, then the built-in default NTP server (time.nist.gov) will be used. + +@param[in] pu8NTPServerName + Buffer holding the NTP server name. If the first character is an asterisk (*) then it will be treated as a server pool, where the asterisk will + be replaced with an incrementing value from 0 to 3 each time a server fails (example: *.pool.ntp.org). + +@param[in] u8NTPServerNameLength + Length of the NTP server name. Should not exceed the maximum NTP server name length of @ref M2M_NTP_MAX_SERVER_NAME_LENGTH. + +@param[in] useDHCP + Explicity tell the WINC if it should use the NTP server provided by the DHCP server or not. + +@warning + SNTP should be configured before the connection takes place. If SNTP is configured after the device connects to a + network, the new configuration can take a minimum of 24h to be applied. However, it can take even longer since it is + triggered by DHCP renewal. + Currently there is also a known issue in which if the WINC obtains the NTP server from DHCP and then connects to a + different network, it will still use the NTP from the previous network. + Configuring a server name will overwrite the built-in default server until next reboot. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); + +@brief + Asynchronous API to set Wi-Fi listen interval for power save operation. + +@details + This is one of the two synchronous power-save setting functions that + allow the host MCU application to tweak the system power consumption. Such tweaking can be done by modifying the + Wi-Fi listen interval. The listen interval is how many beacon periods the station can sleep before it wakes up to receive data buffered in the AP. + It is represented in units of AP beacon periods(100ms). + +@warning + The function should be called once after initialization. + +@param[in] pstrM2mLsnInt + Structure holding the listen interval configuration. + +@pre + The function @ref m2m_wifi_set_sleep_mode shall be called first, to set the power saving mode required. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2mLsnInt + m2m_wifi_set_sleep_mode +*/ +int8_t m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt); + +/**@cond MON_DOC + */ +/*! +@ingroup WLANMON +@fn \ + int8_t m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *, uint8_t *, uint16_t , uint16_t); + +@brief + Asynchronous call to enable Wi-Fi monitoring (promiscuous receive) mode. + +@details + Wi-Fi monitoring mode (Promiscuous mode) enabling function. + This function enables the monitoring mode, thus allowing two operations to be + performed: + 1) Transmission of manually configured frames, through using the + @ref m2m_wifi_send_wlan_pkt function. + 2) Reception of frames based on a defined filtering criteria. + + Enabling monitoring mode allows for reception of all frames that satisfy the filter criteria in the input parameter and are received on the current wireless channel. + All packets that meet the filtering criteria are passed to the application layer, to + be handled by the assigned monitoring callback function. + The monitoring callback function must be implemented before starting the monitoring mode, + in-order to handle the packets received. + + A dedicated callback function, @ref tpfAppMonCb, must be registered to handle frames received in + promiscuous mode. This is done via an instance of a @ref tstrWifiInitParam structure and a call to + the @ref m2m_wifi_init function. + +@param[in] pstrMtrCtrl + Pointer to @ref tstrM2MWifiMonitorModeCtrl structure holding the filtering parameters. + +@param[in] pu8PayloadBuffer + Pointer to a Buffer allocated by the application. The buffer SHALL hold the Data field of + the WIFI RX Packet (Or a part from it). If it is set to NULL, the WIFI data payload will + be discarded by the monitoring driver. + +@param[in] u16BufferSize + The total size of the pu8PayloadBuffer in bytes. + +@param[in] u16DataOffset + Starting offset in the DATA FIELD of the received WIFI packet. The application may be interested + in reading specific information from the received packet. It must assign the offset to the starting + position of it relative to the DATA payload start.\n + \e Example, \e if \e the \e SSID \e is \e needed \e to \e be \e read \e from \e a \e PROBE \e REQ + \e packet, \e the \e u16Offset \e MUST \e be \e set \e to \e 0. + +@warning + This mode is available as sniffer ONLY, the WINC cannot be connected in any modes (Station, Access Point or P2P). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2MWifiMonitorModeCtrl + tstrM2MWifiRxPacketInfo + tstrWifiInitParam + tenuM2mScanCh + m2m_wifi_disable_monitoring_mode + m2m_wifi_send_wlan_pkt + m2m_wifi_send_ethernet_pkt + +@section WIFIExample10 Example + The example demonstrates the main function where-by the monitoring enable function is called after + the initialization of the driver and the packets are handled in the callback function. + +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +//Declare receive buffer +uint8_t gmgmt[1600]; + +//Callback functions +void wifi_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + ; +} + +void wifi_monitoring_cb(tstrM2MWifiRxPacketInfo *pstrWifiRxPacket, uint8_t *pu8Payload, uint16_t u16PayloadSize) +{ + if((NULL != pstrWifiRxPacket) && (0 != u16PayloadSize)) { + if(MANAGEMENT == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# MGMT PACKET #***\n"); + } else if(DATA_BASICTYPE == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# DATA PACKET #***\n"); + } else if(CONTROL == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# CONTROL PACKET #***\n"); + } + } +} + +int main() +{ + //Register wifi_monitoring_cb + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_cb; + param.pfAppMonCb = wifi_monitoring_cb; + + nm_bsp_init(); + + if(!m2m_wifi_init(¶m)) { + //Enable Monitor Mode with filter to receive all data frames on channel 1 + tstrM2MWifiMonitorModeCtrl strMonitorCtrl = {0}; + strMonitorCtrl.u8ChannelID = M2M_WIFI_CH_1; + strMonitorCtrl.u8FrameType = DATA_BASICTYPE; + strMonitorCtrl.u8FrameSubtype = M2M_WIFI_FRAME_SUB_TYPE_ANY; //Receive any subtype of data frame + m2m_wifi_enable_monitoring_mode(&strMonitorCtrl, gmgmt, sizeof(gmgmt), 0); + + while(1) { + m2m_wifi_handle_events(NULL); + } + } + return 0; +} +@endcode +*/ +int8_t m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8_t *pu8PayloadBuffer, + uint16_t u16BufferSize, uint16_t u16DataOffset); + +/*! +@ingroup WLANMON +@fn \ + int8_t m2m_wifi_disable_monitoring_mode(void); + +@brief + Asynchronous API to disable Wi-Fi monitoring (promiscuous receive) mode. + +@details + Disable Wi-Fi monitoring mode (Promiscuous mode). Expected to be called if the monitoring mode is already enabled, + but if it was called without enabling it, no negative impact will reside. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_monitoring_mode + */ +int8_t m2m_wifi_disable_monitoring_mode(void); + +/*! +@ingroup WLANMON +@fn \ + int8_t m2m_wifi_send_wlan_pkt(uint8_t *, uint16_t, uint16_t); + +@brief + Asynchronous API to queue a raw Wi-Fi packet for transmission by the WINC. + +@pre + Enable Monitoring mode first using @ref m2m_wifi_enable_monitoring_mode + +@note + The application is responsible for the packets. + +@warning + This function is only useful when operating in monitoring mode. + +@param[in] pu8WlanPacket + Pointer to a buffer holding the whole WIFI frame. + +@param[in] u16WlanHeaderLength + The size of the WIFI packet header ONLY. + +@param[in] u16WlanPktSize + The size of the whole packet in bytes. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_monitoring_mode + m2m_wifi_disable_monitoring_mode +*/ +int8_t m2m_wifi_send_wlan_pkt(uint8_t *pu8WlanPacket, uint16_t u16WlanHeaderLength, uint16_t u16WlanPktSize); +/**@endcond*/ //MON_DOC + +/*! +@ingroup WLANETH +@fn \ + int8_t m2m_wifi_send_ethernet_pkt(uint8_t* pu8Packet,uint16_t u16PacketSize); + +@brief + Asynchronous API to queue an Ethernet packet for transmission by the WINC. + +@details + Transmit a packet directly in ETHERNET/bypass mode where the TCP/IP stack is disabled + and the implementation of this packet is left to the application developer. + The Ethernet packet composition is left to the application developer. + +@note + Packets are the user's responsibility. + +@warning + This function available in ETHERNET/Bypass mode ONLY. Make sure that application defines ETH_MODE. + +@param[in] pu8Packet + Pointer to a buffer holding the whole Ethernet frame. + +@param[in] u16PacketSize + The size of the whole packet in bytes. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_mac_mcast + m2m_wifi_set_receive_buffer +*/ +int8_t m2m_wifi_send_ethernet_pkt(uint8_t *pu8Packet, uint16_t u16PacketSize); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_enable_sntp(uint8_t); + +@brief + Asynchronous API to enable or disable the native Simple Network Time Protocol(SNTP) client running on the WINC. + +@details + The SNTP client is enabled by default during chip initialization. This function can be used to + disable or subsequently re-enable the service. + + The service is capable of synchronizing the WINC system clock to the UTC time from a well-known + (and trusted) time server, for example "time.nist.gov". By default the SNTP client will update the + system time once every 24 hours. The ability to track the time accurately is important for various + applications such as checking expiry of X509 certificates during TLS (Transport Layer Security) + session establishment. + + It is highly recommended to leave SNTP enabled if there is no alternative source of timing + information. For systems including an RTC device, SNTP may not be needed and the WINC's time + may be set using the @ref m2m_wifi_set_system_time function. + +@param[in] bEnable + Enables or disables the SNTP service + '0' :disable SNTP + '1' :enable SNTP + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_set_system_time + */ +int8_t m2m_wifi_enable_sntp(uint8_t bEnable); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_set_system_time(uint32_t); + +@brief + Asynchronous function for setting the system time within the WINC. + +@details + Function for setting the system time in time/date format (@ref uint32_t). + The @ref tstrSystemTime structure can be used as a reference to the time values that + should be set and pass its value as @ref uint32_t. + +@param[in] u32UTCSeconds + Seconds elapsed since January 1, 1900 (NTP Timestamp). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_sntp + tstrSystemTime + +@note + If there is an RTC on the host MCU, the SNTP may be disabled and the host may set the system + time within the firmware using the API @ref m2m_wifi_set_system_time. + */ +int8_t m2m_wifi_set_system_time(uint32_t u32UTCSeconds); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_get_system_time(void); + +@brief + Asynchronous API to obtain the system time in use by the WINC. + +@details + This function will request the WINC to report its current system time to the application. The + information will arrive at the application via the @ref tpfAppWifiCb and event @ref M2M_WIFI_RESP_GET_SYS_TIME. + Response time retrieved is parsed into the members defined in the structure @ref tstrSystemTime. + +@note + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the @ref m2m_wifi_init API. + - The event @ref M2M_WIFI_RESP_GET_SYS_TIME must be handled in the callback. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_sntp + tstrSystemTime + */ +int8_t m2m_wifi_get_system_time(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_cust_InfoElement(uint8_t*); + +@brief + Asynchronous API to add or remove a user-defined Information Element. + +@details + This function allows the application to provide a custom Information Element to the + WINC that will be included in all beacon and probe response frames, while in Access Point mode. + If it is required to delete these IEs, fill the buffer with zeros. + +@param[in] pau8M2mCustInfoElement + Pointer to Buffer containing the IE to be used. It is the application developer's + responsibility to ensure on the correctness of the information element's ordering + passed in. + If the pointer is null, this removes any current custom IE. If non-null, the pointer + must reference data in the following format: + +@verbatim + --------------- ---------- ---------- ------------------- -------- -------- ----------- ----------------------- + | Byte[0] | Byte[1] | Byte[2] | Byte[3:length1+2] | ..... | Byte[n] | Byte[n+1] | Byte[n+2:lengthx+2] | + |---------------|----------|----------|-------------------|-------- --------|-----------|---------------------| + | #of all Bytes | IE1 ID | Length1 | Data1(Hex Coded) | ..... | IEx ID | Lengthx | Datax(Hex Coded) | + --------------- ---------- ---------- ------------------- -------- -------- ----------- ----------------------- +@endverbatim + +@warning + Size of All elements combined must not exceed 255 byte. + Used in Access Point Mode. + +@note + IEs Format will follow the above format. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_sntp + +@section WIFIExample11 Example + The example demonstrates how the information elements are set using this function. +@code +char elementData[21]; +static char state = 0; // To Add, Append, and Delete +if(0 == state) { //Add 3 IEs + state = 1; + //Total Number of Bytes + elementData[0]=12; + //First IE + elementData[1]=200; elementData[2]=1; elementData[3]='A'; + //Second IE + elementData[4]=201; elementData[5]=2; elementData[6]='B'; elementData[7]='C'; + //Third IE + elementData[8]=202; elementData[9]=3; elementData[10]='D'; elementData[11]=0; elementData[12]='F'; +} else if(1 == state) { + //Append 2 IEs to others, Notice that we keep old data in array starting with\n + //element 13 and total number of bytes increased to 20 + state = 2; + //Total Number of Bytes + elementData[0]=20; + //Fourth IE + elementData[13]=203; elementData[14]=1; elementData[15]='G'; + //Fifth IE + elementData[16]=204; elementData[17]=3; elementData[18]='X'; elementData[19]=5; elementData[20]='Z'; +} else if(2 == state) { //Delete All IEs + state = 0; + //Total Number of Bytes + elementData[0]=0; +} +m2m_wifi_set_cust_InfoElement(elementData); +@endcode + */ +int8_t m2m_wifi_set_cust_InfoElement(uint8_t *pau8M2mCustInfoElement); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode); + +@brief + Change the power profile mode. + +@param[in] u8PwrMode + Change the WINC power profile to different mode based on the enumeration @ref tenuM2mPwrMode.\n + Not implemented in WINC3400 firmware. + +@warning + May only be called after initialization, before any connection request, and may not be used to change + the power mode thereafter. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + tenuM2mPwrMode + m2m_wifi_init +*/ +int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel); + +@brief + Set the TX power tenuM2mTxPwrLevel. + +@param[in] u8TxPwrLevel + Change the TX power based on the enumeration @ref tenuM2mTxPwrLevel. + +@pre + Must be called after the initialization and before any connection request and can't be changed in runtime. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + tenuM2mTxPwrLevel + m2m_wifi_init +*/ +int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel); + +/*! +@ingroup WLANLOG +@fn \ + int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable); + +@brief + Enable or Disable logs in run time. + +@details + Enable or Disable logs in run time (Disable Firmware logs will enhance the firmware start-up time and performance). + +@param[in] u8Enable + Set 1 to enable the logs, 0 for disable. + +@pre + Must be called after initialization through the following function @ref m2m_wifi_init. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) + m2m_wifi_init +*/ +int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100); + +@brief + Set the battery voltage to update the firmware calculations.\n + Not implemented in WINC3400 firmware. + +@pre + Must be called after initialization through the following function @ref m2m_wifi_init. + +@param [in] u16BattVoltx100 + Battery voltage multiplied by 100 + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_init +*/ +int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100); + +/*! +@ingroup WLANETH +@fn \ + int8_t m2m_wifi_enable_mac_mcast(uint8_t *pu8MulticastMacAddress, uint8_t u8AddRemove); + +@brief + Asynchronous API to add or remove MAC addresses to the multicast filter. + +@details + This function will configure the WINC to receive/ignore multicast packets from certain + MAC address groups when operating in bypass mode. + This function requests the given MAC addresses to be added/removed from the multicast filter. + +@param[in] pu8MulticastMacAddress + Pointer to MAC address + +@param[in] u8AddRemove + A flag to add or remove the MAC ADDRESS, based on the following values: + - 0 : remove MAC address + - 1 : add MAC address + +@note + Maximum number of MAC addresses that could be added is 8. + +@warning + This function is available in ETHERNET/bypass mode ONLY. + Make sure that the application defines ETH_MODE. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_set_receive_buffer + m2m_wifi_send_ethernet_pkt + */ +int8_t m2m_wifi_enable_mac_mcast(uint8_t *pu8MulticastMacAddress, uint8_t u8AddRemove); + +/*! +@ingroup WLANETH +@fn \ + int8_t m2m_wifi_set_receive_buffer(void *pvBuffer, uint16_t u16BufferLen); + +@brief + Synchronous function for setting or modifying the receiver buffer's length. + +@details + Synchronous function for setting or modifying the receiver buffer's length. + In the ETHERNET/bypass mode the application should define a callback of type + @ref tpfAppEthCb, through which the application handles the received + ethernet frames. It is through this callback function that the user can + dynamically modify the length of the currently used receiver buffer. + +@param[in] pvBuffer + Pointer to Buffer to receive data. + NULL pointer causes a negative error @ref M2M_ERR_FAIL. + +@param[in] u16BufferLen + Length of data to be received. Maximum length of data should not exceed the size defined by TCP/IP + defined as @ref SOCKET_BUFFER_MAX_LENGTH + +@warning + This function is available in the Ethernet/bypass mode ONLY. Make sure that the application defines ETH_MODE. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_mac_mcast + m2m_wifi_send_ethernet_pkt +*/ +int8_t m2m_wifi_set_receive_buffer(void *pvBuffer, uint16_t u16BufferLen); + +/*! +@ingroup WLANCRYPTO +@fn \ + int8_t m2m_wifi_prng_get_random_bytes(uint8_t* pu8PrngBuff,uint16_t u16PrngSize); + +@brief + Asynchronous function for retrieving from the firmware a pseudo-random set of bytes. + +@details + Asynchronous function for retrieving from the firmware a pseudo-random set of bytes as specified in the size passed in as a parameter. + The registered wifi-cb function retrieves the random bytes through the response @ref M2M_WIFI_RESP_GET_PRNG + +@param[in] pu8PrngBuff + Pointer to a buffer to receive data. + +@param[in] u16PrngSize + Request size in bytes + +@warning + Size greater than the maximum specified (@ref M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)) + causes a negative error @ref M2M_ERR_FAIL. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +int8_t m2m_wifi_prng_get_random_bytes(uint8_t *pu8PrngBuff, uint16_t u16PrngSize); + +/*! +@ingroup WLANROAMING +@fn \ + int8_t m2m_wifi_enable_roaming(uint8_t bEnableDhcp); + +@brief + Enable WiFi STA roaming. + +@details + m2m_wifi_enable_roaming enables the firmware to trigger the roaming algorithm/steps on link loss with the current AP. + If roaming is successful, the @ref M2M_WIFI_RESP_CON_STATE_CHANGED message with state as @ref M2M_WIFI_ROAMED is sent to the host. + Additionally a @ref M2M_WIFI_REQ_DHCP_CONF message with new DHCP lease details is sent to host (only if bEnableDhcp=1). + If roaming is unsuccessful, a @ref M2M_WIFI_RESP_CON_STATE_CHANGED message with state as @ref M2M_WIFI_DISCONNECTED is sent to host. + +@param[in] bEnableDhcp + 0 : Disables DHCP client execution after roaming to new AP + 1 : Enables DHCP client execution after roaming to new AP + +@pre + Must be called after the initialization. + The roaming algorithm/procedure is internal to the firmware. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +@see + m2m_wifi_init +*/ +int8_t m2m_wifi_enable_roaming(uint8_t bEnableDhcp); + +/*! +@ingroup WLANROAMING +@fn \ + int8_t m2m_wifi_disable_roaming(void); + +@brief + Disable WiFi STA roaming. + +@pre + Must be called after the initialization. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +@see + m2m_wifi_init +*/ +int8_t m2m_wifi_disable_roaming(void); + +/*! +@ingroup WLANINIT +@fn \ + uint8_t m2m_wifi_get_state(void); + +@brief + Get the wifi state. + +@return + The function returns the current wifi state (see @ref tenuWifiState for the possible states). + +@note + Check the WINC state. See @ref tenuWifiState for possible states.\n + @ref WIFI_STATE_INIT state represents WINC initialized but not started, this is a suitable state + for safe flash access. + +@sa + m2m_wifi_init + m2m_wifi_download_mode +*/ +uint8_t m2m_wifi_get_state(void); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_ble_api_send(const uint8_t* const msg, const uint32_t len); + +@brief + Asynchronous API to send an encapsulated Atmel BLE message over the Wifi Host Interface. + +@param[in] msg + Pointer to the start of the BLE message to transfer down to the WINC. + +@param[in] len + The length of the message in octets. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + */ +int8_t m2m_wifi_ble_api_send(uint8_t *msg, uint32_t len); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_ble_set_gain_table(uint8_t table_idx); + +@brief + Asynchronous API that notifies the WINC with the Gain Table index from Flash that should use to configure the WiFi and BLE gains. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ +int8_t m2m_wifi_ble_set_gain_table(uint8_t table_idx); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_req_restrict_ble(void); + +@brief + Asynchronous API to request restricting of BLE functionality by placing the BLE processor in a low power state. + It is recommended to do this if it is known that BLE functionality will not be used for any significant length of time. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the @ref m2m_wifi_init API. +*/ +int8_t m2m_wifi_req_restrict_ble(void); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_req_unrestrict_ble(void); + +@brief + Asynchronous API to request un-restricting of BLE functionality by reverting the BLE processor to full power mode. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the @ref m2m_wifi_init API. +*/ +int8_t m2m_wifi_req_unrestrict_ble(void); + +/** @defgroup VERSION Version + @brief + Describes the APIs for reading the version information of the WINC firmware. + @{ + @defgroup VERSIONDEF Defines + @brief + Specifies the macros and defines used by the version APIs. + + @defgroup VERSIONAPI Functions + @brief + Lists the APIs for reading the version information of the WINC firmware. + @} + */ + +/*! +@ingroup VERSIONAPI +@fn \ + int8_t m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev); + +@brief + Synchronous API to obtain the firmware version currently running on the WINC. + +@details + Get the Firmware version info from the active partition, as defined in the structure @ref tstrM2mRev. + +@param[out] pstrRev + Pointer to a variable of type @ref tstrM2mRev, which contains the firmware version parameters. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre + Must be called after initialization through the following function @ref m2m_wifi_init. + +@sa + m2m_wifi_init +*/ +int8_t m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev); + +/*! +@ingroup VERSIONAPI +@fn \ + int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC. + +@param[out] pstrRev + Pointer to variable of type @ref tstrM2mRev which contains the ota fw version parameters. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +/*! +@fn \ + uint32_t m2m_wifi_get_chipId(void) + +@brief + Synchronous API to obtain the firmware WINC chip ID. + +@return + The function returns chipID > 0 or 0 for failure. +*/ +uint32_t m2m_wifi_get_chipId(void); + +/*! +@ingroup OTAFUNCTIONS +@fn int8_t m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC. + +@return + The function returns @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +int8_t m2m_wifi_check_ota_rb(void); + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_WIFI_H__ */ + diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/nmasic.h b/ChaletLora.X/Source/winc3400_142/driver/include/nmasic.h new file mode 100644 index 0000000..5b20c40 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/nmasic.h @@ -0,0 +1,148 @@ +/******************************************************************************* + This module contains WINC3400 ASIC specific internal APIs. + + File Name: + nmasic.h + + Summary: + This module contains WINC3400 ASIC specific internal APIs. + + Description: + This module contains WINC3400 ASIC specific internal APIs. + *******************************************************************************/ + +//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. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMASIC_H_ +#define _NMASIC_H_ + +#include "nm_common.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define rNMI_GP_REG_0 (0x149c) +#define rNMI_GP_REG_1 (0x14A0) +#define rNMI_GLB_RESET (0x1400) +#define rNMI_BOOT_RESET_MUX (0x1118) +#define NMI_STATE_REG (0x108c) +#define BOOTROM_REG (0xc000c) +#define NMI_REV_REG (0x207ac) /*Also, Used to load ATE firmware from SPI Flash and to ensure that it is running too*/ +#define M2M_WAIT_FOR_HOST_REG (0x207bc) +#define M2M_FINISH_INIT_STATE 0x02532636UL +#define M2M_FINISH_BOOT_ROM 0x10add09eUL +#define M2M_START_FIRMWARE 0xef522f61UL +#define M2M_START_PS_FIRMWARE 0x94992610UL + +#define M2M_ATE_FW_START_VALUE (0x3C1CD57D) /*Also, Change this value in boot_firmware if it will be changed here*/ +#define M2M_ATE_FW_IS_UP_VALUE (0xD75DC1C3) /*Also, Change this value in ATE (Burst) firmware if it will be changed here*/ + +#define REV_2B0 (0x2B0) +#define REV_B0 (0x2B0) +#define REV_3A0 (0x3A0) +#define CHIP_ID_3000D (0x3000D0) + +#define GET_CHIPID() nmi_get_chipid() +#define ISNMC1000(id) (((id & 0xfffff000) == 0x100000) ? 1 : 0) +#define ISNMC1500(id) (((id & 0xfffff000) == 0x150000) ? 1 : 0) +#define ISNMC3400(id) (((id & 0xfff0f000) == 0x300000) ? 1 : 0) +#define REV(id) ( ((id) & 0x00000fff ) ) +#define EFUSED_MAC(value) (value & 0xffff0000) + +#define rHAVE_SDIO_IRQ_GPIO_BIT (NBIT0) +#define rHAVE_USE_PMU_BIT (NBIT1) +#define rHAVE_SLEEP_CLK_SRC_RTC_BIT (NBIT2) +#define rHAVE_SLEEP_CLK_SRC_XO_BIT (NBIT3) +#define rHAVE_EXT_PA_INV_TX_RX (NBIT4) +#define rHAVE_LEGACY_RF_SETTINGS (NBIT5) +#define rHAVE_LOGS_DISABLED_BIT (NBIT6) +#define rHAVE_ETHERNET_MODE_BIT (NBIT7) + +typedef struct { + uint32_t u32Mac_efuse_mib; + uint32_t u32Firmware_Ota_rev; +} tstrGpRegs; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_clkless_wake + * @brief Wakeup the chip using clockless registers + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_clkless_wake(void); + +int8_t chip_wake(void); + +int8_t chip_sleep(void); + +void chip_idle(void); + +void enable_rf_blocks(void); + +int8_t enable_interrupts(void); + +int8_t cpu_start(void); + +uint32_t nmi_get_chipid(void); + +uint32_t nmi_get_rfrevid(void); + +void restore_pmu_settings_after_global_reset(void); + +void nmi_update_pll(void); + +void nmi_set_sys_clk_src_to_xo(void); + +int8_t chip_reset(void); + +int8_t wait_for_bootrom(uint8_t); + +int8_t wait_for_firmware_start(uint8_t); + +int8_t chip_deinit(void); + +int8_t chip_reset_and_cpu_halt(void); + +int8_t set_gpio_dir(uint8_t gpio, uint8_t dir); + +int8_t set_gpio_val(uint8_t gpio, uint8_t val); + +int8_t get_gpio_val(uint8_t gpio, uint8_t* val); + +int8_t pullup_ctrl(uint32_t pinmask, uint8_t enable); + +int8_t nmi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t * pu8IsValid); + +int8_t nmi_get_mac_address(uint8_t *pu8MacAddr); + +int8_t chip_apply_conf(uint32_t u32conf); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMASIC_H_*/ diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/nmbus.h b/ChaletLora.X/Source/winc3400_142/driver/include/nmbus.h new file mode 100644 index 0000000..dd13e9a --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/nmbus.h @@ -0,0 +1,137 @@ +/******************************************************************************* + This module contains WINC3400 bus APIs implementation. + + File Name: + nmbus.h + + Summary: + This module contains WINC3400 bus APIs implementation. + + Description: + This module contains WINC3400 bus APIs implementation. + *******************************************************************************/ + +//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. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMBUS_H_ +#define _NMBUS_H_ + +#include "nm_common.h" + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_init(void *pvInitVal); + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_deinit(void); + +/** + * @fn nm_bus_reset + * @brief Reset bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +int8_t nm_bus_reset(void); + +/** + * @fn nm_bus_iface_reconfigure + * @brief Reconfigure bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_reconfigure(void *ptr); + +/** + * @fn nm_read_reg + * @brief Read register + * @param[in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_read_reg(uint32_t u32Addr); + +/** + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param[in] u32Addr + * Register address + * @param[out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal); + +/** + * @fn nm_write_reg + * @brief Write register + * @param[in] u32Addr + * Register address + * @param[in] u32Val + * Value to be written to the register + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_reg(uint32_t u32Addr, uint32_t u32Val); + +/** + * @fn nm_read_block + * @brief Read block of data + * @param[in] u32Addr + * Start address + * @param[out] puBuf + * Pointer to a buffer used to return the read data + * @param[in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_read_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz); + +/** + * @fn nm_write_block + * @brief Write block of data + * @param[in] u32Addr + * Start address + * @param[in] puBuf + * Pointer to the buffer holding the data to be written + * @param[in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMBUS_H_ */ diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/nmdrv.h b/ChaletLora.X/Source/winc3400_142/driver/include/nmdrv.h new file mode 100644 index 0000000..063e624 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/nmdrv.h @@ -0,0 +1,176 @@ +/******************************************************************************* + This module contains WINC3400 M2M driver APIs declarations. + + File Name: + nmdrv.h + + Summary: + This module contains WINC3400 M2M driver APIs declarations. + + Description: + This module contains WINC3400 M2M driver APIs declarations. + *******************************************************************************/ + +//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. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMDRV_H_ +#define _NMDRV_H_ + +#include "nm_common.h" + +/*! +@enum \ + tenuNmState +@brief + Enumeration for WINC state + The following is used to track the state of the WINC (not initialized, initialized or started) + +@remarks + This is useful when putting the WINC in "download mode" to access the flash via SPI. By using + @ref nm_get_state and checking against the desired state, it is possible to validate whether + it is safe to proceed with SPI Flash access. +*/ +typedef enum { + NM_STATE_DEINIT, + /*!< WINC is not initialized */ + NM_STATE_INIT, + /*!< WINC has been initialized. SPI flash access is possible. */ + NM_STATE_START, + /*!< WINC has started */ +} tenuNmState; + +/** +* @struct tstrM2mRev +* @brief Structure holding firmware version parameters and build date/time +*/ +typedef struct { + uint16_t u16FirmwareHifInfo; /* Fw HIF Info */ + uint8_t u8FirmwareMajor; /* Version Major Number */ + uint8_t u8FirmwareRsvd; /* Reserved */ + uint8_t u8FirmwareMinor; /* Version Minor */ + uint8_t u8FirmwarePatch; /* Patch Number */ + uint8_t BuildDate[sizeof(__DATE__)]; // 12 bytes + uint8_t BuildTime[sizeof(__TIME__)]; // 9 bytes +} tstrM2mRev; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo); + * @brief Get Hif info of images in both partitions (Firmware and Ota). + * @param[out] pu16FwHifInfo + * Pointer holding Hif info of image in the active partition. + * @param[out] pu16OtaHifInfo + * Pointer holding Hif info of image in the inactive partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo); + +/** + * @fn nm_get_firmware_full_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param[out] pstrRev + * Pointer holds address of structure @ref tstrM2mRev that contains the version parameters + * of image in the active partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_firmware_full_info(tstrM2mRev* pstrRev); + +/** + * @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param[out] pstrRev + * Pointer holds address of structure @ref tstrM2mRev that contains the version parameters + * of image in the inactive partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_ota_firmware_info(tstrM2mRev* pstrRev); + +/** + * @fn nm_drv_init_download_mode + * @brief Initialize NMC1000 driver in download mode + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_download_mode(void); + +/** + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @param[in] arg + * Generic argument passed on to nm_drv_init_start + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init(void* arg); + +/** + * @fn nm_drv_init_hold + * @brief First part of nm_drv_init, up to the point of initializing spi for flash access. + * @see nm_drv_init + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_hold(void); + +/** + * @fn nm_drv_init_start + * @brief Second part of nm_drv_init, continuing from where nm_drv_init_hold left off. + * @see nm_drv_init + * @param[in] arg + * Parameter inherited from nm_drv_init + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_start(void* arg); + +/** + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + * @param[in] arg + * Generic argument unused. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_deinit(void* arg); + +/** + * @fn nm_cpu_start(void) + * @brief Start CPU from the WINC module + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_cpu_start(void); + +/** + * @fn nm_get_state(void) + * @brief Get the current state of the WINC module + * @return The current state of the WINC module + */ +tenuNmState nm_get_state(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMDRV_H_*/ + + diff --git a/ChaletLora.X/Source/winc3400_142/driver/include/nmspi.h b/ChaletLora.X/Source/winc3400_142/driver/include/nmspi.h new file mode 100644 index 0000000..75fd0e8 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/include/nmspi.h @@ -0,0 +1,137 @@ +/******************************************************************************* + This module contains WINC3400 SPI protocol bus APIs implementation. + + File Name: + nmspi.h + + Summary: + This module contains WINC3400 SPI protocol bus APIs implementation. + + Description: + This module contains WINC3400 SPI protocol bus APIs implementation. + *******************************************************************************/ + +//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. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMSPI_H_ +#define _NMSPI_H_ + +#include "nm_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @fn nm_spi_init + * @brief Initialize the SPI + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_spi_init(void); + +/** +* @fn nm_spi_lock_init +* @brief Initialize the SPI lock +* @return None +*/ +void nm_spi_lock_init(void); + +/** + * @fn nm_spi_reset + * @brief Reset the SPI + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_reset(void); + +/** + * @fn nm_spi_deinit + * @brief DeInitialize the SPI + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_deinit(void); + +/** + * @fn nm_spi_read_reg + * @brief Read register + * @param[in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_spi_read_reg(uint32_t u32Addr); + +/** + * @fn nm_spi_read_reg_with_ret + * @brief Read register with error code return + * @param[in] u32Addr + * Register address + * @param[out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal); + +/** + * @fn nm_spi_write_reg + * @brief Write register + * @param[in] u32Addr + * Register address + * @param[in] u32Val + * Value to be written to the register + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_reg(uint32_t u32Addr, uint32_t u32Val); + +/** + * @fn nm_spi_read_block + * @brief Read block of data + * @param[in] u32Addr + * Start address + * @param[out] puBuf + * Pointer to a buffer used to return the read data + * @param[in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz); + +/** + * @fn nm_spi_write_block + * @brief Write block of data + * @param[in] u32Addr + * Start address + * @param[in] puBuf + * Pointer to the buffer holding the data to be written + * @param[in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMSPI_H_ */ diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/m2m_flash.c b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_flash.c new file mode 100644 index 0000000..3ff97dc --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_flash.c @@ -0,0 +1,354 @@ +/******************************************************************************* + File Name: + m2m_flash.c + + Summary: + This module contains the WINC flash interface. + + Description: + This module contains the WINC flash 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 "m2m_flash.h" +#include "spi_flash.h" +#include "spi_flash_map.h" +#include "nmdrv.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +TYPEDEFS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +typedef struct +{ + uint32_t address; + uint32_t size; +} tstrFlashMapEntry; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static const tstrFlashMapEntry flashMap[] = +{ + {0 , 0 }, // WINC_FLASH_REGION_RAW, + {0 , OTA_IMAGE_SIZE }, // WINC_FLASH_REGION_FIRMWARE_ACTIVE, + {0 , OTA_IMAGE_SIZE }, // WINC_FLASH_REGION_FIRMWARE_INACTIVE, + {M2M_PLL_FLASH_OFFSET , M2M_PLL_FLASH_SZ }, // WINC_FLASH_REGION_PLL_TABLE, + {M2M_GAIN_FLASH_OFFSET , M2M_GAIN_FLASH_SZ }, // WINC_FLASH_REGION_GAIN_TABLE, + {M2M_PLL_FLASH_OFFSET , M2M_PLL_FLASH_SZ+M2M_GAIN_FLASH_SZ}, // WINC_FLASH_REGION_PLL_AND_GAIN_TABLES, + {M2M_TLS_ROOTCER_FLASH_OFFSET , M2M_TLS_ROOTCER_FLASH_SZ }, // WINC_FLASH_REGION_ROOT_CERTS, + {M2M_TLS_SERVER_FLASH_OFFSET , M2M_TLS_SERVER_FLASH_SZ }, // WINC_FLASH_REGION_LOCAL_CERTS, + {M2M_CACHED_CONNS_FLASH_OFFSET , M2M_CACHED_CONNS_FLASH_SZ }, // WINC_FLASH_REGION_CONN_PARAM, + {0 , M2M_HTTP_MEM_FLASH_SZ }, // WINC_FLASH_REGION_HTTP_FILES, +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static int8_t winc_flash_compare(uint8_t *pu8Buf, uint32_t u32Offset, uint32_t u32Size) +{ + int8_t ret = M2M_SUCCESS; + uint8_t buf[128]; + uint32_t offset = 0; + + while(offset < u32Size) + { + uint32_t chunk_sz = sizeof(buf); + if(chunk_sz > u32Size - offset) + chunk_sz = u32Size - offset; + ret = spi_flash_read(buf, u32Offset + offset, chunk_sz); + if(ret != M2M_SUCCESS) + break; + ret = memcmp(buf, pu8Buf + offset, chunk_sz); + if(ret != 0) + break; + offset += chunk_sz; + } + return ret; +} +static int8_t winc_flash_write_verify(uint8_t *pu8Buf, uint32_t u32Offset, uint32_t u32Size) +{ + int8_t ret = M2M_ERR_FAIL; + uint8_t count = 20; + + while((ret != M2M_SUCCESS) && (count-- > 0)) + { + ret = spi_flash_write(pu8Buf, u32Offset, u32Size); + if(ret == M2M_SUCCESS) + ret = winc_flash_compare(pu8Buf, u32Offset, u32Size); + } + return ret; +} + +/* Some internal functions for accessing the control structure. */ +static uint8_t crc7(uint8_t crc, const uint8_t *buff, uint16_t len) +{ + uint8_t reg = crc; + uint16_t i; + for(i = 0; i < len; i++) + { + uint16_t g; + for(g = 0; g < 8; g++) + { + uint8_t inv = (((buff[i] << g) & 0x80) >> 7) ^ ((reg >> 6) & 1); + reg = ((reg << 1) & 0x7f) ^ (9 * inv); + } + } + return reg; +} +static int8_t verify_control_structure(tstrOtaControlSec *pstrControlSec) +{ + int8_t s8Ret = M2M_SUCCESS; + + if(pstrControlSec->u32OtaMagicValue != OTA_MAGIC_VALUE) + s8Ret = M2M_ERR_FAIL; + if(pstrControlSec->u32OtaControlSecCrc != crc7(0x7f, (uint8_t *)pstrControlSec, sizeof(tstrOtaControlSec) - 4)) + s8Ret = M2M_ERR_FAIL; + + return s8Ret; +} +static int8_t read_control_structure(tstrOtaControlSec *pstrControlSec) +{ + int8_t s8Ret; + + s8Ret = spi_flash_read((uint8_t *)pstrControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if(s8Ret == M2M_SUCCESS) + s8Ret = verify_control_structure(pstrControlSec); + + if(s8Ret != M2M_SUCCESS) + { + s8Ret = spi_flash_read((uint8_t *)pstrControlSec, M2M_BACKUP_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if(s8Ret == M2M_SUCCESS) + s8Ret = verify_control_structure(pstrControlSec); + } + + return s8Ret; +} +static int8_t update_control_structure(tstrOtaControlSec *pstrControlSec) +{ + int8_t ret = M2M_ERR_FAIL; + + ret = spi_flash_erase(M2M_BACKUP_FLASH_OFFSET, M2M_BACKUP_FLASH_SZ); + if(ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8_t *)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8_t *)pstrControlSec, M2M_BACKUP_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if(ret == M2M_SUCCESS) + { + ret = spi_flash_erase(M2M_CONTROL_FLASH_OFFSET, M2M_CONTROL_FLASH_SZ); + if(ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8_t *)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8_t *)pstrControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + } + } + } + return ret; +} + +static bool find_flash_section(tenuWincFlashRegion enuRegion, uint32_t *pu32StartAddr, uint32_t *pu32Size) +{ + /* Ensure the pointers and region are valid. */ + if((NULL == pu32StartAddr) || (NULL == pu32Size) || (enuRegion >= WINC_FLASH_NUM_REGIONS)) + return false; + + /* For the raw region resolve the full flash space, otherwise lookup + the region location and size from the flexible flash map. */ + switch(enuRegion) + { + case WINC_FLASH_REGION_RAW: + *pu32StartAddr = 0; + *pu32Size = spi_flash_get_size() << 17; + break; + case WINC_FLASH_REGION_FIRMWARE_ACTIVE: + case WINC_FLASH_REGION_FIRMWARE_INACTIVE: + case WINC_FLASH_REGION_HTTP_FILES: + { + /* In these cases we need to read the control structure to find the appropriate flash address. */ + tstrOtaControlSec strControl; + + /* Check the WINC is initialised and not running. */ + if (NM_STATE_INIT != nm_get_state()) + return false; + + /* Read control structure from flash. */ + if (M2M_SUCCESS != read_control_structure(&strControl)) + return false; + + if (WINC_FLASH_REGION_FIRMWARE_INACTIVE == enuRegion) + *pu32StartAddr = strControl.u32OtaRollbackImageOffset; + else if (WINC_FLASH_REGION_FIRMWARE_ACTIVE == enuRegion) + *pu32StartAddr = strControl.u32OtaCurrentWorkingImagOffset; + else if (WINC_FLASH_REGION_HTTP_FILES == enuRegion) + *pu32StartAddr = strControl.u32OtaCurrentWorkingImagOffset + (M2M_HTTP_MEM_FLASH_OFFSET - M2M_OTA_IMAGE1_OFFSET); + + *pu32Size = flashMap[enuRegion].size; + break; + } + default: + *pu32StartAddr = flashMap[enuRegion].address; + *pu32Size = flashMap[enuRegion].size; + break; + } + + M2M_INFO("Flash lookup %2d: 0x%06" PRIx32 " %0" PRId32 "\r\n", enuRegion, *pu32StartAddr, *pu32Size); + + return true; +} + +int8_t m2m_flash_erase_sector(tenuWincFlashRegion enuRegion, uint8_t u8StartSector, uint8_t u8NumSectors) +{ + uint32_t flashAddress; + uint32_t flashRegionSize; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Check the region is valid. */ + if(enuRegion >= WINC_FLASH_NUM_REGIONS) + return M2M_ERR_INVALID_ARG; + + /* Find region address and size. */ + if(false == find_flash_section(enuRegion, &flashAddress, &flashRegionSize)) + return M2M_ERR_FAIL; + + /* Erase is only supported for regions which begin on a sector boundary. */ + if(flashAddress & (FLASH_SECTOR_SZ-1)) + return M2M_ERR_INVALID_ARG; + + /* Check requested size fits within region size. */ + if((((uint32_t)u8StartSector + u8NumSectors) * FLASH_SECTOR_SZ) > flashRegionSize) + return M2M_ERR_FAIL; + + /* Find start address of area within requested region. */ + flashAddress += (u8StartSector * FLASH_SECTOR_SZ); + + /* Erase the requested sectors. */ + if(M2M_SUCCESS != spi_flash_erase(flashAddress, u8NumSectors * FLASH_SECTOR_SZ)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +int8_t m2m_flash_write(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size) +{ + uint32_t flashAddress; + uint32_t flashRegionSize; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Check the buffer pointer and region are valid. */ + if((NULL == pvBuffer) || (enuRegion >= WINC_FLASH_NUM_REGIONS)) + return M2M_ERR_INVALID_ARG; + + /* Find region address and size. */ + if(false == find_flash_section(enuRegion, &flashAddress, &flashRegionSize)) + return M2M_ERR_FAIL; + + /* Check requested size fits within region size. Also check for wraparound. */ + if(((u32Offset + u32Size) > flashRegionSize) || ((uint32_t)(u32Offset + u32Size) < u32Offset)) + return M2M_ERR_FAIL; + + /* Find start address of area within requested region. */ + flashAddress += u32Offset; + + /* Write data to flash. */ + if(M2M_SUCCESS != spi_flash_write(pvBuffer, flashAddress, u32Size)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +int8_t m2m_flash_read(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size) +{ + uint32_t flashAddress; + uint32_t flashRegionSize; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Check the buffer pointer and region are valid. */ + if((NULL == pvBuffer) || (enuRegion >= WINC_FLASH_NUM_REGIONS)) + return M2M_ERR_INVALID_ARG; + + /* Find region address and size. */ + if(false == find_flash_section(enuRegion, &flashAddress, &flashRegionSize)) + return M2M_ERR_FAIL; + + /* Check requested size fits within region size. Also check for wraparound. */ + if(((u32Offset + u32Size) > flashRegionSize) || ((uint32_t)(u32Offset + u32Size) < u32Offset)) + return M2M_ERR_FAIL; + + /* Find start address of area within requested region. */ + flashAddress += u32Offset; + + /* Read data from flash. */ + if(M2M_SUCCESS != spi_flash_read(pvBuffer, flashAddress, u32Size)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +int8_t m2m_flash_switch_firmware(void) +{ + tstrOtaControlSec strControl; + uint32_t u32Tmp; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Read control structure from flash. */ + if(M2M_SUCCESS != read_control_structure(&strControl)) + return M2M_ERR_FAIL; + + /* Switch active and inactive. */ + u32Tmp = strControl.u32OtaRollbackImageOffset; + strControl.u32OtaRollbackImageOffset = strControl.u32OtaCurrentWorkingImagOffset; + strControl.u32OtaCurrentWorkingImagOffset = u32Tmp; + + /* Ensure the inactive image is marked as invalid. This protects m2m_ota_switch_firmware from + switching to an image whose validity is unknown. Switching remains possible via this API. */ + strControl.u32OtaRollbackImageValidStatus = OTA_STATUS_INVALID; + + if(M2M_SUCCESS != update_control_structure(&strControl)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +//DOM-IGNORE-END diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/m2m_hif.c b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_hif.c new file mode 100644 index 0000000..774645b --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_hif.c @@ -0,0 +1,857 @@ +/******************************************************************************* + File Name: + m2m_hif.c + + Summary: + This module contains M2M host interface API implementations. + + Description: + This module contains M2M host interface API implementations. + *******************************************************************************/ + +//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. +*******************************************************************************/ + +#include "nm_common.h" +#include "nmbus.h" +#include "nmdrv.h" +#include "nm_bsp.h" +#include "m2m_hif.h" +#include "m2m_types.h" +#include "nmasic.h" +#include "m2m_periph.h" +//#include "wdrv_winc_common.h" +//#include "osal/osal.h" + +#define NMI_AHB_DATA_MEM_BASE 0x30000 +#define NMI_AHB_SHARE_MEM_BASE 0xd0000 + +#define WIFI_HOST_RCV_CTRL_0 (0x1070) +#define WIFI_HOST_RCV_CTRL_1 (0x1084) +#define WIFI_HOST_RCV_CTRL_2 (0x1078) +#define WIFI_HOST_RCV_CTRL_3 (0x106c) +#define WIFI_HOST_RCV_CTRL_4 (0x150400) + + +#define INTERRUPT_CORTUS_0_3000D0 (0x10a8) +#define INTERRUPT_CORTUS_1_3000D0 (0x10ac) +#define INTERRUPT_CORTUS_2_3000D0 (0x10b0) +#define INTERRUPT_CORTUS_3_3000D0 (0x10b4) + +//static OSAL_SEM_HANDLE_TYPE hifSemaphore; + +typedef struct { + uint8_t u8ChipMode; + uint8_t u8ChipSleep; + uint8_t u8HifRXDone; + uint8_t u8Interrupt; + uint32_t u32RxAddr; + uint32_t u32RxSize; + tpfHifCallBack pfWifiCb; + tpfHifCallBack pfIpCb; + tpfHifCallBack pfOtaCb; + tpfHifCallBack pfSigmaCb; + tpfHifCallBack pfHifCb; + //tpfHifCallBack pfCryptoCb; + tpfHifCallBack pfSslCb; +} tstrHifContext; + +volatile tstrHifContext gstrHifCxt; + +/* + Special codes for managing HIF restriction to OTA rollback/switch only +*/ +#define HIF_OTA_RB_ONLY 0xFFFF +#define HIFCODE_OTA_RB ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_ROLLBACK) +#define HIFCODE_OTA_SW ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_SWITCH_FIRMWARE) +/* + Codes for new HIF messages (since last HIF major increase). + Only need ones which are host->winc. + Each entry is formed of ((GroupId << 8) | OpCode) +*/ +#define HIFCODE_SSL_WRITECERT ((M2M_REQ_GROUP_SSL << 8) | M2M_SSL_REQ_WRITE_OWN_CERTS) +#define HIFCODE_WIFI_PASSIVESCAN ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_PASSIVE_SCAN) +#define HIFCODE_WIFI_CONN ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_CONN) +#define HIFCODE_WIFI_CONN_PARAM ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_IND_CONN_PARAM) +#define HIFCODE_WIFI_DELETE_CRED ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQRSP_DELETE_APID) +#define HIFCODE_WIFI_START_PROV_MODE ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_START_PROVISION_MODE) +#define HIFCODE_WIFI_ENABLE_AP ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_ENABLE_AP) +#define HIFCODE_IP_RAW_SOCK_OPT ((M2M_REQ_GROUP_IP << 8) | SOCKET_CMD_RAW_SET_SOCK_OPT) +#define HIFCODE_WIFI_ROAMING ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_ROAMING) +#define HIFCODE_IP_SECURE ((M2M_REQ_GROUP_IP << 8) | SOCKET_CMD_SECURE) +#define HIFCODE_WIFI_SCAN_SSID_LIST ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_SCAN_SSID_LIST) +#define HIFCODE_WIFI_SET_STOP_SCAN_OPTION ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_SET_STOP_SCAN_OPTION) + +/* + List of new HIF messages (since last HIF major increase). + Only need to list ones which are host->winc. + Additionally, entry 0 used to indicate OTA RB/SW only. +*/ +#define NEW_HIF_LIST \ + HIF_OTA_RB_ONLY, \ + HIFCODE_SSL_WRITECERT, \ + HIFCODE_WIFI_PASSIVESCAN, \ + HIFCODE_WIFI_CONN, \ + HIFCODE_WIFI_CONN_PARAM, \ + HIFCODE_WIFI_DELETE_CRED, \ + HIFCODE_WIFI_START_PROV_MODE, \ + HIFCODE_WIFI_ENABLE_AP, \ + HIFCODE_IP_RAW_SOCK_OPT, \ + HIFCODE_WIFI_ROAMING, \ + HIFCODE_IP_SECURE, \ + HIFCODE_WIFI_SCAN_SSID_LIST, \ + HIFCODE_WIFI_SET_STOP_SCAN_OPTION +/* + Array of HIF messages which are not supported by Firmware. + During hif_init() this array is rebased using an offset determined by Firmware HIF level. +*/ +static uint16_t gau16HifBlacklist[] = {NEW_HIF_LIST}; +#define HIF_BLACKLIST_SZ (sizeof(gau16HifBlacklist)/sizeof(gau16HifBlacklist[0])) +static uint8_t gu8HifBlOffset = 0; + + +static int8_t hif_set_rx_done(void) +{ + uint32_t reg; + int8_t ret = M2M_SUCCESS; + gstrHifCxt.u8HifRXDone = 0; + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_0_3000D0, 1); + if(ret != M2M_SUCCESS)goto ERR1; + } else { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(ret != M2M_SUCCESS)goto ERR1; + + /* Set RX Done */ + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + +ERR1: + return ret; +} + +/** + * @fn static void m2m_hif_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) + * @brief WiFi call back function + * @param[in] u8OpCode + * HIF Opcode type. + * @param[in] u16DataSize + * HIF data length. + * @param[in] u32Addr + * HIF address. + */ +static void m2m_hif_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ +} + +/** + * @fn int8_t hif_chip_wake(void); + * @brief To Wakeup the chip. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_chip_wake(void) +{ + int8_t ret = M2M_SUCCESS; + if(gstrHifCxt.u8HifRXDone) + { + /* chip already wake for the rx not done no need to send wake request */ + return ret; + } + if(gstrHifCxt.u8ChipSleep == 0) + { + if(gstrHifCxt.u8ChipMode != M2M_NO_PS) + { + ret = chip_wake(); + if(ret != M2M_SUCCESS)goto ERR1; + } + } + gstrHifCxt.u8ChipSleep++; +ERR1: + return ret; +} +/*! +@fn \ + void hif_set_sleep_mode(uint8_t u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8_t u8Pstype) +{ + gstrHifCxt.u8ChipMode = u8Pstype; +} + +/*! +@fn \ + uint8_t hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ +uint8_t hif_get_sleep_mode(void) +{ + return gstrHifCxt.u8ChipMode; +} + +/** + * @fn int8_t hif_chip_sleep_sc(void); + * @brief To clear the chip sleep but keep the chip sleep + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +static int8_t hif_chip_sleep_sc(void) +{ + if(gstrHifCxt.u8ChipSleep >= 1) + { + gstrHifCxt.u8ChipSleep--; + } + return M2M_SUCCESS; +} + + +/** + * @fn int8_t hif_chip_sleep(void); + * @brief To make the chip sleep. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_chip_sleep(void) +{ + int8_t ret = M2M_SUCCESS; + + if(gstrHifCxt.u8ChipSleep >= 1) + { + gstrHifCxt.u8ChipSleep--; + } + + if(gstrHifCxt.u8ChipSleep == 0) + { + if(gstrHifCxt.u8ChipMode != M2M_NO_PS) + ret = chip_sleep(); + } + return ret; +} + +/** + * @fn int8_t hif_init(void * arg); + * @brief To initialize HIF layer. + * @param[in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_init(void *arg) +{ + memset((uint8_t*)&gstrHifCxt, 0, sizeof(tstrHifContext)); + +// if (OSAL_RESULT_TRUE != OSAL_SEM_Create(&hifSemaphore, OSAL_SEM_TYPE_BINARY, 1, 1)) +// return M2M_ERR_INIT; + + hif_register_cb(M2M_REQ_GROUP_HIF, m2m_hif_cb); + return hif_chip_sleep(); +} + +/** + * @fn int8_t hif_deinit(void * arg); + * @brief To Deinitialize HIF layer. + * @param[in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_deinit(void *arg) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + memset((uint8_t*)&gstrHifCxt, 0, sizeof(tstrHifContext)); + return ret; +} + +/** + * @fn int8_t hif_check_compatibility(uint16_t u16HifInfo); + * @brief + * To check the compatibility of an image with the current driver. + * @param [in] u16HifInfo + * HIF info of image to be checked. + * @return The function shall return ZERO for compatible image and a negative value otherwise. + */ +int8_t hif_check_compatibility(uint16_t u16HifInfo) +{ + int8_t ret = M2M_ERR_FW_VER_MISMATCH; + if((M2M_GET_HIF_BLOCK(u16HifInfo) == M2M_HIF_BLOCK_VALUE) && (M2M_GET_HIF_MAJOR(u16HifInfo) == M2M_HIF_MAJOR_VALUE)) + { + ret = M2M_SUCCESS; + } + return ret; +} + +/** + * @fn int8_t hif_enable_access(void); + * @brief + * To enable access to HIF layer, based on HIF level of Firmware. + * This function reads HIF level directly from a register written by Firmware. + * @return The function shall return ZERO for full match operation and a negative value if operation is restricted. + */ +int8_t hif_enable_access(void) +{ + int8_t ret = M2M_SUCCESS; + uint16_t fw_hif_info = 0; + + ret = nm_get_hif_info(&fw_hif_info, NULL); + if(ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(fw_hif_info); + if(ret == M2M_SUCCESS) + { + switch(M2M_GET_HIF_MINOR(fw_hif_info)) + { + case 0: + gu8HifBlOffset = 1; + break; + case 1: + gu8HifBlOffset = 2; + break; + case 2: + gu8HifBlOffset = 2; + break; + case 3: + gu8HifBlOffset = 3; + break; + case 4: + gu8HifBlOffset = 10; + break; + case 5: + gu8HifBlOffset = 13; + break; + // Additional case to be added each time hif minor increments. + // All additional cases to be removed in the event of a hif major increment. + // Default catches all cases in which hif minor is greater in Firmware than in Driver. + default: + gu8HifBlOffset = HIF_BLACKLIST_SZ; + break; + } + } + else + { + gu8HifBlOffset = 0; + M2M_ERR("HIF access limited to OTA Switch/Rollback only\r\n"); + } + } + return ret; +} + +/** + * @fn int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode); + * @brief + * To check that a particular hif message is supported with the current driver/firmware pair. + * @param[in] u8Gid + * Group ID. + * @param[in] u8Opcode + * Operation ID. + * @return The function shall return @ref M2M_SUCCESS for success and a negative value otherwise. + */ +int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode) +{ + uint8_t u8BlId; + uint16_t u16HifCode = ((uint16_t)u8Gid<<8) | u8OpCode; + if((u16HifCode == HIFCODE_OTA_RB) || (u16HifCode == HIFCODE_OTA_SW)) + { + return M2M_SUCCESS; + } + if(gu8HifBlOffset == 0) + { + M2M_ERR("HIF OTA rb/sw only\r\n"); + return M2M_ERR_SEND; + } + for(u8BlId = gu8HifBlOffset; u8BlId < HIF_BLACKLIST_SZ; u8BlId++) + { + if(u16HifCode == gau16HifBlacklist[u8BlId]) + { + M2M_ERR("HIF message unsupported\r\n"); + return M2M_ERR_SEND; + } + } + return M2M_SUCCESS; +} + +/** + * @fn int8_t hif_send(uint8_t u8Gid,uint8_t u8Opcode,uint8_t *pu8CtrlBuf,uint16_t u16CtrlBufSize, + * uint8_t *pu8DataBuf,uint16_t u16DataSize, uint16_t u16DataOffset) + * @brief Send packet using host interface. + * + * @param[in] u8Gid + * Group ID. + * @param[in] u8Opcode + * Operation ID. + * @param[in] pu8CtrlBuf + * Pointer to the Control buffer. + * @param[in] u16CtrlBufSize + * Control buffer size. + * @param[in] u16DataOffset + * Packet Data offset. + * @param[in] pu8DataBuf + * Packet buffer Allocated by the caller. + * @param[in] u16DataSize + * Packet buffer size (including the HIF header). + * @return The function shall return @ref M2M_SUCCESS for successful operation and a negative value otherwise. + */ +int8_t hif_send(uint8_t u8Gid, uint8_t u8Opcode, uint8_t *pu8CtrlBuf, uint16_t u16CtrlBufSize, + uint8_t *pu8DataBuf, uint16_t u16DataSize, uint16_t u16DataOffset) +{ + int8_t ret = M2M_ERR_SEND; + tstrHifHdr strHif; + uint32_t u32CtrlDataGap = u16DataOffset; + +// while (OSAL_RESULT_FALSE == OSAL_SEM_Pend(&hifSemaphore, OSAL_WAIT_FOREVER)) + { + } + + strHif.u8Opcode = u8Opcode&(~NBIT7); + strHif.u8Gid = u8Gid; + strHif.u16Length = M2M_HIF_HDR_OFFSET; + + if(pu8CtrlBuf != NULL) + { + if(u16CtrlBufSize > M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET) + { + M2M_ERR("HIF %s (%dB) exceeds max (%dB)\n", "Ctrl", u16CtrlBufSize, M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET); + goto ERR2; + } + strHif.u16Length += u16CtrlBufSize; + u32CtrlDataGap -= u16CtrlBufSize; + } + if(pu8DataBuf != NULL) + { + if((uint32_t)u16DataOffset + u16DataSize > M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET) + { + M2M_ERR("HIF %s (%luB) exceeds max (%luB)\n", "Data", (uint32_t)u16DataOffset + u16DataSize, (uint32_t)M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET); + goto ERR2; + } + strHif.u16Length += u32CtrlDataGap + u16DataSize; + } + + ret = hif_check_code(strHif.u8Gid, strHif.u8Opcode); + if(ret != M2M_SUCCESS) + { + goto ERR2; + } + + if(strHif.u16Length <= M2M_HIF_MAX_PACKET_SIZE) + { + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + volatile uint32_t reg, dma_addr = 0; + volatile uint16_t cnt = 0; + + reg = 0UL; + reg |= (uint32_t)u8Gid; + reg |= ((uint32_t)u8Opcode<<8); + reg |= ((uint32_t)strHif.u16Length<<16); + ret = nm_write_reg(NMI_STATE_REG, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + reg = 0UL; + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + + if (ISNMC3400(nmi_get_chipid())) { + + ret = nm_write_reg(INTERRUPT_CORTUS_1_3000D0, 1); + if(M2M_SUCCESS != ret) goto ERR1; + } + + dma_addr = 0; + + for(cnt = 0; cnt < 1000*5; cnt ++) + { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_2, (uint32_t *)®); + if(ret != M2M_SUCCESS) break; + /* + * If it takes too long to get a response, the slow down to + * avoid back-to-back register read operations. + */ + if(cnt >= 1000) { + if(cnt == 1000) { + M2M_INFO("Slowing down...\n"); + } + nm_sleep(5); + } + if(!(reg & NBIT1)) + { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_4, (uint32_t *)&dma_addr); + if(ret != M2M_SUCCESS) { + /*in case of read error clear the DMA address and return error*/ + dma_addr = 0; + goto ERR1; + } + /*in case of success break */ + break; + } + } + + if (dma_addr != 0) + { + volatile uint32_t u32CurrAddr; + u32CurrAddr = dma_addr; + strHif.u16Length=NM_BSP_B_L_16(strHif.u16Length); + M2M_DBG("Writing into %" PRIx32 " %d\r\n", dma_addr, strHif.u16Length); + ret = nm_write_block(u32CurrAddr, (uint8_t*)&strHif, M2M_HIF_HDR_OFFSET); + if(M2M_SUCCESS != ret) goto ERR1; + u32CurrAddr += M2M_HIF_HDR_OFFSET; + if(pu8CtrlBuf != NULL) + { + ret = nm_write_block(u32CurrAddr, pu8CtrlBuf, u16CtrlBufSize); + if(M2M_SUCCESS != ret) goto ERR1; + u32CurrAddr += u16CtrlBufSize; + } + if(pu8DataBuf != NULL) + { + u32CurrAddr += u32CtrlDataGap; + ret = nm_write_block(u32CurrAddr, pu8DataBuf, u16DataSize); + if(M2M_SUCCESS != ret) goto ERR1; + u32CurrAddr += u16DataSize; + } + + reg = dma_addr << 2; + + /* Following line of code is to generate the interrupt which is not strictly needed for 3400, + but has no noticeable side effects + */ + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_3, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_2_3000D0, 1); + if(M2M_SUCCESS != ret) goto ERR1; + } + } + else + { + ret = hif_chip_sleep(); + M2M_DBG("Failed to alloc rx size\r\n"); + ret = M2M_ERR_MEM_ALLOC; + goto ERR2; + } + } + else + { + M2M_ERR("(HIF)Failed to wakeup the chip\r\n"); + goto ERR2; + } + } + else + { + M2M_ERR("HIF message length (%d) exceeds max length (%d)\r\n", strHif.u16Length, M2M_HIF_MAX_PACKET_SIZE); + ret = M2M_ERR_SEND; + goto ERR2; + } +// OSAL_SEM_Post(&hifSemaphore); + /*actual sleep ret = M2M_SUCCESS*/ + ret = hif_chip_sleep(); + return ret; +ERR1: + /*reset the count but no actual sleep as it already bus error*/ + hif_chip_sleep_sc(); +ERR2: + /*logical error*/ +// OSAL_SEM_Post(&hifSemaphore); + return ret; +} +/** + * @fn hif_isr + * @brief Host interface interrupt service routine + * @return @ref M2M_SUCCESS in case of success or a negative vale otherwise + */ +static int8_t hif_isr(void) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg; + volatile tstrHifHdr strHif; + +// while (OSAL_RESULT_FALSE == OSAL_SEM_Pend(&hifSemaphore, OSAL_WAIT_FOREVER)) + { + } + + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(M2M_SUCCESS == ret) + { + if(reg & 0x1) /* New interrupt has been received */ + { + uint16_t size; + + /*Clearing RX interrupt*/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(ret != M2M_SUCCESS)goto ERR1; + reg &= ~NBIT0; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if(ret != M2M_SUCCESS)goto ERR1; + /* read the rx size */ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_0 bus fail\r\n"); + goto ERR1; + } + gstrHifCxt.u8HifRXDone = 1; + size = (uint16_t)((reg >> 2) & 0xfff); + if (size > 0) { + uint32_t address = 0; + /** + start bus transfer + **/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1, &address); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_1 bus fail\r\n"); + goto ERR1; + } + gstrHifCxt.u32RxAddr = address; + gstrHifCxt.u32RxSize = size; + ret = nm_read_block(address, (uint8_t*)&strHif, sizeof(tstrHifHdr)); + strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) address bus fail\r\n"); + goto ERR1; + } + if(strHif.u16Length != size) + { + if((size - strHif.u16Length) > 4) + { + M2M_ERR("(hif) Corrupted packet Size = %u \r\n", + size, strHif.u16Length, strHif.u8Gid, strHif.u8Opcode); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + } + +// OSAL_SEM_Post(&hifSemaphore); + + if(M2M_REQ_GROUP_WIFI == strHif.u8Gid) + { + if(gstrHifCxt.pfWifiCb) + gstrHifCxt.pfWifiCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("WIFI callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_IP == strHif.u8Gid) + { + if(gstrHifCxt.pfIpCb) + gstrHifCxt.pfIpCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Socket callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_OTA == strHif.u8Gid) + { + if(gstrHifCxt.pfOtaCb) + gstrHifCxt.pfOtaCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("OTA callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_SIGMA == strHif.u8Gid) + { + if(gstrHifCxt.pfSigmaCb) + gstrHifCxt.pfSigmaCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Sigma callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_SSL == strHif.u8Gid) + { + if(gstrHifCxt.pfSslCb) + gstrHifCxt.pfSslCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("SSL callback is not registered\r\n"); + } + else + { + M2M_ERR("(hif) invalid group ID\r\n"); + return M2M_ERR_BUS_FAIL; + } + if(gstrHifCxt.u8HifRXDone) + { + M2M_ERR("(hif) host app didn't set RX Done <%u><%X>\n", strHif.u8Gid, strHif.u8Opcode); + return hif_set_rx_done(); + } + + return M2M_SUCCESS; + } + else + { + ret = M2M_ERR_RCV; + M2M_ERR("(hif) Wrong Size\r\n"); + goto ERR1; + } + } + else + { + M2M_ERR("(hif) False interrupt %lx\r\n",reg); + ret = M2M_ERR_FAIL; + } + } + else + { + M2M_ERR("(hif) Failed to read interrupt reg\r\n"); + } + +ERR1: +// OSAL_SEM_Post(&hifSemaphore); + return ret; +} + +/** +* @fn hif_handle_isr(void) +* @brief Handle interrupt received from WINC3400 firmware. +* @return The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t hif_handle_isr(void) +{ + int8_t ret = M2M_SUCCESS; + + ret = hif_isr(); + if (M2M_SUCCESS != ret) + { + M2M_ERR("(hif) Failed to handle interrupt %d try Again..\r\n",ret); + } + + return ret; +} + +/** + * @fn hif_receive + * @brief Host interface interrupt service routine + * @param[in] u32Addr + * Receive start address + * @param[out] pu8Buf + * Pointer to receive buffer. Allocated by the caller + * @param[in] u16Sz + * Receive buffer size + * @param[in] isDone + * If you don't need any more packets send True otherwise send false + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_receive(uint32_t u32Addr, uint8_t *pu8Buf, uint16_t u16Sz, uint8_t isDone) +{ + int8_t ret = M2M_SUCCESS; + + if((u32Addr == 0) || (pu8Buf == NULL) || (u16Sz == 0)) + { + if(isDone) + { + ret = hif_set_rx_done(); + } + else + { + ret = M2M_ERR_FAIL; + M2M_ERR(" hif_receive: Invalid argument\r\n"); + } + goto ERR1; + } + + if(u16Sz > gstrHifCxt.u32RxSize) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Size is larger than the received buffer size <%d><%" PRId32 ">\r\n", u16Sz, gstrHifCxt.u32RxSize); + goto ERR1; + } + if((u32Addr < gstrHifCxt.u32RxAddr)||((u32Addr + u16Sz)>(gstrHifCxt.u32RxAddr+gstrHifCxt.u32RxSize))) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Address beyond the received buffer address and length\r\n"); + goto ERR1; + } + + /* Receive the payload */ + ret = nm_read_block(u32Addr, pu8Buf, u16Sz); + if(ret != M2M_SUCCESS)goto ERR1; + + /* check if this is the last packet */ + if( + isDone + || (((gstrHifCxt.u32RxAddr+gstrHifCxt.u32RxSize) - (u32Addr+u16Sz)) <= 3) + /* Length in the RCV CTRL 0 register is rounded off to 4 by the firmware, + but length inside the HIF header is not, hence consider done if fewer than + 4 bytes left to read */ + ) + { + /* set RX done */ + ret = hif_set_rx_done(); + } +ERR1: + return ret; +} + +/** + * @fn hif_register_cb + * @brief To set Callback function for every component + * @param[in] u8Grp + * Group to which the Callback function should be set. + * @param[in] fn + * function to be set + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +int8_t hif_register_cb(uint8_t u8Grp, tpfHifCallBack fn) +{ + int8_t ret = M2M_SUCCESS; + switch(u8Grp) + { + case M2M_REQ_GROUP_IP: + gstrHifCxt.pfIpCb = fn; + break; + case M2M_REQ_GROUP_WIFI: + gstrHifCxt.pfWifiCb = fn; + break; + case M2M_REQ_GROUP_OTA: + gstrHifCxt.pfOtaCb = fn; + break; + case M2M_REQ_GROUP_HIF: + gstrHifCxt.pfHifCb = fn; + break; + case M2M_REQ_GROUP_SIGMA: + gstrHifCxt.pfSigmaCb = fn; + break; + case M2M_REQ_GROUP_SSL: + gstrHifCxt.pfSslCb = fn; + break; + default: + M2M_ERR("GRp ? %d\r\n", u8Grp); + ret = M2M_ERR_FAIL; + break; + } + return ret; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/m2m_ota.c b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_ota.c new file mode 100644 index 0000000..a38285d --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_ota.c @@ -0,0 +1,190 @@ +/******************************************************************************* + 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 \ No newline at end of file diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/m2m_periph.c b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_periph.c new file mode 100644 index 0000000..82dbbaf --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_periph.c @@ -0,0 +1,129 @@ +/******************************************************************************* + WINC3400 Peripherials Application Interface. + + File Name: + m2m_periph.c + + Summary: + WINC3400 Peripherals Application Interface + + Description: + WINC3400 Peripherals Application 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 "m2m_periph.h" +#include "nmasic.h" +#include "m2m_hif.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define GPIO_OP_DIR 0 +#define GPIO_OP_SET 1 +#define GPIO_OP_GET 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static int8_t get_gpio_idx(uint8_t u8GpioNum) +{ + if(u8GpioNum >= M2M_PERIPH_GPIO_MAX) return -1; + if(u8GpioNum == M2M_PERIPH_GPIO15) { + return 15; + } else if(u8GpioNum == M2M_PERIPH_GPIO16) { + return 16; + } else if(u8GpioNum == M2M_PERIPH_GPIO18) { + return 18; + } else { + return -2; + } +} +/* + * GPIO read/write skeleton with wakeup/sleep capability. + */ +static int8_t gpio_ioctl(uint8_t op, uint8_t u8GpioNum, uint8_t u8InVal, uint8_t *pu8OutVal) +{ + int8_t ret, gpio; + + ret = hif_chip_wake(); + if(ret != M2M_SUCCESS) goto _EXIT; + + gpio = get_gpio_idx(u8GpioNum); + if(gpio < 0) goto _EXIT1; + + if(op == GPIO_OP_DIR) { + ret = set_gpio_dir((uint8_t)gpio, u8InVal); + } else if(op == GPIO_OP_SET) { + ret = set_gpio_val((uint8_t)gpio, u8InVal); + } else if(op == GPIO_OP_GET) { + ret = get_gpio_val((uint8_t)gpio, pu8OutVal); + } + if(ret != M2M_SUCCESS) goto _EXIT1; + +_EXIT1: + ret = hif_chip_sleep(); +_EXIT: + return ret; +} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +int8_t m2m_periph_init(tstrPerphInitParam *param) +{ + return M2M_SUCCESS; +} + +int8_t m2m_periph_gpio_set_dir(uint8_t u8GpioNum, uint8_t u8GpioDir) +{ + return gpio_ioctl(GPIO_OP_DIR, u8GpioNum, u8GpioDir, NULL); +} + +int8_t m2m_periph_gpio_set_val(uint8_t u8GpioNum, uint8_t u8GpioVal) +{ + return gpio_ioctl(GPIO_OP_SET, u8GpioNum, u8GpioVal, NULL); +} + +int8_t m2m_periph_gpio_get_val(uint8_t u8GpioNum, uint8_t *pu8GpioVal) +{ + return gpio_ioctl(GPIO_OP_GET, u8GpioNum, 0, pu8GpioVal); +} + +int8_t m2m_periph_pullup_ctrl(uint32_t pinmask, uint8_t enable) +{ + return pullup_ctrl(pinmask, enable); +} + +//DOM-IGNORE-END diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/m2m_ssl.c b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_ssl.c new file mode 100644 index 0000000..f4a5f44 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_ssl.c @@ -0,0 +1,495 @@ +/******************************************************************************* + File Name: + m2m_ssl.c + + Summary: + WINC SSL Interface. + + Description: + WINC SSL 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 "m2m_ssl.h" +#include "m2m_hif.h" +#include "nmasic.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfAppSSLCb gpfAppSSLCb = NULL; +static uint32_t gu32HIFAddr = 0; +static tenuTlsFlashStatus genuStatus = TLS_FLASH_ERR_UNKNOWN; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@fn void m2m_ssl_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +@brief Internal SSL callback function. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +*/ +static void m2m_ssl_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ + int8_t s8tmp = M2M_SUCCESS; + switch(u8OpCode) + { + case M2M_SSL_REQ_ECC: + { + tstrEccReqInfo strEccREQ; + s8tmp = hif_receive(u32Addr, (uint8_t *)&strEccREQ, sizeof(tstrEccReqInfo), 0); + if(s8tmp == M2M_SUCCESS) + { + if(gpfAppSSLCb) + { + gu32HIFAddr = u32Addr + sizeof(tstrEccReqInfo); + gpfAppSSLCb(M2M_SSL_REQ_ECC, &strEccREQ); + } + } + } + break; + case M2M_SSL_RESP_SET_CS_LIST: + { + tstrSslSetActiveCsList strCsList; + s8tmp = hif_receive(u32Addr, (uint8_t *)&strCsList, sizeof(tstrSslSetActiveCsList), 0); + if(s8tmp == M2M_SUCCESS) + { + if(gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_SET_CS_LIST, &strCsList); + } + } + break; + case M2M_SSL_RESP_WRITE_OWN_CERTS: + { + tstrTlsSrvChunkHdr strTlsSrvChunkRsp; + uint8_t bCallApp = 1; + + s8tmp = hif_receive(u32Addr, (uint8_t *)&strTlsSrvChunkRsp, sizeof(tstrTlsSrvChunkHdr), 0); + if(s8tmp == M2M_SUCCESS) + { + uint16_t offset = strTlsSrvChunkRsp.u16Offset32; + uint16_t chunk_size = strTlsSrvChunkRsp.u16Size32; + uint16_t total_size = strTlsSrvChunkRsp.u16TotalSize32; + tenuTlsFlashStatus status = (tenuTlsFlashStatus)(strTlsSrvChunkRsp.u16Sig); + + /* If first chunk, reset status. */ + if(offset == 0) + genuStatus = TLS_FLASH_OK_NO_CHANGE; + /* Only send status to app when processing last chunk. */ + if(offset + chunk_size != total_size) + bCallApp = 0; + + switch(status) + { + case TLS_FLASH_OK: + // Good flash write. Update status if no errors yet. + if(genuStatus == TLS_FLASH_OK_NO_CHANGE) + genuStatus = status; + break; + case TLS_FLASH_OK_NO_CHANGE: + // No change, don't update status. + break; + case TLS_FLASH_ERR_CORRUPT: + // Corrupt. Always update status. + genuStatus = status; + break; + case TLS_FLASH_ERR_NO_CHANGE: + // Failed flash write. Update status if no more serious error. + if((genuStatus != TLS_FLASH_ERR_CORRUPT) && (genuStatus != TLS_FLASH_ERR_UNKNOWN)) + genuStatus = status; + break; + default: + // Don't expect any other case. Ensure we don't mask a previous corrupt error. + if(genuStatus != TLS_FLASH_ERR_CORRUPT) + genuStatus = TLS_FLASH_ERR_UNKNOWN; + break; + } + } + if(bCallApp && gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_WRITE_OWN_CERTS, &genuStatus); + } + break; + } + if(s8tmp != M2M_SUCCESS) + { + M2M_ERR("Error receiving SSL from the HIF\n"); + } +} + +/*! +@fn int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +@brief Initializes the SSL layer. +@param [in] pfAppSslCb + Application SSL callback function. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +{ + int8_t s8Ret = M2M_SUCCESS; + gpfAppSSLCb = pfAppSSLCb; + gu32HIFAddr = 0; + genuStatus = TLS_FLASH_ERR_UNKNOWN; + s8Ret = hif_register_cb(M2M_REQ_GROUP_SSL, m2m_ssl_cb); + if(s8Ret != M2M_SUCCESS) + { + M2M_ERR("hif_register_cb() failed with ret=%d", s8Ret); + } + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8_t* pu8RspDataBuff, uint16_t u16RspDataSz) +@brief Sends ECC responses to the WINC. +@param[in] strECCResp + ECC Response struct. +@param[in] pu8RspDataBuff + Pointer of the response data to be sent. +@param[in] u16RspDataSz + Response data size. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8_t *pu8RspDataBuff, uint16_t u16RspDataSz) +{ + int8_t s8Ret = M2M_SUCCESS; + + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_RESP_ECC | M2M_REQ_DATA_PKT), (uint8_t *)strECCResp, sizeof(tstrEccReqInfo), pu8RspDataBuff, u16RspDataSz, sizeof(tstrEccReqInfo)); + + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_send_certs_to_winc(uint8_t *pu8Buffer, uint32_t u32BufferSz) +@brief Sends certificates to the WINC +@param[in] pu8Buffer + Pointer to the certificates. +@param[in] u32BufferSz + Size of the certificates. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_send_certs_to_winc(uint8_t *pu8Buffer, uint32_t u32BufferSz) +{ + int8_t s8Ret = M2M_SUCCESS; +#define TXLIMIT (256 * 6) + + if(u32BufferSz <= TXLIMIT) + { + // set chunk header for one chunk + tstrTlsSrvChunkHdr *pchkhdr = (tstrTlsSrvChunkHdr *)pu8Buffer; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = (u32BufferSz + 3) >> 2; + pchkhdr->u16Offset32 = 0; + pchkhdr->u16Size32 = (u32BufferSz + 3) >> 2; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, pu8Buffer, u32BufferSz, 0); + M2M_INFO("Transferred %" PRIu32 " bytes of cert data NON-CHUNKED\r\n", u32BufferSz); + } + else + { + // chunk it + // We are sneaking in a header - tstrTlsSrvChunkHdr +#define CHUNKHDRSZ (sizeof(tstrTlsSrvChunkHdr)) +#define CHUNKSZ (TXLIMIT - 256) // divisible by 4 + uint8_t saveblob[CHUNKHDRSZ]; + uint32_t ofs = 0; + uint32_t thischunksz = 0; + + // first is special - over writing our header + memcpy(saveblob, &pu8Buffer[ofs], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ, u32BufferSz-ofs); // no need to round up to quad words this time + + tstrTlsSrvChunkHdr *pchkhdr = (tstrTlsSrvChunkHdr *)&pu8Buffer[ofs]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs], thischunksz, 0); + M2M_INFO("Transferred %" PRIu32 " bytes of cert data CHUNKED to offset %" PRIu32 " total %" PRIu32 "\r\n", thischunksz, ofs, u32BufferSz); + memcpy(&pu8Buffer[ofs], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + + while(ofs < u32BufferSz) + { + // Subsequent chunks write header before and send a little more + memcpy(saveblob, &pu8Buffer[ofs-CHUNKHDRSZ], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ, u32BufferSz-ofs); + thischunksz = (thischunksz + 3) & 0xFFFFFFFC; // needs to round up to quad word length + pchkhdr = (tstrTlsSrvChunkHdr *)&pu8Buffer[ofs - CHUNKHDRSZ]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs - CHUNKHDRSZ], thischunksz + CHUNKHDRSZ, 0); + M2M_INFO("Transferred %" PRIu32 " bytes of cert data CHUNKED to offset %" PRIu32 " total %" PRIu32 "\n", thischunksz, ofs, u32BufferSz); + memcpy(&pu8Buffer[ofs - CHUNKHDRSZ], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + } + } + + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] penuCurve + The named curve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. +@param[inout] pu16ValueSz + in: Size of value buffer provided by caller. + out: Size of value retrieved (provided for convenience; the value size is in fact determined by the curve). +@param[out] pu8Sig + Signature retrieved for verification. +@param[inout] pu16SigSz + in: Size of signature buffer provided by caller. + out: Size of signature retrieved (provided for convenience; the signature size is in fact determined by the curve). +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. +*/ +int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey) +{ + int8_t s8Ret = M2M_ERR_FAIL; + uint16_t u16HashSz, u16SigSz, u16KeySz; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if((NULL == penuCurve) || (NULL == pu8Value) || (NULL == pu16ValueSz) || (NULL == pu8Sig) || (NULL == pu16SigSz) || (NULL == pstrKey)) + { + s8Ret = M2M_ERR_INVALID_ARG; + goto __ERR; + } + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16KeySz, 2, 0) != M2M_SUCCESS) goto __ERR; + *penuCurve = _htons(u16KeySz); + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16KeySz, 2, 0) != M2M_SUCCESS) goto __ERR; + u16KeySz = _htons(u16KeySz); + if(u16KeySz > sizeof(pstrKey->X)) goto __ERR; + pstrKey->u16Size = u16KeySz; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16HashSz, 2, 0) != M2M_SUCCESS) goto __ERR; + u16HashSz = _htons(u16HashSz); + if(u16HashSz > *pu16ValueSz) goto __ERR; + *pu16ValueSz = u16HashSz; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16SigSz, 2, 0) != M2M_SUCCESS) goto __ERR; + u16SigSz = _htons(u16SigSz); + if(u16SigSz > *pu16SigSz) goto __ERR; + *pu16SigSz = u16SigSz; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, pstrKey->X, u16KeySz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16KeySz; + if(hif_receive(gu32HIFAddr, pstrKey->Y, u16KeySz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16KeySz; + + if(hif_receive(gu32HIFAddr, pu8Value, u16HashSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16HashSz; + + if(hif_receive(gu32HIFAddr, pu8Sig, u16SigSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16SigSz; + + return M2M_SUCCESS; + +__ERR: + hif_receive(0, NULL, 0, 1); + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] pu16Curve + The named curve, to be cast to type @ref tenuEcNamedCurve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. + The size of the value is equal to the field size of the curve, hence is determined by pu16Curve. +@param[out] pu8Sig + Signature retrieved for verification. + The size of the signature is equal to twice the field size of the curve, hence is determined by pu16Curve. +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_retrieve_next_for_verifying is used instead. +*/ +int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey) +{ + uint16_t u16ValueSz = 32, u16SigSz = 64; + + return m2m_ssl_retrieve_next_for_verifying((tenuEcNamedCurve *)pu16Curve, pu8Value, &u16ValueSz, pu8Sig, &u16SigSz, pstrKey); +} + +/*! +@fn int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz) +@brief Retrieve the value from the WINC for ECDSA signing. +@param[out] pu8Value + Value retrieved for signing. This is the digest of the message, truncated/prepended to the appropriate size. +@param[in] u16ValueSz + Size of value to be retrieved. (The application should obtain this information, + along with the curve, from the associated @ref ECC_REQ_SIGN_GEN notification.) +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + signing information is ready via @ref ECC_REQ_SIGN_GEN. + +@warning If this function returns @ref M2M_ERR_FAIL, then the value for signing is lost. +*/ +int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if(NULL == pu8Value) + { + s8Ret = M2M_ERR_INVALID_ARG; + goto __ERR; + } + + if(hif_receive(gu32HIFAddr, pu8Value, u16ValueSz, 0) != M2M_SUCCESS) goto __ERR; + + return M2M_SUCCESS; + +__ERR: + hif_receive(0, NULL, 0, 1); + return s8Ret; +} + +/*! +@fn void m2m_ssl_stop_retrieving(void); +@brief Allow SSL driver to tidy up when the application chooses not to retrieve all available + information. + +@return None. + +@warning The application must call this function if it has been notified (via + @ref ECC_REQ_SIGN_GEN or @ref ECC_REQ_SIGN_VERIFY) that information is available for + retrieving from the WINC, but chooses not to retrieve it all. + The application must not call this function if it has retrieved all the available + information, or if a retrieve function returned @ref M2M_ERR_FAIL indicating that any + remaining information has been lost. + +@see m2m_ssl_retrieve_next_for_verifying\n + m2m_ssl_retrieve_cert\n + m2m_ssl_retrieve_hash +*/ +void m2m_ssl_stop_retrieving(void) +{ + hif_receive(0, NULL, 0, 1); +} + +/*! +@fn void m2m_ssl_stop_processing_certs(void); +@brief Allow SSL driver to tidy up in case application does not read all available certificates. +@return None. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_stop_retrieving is used instead. +*/ +void m2m_ssl_stop_processing_certs(void) +{ + m2m_ssl_stop_retrieving(); +} + +/*! +@fn void m2m_ssl_ecc_process_done(void); +@brief Allow SSL driver to tidy up after application has finished processing ECC message. + +@return None. + +@warning The application should call this function after receiving an SSL callback with message + type @ref M2M_SSL_REQ_ECC, after retrieving any related information, and before + calling @ref m2m_ssl_handshake_rsp. +*/ +void m2m_ssl_ecc_process_done(void) +{ + gu32HIFAddr = 0; +} + +/*! +@fn int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP) +@brief Sets the active ciphersuites. +@details Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the form of + a bitmap containing the required ciphers to be on. + There is no need to call this function if the application will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + change. + +@return + - @ref SOCK_ERR_NO_ERROR + - @ref SOCK_ERR_INVALID_ARG +*/ +int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP) +{ + int8_t s8Ret = M2M_SUCCESS; + tstrSslSetActiveCsList strCsList; + + strCsList.u32CsBMP = u32SslCsBMP; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, M2M_SSL_REQ_SET_CS_LIST, (uint8_t *)&strCsList, sizeof(tstrSslSetActiveCsList), NULL, 0, 0); + + return s8Ret; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/m2m_wifi.c b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_wifi.c new file mode 100644 index 0000000..45d2b13 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/m2m_wifi.c @@ -0,0 +1,2061 @@ +/******************************************************************************* + File Name: + m2m_wifi.c + + Summary: + This module contains M2M Wi-Fi APIs implementation. + + Description: + This module contains M2M Wi-Fi APIs implementation. + *******************************************************************************/ + +//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. +*******************************************************************************/ + +#include "m2m_wifi.h" +#include "m2m_hif.h" +#include "nmasic.h" + +#define WIFI_1X_TLS_HS_FLAGS_PEER_AUTH NBIT1 +#define WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK NBIT2 +#define WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME NBIT3 +#define WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING NBIT4 +#define WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT NBIT6 + +#define WIFI_1X_TLS_HS_FLAGS_DEFAULT ( \ + WIFI_1X_TLS_HS_FLAGS_PEER_AUTH \ + | WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK \ + | WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING \ +) + +static volatile uint8_t gu8ChNum; +static tpfAppWifiCb gpfAppWifiCb = NULL; + +static uint32_t gu321xTlsHsFlags = WIFI_1X_TLS_HS_FLAGS_DEFAULT; +static uint8_t gau81xRootSha1[20] = {0}; + +static tpfAppEthCb gpfAppEthCb = NULL; +static uint8_t *gau8ethRcvBuf = NULL; +static uint16_t gu16ethRcvBufSize; + +/** +* @fn m2m_wifi_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr, uint8_t grp) +* @brief WiFi call back function +* @param [in] u8OpCode +* HIF Opcode type. +* @param [in] u16DataSize +* HIF data length. +* @param [in] u32Addr +* HIF address. +* @param [in] grp +* HIF group type. +*/ +static void m2m_wifi_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ + uint8_t rx_buf[8]; + if (u8OpCode == M2M_WIFI_RESP_CON_STATE_CHANGED) + { + tstrM2mWifiStateChanged strState; + if (hif_receive(u32Addr, (uint8_t*)&strState, sizeof(tstrM2mWifiStateChanged), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CON_STATE_CHANGED, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_GET_SYS_TIME) + { + tstrSystemTime strSysTime; + if (hif_receive(u32Addr, (uint8_t*)&strSysTime, sizeof(tstrSystemTime), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_GET_SYS_TIME, &strSysTime); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CONN_INFO) + { + tstrM2MConnInfo strConnInfo; + if (hif_receive(u32Addr, (uint8_t*)&strConnInfo, sizeof(tstrM2MConnInfo), 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CONN_INFO, &strConnInfo); + } + } + else if (u8OpCode == M2M_WIFI_RESP_MEMORY_RECOVER) + { + } + else if (u8OpCode == M2M_WIFI_REQ_DHCP_CONF) + { + tstrM2MIPConfig strIpConfig; + if (hif_receive(u32Addr, (uint8_t*)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_DHCP_CONF, (uint8_t*)&strIpConfig); + } + } + else if (u8OpCode == M2M_WIFI_REQ_WPS) + { + tstrM2MWPSInfo strWps; + memset((uint8_t*)&strWps, 0, sizeof(tstrM2MWPSInfo)); + if (hif_receive(u32Addr, (uint8_t*)&strWps, sizeof(tstrM2MWPSInfo), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_WPS, &strWps); + } + } + else if (u8OpCode == M2M_WIFI_RESP_IP_CONFLICT) + { + uint32_t u32ConflictedIP; + if (hif_receive(u32Addr, (uint8_t*)&u32ConflictedIP, sizeof(u32ConflictedIP), 0) == M2M_SUCCESS) + { + M2M_INFO("Conflicted IP \" %u.%u.%u.%u \"\r\n", + BYTE_0(u32ConflictedIP), BYTE_1(u32ConflictedIP), BYTE_2(u32ConflictedIP), BYTE_3(u32ConflictedIP)); + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_IP_CONFLICT, NULL); + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_DONE) + { + tstrM2mScanDone strState; + if (hif_receive(u32Addr, (uint8_t*)&strState, sizeof(tstrM2mScanDone), 0) == M2M_SUCCESS) + { + gu8ChNum = strState.u8NumofCh; + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_DONE, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_RESULT) + { + tstrM2mWifiscanResult strScanResult; + if (hif_receive(u32Addr, (uint8_t*)&strScanResult, sizeof(tstrM2mWifiscanResult), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_RESULT, &strScanResult); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CURRENT_RSSI) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CURRENT_RSSI, rx_buf); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CLIENT_INFO) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CLIENT_INFO, rx_buf); + } + } + else if (u8OpCode == M2M_WIFI_RESP_PROVISION_INFO) + { + tstrM2MProvisionInfo strProvInfo; + if (hif_receive(u32Addr, (uint8_t*)&strProvInfo, sizeof(tstrM2MProvisionInfo), 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_PROVISION_INFO, &strProvInfo); + } + } + else if (u8OpCode == M2M_WIFI_RESP_DEFAULT_CONNECT) + { + tstrM2MDefaultConnResp strResp; + if (hif_receive(u32Addr, (uint8_t*)&strResp, sizeof(tstrM2MDefaultConnResp), 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_DEFAULT_CONNECT, &strResp); + } + } + else if (u8OpCode == M2M_WIFI_REQRSP_DELETE_APID) + { + tstrM2MGenericResp strResp; + if (hif_receive(u32Addr, (uint8_t*)&strResp, sizeof(tstrM2MGenericResp), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQRSP_DELETE_APID, &strResp); + } + } + else if (u8OpCode == M2M_WIFI_RESP_BLE_API_RECV) + { + //Read the length + if (hif_receive(u32Addr, rx_buf, 2, 0) == M2M_SUCCESS) + { + uint16_t u16BleMsgLen = (rx_buf[1] << 8) + rx_buf[0]; + tstrM2mBleApiMsg bleRx;// = (tstrM2mBleApiMsg*)OSAL_Malloc(u16BleMsgLen + sizeof(tstrM2mBleApiMsg)); + + // if (bleRx == NULL) + // M2M_ERR("No Mem for BLE msg\r\n"); + // else + { + bleRx.u16Len = u16BleMsgLen; + + //Read the rest of the message + if (hif_receive(u32Addr+2, bleRx.data, bleRx.u16Len, 1)== M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_BLE_API_RECV, &bleRx); + } + // OSAL_Free(bleRx); + } + } + } + else if (u8OpCode == M2M_WIFI_RESP_GET_PRNG) + { + tstrPrng strPrng; + if (hif_receive(u32Addr, (uint8_t*)&strPrng, sizeof(tstrPrng), 0) == M2M_SUCCESS) + { + if (hif_receive(u32Addr + sizeof(tstrPrng), strPrng.pu8RngBuff, strPrng.u16PrngSize, 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) { + gpfAppWifiCb(M2M_WIFI_RESP_GET_PRNG, &strPrng); + } + } + } + } + else if (u8OpCode == M2M_WIFI_RESP_SET_GAIN_TABLE) + { + tstrM2MGainTableRsp strGainRsp; + if (hif_receive(u32Addr, (uint8_t*)&strGainRsp, sizeof(tstrM2MGainTableRsp), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SET_GAIN_TABLE, &strGainRsp); + } + } + else if (u8OpCode == M2M_WIFI_RESP_ETHERNET_RX_PACKET) + { + tstrM2mIpRsvdPkt strM2mRsvd; + if (hif_receive(u32Addr, (uint8_t*)&strM2mRsvd, sizeof(tstrM2mIpRsvdPkt), 0) == M2M_SUCCESS) + { + tstrM2mIpCtrlBuf strM2mIpCtrlBuf; + uint16_t u16Offset = strM2mRsvd.u16PktOffset; + + strM2mIpCtrlBuf.u16RemainingDataSize = strM2mRsvd.u16PktSz; + if ((gpfAppEthCb) &&(gau8ethRcvBuf)&& (gu16ethRcvBufSize > 0)) + { + while (strM2mIpCtrlBuf.u16RemainingDataSize > 0) + { + if (strM2mIpCtrlBuf.u16RemainingDataSize > gu16ethRcvBufSize) + { + strM2mIpCtrlBuf.u16DataSize = gu16ethRcvBufSize ; + } + else + { + strM2mIpCtrlBuf.u16DataSize = strM2mIpCtrlBuf.u16RemainingDataSize; + } + + if (hif_receive(u32Addr+u16Offset, gau8ethRcvBuf, strM2mIpCtrlBuf.u16DataSize, 0) == M2M_SUCCESS) + { + strM2mIpCtrlBuf.u16RemainingDataSize -= strM2mIpCtrlBuf.u16DataSize; + u16Offset += strM2mIpCtrlBuf.u16DataSize; + gpfAppEthCb(M2M_WIFI_RESP_ETHERNET_RX_PACKET, gau8ethRcvBuf, &(strM2mIpCtrlBuf)); + } + else + { + break; + } + } + } + } + } + else + { + M2M_ERR("REQ Not defined %d\r\n", u8OpCode); + } +} + +int8_t m2m_wifi_download_mode(void) +{ + int8_t ret = M2M_SUCCESS; + + /* Apply device specific initialization. */ + ret = nm_drv_init_download_mode(); + if (ret != M2M_SUCCESS) goto _EXIT0; + + enable_interrupts(); + +_EXIT0: + return ret; +} + +static int8_t m2m_validate_ap_parameters(const tstrM2MAPModeConfig *pstrM2MAPModeConfig) +{ + int8_t s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (pstrM2MAPModeConfig == NULL) + { + M2M_ERR("INVALID POINTER\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for SSID */ + if ((strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8SSID) <= 0) || (strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8SSID) >= M2M_MAX_SSID_LEN)) + { + M2M_ERR("INVALID SSID\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for Channel */ + if (pstrM2MAPModeConfig->strApConfig.u8ListenChannel > M2M_WIFI_CH_14 || pstrM2MAPModeConfig->strApConfig.u8ListenChannel < M2M_WIFI_CH_1) + { + M2M_ERR("INVALID CH\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for DHCP Server IP address */ + if (!(pstrM2MAPModeConfig->strApConfig.au8DHCPServerIP[0] || pstrM2MAPModeConfig->strApConfig.au8DHCPServerIP[1])) + { + if (!(pstrM2MAPModeConfig->strApConfig.au8DHCPServerIP[2])) + { + M2M_ERR("INVALID DHCP SERVER IP\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + /* Check for Security */ + if (pstrM2MAPModeConfig->strApConfig.u8SecType == M2M_WIFI_SEC_OPEN) + { + goto ERR1; + } + else if (pstrM2MAPModeConfig->strApConfig.u8SecType == M2M_WIFI_SEC_WEP) + { + /* Check for WEP Key index */ + if ((pstrM2MAPModeConfig->strApConfig.u8KeyIndx == 0) || (pstrM2MAPModeConfig->strApConfig.u8KeyIndx > WEP_KEY_MAX_INDEX)) + { + M2M_ERR("INVALID KEY INDEX\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key size */ + if ((pstrM2MAPModeConfig->strApConfig.u8KeySz != WEP_40_KEY_STRING_SIZE) && + (pstrM2MAPModeConfig->strApConfig.u8KeySz != WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("INVALID KEY SIZE\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key */ + if ((pstrM2MAPModeConfig->strApConfig.au8WepKey == NULL) || (strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8WepKey) <= 0) || (strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8WepKey) > WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("INVALID WEP KEY\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + else + { + M2M_ERR("INVALID AUTHENTICATION MODE\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + +ERR1: + return s8Ret; +} + +static int8_t m2m_validate_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + int8_t s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (ptstrM2MScanOption == NULL) + { + M2M_ERR("INVALID POINTER\r\n"); + s8Ret = M2M_ERR_FAIL; + } + else + { + /* Check for valid No of slots */ + if (ptstrM2MScanOption->u8NumOfSlot == 0) + { + M2M_ERR("INVALID No of scan slots!\r\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid time of slots */ + if ((ptstrM2MScanOption->u8SlotTime < 10) || (ptstrM2MScanOption->u8SlotTime > 250)) + { + M2M_ERR("INVALID scan slot time!\r\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid No of probe requests per slot */ + if ((ptstrM2MScanOption->u8ProbesPerSlot == 0) || (ptstrM2MScanOption->u8ProbesPerSlot > M2M_SCAN_DEFAULT_NUM_PROBE)) + { + M2M_ERR("INVALID No of probe requests per scan slot\r\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid RSSI threshold */ + if (ptstrM2MScanOption->s8RssiThresh >= 0) + { + M2M_ERR("INVALID RSSI threshold %d\r\n", ptstrM2MScanOption->s8RssiThresh); + s8Ret = M2M_ERR_FAIL; + } + } + return s8Ret; +} + +int8_t m2m_wifi_ble_set_gain_table(uint8_t table_idx) +{ + int8_t s8Ret = M2M_ERR_FAIL; + tstrM2MGainTable strGainTable = {0}; + + strGainTable.u8GainTable = table_idx; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_GAIN_TABLE, (uint8_t*)&strGainTable, sizeof(tstrM2MGainTable), NULL, 0, 0); + return s8Ret; +} + +int8_t m2m_wifi_init_hold(void) +{ + int8_t ret = M2M_ERR_FAIL; + + /* Apply device specific initialization. */ + ret = nm_drv_init_hold(); + + return ret; +} + +int8_t m2m_wifi_init_start(tstrWifiInitParam *pWifiInitParam) +{ + tstrM2mRev strtmp; + int8_t ret = M2M_SUCCESS; + uint8_t u8WifiMode = M2M_WIFI_MODE_NORMAL; + + if (pWifiInitParam == NULL) { + ret = M2M_ERR_FAIL; + goto _EXIT0; + } + + gpfAppWifiCb = pWifiInitParam->pfAppWifiCb; + + gpfAppEthCb = pWifiInitParam->strEthInitParam.pfAppEthCb; + gau8ethRcvBuf = pWifiInitParam->strEthInitParam.au8ethRcvBuf; + gu16ethRcvBufSize = pWifiInitParam->strEthInitParam.u16ethRcvBufSize; + u8WifiMode = pWifiInitParam->strEthInitParam.u8EthernetEnable; + + if (pWifiInitParam->strEthInitParam.u8EthernetEnable) + u8WifiMode = M2M_WIFI_MODE_ETHERNET; + + + /* Initialize host interface module */ + /* Do this before bringing up the WINC as it can send HIF messages very quickly from bootup and we need to be ready */ + ret = hif_init(NULL); + if (ret != M2M_SUCCESS) goto _EXIT1; + + hif_register_cb(M2M_REQ_GROUP_WIFI, m2m_wifi_cb); + + /* Apply device specific initialization. */ + ret = nm_drv_init_start(&u8WifiMode); + if (ret != M2M_SUCCESS) goto _EXIT0; + + M2M_INFO("Curr driver ver: %u.%u.%u\r\n", M2M_DRIVER_VERSION_MAJOR_NO, M2M_DRIVER_VERSION_MINOR_NO, M2M_DRIVER_VERSION_PATCH_NO); + M2M_INFO("Curr driver HIF Level: (%u) %u.%u\r\n", M2M_HIF_BLOCK_VALUE, M2M_HIF_MAJOR_VALUE, M2M_HIF_MINOR_VALUE); + ret = m2m_wifi_get_firmware_version(&strtmp); + m2m_ota_get_firmware_version(&strtmp); + + if (ret == M2M_SUCCESS) + { + ret = hif_enable_access(); + if (ret == M2M_SUCCESS) + { + m2m_wifi_ble_set_gain_table(pWifiInitParam->GainTableIndex); + } + } + goto _EXIT0; + +_EXIT1: + nm_drv_deinit(NULL); + +_EXIT0: + return ret; +} + +int8_t m2m_wifi_init(tstrWifiInitParam *pWifiInitParam) +{ + int8_t ret = M2M_SUCCESS; + + ret = m2m_wifi_init_hold(); + if (ret == M2M_SUCCESS) + { + ret = m2m_wifi_init_start(pWifiInitParam); + } + return ret; +} + +int8_t m2m_wifi_deinit(void *arg) +{ + hif_deinit(NULL); + nm_drv_deinit(NULL); + + return M2M_SUCCESS; +} + +int8_t m2m_wifi_reinit_hold(void) +{ + m2m_wifi_deinit(NULL); + return m2m_wifi_init_hold(); +} + +int8_t m2m_wifi_reinit_start(tstrWifiInitParam *pWifiInitParam) +{ + return m2m_wifi_init_start(pWifiInitParam); +} + +int8_t m2m_wifi_reinit(tstrWifiInitParam *pWifiInitParam) +{ + int8_t ret = M2M_ERR_FAIL; + ret = m2m_wifi_reinit_hold(); + if (ret == M2M_SUCCESS) { + ret = m2m_wifi_reinit_start(pWifiInitParam); + } + return ret; +} + +uint8_t m2m_wifi_get_state(void) +{ + switch(nm_get_state()) + { + case NM_STATE_DEINIT: + return WIFI_STATE_DEINIT; + case NM_STATE_INIT: + return WIFI_STATE_INIT; + case NM_STATE_START: + return WIFI_STATE_START; + } + return WIFI_STATE_DEINIT; +} + +int8_t m2m_wifi_handle_events(void) +{ + if(WIFI_STATE_START == m2m_wifi_get_state()) + return hif_handle_isr(); + + return M2M_SUCCESS; +} + +int8_t m2m_wifi_delete_sc(char *pcSsid, uint8_t u8SsidLen) +{ + tstrM2mWifiApId strApId; + memset((uint8_t*)&strApId, 0, sizeof(strApId)); + strApId.au8SSID[0] = 0xFF; // Special value used to cause fw to delete all entries. + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQRSP_DELETE_APID, (uint8_t*)&strApId, sizeof(tstrM2mWifiApId), NULL, 0, 0); +} + +int8_t m2m_wifi_default_connect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DEFAULT_CONNECT, NULL, 0, NULL, 0, 0); +} + +/*************************************************************************************************/ +/* WIFI CONNECT INTERNAL FUNCTIONS */ +/*************************************************************************************************/ +static int8_t m2m_wifi_connect_prepare_msg( + tenuCredStoreOption enuCredStoreOption, + tenuM2mSecType enuAuthType, + uint16_t u16AuthSize, + tstrNetworkId *pstrNetworkId, + tstrM2mWifiConnHdr *pstrWifiConn +) +{ + int8_t ret = M2M_ERR_FAIL; + uint16_t u16CredSize = sizeof(tstrM2mConnCredCmn) + u16AuthSize; + /* Check application params. */ + if ( + (pstrNetworkId == NULL) + || (pstrNetworkId->pu8Ssid == NULL) + || (pstrNetworkId->u8SsidLen >= M2M_MAX_SSID_LEN) + ) + goto INVALID_ARG; + + if (pstrWifiConn != NULL) + { + tstrM2mConnCredHdr *pstrHdr = &pstrWifiConn->strConnCredHdr; + tstrM2mConnCredCmn *pstrCmn = &pstrWifiConn->strConnCredCmn; + + memset((uint8_t*)pstrWifiConn, 0, sizeof(tstrM2mWifiConnHdr)); + + pstrHdr->u16CredSize = u16CredSize; + switch(enuCredStoreOption) + { + case WIFI_CRED_SAVE_ENCRYPTED: + pstrHdr->u8CredStoreFlags |= M2M_CRED_ENCRYPT_FLAG; + // intentional fall through... + case WIFI_CRED_SAVE_UNENCRYPTED: + pstrHdr->u8CredStoreFlags |= M2M_CRED_STORE_FLAG; + // intentional fall through... + case WIFI_CRED_DONTSAVE: + break; + default: + goto INVALID_ARG; + } + + if (pstrNetworkId->enuChannel == M2M_WIFI_CH_ALL) + pstrHdr->u8Channel = (uint8_t)(pstrNetworkId->enuChannel); + else if ((pstrNetworkId->enuChannel <= M2M_WIFI_CH_14) && (pstrNetworkId->enuChannel >= M2M_WIFI_CH_1)) + pstrHdr->u8Channel = (uint8_t)(pstrNetworkId->enuChannel) - 1; + else + goto INVALID_ARG; + + if ((enuAuthType == M2M_WIFI_SEC_INVALID) || (enuAuthType >= M2M_WIFI_NUM_AUTH_TYPES)) + goto INVALID_ARG; + pstrCmn->u8AuthType = (uint8_t)enuAuthType; + + pstrCmn->u8SsidLen = pstrNetworkId->u8SsidLen; + memcpy(pstrCmn->au8Ssid, pstrNetworkId->pu8Ssid, pstrNetworkId->u8SsidLen); + if (pstrNetworkId->pu8Bssid != NULL) + { + pstrCmn->u8Options = M2M_WIFI_CONN_BSSID_FLAG; + memcpy(pstrCmn->au8Bssid, pstrNetworkId->pu8Bssid, M2M_MAC_ADDRES_LEN); + } + /* Everything is ok, set return value. */ + ret = M2M_SUCCESS; + } + return ret; +INVALID_ARG: + return M2M_ERR_INVALID_ARG; +} + +static int8_t legacy_connect_prepare_msg(tstrM2mWifiConnHdr *pstrConnHdr, tstrM2mWifiConnectLegacy_1_2 *pstrConnect) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + if ( + !(pstrConnHdr->strConnCredHdr.u8CredStoreFlags & M2M_CRED_ENCRYPT_FLAG) + && !(pstrConnHdr->strConnCredCmn.u8Options & M2M_WIFI_CONN_BSSID_FLAG) + ) + { + memset((uint8_t*)pstrConnect, 0, sizeof(tstrM2mWifiConnectLegacy_1_2)); + memcpy(pstrConnect->au8SSID, pstrConnHdr->strConnCredCmn.au8Ssid, pstrConnHdr->strConnCredCmn.u8SsidLen); + pstrConnect->au8SSID[pstrConnHdr->strConnCredCmn.u8SsidLen] = 0; + pstrConnect->u16Ch = pstrConnHdr->strConnCredHdr.u8Channel; + pstrConnect->u8NoSaveCred = !(pstrConnHdr->strConnCredHdr.u8CredStoreFlags & M2M_CRED_STORE_FLAG); + pstrConnect->strSec.u8SecType = pstrConnHdr->strConnCredCmn.u8AuthType; + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + +/*************************************************************************************************/ +/* WIFI CONNECT APIS */ +/*************************************************************************************************/ +int8_t m2m_wifi_connect_open( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + tstrM2mWifiConnHdr strConnHdr; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, M2M_WIFI_SEC_OPEN, 0, pstrNetworkId, &strConnHdr); + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN, + (uint8_t*)&strConnHdr, sizeof(strConnHdr), + NULL, 0, 0); + if (ret != M2M_SUCCESS) + { + /* Might just be that we are talking to legacy firmware - try the legacy connect message instead. */ + tstrM2mWifiConnectLegacy_1_2 strConnectLegacy; + ret = legacy_connect_prepare_msg(&strConnHdr, &strConnectLegacy); + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, + (uint8_t*)&strConnectLegacy, sizeof(tstrM2mWifiConnectLegacy_1_2), + NULL, 0, 0); + } + } + } + return ret; +} + +int8_t m2m_wifi_connect_wep( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuthWep *pstrAuthWep +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + + if ( + (pstrAuthWep != NULL) && (pstrAuthWep->pu8WepKey != NULL) + && (pstrAuthWep->u8KeyIndx > 0) && (pstrAuthWep->u8KeyIndx <= WEP_KEY_MAX_INDEX) + && ((pstrAuthWep->u8KeySz == WEP_104_KEY_STRING_SIZE) || (pstrAuthWep->u8KeySz == WEP_40_KEY_STRING_SIZE)) + ) + { + tstrM2mWifiConnHdr strConnHdr; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_WEP, + sizeof(tstrM2mWifiWep), + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + tstrM2mWifiWep pstrWep;// = (tstrM2mWifiWep *)OSAL_Malloc(sizeof(tstrM2mWifiWep)); + // if (pstrWep == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + pstrWep.u8KeyIndex = pstrAuthWep->u8KeyIndx - 1; + pstrWep.u8KeyLen = pstrAuthWep->u8KeySz/2; + hexstr_2_bytes(pstrWep.au8WepKey, (pstrAuthWep->pu8WepKey), pstrWep.u8KeyLen); + + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstrWep, sizeof(tstrM2mWifiWep), sizeof(tstrM2mWifiConnHdr)); +// OSAL_Free(pstrWep); + } + if (ret != M2M_SUCCESS) + { + /* Might just be that we are talking to legacy firmware - try the legacy connect message instead. */ + tstrM2mWifiConnectLegacy_1_2 strConnectLegacy; + ret = legacy_connect_prepare_msg(&strConnHdr, &strConnectLegacy); + if (ret == M2M_SUCCESS) + { + tstrM2mWifiWepParamsLegacy_1_2 *pstrWepLegacy = &strConnectLegacy.strSec.uniAuth.strWepInfo; + pstrWepLegacy->u8KeyIndx = pstrAuthWep->u8KeyIndx - 1; + pstrWepLegacy->u8KeySz = pstrAuthWep->u8KeySz; + memcpy(pstrWepLegacy->au8WepKey, pstrAuthWep->pu8WepKey, pstrAuthWep->u8KeySz); + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, + (uint8_t*)&strConnectLegacy, sizeof(tstrM2mWifiConnectLegacy_1_2), + NULL, 0, 0); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_connect_psk( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuthPsk *pstrAuthPsk +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + + if (pstrAuthPsk != NULL) + { + tstrM2mWifiConnHdr strConnHdr; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_WPA_PSK, + sizeof(tstrM2mWifiPsk), + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + tstrM2mWifiPsk pstrPsk;// = (tstrM2mWifiPsk *)OSAL_Malloc(sizeof(tstrM2mWifiPsk)); + // if (pstrPsk == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + memset((uint8_t*)&pstrPsk, 0, sizeof(tstrM2mWifiPsk)); + if (pstrAuthPsk->pu8Psk != NULL) + { + if (pstrAuthPsk->pu8Passphrase != NULL) + ret = M2M_ERR_INVALID_ARG; + else + { + pstrPsk.u8PassphraseLen = M2M_MAX_PSK_LEN-1; + /* Use hexstr_2_bytes to verify pu8Psk input. */ + if (M2M_SUCCESS != hexstr_2_bytes(pstrPsk.au8Passphrase, pstrAuthPsk->pu8Psk, pstrPsk.u8PassphraseLen/2)) + ret = M2M_ERR_INVALID_ARG; + memcpy(pstrPsk.au8Passphrase, pstrAuthPsk->pu8Psk, pstrPsk.u8PassphraseLen); + } + } + else if (pstrAuthPsk->pu8Passphrase != NULL) + { + if (pstrAuthPsk->u8PassphraseLen > M2M_MAX_PSK_LEN-1) + ret = M2M_ERR_INVALID_ARG; + else + { + pstrPsk.u8PassphraseLen = pstrAuthPsk->u8PassphraseLen; + memcpy(pstrPsk.au8Passphrase, pstrAuthPsk->pu8Passphrase, pstrPsk.u8PassphraseLen); + } + } + else + ret = M2M_ERR_INVALID_ARG; + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstrPsk, sizeof(tstrM2mWifiPsk), sizeof(tstrM2mWifiConnHdr)); + } + // OSAL_Free(pstrPsk); + } + if (ret != M2M_SUCCESS) + { + /* Might just be that we are talking to legacy firmware - try the legacy connect message instead. */ + tstrM2mWifiConnectLegacy_1_2 strConnectLegacy; + ret = legacy_connect_prepare_msg(&strConnHdr, &strConnectLegacy); + if (ret == M2M_SUCCESS) + { + uint8_t *pu8PskLegacy = strConnectLegacy.strSec.uniAuth.au8PSK; + memcpy(pu8PskLegacy, pstrAuthPsk->pu8Passphrase, pstrAuthPsk->u8PassphraseLen); + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, + (uint8_t*)&strConnectLegacy, sizeof(tstrM2mWifiConnectLegacy_1_2), + NULL, 0, 0); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_1x_set_option(tenu1xOption enuOptionName, const void *pOptionValue, size_t OptionLen) +{ + if((pOptionValue == NULL) && (OptionLen > 0)) + return M2M_ERR_INVALID_ARG; + switch(enuOptionName) + { + case WIFI_1X_BYPASS_SERVER_AUTH: + if(OptionLen != sizeof(int)) + return M2M_ERR_INVALID_ARG; + switch(*(int*)pOptionValue) + { + case 1: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_PEER_AUTH; + break; + case 0: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_PEER_AUTH; + break; + default: + return M2M_ERR_INVALID_ARG; + } + break; + case WIFI_1X_TIME_VERIF_MODE: + if(OptionLen != sizeof(tenuTlsCertExpSettings)) + return M2M_ERR_INVALID_ARG; + switch(*(tenuTlsCertExpSettings*)pOptionValue) + { + case TLS_CERT_EXP_CHECK_DISABLE: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK; + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME; + break; + case TLS_CERT_EXP_CHECK_ENABLE: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK; + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME; + break; + case TLS_CERT_EXP_CHECK_EN_IF_SYS_TIME: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK; + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME; + break; + default: + return M2M_ERR_INVALID_ARG; + } + break; + case WIFI_1X_SESSION_CACHING: + if(OptionLen != sizeof(int)) + return M2M_ERR_INVALID_ARG; + switch(*(int*)pOptionValue) + { + case 1: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING; + break; + case 0: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING; + break; + default: + return M2M_ERR_INVALID_ARG; + } + break; + case WIFI_1X_SPECIFIC_ROOTCERT: + switch(OptionLen) + { + case 20: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT; + memcpy(gau81xRootSha1, (uint8_t*)pOptionValue, sizeof(gau81xRootSha1)); + break; + case 0: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT; + memset(gau81xRootSha1, 0, sizeof(gau81xRootSha1)); + default: + return M2M_ERR_INVALID_ARG; + } + break; + default: + return M2M_ERR_INVALID_ARG; + } + return M2M_SUCCESS; +} + +int8_t m2m_wifi_1x_get_option(tenu1xOption enuOptionName, void *pOptionValue, size_t *pOptionLen) +{ + if(pOptionValue == NULL) + return M2M_ERR_INVALID_ARG; + switch(enuOptionName) + { + case WIFI_1X_BYPASS_SERVER_AUTH: + if(*pOptionLen < sizeof(int)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(int); + *(int*)pOptionValue = (gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_PEER_AUTH) ? 0 : 1; + break; + case WIFI_1X_TIME_VERIF_MODE: + if(*pOptionLen < sizeof(tenuTlsCertExpSettings)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(tenuTlsCertExpSettings); + if(!(gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK)) + *(tenuTlsCertExpSettings*)pOptionValue = TLS_CERT_EXP_CHECK_DISABLE; + else if(gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME) + *(tenuTlsCertExpSettings*)pOptionValue = TLS_CERT_EXP_CHECK_ENABLE; + else + *(tenuTlsCertExpSettings*)pOptionValue = TLS_CERT_EXP_CHECK_EN_IF_SYS_TIME; + break; + case WIFI_1X_SESSION_CACHING: + if(*pOptionLen < sizeof(int)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(int); + *(int*)pOptionValue = (gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING) ? 1 : 0; + break; + case WIFI_1X_SPECIFIC_ROOTCERT: + if (gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT) + { + if (*pOptionLen < sizeof(gau81xRootSha1)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(gau81xRootSha1); + memcpy((uint8_t*)pOptionValue, gau81xRootSha1, sizeof(gau81xRootSha1)); + } + else + *pOptionLen = 0; + break; + default: + return M2M_ERR_INVALID_ARG; + } + return M2M_SUCCESS; +} + +int8_t m2m_wifi_connect_1x_mschap2( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuth1xMschap2 *pstrAuth1xMschap2 +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + if (pstrAuth1xMschap2 != NULL) + { + if (pstrAuth1xMschap2->pu8Domain == NULL) + pstrAuth1xMschap2->u16DomainLen = 0; + if ( + (pstrAuth1xMschap2->pu8UserName != NULL) + && (pstrAuth1xMschap2->pu8Password != NULL) + && ((uint32_t)(pstrAuth1xMschap2->u16DomainLen) + pstrAuth1xMschap2->u16UserNameLen <= M2M_AUTH_1X_USER_LEN_MAX) + && (pstrAuth1xMschap2->u16PasswordLen <= M2M_AUTH_1X_PASSWORD_LEN_MAX) + ) + { + tstrM2mWifiConnHdr strConnHdr; + uint16_t u16AuthSize = sizeof(tstrM2mWifi1xHdr) + + pstrAuth1xMschap2->u16DomainLen + + pstrAuth1xMschap2->u16UserNameLen + + pstrAuth1xMschap2->u16PasswordLen; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_802_1X, + u16AuthSize, + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + tstrM2mWifi1xHdr pstr1xHdr;// = (tstrM2mWifi1xHdr *)OSAL_Malloc(u16AuthSize); + // if (pstr1xHdr == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + uint8_t *pu8AuthPtr = pstr1xHdr.au81xAuthDetails; + memset((uint8_t*)&pstr1xHdr, 0, u16AuthSize); + + pstr1xHdr.u8Flags = M2M_802_1X_MSCHAP2_FLAG; + if (pstrAuth1xMschap2->bUnencryptedUserName == true) + pstr1xHdr.u8Flags |= M2M_802_1X_UNENCRYPTED_USERNAME_FLAG; + if (pstrAuth1xMschap2->bPrependDomain == true) + pstr1xHdr.u8Flags |= M2M_802_1X_PREPEND_DOMAIN_FLAG; + + pstr1xHdr.u8HdrLength = sizeof(tstrM2mWifi1xHdr); + pstr1xHdr.u32TlsHsFlags = gu321xTlsHsFlags; + memcpy(pstr1xHdr.au8TlsSpecificRootNameSha1, gau81xRootSha1, sizeof(gau81xRootSha1)); + + pstr1xHdr.u8DomainLength = 0; + if (pstrAuth1xMschap2->pu8Domain != NULL) + { + pstr1xHdr.u8DomainLength = (uint8_t)(pstrAuth1xMschap2->u16DomainLen); + memcpy(pu8AuthPtr, pstrAuth1xMschap2->pu8Domain, pstr1xHdr.u8DomainLength); + pu8AuthPtr += pstr1xHdr.u8DomainLength; + } + + pstr1xHdr.u8UserNameLength = (pstrAuth1xMschap2->u16UserNameLen); + memcpy(pu8AuthPtr, pstrAuth1xMschap2->pu8UserName, pstr1xHdr.u8UserNameLength); + pu8AuthPtr += pstr1xHdr.u8UserNameLength; + + pstr1xHdr.u16PrivateKeyOffset = pu8AuthPtr - pstr1xHdr.au81xAuthDetails; + pstr1xHdr.u16PrivateKeyLength = pstrAuth1xMschap2->u16PasswordLen; + memcpy(pu8AuthPtr, pstrAuth1xMschap2->pu8Password, pstr1xHdr.u16PrivateKeyLength); + + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstr1xHdr, u16AuthSize, + sizeof(tstrM2mWifiConnHdr)); + // OSAL_Free(pstr1xHdr); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_connect_1x_tls( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuth1xTls *pstrAuth1xTls +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + if (pstrAuth1xTls != NULL) + { + if (pstrAuth1xTls->pu8Domain == NULL) + pstrAuth1xTls->u16DomainLen = 0; + if ( + (pstrAuth1xTls->pu8UserName != NULL) + && (pstrAuth1xTls->pu8PrivateKey_Mod != NULL) + && (pstrAuth1xTls->pu8PrivateKey_Exp != NULL) + && (pstrAuth1xTls->pu8Certificate != NULL) + && ((uint32_t)(pstrAuth1xTls->u16DomainLen) + pstrAuth1xTls->u16UserNameLen <= M2M_AUTH_1X_USER_LEN_MAX) + && (pstrAuth1xTls->u16PrivateKeyLen <= M2M_AUTH_1X_PRIVATEKEY_LEN_MAX) + && (pstrAuth1xTls->u16CertificateLen <= M2M_AUTH_1X_CERT_LEN_MAX) + ) + { + tstrM2mWifiConnHdr strConnHdr; + uint16_t u16AuthSize = sizeof(tstrM2mWifi1xHdr) + + pstrAuth1xTls->u16DomainLen + + pstrAuth1xTls->u16UserNameLen + + (2 * pstrAuth1xTls->u16PrivateKeyLen) + + pstrAuth1xTls->u16CertificateLen; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_802_1X, + u16AuthSize, + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + uint16_t u16Payload1Size = u16AuthSize - pstrAuth1xTls->u16CertificateLen; + tstrM2mWifi1xHdr pstr1xHdr;// = (tstrM2mWifi1xHdr *)OSAL_Malloc(u16Payload1Size); + // if (pstr1xHdr == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + tstrM2mWifiAuthInfoHdr strInfoHdr = {0}; + + uint8_t *pu8AuthPtr = pstr1xHdr.au81xAuthDetails; + memset((uint8_t*)&pstr1xHdr, 0, u16Payload1Size); + + pstr1xHdr.u8Flags = M2M_802_1X_TLS_FLAG; + if (pstrAuth1xTls->bUnencryptedUserName == true) + pstr1xHdr.u8Flags |= M2M_802_1X_UNENCRYPTED_USERNAME_FLAG; + if (pstrAuth1xTls->bPrependDomain == true) + pstr1xHdr.u8Flags |= M2M_802_1X_PREPEND_DOMAIN_FLAG; + + pstr1xHdr.u8HdrLength = sizeof(tstrM2mWifi1xHdr); + pstr1xHdr.u32TlsHsFlags = gu321xTlsHsFlags; + memcpy(pstr1xHdr.au8TlsSpecificRootNameSha1, gau81xRootSha1, sizeof(gau81xRootSha1)); + + pstr1xHdr.u8DomainLength = 0; + if (pstrAuth1xTls->pu8Domain != NULL) + { + pstr1xHdr.u8DomainLength = (uint8_t)(pstrAuth1xTls->u16DomainLen); + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8Domain, pstr1xHdr.u8DomainLength); + pu8AuthPtr += pstr1xHdr.u8DomainLength; + } + + pstr1xHdr.u8UserNameLength = (pstrAuth1xTls->u16UserNameLen); + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8UserName, pstr1xHdr.u8UserNameLength); + pu8AuthPtr += pstr1xHdr.u8UserNameLength; + + pstr1xHdr.u16PrivateKeyOffset = pu8AuthPtr - pstr1xHdr.au81xAuthDetails; + pstr1xHdr.u16PrivateKeyLength = pstrAuth1xTls->u16PrivateKeyLen; + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8PrivateKey_Mod, pstr1xHdr.u16PrivateKeyLength); + pu8AuthPtr += pstr1xHdr.u16PrivateKeyLength; + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8PrivateKey_Exp, pstr1xHdr.u16PrivateKeyLength); + pu8AuthPtr += pstr1xHdr.u16PrivateKeyLength; + + pstr1xHdr.u16CertificateOffset = pu8AuthPtr - pstr1xHdr.au81xAuthDetails; + pstr1xHdr.u16CertificateLength = pstrAuth1xTls->u16CertificateLen; + + strInfoHdr.u8Type = M2M_802_1X_TLS_CLIENT_CERTIFICATE; + strInfoHdr.u16InfoPos = pstr1xHdr.u16CertificateOffset; + strInfoHdr.u16InfoLen = pstr1xHdr.u16CertificateLength; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_IND_CONN_PARAM | M2M_REQ_DATA_PKT, + (uint8_t*)&strInfoHdr, sizeof(tstrM2mWifiAuthInfoHdr), + pstrAuth1xTls->pu8Certificate, pstrAuth1xTls->u16CertificateLen, + sizeof(tstrM2mWifiAuthInfoHdr)); + + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstr1xHdr, u16Payload1Size, + sizeof(tstrM2mWifiConnHdr)); + } + // OSAL_Free(pstr1xHdr); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_connect(char *pcSsid, uint8_t u8SsidLen, uint8_t u8SecType, void *pvAuthInfo, uint16_t u16Ch) +{ + return m2m_wifi_connect_sc(pcSsid, u8SsidLen, u8SecType, pvAuthInfo, u16Ch, 0); +} + +int8_t m2m_wifi_connect_sc(char *pcSsid, uint8_t u8SsidLen, uint8_t u8SecType, void *pvAuthInfo, uint16_t u16Ch, uint8_t u8NoSaveCred) +{ + int8_t s8Ret = M2M_ERR_INVALID_ARG; + tstrNetworkId strNetworkId = {NULL, (uint8_t*)pcSsid, u8SsidLen, (tenuM2mScanCh)u16Ch}; + tenuCredStoreOption enuCredStoreOption = u8NoSaveCred ? WIFI_CRED_DONTSAVE : WIFI_CRED_SAVE_ENCRYPTED; + + /* This API does not support SSIDs which contain '\0'. If there is a '\0' character within the + * first u8SsidLen characters, then assume that the input u8SsidLen was incorrect - set length + * to strlen(pcSsid) and continue. This is to avoid a change from the behaviour of previously + * released drivers. */ + if (u8SsidLen < M2M_MAX_SSID_LEN) + while(u8SsidLen--) + if (strNetworkId.pu8Ssid[u8SsidLen] == 0) + strNetworkId.u8SsidLen = u8SsidLen; + + switch((tenuM2mSecType)u8SecType) + { + case M2M_WIFI_SEC_OPEN: + s8Ret = m2m_wifi_connect_open(enuCredStoreOption, &strNetworkId); + break; + case M2M_WIFI_SEC_WPA_PSK: + if (pvAuthInfo != NULL) + { + tstrAuthPsk strAuthPsk = {NULL, NULL, 0}; + uint16_t len = strlen((const char*)pvAuthInfo); + + if (len == M2M_MAX_PSK_LEN-1) + { + strAuthPsk.pu8Psk = (uint8_t*)pvAuthInfo; + } + else + { + strAuthPsk.pu8Passphrase = (uint8_t*)pvAuthInfo; + strAuthPsk.u8PassphraseLen = len; + } + s8Ret = m2m_wifi_connect_psk(enuCredStoreOption, &strNetworkId, &strAuthPsk); + } + break; + case M2M_WIFI_SEC_WEP: + if (pvAuthInfo != NULL) + { + tstrM2mWifiWepParams *pstrWepParams = (tstrM2mWifiWepParams *)pvAuthInfo; + tstrAuthWep strAuthWep = {pstrWepParams->au8WepKey, pstrWepParams->u8KeySz-1, pstrWepParams->u8KeyIndx}; + + s8Ret = m2m_wifi_connect_wep(enuCredStoreOption, &strNetworkId, &strAuthWep); + } + break; + default: + break; + } + return s8Ret; +} + +int8_t m2m_wifi_disconnect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISCONNECT, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_set_mac_address(uint8_t au8MacAddress[6]) +{ + tstrM2mSetMacAddress strTmp; + memcpy((uint8_t*)strTmp.au8Mac, (uint8_t*)au8MacAddress, 6); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_ADDRESS, + (uint8_t*)&strTmp, sizeof(tstrM2mSetMacAddress), NULL, 0, 0); +} + +int8_t m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf) +{ + pstrStaticIPConf->u32DNS = NM_BSP_B_L_32(pstrStaticIPConf->u32DNS); + pstrStaticIPConf->u32Gateway = NM_BSP_B_L_32(pstrStaticIPConf->u32Gateway); + pstrStaticIPConf->u32StaticIP = NM_BSP_B_L_32( + pstrStaticIPConf->u32StaticIP); + pstrStaticIPConf->u32SubnetMask = NM_BSP_B_L_32( + pstrStaticIPConf->u32SubnetMask); + return hif_send(M2M_REQ_GROUP_IP, M2M_IP_REQ_STATIC_IP_CONF, + (uint8_t*)pstrStaticIPConf, sizeof(tstrM2MIPConfig), NULL, 0, 0); +} + +int8_t m2m_wifi_enable_dhcp(uint8_t u8DhcpEn) +{ + uint8_t u8Req; + u8Req = u8DhcpEn ? M2M_IP_REQ_ENABLE_DHCP : M2M_IP_REQ_DISABLE_DHCP; + return hif_send(M2M_REQ_GROUP_IP, u8Req, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_LSN_INT, (uint8_t*)pstrM2mLsnInt, sizeof(tstrM2mLsnInt), NULL, 0, 0); +} + +int8_t m2m_wifi_set_cust_InfoElement(uint8_t *pau8M2mCustInfoElement) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CUST_INFO_ELEMENT, (uint8_t*)pau8M2mCustInfoElement, pau8M2mCustInfoElement[0]+1, NULL, 0, 0); +} + +int8_t m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + int8_t s8Ret = M2M_ERR_FAIL; + if (m2m_validate_scan_options(ptstrM2MScanOption) == M2M_SUCCESS) + { + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_OPTION, (uint8_t*)ptstrM2MScanOption, sizeof(tstrM2MScanOption), NULL, 0, 0); + } + return s8Ret; +} + +int8_t m2m_wifi_set_stop_scan_on_first(uint8_t u8StopScanOption) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + tstrM2MStopScanOption StopScanOption = { 0 }; + + if(1 >= u8StopScanOption) + { + StopScanOption.u8StopOnFirstResult = u8StopScanOption; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_STOP_SCAN_OPTION, (uint8_t*)&StopScanOption, sizeof(tstrM2MStopScanOption), NULL, 0, 0); + + M2M_INFO("Scan will %sstop on first result.\r\n", StopScanOption.u8StopOnFirstResult ? "" : "NOT "); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + + return s8Ret; +} + +int8_t m2m_wifi_set_scan_region(uint16_t ScanRegion) +{ + int8_t s8Ret = M2M_ERR_FAIL; + tstrM2MScanRegion strScanRegion; + strScanRegion.u16ScanRegion = ScanRegion; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_REGION, (uint8_t*)&strScanRegion, sizeof(tstrM2MScanRegion), NULL, 0, 0); + return s8Ret; +} + +int8_t m2m_wifi_request_scan(uint8_t ch) +{ + int8_t s8Ret = M2M_SUCCESS; + + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN, (uint8_t*)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} + +int8_t m2m_wifi_request_scan_passive(uint8_t ch) +{ + int8_t s8Ret = M2M_SUCCESS; + + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_PASSIVE_SCAN, (uint8_t*)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} + +int8_t m2m_wifi_request_scan_ssid_list(uint8_t ch, uint8_t *u8Ssidlist) +{ + int8_t s8Ret = M2M_ERR_INVALID_ARG; + + if((((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL))&&(u8Ssidlist != NULL)) + { + tstrM2MScan strtmp; + uint16_t u16Lsize = 0; + uint8_t u8Apnum = u8Ssidlist[u16Lsize]; + if(u8Apnum <= MAX_HIDDEN_SITES) + { + u16Lsize++; + while(u8Apnum) + { + if(u8Ssidlist[u16Lsize] >= M2M_MAX_SSID_LEN) { + goto EXIT; + } else { + u16Lsize += u8Ssidlist[u16Lsize] + 1; + u8Apnum--; + } + } + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN_SSID_LIST|M2M_REQ_DATA_PKT, (uint8_t*)&strtmp, sizeof(tstrM2MScan), u8Ssidlist, u16Lsize, sizeof(tstrM2MScan)); + } + } +EXIT: + return s8Ret; +} +int8_t m2m_wifi_wps(uint8_t u8TriggerType, const char *pcPinNumber) +{ + tstrM2MWPSConnect strtmp; + + strtmp.u8TriggerType = u8TriggerType; + /*If WPS is using PIN METHOD*/ + if (u8TriggerType == WPS_PIN_TRIGGER) + memcpy((uint8_t*)strtmp.acPinNumber, (uint8_t*)pcPinNumber, 8); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_WPS, (uint8_t*)&strtmp, sizeof(tstrM2MWPSConnect), NULL, 0, 0); +} + +int8_t m2m_wifi_wps_disable(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_WPS, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_p2p(uint8_t u8Channel) +{ + int8_t ret = M2M_SUCCESS; + if ((u8Channel == M2M_WIFI_CH_1) || (u8Channel == M2M_WIFI_CH_6) || (u8Channel == M2M_WIFI_CH_11)) + { + tstrM2MP2PConnect strtmp; + strtmp.u8ListenChannel = u8Channel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_P2P, (uint8_t*)&strtmp, sizeof(tstrM2MP2PConnect), NULL, 0, 0); + } + else + { + M2M_ERR("Listen channel should only be 1, 6 or 11\r\n"); + ret = M2M_ERR_FAIL; + } + return ret; +} + +int8_t m2m_wifi_p2p_disconnect(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_P2P, NULL, 0, NULL, 0, 0); + return ret; +} +int8_t m2m_wifi_enable_ap(const tstrM2MAPConfig *pstrM2MAPConfig) +{ + tstrM2MAPModeConfig strM2MAPModeConfig; + + memcpy((uint8_t*)&strM2MAPModeConfig.strApConfig, (uint8_t*)pstrM2MAPConfig, sizeof(tstrM2MAPConfig)); + + memcpy(strM2MAPModeConfig.strApConfigExt.au8DefRouterIP, (uint8_t*)pstrM2MAPConfig->au8DHCPServerIP, 4); + memcpy(strM2MAPModeConfig.strApConfigExt.au8DNSServerIP, (uint8_t*)pstrM2MAPConfig->au8DHCPServerIP, 4); + strM2MAPModeConfig.strApConfigExt.au8SubnetMask[0] = 0; + + return m2m_wifi_enable_ap_ext(&strM2MAPModeConfig); +} + +int8_t m2m_wifi_enable_ap_ext(const tstrM2MAPModeConfig *pstrM2MAPModeConfig) +{ + int8_t ret = M2M_ERR_FAIL; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrM2MAPModeConfig)) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_AP, (uint8_t*)pstrM2MAPModeConfig, sizeof(tstrM2MAPModeConfig), NULL, 0, 0); + + if (ret == M2M_ERR_SEND) + { + // Send again using legacy HIF message. + ret = hif_send( + M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_ENABLE_AP_LEGACY, + (uint8_t*)&pstrM2MAPModeConfig->strApConfig, + sizeof(tstrM2MAPConfig), + NULL, + 0, + 0 + ); + } + } + return ret; +} + +int8_t m2m_wifi_disable_ap(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_AP, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn int8_t m2m_wifi_req_curr_rssi(void); +@brief Request the current RSSI for the current connected AP, + the response received in wifi_cb M2M_WIFI_RESP_CURRENT_RSSI +@sa M2M_WIFI_RESP_CURRENT_RSSI +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_req_curr_rssi(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CURRENT_RSSI, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_req_restrict_ble(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_RESTRICT_BLE, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_req_unrestrict_ble(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_UNRESTRICT_BLE, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_send_ethernet_pkt(uint8_t *pu8Packet, uint16_t u16PacketSize) +{ + int8_t s8Ret = -1; + if ((pu8Packet != NULL)&&(u16PacketSize>0)) + { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16PacketSize; + strTxPkt.u16HeaderLength = M2M_ETHERNET_HDR_LEN; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SEND_ETHERNET_PACKET | M2M_REQ_DATA_PKT, + (uint8_t*)&strTxPkt, sizeof(tstrM2MWifiTxPacketInfo), pu8Packet, u16PacketSize, M2M_ETHERNET_HDR_OFFSET - M2M_HIF_HDR_OFFSET); + } + return s8Ret; +} + +/*! +@fn int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t * pu8IsValid); +@brief Request the MAC address stored on the OTP (one time programmable) memory of the device. + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. Valid only if *pu8Valid=1. +@param [out] pu8IsValid + A output boolean value to indicate the validity of pu8MacAddr in OTP. + Output zero if the OTP memory is not programmed, non-zero otherwise. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nmi_get_otp_mac_address(pu8MacAddr, pu8IsValid); + hif_chip_sleep(); + } + return ret; +} + +/*! +@fn int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr) +@brief Request the current MAC address of the device (the working mac address). + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_otp_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nmi_get_mac_address(pu8MacAddr); + hif_chip_sleep(); + } + + return ret; +} + +/*! +@fn int8_t m2m_wifi_req_scan_result(uint8_t index); +@brief Reads the AP information from the Scan Result list with the given index, + the response received in wifi_cb M2M_WIFI_RESP_SCAN_RESULT, + the response pointer should be casted with tstrM2mWifiscanResult structure +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found +@sa tstrM2mWifiscanResult,m2m_wifi_get_num_ap_found,m2m_wifi_request_scan +@return The function shall return @ref M2M_SUCCESS for success and a negative value otherwise +@pre m2m_wifi_request_scan need to be called first, then m2m_wifi_get_num_ap_found + to get the number of AP's found +@warning Function used only in STA mode only. the scan result updated only if scan request called, + else it will be cashed in firmware for the host scan request result, + which mean if large delay occur between the scan request and the scan result request, + the result will not be up-to-date +*/ + +int8_t m2m_wifi_req_scan_result(uint8_t index) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mReqScanResult strReqScanRlt; + strReqScanRlt.u8Index = index; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN_RESULT, (uint8_t*)&strReqScanRlt, sizeof(tstrM2mReqScanResult), NULL, 0, 0); + return ret; +} + +/*! +@fn uint8_t m2m_wifi_get_num_ap_found(void); +@brief Reads the number of AP's found in the last Scan Request, + The function read the number of AP's from global variable which updated in the + wifi_cb in M2M_WIFI_RESP_SCAN_DONE. +@sa m2m_wifi_request_scan +@return Return the number of AP's found in the last Scan Request. +@pre m2m_wifi_request_scan need to be called first +@warning That function need to be called in the wifi_cb in M2M_WIFI_RESP_SCAN_DONE, + calling that function in any other place will return undefined/undated numbers. + Function used only in STA mode only. +*/ +uint8_t m2m_wifi_get_num_ap_found(void) +{ + return gu8ChNum; +} + +/*! +@fn uint8_t m2m_wifi_get_sleep_mode(void); +@brief Get the current Power save mode. +@return The current operating power saving mode. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +*/ +uint8_t m2m_wifi_get_sleep_mode(void) +{ + return hif_get_sleep_mode(); +} + +/*! +@fn int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn); +@brief Set the power saving mode for the WINC3400. +@param [in] PsTyp + Desired power saving mode. Supported types are defined in tenuPowerSaveModes. +@param [in] BcastEn + Broadcast reception enable flag. + If it is 1, the WINC3400 must be awake each DTIM Beacon for receiving Broadcast traffic. + If it is 0, the WINC3400 will not wakeup at the DTIM Beacon, but its wakeup depends only + on the the configured Listen Interval. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tenuPowerSaveModes +@warning The function called once after initialization. +*/ +int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mPsType strPs; + strPs.u8PsType = PsTyp; + strPs.u8BcastEn = BcastEn; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SLEEP, (uint8_t*)&strPs, sizeof(tstrM2mPsType), NULL, 0, 0); + M2M_INFO("POWER SAVE %d\r\n", PsTyp); + hif_set_sleep_mode(PsTyp); + return ret; +} + +/*! +@fn int8_t m2m_wifi_request_sleep(void) +@brief Request from WINC3400 device to Sleep for specific time in the M2M_PS_MANUAL Power save mode (only). +@param [in] u32SlpReqTime + Request Sleep in ms +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +@warning This API is currently unsupported on the WINC3400 +*/ +int8_t m2m_wifi_request_sleep(uint32_t u32SlpReqTime) +{ + int8_t ret = M2M_SUCCESS; + uint8_t psType; + psType = hif_get_sleep_mode(); + if (psType == M2M_PS_MANUAL) + { + tstrM2mSlpReqTime strPs; + strPs.u32SleepTime = u32SlpReqTime; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DOZE, (uint8_t*)&strPs, sizeof(tstrM2mSlpReqTime), NULL, 0, 0); + } + return ret; +} + +/*! +@fn int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength); +@brief Set the WINC3400 device name which is used as P2P device name. +@param [in] pu8DeviceName + Buffer holding the device name. +@param [in] u8DeviceNameLength + Length of the device name. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@warning The Function called once after initialization. +*/ +int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength) +{ + tstrM2MDeviceNameConfig strDeviceName; + if (u8DeviceNameLength >= M2M_DEVICE_NAME_MAX) + { + u8DeviceNameLength = M2M_DEVICE_NAME_MAX; + } + //pu8DeviceName[u8DeviceNameLength] = '\0'; + u8DeviceNameLength ++; + memcpy(strDeviceName.au8DeviceName, pu8DeviceName, u8DeviceNameLength); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_DEVICE_NAME, + (uint8_t*)&strDeviceName, sizeof(tstrM2MDeviceNameConfig), NULL, 0, 0); +} + +/*! +@fn int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP); +@brief Configures what NTP server the SNTP client should use. +@param [in] pu8NTPServerName + Buffer holding the NTP server name. If the first character is an asterisk (*) then it will be treated as a server pool, where the asterisk will + be replaced with an incrementing value from 0 to 3 each time a server fails (example: *.pool.ntp.org). +@param [in] u8NTPServerNameLength + Length of the NTP server name. Should not exceed the maximum NTP server name length of @ref M2M_NTP_MAX_SERVER_NAME_LENGTH +@param [in] useDHCP + Should the NTP server provided by the DHCP server be used. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP) +{ + tstrM2MSNTPConfig strSNTPConfig; + if (u8NTPServerNameLength > M2M_NTP_MAX_SERVER_NAME_LENGTH) + return M2M_ERR_FAIL; + + memcpy((uint8_t*)strSNTPConfig.acNTPServer, pu8NTPServerName, u8NTPServerNameLength); + strSNTPConfig.acNTPServer[u8NTPServerNameLength] = '\0'; + + strSNTPConfig.enuUseDHCP = useDHCP; + + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONFIG_SNTP, + (uint8_t*)&strSNTPConfig, sizeof(tstrM2MSNTPConfig), NULL, 0, 0); +} + +/*! +@fn \ + uint32_t m2m_wifi_get_chipId(void) + +@brief + Get the WINC Chip ID. + +@return + The function SHALL return chipID >0 or 0 for failure. +*/ +uint32_t m2m_wifi_get_chipId(void) +{ + return nmi_get_chipid(); +} + +/*! +@fn int8_t m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev) + +@brief + Synchronous API to obtain the firmware version currently running on the WINC IC + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nm_get_firmware_full_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} + +/*! +@fn int8_t m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@return + The function SHALL return @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +int8_t m2m_wifi_check_ota_rb(void) +{ + int8_t ret = M2M_SUCCESS; + uint16_t ota_hif_info = 0; + + ret = nm_get_hif_info(NULL, &ota_hif_info); + if (ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(ota_hif_info); + } + return ret; +} + +/*! +@fn \ + int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the ota fw version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nm_get_ota_firmware_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} + +int8_t m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrM2MAPConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect) +{ + tstrM2MAPModeConfig strM2MAPModeConfig; + + memcpy((uint8_t*)&strM2MAPModeConfig.strApConfig, (uint8_t*)pstrM2MAPConfig, sizeof(tstrM2MAPConfig)); + + memcpy(strM2MAPModeConfig.strApConfigExt.au8DefRouterIP, pstrM2MAPConfig->au8DHCPServerIP, 4); + memcpy(strM2MAPModeConfig.strApConfigExt.au8DNSServerIP, pstrM2MAPConfig->au8DHCPServerIP, 4); + strM2MAPModeConfig.strApConfigExt.au8SubnetMask[0] = 0; + + return m2m_wifi_start_provision_mode_ext(&strM2MAPModeConfig, pcHttpServerDomainName, bEnableHttpRedirect); +} + +int8_t m2m_wifi_start_provision_mode_ext(tstrM2MAPModeConfig *pstrAPModeConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + if ((pstrAPModeConfig != NULL)) + { + tstrM2MProvisionModeConfig strProvConfig; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrAPModeConfig)) + { + memcpy((uint8_t*)&strProvConfig.strApConfig, (uint8_t*)&pstrAPModeConfig->strApConfig, sizeof(tstrM2MAPConfig)); + memcpy((uint8_t*)&strProvConfig.strApConfigExt, (uint8_t*)&pstrAPModeConfig->strApConfigExt, sizeof(tstrM2MAPConfigExt)); + if ((strlen((const char*)pcHttpServerDomainName) <= 0) || (NULL == pcHttpServerDomainName)) + { + M2M_ERR("INVALID DOMAIN NAME\r\n"); + goto ERR1; + } + memcpy((uint8_t*)strProvConfig.acHttpServerDomainName, (uint8_t*)pcHttpServerDomainName, 64); + strProvConfig.u8EnableRedirect = bEnableHttpRedirect; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_START_PROVISION_MODE | M2M_REQ_DATA_PKT, + (uint8_t*)&strProvConfig, sizeof(tstrM2MProvisionModeConfig), NULL, 0, 0); + + if (s8Ret == M2M_ERR_SEND) + { + // Send again using legacy HIF message. We can use the same structure here as + // the firmware only uses to the HIF message to determine whether or not the + // structure contains a tstrM2MAPConfigExt structure. + s8Ret = hif_send( + M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_START_PROVISION_MODE_LEGACY | M2M_REQ_DATA_PKT, + (uint8_t*)&strProvConfig, + sizeof(tstrM2MProvisionModeConfig), + NULL, + 0, + 0 + ); + } + } + else + { + /*goto ERR1;*/ + } + } +ERR1: + return s8Ret; +} + +int8_t m2m_wifi_stop_provision_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_STOP_PROVISION_MODE, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_get_connection_info(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_CONN_INFO, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_set_system_time(uint32_t u32UTCSeconds) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SYS_TIME, (uint8_t*)&u32UTCSeconds, sizeof(tstrSystemTime), NULL, 0, 0); +} + +/*! + * @fn int8_t m2m_wifi_get_system_time(void); + * @see m2m_wifi_enable_sntp + tstrSystemTime + * @note get the system time from the sntp client + * using the API \ref m2m_wifi_get_system_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_wifi_get_system_time(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_SYS_TIME, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_enable_sntp(uint8_t bEnable) +{ + uint8_t u8Req; + + u8Req = bEnable ? M2M_WIFI_REQ_ENABLE_SNTP_CLIENT : M2M_WIFI_REQ_DISABLE_SNTP_CLIENT; + return hif_send(M2M_REQ_GROUP_WIFI, u8Req, NULL, 0, NULL, 0, 0); +} + +/*! +@fn int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode); +@brief Change the power profile mode\n + Not implemented in WINC3400 firmware. +@param [in] u8PwrMode + Change the WINC power profile to different mode + PWR_LOW1/PWR_LOW2/PWR_HIGH/PWR_AUTO (tenuM2mPwrMode) +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mPwrMode +@pre m2m_wifi_init +@warning must be called after the initializations and before any connection request and can't be changed in run time, +*/ +int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mPwrMode strM2mPwrMode; + strM2mPwrMode.u8PwrMode = u8PwrMode; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_POWER_PROFILE, (uint8_t*)&strM2mPwrMode, sizeof(tstrM2mPwrMode), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel); +@brief set the TX power tenuM2mTxPwrLevel +@param [in] u8TxPwrLevel + change the TX power tenuM2mTxPwrLevel +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mTxPwrLevel +@pre m2m_wifi_init +@warning +*/ +int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mTxPwrLevel strM2mTxPwrLevel; + strM2mTxPwrLevel.u8TxPwrLevel = u8TxPwrLevel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_TX_POWER, (uint8_t*)&strM2mTxPwrLevel, sizeof(tstrM2mTxPwrLevel), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u8Enable + Set 1 to enable the logs 0 for disable +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mEnableLogs strM2mEnableLogs; + strM2mEnableLogs.u8Enable = u8Enable; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_ENABLE_LOGS, (uint8_t*)&strM2mEnableLogs, sizeof(tstrM2mEnableLogs), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100); +@brief Set the battery voltage to update the firmware calculations. \n + Not implemented in WINC3400 firmware. +@param [in] u16BattVoltx100 + battery voltage multiplied by 100 +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mBatteryVoltage strM2mBattVol = {0}; + strM2mBattVol.u16BattVolt = u16BattVoltx100; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, (uint8_t*)&strM2mBattVol, sizeof(tstrM2mBatteryVoltage), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_prng_get_random_bytes(uint8_t * pu8PrngBuff,uint16_t u16PrngSize) +@brief Get random bytes using the PRNG bytes. +@param [in] u16PrngSize + Size of the required random bytes to be generated. +@param [in] pu8PrngBuff + Pointer to user allocated buffer. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_prng_get_random_bytes(uint8_t *pu8PrngBuff, uint16_t u16PrngSize) +{ + int8_t ret = M2M_ERR_FAIL; + tstrPrng strRng = {0}; + if ((u16PrngSize < (M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)))&&(pu8PrngBuff != NULL)) + { + strRng.u16PrngSize = u16PrngSize; + strRng.pu8RngBuff = pu8PrngBuff; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_PRNG|M2M_REQ_DATA_PKT, (uint8_t*)&strRng, sizeof(tstrPrng), NULL, 0, 0); + } + else + { + M2M_ERR("PRNG Buffer exceeded maximum size %d or NULL Buffer\r\n", u16PrngSize); + } + return ret; +} + +/*! +@fn \ + int8_t m2m_wifi_enable_mac_mcast(uint8_t* pu8MulticastMacAddress, uint8_t u8AddRemove) + +@brief + Add MAC filter to receive Multicast packets. + +@param [in] pu8MulticastMacAddress + Pointer to the MAC address. +@param [in] u8AddRemove + Flag to Add/Remove MAC address. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t m2m_wifi_enable_mac_mcast(uint8_t *pu8MulticastMacAddress, uint8_t u8AddRemove) +{ + int8_t s8ret = M2M_ERR_FAIL; + tstrM2MMulticastMac strMulticastMac; + + if (pu8MulticastMacAddress != NULL) + { + strMulticastMac.u8AddRemove = u8AddRemove; + memcpy(strMulticastMac.au8macaddress, pu8MulticastMacAddress, M2M_MAC_ADDRES_LEN); + M2M_DBG("mac multicast: %x:%x:%x:%x:%x:%x\r\n", strMulticastMac.au8macaddress[0], strMulticastMac.au8macaddress[1], strMulticastMac.au8macaddress[2], strMulticastMac.au8macaddress[3], strMulticastMac.au8macaddress[4], strMulticastMac.au8macaddress[5]); + s8ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_MCAST, (uint8_t*)&strMulticastMac, sizeof(tstrM2MMulticastMac), NULL, 0, 0); + } + + return s8ret; +} + +/*! +@fn \ + int8_t m2m_wifi_set_receive_buffer(void* pvBuffer,uint16_t u16BufferLen); + +@brief + set the Ethernet receive buffer, should be called in the receive call back. + +@param [in] pvBuffer + Pointer to the Ethernet receive buffer. +@param [in] u16BufferLen + Length of the buffer. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t m2m_wifi_set_receive_buffer(void *pvBuffer, uint16_t u16BufferLen) +{ + int8_t s8ret = M2M_SUCCESS; + if (pvBuffer != NULL) + { + gau8ethRcvBuf = pvBuffer; + gu16ethRcvBufSize= u16BufferLen; + } + else + { + s8ret = M2M_ERR_FAIL; + M2M_ERR("Buffer NULL pointer\r\n"); + } + return s8ret; +} + +int8_t m2m_wifi_enable_roaming(uint8_t bEnableDhcp) +{ + tstrM2mWiFiRoaming strWiFiRoaming; + strWiFiRoaming.u8EnableRoaming = 1; + if (0 == bEnableDhcp || 1 == bEnableDhcp) + { + strWiFiRoaming.u8EnableDhcp = bEnableDhcp; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ROAMING, + (uint8_t*)&strWiFiRoaming, sizeof(tstrM2mWiFiRoaming), NULL, 0, 0); + } + else + { + return M2M_ERR_INVALID_ARG; + } +} + +int8_t m2m_wifi_disable_roaming(void) +{ + tstrM2mWiFiRoaming strWiFiRoaming; + strWiFiRoaming.u8EnableRoaming = 0; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ROAMING, (uint8_t*)&strWiFiRoaming, sizeof(tstrM2mWiFiRoaming), NULL, 0, 0); +} + +/*! +@fn \ + int8_t m2m_wifi_ble_api_send(const uint8_t* const msg, const uint32_t len); + +@brief + Send an encapsulated Atmel BLE API message + +@param [in] msg + Pointer to the Atmel BLE API message raw bytes +@param [in] len + Length of the msg + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t m2m_wifi_ble_api_send(uint8_t *msg, uint32_t len) +{ + tstrM2mBleApiMsg bleTx; + bleTx.u16Len = len; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_BLE_API_SEND | M2M_REQ_DATA_PKT, + (uint8_t*)&bleTx, sizeof(tstrM2mBleApiMsg), msg, len, sizeof(tstrM2mBleApiMsg)); +} + +//DOM-IGNORE-END diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/nmasic.c b/ChaletLora.X/Source/winc3400_142/driver/source/nmasic.c new file mode 100644 index 0000000..5ea608b --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/nmasic.c @@ -0,0 +1,706 @@ +/******************************************************************************* + File Name: + nmasic.c + + Summary: + This module contains WINC3400 ASIC specific internal APIs. + + Description: + This module contains WINC3400 ASIC specific internal APIs. + *******************************************************************************/ + +//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. +*******************************************************************************/ + +#include "nm_common.h" +#include "nmbus.h" +#include "nm_bsp.h" +#include "nmasic.h" +#include "m2m_types.h" + +#define NMI_GLB_RESET_0 (NMI_PERIPH_REG_BASE + 0x400) +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32_t)X[1+Y]<<8) + ((uint32_t)X[2+Y]<<16) +((uint32_t)X[3+Y]<<24)) + +#define CORT_HOST_COMM (0x14) +#define HOST_CORT_COMM (0x0e) +#define WAKE_CLK_REG (0x1) +#define CLOCKS_EN_REG (0x13) + +#define TIMEOUT (2000) +#define WAKEUP_TRIALS (4) + +int8_t chip_apply_conf(uint32_t u32Conf) +{ + int8_t ret = M2M_SUCCESS; + uint32_t val32 = u32Conf; + +#ifdef __ENABLE_PMU__ + val32 |= rHAVE_USE_PMU_BIT; +#endif +#ifdef __ENABLE_SLEEP_CLK_SRC_RTC__ + val32 |= rHAVE_SLEEP_CLK_SRC_RTC_BIT; +#elif defined __ENABLE_SLEEP_CLK_SRC_XO__ + val32 |= rHAVE_SLEEP_CLK_SRC_XO_BIT; +#endif +#ifdef __ENABLE_EXT_PA_INV_TX_RX__ + val32 |= rHAVE_EXT_PA_INV_TX_RX; +#endif +#ifdef __ENABLE_LEGACY_RF_SETTINGS__ + val32 |= rHAVE_LEGACY_RF_SETTINGS; +#endif +#ifdef __DISABLE_FIRMWARE_LOGS__ + val32 |= rHAVE_LOGS_DISABLED_BIT; +#endif + do { + nm_write_reg(rNMI_GP_REG_1, val32); + if(val32 != 0) { + uint32_t reg = 0; + ret = nm_read_reg_with_ret(rNMI_GP_REG_1, ®); + if(ret == M2M_SUCCESS) { + if(reg == val32) + break; + } + } else { + break; + } + } while(1); + + return M2M_SUCCESS; +} + +void chip_idle(void) +{ + uint32_t reg =0; + nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if(reg&NBIT1) + { + reg &=~NBIT1; + nm_write_reg(WAKE_CLK_REG, reg); + } +} + +void enable_rf_blocks(void) +{ + nm_write_reg(0x6, 0xdb); + nm_write_reg(0x7, 0x6); + nm_sleep(10); + nm_write_reg(0x1480, 0); + nm_write_reg(0x1484, 0); + nm_sleep(10); + + nm_write_reg(0x6, 0x0); + nm_write_reg(0x7, 0x0); +} + +int8_t enable_interrupts(void) +{ + uint32_t reg = 0; + int8_t ret = M2M_SUCCESS; + /** + interrupt pin mux select + **/ + ret = nm_read_reg_with_ret(NMI_PIN_MUX_0, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32_t) 1 << 8); + ret = nm_write_reg(NMI_PIN_MUX_0, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + /** + interrupt enable + **/ + ret = nm_read_reg_with_ret(NMI_INTR_ENABLE, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32_t) 1 << 16); + ret = nm_write_reg(NMI_INTR_ENABLE, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + return M2M_SUCCESS; +} + +int8_t cpu_start(void) { + uint32_t reg = 0; + int8_t ret; + + /** + reset regs + */ + ret = nm_write_reg(BOOTROM_REG, 0); + ret += nm_write_reg(NMI_STATE_REG, 0); + ret += nm_write_reg(NMI_REV_REG, 0); + + /** + Go... + **/ + ret += nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\r\n"); + } + reg |= NBIT0; + ret += nm_write_reg(0x1118, reg); + ret = nm_write_reg(0x150014, 0x1); //DTODO WHY IS THIS HERE?? + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + } + + reg |= (1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + nm_sleep(1); /* Removing this can cause a bus error. */ + return ret; +} + +uint32_t nmi_get_chipid(void) +{ + static uint32_t chipid = 0; + + if (chipid == 0) { + uint32_t rfrevid; + + if ((nm_read_reg_with_ret(0x1000, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if ((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + + if (chipid == 0x1002a0) { + if (rfrevid == 0x1) { /* 1002A0 */ + } else /* if (rfrevid == 0x2) */ { /* 1002A1 */ + chipid = 0x1002a1; + } + } else if (chipid == 0x1002b0) { + if (rfrevid == 3) { /* 1002B0 */ + } else if (rfrevid == 4) { /* 1002B1 */ + chipid = 0x1002b1; + } else /* if(rfrevid == 5) */ { /* 1002B2 */ + chipid = 0x1002b2; + } + } else if(chipid == 0x1000f0) { + /* For 3400, the WiFi chip ID register reads 0x1000f0. + * Therefore using BT chip ID register here which should read 0x3000D0 + */ +#define rBT_CHIP_ID_REG (0x3b0000) + if((nm_read_reg_with_ret(rBT_CHIP_ID_REG, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if(chipid == 0x3000d0) { + if(rfrevid == 6) { + chipid = 0x3000d1; + } + else if(rfrevid == 2) { + chipid = 0x3000d2; + } + } + } +//#define PROBE_FLASH +#ifdef PROBE_FLASH + if(chipid) { + UWORD32 flashid; + + flashid = probe_spi_flash(); + if((chipid & 0xf00000) == 0x300000) { + if(flashid == 0x1440ef) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } + } else { + if(flashid == 0x1230ef) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + if(flashid == 0xc21320c2) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + } + } +#else + /*M2M is by default have SPI flash*/ + if((chipid & 0xf00000) == 0x300000) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } else { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } +#endif /* PROBE_FLASH */ + } + return chipid; +} + +uint32_t nmi_get_rfrevid(void) +{ + uint32_t rfrevid; + if((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + rfrevid = 0; + } + return rfrevid; +} + +void restore_pmu_settings_after_global_reset(void) +{ + /* + * Must restore PMU register value after + * global reset if PMU toggle is done at + * least once since the last hard reset. + */ + if(REV(nmi_get_chipid()) >= REV_2B0) { + nm_write_reg(0x1e48, 0xb78469ce); + } +} + +void nmi_update_pll(void) +{ + uint32_t pll; + + pll = nm_read_reg(0x1428); + pll &= ~0x1ul; + nm_write_reg(0x1428, pll); + pll |= 0x1ul; + nm_write_reg(0x1428, pll); + +} +void nmi_set_sys_clk_src_to_xo(void) +{ + uint32_t val32; + + /* Switch system clock source to XO. This will take effect after nmi_update_pll(). */ + val32 = nm_read_reg(0x141c); + val32 |= (1 << 2); + nm_write_reg(0x141c, val32); + + /* Do PLL update */ + nmi_update_pll(); +} + +int8_t chip_sleep(void) +{ + uint32_t reg; + int8_t ret = M2M_SUCCESS; + + while(1) + { + ret = nm_read_reg_with_ret(CORT_HOST_COMM, ®); + if(ret != M2M_SUCCESS) goto ERR1; + if((reg & NBIT0) == 0) break; + } + + /* Clear bit 1 */ + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if(ret != M2M_SUCCESS)goto ERR1; + if(reg & NBIT1) + { + reg &=~NBIT1; + ret = nm_write_reg(WAKE_CLK_REG, reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if(ret != M2M_SUCCESS)goto ERR1; + if(reg & NBIT0) + { + reg &= ~NBIT0; + ret = nm_write_reg(HOST_CORT_COMM, reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + +ERR1: + return ret; +} + +int8_t chip_wake(void) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0, clk_status_reg = 0, trials = 0; + + nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg); + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if(ret != M2M_SUCCESS)goto _WAKE_EXIT; + + if(!(reg & NBIT0)) + { + /*USE bit 0 to indicate host wakeup*/ + ret = nm_write_reg(HOST_CORT_COMM, reg|NBIT0); + if(ret != M2M_SUCCESS)goto _WAKE_EXIT; + } + + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if(ret != M2M_SUCCESS) goto _WAKE_EXIT; + + /* Set bit 1 */ + if(!(reg & NBIT1)) + { + ret = nm_write_reg(WAKE_CLK_REG, reg | NBIT1); + if(ret != M2M_SUCCESS) goto _WAKE_EXIT; + } + + do + { + ret = nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg); + if(ret != M2M_SUCCESS) { + M2M_ERR("Bus error (5).%d %" PRIx32 "\n", ret, clk_status_reg); + goto _WAKE_EXIT; + } + if (clk_status_reg & NBIT2) { + break; + } + nm_sleep(2); + trials++; + if (trials > WAKEUP_TRIALS) + { + M2M_ERR("Failed to wakeup the chip\n"); + ret = M2M_ERR_TIME_OUT; + goto _WAKE_EXIT; + } + } while(1); + /* Workaround sometimes spi fail to read clock regs after reading/writing clockless registers */ + //nm_bus_reset(); +_WAKE_EXIT: + return ret; +} + +int8_t chip_reset_and_cpu_halt(void) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0; + + ret = chip_wake(); + if (ret != M2M_SUCCESS) { + return ret; + } + chip_reset(); + ret = nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\r\n"); + } + reg |= (1 << 0); + ret = nm_write_reg(0x1118, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + } + nm_write_reg(BOOTROM_REG, 0); + nm_write_reg(NMI_STATE_REG, 0); + nm_write_reg(NMI_REV_REG, 0); + nm_write_reg(NMI_PIN_MUX_0, 0x11111000); + return ret; +} +int8_t chip_reset(void) +{ + int8_t ret = M2M_SUCCESS; + + ret += nm_write_reg(NMI_GLB_RESET_0, 0); + nm_sleep(50); + return ret; +} + +int8_t wait_for_bootrom(uint8_t arg) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0, cnt = 0; + uint32_t u32GpReg1 = 0; + + reg = 0; + while(1) { + reg = nm_read_reg(0x1014); /* wait for efuse loading done */ + if (reg & 0x80000000) { + break; + } + nm_sleep(1); /* Removing this can cause a bus error. */ + } + reg = nm_read_reg(M2M_WAIT_FOR_HOST_REG); + reg &= 0x1; + + /* check if waiting for the host will be skipped or not */ + if(reg == 0) + { + while(reg != M2M_FINISH_BOOT_ROM) + { + nm_sleep(1); + reg = nm_read_reg(BOOTROM_REG); + + if (++cnt > TIMEOUT) + { + M2M_DBG("failed to load firmware from flash.\r\n"); + ret = M2M_ERR_INIT; + goto ERR2; + } + } + } + + if (M2M_WIFI_MODE_CONFIG == arg) { + nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE); + } else if (M2M_WIFI_MODE_ETHERNET == arg) { + u32GpReg1 = rHAVE_ETHERNET_MODE_BIT; + } else { + /*bypass this step*/ + } + + if (REV(nmi_get_chipid()) == REV_3A0) + { + chip_apply_conf(u32GpReg1 | rHAVE_USE_PMU_BIT); + } + else + { + chip_apply_conf(u32GpReg1); + } + + nm_write_reg(BOOTROM_REG, M2M_START_FIRMWARE); + +#ifdef __ROM_TEST__ + rom_test(); +#endif /* __ROM_TEST__ */ + +ERR2: + return ret; +} + +int8_t wait_for_firmware_start(uint8_t arg) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0, cnt = 0; + volatile uint32_t regAddress = NMI_STATE_REG; + volatile uint32_t checkValue = M2M_FINISH_INIT_STATE; + + if(M2M_WIFI_MODE_CONFIG == arg) { + regAddress = NMI_REV_REG; + checkValue = M2M_ATE_FW_START_VALUE;//M2M_ATE_FW_IS_UP_VALUE; + } else { + /*bypass this step*/ + } + + while (checkValue != reg) + { + nm_sleep(2); /* Removing this can cause a bus error. */ + M2M_DBG("%x %x %x\r\n", (unsigned int)nm_read_reg(0x108c), (unsigned int)nm_read_reg(0x108c), (unsigned int)nm_read_reg(0x14A0)); + if (nm_read_reg_with_ret(regAddress, ®) != M2M_SUCCESS) + { + // ensure reg != checkValue + reg = !checkValue; + } + if (++cnt > TIMEOUT) + { + M2M_DBG("Time out for wait firmware Run\r\n"); + ret = M2M_ERR_INIT; + goto ERR; + } + } + if (M2M_FINISH_INIT_STATE == checkValue) + { + nm_write_reg(NMI_STATE_REG, 0); + } +ERR: + return ret; +} + +int8_t chip_deinit(void) +{ + uint32_t reg = 0; + int8_t ret; + uint8_t timeout = 10; + + /** + stop the firmware, need a re-download + **/ + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("failed to de-initialize\r\n"); + } + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while writing reg\r\n"); + return ret; + } + + do { + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while reading reg\r\n"); + return ret; + } + /*Workaround to ensure that the chip is actually reset*/ + if ((reg & (1 << 10))) { + M2M_DBG("Bit 10 not reset retry %d\r\n", timeout); + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + timeout--; + } else { + break; + } + } while (timeout); + + return ret; +} + +int8_t set_gpio_dir(uint8_t gpio, uint8_t dir) +{ + uint32_t val32; + int8_t ret; + + ret = nm_read_reg_with_ret(0x20108, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(dir) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20108, val32); + +_EXIT: + return ret; +} +int8_t set_gpio_val(uint8_t gpio, uint8_t val) +{ + uint32_t val32; + int8_t ret; + + ret = nm_read_reg_with_ret(0x20100, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(val) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20100, val32); + +_EXIT: + return ret; +} + +int8_t get_gpio_val(uint8_t gpio, uint8_t* val) +{ + uint32_t val32; + int8_t ret; + + ret = nm_read_reg_with_ret(0x20104, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + *val = (uint8_t)((val32 >> gpio) & 0x01); + +_EXIT: + return ret; +} + +int8_t pullup_ctrl(uint32_t pinmask, uint8_t enable) +{ + int8_t s8Ret; + uint32_t val32; + s8Ret = nm_read_reg_with_ret(0x142c, &val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to read\r\n"); + goto _EXIT; + } + if (enable) { + val32 &= ~pinmask; + } else { + val32 |= pinmask; + } + s8Ret = nm_write_reg(0x142c, val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to write\r\n"); + goto _EXIT; + } +_EXIT: + return s8Ret; +} + +int8_t nmi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid) +{ + int8_t ret; + uint32_t u32RegValue; + uint8_t mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000,(uint8_t*)&strgp,sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + if (!EFUSED_MAC(u32RegValue)) { + M2M_DBG("Default MAC\r\n"); + memset(pu8MacAddr, 0, 6); + goto _EXIT_ERR; + } + + M2M_DBG("OTP MAC\r\n"); + u32RegValue >>=16; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + memcpy(pu8MacAddr, mac, 6); + if (pu8IsValid) *pu8IsValid = 1; + return ret; + +_EXIT_ERR: + if (pu8IsValid) *pu8IsValid = 0; + return ret; +} + +int8_t nmi_get_mac_address(uint8_t *pu8MacAddr) +{ + int8_t ret; + uint32_t u32RegValue; + uint8_t mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + u32RegValue &=0x0000ffff; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + memcpy(pu8MacAddr, mac, 6); + +_EXIT_ERR: + return ret; +} + +//DOM-IGNORE-END diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/nmbus.c b/ChaletLora.X/Source/winc3400_142/driver/source/nmbus.c new file mode 100644 index 0000000..60bcada --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/nmbus.c @@ -0,0 +1,248 @@ +/******************************************************************************* + This module contains WINC3400 bus APIs implementation. + + File Name: + nmbus.c + + Summary: + This module contains WINC3400 bus APIs implementation. + + Description: + This module contains WINC3400 bus APIs implementation. +*******************************************************************************/ + +//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. +*******************************************************************************/ +#include "nmbus.h" +#include "nmspi.h" + +#define MAX_TRX_CFG_SZ 8 +#define NM_BUS_MAX_TRX_SZ 256 + +/** +* @struct tstrNmBusCapabilities +* @brief Structure holding bus capabilities information +* @sa NM_BUS_TYPE_I2C, NM_BUS_TYPE_SPI +*/ +typedef struct +{ + uint16_t u16MaxTrxSz; /*!< Maximum transfer size. Must be >= 16 bytes*/ +} tstrNmBusCapabilities; + +tstrNmBusCapabilities egstrNmBusCapabilities = +{ + NM_BUS_MAX_TRX_SZ +}; + +/* +* @fn nm_bus_init +* @brief Initialize the bus wrapper +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +static int8_t nm_bus_init(void *pvinit) +{ + nm_reset(); + nm_sleep(1); + return M2M_SUCCESS; +} + +/* +* @fn nm_bus_deinit +* @brief De-initialize the bus wrapper +*/ +static int8_t nm_bus_deinit(void) +{ + return M2M_SUCCESS; +} + +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_init(void *pvInitVal) +{ + int8_t ret = M2M_SUCCESS; + ret = nm_bus_init(pvInitVal); + + return ret; +} + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_deinit(void) +{ + int8_t ret = M2M_SUCCESS; + ret = nm_bus_deinit(); + + return ret; +} + +/** + * @fn nm_bus_reset + * @brief reset bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +int8_t nm_bus_reset(void) +{ + return nm_spi_reset(); +} + +/** + * @fn nm_bus_iface_reconfigure + * @brief reconfigure bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_reconfigure(void *ptr) +{ + int8_t ret = M2M_SUCCESS; + return ret; +} +/* + * @fn nm_read_reg + * @brief Read register + * @param[in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_read_reg(uint32_t u32Addr) +{ + return nm_spi_read_reg(u32Addr); +} + +/* + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param[in] u32Addr + * Register address + * @param[out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal) +{ + return nm_spi_read_reg_with_ret(u32Addr, pu32RetVal); +} + +/* + * @fn nm_write_reg + * @brief write register + * @param[in] u32Addr + * Register address + * @param[in] u32Val + * Value to be written to the register + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_reg(uint32_t u32Addr, uint32_t u32Val) +{ + return nm_spi_write_reg(u32Addr, u32Val); +} + +static inline int8_t p_nm_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + return nm_spi_read_block(u32Addr, puBuf, u16Sz); +} +/* + * @fn nm_read_block + * @brief Read block of data + * @param[in] u32Addr + * Start address + * @param[out] puBuf + * Pointer to a buffer used to return the read data + * @param[in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_read_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz) +{ + uint16_t u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32_t off = 0; + int8_t s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], (uint16_t)u32Sz); + break; + } + else + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +static inline int8_t p_nm_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + return nm_spi_write_block(u32Addr, puBuf, u16Sz); +} +/** + * @fn nm_write_block + * @brief Write block of data + * @param[in] u32Addr + * Start address + * @param[in] puBuf + * Pointer to the buffer holding the data to be written + * @param[in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz) +{ + uint16_t u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32_t off = 0; + int8_t s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], (uint16_t)u32Sz); + break; + } + else + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +//DOM-IGNORE-END diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/nmdrv.c b/ChaletLora.X/Source/winc3400_142/driver/source/nmdrv.c new file mode 100644 index 0000000..421638a --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/nmdrv.c @@ -0,0 +1,410 @@ +/******************************************************************************* + File Name: + nmdrv.c + + Summary: + This module contains WINC3400 M2M driver APIs implementation. + + Description: + This module contains WINC3400 M2M driver APIs implementation. + *******************************************************************************/ + +//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. +*******************************************************************************/ + +#include "nm_common.h" +#include "nmbus.h" +#include "nm_bsp.h" +#include "nmdrv.h" +#include "nmasic.h" +#include "m2m_types.h" + +#include "nmspi.h" + +static tenuNmState genuNmState = NM_STATE_DEINIT; +/** + * @fn nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo); + * @brief Get Hif info of images in both partitions (Firmware and Ota). + * @param[out] pu16FwHifInfo + * Pointer holding Hif info of image in the active partition. + * @param[out] pu16OtaHifInfo + * Pointer holding Hif info of image in the inactive partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0; + + ret = nm_read_reg_with_ret(NMI_REV_REG, ®); + if(ret == M2M_SUCCESS) + { + if(pu16FwHifInfo != NULL) + { + *pu16FwHifInfo = (uint16_t)reg; + } + if(pu16OtaHifInfo) + { + *pu16OtaHifInfo = (uint16_t)(reg>>16); + } + } + return ret; +} + +/** + * @fn nm_get_firmware_full_info(tstrM2mRev* M2mRev) + * @brief Get Firmware version info + * @param[out] M2mRev + * Pointer holds address of structure @ref tstrM2mRev that contains the firmware version parameters + */ +int8_t nm_get_firmware_full_info(tstrM2mRev *pstrRev) +{ + uint16_t fw_hif_info = 0; + uint32_t reg = 0; + int8_t ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + memset((uint8_t*)pstrRev, 0, sizeof(tstrM2mRev)); + nm_get_hif_info(&fw_hif_info, NULL); + + M2M_INFO("Fw HIF: %04x\r\n", fw_hif_info); + if(M2M_GET_HIF_BLOCK(fw_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg &= 0x0000ffff; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)pstrRev, sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("Firmware HIF (%u) : %u.%u\r\n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("Firmware ver : %u.%u.%u\r\n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("Firmware Build %s Time %s\r\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(fw_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent Firmware Version\r\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_ERR("Unknown Firmware Version\r\n"); + } + return ret; +} +/** + * @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param[out] M2mRev + * Pointer holds address of structure @ref tstrM2mRev that contains the firmware version parameters + */ +int8_t nm_get_ota_firmware_info(tstrM2mRev *pstrRev) +{ + uint16_t ota_hif_info = 0; + uint32_t reg = 0; + int8_t ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + memset((uint8_t*)pstrRev, 0, sizeof(tstrM2mRev)); + nm_get_hif_info(NULL, &ota_hif_info); + + M2M_INFO("OTA HIF: %04x\r\n", ota_hif_info); + if(M2M_GET_HIF_BLOCK(ota_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg >>= 16; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)pstrRev, sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("OTA HIF (%u) : %u.%u\r\n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("OTA ver : %u.%u.%u\r\n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("OTA Build %s Time %s\r\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(ota_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent OTA Version\r\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_INFO("No valid OTA image\r\n"); + } + return ret; +} + +/** + * @fn nm_drv_init_download_mode + * @brief Initialize NMC1000 driver in download mode + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_download_mode(void) +{ + int8_t ret = M2M_SUCCESS; + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\r\n"); + goto ERR1; + } + + nm_spi_lock_init(); + + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); + + M2M_INFO("Chip ID %lx\r\n", nmi_get_chipid()); + + /*disable all interrupt in ROM (to disable uart) in 2b0 chip*/ + nm_write_reg(0x20300, 0); + + genuNmState = NM_STATE_INIT; +ERR1: + return ret; +} + +int8_t nm_drv_init_hold(void) +{ + int8_t ret = M2M_SUCCESS; + + nm_spi_lock_init(); + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\r\n"); + goto ERR1; + } + +#ifdef BUS_ONLY + return; +#endif + +#ifdef NO_HW_CHIP_EN + ret = chip_wake(); + nm_sleep(10); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail chip_wakeup\r\n"); + goto ERR2; + } + + /** + Go... + **/ + ret = chip_reset(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } +#endif + M2M_INFO("Chip ID %lx\r\n", nmi_get_chipid()); + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); + /*return power save to default value*/ + chip_idle(); + + genuNmState = NM_STATE_INIT; + + return ret; +#ifdef NO_HW_CHIP_EN +ERR2: + nm_bus_iface_deinit(); +#endif +ERR1: + return ret; +} + +int8_t nm_drv_init_start(void * arg) +{ + int8_t ret = M2M_SUCCESS; + uint8_t u8Mode = M2M_WIFI_MODE_NORMAL; + + if(NULL != arg) + { + u8Mode = *((uint8_t *)arg); + if(u8Mode < M2M_WIFI_MODE_NORMAL || u8Mode >= M2M_WIFI_MODE_MAX) + u8Mode = M2M_WIFI_MODE_NORMAL; + } + + ret = cpu_start(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + ret = wait_for_bootrom(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + ret = wait_for_firmware_start(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + if(M2M_WIFI_MODE_CONFIG == u8Mode) { + goto ERR1; + } else { + /*continue running*/ + } + + ret = enable_interrupts(); + if (M2M_SUCCESS != ret) { + M2M_ERR("failed to enable interrupts..\r\n"); + goto ERR2; + } + + genuNmState = NM_STATE_START; + + return ret; +ERR2: + nm_bus_iface_deinit(); + nm_spi_deinit(); +ERR1: + return ret; +} + +/** + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @param[in] arg + * Generic argument passed on to nm_drv_init_start + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init(void* arg) +{ + int8_t ret = M2M_SUCCESS; + + ret = nm_drv_init_hold(); + + if(ret == M2M_SUCCESS) + ret = nm_drv_init_start(arg); + + return ret; +} + +/** + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + */ +int8_t nm_drv_deinit(void* arg) +{ + int8_t ret; + + ret = chip_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: chip_deinit fail\r\n"); + goto ERR1; + } + + ret = nm_bus_iface_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: fail init bus\r\n"); + goto ERR1; + } + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_deinit(); + +ERR1: + genuNmState = NM_STATE_DEINIT; + + return ret; +} + + +/** + * @fn nm_cpu_start(void) + * @brief Start CPU from the WINC module + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_cpu_start(void) +{ + int8_t ret; + + ret = cpu_start(); + return ret; +} + +/** + * @fn nm_get_state(void) + * @brief Get the current state of the WINC module + * @return The current state of the WINC module + */ +tenuNmState nm_get_state(void) +{ + return genuNmState; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/ChaletLora.X/Source/winc3400_142/driver/source/nmspi.c b/ChaletLora.X/Source/winc3400_142/driver/source/nmspi.c new file mode 100644 index 0000000..2a7de63 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/driver/source/nmspi.c @@ -0,0 +1,960 @@ +/******************************************************************************* + This module contains WINC3400 SPI protocol bus APIs implementation. + + File Name: + nmspi.c + + Summary: + This module contains WINC3400 SPI protocol bus APIs implementation. + + Description: + This module contains WINC3400 SPI protocol bus APIs implementation. + *******************************************************************************/ + +//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. +*******************************************************************************/ + +//#include "osal/osal.h" +#include "nm_common.h" + +#include "nmspi.h" +//#include "wdrv_winc_common.h" +//#include "wdrv_winc_spi.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE+0xa00) +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) + +#define NMI_SPI_REG_BASE 0xe800 +#define NMI_SPI_CTL (NMI_SPI_REG_BASE) +#define NMI_SPI_MASTER_DMA_ADDR (NMI_SPI_REG_BASE+0x4) +#define NMI_SPI_MASTER_DMA_COUNT (NMI_SPI_REG_BASE+0x8) +#define NMI_SPI_SLAVE_DMA_ADDR (NMI_SPI_REG_BASE+0xc) +#define NMI_SPI_SLAVE_DMA_COUNT (NMI_SPI_REG_BASE+0x10) +#define NMI_SPI_TX_MODE (NMI_SPI_REG_BASE+0x20) +#define NMI_SPI_PROTOCOL_CONFIG (NMI_SPI_REG_BASE+0x24) +#define NMI_SPI_INTR_CTL (NMI_SPI_REG_BASE+0x2c) +#define NMI_SPI_MISC_CTRL (NMI_SPI_REG_BASE+0x48) + +#define NMI_SPI_PROTOCOL_OFFSET (NMI_SPI_PROTOCOL_CONFIG-NMI_SPI_REG_BASE) + +#define SPI_BASE NMI_SPI_REG_BASE + +//#define CMD_DMA_WRITE 0xc1 +//#define CMD_DMA_READ 0xc2 +#define CMD_INTERNAL_WRITE 0xc3 +#define CMD_INTERNAL_READ 0xc4 +//#define CMD_TERMINATE 0xc5 +//#define CMD_REPEAT 0xc6 +#define CMD_DMA_EXT_WRITE 0xc7 +#define CMD_DMA_EXT_READ 0xc8 +#define CMD_SINGLE_WRITE 0xc9 +#define CMD_SINGLE_READ 0xca +#define CMD_RESET 0xcf + +#define N_OK 0 +#define N_FAIL -1 +#define N_RESET -2 +#define N_RETRY -3 + +#define SPI_RESP_RETRY_COUNT (10) +#define SPI_RETRY_COUNT (10) +#define DATA_PKT_SZ_256 256 +#define DATA_PKT_SZ_512 512 +#define DATA_PKT_SZ_1K 1024 +#define DATA_PKT_SZ_4K (4 * 1024) +#define DATA_PKT_SZ_8K (8 * 1024) +#define DATA_PKT_SZ DATA_PKT_SZ_8K + +static uint8_t gu8Crc_off = 0; + +//static OSAL_MUTEX_HANDLE_TYPE s_spiLock = 0; + +static inline int8_t spi_read(uint8_t *b, uint16_t sz) +{ + //JFM WINC TODO + // if (true == WDRV_WINC_SPIReceive((unsigned char *const) b, sz)) + return N_OK; + + return N_FAIL; +} + +static inline int8_t spi_write(uint8_t *b, uint16_t sz) +{ + //JFM WINC TODO + // if (true == WDRV_WINC_SPISend((unsigned char *const) b, sz)) + return N_OK; + + return N_FAIL; +} + +/******************************************** + + Crc7 + +********************************************/ + +static const uint8_t crc7_syndrome_table[256] = { + 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, + 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, + 0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26, + 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e, + 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d, + 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, + 0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, + 0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c, + 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, + 0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13, + 0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, + 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a, + 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, + 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, + 0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, + 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38, + 0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e, + 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36, + 0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, + 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f, + 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, + 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, + 0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, + 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d, + 0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, + 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52, + 0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, + 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b, + 0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28, + 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60, + 0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31, + 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79 +}; + +static uint8_t crc7_byte(uint8_t crc, uint8_t data) +{ + return crc7_syndrome_table[(crc << 1) ^ data]; +} + +static uint8_t crc7(uint8_t crc, const uint8_t *buffer, uint32_t len) +{ + while (len--) + crc = crc7_byte(crc, *buffer++); + return crc; +} + +/******************************************** + + Spi protocol Function + +********************************************/ + +static int8_t spi_cmd(uint8_t cmd, uint32_t adr, uint32_t u32data, uint32_t sz, uint8_t clockless) +{ + uint8_t bc[9]; + uint8_t len = 5; + + bc[0] = cmd; + switch (cmd) + { + case CMD_SINGLE_READ: /* single word (4 bytes) read */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)adr; + len = 5; + break; + + case CMD_INTERNAL_READ: /* internal register read */ + bc[1] = (uint8_t)(adr >> 8); + if(clockless) + bc[1] |= (1 << 7); + bc[2] = (uint8_t)adr; + bc[3] = 0x00; + len = 5; + break; +#ifdef CMD_TERMINATE + case CMD_TERMINATE: /* termination */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif +#ifdef CMD_REPEAT + case CMD_REPEAT: /* repeat */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif + case CMD_RESET: /* reset */ + bc[1] = 0xff; + bc[2] = 0xff; + bc[3] = 0xff; + len = 5; + break; +#if defined(CMD_DMA_WRITE) || defined(CMD_DMA_READ) + case CMD_DMA_WRITE: /* dma write */ + case CMD_DMA_READ: /* dma read */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)adr; + bc[4] = (uint8_t)(sz >> 8); + bc[5] = (uint8_t)(sz); + len = 7; + break; +#endif + case CMD_DMA_EXT_WRITE: /* dma extended write */ + case CMD_DMA_EXT_READ: /* dma extended read */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)adr; + bc[4] = (uint8_t)(sz >> 16); + bc[5] = (uint8_t)(sz >> 8); + bc[6] = (uint8_t)(sz); + len = 8; + break; + + case CMD_INTERNAL_WRITE: /* internal register write */ + bc[1] = (uint8_t)(adr >> 8); + if(clockless) bc[1] |= (1 << 7); + bc[2] = (uint8_t)(adr); + bc[3] = (uint8_t)(u32data >> 24); + bc[4] = (uint8_t)(u32data >> 16); + bc[5] = (uint8_t)(u32data >> 8); + bc[6] = (uint8_t)(u32data); + len = 8; + break; + + case CMD_SINGLE_WRITE: /* single word write */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)(adr); + bc[4] = (uint8_t)(u32data >> 24); + bc[5] = (uint8_t)(u32data >> 16); + bc[6] = (uint8_t)(u32data >> 8); + bc[7] = (uint8_t)(u32data); + len = 9; + break; + + default: + return N_FAIL; + } + + if (!gu8Crc_off) + { + bc[len-1] = (crc7(0x7f, (const uint8_t *)&bc[0], len-1)) << 1; + } + else + { + len -= 1; + } + + if (N_OK != spi_write(bc, len)) + { + M2M_ERR("[spi_cmd]: Failed cmd write, bus error...\r\n"); + return N_FAIL; + } + + return N_OK; +} + +static int8_t spi_cmd_rsp(uint8_t cmd) +{ + uint8_t rsp; + int8_t s8RetryCnt; + + /** + Command/Control response + **/ + if ((cmd == CMD_RESET) +#ifdef CMD_TERMINATE + || (cmd == CMD_TERMINATE) +#endif +#ifdef CMD_REPEAT + || (cmd == CMD_REPEAT) +#endif + ) + { + if (N_OK != spi_read(&rsp, 1)) + return N_FAIL; + } + + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do + { + if (N_OK != spi_read(&rsp, 1)) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read, bus error...\r\n"); + return N_FAIL; + } + } + while((rsp != cmd) && (s8RetryCnt-- > 0)); + + if (s8RetryCnt < 0) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read\n"); + return N_FAIL; + } + /** + State response + **/ + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do + { + if (N_OK != spi_read(&rsp, 1)) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read, bus error...\r\n"); + return N_FAIL; + } + } + while((rsp != 0x00) && (s8RetryCnt-- > 0)); + + if (s8RetryCnt < 0) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read\n"); + return N_FAIL; + } + + return N_OK; +} + +static void spi_reset(void) +{ + nm_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + nm_sleep(1); +} + +/******************************************** + + Spi Internal Read/Write Function + +********************************************/ + +static int8_t spi_data_read(uint8_t *b, uint16_t sz,uint8_t clockless) +{ + int16_t retry, ix, nbytes; + int8_t result = N_OK; + uint8_t crc[2]; + uint8_t rsp; + + /** + Data + **/ + ix = 0; + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Data Response header + **/ + retry = SPI_RESP_RETRY_COUNT; + do + { + if (N_OK != spi_read(&rsp, 1)) + { + M2M_ERR("[spi_data_read]: Failed data response read, bus error...\r\n"); + result = N_FAIL; + break; + } + if ((rsp & 0xf0) == 0xf0) + break; + } + while (retry--); + + if (result == N_FAIL) + break; + + if (retry <= 0) + { + M2M_ERR("[spi_data_read]: Failed data response read...(%02x)\r\n", rsp); + result = N_FAIL; + break; + } + + /** + Read bytes + **/ + if (N_OK != spi_read(&b[ix], nbytes)) + { + M2M_ERR("[spi_data_read]: Failed data block read, bus error...\r\n"); + result = N_FAIL; + break; + } + if(!clockless) + { + /** + Read Crc + **/ + if (!gu8Crc_off) + { + if (N_OK != spi_read(crc, 2)) + { + M2M_ERR("[spi_data_read]: Failed data block CRC read, bus error...\r\n"); + result = N_FAIL; + break; + } + } + } + ix += nbytes; + sz -= nbytes; + + } while (sz); + + return result; +} + +static int8_t spi_data_write(uint8_t *b, uint16_t sz) +{ + int16_t ix = 0; + uint16_t nbytes; + int8_t result = N_OK; + uint8_t cmd, order, crc[2] = {0}; + //uint8_t rsp; + + /** + Data + **/ + do + { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Write command + **/ + cmd = 0xf0; + if (ix == 0) + { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x1; + } + else + { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x2; + } + + cmd |= order; + if (N_OK != spi_write(&cmd, 1)) + { + M2M_ERR("[spi_data_write]: Failed data block cmd write, bus error...\r\n"); + result = N_FAIL; + break; + } + + /** + Write data + **/ + if (N_OK != spi_write(&b[ix], nbytes)) + { + M2M_ERR("[spi_data_write]: Failed data block write, bus error...\r\n"); + result = N_FAIL; + break; + } + + /** + Write Crc + **/ + if (!gu8Crc_off) + { + if (N_OK != spi_write(crc, 2)) + { + M2M_ERR("[spi_data_write]: Failed data block CRC write, bus error...\r\n"); + result = N_FAIL; + break; + } + } + + ix += nbytes; + sz -= nbytes; + } + while (sz); + + return result; +} + +/******************************************** + + Spi interfaces + +********************************************/ + +static int8_t spi_write_reg(uint32_t u32Addr, uint32_t u32Val) +{ + uint8_t cmd = CMD_SINGLE_WRITE; + uint8_t clockless = 0; + + if (u32Addr <= 0x30) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_WRITE; + clockless = 1; + } + + if (spi_cmd(cmd, u32Addr, u32Val, 4, clockless) != N_OK) + { + M2M_ERR("[spi_write_reg]: Failed cmd, write reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(cmd) != N_OK) + { + M2M_ERR("[spi_write_reg]: Failed cmd response, write reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + return N_OK; +} + +static int8_t spi_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + uint8_t len; + uint8_t rsp[3]; + + /** + Command + **/ + if (spi_cmd(CMD_DMA_EXT_WRITE, u32Addr, 0, u16Sz, 0) != N_OK) + { + M2M_ERR("[spi_write_block]: Failed cmd, write block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(CMD_DMA_EXT_WRITE) != N_OK) + { + M2M_ERR("[spi_write_block]: Failed cmd response, write block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + /** + Data + **/ + if (spi_data_write(puBuf, u16Sz) != N_OK) + { + M2M_ERR("[spi_write_block]: Failed block data write...\r\n"); + return N_FAIL; + } + /** + Data RESP + **/ + if (!gu8Crc_off) + len = 2; + else + len = 3; + + if (N_OK != spi_read(&rsp[0], len)) + { + M2M_ERR("[spi_write_block]: Failed bus error...\r\n"); + return N_FAIL; + } + + if((rsp[len-1] != 0) || (rsp[len-2] != 0xC3)) + { + M2M_ERR("[spi_write_block]: Failed data response read, %x %x %x\r\n", rsp[0], rsp[1], rsp[2]); + return N_FAIL; + } + + return N_OK; +} + +static int8_t spi_read_reg(uint32_t u32Addr, uint32_t* pu32RetVal) +{ + uint8_t cmd = CMD_SINGLE_READ; + uint8_t tmp[4]; + uint8_t clockless = 0; + + if (u32Addr <= 0xff) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_READ; + clockless = 1; + } + + if (spi_cmd(cmd, u32Addr, 0, 4, clockless) != N_OK) + { + M2M_ERR("[spi_read_reg]: Failed cmd, read reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(cmd) != N_OK) + { + M2M_ERR("[spi_read_reg]: Failed cmd response, read reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + /* to avoid endianess issues */ + if (spi_data_read(&tmp[0], 4, clockless) != N_OK) + { + M2M_ERR("[spi_read_reg]: Failed data read...\r\n"); + return N_FAIL; + } + + *pu32RetVal = ((uint32_t)tmp[0]) | + ((uint32_t)tmp[1] << 8) | + ((uint32_t)tmp[2] << 16) | + ((uint32_t)tmp[3] << 24); + + return N_OK; +} + +static int8_t spi_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + /** + Command + **/ + if (spi_cmd(CMD_DMA_EXT_READ, u32Addr, 0, u16Sz, 0) != N_OK) + { + M2M_ERR("[spi_read_block]: Failed cmd, read block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(CMD_DMA_EXT_READ) != N_OK) + { + M2M_ERR("[spi_read_block]: Failed cmd response, read block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + /** + Data + **/ + if (spi_data_read(puBuf, u16Sz, 0) != N_OK) + { + M2M_ERR("[spi_read_block]: Failed block data read...\r\n"); + return N_FAIL; + } + + return N_OK; +} + +static void spi_init_pkt_sz(void) +{ + uint32_t val32; + + /* Make sure SPI max. packet size fits the defined DATA_PKT_SZ. */ + val32 = nm_spi_read_reg(SPI_BASE+0x24); + val32 &= ~(0x7 << 4); + switch(DATA_PKT_SZ) + { + case 256: val32 |= (0 << 4); break; + case 512: val32 |= (1 << 4); break; + case 1024: val32 |= (2 << 4); break; + case 2048: val32 |= (3 << 4); break; + case 4096: val32 |= (4 << 4); break; + case 8192: val32 |= (5 << 4); break; + } + nm_spi_write_reg(SPI_BASE+0x24, val32); +} + +/******************************************** + + Bus interfaces + +********************************************/ + +int8_t nm_spi_reset(void) +{ +// if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) +// return M2M_ERR_BUS_FAIL; + + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; +} + +void nm_spi_lock_init(void) +{ +// OSAL_MUTEX_Create(&s_spiLock); +} + +/* +* @fn nm_spi_init +* @brief Initialize the SPI +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_spi_init(void) +{ + uint32_t chipid; + uint32_t reg = 0; + + /** + configure protocol + **/ + gu8Crc_off = 0; + + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS) + { + /* Read failed. Try with CRC off. This might happen when module + is removed but chip isn't reset*/ + gu8Crc_off = 1; + M2M_ERR("[nm_spi_init]: Failed internal read protocol with CRC on, retrying with CRC off...\r\n"); + + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS) + { + // Reaad failed with both CRC on and off, something went bad + M2M_ERR("[nm_spi_init]: Failed internal read protocol...\r\n"); + + return M2M_ERR_BUS_FAIL; + } + } + if(gu8Crc_off == 0) + { + reg &= ~0xc; /* disable CRC checking */ + reg &= ~0x70; + reg |= (0x5 << 4); + + if (nm_spi_write_reg(NMI_SPI_PROTOCOL_CONFIG, reg) != M2M_SUCCESS) + { + M2M_ERR("[nm_spi_init]: Failed internal write protocol reg...\r\n"); + + return M2M_ERR_BUS_FAIL; + } + + gu8Crc_off = 1; + } + + /** + make sure can read back chip id correctly + **/ + if (nm_spi_read_reg_with_ret(0x1000, &chipid) != M2M_SUCCESS) + { + M2M_ERR("[nm_spi_init]: Fail cmd read chip id...\r\n"); + return M2M_ERR_BUS_FAIL; + } + + M2M_DBG("[nm_spi_init]: chipid (%08x)\r\n", (unsigned int)chipid); + spi_init_pkt_sz(); + + return M2M_SUCCESS; +} + +/* +* @fn nm_spi_deinit +* @brief DeInitialize the SPI +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_spi_deinit(void) +{ + gu8Crc_off = 0; +// OSAL_MUTEX_Delete(&s_spiLock); + return M2M_SUCCESS; +} + +/* +* @fn nm_spi_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +*/ +uint32_t nm_spi_read_reg(uint32_t u32Addr) +{ + uint32_t u32Val; + + nm_spi_read_reg_with_ret(u32Addr, &u32Val); + + return u32Val; +} + +/* +* @fn nm_spi_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_spi_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal) +{ + uint8_t retry = SPI_RETRY_COUNT; + +// if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) +// return M2M_ERR_BUS_FAIL; + + while(retry--) + { + if (spi_read_reg(u32Addr, pu32RetVal) == N_OK) + { +// OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 "\r\n", retry, u32Addr); + spi_reset(); + } + +// OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +/* +* @fn nm_spi_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_spi_write_reg(uint32_t u32Addr, uint32_t u32Val) +{ + uint8_t retry = SPI_RETRY_COUNT; + +// if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + while(retry--) + { + if (spi_write_reg(u32Addr, u32Val) == N_OK) + { +// OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 " %" PRIx32 "\r\n", retry, u32Addr, u32Val); + spi_reset(); + } + +// OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +/* +* @fn nm_spi_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_spi_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + uint8_t retry = SPI_RETRY_COUNT; + uint8_t tmpBuf[2] = {0,0}; + uint8_t *puTmpBuf; + +// if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + if (u16Sz == 1) + { + u16Sz = 2; + puTmpBuf = tmpBuf; + } + else + { + puTmpBuf = puBuf; + } + + while(retry--) + { + if (spi_read_block(u32Addr, puTmpBuf, u16Sz) == N_OK) + { +// OSAL_MUTEX_Unlock(&s_spiLock); + + if (puTmpBuf == tmpBuf) + *puBuf = *tmpBuf; + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 " %d\r\n", retry, u32Addr, u16Sz); + spi_reset(); + } + +// OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +/* +* @fn nm_spi_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_spi_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + uint8_t retry = SPI_RETRY_COUNT; + +// if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) +// return M2M_ERR_BUS_FAIL; + + //Workaround hardware problem with single byte transfers over SPI bus + if (u16Sz == 1) + u16Sz = 2; + + while(retry--) + { + if (spi_write_block(u32Addr, puBuf, u16Sz) == N_OK) + { +// OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 " %d\r\n", retry, u32Addr, u16Sz); + spi_reset(); + } + +// OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +//DOM-IGNORE-END diff --git a/ChaletLora.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h b/ChaletLora.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h new file mode 100644 index 0000000..8ca7251 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h @@ -0,0 +1,347 @@ +/******************************************************************************* + BSD compatible socket interface internal types. + + File Name: + m2m_socket_host_if.h + + Summary: + + Description: + +*******************************************************************************/ + +//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. +*******************************************************************************/ + +#ifndef __M2M_SOCKET_HOST_IF_H__ +#define __M2M_SOCKET_HOST_IF_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "socket.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define SSL_MAX_OPT_LEN HOSTNAME_MAX_SIZE + +#define ALPN_LIST_MIN_SIZE 4 +#define ALPN_LIST_MAX_SIZE 32 +/*!< + Maximum length of ALPN list that can be specified by the application. + The list is in the following format: + @verbatim + 0 1 2 3 ... (bytes) + +-------+-------+-------+ ... +-------+ ... +-------+ ... + | Length L (BE) | len1 | name1... | len2 | name2... | len3 | name3... + +-------+-------+-------+ ... +-------+ ... +-------+ ... + Length fields do not include themselves. + @endverbatim +*/ + +#define SOCKET_CMD_INVALID 0x00 +/*!< + Invalid Socket command value. +*/ + +#define PING_ERR_SUCCESS 0 +#define PING_ERR_DEST_UNREACH 1 +#define PING_ERR_TIMEOUT 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct { + uint16_t u16Family; + uint16_t u16Port; + uint32_t u32IPAddr; +} tstrSockAddr; + + +//typedef int8_t SOCKET; +typedef tstrSockAddr tstrUIPSockAddr; + + + +/*! +@struct \ + tstrDnsReply + +@brief + DNS Reply, contains hostName and HostIP. +*/ +typedef struct { + char acHostName[HOSTNAME_MAX_SIZE]; + uint32_t u32HostIP; +} tstrDnsReply; + + +/*! +@brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8_t u8Void; + uint16_t u16SessionID; +} tstrBindCmd; + + +/*! +@brief +*/ +typedef struct { + SOCKET sock; + int8_t s8Status; + uint16_t u16SessionID; +} tstrBindReply; + + +/*! +* @brief +*/ +typedef struct { + SOCKET sock; + uint8_t u8BackLog; + uint16_t u16SessionID; +} tstrListenCmd; + + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type + in a response to a user call to the recv or recvfrom. + If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is + delivered to the user in a number of consecutive chunks according to the USER Buffer size. +*/ +typedef struct { + SOCKET sock; + int8_t s8Status; + uint16_t u16SessionID; +} tstrListenReply; + + +/*! +* @brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sListenSock; + SOCKET sConnectedSock; + uint16_t u16Void; +} tstrAcceptReply; + + +/*! +* @brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8_t u8SslFlags; + uint16_t u16SessionID; +} tstrConnectCmd; + + +/*! +@struct \ + tstrConnectReply + +@brief + Connect Reply, contains sock number and error value +*/ +typedef struct { + SOCKET sock; + int8_t s8Error; + /*!< + 0 for successful connection, in which case u16AppDataOffset is valid. + Negative for failed connection, in which case u8ErrorType and u8ErrorDetail may give more info. + */ + union { + uint16_t u16AppDataOffset; + /*!< + In further packet send requests the host interface should put the user application + data at this offset in the allocated shared data packet. + */ + struct { + uint8_t u8ErrSource; + /*!< + 0: No detail + 1: TLS Alert received from peer + 2: TLS Alert generated locally + */ + uint8_t u8ErrCode; + /*!< + For TLS Alerts, this is the Alert ID. + */ + }; + }; +} tstrConnectReply; + + +/*! +@struct \ + tstrConnectAlpnReply + +@brief + Connect Reply, contains sock number, error value and index of negotiated application protocol. +*/ +typedef struct{ + tstrConnectReply strConnReply; + uint8_t u8AppProtocolIdx; + /*!< + 1-based index of application-layer protocol negotiated during TLS handshake. + */ + uint8_t __PAD24__[3]; +}tstrConnectAlpnReply; + + +/*! +@brief +*/ +typedef struct{ + SOCKET sock; + uint8_t u8Void; + uint16_t u16DataSize; + tstrSockAddr strAddr; + uint16_t u16SessionID; + uint16_t u16Void; +} tstrSendCmd; + + +/*! +@struct \ + tstrSendReply + +@brief + Send Reply, contains socket number and number of sent bytes. +*/ +typedef struct { + SOCKET sock; + uint8_t u8Void; + int16_t s16SentBytes; + uint16_t u16SessionID; + uint16_t u16Void; +} tstrSendReply; + + +/*! +* @brief +*/ +typedef struct { + uint32_t u32Timeoutmsec; + SOCKET sock; + uint8_t u8Void; + uint16_t u16SessionID; + uint16_t u16BufLen; +} tstrRecvCmd; + + +/*! +@struct \ + tstrRecvReply +@brief +*/ +typedef struct { + tstrSockAddr strRemoteAddr; + int16_t s16RecvStatus; + uint16_t u16DataOffset; + SOCKET sock; + uint8_t u8Void; + uint16_t u16SessionID; +} tstrRecvReply; + + +/*! +* @brief +*/ +typedef struct { + uint32_t u32OptionValue; + SOCKET sock; + uint8_t u8Option; + uint16_t u16SessionID; +} tstrSetSocketOptCmd; + + +typedef struct { + SOCKET sslSock; + uint8_t __PAD24__[3]; +} tstrSSLSocketCreateCmd; + + +/*! +* @brief +*/ +typedef struct { + SOCKET sock; + uint8_t u8Option; + uint16_t u16SessionID; + uint32_t u32OptLen; + uint8_t au8OptVal[SSL_MAX_OPT_LEN]; +} tstrSSLSetSockOptCmd; + + +/*! +*/ +typedef struct { + uint32_t u32DestIPAddr; + uint32_t u32CmdPrivate; + uint16_t u16PingCount; + uint8_t u8TTL; + uint8_t __PAD8__; +} tstrPingCmd; + + +typedef struct { + uint32_t u32IPAddr; + uint32_t u32CmdPrivate; + uint32_t u32RTT; + uint16_t u16Success; + uint16_t u16Fail; + uint8_t u8ErrorCode; + uint8_t __PAD24__[3]; +} tstrPingReply; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __M2M_SOCKET_HOST_IF_H__ */ diff --git a/ChaletLora.X/Source/winc3400_142/socket/include/netinet_in.h b/ChaletLora.X/Source/winc3400_142/socket/include/netinet_in.h new file mode 100644 index 0000000..b4b4e2f --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/socket/include/netinet_in.h @@ -0,0 +1,95 @@ +/******************************************************************************* + Company: + Microchip Technology Inc. + + File Name: + netinet_in.h + + Summary: + + Description: + *******************************************************************************/ + +// 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. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NETINET_IN_H +#define _NETINET_IN_H + +#include +#include + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus // Provide C++ Compatibility + extern "C" { +#endif +// DOM-IGNORE-END + +typedef uint32_t in_addr_t; + +struct in_addr { + /*!< + Network Byte Order representation of the IPv4 address. For example, + the address "192.168.0.10" is represented as 0x0A00A8C0. + */ + in_addr_t s_addr; +}; + +struct sockaddr_in{ + uint16_t sin_family; + /*!< + Specifies the address family(AF). + Members of AF_INET address family are IPv4 addresses. + Hence,the only supported value for this is AF_INET. + */ + uint16_t sin_port; + /*!< + Port number of the socket. + Network sockets are identified by a pair of IP addresses and port number. + Must be set in the Network Byte Order format , @ref _htons (e.g. _htons(80)). + Can NOT have zero value. + */ + struct in_addr sin_addr; + /*!< + IP Address of the socket. + The IP address is of type @ref in_addr structure. + Can be set to "0" to accept any IP address for server operation. + */ + uint8_t sin_zero[8]; + /*!< + Padding to make structure the same size as @ref sockaddr. + */ +}; + +const char *inet_ntop(int af, const void *src, char *dst, size_t size); +in_addr_t inet_addr(const char *cp); + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus +} +#endif +// DOM-IGNORE-END + +#endif /* _NETINET_IN_H */ diff --git a/ChaletLora.X/Source/winc3400_142/socket/include/socket.h b/ChaletLora.X/Source/winc3400_142/socket/include/socket.h new file mode 100644 index 0000000..38d97bc --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/socket/include/socket.h @@ -0,0 +1,2074 @@ +/******************************************************************************* + File Name: + socket.h + + Summary: + WINC3400 BSD Compatible Socket Interface + + Description: + WINC3400 BSD Compatible Socket 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. +*******************************************************************************/ +//DOM-IGNORE-END + +#ifndef __SOCKET_H__ +#define __SOCKET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup SOCKETAPI Socket + * BSD compatible socket interface between the host layer and the network + * protocol stacks in the firmware. + * These functions are used by the host application to send or receive + * packets and to do other socket operations. + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_types.h" +#include "netinet_in.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup SOCKETDEF Defines + * @ingroup SOCKETAPI + * The following list of macros are used to define constants used throughout the socket layer, and SSL Socket options. + */ + +/**@defgroup IPDefines TCP/IP Defines + * @ingroup SOCKETDEF + * The following list of macros are used to define constants used throughout the socket layer. + * @{ + */ +/* + * HOSTNAME_MAX_SIZE is defined here and also in host_drv/socket/include/m2m_socket_host_if.h + * The two definitions must match. +*/ +#define HOSTNAME_MAX_SIZE 100 +/*!< + Maximum allowed size for a host domain name passed to the function @ref gethostbyname. + command value. Used with the @ref setsockopt function. +*/ + +#define SOCKET_BUFFER_MAX_LENGTH 1400 +/*!< + Maximum allowed size for a socket data buffer. Used with @ref send socket + function to ensure that the buffer sent is within the allowed range. +*/ + +#define AF_INET 2 +/*!< + The AF_INET is the address family used for IPv4. An IPv4 transport address is specified with the @ref sockaddr_in structure. + (It is the only supported type for the current implementation.) +*/ + +#define SOCK_STREAM 1 +/*!< + One of the IPv4 supported socket types for reliable connection-oriented stream connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_DGRAM 2 +/*!< + One of the IPv4 supported socket types for unreliable connectionless datagram connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_RAW 3 +/*!< + Socket type used for sending and receiving raw frames. + Raw socket expects and returns IP header. + Please note that SO_BROADCAST socket option is not currently supported when using RAW socket. + Similarly to SOCK_DGRAM it is oriented towards unreliable connectionless communication. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCKET_FLAGS_SSL 0x01 +/*!< + This flag may be set in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a TLS socket.\n + Note that the number of TLS sockets is limited to 2.\n + This flag is kept for legacy purposes. It is recommended that applications + use @ref SOCKET_CONFIG_SSL_ON instead. +*/ + +#define SOCKET_FLAGS_IPPROTO_RAW 0x02 +/*!< + This flag may be set in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_RAW), to allow the Application to use a + socket of type raw to send/receive frames.\n + This flag is kept for legacy purposes. It is recommended that applications + use @ref SOCKET_CONFIG_IPPROTO_RAW instead. +*/ + +#define SOCKET_CONFIG_DEFAULT 0 +/*!< + This value may be passed in the u8Config parameter of @ref socket to create + a socket with default configuration. +*/ + +#define SOCKET_CONFIG_SSL_OFF 0 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a socket not capable of + TLS. +*/ +#define SOCKET_CONFIG_SSL_ON 1 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a TLS socket.\n + Note that the number of TLS sockets is limited to 2. +*/ +#define SOCKET_CONFIG_SSL_DELAY 2 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a TCP socket which has the + potential to upgrade to a TLS socket later (by calling @ref secure).\n + Note that the total number of TLS sockets and potential TLS sockets is + limited to 2. +*/ + +#define SOCKET_CONFIG_IPPROTO_RAW 2 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the u8Type parameter is + @ref SOCK_RAW), to allow the Application to use a socket of type raw to send/receive frames. + This assumes that the application will fill the IP and protocol (UDP, TCP, ICMP) headers. + Typically, when sending ICMP frames via RAW socket, there are two options that can be used: + - IPPROTO_RAW - Raw IP packets, implies that IP_HDRINCL is enabled and therefore + the host application should fill in the corresponding protocol header checksum. + - IPPROTO_ICMP - ICMP packets, the WINC would fill in the ICMP header checksum (not supported). + @warning + Please note that only SOCKET_CONFIG_IPPROTO_RAW is currently supported. + Raw sockets can be used to send TCP/UDP/ICMP packets, however, the current implementation only + supports receiving Raw ICMP frames, which also requires @ref SO_ICMP_FILTER to be set appropriately. +*/ + +#define TCP_SOCK_MAX (7) +/*!< + Maximum number of simultaneous TCP sockets. +*/ + +#define UDP_SOCK_MAX 4 +/*!< + Maximum number of simultaneous UDP sockets. +*/ + +#define RAW_SOCK_MAX 1 +/*!< + Maximum number of simultaneous RAW sockets. +*/ + +#define MAX_SOCKET (TCP_SOCK_MAX + UDP_SOCK_MAX + RAW_SOCK_MAX) +/*!< + Maximum number of simultaneous sockets. +*/ + +#define SOL_SOCKET 1 +/*!< + Socket option. + Used with the @ref setsockopt function +*/ + +#define SOL_SSL_SOCKET 2 +/*!< + SSL Socket option level. + Used with the @ref setsockopt function +*/ + +#define SOL_RAW 255 +/*!< + Raw Socket option level. + Used with the @ref setsockopt function +*/ + +#define SO_SET_UDP_SEND_CALLBACK 0x00 +/*!< + Socket option used by the application to enable/disable + the use of UDP send callbacks.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + 0: disable UDP send callbacks.\n + 1: enable UDP send callbacks.\n + Default setting is enable. + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define IP_ADD_MEMBERSHIP 0x01 +/*!< + Set Socket Option Add Membership command value. + Used with the @ref setsockopt function. +*/ + +#define IP_DROP_MEMBERSHIP 0x02 +/*!< + Set Socket Option Drop Membership command value. + Used with the @ref setsockopt function. +*/ + +#define SO_TCP_KEEPALIVE 0x04 +/*!< + Socket option to enable or disable TCP keep-alive.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + 0: disable TCP keep-alive.\n + 1: enable TCP keep-alive.\n + Default setting is disable. + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_TCP_KEEPIDLE 0x05 +/*!< + Socket option to set the time period after which the socket will trigger keep-alive transmissions.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Option value is the time period in units of 500ms. Maximum 2^32 - 1. + Default setting is 120 (60 seconds). + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_TCP_KEEPINTVL 0x06 +/*!< + Socket option to set the time period between keep-alive retransmissions.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Option value is the time period in units of 500ms. Maximum 255. + Default setting is 1 (0.5 seconds). + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_TCP_KEEPCNT 0x07 +/*!< + Socket option to set the number of keep-alive retransmissions to be carried out before declaring that the remote end is not available.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Maximum 255. + Default setting is 20. + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_ICMP_FILTER 0x01 +/*!< + Socket option to set the ICMP filter for raw sockets when receiving.\n + Current implementation allows for a filter none (0) or filter all (anything else). + Filter none means that all ICMP frames will be delivered to the host via raw socket. + Filter all means that all ICMP frames will NOT be delivered to host and handled internally by the WINC (please note that fragmentation is not supported by the WINC). + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Default setting is 0 (filter none). + + @warning @ref bind and @ref shutdown will cause this setting to be lost, + so the application should only set this option after @ref bind. +*/ + +#define RAW_SOCK_ID (TCP_SOCK_MAX + UDP_SOCK_MAX) +/*!< + Socket number to be used for RAW socket. +*/ + +/**@}*/ //IPDefines + + +/**@addtogroup TLSDefines + * @{ + */ +#define ALPN_LIST_MAX_APP_LENGTH 30 +/*!< + Maximum length of ALPN list that can be specified by the application. + This length includes separators (spaces) and terminator (NUL). +*/ +/**@}*/ // TLSDefines + +/** + * @defgroup TLSDefines TLS Defines + * @ingroup SOCKETDEF + * @ingroup SSLAPI +*/ + +/**@defgroup SSLSocketOptions TLS Socket Options + * @ingroup TLSDefines + * The following list of macros are used to define SSL Socket options. + * @{ + * @sa setsockopt + */ + +#define SO_SSL_BYPASS_X509_VERIF 0x01 +/*!< + Allow an opened SSL socket to bypass the X509 certificate verification + process. + It is recommended NOT to use this socket option in production software + applications. It is supported for debugging and testing purposes.\n + The option value should be casted to int type.\n + 0: do not bypass the X509 certificate verification process (default, + recommended).\n + 1: bypass the X509 certificate verification process.\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_SNI 0x02 +/*!< + Set the Server Name Indicator (SNI) for an SSL socket. The SNI is a NULL- + terminated string containing the server name associated with the + connection. Its size must not exceed @ref HOSTNAME_MAX_SIZE. If the SNI is + not a null string, then TLS Client Hello messages will include the SNI + extension.\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_ENABLE_SESSION_CACHING 0x03 +/*!< + This option allow the TLS to cache the session information for fast TLS + session establishment in future connections using the TLS Protocol session + resume features.\n + The option value should be casted to int type.\n + 0: disable TLS session caching (default).\n + 1: enable TLS session caching.\n + Note that TLS session caching is always enabled in TLS Server Mode and this + option is ignored.\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_ENABLE_CERTNAME_VALIDATION 0x04 +/*!< + Enable internal validation of server name against the server's + certificate subject common name. If there is no server name + provided (via the @ref SO_SSL_SNI option), setting this option + does nothing.\n + The option value should be casted to int type.\n + 0: disable server certificate name validation (default).\n + 1: enable server certificate name validation (recommended).\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_ALPN 0x05 +/*!< + Set the list to use for Application-Layer Protocol Negotiation + for an SSL socket.\n + This option is intended for internal use and should not be + used by the application. Applications should use the API @ref + set_alpn_list. +*/ + +#define SO_SSL_ENABLE_SNI_VALIDATION 0x04 +/*!< + Legacy name for @ref SO_SSL_ENABLE_CERTNAME_VALIDATION.\n +*/ +/**@}*/ //SSLSocketOptions + +/**@defgroup SSLCipherSuiteID TLS Cipher Suite IDs + * @ingroup TLSDefines + * The following list of macros defined the list of supported TLS Cipher suites. + * Each MACRO defines a single Cipher suite. + * @sa m2m_ssl_set_active_ciphersuites + * @{ + */ + +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA NBIT0 +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 NBIT1 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA NBIT2 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 NBIT3 +#define SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 NBIT4 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 NBIT5 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA NBIT6 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 NBIT7 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA NBIT8 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 NBIT9 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA NBIT10 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA NBIT11 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 NBIT12 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 NBIT13 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 NBIT14 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 NBIT15 + +#define SSL_ECC_ONLY_CIPHERS \ +(\ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 \ +) +/*!< + All supported ciphers which use ECDSA. +*/ + +#define SSL_DEFAULT_CIPHERS \ +(\ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 \ +) +/*!< + All supported Non-ECC Ciphers. This is the default active group after startup. + Note that firmware may support only a subset of these. +*/ +/**@}*/ // SSLCipherSuiteID + +/**@defgroup SOCKETBYTEORDER Byte Order + * @ingroup SOCKETAPI + * The following list of macros are used to convert between host representation and network byte order. + * @{ + */ + +#ifdef _NM_BSP_BIG_END +#define _htonl(m) (m) +/*!< + Convert a 4-byte integer from the Host representation to Network byte order (Host is BE). +*/ +#define _htons(A) (A) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is BE). +*/ +#else +#define _htonl(m) \ + (uint32_t)(((uint32_t)(m << 24)) | ((uint32_t)((m & 0x0000FF00) << 8)) | ((uint32_t)((m & 0x00FF0000) >> 8)) | ((uint32_t)(((uint32_t)m) >> 24))) +/*!< + Convert a 4-byte integer from Host representation to Network byte order (Host is LE). +*/ + +#define _htons(A) (uint16_t)((((uint16_t) (A)) << 8) | (((uint16_t) (A)) >> 8)) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is LE). +*/ +#endif + + +#define _ntohl _htonl +/*!< + Convert a 4-byte integer from Network byte order to Host representation. +*/ + + +#define _ntohs _htons +/*!< + Convert a 2-byte integer from Network byte order to Host representation. +*/ +/**@}*/ // SOCKETBYTEORDER + +/************** +Socket Errors +**************/ +/**@defgroup SocketErrorCode Error Codes + * @ingroup SOCKETAPI + * The following list of macros are used to define the possible error codes. + * Errors are listed in numerical order with the error macro name. + * @{ + */ +#define SOCK_ERR_NO_ERROR 0 +/*!< + Successful socket operation. This code is also used with event @ref SOCKET_MSG_RECV if a socket connection is closed. + In that case, the application should call @ref shutdown(). +*/ + +#define SOCK_ERR_INVALID_ADDRESS -1 +/*!< + Socket address is invalid. The socket operation cannot be completed successfully without specifying a valid address + For example: bind is called without specifying a port number +*/ + +#define SOCK_ERR_ADDR_ALREADY_IN_USE -2 +/*!< + Socket operation cannot bind on the given address. Only one IP address per socket, and one socket per IP address is permitted - + any attempt for a new socket to bind with an IP address already bound to another open socket will return the following error code. +*/ + +#define SOCK_ERR_MAX_TCP_SOCK -3 +/*!< + Exceeded the maximum number of TCP sockets. A maximum number of TCP sockets opened simultaneously is defined through TCP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed. +*/ + +#define SOCK_ERR_MAX_UDP_SOCK -4 +/*!< + Exceeded the maximum number of UDP sockets. A maximum number of UDP sockets opened simultaneously is defined through UDP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed +*/ + +#define SOCK_ERR_INVALID_ARG -6 +/*!< + An invalid argument is passed to a socket function. Identifies that @ref socket operation failed +*/ + +#define SOCK_ERR_MAX_LISTEN_SOCK -7 +/*!< + Exceeded the maximum number of TCP passive listening sockets. + Identifies that @ref listen operation failed. +*/ + +#define SOCK_ERR_INVALID -9 +/*!< + The requested socket operation is not valid in the current socket state. + For example: @ref accept is called on a TCP socket before @ref bind or @ref listen. +*/ + +#define SOCK_ERR_ADDR_IS_REQUIRED -11 +/*!< + Destination address is required. Failure to provide the socket address required for the socket operation to be completed. + The @ref sendto function requires a destination address to send data. +*/ + +#define SOCK_ERR_CONN_ABORTED -12 +/*!< + The socket is closed (reset) by the peer. If this error is received, the application should call @ref shutdown(). +*/ + +#define SOCK_ERR_TIMEOUT -13 +/*!< + The socket pending operation has timed out. The socket remains open. +*/ + +#define SOCK_ERR_BUFFER_FULL -14 +/*!< + No buffer space available to be used for the requested socket operation. +*/ +/**@}*/ // SocketErrorCode + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/** @defgroup SocketEnums Enumeration/Typedefs + * @ingroup SOCKETAPI + * Specific Enumeration-typedefs used for socket operations + * @{ + */ +/*! +@typedef \ + SOCKET + +@brief + Definition for socket handler data type. + Socket ID,used with all socket operations to uniquely identify the socket handler. + The ID is uniquely assigned at socket creation when calling @ref socket operation. +*/ +typedef int8_t SOCKET; + +/*! +@enum \ + tenuSockErrSource + +@brief + Source of socket error (local, remote or unknown). + +@see tstrSockErr +*/ + +typedef enum { + SOCKET_ERR_UNKNOWN = 0, + /*!< + No detail available (also used when there is no error). + */ + SOCKET_ERR_TLS_REMOTE, + /*!< + TLS Error Alert received from peer. + */ + SOCKET_ERR_TLS_LOCAL + /*!< + TLS Error Alert generated locally. + */ +} tenuSockErrSource; + +/*! +@struct \ + sockaddr + +@brief + Generic socket address structure. + +@see + sockaddr_in +*/ +struct sockaddr { + uint16_t sa_family; + /*!< + Socket address family. + */ + uint8_t sa_data[14]; + /*!< + Maximum size of all the different socket address structures. + */ +}; + +/*! +@struct \ + tstrSockErr + +@brief + Detail about socket failures. Used with @ref get_error_detail. +*/ +typedef struct { + tenuSockErrSource enuErrSource; + /*!< + Source of socket error (local, remote or unknown). + */ + uint8_t u8ErrCode; + /*!< + TLS Alert code as defined in + https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-6. + */ +} tstrSockErr; +/**@}*/ //SocketEnums + +/**@defgroup AsyncCallback Asynchronous Events + * @ingroup SocketEnums + * Specific Enumeration used for asynchronous operations + * @{ */ +/*! +@enum \ + tenuSocketCallbackMsgType + +@brief + Asynchronous APIs make use of callback functions in-order to return back the results once the corresponding socket operation is completed. + Hence resuming the normal execution of the application code while the socket operation returns the results. + Callback functions expect event messages to be passed in, in-order to identify the operation they're returning the results for. + The following enum identifies the type of events that are received in the callback function. + + Application Use: + In order for application developers to handle the pending events from the network controller through the callback functions, + a function call must be made to the function @ref m2m_wifi_handle_events at least once for each socket operation. + +@see bind +@see listen +@see accept +@see connect +@see send +@see recv +*/ + +typedef enum { + SOCKET_MSG_BIND = 1, + /*!< + Bind socket event. + */ + SOCKET_MSG_LISTEN, + /*!< + Listen socket event. + */ + SOCKET_MSG_DNS_RESOLVE, + /*!< + DNS Resolution event. + */ + SOCKET_MSG_ACCEPT, + /*!< + Accept socket event. + */ + SOCKET_MSG_CONNECT, + /*!< + Connect socket event. + */ + SOCKET_MSG_RECV, + /*!< + Receive socket event. + */ + SOCKET_MSG_SEND, + /*!< + Send socket event. + */ + SOCKET_MSG_SENDTO, + /*!< + Sendto socket event. + */ + SOCKET_MSG_RECVFROM, + /*!< + Recvfrom socket event. + */ + SOCKET_MSG_SECURE +/*!< + Existing socket made secure event. +*/ +} tenuSocketCallbackMsgType; + +/*! +@struct \ + tstrSocketBindMsg + +@brief Socket bind status. + + An asynchronous call to the @ref bind socket operation, returns information through this structure in response. + This structure together with the event @ref SOCKET_MSG_BIND are passed in parameters to the callback function. +@see + bind +*/ +typedef struct { + int8_t status; + /*!< + The result of the bind operation. + Holding a value of ZERO for a successful bind or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +} tstrSocketBindMsg; + +/*! +@struct \ + tstrSocketListenMsg + +@brief Socket listen status. + + Socket listen information is returned through this structure in response to the asynchronous call to the @ref listen function. + This structure together with the event @ref SOCKET_MSG_LISTEN are passed-in parameters to the callback function. +@see + listen +*/ +typedef struct { + int8_t status; + /*!< + Holding a value of ZERO for a successful listen or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +} tstrSocketListenMsg; + +/*! +@struct \ + tstrSocketAcceptMsg + +@brief Socket accept status. + + Socket accept information is returned through this structure in response to the asynchronous call to the @ref accept function. + This structure together with the event @ref SOCKET_MSG_ACCEPT are passed-in parameters to the callback function. +*/ +typedef struct { + SOCKET sock; + /*!< + On a successful @ref accept operation, the return information is the socket ID for the accepted connection with the remote peer. + Otherwise a negative error code is returned to indicate failure of the accept operation. + */ + struct sockaddr_in strAddr; + /*!< + Socket address structure for the remote peer. + */ +} tstrSocketAcceptMsg; + +/*! +@struct \ + tstrSocketConnectMsg + +@brief Socket connect status. + + Socket connect information is returned through this structure in response to an asynchronous call to the @ref connect socket function + or the @ref secure socket function. + This structure and the event @ref SOCKET_MSG_CONNECT or @ref SOCKET_MSG_SECURE are passed in parameters to the callback function. + If the application receives this structure with a negative value in s8Error, the application should call @ref close(). +*/ +typedef struct { + SOCKET sock; + /*!< + Socket ID referring to the socket passed to the @ref connect or @ref secure function call. + */ + int8_t s8Error; + /*!< + Connect error code:\n + - ZERO for a successful connect or successful secure. \n + - Otherwise a negative error code corresponding to the type of error. + */ +} tstrSocketConnectMsg; + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + Socket receive information is returned through this structure in response to the asynchronous call to the @ref recv or @ref recvfrom socket functions. + This structure, together with the events @ref SOCKET_MSG_RECV or @ref SOCKET_MSG_RECVFROM, is passed-in parameters to the callback function. +@remark + After receiving this structure, the application should issue a new call to @ref recv or @ref recvfrom in order to receive subsequent data. + In the case of @ref SOCKET_MSG_RECVFROM (UDP), any further data in the same datagram is dropped, then subsequent datagrams are buffered on the WINC until the application provides a buffer via a new call to @ref recvfrom. + In the case of @ref SOCKET_MSG_RECV (TCP), all subsequent data is buffered on the WINC until the application provides a buffer via a new call to @ref recv. + A negative or zero buffer size indicates an error with the following code: + @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref shutdown(). + @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref shutdown(). + @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. +*/ +typedef struct { + uint8_t *pu8Buffer; + /*!< + Pointer to the USER buffer (passed to @ref recv and @ref recvfrom function) containing the received data chunk. + */ + int16_t s16BufferSize; + /*!< + The received data chunk size. + Holds a negative value if there is a receive error or ZERO on success upon reception of close socket message. + */ + uint16_t u16RemainingSize; + /*!< + This field is used internally by the driver. In normal operation, this field will be 0 when the application receives this structure. + */ + struct sockaddr_in strRemoteAddr; + /*!< + Socket address structure for the remote peer. It is valid for @ref SOCKET_MSG_RECVFROM event. + */ +} tstrSocketRecvMsg; +/**@}*/ // AsyncCallback + +/**@defgroup SocketCallbacks Callbacks + * @ingroup SOCKETAPI + * @{ + */ +/*! +@typedef \ + tpfAppSocketCb + +@brief + The main socket application callback function. Applications register their main socket application callback through this function by calling @ref registerSocketCallback. + In response to events received, the following callback function is called to handle the corresponding asynchronous function called. Example: @ref bind, @ref connect,...etc. + +@param [in] sock + Socket ID for the callback. + + The socket callback function is called whenever a new event is received in response + to socket operations. + +@param [in] u8Msg + Socket event type. Possible values are: + - @ref SOCKET_MSG_BIND + - @ref SOCKET_MSG_LISTEN + - @ref SOCKET_MSG_ACCEPT + - @ref SOCKET_MSG_CONNECT + - @ref SOCKET_MSG_RECV + - @ref SOCKET_MSG_SEND + - @ref SOCKET_MSG_SENDTO + - @ref SOCKET_MSG_RECVFROM + - @ref SOCKET_MSG_SECURE + +@param [in] pvMsg + Pointer to message structure. Existing types are: + - tstrSocketBindMsg + - tstrSocketListenMsg + - tstrSocketAcceptMsg + - tstrSocketConnectMsg + - tstrSocketRecvMsg + +@see + tenuSocketCallbackMsgType + tstrSocketRecvMsg + tstrSocketConnectMsg + tstrSocketAcceptMsg + tstrSocketListenMsg + tstrSocketBindMsg +*/ +typedef void (*tpfAppSocketCb)(SOCKET sock, uint8_t u8Msg, void *pvMsg); + +/*! +@typedef \ + tpfAppResolveCb + +@brief + DNS resolution callback function. + Applications requiring DNS resolution should register their callback through this function by calling @ref registerSocketCallback. + The following callback is triggered in response to an asynchronous call to the @ref gethostbyname function (DNS Resolution callback). + +@param [in] pu8DomainName + Domain name of the host. + +@param [in] u32ServerIP + Server IPv4 address encoded in Network byte order format. If it is Zero, then the DNS resolution failed. +*/ +typedef void (*tpfAppResolveCb)(uint8_t *pu8DomainName, uint32_t u32ServerIP); + +/*! +@typedef \ + tpfPingCb + +@brief PING Callback + + The function delivers the ping statistics for the sent ping triggered by calling + @ref m2m_ping_req. + +@param [in] u32IPAddr + Destination IP. + +@param [in] u32RTT + Round Trip Time. + +@param [in] u8ErrorCode + Ping error code. It may be one of: + - PING_ERR_SUCCESS + - PING_ERR_DEST_UNREACH + - PING_ERR_TIMEOUT +*/ +typedef void (*tpfPingCb)(uint32_t u32IPAddr, uint32_t u32RTT, uint8_t u8ErrorCode); +/**@}*/ //SocketCallbacks + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup SocketAPI Functions + * @ingroup SOCKETAPI + * The function performs the necessary initializations for the socket library through the following steps: + * - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + * in-order to prevent resetting the socket instances already created in the global socket array (gastrSockets). + * - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + * - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + * This facilitates handling all of the socket related functions received through interrupts from the firmware. + * @{ + */ +/*! + * @fn void socketInit(void); + The function performs the necessary initialization for the socket library through the following steps: + - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + in-order to prevent resetting the socket instances already created in the global socket array (gastrSockets). + - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + This facilitates handling all of the socket related functions received through interrupts from the firmware. + +@return void + +@remarks + This initialization function must be invoked before any socket operation is performed. + No error codes from this initialization function since the socket array is statically allocated based on the maximum number of + sockets @ref MAX_SOCKET which is tuned to the systems capability. +\section SocketExample1 Example +This example demonstrates the use of the socketInit for socket initialization for an mqtt chat application. + \code + tstrWifiInitParam param; + tstrNetworkId strNetworkId; + tstrAuthPsk strAuthPsk; + int8_t ret; + char topic[strlen(MAIN_CHAT_TOPIC) + MAIN_CHAT_USER_NAME_SIZE + 1]; + + //Initialize the board. + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + ---------- + + // Initialize socket interface. + socketInit(); + registerSocketCallback(socket_event_handler, socket_resolve_handler); + + // Connect to router. + strNetworkId.pu8Bssid = NULL; + strNetworkId.pu8Ssid = MAIN_WLAN_SSID; + strNetworkId.u8SsidLen = sizeof(MAIN_WLAN_SSID); + strNetworkId.u8Channel = M2M_WIFI_CH_ALL; + + strAuthPsk.pu8Psk = NULL; + strAuthPsk.pu8Passphrase = MAIN_WLAN_PSK; + strAuthPsk.u8PassphraseLen = (uint8_t)strlen((char*)MAIN_WLAN_PSK); + + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); +\endcode +*/ +void socketInit(void); + +/*! +@fn \ + void socketDeinit(void); + +@brief Socket Layer De-initialization + + The function performs the necessary cleanup for the socket library static data + It must be invoked only after all desired socket operations have been performed on any active sockets. +*/ +void socketDeinit(void); + +/*! +@fn \ + uint8_t IsSocketReady(void); + +@see socketInit + socketDeinit +@return If the socket has been initialized and is ready. + Should return 1 after @ref socketInit and 0 after @ref socketDeinit +*/ +uint8_t IsSocketReady(void); + +/*! +@fn \ + void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); + Register two callback functions one for asynchronous socket events and the other one for DNS callback registering function. + The registered callback functions are used to retrieve information in response to the asynchronous socket functions called. +@param [in] socket_cb + Assignment of callback function to the global callback @ref tpfAppSocketCb gpfAppSocketCb. Delivers + socket messages to the host application. In response to the asynchronous function calls, such as @ref bind + @ref listen @ref accept @ref connect + +@param [in] resolve_cb + Assignment of callback function to the global callback @ref tpfAppResolveCb gpfAppResolveCb. + Used for DNS resolving functionality. The DNS resolving technique is determined by the application + registering the callback. + NULL is assigned when DNS resolution is not required. + +@return void +@remarks + If any of the socket functionality is not to be used, NULL is passed in as a parameter. + It must be invoked after @ref socketInit and before other socket layer operations. + +\section SocketExample2 Example + This example demonstrates the use of the registerSocketCallback to register a socket callback function with DNS resolution CB set to null + for a simple UDP server example. + \code + tstrWifiInitParam param; + tstrNetworkId strNetworkId; + tstrAuthPsk strAuthPsk; + int8_t ret; + struct sockaddr_in addr; + + // Initialize the board + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + // Initialize socket address structure. + addr.sin_family = AF_INET; + addr.sin_port = _htons(MAIN_WIFI_M2M_SERVER_PORT); + addr.sin_addr.s_addr = _htonl(MAIN_WIFI_M2M_SERVER_IP); + + // Initialize Wi-Fi parameters structure. + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + + // Initialize Wi-Fi driver with data and status callbacks. + param.pfAppWifiCb = wifi_cb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + printf("main: m2m_wifi_init call error!(%d)\r\n", ret); + while (1) { + } + } + + // Initialize socket module + socketInit(); + registerSocketCallback(socket_cb, NULL); + + // Connect to router. + strNetworkId.pu8Bssid = NULL; + strNetworkId.pu8Ssid = MAIN_WLAN_SSID; + strNetworkId.u8SsidLen = sizeof(MAIN_WLAN_SSID); + strNetworkId.u8Channel = M2M_WIFI_CH_ALL; + + strAuthPsk.pu8Psk = NULL; + strAuthPsk.pu8Passphrase = MAIN_WLAN_PSK; + strAuthPsk.u8PassphraseLen = (uint8_t)strlen((char*)MAIN_WLAN_PSK); + + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); +\endcode +*/ +//void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); +void registerSocketEventCallback(tpfAppSocketCb socket_cb); +void registerSocketResolveCallback(tpfAppResolveCb resolve_cb); + +/*! +@fn \ + SOCKET socket(uint16_t u16Domain, uint8_t u8Type, uint8_t u8Config); + Synchronous socket allocation function based on the specified socket type. Created sockets are non-blocking and their possible types are either TCP or a UDP sockets. + The maximum allowed number of TCP sockets is @ref TCP_SOCK_MAX sockets while the maximum number of UDP sockets that can be created simultaneously is @ref UDP_SOCK_MAX sockets. + +@param [in] u16Domain + Socket family. The only allowed value is AF_INET (IPv4.0) for TCP/UDP sockets. + +@param [in] u8Type + Socket type. Allowed values are: + - [SOCK_STREAM](@ref SOCK_STREAM) + - [SOCK_DGRAM](@ref SOCK_DGRAM) + - [SOCK_RAW](@ref SOCK_RAW) + +@param[in] u8Config + Used to specify the socket configuration. The interpretation of + this parameter depends on the setting of u8Type.\n + - When u8Type is [SOCK_STREAM](@ref SOCK_STREAM) the following configuration values + are defined:\n + - [SOCKET_CONFIG_SSL_OFF](@ref SOCKET_CONFIG_SSL_OFF): The socket is not secured by + TLS.\n + - [SOCKET_CONFIG_SSL_ON](@ref SOCKET_CONFIG_SSL_ON): The socket is secured by TLS.\n + - [SOCKET_CONFIG_SSL_DELAY](@ref SOCKET_CONFIG_SSL_DELAY): The socket is not secured + by TLS, but may be secured later, by calling @ref secure.\n + - When u8Type is [SOCK_RAW](@ref SOCK_RAW), the following configuration values + are defined:\n + - [SOCKET_CONFIG_IPPROTO_RAW](@ref SOCKET_CONFIG_IPPROTO_RAW): The socket is to be + used for raw ICMP frames.\n + - For all values of u8Type, the following configuration values + are defined:\n + - [SOCKET_CONFIG_DEFAULT](@ref SOCKET_CONFIG_DEFAULT): The default configuration.\n + All other configuration values are reserved and should not be + used. + +@pre + The @ref socketInit function must be called once at the beginning of the application to initialize the socket handler. + before any call to the @ref socket function can be made. + +@see + connect + secure + bind + listen + accept + recv + recvfrom + send + sendto + shutdown + setsockopt + getsockopt + +@return + On successful socket creation, a non-blocking socket type is created and a socket ID is returned + In case of failure the function returns a negative value, identifying one of the socket error codes defined. + For example: @ref SOCK_ERR_INVALID for invalid argument or + @ref SOCK_ERR_MAX_TCP_SOCK if the number of TCP allocated sockets exceeds the number of available sockets. + +@remarks + The socket function must be called before any other related socket functions "e.g. send, recv, shutdown ..etc" +\section SocketExample3 Example + This example demonstrates the use of the socket function to allocate the socket, returning the socket handler to be used for other +socket operations. Socket creation is dependent on the socket type. +\subsection sub1 UDP example +@code + SOCKET UdpServerSocket = -1; + + UdpServerSocket = socket(AF_INET, SOCK_DGRAM, SOCKET_CONFIG_DEFAULT); + +@endcode +\subsection sub2 TCP example +@code + static SOCKET tcp_client_socket = -1; + + tcp_client_socket = socket(AF_INET, SOCK_STREAM, SOCKET_CONFIG_DEFAULT)); +@endcode +*/ +SOCKET socket(uint16_t u16Domain, uint8_t u8Type, uint8_t u8Config); +/*! +\fn \ + int8_t bind(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); + Asynchronous bind function associates the provided address and local port to the socket. + The function can be used with both TCP and UDP sockets. It is mandatory to call the @ref bind function before starting any UDP or TCP server operation. + Upon socket bind completion, the application will receive a @ref SOCKET_MSG_BIND message in the socket callback. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Pointer to socket address structure "sockaddr_in" + [sockaddr_in](@ref sockaddr_in) + + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + +@pre + The socket function must be called to allocate a socket before passing the socket ID to the bind function. + +@see socket +@see connect +@see listen +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket bind failure. +\section SocketExample4 Example + This example demonstrates the call of the bind socket operation after a successful socket operation. +@code + struct sockaddr_in addr; + SOCKET udpServerSocket =-1; + int ret = -1; + + if(udpServerSocket == -1) + { + udpServerSocket = socket(AF_INET,SOCK_DGRAM,SOCKET_CONFIG_DEFAULT); + if(udpServerSocket >= 0) + { + addr.sin_family = AF_INET; + addr.sin_port = _htons(UDP_SERVER_PORT); + addr.sin_addr.s_addr = 0; + ret = bind(udpServerSocket,(struct sockaddr*)&addr,sizeof(addr)); + + if(ret == 0) + printf("Bind success!\n"); + else + { + printf("Bind Failed. Error code = %d\n",ret); + shutdown(udpServerSocket); + } + else + { + printf("UDP Server Socket Creation Failed\n"); + return; + } + } +@endcode +*/ +int8_t bind(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); +/*! +@fn \ + int8_t listen(SOCKET sock, uint8_t backlog); + + After successfully binding a socket to an IP address and port on the system, start listening passively for incoming connections. + The socket must be bound on a local port or the listen operation fails. + Upon the call to the asynchronous listen function, response is received through the event @ref SOCKET_MSG_LISTEN + in the socket callback. + + A successful listen means the TCP server operation is active. If a connection is accepted, then the application socket callback function is + notified with the new connected socket through the event @ref SOCKET_MSG_ACCEPT. Hence there is no need to call the @ref accept function + after calling @ref listen. + + After a connection is accepted, the user is then required to call @ref recv to receive any packets transmitted by the remote host or to receive notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] backlog + Not used by the current implementation. + +@pre + The bind function must be called to assign the port number and IP address to the socket before the listen operation. + +@see bind +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating invalid arguments were passed, such as negative socket ID. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket listen failure. +\section SocketExample5 Example +This example demonstrates the call of the listen socket operation after a successful socket operation. +@code + static void TCP_Socketcallback(SOCKET sock, uint8_t u8Msg, void * pvMsg) + { + int ret =-1; + + switch(u8Msg) + { + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + ret = listen(sock, 0); + + if(ret <0) + printf("Listen failure! Error = %d\n",ret); + } + else + { + M2M_ERR("bind Failure!\n"); + shutdown(sock); + } + } + } + break; + + case SOCKET_MSG_LISTEN: + { + + tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg; + if(pstrListen != NULL) + { + if(pstrListen->status == 0) + { + ret = accept(sock,NULL,0); + } + else + { + M2M_ERR("listen Failure!\n"); + shutdown(sock); + } + } + } + break; + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + TcpNotificationSocket = pstrAccept->sock; + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept failure\n"); + } + } + break; + + default: + break; + } + } + +@endcode +*/ +int8_t listen(SOCKET sock, uint8_t backlog); +/*! +@fn \ + int8_t accept(SOCKET sock, struct sockaddr *addr, uint8_t *addrlen); + The function has no current implementation. An empty declaration is used to prevent errors when legacy application code is used. + As it has no effect, it can be safely removed from any application using it. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. +@param [in] addr + Not used in the current implementation. + +@param [in] addrlen + Not used in the current implementation. + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID. +*/ +int8_t accept(SOCKET sock, struct sockaddr *addr, uint8_t *addrlen); +/*! +@fn \ + int8_t connect(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); + Establishes a TCP connection with a remote server. + The asynchronous connect function must be called after receiving a valid socket ID from the @ref socket function. + The application socket callback function is notified of the result of the connection attempt through the event @ref SOCKET_MSG_CONNECT, + along with a structure @ref tstrSocketConnectMsg. + If socket connection fails, the application should call @ref shutdown(). + A successful connect means the TCP session is active. The application is then required to make a call to the @ref recv function + to receive any packets transmitted by the remote server, unless the application is interrupted by a notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Address of the remote server. + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + Not currently used, implemented for BSD compatibility only. +@pre + The socket function must be called to allocate a TCP socket before passing the socket ID to the bind function. + If the socket is not bound, you do NOT have to call bind before the "connect" function. + +@see + socket + recv + send + shutdown + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket connect failure. +\section SocketExample6 Example + The example demonstrates a TCP application, showing how the asynchronous call to the connect function is made through the main function and how the + callback function handles the @ref SOCKET_MSG_CONNECT event. +\subsection sub3 Main Function +@code + struct sockaddr_in Serv_Addr; + SOCKET TcpClientSocket =-1; + int ret = -1 + + TcpClientSocket = socket(AF_INET,SOCK_STREAM,SOCKET_CONFIG_DEFAULT); + Serv_Addr.sin_family = AF_INET; + Serv_Addr.sin_port = _htons(1234); + Serv_Addr.sin_addr.s_addr = inet_addr(SERVER); + printf("Connected to server via socket %u\n",TcpClientSocket); + + do + { + ret = connect(TcpClientSocket,(sockaddr_in*)&Serv_Addr,sizeof(Serv_Addr)); + if(ret != 0) + { + printf("Connection Error\n"); + } + else + { + printf("Connection successful.\n"); + break; + } + }while(1) +@endcode +\subsection sub4 Socket Callback +@code + if(u8Msg == SOCKET_MSG_CONNECT) + { + tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + if(pstrConnect->s8Error == 0) + { + uint8_t acBuffer[GROWL_MSG_SIZE]; + uint16_t u16MsgSize; + + printf("Connect success!\n"); + + u16MsgSize = FormatMsg(u8ClientID, acBuffer); + send(sock, acBuffer, u16MsgSize, 0); + recv(pstrNotification->Socket, (void*)au8Msg,GROWL_DESCRIPTION_MAX_LENGTH, GROWL_RX_TIMEOUT); + u8Retry = GROWL_CONNECT_RETRY; + } + else + { + M2M_DBG("Connection Failed, Error: %d\n",pstrConnect->s8Error"); + shutdown(pstrNotification->Socket); + } + } +@endcode +*/ +int8_t connect(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); +/*! +@fn \ + int8_t secure(SOCKET sock); + + Converts an (insecure) TCP connection with a remote server into a secure TLS-over-TCP connection. + It may be called after both of the following:\n + - a TCP socket has been created by the @ref socket function, with u8Config parameter set to + @ref SOCKET_CONFIG_SSL_DELAY.\n + - a successful connection has been made on the socket via the @ref connect function. + This is an asynchronous API; the application socket callback function is notified of the result + of the attempt to make the connection secure through the event @ref SOCKET_MSG_SECURE, along + with a structure @ref tstrSocketConnectMsg. + If the attempt to make the connection secure fails, the application should call @ref close(). + +@param[in] sock + Socket ID, corresponding to a connected TCP socket. + +@pre + @ref socket and @ref connect must be called to connect a TCP socket before passing the socket ID to this function. + Value @ref SOCKET_CONFIG_SSL_DELAY must have been set in the u8Config parameter that was passed to @ref socket. + +@see + socket + connect + +@return + The function returns SOCK_ERR_NO_ERROR for successful operations and a negative error value otherwise. + The possible error values are: + - @ref SOCK_ERR_INVALID_ARG + Indicating passing invalid arguments such as negative socket ID. + + - @ref SOCK_ERR_INVALID + Indicating failure to process the request. +*/ +int8_t secure(SOCKET sock); +/*! +@fn \ + int16_t recv(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec); + + An asynchronous receive function, used to retrieve data from a TCP stream. + Before calling the recv function, a successful socket connection status must have been received through any of the two socket events + [SOCKET_MSG_CONNECT] or [SOCKET_MSG_ACCEPT], from the socket callback. Hence, indicating that the socket is already connected to a remote + host. + The application receives the required data in response to this asynchronous call through the reception of the event @ref SOCKET_MSG_RECV in the + socket callback. + + Receiving the SOCKET_MSG_RECV message in the callback with zero or negative buffer length indicates the following: + - @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref shutdown(). + - @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref shutdown(). + - @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer is used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32Timeoutmsec + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). If the timeout period is + elapsed with no data received, the socket will get a timeout error. +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket in a connected state is expected to receive data through the socket interface. + +@see socket +@see connect +@see bind +@see listen +@see recvfrom +@see shutdown + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section SocketExample7 Example + The example demonstrates a code snippet for the calling of the recv function in the socket callback upon notification of the accept or connect events, and the parsing of the + received data when the SOCKET_MSG_RECV event is received. +@code + + switch(u8Msg) + { + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept\n"); + } + } + break; + + + case SOCKET_MSG_RECV: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + + recv(sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socket recv Error: %d\n",pstrRx->s16BufferSize); + shutdown(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +int16_t recv(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec); +/*! +@fn \ + int16_t recvfrom(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32TimeoutSeconds); + Receives data from a UDP Socket. + + The asynchronous recvfrom function is used to retrieve data from a UDP socket. The socket must already be bound to + a local port before a call to the recvfrom function is made (i.e message @ref SOCKET_MSG_BIND is received + with successful status in the socket callback). + + Upon calling the recvfrom function with a successful return code, the application is expected to receive a notification + in the socket callback whenever a message is received through the @ref SOCKET_MSG_RECVFROM event. + + Receiving the SOCKET_MSG_RECVFROM message in the callback with zero, indicates that the socket is closed. + Whereby a negative buffer length indicates one of the socket error codes such as socket timeout error @ref SOCK_ERR_TIMEOUT + + The recvfrom callback can also be used to show the IP address of the remote host that sent the frame by + using the "strRemoteAddr" element in the @ref tstrSocketRecvMsg structure. (refer to the code example) +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer shall be used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32TimeoutSeconds + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). + +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket corresponding to the socket ID must be successfully bound to a local port through the call to a @ref bind function. + +@see + socket + bind + shutdown + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section SocketExample8 Example + The example demonstrates a code snippet for the calling of the recvfrom function in the socket callback upon notification of a successful bind event, and the parsing of the + received data when the SOCKET_MSG_RECVFROM event is received. +@code + switch(u8Msg) + { + + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + recvfrom(sock, gau8SocketTestBuffer, TEST_BUFFER_SIZE, 0); + } + else + { + M2M_ERR("bind\n"); + } + } + } + break; + + + case SOCKET_MSG_RECVFROM: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + //get the remote host address and port number + uint16_t u16port = pstrRx->strRemoteAddr.sin_port; + uint32_t strRemoteHostAddr = pstrRx->strRemoteAddr.sin_addr.s_addr; + + printf("Received frame with size = %d.\tHost address=%x, Port number = %d\n\n",pstrRx->s16BufferSize,strRemoteHostAddr, u16port); + + ret = recvfrom(sock,gau8SocketTestBuffer,sizeof(gau8SocketTestBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socket recv Error: %d\n",pstrRx->s16BufferSize); + ret = shutdown(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +int16_t recvfrom(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec); +/*! +@fn \ + int16_t send(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t u16Flags); + Asynchronous sending function, used to send data on a TCP/UDP socket. + + Called by the application code when there is outgoing data available required to be sent on a specific socket handler. + The only difference between this function and the similar @ref sendto function, is the type of socket the data is sent on and the parameters passed in. + @ref send function is most commonly called for sockets in a connected state. + After the data is sent, the socket callback function registered using registerSocketCallback(), is expected to receive an event of type + @ref SOCKET_MSG_SEND holding information containing the number of data bytes sent. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + +@param [in] u16SendLength + The buffer size in bytes. + +@param [in] u16Flags + Not used in the current implementation. + +@pre + Sockets must be initialized using socketInit. \n + + For TCP Socket:\n + Must use a successfully connected Socket (so that the intended recipient address is known ahead of sending the data). + Hence this function is expected to be called after a successful socket connect operation(in client case or accept in the + the server case).\n + + For UDP Socket:\n + UDP sockets most commonly use @ref sendto function, where the destination address is defined. However, in-order to send outgoing data + using the @ref send function, at least one successful call must be made to the @ref sendto function before consecutive calls to the @ref send function, + to ensure that the destination address is saved in the firmware. + +@see + socketInit + recv + sendto + socket + connect + accept + sendto + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket identifier through the prior call to the @ref socket function. + Must use a valid buffer pointer. + Successful completion of a call to send() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + * @return The function shall return @ref SOCK_ERR_NO_ERROR for successful operation and a negative value otherwise. + */ +int16_t send(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t u16Flags); + +/*! + * @fn int16_t sendto(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags, struct sockaddr *pstrDestAddr, uint8_t u8AddrLen); + * @brief Asynchronous sending function, used to send data on a UDP socket. + * Called by the application code when there is data required to be sent on a UDP socket. + * @details The application code is expected to receive data from a successfully bound socket node. + * The only difference between this function and the similar @ref send function, is the type of socket the data is received on. + * This function works only with UDP sockets. + * After the data is sent, the socket callback function registered using @ref registerSocketCallback(), is expected to receive an + * event of type @ref SOCKET_MSG_SENDTO. + * @param[in] sock + * Socket ID, must hold a non negative value. + * A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + * @param[in] pvSendBuffer + * Pointer to a buffer holding data to be transmitted. + * A NULL value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + * @param[in] u16SendLength + * The buffer size in bytes. It must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. + * @param[in] flags + * Not used in the current implementation + * @param[in] pstrDestAddr + * The destination address. + * @param[in] u8AddrLen + * Destination address length in bytes. + * Not used in the current implementation, only included for BSD compatibility. + * @pre Sockets must be initialized using @ref socketInit. + * @see + * socketInit + * recvfrom + * sendto + * socket + * connect + * accept + * send + * @warning + * u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH.\n + * Use a valid socket (returned from socket). + * A valid buffer pointer must be used (not NULL).\n + * Successful completion of a call to sendto does not guarantee delivery of the message, + * A negative return value indicates only locally-detected errors. + * @return The function returns @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. +*/ +int16_t sendto(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags, struct sockaddr *pstrDestAddr, uint8_t u8AddrLen); + +/*! + * @fn int8_t shutdown(SOCKET sock); + * @brief Synchronous shutdown function, releases all the socket assigned resources. + * @param[in] sock + * Socket ID, must hold a non negative value. + * A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + * @pre + * Sockets must be initialized through the call of the socketInit function. + * @ref shutdown is called only for valid socket identifiers created through the @ref socket function. + * @warning If @ref shutdown is called while there are still pending messages (sent or received ) they will be discarded. + * @see socketInit, socket + * @return The function returned @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. + */ +int8_t shutdown(SOCKET sock); + +/*! + * @fn int8_t gethostbyname(const char *pcHostName); + * Asynchronous DNS resolving function. This function uses DNS to resolve a domain name to the corresponding IP address. + * A call to this function will cause a DNS request to be sent and the response will be delivered to the DNS callback + * function registered using registerSocketCallback. + * @param[in] pcHostName + * NULL terminated string containing the domain name for the remote host. + * Its size must not exceed [HOSTNAME_MAX_SIZE](@ref HOSTNAME_MAX_SIZE). + * @see registerSocketCallback + * @warning + * Successful completion of a call to gethostbyname() does not guarantee success of the DNS request, + * a negative return value indicates only locally-detected errors + * @return + * - @ref SOCK_ERR_NO_ERROR + * - @ref SOCK_ERR_INVALID_ARG + */ +int8_t gethostbyname(const char *pcHostName); + +/*! +@fn \ + int8_t setsockopt(SOCKET socket, uint8_t u8Level, uint8_t option_name, + const void *option_value, uint16_t u16OptionLen); + + The setsockopt() function shall set the option specified by the option_name + argument, at the protocol level specified by the level argument, to the value + pointed to by the option_value argument for the socket specified by the socket argument. + +@param[in] socket + Socket handler. + +@param[in] u8Level + Protocol level.\n + Supported protocol levels are @ref SOL_SOCKET, @ref SOL_SSL_SOCKET and @ref SOL_RAW. + +@param[in] option_name + Option to be set.\n + For protocol level @ref SOL_SOCKET, the supported option names are:\n + @ref SO_SET_UDP_SEND_CALLBACK\n + @ref SO_TCP_KEEPALIVE\n + @ref SO_TCP_KEEPIDLE\n + @ref SO_TCP_KEEPINTVL\n + @ref SO_TCP_KEEPCNT\n + For protocol level @ref SOL_SSL_SOCKET, the supported option names are:\n + @ref SO_SSL_BYPASS_X509_VERIF\n + @ref SO_SSL_SNI\n + @ref SO_SSL_ENABLE_SESSION_CACHING\n + @ref SO_SSL_ENABLE_CERTNAME_VALIDATION\n + @ref SO_SSL_ALPN\n + For protocol level @ref SOL_RAW, the supported option names are:\n + @ref SO_ICMP_FILTER\n + +@param[in] option_value + Pointer to user provided value. + +@param[in] u16OptionLen + Length of the option value in bytes. Refer to each option documentation for the required length. + +@return + The function shall return \ref SOCK_ERR_NO_ERROR for successful operation + and a negative value (indicating the error) otherwise. +*/ +int8_t setsockopt(SOCKET socket, uint8_t u8Level, uint8_t option_name, + const void *option_value, uint16_t u16OptionLen); + +/*! + * @fn int8_t getsockopt(SOCKET sock, uint8_t u8Level, uint8_t u8OptName, const void *pvOptValue, uint8_t *pu8OptLen); + * @brief Get socket options retrieves. + * This Function isn't implemented yet but this is the form that will be released later. + * @param[in] sock + * Socket Identifier. + * @param[in] u8Level + * The protocol level of the option. + * @param[in] u8OptName + * The u8OptName argument specifies a single option to get. + * @param[out] pvOptValue + * The pvOptValue argument contains pointer to a buffer containing the option value. + * @param[out] pu8OptLen + * Option value buffer length. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t getsockopt(SOCKET sock, uint8_t u8Level, uint8_t u8OptName, const void *pvOptValue, uint8_t *pu8OptLen); + +/*! + * @fn int8_t m2m_ping_req(uint32_t u32DstIP, uint8_t u8TTL, tpfPingCb fpPingCb); + * @brief The function request to send ping request to the given IP Address. + * @param[in] u32DstIP + * Target Destination IP Address for the ping request. It must be represented in Network byte order. + * The function @ref nmi_inet_addr could be used to translate the dotted decimal notation IP + * to its Network bytes order integer representative. + * @param[in] u8TTL + * IP TTL value for the ping request. If set to ZERO, the default value SHALL be used. + * @param[in] fpPingCb + * Callback will be called to deliver the ping statistics. + + * @warning This API should only be used to request one ping at a time; calling this API invalidates callbacks + * for previous ping requests. + * @see nmi_inet_addr + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ping_req(uint32_t u32DstIP, uint8_t u8TTL, tpfPingCb fpPingCb); + +/*! + * @fn int8_t set_alpn_list(SOCKET sock, const char *pcProtocolList); + * + * This function sets the protocol list used for application-layer protocol negotiation (ALPN). + * If used, it must be called after creating a SSL socket (using @ref socket) and before + * connecting/binding (using @ref connect or @ref bind) or securing (using @ref secure). + * + * @param[in] sock + * Socket ID obtained by a call to @ref socket. This is the SSL socket to which + * the ALPN list applies. + * + * @param[in] pcProtocolList + * Pointer to the list of protocols available in the application. \n + * The entries in the list must: \n + * - be separated with ' ' (space). \n + * - not contain ' ' (space) or '\0' (NUL). \n + * - be non-zero length. \n + * . + * The list itself must: \n + * - be terminated with '\0' (NUL). \n + * - be no longer than @ref ALPN_LIST_MAX_APP_LENGTH, including separators (spaces) and terminator (NUL). \n + * - contain at least one entry. + * + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + * + * \section SocketExample9 Example + * The example demonstrates an application using @ref set_alpn_list and @ref get_alpn_index to negotiate secure HTTP/2 + * (with fallback option of HTTP/1.1). + + * \subsection sub5 Main Function + * @code + * SOCKET TcpClientSocket = socket(AF_INET, SOCK_STREAM, SOCKET_CONFIG_SSL_ON); + * if (TcpClientSocket >= 0) + * { + * struct sockaddr_in Serv_Addr = { + * .sin_family = AF_INET, + * .sin_port = _htons(1234), + * .sin_addr.s_addr = inet_addr(SERVER) + * }; + * set_alpn_list(TcpClientSocket, "h2 http/1.1"); + * connect(TcpClientSocket, &Serv_Addr, sizeof(Serv_Addr)); + * } + * @endcode + * \subsection sub6 Socket Callback + * @code + * if(u8Msg == SOCKET_MSG_CONNECT) + * { + * tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + * if(pstrConnect->s8Error == 0) + * { + * uint8_t alpn_index = get_alpn_index(pstrConnect->sock); + * switch (alpn_index) + * { + * case 1: + * printf("Negotiated HTTP/2\n"); + * break; + * case 2: + * printf("Negotiated HTTP/1.1\n"); + * break; + * case 0: + * printf("Protocol negotiation did not occur\n"); + * break; + * } + * } + * } + * @endcode +*/ +int8_t set_alpn_list(SOCKET sock, const char *pcProtocolList); +/*! + * @fn int8_t get_alpn_index(SOCKET sock); + * + * This function gets the index of the protocol negotiated via ALPN. + * It should be called when a SSL socket connection succeeds, in order to determine which + * application-layer protocol must be used. + * + * @param[in] sock + * Socket ID obtained by a call to @ref socket. This is the SSL socket to which + * the ALPN applies. + * + * @return The function returns:\n + * - >0: 1-based index of negotiated protocol with respect to the list previously provided to @ref set_alpn_list.\n + * - 0: No negotiation occurred (eg TLS peer did not support ALPN).\n + * - <0: Invalid parameters (socket is not in use, or not an SSL socket).\n + * + * @see @ref SocketExample9 +*/ +int8_t get_alpn_index(SOCKET sock); + +/*! + *@fn int8_t get_error_detail(SOCKET sock, tstrSockErr *pstrErr); + * + * This function gets detail about a socket failure. The application can call this when notified + * of a socket failure via @ref SOCKET_MSG_CONNECT or @ref SOCKET_MSG_RECV. + * If used, it must be called before @ref shutdown. + + * @param[in] sock + * Socket ID obtained by a call to @ref socket. + * + * @param[out] pstrErr + * Pointer to structure to be populated with the details of the socket failure. + * + * @return The function returns @ref SOCK_ERR_NO_ERROR if the request is successful. In this case pstrErr + * has been populated. + * The function returns a negative value if the request is not successful. In this case pstrErr + * has not been populated. +*/ +int8_t get_error_detail(SOCKET sock, tstrSockErr *pstrErr); +/**@}*/ // SocketAPI + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/ChaletLora.X/Source/winc3400_142/socket/source/inet_addr.c b/ChaletLora.X/Source/winc3400_142/socket/source/inet_addr.c new file mode 100644 index 0000000..5c0b682 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/socket/source/inet_addr.c @@ -0,0 +1,119 @@ +/******************************************************************************* + WINC3400 Wireless Driver + + File Name: + inet_addr.c + + Summary: + Implementation of standard inet_addr function. + + Description: + Implementation of standard inet_addr function. + *******************************************************************************/ + +//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. +*******************************************************************************/ + +#include +#include "socket.h" + +in_addr_t inet_addr(const char *cp) +{ + uint8_t i,l; + uint16_t t; + uint32_t ip; + char c; + + ip = 0; + + for (i=0; i<4; i++) + { + t = 0; + ip >>= 8; + + // Count non-delimiter or terminator characters + + for (l=0; l<4; l++) + { + c = cp[l]; + + if (('.' == c) || ('\0' == c)) + { + break; + } + } + + // There must be 1 to 3 characters + + if ((0 == l) || (4 == l)) + { + return 0; + } + + c = *cp++; + + // First digit can't be '0' unless it's the only one + + if ((l > 1) && (c == '0')) + { + return 0; + } + + while(l--) + { + // Each digit must be decimal + + if ((c < '0') || (c > '9')) + { + return 0; + } + + t = (t * 10) + (c - '0'); + + c = *cp++; + } + + // Total accumulated number must be less than 256 + + if (t > 255) + { + return 0; + } + + // Pack number into 32 bit IP address representation + + ip |= ((uint32_t)t << 24); + + // First three numbers must terminate with '.', last one with '\0's + + if ((('\0' == c) && (i != 3)) || (('\0' != c) && (i == 3))) + { + return 0; + } + } + + return ip; +} + +//DOM-IGNORE-END diff --git a/ChaletLora.X/Source/winc3400_142/socket/source/inet_ntop.c b/ChaletLora.X/Source/winc3400_142/socket/source/inet_ntop.c new file mode 100644 index 0000000..bdc190a --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/socket/source/inet_ntop.c @@ -0,0 +1,104 @@ +/******************************************************************************* + WINC3400 Wireless Driver + + File Name: + inet_ntop.c + + Summary: + Implementation of standard inet_ntop function. + + Description: + Implementation of standard inet_ntop function. + *******************************************************************************/ + +//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. +*******************************************************************************/ + +#include +#include +#include +#include "socket.h" + +const char *inet_ntop(int af, const void *src, char *dst, size_t size) +{ + uint8_t i, v, t, c, n; + char *rp = dst; + uint32_t ip = ((struct in_addr*)src)->s_addr; + + if ((NULL == src) || (NULL == dst) || (size < 16)) + { + return NULL; + } + + for (i=0; i<4; i++) + { + t = ip; + v = 100; + + // Check for zero + + if (t > 0) + { + n = 0; + + do + { + c = '0'; + while (t >= v) + { + c++; + t -= v; + } + v /= 10; + + if (('0' != c) || (n > 0)) + { + *dst++ = c; + + n++; + } + } + while (v > 0); + } + else + { + *dst++ = '0'; + } + + if (3 == i) + { + *dst++ = '\0'; + } + else + { + *dst++ = '.'; + } + + ip >>= 8; + } + + return rp; +} + +//DOM-IGNORE-END diff --git a/ChaletLora.X/Source/winc3400_142/socket/source/socket.c b/ChaletLora.X/Source/winc3400_142/socket/source/socket.c new file mode 100644 index 0000000..10e8e33 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/socket/source/socket.c @@ -0,0 +1,1261 @@ +/******************************************************************************* + File Name: + socket.c + + Summary: + WINC3400 BSD Compatible Socket Interface + + Description: + WINC3400 BSD Compatible Socket 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_bsp.h" +#include "socket.h" +#include "m2m_hif.h" +#include "m2m_socket_host_if.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define TLS_RECORD_HEADER_LENGTH (5) +#define ETHERNET_HEADER_OFFSET (34) +#define ETHERNET_HEADER_LENGTH (14) +#define TCP_IP_HEADER_LENGTH (40) +#define UDP_IP_HEADER_LENGTH (28) + +#define IP_PACKET_OFFSET (ETHERNET_HEADER_LENGTH + ETHERNET_HEADER_OFFSET - M2M_HIF_HDR_OFFSET) + +#define TCP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + TCP_IP_HEADER_LENGTH) +#define UDP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + UDP_IP_HEADER_LENGTH) +#define SSL_TX_PACKET_OFFSET (TCP_TX_PACKET_OFFSET + TLS_RECORD_HEADER_LENGTH) + +#define SOCKET_REQUEST(reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) \ + hif_send(M2M_REQ_GROUP_IP, reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) + + +#define SSL_FLAGS_ACTIVE NBIT0 +#define SSL_FLAGS_BYPASS_X509 NBIT1 +#define SSL_FLAGS_CACHE_SESSION NBIT4 +#define SSL_FLAGS_CHECK_CERTNAME NBIT6 +#define SSL_FLAGS_DELAY NBIT7 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +PRIVATE DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct { + SOCKET sock; + uint8_t u8Dummy; + uint16_t u16SessionID; +} tstrCloseCmd; + + +/*! +* @brief +*/ +typedef struct { + uint8_t *pu8UserBuffer; + uint16_t u16UserBufferSize; + uint16_t u16SessionID; + uint16_t u16DataOffset; + uint8_t bIsUsed; + uint8_t u8SSLFlags; + uint8_t bIsRecvPending; + uint8_t u8AlpnStatus; + uint8_t u8ErrSource; + uint8_t u8ErrCode; +} tstrSocket; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +volatile tstrSocket gastrSockets[MAX_SOCKET]; +volatile uint16_t gu16SessionID = 0; + +volatile tpfAppSocketCb gpfAppSocketCb; +volatile tpfAppResolveCb gpfAppResolveCb; +volatile uint8_t gbSocketInit = 0; + +static tpfPingCb gfpPingCb = NULL; +static uint32_t gu32PingId = 0; + +/********************************************************************* +Function + Socket_ReadSocketData + +Description + Callback function used by the WINC3400 driver to deliver messages + for socket layer. + +Return + None. +*********************************************************************/ +static void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv, uint8_t u8SocketMsg, + uint32_t u32StartAddress, uint16_t u16ReadCount) +{ + uint32_t u32Address = u32StartAddress; + uint16_t u16Read; + int16_t s16Diff; + + pstrRecv->u16RemainingSize = u16ReadCount; + if((u16ReadCount > 0) && (gastrSockets[sock].pu8UserBuffer != NULL) && (gastrSockets[sock].u16UserBufferSize > 0) && (gastrSockets[sock].bIsUsed == 1)) + { + u16Read = u16ReadCount; + s16Diff = u16Read - gastrSockets[sock].u16UserBufferSize; + if(s16Diff > 0) + { + /* We don't expect to be here. Firmware only sends data to the driver according to the application's buffer size. + * But it is worth keeping this check, eg in case the application calls recv again with a smaller buffer size, or in case of HIF hacking. */ + u16Read = gastrSockets[sock].u16UserBufferSize; + } + + if(hif_receive(u32Address, gastrSockets[sock].pu8UserBuffer, u16Read, 1) == M2M_SUCCESS) + { + pstrRecv->pu8Buffer = gastrSockets[sock].pu8UserBuffer; + pstrRecv->s16BufferSize = u16Read; + pstrRecv->u16RemainingSize -= u16Read; + + gastrSockets[sock].u16UserBufferSize = 0; + gastrSockets[sock].pu8UserBuffer = NULL; + + if(gpfAppSocketCb) + gpfAppSocketCb(sock, u8SocketMsg, pstrRecv); + } + else + { + M2M_ERR("Current <%d>\r\n", u16ReadCount); + } + } +} +/********************************************************************* +Function + m2m_ip_cb + +Description + Callback function used by the NMC1000 driver to deliver messages + for socket layer. + +Return + None. +*********************************************************************/ +static void m2m_ip_cb(uint8_t u8OpCode, uint16_t u16BufferSize, uint32_t u32Address) +{ + if(u8OpCode == SOCKET_CMD_BIND) + { + tstrBindReply strBindReply; + tstrSocketBindMsg strBind; + + if(hif_receive(u32Address, (uint8_t*)&strBindReply, sizeof(tstrBindReply), 0) == M2M_SUCCESS) + { + strBind.status = strBindReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strBindReply.sock, SOCKET_MSG_BIND, &strBind); + } + } + else if(u8OpCode == SOCKET_CMD_LISTEN) + { + tstrListenReply strListenReply; + tstrSocketListenMsg strListen; + if(hif_receive(u32Address, (uint8_t*)&strListenReply, sizeof(tstrListenReply), 0) == M2M_SUCCESS) + { + strListen.status = strListenReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strListenReply.sock, SOCKET_MSG_LISTEN, &strListen); + } + } + else if(u8OpCode == SOCKET_CMD_ACCEPT) + { + tstrAcceptReply strAcceptReply; + tstrSocketAcceptMsg strAccept; + if(hif_receive(u32Address, (uint8_t*)&strAcceptReply, sizeof(tstrAcceptReply), 0) == M2M_SUCCESS) + { + if((strAcceptReply.sConnectedSock >= 0) && (strAcceptReply.sConnectedSock < MAX_SOCKET)) + { + gastrSockets[strAcceptReply.sConnectedSock].u8SSLFlags = 0; + gastrSockets[strAcceptReply.sConnectedSock].bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + gastrSockets[strAcceptReply.sConnectedSock].u16SessionID = gu16SessionID; + M2M_DBG("Socket %d session ID = %d\r\n", strAcceptReply.sConnectedSock, gu16SessionID); + } + strAccept.sock = strAcceptReply.sConnectedSock; + strAccept.strAddr.sin_family = AF_INET; + strAccept.strAddr.sin_port = strAcceptReply.strAddr.u16Port; + strAccept.strAddr.sin_addr.s_addr = strAcceptReply.strAddr.u32IPAddr; + if(gpfAppSocketCb) + gpfAppSocketCb(strAcceptReply.sListenSock, SOCKET_MSG_ACCEPT, &strAccept); + } + } + else if((u8OpCode == SOCKET_CMD_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT_ALPN)) + { + /* Note that for successful connections the fw always sends SOCKET_CMD_CONNECT, even for SSL connections. */ + tstrConnectAlpnReply strConnectAlpnReply = {{0}}; + tstrSocketConnectMsg strConnMsg; + uint16_t u16HifSz = sizeof(tstrConnectAlpnReply); + if(u8OpCode != SOCKET_CMD_SSL_CONNECT_ALPN) + u16HifSz = sizeof(tstrConnectReply); + if(hif_receive(u32Address, (uint8_t*)&strConnectAlpnReply, u16HifSz, 0) == M2M_SUCCESS) + { + if((strConnectAlpnReply.strConnReply.sock >= 0) && (strConnectAlpnReply.strConnReply.sock < MAX_SOCKET)) + { + uint8_t u8Msg = SOCKET_MSG_CONNECT; + + strConnMsg.sock = strConnectAlpnReply.strConnReply.sock; + strConnMsg.s8Error = strConnectAlpnReply.strConnReply.s8Error; + + /* If the SOCKET_CMD_SSL_CONNECT op code is received and the socket was already connected, then the + callback corresponds to an attempt to make the socket secure. */ + if(0 != gastrSockets[strConnMsg.sock].u16DataOffset) + { + u8Msg = SOCKET_MSG_SECURE; + } + if(strConnectAlpnReply.strConnReply.s8Error == SOCK_ERR_NO_ERROR) + { + gastrSockets[strConnMsg.sock].u16DataOffset = strConnectAlpnReply.strConnReply.u16AppDataOffset - M2M_HIF_HDR_OFFSET; + gastrSockets[strConnMsg.sock].u8AlpnStatus = strConnectAlpnReply.u8AppProtocolIdx; + } + else + { + gastrSockets[strConnMsg.sock].u8ErrSource = strConnectAlpnReply.strConnReply.u8ErrSource; + gastrSockets[strConnMsg.sock].u8ErrCode = strConnectAlpnReply.strConnReply.u8ErrCode; + } + if(gpfAppSocketCb) + gpfAppSocketCb(strConnMsg.sock, u8Msg, &strConnMsg); + } + } + } + else if(u8OpCode == SOCKET_CMD_DNS_RESOLVE) + { + tstrDnsReply strDnsReply; + if(hif_receive(u32Address, (uint8_t*)&strDnsReply, sizeof(tstrDnsReply), 0) == M2M_SUCCESS) + { + strDnsReply.u32HostIP = strDnsReply.u32HostIP; + if(gpfAppResolveCb) + gpfAppResolveCb((uint8_t*)strDnsReply.acHostName, strDnsReply.u32HostIP); + } + } + else if((u8OpCode == SOCKET_CMD_RECV) || (u8OpCode == SOCKET_CMD_RECVFROM) || (u8OpCode == SOCKET_CMD_SSL_RECV)) + { + SOCKET sock; + int16_t s16RecvStatus; + tstrRecvReply strRecvReply; + uint16_t u16ReadSize; + tstrSocketRecvMsg strRecvMsg; + uint8_t u8CallbackMsgID = SOCKET_MSG_RECV; + uint16_t u16DataOffset; + + if(u8OpCode == SOCKET_CMD_RECVFROM) + u8CallbackMsgID = SOCKET_MSG_RECVFROM; + + /* Read RECV REPLY data structure. + */ + u16ReadSize = sizeof(tstrRecvReply); + if(hif_receive(u32Address, (uint8_t*)&strRecvReply, u16ReadSize, 0) == M2M_SUCCESS) + { + if((strRecvReply.sock >= 0) && (strRecvReply.sock < MAX_SOCKET)) + { + uint16_t u16SessionID = 0; + + sock = strRecvReply.sock; + u16SessionID = strRecvReply.u16SessionID; + M2M_DBG("recv callback session ID = %d\r\n", u16SessionID); + + /* Reset the Socket RX Pending Flag. + */ + gastrSockets[sock].bIsRecvPending = 0; + + s16RecvStatus = NM_BSP_B_L_16(strRecvReply.s16RecvStatus); + u16DataOffset = NM_BSP_B_L_16(strRecvReply.u16DataOffset); + strRecvMsg.strRemoteAddr.sin_port = strRecvReply.strRemoteAddr.u16Port; + strRecvMsg.strRemoteAddr.sin_addr.s_addr = strRecvReply.strRemoteAddr.u32IPAddr; + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if((s16RecvStatus > 0) && (s16RecvStatus < u16BufferSize)) + { + /* Skip incoming bytes until reaching the Start of Application Data. + */ + u32Address += u16DataOffset; + + /* Read the Application data and deliver it to the application callback in + the given application buffer. Firmware only sends data up to + the size of the application buffer. For TCP, a new call to recv is needed + in order to retrieve any outstanding data from firmware. + */ + u16ReadSize = (uint16_t)s16RecvStatus; + Socket_ReadSocketData(sock, &strRecvMsg, u8CallbackMsgID, u32Address, u16ReadSize); + } + else + { + /* Don't tidy up here. Application must call shutdown(). + */ + strRecvMsg.s16BufferSize = s16RecvStatus; + strRecvMsg.pu8Buffer = NULL; + if(gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &strRecvMsg); + } + } + else + { + M2M_DBG("Discard recv callback %d %d\r\n", u16SessionID, gastrSockets[sock].u16SessionID); + if(u16ReadSize < u16BufferSize) + hif_receive(0, NULL, 0, 1); + } + } + } + } + else if((u8OpCode == SOCKET_CMD_SEND) || (u8OpCode == SOCKET_CMD_SENDTO) || (u8OpCode == SOCKET_CMD_SSL_SEND)) + { + SOCKET sock; + int16_t s16Rcvd; + tstrSendReply strReply; + uint8_t u8CallbackMsgID = SOCKET_MSG_SEND; + + if(u8OpCode == SOCKET_CMD_SENDTO) + u8CallbackMsgID = SOCKET_MSG_SENDTO; + + if(hif_receive(u32Address, (uint8_t*)&strReply, sizeof(tstrSendReply), 0) == M2M_SUCCESS) + { + if((strReply.sock >=0) && (strReply.sock < MAX_SOCKET)) + { + uint16_t u16SessionID = 0; + + sock = strReply.sock; + u16SessionID = strReply.u16SessionID; + M2M_DBG("send callback session ID = %d\r\n", u16SessionID); + + s16Rcvd = NM_BSP_B_L_16(strReply.s16SentBytes); + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if(gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &s16Rcvd); + } + else + { + M2M_DBG("Discard send callback %d %d\r\n", u16SessionID, gastrSockets[sock].u16SessionID); + } + } + } + } + else if(u8OpCode == SOCKET_CMD_PING) + { + tstrPingReply strPingReply; + if(hif_receive(u32Address, (uint8_t*)&strPingReply, sizeof(tstrPingReply), 1) == M2M_SUCCESS) + { + if((gu32PingId == strPingReply.u32CmdPrivate) && (gfpPingCb != NULL)) + { + gfpPingCb(strPingReply.u32IPAddr, strPingReply.u32RTT, strPingReply.u8ErrorCode); + } + } + } +} +/********************************************************************* +Function + socketInit + +Description + +Return + None. +*********************************************************************/ +void socketInit(void) +{ + if(gbSocketInit==0) + { + memset((uint8_t*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, m2m_ip_cb); + gbSocketInit=1; + gu16SessionID = 0; + } +} + +/********************************************************************* +Function + socketDeinit + +Description + +Return + None. +*********************************************************************/ +void socketDeinit(void) +{ + memset((uint8_t*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, NULL); + gpfAppSocketCb = NULL; + gpfAppResolveCb = NULL; + gbSocketInit = 0; +} + + +/********************************************************************* +Function + registerSocketCallback + +Description + +Return + None. +*********************************************************************/ +void registerSocketCallback(tpfAppSocketCb pfAppSocketCb, tpfAppResolveCb pfAppResolveCb) +{ + gpfAppSocketCb = pfAppSocketCb; + gpfAppResolveCb = pfAppResolveCb; +} +void registerSocketEventCallback(tpfAppSocketCb pfAppSocketCb) +{ + gpfAppSocketCb = pfAppSocketCb; +} +void registerSocketResolveCallback(tpfAppResolveCb pfAppResolveCb) +{ + gpfAppResolveCb = pfAppResolveCb; +} + +/********************************************************************* +Function + socket + +Description + Creates a socket. + +Return + - Negative value for error. + - ZERO or positive value as a socket ID if successful. +*********************************************************************/ +SOCKET socket(uint16_t u16Domain, uint8_t u8Type, uint8_t u8Config) +{ + SOCKET sock = -1; + uint8_t u8SockID; + uint8_t u8Count; + volatile tstrSocket *pstrSock = NULL; + static volatile uint8_t u8NextTcpSock = 0; + static volatile uint8_t u8NextUdpSock = 0; + + /* The only supported family is the AF_INET for UDP and TCP transport layer protocols. */ + if(u16Domain == AF_INET) + { + if(u8Type == SOCK_STREAM) + { + for(u8Count = 0; u8Count < TCP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextTcpSock; + pstrSock = &gastrSockets[u8NextTcpSock]; + u8NextTcpSock = (u8NextTcpSock + 1) % TCP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)u8SockID; + memset((uint8_t*)pstrSock, 0, sizeof(tstrSocket)); + /* In the current implementation, SSL flags only have meaning for the TCP socket case. */ + if(u8Config != SOCKET_CONFIG_SSL_OFF) + { + tstrSSLSocketCreateCmd strSSLCreate; + + strSSLCreate.sslSock = sock; + SOCKET_REQUEST(SOCKET_CMD_SSL_CREATE, (uint8_t*)&strSSLCreate, sizeof(tstrSSLSocketCreateCmd), 0, 0, 0); + + pstrSock->u8SSLFlags = SSL_FLAGS_ACTIVE; + if(u8Config == SOCKET_CONFIG_SSL_DELAY) + pstrSock->u8SSLFlags |= SSL_FLAGS_DELAY; + } + break; + } + } + } + else if(u8Type == SOCK_DGRAM) + { + volatile tstrSocket *pastrUDPSockets = &gastrSockets[TCP_SOCK_MAX]; + for(u8Count = 0; u8Count < UDP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextUdpSock; + pstrSock = &pastrUDPSockets[u8NextUdpSock]; + u8NextUdpSock = (u8NextUdpSock + 1) % UDP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)(u8SockID + TCP_SOCK_MAX); + memset((uint8_t*)pstrSock, 0, sizeof(tstrSocket)); + break; + } + } + } + else if(u8Type == SOCK_RAW) + { + /* Only raw IP packets are supported */ + if(u8Config == SOCKET_CONFIG_IPPROTO_RAW) + { + pstrSock = &gastrSockets[RAW_SOCK_ID]; + if(!pstrSock->bIsUsed) + { + /* Socket identified by RAW_SOCK_ID is reserved */ + sock = (SOCKET)RAW_SOCK_ID; + memset((uint8_t*)pstrSock, 0, sizeof(tstrSocket)); + } + } + } + + if(sock >= 0) + { + pstrSock->bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + pstrSock->u16SessionID = gu16SessionID; + M2M_INFO("Socket %d session ID = %d\r\n", sock, gu16SessionID); + } + } + return sock; +} +/********************************************************************* +Function + bind + +Description + Request to bind a socket on a local address. + +Return +*********************************************************************/ +int8_t bind(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((pstrAddr != NULL) && (sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrBindCmd strBind; + + /* Build the bind request. */ + strBind.sock = sock; + memcpy((uint8_t *)&strBind.strAddr, (uint8_t *)pstrAddr, sizeof(tstrSockAddr)); + + strBind.strAddr.u16Family = strBind.strAddr.u16Family; + strBind.strAddr.u16Port = strBind.strAddr.u16Port; + strBind.strAddr.u32IPAddr = strBind.strAddr.u32IPAddr; + strBind.u16SessionID = gastrSockets[sock].u16SessionID; + + /* Send the request. */ + s8Ret = SOCKET_REQUEST(SOCKET_CMD_BIND, (uint8_t*)&strBind, sizeof(tstrBindCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + listen + +Description + + +Return +*********************************************************************/ +int8_t listen(SOCKET sock, uint8_t backlog) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + tstrListenCmd strListen; + + strListen.sock = sock; + strListen.u8BackLog = backlog; + strListen.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_LISTEN, (uint8_t*)&strListen, sizeof(tstrListenCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + accept + +Description + +Return +*********************************************************************/ +int8_t accept(SOCKET sock, struct sockaddr *addr, uint8_t *addrlen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + s8Ret = SOCK_ERR_NO_ERROR; + } + return s8Ret; +} +/********************************************************************* +Function + connect + +Description + Connect to a remote TCP Server. + +Return +*********************************************************************/ +int8_t connect(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (sock < MAX_SOCKET) && (pstrAddr != NULL) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrConnectCmd strConnect; + uint8_t u8Cmd = SOCKET_CMD_CONNECT; + if((gastrSockets[sock].u8SSLFlags) & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CONNECT; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + } + strConnect.sock = sock; + memcpy((uint8_t *)&strConnect.strAddr, (uint8_t *)pstrAddr, sizeof(tstrSockAddr)); + + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strConnect, sizeof(tstrConnectCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + secure + +Description + Make secure (TLS) an open TCP client connection. + +Return +*********************************************************************/ +int8_t secure(SOCKET sock) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + if( + (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + && (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_DELAY) + && (gastrSockets[sock].u16DataOffset != 0) + ) + { + tstrConnectCmd strConnect = {0}; + + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_DELAY; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + strConnect.sock = sock; + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SECURE, (uint8_t*)&strConnect, sizeof(tstrConnectCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + return s8Ret; +} +/********************************************************************* +Function + send + +Description + +Return +*********************************************************************/ +int16_t send(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags) +{ + int16_t s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) && (gastrSockets[sock].bIsUsed == 1)) + { + uint16_t u16DataOffset; + tstrSendCmd strSend; + uint8_t u8Cmd; + + u8Cmd = SOCKET_CMD_SEND; + u16DataOffset = TCP_TX_PACKET_OFFSET; + + strSend.sock = sock; + strSend.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSend.u16SessionID = gastrSockets[sock].u16SessionID; + + if(sock >= TCP_SOCK_MAX) + { + u16DataOffset = UDP_TX_PACKET_OFFSET; + } + if( + (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + && (!(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_DELAY)) + ) + { + u8Cmd = SOCKET_CMD_SSL_SEND; + u16DataOffset = gastrSockets[sock].u16DataOffset; + } + + s16Ret = SOCKET_REQUEST(u8Cmd|M2M_REQ_DATA_PKT, (uint8_t*)&strSend, sizeof(tstrSendCmd), pvSendBuffer, u16SendLength, u16DataOffset); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + sendto + +Description + +Return +*********************************************************************/ +int16_t sendto(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags, struct sockaddr *pstrDestAddr, uint8_t u8AddrLen) +{ + int16_t s16Ret = SOCK_ERR_INVALID_ARG; + uint16_t u16MaxLength = (sock == RAW_SOCK_ID) ? (M2M_HIF_MAX_PACKET_SIZE - M2M_HIF_HDR_OFFSET - sizeof(tstrSendCmd)) : SOCKET_BUFFER_MAX_LENGTH; + + if((sock >= 0) && (sock < MAX_SOCKET) && (pvSendBuffer != NULL) && (u16SendLength <= u16MaxLength) && (gastrSockets[sock].bIsUsed == 1)) + { + tstrSendCmd strSendTo; + + memset((uint8_t*)&strSendTo, 0, sizeof(tstrSendCmd)); + + strSendTo.sock = sock; + strSendTo.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSendTo.u16SessionID = gastrSockets[sock].u16SessionID; + + if(pstrDestAddr != NULL) + { + struct sockaddr_in *pstrAddr; + pstrAddr = (void*)pstrDestAddr; + + strSendTo.strAddr.u16Family = pstrAddr->sin_family; + strSendTo.strAddr.u16Port = pstrAddr->sin_port; + strSendTo.strAddr.u32IPAddr = pstrAddr->sin_addr.s_addr; + } + s16Ret = SOCKET_REQUEST(SOCKET_CMD_SENDTO|M2M_REQ_DATA_PKT, (uint8_t*)&strSendTo, sizeof(tstrSendCmd), + pvSendBuffer, u16SendLength, (sock == RAW_SOCK_ID) ? IP_PACKET_OFFSET: UDP_TX_PACKET_OFFSET); + + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + recv + +Description + +Return + +*********************************************************************/ +int16_t recv(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec) +{ + int16_t s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8_t*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + uint8_t u8Cmd = SOCKET_CMD_RECV; + + gastrSockets[sock].bIsRecvPending = 1; + if( + (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + && (!(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_DELAY)) + ) + { + u8Cmd = SOCKET_CMD_SSL_RECV; + } + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + shutdown + +Description + +Return + None. +*********************************************************************/ +int8_t shutdown(SOCKET sock) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + M2M_INFO("Sock to delete <%d> (used %u)\r\n", sock, gastrSockets[sock].bIsUsed); + + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + uint8_t u8Cmd = SOCKET_CMD_CLOSE; + tstrCloseCmd strclose; + strclose.sock = sock; + strclose.u16SessionID = gastrSockets[sock].u16SessionID; + + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CLOSE; + } + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strclose, sizeof(tstrCloseCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + memset((uint8_t*)&gastrSockets[sock], 0, sizeof(tstrSocket)); + } + return s8Ret; +} +/********************************************************************* +Function + recvfrom + +Description + +Return + +*********************************************************************/ +int16_t recvfrom(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec) +{ + int16_t s16Ret = SOCK_ERR_NO_ERROR; + if((sock >= 0) && (sock < MAX_SOCKET) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + if(gastrSockets[sock].bIsUsed) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8_t*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + + gastrSockets[sock].bIsRecvPending = 1; + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(SOCKET_CMD_RECVFROM, (uint8_t*)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + } + else + { + s16Ret = SOCK_ERR_INVALID_ARG; + } + return s16Ret; +} +/********************************************************************* +Function + gethostbyname + +Description + +Return + None. +*********************************************************************/ +int8_t gethostbyname(const char *pcHostName) +{ + int8_t s8Err = SOCK_ERR_INVALID_ARG; + uint8_t u8HostNameSize = (uint8_t)strlen(pcHostName); + if(u8HostNameSize <= HOSTNAME_MAX_SIZE) + { + s8Err = SOCKET_REQUEST(SOCKET_CMD_DNS_RESOLVE|M2M_REQ_DATA_PKT, (uint8_t*)pcHostName, u8HostNameSize + 1, NULL, 0, 0); + if(s8Err != SOCK_ERR_NO_ERROR) + { + s8Err = SOCK_ERR_INVALID; + } + } + return s8Err; +} + +/********************************************************************* +Function + rawSetSockOpt + +Description + +Return + None. +*********************************************************************/ +static int8_t rawSetSockOpt(SOCKET sock, uint8_t u8Opt, const void *pvOptVal, uint16_t u16OptLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if(RAW_SOCK_ID == sock) + { + if(u16OptLen == sizeof(uint32_t)) + { + uint8_t u8Cmd = SOCKET_CMD_RAW_SET_SOCK_OPT; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option = u8Opt; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32_t*)pvOptVal; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + + return s8Ret; +} +/********************************************************************* +Function + sslSetSockOpt + +Description + +Return + None. +*********************************************************************/ +static int8_t sslSetSockOpt(SOCKET sock, uint8_t u8Opt, const void *pvOptVal, uint16_t u16OptLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if(sock < TCP_SOCK_MAX) + { + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + uint8_t sslFlag = 0; + + s8Ret = SOCK_ERR_NO_ERROR; + if(u16OptLen == sizeof(int)) + { + if(u8Opt == SO_SSL_BYPASS_X509_VERIF) + { + sslFlag = SSL_FLAGS_BYPASS_X509; + } + else if(u8Opt == SO_SSL_ENABLE_SESSION_CACHING) + { + sslFlag = SSL_FLAGS_CACHE_SESSION; + } + else if(u8Opt == SO_SSL_ENABLE_CERTNAME_VALIDATION) + { + sslFlag = SSL_FLAGS_CHECK_CERTNAME; + } + } + if(sslFlag) + { + int optVal = *((int*)pvOptVal); + if(optVal) + { + gastrSockets[sock].u8SSLFlags |= sslFlag; + } + else + { + gastrSockets[sock].u8SSLFlags &= ~sslFlag; + } + } + else if( + ((u8Opt == SO_SSL_SNI) && (u16OptLen < HOSTNAME_MAX_SIZE)) + || ((u8Opt == SO_SSL_ALPN) && (u16OptLen <= ALPN_LIST_MAX_SIZE)) + ) + { + tstrSSLSetSockOptCmd strCmd = {0}; + + strCmd.sock = sock; + strCmd.u16SessionID = gastrSockets[sock].u16SessionID; + strCmd.u8Option = u8Opt; + strCmd.u32OptLen = u16OptLen; + memcpy(strCmd.au8OptVal, (uint8_t*)pvOptVal, u16OptLen); + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT, (uint8_t*)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0); + if(s8Ret == M2M_ERR_MEM_ALLOC) + { + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT | M2M_REQ_DATA_PKT, + (uint8_t*)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0); + } + } + else + { + M2M_ERR("Unknown SSL Socket Option %d\r\n",u8Opt); + s8Ret = SOCK_ERR_INVALID_ARG; + } + } + else + { + M2M_ERR("Not SSL Socket\r\n"); + } + } + return s8Ret; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. +*********************************************************************/ +int8_t setsockopt(SOCKET sock, uint8_t u8Level, uint8_t option_name, + const void *option_value, uint16_t u16OptionLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (sock < MAX_SOCKET) && (option_value != NULL) && (gastrSockets[sock].bIsUsed == 1)) + { + if(u8Level == SOL_RAW) + { + s8Ret = rawSetSockOpt(sock, option_name, option_value, u16OptionLen); + } + else if(u8Level == SOL_SSL_SOCKET) + { + s8Ret = sslSetSockOpt(sock, option_name, option_value, u16OptionLen); + } + else if(u8Level == SOL_SOCKET) + { + if(u16OptionLen == sizeof(uint32_t)) + { + uint8_t u8Cmd = SOCKET_CMD_SET_SOCKET_OPTION; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option=option_name; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32_t*)option_value; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + } + return s8Ret; +} +/********************************************************************* +Function + getsockopt + +Description + +Return + None. +*********************************************************************/ +int8_t getsockopt(SOCKET sock, uint8_t u8Level, uint8_t u8OptName, const void *pvOptValue, uint8_t* pu8OptLen) +{ + // This is not implemented so return a value that will cause failure should this be used. + return SOCK_ERR_INVALID_ARG; +} +/********************************************************************* +Function + m2m_ping_req + +Description + Send Ping request. + +Return +*********************************************************************/ +int8_t m2m_ping_req(uint32_t u32DstIP, uint8_t u8TTL, tpfPingCb fpPingCb) +{ + int8_t s8Ret = M2M_ERR_INVALID_ARG; + + if((u32DstIP != 0) && (fpPingCb != NULL)) + { + tstrPingCmd strPingCmd; + + strPingCmd.u16PingCount = 1; + strPingCmd.u32DestIPAddr = u32DstIP; + strPingCmd.u32CmdPrivate = ++gu32PingId; + strPingCmd.u8TTL = u8TTL; + + gfpPingCb = fpPingCb; + s8Ret = SOCKET_REQUEST(SOCKET_CMD_PING, (uint8_t*)&strPingCmd, sizeof(tstrPingCmd), NULL, 0, 0); + } + return s8Ret; +} +/********************************************************************* +Function + set_alpn_protocol_list + +Description + This function sets the protocol list used for application-layer protocol negotiation (ALPN). + If used, it must be called after creating a SSL socket (using @ref socket) and before + connecting/binding (using @ref connect or @ref bind). + +Return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*********************************************************************/ +int8_t set_alpn_list(SOCKET sock, const char *pcProtocolList) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + if ((sock >= 0) && (sock < TCP_SOCK_MAX) && (pcProtocolList != NULL)) + { + uint8_t u8Length = strlen(pcProtocolList); + if ((u8Length > 0) && (u8Length < ALPN_LIST_MAX_APP_LENGTH)) + { + /* + ALPN socket option requires Alpn list in this format: + 0 1 2 3 ... (bytes) + +-------+-------+-------+ ... +-------+ ... +-------+ ... + | Length L (BE) | len1 | name1... | len2 | name2... | len3 | name3... + +-------+-------+-------+ ... +-------+ ... +-------+ ... + Length fields do not include themselves. + */ + uint8_t au8AlpnList[ALPN_LIST_MAX_SIZE] = {0}; + uint8_t *pu8Ptr = &au8AlpnList[3] + u8Length; + uint8_t u8Len = 0; + + memcpy(&au8AlpnList[3], pcProtocolList, u8Length); + u8Length++; + au8AlpnList[1] = u8Length; + au8AlpnList[2] = ' '; + + /* Convert space characters into length fields. */ + while (u8Length--) + { + if (*--pu8Ptr == ' ') + { + if (u8Len == 0) goto ERR; + *pu8Ptr = u8Len; + u8Len = 0; + } + else u8Len++; + } + s8Ret = setsockopt(sock, SOL_SSL_SOCKET, SO_SSL_ALPN, au8AlpnList, sizeof(au8AlpnList)); + } + } +ERR: + return s8Ret; +} +/********************************************************************* +Function + get_alpn_protocol_index + +Description + This function gets the protocol list used for application-layer protocol negotiation (ALPN). + If used, it must be called after creating a SSL socket (using @ref socket) and before + connecting/binding (using @ref connect or @ref bind). + +Return + The function returns the index of the selected application-layer protocol. + Special values: + 0: no negotiation has occurred. + <0: error. +*********************************************************************/ +int8_t get_alpn_index(SOCKET sock) +{ + if (sock >= TCP_SOCK_MAX || sock < 0) + return SOCK_ERR_INVALID_ARG; + if (!(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) || !gastrSockets[sock].bIsUsed) + return SOCK_ERR_INVALID_ARG; + return gastrSockets[sock].u8AlpnStatus; +} + +/********************************************************************* +Function + IsSocketReady + +Description + +Return + None. +*********************************************************************/ +uint8_t IsSocketReady(void) +{ + return gbSocketInit; +} + +/********************************************************************* +Function + get_error_detail + +Description + This function gets detail about a socket failure. + The application can call this when notified of a socket failure via + @ref SOCKET_MSG_CONNECT or @ref SOCKET_MSG_RECV. + If used, it must be called before @ref shutdown. + +Return + The function returns @ref SOCK_ERR_NO_ERROR if the request is successful + and a negative value otherwise. +*********************************************************************/ +int8_t get_error_detail(SOCKET sock, tstrSockErr *pstrErr) +{ + if ((sock >= TCP_SOCK_MAX) || (sock < 0) || (pstrErr == NULL)) + return SOCK_ERR_INVALID_ARG; + if (!gastrSockets[sock].bIsUsed) + return SOCK_ERR_INVALID_ARG; + pstrErr->enuErrSource = gastrSockets[sock].u8ErrSource; + pstrErr->u8ErrCode = gastrSockets[sock].u8ErrCode; + return SOCK_ERR_NO_ERROR; +} diff --git a/ChaletLora.X/Source/winc3400_142/spi_flash/include/spi_flash.h b/ChaletLora.X/Source/winc3400_142/spi_flash/include/spi_flash.h new file mode 100644 index 0000000..0c879f5 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/spi_flash/include/spi_flash.h @@ -0,0 +1,192 @@ +/******************************************************************************* + WINC3400 SPI Flash Interface + + File Name: + spi_flash.h + + Summary: + WINC3400 SPI Flash Interface + + Description: + WINC3400 SPI Flash 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. +*******************************************************************************/ + +/** @defgroup SPIFLASHAPI SPI FLASH + */ + +#ifndef __SPI_FLASH_H__ +#define __SPI_FLASH_H__ + +#include "nm_common.h" +#include "nmbus.h" +#include "spi_flash_map.h" + +/** @defgroup SPIFLASHFUNCTIONS Functions + * @ingroup SPIFLASHAPI + */ + +/**@{*/ +/*! + * @fn uint32_t spi_flash_get_size(void); + * @brief Returns with \ref uint32_t value which is total flash size\n + * @note Returned value in Mb (Mega Bit). + * @return SPI flash size in case of success and a ZERO value in case of failure. + */ +uint32_t spi_flash_get_size(void); + +/*! + * @fn int8_t spi_flash_read(uint8_t *, uint32_t, uint32_t); + * @brief Read a specified portion of data from SPI Flash.\n + * @param [out] pu8Buf + * Pointer to data buffer which will be filled with data in case of successful operation. + * @param [in] u32Addr + * Address (Offset) to read from at the SPI flash. + * @param [in] u32Sz + * Total size of data to be read in bytes + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for reading from SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @note + * - It is blocking function\n + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t spi_flash_read(uint8_t *pu8Buf, uint32_t u32Addr, uint32_t u32Sz); + +/*! + * @fn int8_t spi_flash_write(uint8_t *, uint32_t, uint32_t); + * @brief Write a specified portion of data to SPI Flash.\n + * @param [in] pu8Buf + * Pointer to data buffer which contains the data to be written. + * @param [in] u32Offset + * Address (Offset) to write at the SPI flash. + * @param [in] u32Sz + * Total number of size of data bytes + * @note + * - It is blocking function\n + * - It is user's responsibility to verify that data has been written successfully + * by reading data again and comparing it with the original. + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode. + * - Before writing to any section, it is required to erase that section first. + * @sa m2m_wifi_download_mode, spi_flash_get_size, spi_flash_erase + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t spi_flash_write(uint8_t* pu8Buf, uint32_t u32Offset, uint32_t u32Sz); + +/*! + * @fn int8_t spi_flash_erase(uint32_t, uint32_t); + * @brief Erase a specified portion of SPI Flash.\n + * @param [in] u32Offset + * Address (Offset) to erase from the SPI flash. + * @param [in] u32Sz + * Total number of bytes required to be erased. + * @note It is blocking function \n + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + * \section SPIFLASHExample Example + * @code{.c} + * #include "spi_flash.h" + * + * #define DATA_TO_REPLACE "THIS IS A NEW SECTOR IN FLASH" + * + * int main() + * { + * uint8_t au8FlashContent[FLASH_SECTOR_SZ] = {0}; + * uint32_t u32FlashTotalSize = 0; + * uint32_t u32FlashOffset = 0; + * + * ret = m2m_wifi_download_mode(); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to enter download mode\r\n"); + * } + * else + * { + * u32FlashTotalSize = spi_flash_get_size(); + * } + * + * while((u32FlashTotalSize > u32FlashOffset) && (M2M_SUCCESS == ret)) + * { + * ret = spi_flash_read(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to read SPI sector\r\n"); + * break; + * } + * memcpy(au8FlashContent, DATA_TO_REPLACE, strlen(DATA_TO_REPLACE)); + * + * ret = spi_flash_erase(u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to erase SPI sector\r\n"); + * break; + * } + * + * ret = spi_flash_write(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to write SPI sector\r\n"); + * break; + * } + * u32FlashOffset += FLASH_SECTOR_SZ; + * } + * + * if(M2M_SUCCESS == ret) + * { + * printf("Successful operations\r\n"); + * } + * else + * { + * printf("Failed operations\r\n"); + * } + * + * while(1); + * return M2M_SUCCESS; + * } + * @endcode + */ + +int8_t spi_flash_erase(uint32_t u32Offset, uint32_t u32Sz); + +/**@} + */ + +#endif //__SPI_FLASH_H__ \ No newline at end of file diff --git a/ChaletLora.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h b/ChaletLora.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h new file mode 100644 index 0000000..ed2e961 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h @@ -0,0 +1,264 @@ +/******************************************************************************* + WINC3400 SPI Flash Map + + File Name: + spi_flash_map.h + + Summary: + WINC3400 SPI Flash Map + + Description: + WINC3400 SPI Flash Map + *******************************************************************************/ + +//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. +*******************************************************************************/ + + +#ifndef __SPI_FLASH_MAP_H__ +#define __SPI_FLASH_MAP_H__ + +//#define DOWNLOAD_ROLLBACK +//#define OTA_GEN +#define _PROGRAM_POWER_SAVE_ +#define BT_IMAGE_PRESENT + +/* =======*=======*=======*=======*======= + * General Sizes for Flash Memory + * =======*=======*=======*=======*======= + */ + +#define FLASH_START_ADDR (0UL) +/*! M2M_OTA_IMAGE2_OFFSET) +#error "Exceed Flash Size" +#endif /* ((FLASH_COMMON_SZ + OTA_IMAGE_SIZE) > M2M_OTA_IMAGE2_OFFSET) */ +#if ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) +#error "OTA Exceed Flash Size" +#endif /* ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) */ + +#endif /* __SPI_FLASH_MAP_H__ */ diff --git a/ChaletLora.X/Source/winc3400_142/spi_flash/source/spi_flash.c b/ChaletLora.X/Source/winc3400_142/spi_flash/source/spi_flash.c new file mode 100644 index 0000000..1563f90 --- /dev/null +++ b/ChaletLora.X/Source/winc3400_142/spi_flash/source/spi_flash.c @@ -0,0 +1,599 @@ +/******************************************************************************* + WINC3400 SPI Flash Interface + + File Name: + spi_flash.c + + Summary: + WINC3400 SPI Flash Interface + + Description: + WINC3400 SPI Flash 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. +*******************************************************************************/ + +#include "spi_flash.h" +#include "spi_flash_map.h" +#include "nm_common.h" +#define DUMMY_REGISTER (0x1084) + +#define TIMEOUT (-1) /*MS*/ + +#define MAX_PROG_CNT 2 +#define MAX_RETRY 4 +#define MAX_ATTEMPT_STATUS_READ 50000 + +#define HOST_SHARE_MEM_BASE (0xd0000UL) +#define CORTUS_SHARE_MEM_BASE (0x60000000UL) +#define NMI_SPI_FLASH_ADDR (0x111c) +/*********************************************************** +SPI Flash DMA +***********************************************************/ +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32_t)X[1+Y]<<8) + ((uint32_t)X[2+Y]<<16) +((uint32_t)X[3+Y]<<24)) +#define SPI_FLASH_BASE (0x10200) +#define SPI_FLASH_MODE (SPI_FLASH_BASE + 0x00) +#define SPI_FLASH_CMD_CNT (SPI_FLASH_BASE + 0x04) +#define SPI_FLASH_DATA_CNT (SPI_FLASH_BASE + 0x08) +#define SPI_FLASH_BUF1 (SPI_FLASH_BASE + 0x0c) +#define SPI_FLASH_BUF2 (SPI_FLASH_BASE + 0x10) +#define SPI_FLASH_BUF_DIR (SPI_FLASH_BASE + 0x14) +#define SPI_FLASH_TR_DONE (SPI_FLASH_BASE + 0x18) +#define SPI_FLASH_DMA_ADDR (SPI_FLASH_BASE + 0x1c) +#define SPI_FLASH_MSB_CTL (SPI_FLASH_BASE + 0x20) +#define SPI_FLASH_TX_CTL (SPI_FLASH_BASE + 0x24) + +/*********************************************/ +/* STATIC FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read_status_reg +* @brief Read status register +* @param[OUT] val + value of status reg +* @return Status of execution +* @note Compatible with MX25L6465E +*/ +static int8_t spi_flash_read_status_reg(uint8_t *val) +{ + int8_t ret = M2M_SUCCESS; + uint8_t cmd[1]; + uint32_t reg; + + cmd[0] = 0x05; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)®); + if(M2M_SUCCESS != ret) break; + } + while(reg != 1); + + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + *val = reg & 0xff; + return ret; +} + +/** +* @fn spi_flash_load_to_cortus_mem +* @brief Load data from SPI flash into cortus memory +* @param[IN] u32MemAdr +* Cortus load address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_load_to_cortus_mem(uint32_t u32MemAdr, uint32_t u32FlashAdr, uint32_t u32Sz) +{ + uint8_t cmd[5]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x0b; + cmd[1] = (uint8_t)(u32FlashAdr >> 16); + cmd[2] = (uint8_t)(u32FlashAdr >> 8); + cmd[3] = (uint8_t)(u32FlashAdr); + cmd[4] = 0xA5; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, u32Sz); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF2, cmd[4]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 5 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_sector_erase +* @brief Erase sector (4KB) +* @param[IN] u32FlashAdr +* Any memory address within the sector +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_sector_erase(uint32_t u32FlashAdr) +{ + uint8_t cmd[4]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x20; + cmd[1] = (uint8_t)(u32FlashAdr >> 16); + cmd[2] = (uint8_t)(u32FlashAdr >> 8); + cmd[3] = (uint8_t)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_enable +* @brief Send write enable command to SPI flash +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_write_enable(void) +{ + uint8_t cmd[1]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x06; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_disable +* @brief Send write disable command to SPI flash +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_write_disable(void) +{ + uint8_t cmd[1]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + cmd[0] = 0x04; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_page_program +* @brief Write data (less than page size) from cortus memory to SPI flash +* @param[IN] u32MemAdr +* Cortus data address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_page_program(uint32_t u32MemAdr, uint32_t u32FlashAdr, uint32_t u32Sz) +{ + uint8_t cmd[4]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x02; + cmd[1] = (uint8_t)(u32FlashAdr >> 16); + cmd[2] = (uint8_t)(u32FlashAdr >> 8); + cmd[3] = (uint8_t)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7) | ((u32Sz & 0xfffff) << 8)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_read_internal +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32Addr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Data size must be < 64KB (limitation imposed by the bus wrapper) +*/ +static int8_t spi_flash_read_internal(uint8_t *pu8Buf, uint32_t u32Addr, uint32_t u32Sz) +{ + int8_t ret = M2M_SUCCESS; + /* read size must be < 64KB */ + ret = spi_flash_load_to_cortus_mem(HOST_SHARE_MEM_BASE, u32Addr, u32Sz); + if(M2M_SUCCESS != ret) goto ERR; + ret = nm_read_block(HOST_SHARE_MEM_BASE, pu8Buf, u32Sz); +ERR: + return ret; +} + +/** +* @fn spi_flash_pp +* @brief Program data of size less than a page (256 bytes) at the SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Sz +* Data size +* @return Status of execution +*/ +static int8_t spi_flash_pp(uint32_t u32Offset, uint8_t *pu8Buf, uint16_t u16Sz) +{ + int8_t ret = M2M_SUCCESS; + uint8_t tmp; + int i; + int p; + int x; + + /* use shared packet memory as temp mem */ + ret += nm_write_block(HOST_SHARE_MEM_BASE, pu8Buf, u16Sz); + + for(i = 0, p = 0; (i < MAX_RETRY) && (p < MAX_PROG_CNT); i++) + { + if((spi_flash_write_enable() == M2M_SUCCESS) && + (spi_flash_page_program(HOST_SHARE_MEM_BASE, u32Offset, u16Sz) == M2M_SUCCESS)) + { + x = 0; + while(++x < MAX_ATTEMPT_STATUS_READ) + { + if(spi_flash_read_status_reg(&tmp) != M2M_SUCCESS) + { + break; + } + if(!(tmp & 0x01)) + { + p++; + break; + } + } + } + } + ret = spi_flash_write_disable(); + + if(p < MAX_PROG_CNT) + { + ret = M2M_ERR_FAIL; + } + + return ret; +} + +/** +* @fn spi_flash_rdid +* @brief Read SPI Flash ID +* @return SPI FLash ID +*/ +static uint32_t spi_flash_rdid(void) +{ + unsigned char cmd[1]; + uint32_t reg = 0; + uint32_t cnt = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x9f; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)®); + if(M2M_SUCCESS != ret) break; + if(++cnt > 500) + { + ret = M2M_ERR_INIT; + break; + } + } + while(reg != 1); + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + M2M_PRINT("Flash ID %x \n", (unsigned int)reg); + return reg; +} + +/** +* @fn spi_flash_unlock +* @brief Unlock SPI Flash +*/ +#if 0 +static void spi_flash_unlock(void) +{ + uint8_t tmp; + tmp = spi_flash_read_security_reg(); + spi_flash_clear_security_flags(); + if(tmp & 0x80) + { + spi_flash_write_enable(); + spi_flash_gang_unblock(); + } +} +#endif + +/*********************************************/ +/* GLOBAL FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32offset +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +*/ +int8_t spi_flash_read(uint8_t *pu8Buf, uint32_t u32offset, uint32_t u32Sz) +{ + int8_t ret = M2M_SUCCESS; + if(u32Sz > FLASH_BLOCK_SIZE) + { + do + { + ret = spi_flash_read_internal(pu8Buf, u32offset, FLASH_BLOCK_SIZE); + if(M2M_SUCCESS != ret) goto ERR; + u32Sz -= FLASH_BLOCK_SIZE; + u32offset += FLASH_BLOCK_SIZE; + pu8Buf += FLASH_BLOCK_SIZE; + } while(u32Sz > FLASH_BLOCK_SIZE); + } + + ret = spi_flash_read_internal(pu8Buf, u32offset, u32Sz); + +ERR: + return ret; +} + +/** +* @fn spi_flash_write +* @brief Program SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +*/ +int8_t spi_flash_write(uint8_t *pu8Buf, uint32_t u32Offset, uint32_t u32Sz) +{ +#ifdef PROFILING + uint32_t t1 = 0; + uint32_t percent =0; + uint32_t tpercent =0; +#endif + int8_t ret = M2M_SUCCESS; + uint32_t u32wsz; + uint32_t u32off; + uint32_t u32Blksz; + u32Blksz = FLASH_PAGE_SZ; + u32off = u32Offset % u32Blksz; +#ifdef PROFILING + tpercent = (u32Sz/u32Blksz)+((u32Sz%u32Blksz)>0); + t1 = nm_bsp_get_tick(); + M2M_PRINT(">Start programming...\r\n"); +#endif + if(u32Sz<=0) + { + M2M_ERR("Data size = %d", (int)u32Sz); + ret = M2M_ERR_FAIL; + goto ERR; + } + + if(u32off) /*first part of data in the address page*/ + { + u32wsz = u32Blksz - u32off; + if(spi_flash_pp(u32Offset, pu8Buf, (uint16_t)BSP_MIN(u32Sz, u32wsz))!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + if(u32Sz < u32wsz) goto EXIT; + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; + } + while(u32Sz > 0) + { + u32wsz = BSP_MIN(u32Sz, u32Blksz); + + /*write complete page or the remaining data*/ + if(spi_flash_pp(u32Offset, pu8Buf, (uint16_t)u32wsz)!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; +#ifdef PROFILING + percent++; + printf("\r>Complete Percentage = %d%%.\r", ((percent*100)/tpercent)); +#endif + } +EXIT: +#ifdef PROFILING + M2M_PRINT("\rDone\t\t\t\t\t\t"); + M2M_PRINT("\n#Programming time = %f sec\n\r", (nm_bsp_get_tick() - t1)/1000.0); +#endif +ERR: + return ret; +} + +/** +* @fn spi_flash_erase +* @brief Erase from data from SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +*/ +int8_t spi_flash_erase(uint32_t u32Offset, uint32_t u32Sz) +{ + uint32_t i = 0; + uint8_t tmp = 0; + int p; + int j; + int x; + +#ifdef PROFILING + uint32_t t; + t = nm_bsp_get_tick(); +#endif + M2M_DBG("\r\n>Start erasing...\r\n"); + for(i = u32Offset; i < (u32Sz +u32Offset); i += (16*FLASH_PAGE_SZ)) + { + for(j = 0, p = 0; (j < MAX_RETRY) && (p < MAX_PROG_CNT); j++) + { + if((spi_flash_write_enable() == M2M_SUCCESS) && + (spi_flash_read_status_reg(&tmp) == M2M_SUCCESS) && + (spi_flash_sector_erase(i) == M2M_SUCCESS) && + (spi_flash_read_status_reg(&tmp) == M2M_SUCCESS)) + { + x = 0; + while(++x < MAX_ATTEMPT_STATUS_READ) + { + if(spi_flash_read_status_reg(&tmp) != M2M_SUCCESS) + { + break; + } + if(!(tmp & 0x01)) + { + p++; + break; + } + } + } + } + if(p != MAX_PROG_CNT) + { + return M2M_ERR_FAIL; + } + } + M2M_DBG("Done\r\n"); +#ifdef PROFILING + M2M_PRINT("#Erase time = %f sec\n", (nm_bsp_get_tick()-t)/1000.0); +#endif + return M2M_SUCCESS; +} + +/** +* @fn spi_flash_get_size +* @brief Get size of SPI Flash +* @return Size of Flash +*/ +uint32_t spi_flash_get_size(void) +{ + uint32_t u32FlashId = 0, u32FlashPwr = 0; + static uint32_t gu32InternalFlashSize= 0; + + if(!gu32InternalFlashSize) + { + u32FlashId = spi_flash_rdid();//spi_flash_probe(); + if(u32FlashId != 0xffffffff) + { + /*flash size is the third byte from the FLASH RDID*/ + u32FlashPwr = ((u32FlashId>>16)&0xff) - 0x11; /*2MBIT is the min*/ + /*That number power 2 to get the flash size*/ + gu32InternalFlashSize = 1<Bx_p%kqB5za-t*-2oi$}0fg-Y1G&__ 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⪙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 z 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 Rp#_8L)IlfbwS6z_{{Zm4cZ~o5 diff --git a/ChaletLora.X/dist/ChaletDuinoV2_795F512H_/debug/ChaletLora.X.debug.map b/ChaletLora.X/dist/ChaletDuinoV2_795F512H_/debug/ChaletLora.X.debug.map deleted file mode 100644 index 573f11a..0000000 --- a/ChaletLora.X/dist/ChaletDuinoV2_795F512H_/debug/ChaletLora.X.debug.map +++ /dev/null @@ -1,5374 +0,0 @@ -Archive member included because of file (symbol) - -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o (SoftReset) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - build/ChaletDuinoV2_795F512H_/debug/Source/main.o (CheKseg0CacheOn) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - build/ChaletDuinoV2_795F512H_/debug/Source/main.o (INTConfigureSystem) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - build/ChaletDuinoV2_795F512H_/debug/Source/main.o (INTEnableInterrupts) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - build/ChaletDuinoV2_795F512H_/debug/Source/main.o (INTDisableInterrupts) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - build/ChaletDuinoV2_795F512H_/debug/Source/main.o (INTRestoreInterrupts) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o (__floatunsisf) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) - build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o (memcpy) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) - build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o (memset) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) - build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o (strcpy) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) - build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o (strlen) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_bootstrap_exception_handler) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_reset) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_bootstrap) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_nmi_handler) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_general_exception_context) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_0) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_1) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_2) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_5) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_6) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_7) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_8) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_9) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_10) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_11) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_12) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_13) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_14) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_15) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_16) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_17) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_18) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_19) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_20) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_21) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_22) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_23) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_25) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_26) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_27) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_28) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_29) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_30) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_31) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_33) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_34) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_35) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_36) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_37) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_38) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_39) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_40) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_41) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_42) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_43) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_44) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_45) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_46) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_47) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_48) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_49) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_50) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_51) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_52) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_53) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_54) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_55) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_56) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_57) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_58) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_59) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_60) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_61) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_62) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_63) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) (_DefaultInterrupt) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) - build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o (fpdiv) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) - build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o (fpmul) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) - build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o (fpadd) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) - build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o (sitofp) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o (_iob) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o (fflush) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o (malloc) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o (puts) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o (setbuf) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o (strncmp) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - (_printf_cdfFnopsuxX) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) - build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o (_printf_cdnopsuxX) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) - build/ChaletDuinoV2_795F512H_/debug/Source/main.o (_printf_cdnopuxX) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) - build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o (_printf_fF) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o (_sprintf_cdfFnopuxX) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) - build/ChaletDuinoV2_795F512H_/debug/Source/Util.o (_sprintf_cdnopuxX) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o (_sscanf_s) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) (fputc) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) (_bufallo) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) (errno) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) (_vfprintf_cdfFnopsuxX) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) (_vfprintf_cdfFnopuxX) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) (_vfprintf_cdnopsuxX) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopuxX.eo) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) (_vfprintf_cdnopuxX) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_fF.eo) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) (_vfprintf_fF) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) (_vfscanf_s) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) (_flsbuf) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (fgetc) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (atoi) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_ctype) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (tolower) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_powers_f) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (ungetc) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) (_filbuf) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) (sbrk) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) (read) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) (write) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) (__XC_UART) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fpcmp) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (frexpf) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fptoui) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatdisf) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatundisf) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__udivdi3) -c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__umoddi3) - -Allocating common symbols -Common symbol size file - -mSyslogBufPtr 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o -BootloaderRxPtr 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o -u8IsMacAddrValid 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -CurDataChunkSize 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -mTerminalOpened 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -TerminalDataPtr 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -gpfAppResolveCb 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o -BootloaderFirmwareChunkWriteCount - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -BootloaderFlashWriteDataPtr - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -mTerminalPendingAction - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -acIntUartRxBuff 0x2 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o -mCurIPAddress 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -mBatteryCurrent 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o -mVoltageMeanSum 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o -mSPIFlashHighSpeedBaudrate - 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o -NetworkRxBuf 0x400 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -TerminalRxBuf 0x400 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -mStoredBootloaderInfo - 0x14 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -TerminalWorkString 0x12c build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -gu16BufferSize 0x2 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o -mWifiSPIBaudrate 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o -BootloaderRxBuf 0x400 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -mVoltageMeanCount 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o -mBatterySOC 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o -BootloaderFlashErased - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -gpfAppSocketCb 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o -BootloaderFlashWriteState - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -mac_addr 0x6 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -mLoraSMState 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o -BootloaderCurFlashWriteAddress - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -mRxData 0x136 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o -mHelpStringPtr 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -mSyslogBuffer 0x1f4 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o -mDeviceID 0x2 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o -mCurrentMeanCount 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o -ActualTemp 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/main.o -addr_in 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -BooloaderFlashEraseState - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -PowerRelayState 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o -param 0x1c build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -mCurrentMeanSum 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o -mModuleIPConfig 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -gsockerrno 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o -astUartData 0x620 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o -mLastTransactionOK 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o -BootloaderBuffer 0x12c build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -I2CSlaveBuffer 0xa build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o -mSPIFlashBaudrate 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o -BootloaderCurFlashEraseAddress - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -TerminalPrevDataBuf - 0x12c build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -BootloaderFlashWritePollCount - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -BootloaderInterfaceState - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -DataChunkWritten 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -mTxData 0x136 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o -mBatteryVoltage 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o -mSPIFlashOK 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o -mI2CWaitCounter 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o -gastrSockets 0xb0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o -mCurrentModuleOK 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o -at_sb_printf 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o -mTerminalTickState 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -I2CMasterBuffer 0xa build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o -BooloaderFlashErasePollCount - 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -FirmwareUploaded 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -gfpPingCb 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o -mFlashSectorBuffer 0x1000 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o -CurDataChunkIndex 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -gu8OpCode 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o -astTimer 0x108 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o -TerminalDataBuf 0x12c build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -astInternalUartData - 0x40 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o -SyslogRxBuf 0xc8 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - -Microchip PIC32 Memory-Usage Report - -kseg0 Program-Memory Usage -section address length [bytes] (dec) Description -------- ---------- ------------------------- ----------- -.text 0x9d005800 0xc124 49444 App's exec code -.text._vfprintf_cdfFnop 0x9d011924 0x13d4 5076 -.text 0x9d012cf8 0x8000 32768 App's exec code -.dinit 0x9d01acf8 0xb60 2912 -.text 0x9d01b858 0x974 2420 App's exec code -.text._vfscanf_s 0x9d01c1cc 0x868 2152 -.text 0x9d01ca34 0x7e8 2024 App's exec code -.rodata 0x9d01d21c 0x7b8 1976 Read-only const -.text 0x9d01d9d4 0x2444 9284 App's exec code -.rodata 0x9d01fe18 0x494 1172 Read-only const -.text 0x9d0202ac 0x1534 5428 App's exec code -.rodata 0x9d0217e0 0x404 1028 Read-only const -.text 0x9d021be4 0xd6c 3436 App's exec code -.text.scale 0x9d022950 0x2a0 672 -.text.fpsubadd 0x9d022bf0 0x278 632 -.text.malloc 0x9d022e68 0x278 632 -.text 0x9d0230e0 0x988 2440 App's exec code -.rodata 0x9d023a68 0x254 596 Read-only const -.text.fp32div 0x9d023cbc 0x230 560 -.text.__floatdisf 0x9d023eec 0x220 544 -.text.fp32mul 0x9d02410c 0x1bc 444 -.text 0x9d0242c8 0x1a0 416 App's exec code -.text.realloc 0x9d024468 0x194 404 -.text._sbrk_init 0x9d0245fc 0x194 404 -.text._filbuf 0x9d024790 0x188 392 -.text.read 0x9d024918 0x174 372 -.text 0x9d024a8c 0x2d0 720 App's exec code -.text.fputc 0x9d024d5c 0x15c 348 -.text._flsbuf 0x9d024eb8 0x12c 300 -.text 0x9d024fe4 0x11c 284 App's exec code -.text.fgetc 0x9d025100 0x108 264 -.rodata 0x9d025208 0x204 516 Read-only const -.text.setvbuf 0x9d02540c 0xfc 252 -.rodata 0x9d025508 0xe0 224 Read-only const -.text.general_exception 0x9d0255e8 0xdc 220 -.text 0x9d0256c4 0x1ac 428 App's exec code -.rodata 0x9d025870 0xc8 200 Read-only const -.text._sbrk 0x9d025938 0xc4 196 -.text 0x9d0259fc 0xa8 168 App's exec code -.text.atoi 0x9d025aa4 0xa8 168 -.text.range 0x9d025b4c 0xa0 160 -.text.fpcmp 0x9d025bec 0x9c 156 -.text.fflush 0x9d025c88 0x94 148 -.text.write 0x9d025d1c 0x94 148 -.text.libm 0x9d025db0 0x88 136 -.text 0x9d025e38 0x80 128 App's exec code -.text.fptoul 0x9d025eb8 0x7c 124 -.text.SoftReset 0x9d025f34 0x78 120 -.text.fputs 0x9d025fac 0x78 120 -.text.strncmp 0x9d026024 0x78 120 -.text.ungetc 0x9d02609c 0x74 116 -.text 0x9d026110 0xd8 216 App's exec code -.text._sprintf_cdfFnopu 0x9d0261e8 0x68 104 -.rodata 0x9d026250 0x68 104 Read-only const -.text.sitofp 0x9d0262b8 0x60 96 -.text.wspace 0x9d026318 0x60 96 -.text 0x9d026378 0x58 88 App's exec code -.text._sscanf_s 0x9d0263d0 0x54 84 -.text._bufallo 0x9d026424 0x54 84 -.text.sbrk 0x9d026478 0x50 80 -.text.main_entry 0x9d0264c8 0x4c 76 -.text 0x9d026514 0x4c 76 App's exec code -.text._bootstrap_except 0x9d026560 0x48 72 -.text 0x9d0265a8 0x44 68 App's exec code -.text.puts 0x9d0265ec 0x44 68 -.text._printf_cdfFnopsu 0x9d026630 0x40 64 -.vector_default 0x9d026670 0x38 56 -.rodata 0x9d0266a8 0x64 100 Read-only const -.text.INTConfigureSyste 0x9d02670c 0x30 48 -.text.free 0x9d02673c 0x30 48 -.text._stub_sbd_memlayo 0x9d02676c 0x2c 44 -.rodata 0x9d026798 0x28 40 Read-only const -.text.tolower 0x9d0267c0 0x24 36 -.text.toupper 0x9d0267e4 0x24 36 -.text 0x9d026808 0x20 32 App's exec code -.rodata 0x9d026828 0x1c 28 Read-only const -.text.INTRestoreInterru 0x9d026844 0x1c 28 -.text.setbuf 0x9d026860 0x1c 28 -.rodata 0x9d02687c 0x30 48 Read-only const -.text.CheKseg0CacheOff 0x9d0268ac 0x18 24 -.text.CheKseg0CacheOn 0x9d0268c4 0x18 24 -.text 0x9d0268dc 0x18 24 App's exec code -.text.isalnum 0x9d0268f4 0x18 24 -.text.isalpha 0x9d02690c 0x18 24 -.text.iscntrl 0x9d026924 0x18 24 -.text.isdigit 0x9d02693c 0x18 24 -.text.isgraph 0x9d026954 0x18 24 -.text.islower 0x9d02696c 0x18 24 -.text.isprint 0x9d026984 0x18 24 -.text.ispunct 0x9d02699c 0x18 24 -.text.isspace 0x9d0269b4 0x18 24 -.text.isupper 0x9d0269cc 0x18 24 -.text.isxdigit 0x9d0269e4 0x18 24 -.text._buffree 0x9d0269fc 0x14 20 -.rodata 0x9d026a10 0x10 16 Read-only const -.text.__exception_handl 0x9d026a20 0xc 12 -.rodata 0x9d026a2c 0x18 24 Read-only const -.text.INTEnableInterrup 0x9d026a44 0x8 8 -.text.INTDisableInterru 0x9d026a4c 0x8 8 -.text._on_reset 0x9d026a54 0x8 8 -.text._on_bootstrap 0x9d026a5c 0x8 8 -.text.isascii 0x9d026a64 0x8 8 -.text.toascii 0x9d026a6c 0x8 8 -.text._tolower 0x9d026a74 0x8 8 -.text._toupper 0x9d026a7c 0x8 8 -.text.getpagesize 0x9d026a84 0x8 8 -.rodata 0x9d026a8c 0xc 12 Read-only const - Total kseg0_program_mem used : 0x21298 135832 27.1% of 0x7a7ff - -kseg0 Boot-Memory Usage -section address length [bytes] (dec) Description -------- ---------- ------------------------- ----------- -.startup 0x9d005000 0x1e8 488 C startup code - Total kseg0_boot_mem used : 0x1e8 488 24.0% of 0x7f0 - -Exception-Memory Usage -section address length [bytes] (dec) Description -------- ---------- ------------------------- ----------- -.app_excpt 0x9d004180 0x10 16 General-Exception -.vector_0 0x9d004200 0x8 8 Interrupt Vector 0 -.vector_1 0x9d004220 0x8 8 Interrupt Vector 1 -.vector_2 0x9d004240 0x8 8 Interrupt Vector 2 -.vector_3 0x9d004260 0x8 8 Interrupt Vector 3 -.vector_4 0x9d004280 0x8 8 Interrupt Vector 4 -.vector_5 0x9d0042a0 0x8 8 Interrupt Vector 5 -.vector_6 0x9d0042c0 0x8 8 Interrupt Vector 6 -.vector_7 0x9d0042e0 0x8 8 Interrupt Vector 7 -.vector_8 0x9d004300 0x8 8 Interrupt Vector 8 -.vector_9 0x9d004320 0x8 8 Interrupt Vector 9 -.vector_10 0x9d004340 0x8 8 Interrupt Vector 10 -.vector_11 0x9d004360 0x8 8 Interrupt Vector 11 -.vector_12 0x9d004380 0x8 8 Interrupt Vector 12 -.vector_13 0x9d0043a0 0x8 8 Interrupt Vector 13 -.vector_14 0x9d0043c0 0x8 8 Interrupt Vector 14 -.vector_15 0x9d0043e0 0x8 8 Interrupt Vector 15 -.vector_16 0x9d004400 0x8 8 Interrupt Vector 16 -.vector_17 0x9d004420 0x8 8 Interrupt Vector 17 -.vector_18 0x9d004440 0x8 8 Interrupt Vector 18 -.vector_19 0x9d004460 0x8 8 Interrupt Vector 19 -.vector_20 0x9d004480 0x8 8 Interrupt Vector 20 -.vector_21 0x9d0044a0 0x8 8 Interrupt Vector 21 -.vector_22 0x9d0044c0 0x8 8 Interrupt Vector 22 -.vector_23 0x9d0044e0 0x8 8 Interrupt Vector 23 -.vector_24 0x9d004500 0x8 8 Interrupt Vector 24 -.vector_25 0x9d004520 0x8 8 Interrupt Vector 25 -.vector_26 0x9d004540 0x8 8 Interrupt Vector 26 -.vector_27 0x9d004560 0x8 8 Interrupt Vector 27 -.vector_28 0x9d004580 0x8 8 Interrupt Vector 28 -.vector_29 0x9d0045a0 0x8 8 Interrupt Vector 29 -.vector_30 0x9d0045c0 0x8 8 Interrupt Vector 30 -.vector_31 0x9d0045e0 0x8 8 Interrupt Vector 31 -.vector_32 0x9d004600 0x8 8 Interrupt Vector 32 -.vector_33 0x9d004620 0x8 8 Interrupt Vector 33 -.vector_34 0x9d004640 0x8 8 Interrupt Vector 34 -.vector_35 0x9d004660 0x8 8 Interrupt Vector 35 -.vector_36 0x9d004680 0x8 8 Interrupt Vector 36 -.vector_37 0x9d0046a0 0x8 8 Interrupt Vector 37 -.vector_38 0x9d0046c0 0x8 8 Interrupt Vector 38 -.vector_39 0x9d0046e0 0x8 8 Interrupt Vector 39 -.vector_40 0x9d004700 0x8 8 Interrupt Vector 40 -.vector_41 0x9d004720 0x8 8 Interrupt Vector 41 -.vector_42 0x9d004740 0x8 8 Interrupt Vector 42 -.vector_43 0x9d004760 0x8 8 Interrupt Vector 43 -.vector_44 0x9d004780 0x8 8 Interrupt Vector 44 -.vector_45 0x9d0047a0 0x8 8 Interrupt Vector 45 -.vector_46 0x9d0047c0 0x8 8 Interrupt Vector 46 -.vector_47 0x9d0047e0 0x8 8 Interrupt Vector 47 -.vector_48 0x9d004800 0x8 8 Interrupt Vector 48 -.vector_49 0x9d004820 0x8 8 Interrupt Vector 49 -.vector_50 0x9d004840 0x8 8 Interrupt Vector 50 -.vector_51 0x9d004860 0x8 8 Interrupt Vector 51 -.vector_52 0x9d004880 0x8 8 Interrupt Vector 52 -.vector_53 0x9d0048a0 0x8 8 Interrupt Vector 53 -.vector_54 0x9d0048c0 0x8 8 Interrupt Vector 54 -.vector_55 0x9d0048e0 0x8 8 Interrupt Vector 55 -.vector_56 0x9d004900 0x8 8 Interrupt Vector 56 -.vector_57 0x9d004920 0x8 8 Interrupt Vector 57 -.vector_58 0x9d004940 0x8 8 Interrupt Vector 58 -.vector_59 0x9d004960 0x8 8 Interrupt Vector 59 -.vector_60 0x9d004980 0x8 8 Interrupt Vector 60 -.vector_61 0x9d0049a0 0x8 8 Interrupt Vector 61 -.vector_62 0x9d0049c0 0x8 8 Interrupt Vector 62 -.vector_63 0x9d0049e0 0x8 8 Interrupt Vector 63 - Total exception_mem used : 0x210 528 12.9% of 0x1000 - -kseg1 Boot-Memory Usage -section address length [bytes] (dec) Description -------- ---------- ------------------------- ----------- -.reset 0xbfc00000 0x8 8 Reset handler -.bev_excpt 0xbfc00380 0x10 16 BEV-Exception - Total kseg1_boot_mem used : 0x18 24 2.1% of 0x490 - -------------------------------------------------------------------------- - Total Program Memory used : 0x216a8 136872 26.9% of 0x7c47f - -------------------------------------------------------------------------- - - -kseg0 Data-Memory Usage -section address length [bytes] (dec) Description -------- ---------- ------------------------- ----------- -reserve_data_0_kseg0 0x80000000 0x200 512 - Total kseg0_data_mem used : 0x200 512 100.0% of 0x200 - -kseg1 Data-Memory Usage -section address length [bytes] (dec) Description -------- ---------- ------------------------- ----------- -reserve_data_0_kseg1 0xa0000000 0x200 512 -.eh_frame 0xa0000200 0x30 48 -.sdata 0xa0000230 0x7c 124 Small init data -.sbss 0xa00002ac 0x1ac 428 Small uninit data -.bss 0xa0000458 0x2e5c 11868 Uninitialized data -.data 0xa00032b4 0x4bc 1212 Initialized data -.bss 0xa0003770 0x800 2048 Uninitialized data -.data 0xa0003f70 0x2c4 708 Initialized data -.bss 0xa0004234 0x74 116 Uninitialized data - Total kseg1_data_mem used : 0x42a8 17064 26.0% of 0x10000 - -------------------------------------------------------------------------- - Total Data Memory used : 0x44a8 17576 26.6% of 0x10200 - -------------------------------------------------------------------------- - - -Dynamic Data-Memory Reservation -section address length [bytes] (dec) Description -------- ---------- ------------------------- ----------- -heap 0xa00042b0 0x200 512 Reserved for heap -stack 0xa00044c8 0xbb30 47920 Reserved for stack - - -------------------------------------------------------------------------- - -Discarded input sections - - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/system.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/template.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o - .discard 0x00000000 0x100 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -Memory Configuration - -Name Origin Length Attributes -kseg0_data_mem 0x80000000 0x00000200 -kseg1_data_mem 0xa0000000 0x00010000 w !x -kseg0_boot_mem 0x9d005000 0x000007f0 -kseg1_boot_mem 0xbfc00000 0x00000490 -kseg0_program_mem 0x9d005800 0x0007a7ff xr -exception_mem 0x9d004000 0x00001000 -debug_exec_mem 0xbfc02000 0x00000ff0 -config3 0xbfc02ff0 0x00000004 -config2 0xbfc02ff4 0x00000004 -config1 0xbfc02ff8 0x00000004 -config0 0xbfc02ffc 0x00000004 -sfrs 0xbf800000 0x00100000 -configsfrs 0xbfc02ff0 0x00000010 -*default* 0x00000000 0xffffffff - -Linker script and memory map - - -reserve_data_0_kseg0 - 0x80000000 0x200 - 0x80000000 0x2 SHORT 0x0 - 0x000001fd . = 0x1fd - *fill* 0x80000002 0x1fb - 0x80000200 . = ALIGN (0x4) - *fill* 0x800001fd 0x3 - -reserve_data_0_kseg1 - 0xa0000000 0x200 - 0xa0000000 0x2 SHORT 0x0 - 0x000001fd . = 0x1fd - *fill* 0xa0000002 0x1fb - 0xa0000200 . = ALIGN (0x4) - *fill* 0xa00001fd 0x3 - -reserve_boot_0x1fc02000_kseg0 - 0x9fc02000 0xff0 - 0x9fc02000 0x2 SHORT 0x0 - 0x00000500 . = 0x500 - *fill* 0x9fc02002 0x4fe - 0x9fc02500 . = ALIGN (0x4) - 0x9fc02500 0x2 SHORT 0x0 - 0x00000ff0 . = 0xff0 - *fill* 0x9fc02502 0xaee - 0x9fc02ff0 . = ALIGN (0x4) - -reserve_boot_0x1fc02000_kseg1 - 0xbfc02000 0xff0 - 0xbfc02000 0x2 SHORT 0x0 - 0x00000500 . = 0x500 - *fill* 0xbfc02002 0x4fe - 0xbfc02500 . = ALIGN (0x4) - 0xbfc02500 0x2 SHORT 0x0 - 0x00000ff0 . = 0xff0 - *fill* 0xbfc02502 0xaee - 0xbfc02ff0 . = ALIGN (0x4) -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/Util.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/main.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/system.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/template.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/timer.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o -LOAD build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - 0x00000001 __MPLAB_BUILD = 0x1 - 0x00000400 PROVIDE (_min_stack_size, 0x400) -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o -START GROUP -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral.a -END GROUP -START GROUP -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a -END GROUP - 0x00000001 PROVIDE (_vector_spacing, 0x1) - 0x9d004000 _ebase_address = 0x9d004000 - 0xbfc00000 _RESET_ADDR = 0xbfc00000 - 0xbfc00380 _BEV_EXCPT_ADDR = 0xbfc00380 - 0xbfc00480 _DBG_EXCPT_ADDR = 0xbfc00480 - 0xbfc02000 _DBG_CODE_ADDR = 0xbfc02000 - 0x00000ff0 _DBG_CODE_SIZE = 0xff0 - 0x9d004180 _GEN_EXCPT_ADDR = (_ebase_address + 0x180) - -.config_BFC02FF0 - *(.config_BFC02FF0) - -.config_BFC02FF4 - 0xbfc02ff4 0x4 - *(.config_BFC02FF4) - .config_BFC02FF4 - 0xbfc02ff4 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - -.config_BFC02FF8 - 0xbfc02ff8 0x4 - *(.config_BFC02FF8) - .config_BFC02FF8 - 0xbfc02ff8 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - -.config_BFC02FFC - 0xbfc02ffc 0x4 - *(.config_BFC02FFC) - .config_BFC02FFC - 0xbfc02ffc 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - 0xbfc02000 PROVIDE (_DBG_CODE_ADDR, 0xbfc02000) - 0x00000ff0 PROVIDE (_DBG_CODE_SIZE, 0xff0) - -.reset 0xbfc00000 0x8 - *(.reset) - .reset 0xbfc00000 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o - 0xbfc00000 _reset - -.bev_excpt 0xbfc00380 0x10 - *(.bev_handler) - .bev_handler 0xbfc00380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o - -.dbg_excpt 0xbfc00480 0x0 - 0xbfc00480 . = (. + DEFINED (_DEBUGGER)?0x8:0x0) - -.dbg_code 0xbfc02000 0x0 - 0xbfc02000 . = (. + DEFINED (_DEBUGGER)?_DBG_CODE_SIZE:0x0) - -.app_excpt 0x9d004180 0x10 - *(.gen_handler) - .gen_handler 0x9d004180 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o - -.vector_0 0x9d004200 0x8 - *(.vector_0) - .vector_0 0x9d004200 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) - 0x9d004200 __vector_dispatch_0 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_0) <= (_vector_spacing << 0x5))), function at exception vector 0 too large) - -.vector_1 0x9d004220 0x8 - *(.vector_1) - .vector_1 0x9d004220 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) - 0x9d004220 __vector_dispatch_1 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_1) <= (_vector_spacing << 0x5))), function at exception vector 1 too large) - -.vector_2 0x9d004240 0x8 - *(.vector_2) - .vector_2 0x9d004240 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) - 0x9d004240 __vector_dispatch_2 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_2) <= (_vector_spacing << 0x5))), function at exception vector 2 too large) - -.vector_3 0x9d004260 0x8 - *(.vector_3) - .vector_3 0x9d004260 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - 0x9d004260 __vector_dispatch_3 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_3) <= (_vector_spacing << 0x5))), function at exception vector 3 too large) - -.vector_4 0x9d004280 0x8 - *(.vector_4) - .vector_4 0x9d004280 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - 0x9d004280 __vector_dispatch_4 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_4) <= (_vector_spacing << 0x5))), function at exception vector 4 too large) - -.vector_5 0x9d0042a0 0x8 - *(.vector_5) - .vector_5 0x9d0042a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) - 0x9d0042a0 __vector_dispatch_5 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_5) <= (_vector_spacing << 0x5))), function at exception vector 5 too large) - -.vector_6 0x9d0042c0 0x8 - *(.vector_6) - .vector_6 0x9d0042c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) - 0x9d0042c0 __vector_dispatch_6 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_6) <= (_vector_spacing << 0x5))), function at exception vector 6 too large) - -.vector_7 0x9d0042e0 0x8 - *(.vector_7) - .vector_7 0x9d0042e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) - 0x9d0042e0 __vector_dispatch_7 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_7) <= (_vector_spacing << 0x5))), function at exception vector 7 too large) - -.vector_8 0x9d004300 0x8 - *(.vector_8) - .vector_8 0x9d004300 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) - 0x9d004300 __vector_dispatch_8 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_8) <= (_vector_spacing << 0x5))), function at exception vector 8 too large) - -.vector_9 0x9d004320 0x8 - *(.vector_9) - .vector_9 0x9d004320 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) - 0x9d004320 __vector_dispatch_9 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_9) <= (_vector_spacing << 0x5))), function at exception vector 9 too large) - -.vector_10 0x9d004340 0x8 - *(.vector_10) - .vector_10 0x9d004340 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) - 0x9d004340 __vector_dispatch_10 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_10) <= (_vector_spacing << 0x5))), function at exception vector 10 too large) - -.vector_11 0x9d004360 0x8 - *(.vector_11) - .vector_11 0x9d004360 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) - 0x9d004360 __vector_dispatch_11 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_11) <= (_vector_spacing << 0x5))), function at exception vector 11 too large) - -.vector_12 0x9d004380 0x8 - *(.vector_12) - .vector_12 0x9d004380 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) - 0x9d004380 __vector_dispatch_12 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_12) <= (_vector_spacing << 0x5))), function at exception vector 12 too large) - -.vector_13 0x9d0043a0 0x8 - *(.vector_13) - .vector_13 0x9d0043a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) - 0x9d0043a0 __vector_dispatch_13 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_13) <= (_vector_spacing << 0x5))), function at exception vector 13 too large) - -.vector_14 0x9d0043c0 0x8 - *(.vector_14) - .vector_14 0x9d0043c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) - 0x9d0043c0 __vector_dispatch_14 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_14) <= (_vector_spacing << 0x5))), function at exception vector 14 too large) - -.vector_15 0x9d0043e0 0x8 - *(.vector_15) - .vector_15 0x9d0043e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) - 0x9d0043e0 __vector_dispatch_15 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_15) <= (_vector_spacing << 0x5))), function at exception vector 15 too large) - -.vector_16 0x9d004400 0x8 - *(.vector_16) - .vector_16 0x9d004400 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) - 0x9d004400 __vector_dispatch_16 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_16) <= (_vector_spacing << 0x5))), function at exception vector 16 too large) - -.vector_17 0x9d004420 0x8 - *(.vector_17) - .vector_17 0x9d004420 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) - 0x9d004420 __vector_dispatch_17 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_17) <= (_vector_spacing << 0x5))), function at exception vector 17 too large) - -.vector_18 0x9d004440 0x8 - *(.vector_18) - .vector_18 0x9d004440 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) - 0x9d004440 __vector_dispatch_18 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_18) <= (_vector_spacing << 0x5))), function at exception vector 18 too large) - -.vector_19 0x9d004460 0x8 - *(.vector_19) - .vector_19 0x9d004460 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) - 0x9d004460 __vector_dispatch_19 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_19) <= (_vector_spacing << 0x5))), function at exception vector 19 too large) - -.vector_20 0x9d004480 0x8 - *(.vector_20) - .vector_20 0x9d004480 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) - 0x9d004480 __vector_dispatch_20 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_20) <= (_vector_spacing << 0x5))), function at exception vector 20 too large) - -.vector_21 0x9d0044a0 0x8 - *(.vector_21) - .vector_21 0x9d0044a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) - 0x9d0044a0 __vector_dispatch_21 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_21) <= (_vector_spacing << 0x5))), function at exception vector 21 too large) - -.vector_22 0x9d0044c0 0x8 - *(.vector_22) - .vector_22 0x9d0044c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) - 0x9d0044c0 __vector_dispatch_22 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_22) <= (_vector_spacing << 0x5))), function at exception vector 22 too large) - -.vector_23 0x9d0044e0 0x8 - *(.vector_23) - .vector_23 0x9d0044e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) - 0x9d0044e0 __vector_dispatch_23 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_23) <= (_vector_spacing << 0x5))), function at exception vector 23 too large) - -.vector_24 0x9d004500 0x8 - *(.vector_24) - .vector_24 0x9d004500 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - 0x9d004500 __vector_dispatch_24 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_24) <= (_vector_spacing << 0x5))), function at exception vector 24 too large) - -.vector_25 0x9d004520 0x8 - *(.vector_25) - .vector_25 0x9d004520 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) - 0x9d004520 __vector_dispatch_25 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_25) <= (_vector_spacing << 0x5))), function at exception vector 25 too large) - -.vector_26 0x9d004540 0x8 - *(.vector_26) - .vector_26 0x9d004540 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) - 0x9d004540 __vector_dispatch_26 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_26) <= (_vector_spacing << 0x5))), function at exception vector 26 too large) - -.vector_27 0x9d004560 0x8 - *(.vector_27) - .vector_27 0x9d004560 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) - 0x9d004560 __vector_dispatch_27 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_27) <= (_vector_spacing << 0x5))), function at exception vector 27 too large) - -.vector_28 0x9d004580 0x8 - *(.vector_28) - .vector_28 0x9d004580 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) - 0x9d004580 __vector_dispatch_28 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_28) <= (_vector_spacing << 0x5))), function at exception vector 28 too large) - -.vector_29 0x9d0045a0 0x8 - *(.vector_29) - .vector_29 0x9d0045a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) - 0x9d0045a0 __vector_dispatch_29 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_29) <= (_vector_spacing << 0x5))), function at exception vector 29 too large) - -.vector_30 0x9d0045c0 0x8 - *(.vector_30) - .vector_30 0x9d0045c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) - 0x9d0045c0 __vector_dispatch_30 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_30) <= (_vector_spacing << 0x5))), function at exception vector 30 too large) - -.vector_31 0x9d0045e0 0x8 - *(.vector_31) - .vector_31 0x9d0045e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) - 0x9d0045e0 __vector_dispatch_31 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_31) <= (_vector_spacing << 0x5))), function at exception vector 31 too large) - -.vector_32 0x9d004600 0x8 - *(.vector_32) - .vector_32 0x9d004600 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - 0x9d004600 __vector_dispatch_32 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_32) <= (_vector_spacing << 0x5))), function at exception vector 32 too large) - -.vector_33 0x9d004620 0x8 - *(.vector_33) - .vector_33 0x9d004620 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) - 0x9d004620 __vector_dispatch_33 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_33) <= (_vector_spacing << 0x5))), function at exception vector 33 too large) - -.vector_34 0x9d004640 0x8 - *(.vector_34) - .vector_34 0x9d004640 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) - 0x9d004640 __vector_dispatch_34 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_34) <= (_vector_spacing << 0x5))), function at exception vector 34 too large) - -.vector_35 0x9d004660 0x8 - *(.vector_35) - .vector_35 0x9d004660 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) - 0x9d004660 __vector_dispatch_35 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_35) <= (_vector_spacing << 0x5))), function at exception vector 35 too large) - -.vector_36 0x9d004680 0x8 - *(.vector_36) - .vector_36 0x9d004680 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) - 0x9d004680 __vector_dispatch_36 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_36) <= (_vector_spacing << 0x5))), function at exception vector 36 too large) - -.vector_37 0x9d0046a0 0x8 - *(.vector_37) - .vector_37 0x9d0046a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) - 0x9d0046a0 __vector_dispatch_37 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_37) <= (_vector_spacing << 0x5))), function at exception vector 37 too large) - -.vector_38 0x9d0046c0 0x8 - *(.vector_38) - .vector_38 0x9d0046c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) - 0x9d0046c0 __vector_dispatch_38 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_38) <= (_vector_spacing << 0x5))), function at exception vector 38 too large) - -.vector_39 0x9d0046e0 0x8 - *(.vector_39) - .vector_39 0x9d0046e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) - 0x9d0046e0 __vector_dispatch_39 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_39) <= (_vector_spacing << 0x5))), function at exception vector 39 too large) - -.vector_40 0x9d004700 0x8 - *(.vector_40) - .vector_40 0x9d004700 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) - 0x9d004700 __vector_dispatch_40 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_40) <= (_vector_spacing << 0x5))), function at exception vector 40 too large) - -.vector_41 0x9d004720 0x8 - *(.vector_41) - .vector_41 0x9d004720 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) - 0x9d004720 __vector_dispatch_41 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_41) <= (_vector_spacing << 0x5))), function at exception vector 41 too large) - -.vector_42 0x9d004740 0x8 - *(.vector_42) - .vector_42 0x9d004740 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) - 0x9d004740 __vector_dispatch_42 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_42) <= (_vector_spacing << 0x5))), function at exception vector 42 too large) - -.vector_43 0x9d004760 0x8 - *(.vector_43) - .vector_43 0x9d004760 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) - 0x9d004760 __vector_dispatch_43 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_43) <= (_vector_spacing << 0x5))), function at exception vector 43 too large) - -.vector_44 0x9d004780 0x8 - *(.vector_44) - .vector_44 0x9d004780 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) - 0x9d004780 __vector_dispatch_44 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_44) <= (_vector_spacing << 0x5))), function at exception vector 44 too large) - -.vector_45 0x9d0047a0 0x8 - *(.vector_45) - .vector_45 0x9d0047a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) - 0x9d0047a0 __vector_dispatch_45 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_45) <= (_vector_spacing << 0x5))), function at exception vector 45 too large) - -.vector_46 0x9d0047c0 0x8 - *(.vector_46) - .vector_46 0x9d0047c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) - 0x9d0047c0 __vector_dispatch_46 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_46) <= (_vector_spacing << 0x5))), function at exception vector 46 too large) - -.vector_47 0x9d0047e0 0x8 - *(.vector_47) - .vector_47 0x9d0047e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) - 0x9d0047e0 __vector_dispatch_47 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_47) <= (_vector_spacing << 0x5))), function at exception vector 47 too large) - -.vector_48 0x9d004800 0x8 - *(.vector_48) - .vector_48 0x9d004800 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) - 0x9d004800 __vector_dispatch_48 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_48) <= (_vector_spacing << 0x5))), function at exception vector 48 too large) - -.vector_49 0x9d004820 0x8 - *(.vector_49) - .vector_49 0x9d004820 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) - 0x9d004820 __vector_dispatch_49 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_49) <= (_vector_spacing << 0x5))), function at exception vector 49 too large) - -.vector_50 0x9d004840 0x8 - *(.vector_50) - .vector_50 0x9d004840 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) - 0x9d004840 __vector_dispatch_50 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_50) <= (_vector_spacing << 0x5))), function at exception vector 50 too large) - -.vector_51 0x9d004860 0x8 - *(.vector_51) - .vector_51 0x9d004860 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) - 0x9d004860 __vector_dispatch_51 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_51) <= (_vector_spacing << 0x5))), function at exception vector 51 too large) - -.vector_52 0x9d004880 0x8 - *(.vector_52) - .vector_52 0x9d004880 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) - 0x9d004880 __vector_dispatch_52 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_52) <= (_vector_spacing << 0x5))), function at exception vector 52 too large) - -.vector_53 0x9d0048a0 0x8 - *(.vector_53) - .vector_53 0x9d0048a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) - 0x9d0048a0 __vector_dispatch_53 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_53) <= (_vector_spacing << 0x5))), function at exception vector 53 too large) - -.vector_54 0x9d0048c0 0x8 - *(.vector_54) - .vector_54 0x9d0048c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) - 0x9d0048c0 __vector_dispatch_54 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_54) <= (_vector_spacing << 0x5))), function at exception vector 54 too large) - -.vector_55 0x9d0048e0 0x8 - *(.vector_55) - .vector_55 0x9d0048e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) - 0x9d0048e0 __vector_dispatch_55 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_55) <= (_vector_spacing << 0x5))), function at exception vector 55 too large) - -.vector_56 0x9d004900 0x8 - *(.vector_56) - .vector_56 0x9d004900 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) - 0x9d004900 __vector_dispatch_56 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_56) <= (_vector_spacing << 0x5))), function at exception vector 56 too large) - -.vector_57 0x9d004920 0x8 - *(.vector_57) - .vector_57 0x9d004920 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) - 0x9d004920 __vector_dispatch_57 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_57) <= (_vector_spacing << 0x5))), function at exception vector 57 too large) - -.vector_58 0x9d004940 0x8 - *(.vector_58) - .vector_58 0x9d004940 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) - 0x9d004940 __vector_dispatch_58 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_58) <= (_vector_spacing << 0x5))), function at exception vector 58 too large) - -.vector_59 0x9d004960 0x8 - *(.vector_59) - .vector_59 0x9d004960 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) - 0x9d004960 __vector_dispatch_59 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_59) <= (_vector_spacing << 0x5))), function at exception vector 59 too large) - -.vector_60 0x9d004980 0x8 - *(.vector_60) - .vector_60 0x9d004980 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) - 0x9d004980 __vector_dispatch_60 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_60) <= (_vector_spacing << 0x5))), function at exception vector 60 too large) - -.vector_61 0x9d0049a0 0x8 - *(.vector_61) - .vector_61 0x9d0049a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) - 0x9d0049a0 __vector_dispatch_61 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_61) <= (_vector_spacing << 0x5))), function at exception vector 61 too large) - -.vector_62 0x9d0049c0 0x8 - *(.vector_62) - .vector_62 0x9d0049c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) - 0x9d0049c0 __vector_dispatch_62 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_62) <= (_vector_spacing << 0x5))), function at exception vector 62 too large) - -.vector_63 0x9d0049e0 0x8 - *(.vector_63) - .vector_63 0x9d0049e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) - 0x9d0049e0 __vector_dispatch_63 - 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_63) <= (_vector_spacing << 0x5))), function at exception vector 63 too large) - -.startup 0x9d005000 0x1e8 - *(.startup) - *(.reset.startup) - .reset.startup - 0x9d005000 0x1e8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o - -.text 0x9d005800 0x0 - *(.stub .gnu.linkonce.t.*) - *(.text.*personality*) - *(.mips16.fn.*) - *(.mips16.call.*) - *(.gnu.warning) - 0x9d005800 . = ALIGN (0x4) - -.init 0x9d005800 0x0 - *crti.o(.init) - *crtbegin.o(.init) - *(EXCLUDE_FILE(*crtn.o *crtend?.o *crtend.o) .init) - *crtend.o(.init) - *crtn.o(.init) - 0x9d005800 . = ALIGN (0x4) - -.fini 0x9d005800 0x0 - *(.fini) - 0x9d005800 . = ALIGN (0x4) - -.preinit_array 0x9d005800 0x0 - 0x9d005800 PROVIDE (__preinit_array_start, .) - *(.preinit_array) - 0x9d005800 PROVIDE (__preinit_array_end, .) - 0x9d005800 . = ALIGN (0x4) - -.init_array 0x9d005800 0x0 - 0x9d005800 PROVIDE (__init_array_start, .) - *(SORT(.init_array.*)) - *(.init_array) - 0x9d005800 PROVIDE (__init_array_end, .) - 0x9d005800 . = ALIGN (0x4) - -.fini_array 0x9d005800 0x0 - 0x9d005800 PROVIDE (__fini_array_start, .) - *(SORT(.fini_array.*)) - *(.fini_array) - 0x9d005800 PROVIDE (__fini_array_end, .) - 0x9d005800 . = ALIGN (0x4) - -.ctors 0x9d005800 0x0 - *crtbegin.o(.ctors) - *crtbegin?.o(.ctors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) - *(SORT(.ctors.*)) - *(.ctors) - 0x9d005800 . = ALIGN (0x4) - -.dtors 0x9d005800 0x0 - *crtbegin.o(.dtors) - *crtbegin?.o(.dtors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) - *(SORT(.dtors.*)) - *(.dtors) - 0x9d005800 . = ALIGN (0x4) - -.rodata 0x9d005800 0x0 - *(.gnu.linkonce.r.*) - *(.rodata1) - 0x9d005800 . = ALIGN (0x4) - -.sdata2 0x9d0051e8 0x0 - *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) - 0x9d0051e8 . = ALIGN (0x4) - -.sbss2 0x9d0051e8 0x0 - *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) - 0x9d0051e8 . = ALIGN (0x4) - -.eh_frame_hdr - *(.eh_frame_hdr) - 0x9d0051e8 . = ALIGN (0x4) - -.eh_frame - *(.eh_frame) - 0x9d0051e8 . = ALIGN (0x4) - -.gcc_except_table - *(.gcc_except_table .gcc_except_table.*) - 0x9d0051e8 . = ALIGN (0x4) - -.dbg_data 0xa0000200 0x0 - 0xa0000200 . = (. + DEFINED (_DEBUGGER)?0x200:0x0) - -.jcr 0xa0000200 0x0 - *(.jcr) - 0xa0000200 . = ALIGN (0x4) - -.eh_frame 0xa0000200 0x30 - *(.eh_frame) - .eh_frame 0xa0000200 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .eh_frame 0xa0000220 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - 0xa0000230 . = ALIGN (0x4) - -.gcc_except_table - *(.gcc_except_table .gcc_except_table.*) - 0xa0000230 . = ALIGN (0x4) - -.persist 0xa0000230 0x0 - 0xa0000230 _persist_begin = . - *(.persist .persist.*) - *(.pbss .pbss.*) - 0xa0000230 . = ALIGN (0x4) - 0xa0000230 _persist_end = . - -.data 0xa0000230 0x0 - *(.gnu.linkonce.d.*) - *(.data1) - 0xa0000230 . = ALIGN (0x4) - 0xa0000230 . = . - 0xa0008220 _gp = (ALIGN (0x10) + 0x7ff0) - -.got 0xa0000230 0x0 - *(.got.plt) - *(.got) - 0xa0000230 . = ALIGN (0x4) - -.sdata 0xa0000230 0x7c - 0xa0000230 _sdata_begin = . - *(.sdata .sdata.* .gnu.linkonce.s.*) - .sdata 0xa0000230 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - 0xa0000230 egstrNmBusCapabilities - .sdata 0xa0000234 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .sdata 0xa000023c 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .sdata 0xa0000240 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .sdata 0xa0000244 0x2 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - 0xa0000244 State - *fill* 0xa0000246 0x2 - .sdata 0xa0000248 0xc build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .sdata 0xa0000254 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - 0xa0000254 gUartStrings - .sdata 0xa0000258 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .sdata 0xa0000260 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - 0xa0000267 TerminalSocket - 0xa0000268 TerminalServerSocket - 0xa0000269 SyslogSocket - 0xa000026a SyslogServerSocket - 0xa000026b NetworkSocket - 0xa000026c NetworkServerSocket - 0xa000026d BootloaderSocket - 0xa000026e BootloaderServerSocket - .sdata 0xa0000270 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - 0xa0000270 mLoraPreamble - .sdata 0xa0000274 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .sdata 0xa000027c 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .sdata 0xa0000284 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .sdata 0xa000028c 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - 0xa0000294 BtldrComputedCRC - 0xa0000298 BootloaderState - 0xa000029c BootloaderDataStartPtr - .sdata 0xa00002a4 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - 0xa00002a4 _Files - .sdata 0xa00002a8 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - 0xa00002a8 __XC_UART - 0xa00002ac . = ALIGN (0x4) - 0xa00002ac _sdata_end = . - -.lit8 - *(.lit8) - -.lit4 - *(.lit4) - 0xa00002ac . = ALIGN (0x4) - 0xa00002ac _data_end = . - 0xa00002ac _bss_begin = . - -.sbss 0xa00002ac 0x1ac - 0xa00002ac _sbss_begin = . - *(.dynsbss) - *(.sbss .sbss.* .gnu.linkonce.sb.*) - .sbss 0xa00002ac 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .sbss 0xa00002b0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - 0xa00002b8 pfWifiCb - 0xa00002bc pfIpCb - 0xa00002c0 pfOtaCb - 0xa00002c4 pfSigmaCb - 0xa00002c8 pfHifCb - 0xa00002cc pfSSLCb - .sbss 0xa00002d0 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .sbss 0xa00002d8 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .sbss 0xa00002e0 0x14 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .sbss 0xa00002f4 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .sbss 0xa00002f8 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - *fill* 0xa00002f9 0x1 - .sbss 0xa00002fa 0x6 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - 0xa00002fa gu16SessionID - 0xa00002fc gbSocketInit - .sbss 0xa0000300 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .sbss 0xa0000304 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - 0xa0000304 LoraData - .sbss 0xa0000308 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - 0xa0000308 DataSize - 0xa000030c DataCtr - 0xa0000310 BufPtr - 0xa0000314 RxPtr - 0xa0000315 Command - 0xa0000316 CRC - 0xa0000317 SenderID - 0xa0000318 SenderAddress - 0xa0000319 Flags - 0xa000031a IsUpdating - 0xa000031c BmpDataPtr - .sbss 0xa0000320 0xc build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .sbss 0xa000032c 0x1c build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - 0xa000032c gu32HostIp - 0xa0000330 gu8RetryCount - 0xa0000340 mWiFiInitOK - 0xa0000344 mWiFiState - .sbss 0xa0000348 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .sbss 0xa000034c 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - 0xa000034c ina219_currentDivider_mA - 0xa0000350 ina219_powerDivider_mW - .sbss 0xa0000354 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - 0xa0000354 WatchdogTriggered - .sbss 0xa0000358 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - 0xa0000358 BootloaderHeader - 0xa000035c BootloaderDataSize - 0xa0000360 BootloaderDataCtr - 0xa0000364 BootloaderBufPtr - 0xa0000368 BootloaderCRC - 0xa000036c BootloaderCommand - .sbss 0xa0000370 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .sbss 0xa0000371 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - 0xa0000371 _outdone - *fill* 0xa0000372 0x2 - .sbss 0xa0000374 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - 0xa0000374 __allocp - 0xa0000378 __alloct - 0xa000037c __allocx - .sbss 0xa0000384 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - 0xa0000384 errno - .sbss 0xa0000388 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - 0xa0000388 _minbrk - 0xa000038c _maxbrk - *(.scommon) - .scommon 0xa0000390 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - 0xa0000390 at_sb_printf - .scommon 0xa0000394 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - 0xa0000394 mWifiSPIBaudrate - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .scommon 0xa0000395 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - *fill* 0xa0000395 0x3 - .scommon 0xa0000398 0x15 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - 0xa0000398 gpfAppResolveCb - 0xa000039c gu16BufferSize - 0xa00003a0 gpfAppSocketCb - 0xa00003a4 gsockerrno - 0xa00003a8 gfpPingCb - 0xa00003ac gu8OpCode - .scommon 0xa00003ad 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .scommon 0xa00003ad 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - *fill* 0xa00003ad 0x3 - .scommon 0xa00003b0 0x2 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - 0xa00003b0 acIntUartRxBuff - *fill* 0xa00003b2 0x2 - .scommon 0xa00003b4 0x14 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - 0xa00003b4 mTerminalOpened - 0xa00003b8 TerminalDataPtr - 0xa00003bc mTerminalPendingAction - 0xa00003c0 mHelpStringPtr - 0xa00003c4 mTerminalTickState - .scommon 0xa00003c8 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - 0xa00003c8 ActualTemp - .scommon 0xa00003cc 0xe build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - 0xa00003cc u8IsMacAddrValid - 0xa00003d0 mCurIPAddress - 0xa00003d4 mac_addr - .scommon 0xa00003da 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - *fill* 0xa00003da 0x2 - .scommon 0xa00003dc 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - 0xa00003dc PowerRelayState - .scommon 0xa00003e0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - 0xa00003e0 mBatteryCurrent - 0xa00003e4 mVoltageMeanSum - 0xa00003e8 mVoltageMeanCount - 0xa00003ec mBatterySOC - 0xa00003f0 mCurrentMeanCount - 0xa00003f4 mCurrentMeanSum - 0xa00003f8 mBatteryVoltage - 0xa00003fc mCurrentModuleOK - .scommon 0xa0000400 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - 0xa0000400 mLastTransactionOK - 0xa0000404 mI2CWaitCounter - .scommon 0xa0000408 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - 0xa0000408 mSPIFlashHighSpeedBaudrate - 0xa0000409 mSPIFlashBaudrate - 0xa000040c mSPIFlashOK - .scommon 0xa0000410 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - 0xa0000410 mSyslogBufPtr - .scommon 0xa0000414 0x38 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - 0xa0000414 CurDataChunkSize - 0xa0000418 BootloaderFirmwareChunkWriteCount - 0xa000041c BootloaderFlashWriteDataPtr - 0xa0000420 BootloaderFlashErased - 0xa0000424 BootloaderFlashWriteState - 0xa0000428 BootloaderCurFlashWriteAddress - 0xa000042c BooloaderFlashEraseState - 0xa0000430 BootloaderCurFlashEraseAddress - 0xa0000434 BootloaderFlashWritePollCount - 0xa0000438 BootloaderInterfaceState - 0xa000043c DataChunkWritten - 0xa0000440 BooloaderFlashErasePollCount - 0xa0000444 FirmwareUploaded - 0xa0000448 CurDataChunkIndex - .scommon 0xa000044c 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .scommon 0xa000044c 0x2 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - 0xa000044c mDeviceID - *fill* 0xa000044e 0x2 - .scommon 0xa0000450 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - 0xa0000450 BootloaderRxPtr - .scommon 0xa0000454 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - 0xa0000454 mLoraSMState - 0xa0000458 _sbss_end = . - 0xa0000458 . = ALIGN (0x4) - -.bss 0xa0000458 0x2e5c - *(.dynbss) - *(COMMON) - COMMON 0xa0000458 0xb0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - 0xa0000458 gastrSockets - COMMON 0xa0000508 0x40 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - 0xa0000508 astInternalUartData - COMMON 0xa0000548 0x26e build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - 0xa0000548 mRxData - 0xa0000680 mTxData - *fill* 0xa00007b6 0x2 - COMMON 0xa00007b8 0x398 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - 0xa00007b8 mStoredBootloaderInfo - 0xa00007cc TerminalWorkString - 0xa00008f8 TerminalPrevDataBuf - 0xa0000a24 TerminalDataBuf - COMMON 0xa0000b50 0x620 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - 0xa0000b50 astUartData - COMMON 0xa0001170 0x108 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - 0xa0001170 astTimer - COMMON 0xa0001278 0xd04 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - 0xa0001278 NetworkRxBuf - 0xa0001678 TerminalRxBuf - 0xa0001a78 BootloaderRxBuf - 0xa0001e78 addr_in - 0xa0001e88 param - 0xa0001ea4 mModuleIPConfig - 0xa0001eb4 SyslogRxBuf - COMMON 0xa0001f7c 0x16 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - 0xa0001f7c I2CSlaveBuffer - 0xa0001f88 I2CMasterBuffer - *fill* 0xa0001f92 0x2 - COMMON 0xa0001f94 0x1000 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - 0xa0001f94 mFlashSectorBuffer - COMMON 0xa0002f94 0x1f4 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - 0xa0002f94 mSyslogBuffer - COMMON 0xa0003188 0x12c build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - 0xa0003188 BootloaderBuffer - 0xa00032b4 . = ALIGN ((. != 0x0)?0x4:0x1) - 0xa00032b4 . = ALIGN (0x4) - 0xa00032b4 _end = . - 0xa00032b4 _bss_end = . - 0x00010000 _bmxdudba_address = 0x10000 - 0x00010000 _bmxdupba_address = 0x10000 - -/DISCARD/ - *(.pdr) - *(.rel.dyn) - *(.note.GNU-stack) - *(.note.GNU-stack) - *(.gnu_debuglink) - *(.gnu.lto_*) - *(.discard) - -.gptab.sdata - *(.gptab.data) - *(.gptab.sdata) - -.gptab.sbss - *(.gptab.bss) - *(.gptab.sbss) - -.mdebug.abi32 0xa00032b4 0x0 - *(.mdebug.abi32) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/system.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/template.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .mdebug.abi32 0xa00032b4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .mdebug.abi32 0xa00032b4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.mdebug.abiN32 - *(.mdebug.abiN32) - -.mdebug.abi64 - *(.mdebug.abi64) - -.mdebug.abiO64 - *(.mdebug.abiO64) - -.mdebug.eabi32 - *(.mdebug.eabi32) - -.mdebug.eabi64 - *(.mdebug.eabi64) - -.gcc_compiled_long32 - *(.gcc_compiled_long32) - -.gcc_compiled_long64 - *(.gcc_compiled_long64) - -.stab - *(.stab) - -.stabstr - *(.stabstr) - -.stab.excl - *(.stab.excl) - -.stab.exclstr - *(.stab.exclstr) - -.stab.index - *(.stab.index) - -.stab.indexstr - *(.stab.indexstr) - -.comment 0x00000000 0x248 - *(.comment) - .comment 0x00000000 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - 0x3d (size before relaxing) - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/system.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/template.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .comment 0x0000003c 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - 0x3d (size before relaxing) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .comment 0x00000078 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) - 0x19 (size before relaxing) - .comment 0x00000090 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) - 0x1a (size before relaxing) - .comment 0x000000a9 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) - 0x1a (size before relaxing) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .comment 0x000000c2 0x4e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - 0x8b (size before relaxing) - .comment 0x00000110 0x4f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x8c (size before relaxing) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .comment 0x0000015f 0x4b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - 0x88 (size before relaxing) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - .comment 0x000001aa 0x9e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - 0xdb (size before relaxing) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug - *(.debug) - -.line - *(.line) - -.debug_srcinfo - *(.debug_srcinfo) - -.debug_sfnames - *(.debug_sfnames) - -.debug_aranges 0x00000000 0xac8 - *(.debug_aranges) - .debug_aranges - 0x00000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .debug_aranges - 0x00000020 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .debug_aranges - 0x00000040 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .debug_aranges - 0x00000060 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .debug_aranges - 0x00000080 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .debug_aranges - 0x000000a0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .debug_aranges - 0x000000c0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .debug_aranges - 0x000000e0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .debug_aranges - 0x00000100 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .debug_aranges - 0x00000120 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .debug_aranges - 0x00000140 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .debug_aranges - 0x00000160 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .debug_aranges - 0x00000180 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .debug_aranges - 0x000001a0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .debug_aranges - 0x000001c0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .debug_aranges - 0x000001e0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .debug_aranges - 0x00000200 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .debug_aranges - 0x00000220 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .debug_aranges - 0x00000240 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .debug_aranges - 0x00000260 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .debug_aranges - 0x00000280 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .debug_aranges - 0x000002a0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .debug_aranges - 0x000002c0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .debug_aranges - 0x000002e0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .debug_aranges - 0x00000300 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .debug_aranges - 0x00000320 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .debug_aranges - 0x00000340 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .debug_aranges - 0x00000360 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .debug_aranges - 0x00000380 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .debug_aranges - 0x000003a0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .debug_aranges - 0x000003c0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .debug_aranges - 0x000003e0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .debug_aranges - 0x00000400 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .debug_aranges - 0x00000420 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .debug_aranges - 0x00000440 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .debug_aranges - 0x00000460 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .debug_aranges - 0x00000480 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .debug_aranges - 0x000004a0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .debug_aranges - 0x000004c0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .debug_aranges - 0x000004e0 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .debug_aranges - 0x00000500 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .debug_aranges - 0x00000520 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .debug_aranges - 0x00000540 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .debug_aranges - 0x00000560 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .debug_aranges - 0x00000580 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .debug_aranges - 0x000005a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .debug_aranges - 0x000005c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .debug_aranges - 0x000005e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .debug_aranges - 0x00000608 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .debug_aranges - 0x00000628 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .debug_aranges - 0x00000648 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .debug_aranges - 0x00000668 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .debug_aranges - 0x00000688 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .debug_aranges - 0x000006a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .debug_aranges - 0x000006c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .debug_aranges - 0x000006e8 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .debug_aranges - 0x00000718 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .debug_aranges - 0x00000740 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .debug_aranges - 0x00000768 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .debug_aranges - 0x00000788 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .debug_aranges - 0x000007a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .debug_aranges - 0x000007c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .debug_aranges - 0x000007e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .debug_aranges - 0x00000808 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .debug_aranges - 0x00000830 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .debug_aranges - 0x00000858 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .debug_aranges - 0x00000888 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .debug_aranges - 0x000008a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .debug_aranges - 0x000008c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .debug_aranges - 0x000008e8 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .debug_aranges - 0x00000988 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .debug_aranges - 0x000009a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .debug_aranges - 0x000009c8 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .debug_aranges - 0x00000a08 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .debug_aranges - 0x00000a28 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .debug_aranges - 0x00000a48 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .debug_aranges - 0x00000a68 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .debug_aranges - 0x00000a88 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .debug_aranges - 0x00000aa8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug_pubnames - 0x00000000 0x369a - *(.debug_pubnames) - .debug_pubnames - 0x00000000 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .debug_pubnames - 0x00000030 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .debug_pubnames - 0x00000050 0xa6 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .debug_pubnames - 0x000000f6 0xa6 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .debug_pubnames - 0x0000019c 0x8f build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .debug_pubnames - 0x0000022b 0x23 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .debug_pubnames - 0x0000024e 0x173 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .debug_pubnames - 0x000003c1 0xe5 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .debug_pubnames - 0x000004a6 0xa6 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .debug_pubnames - 0x0000054c 0x104 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .debug_pubnames - 0x00000650 0x6fd build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .debug_pubnames - 0x00000d4d 0x207 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .debug_pubnames - 0x00000f54 0xcd build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .debug_pubnames - 0x00001021 0xee build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .debug_pubnames - 0x0000110f 0x23 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .debug_pubnames - 0x00001132 0xb8 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .debug_pubnames - 0x000011ea 0x23 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .debug_pubnames - 0x0000120d 0x1ce build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .debug_pubnames - 0x000013db 0x75 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .debug_pubnames - 0x00001450 0x31 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .debug_pubnames - 0x00001481 0x24 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .debug_pubnames - 0x000014a5 0x125 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .debug_pubnames - 0x000015ca 0x194 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .debug_pubnames - 0x0000175e 0x18e build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .debug_pubnames - 0x000018ec 0x101 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .debug_pubnames - 0x000019ed 0xd8 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .debug_pubnames - 0x00001ac5 0x31 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .debug_pubnames - 0x00001af6 0x49 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .debug_pubnames - 0x00001b3f 0xec build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .debug_pubnames - 0x00001c2b 0x359 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .debug_pubnames - 0x00001f84 0x25 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .debug_pubnames - 0x00001fa9 0x95 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .debug_pubnames - 0x0000203e 0xca build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .debug_pubnames - 0x00002108 0x41 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .debug_pubnames - 0x00002149 0x165 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .debug_pubnames - 0x000022ae 0x1af build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .debug_pubnames - 0x0000245d 0x92 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .debug_pubnames - 0x000024ef 0x1b0 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .debug_pubnames - 0x0000269f 0xa3 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .debug_pubnames - 0x00002742 0x71 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .debug_pubnames - 0x000027b3 0x3ec build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .debug_pubnames - 0x00002b9f 0x7d build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .debug_pubnames - 0x00002c1c 0x5c build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .debug_pubnames - 0x00002c78 0x35f build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .debug_pubnames - 0x00002fd7 0x2f build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .debug_pubnames - 0x00003006 0x7f build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .debug_pubnames - 0x00003085 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .debug_pubnames - 0x000030a5 0x3b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .debug_pubnames - 0x000030e0 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .debug_pubnames - 0x00003109 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .debug_pubnames - 0x00003133 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .debug_pubnames - 0x0000315e 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .debug_pubnames - 0x00003189 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .debug_pubnames - 0x000031ad 0x33 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .debug_pubnames - 0x000031e0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .debug_pubnames - 0x00003200 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .debug_pubnames - 0x00003224 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .debug_pubnames - 0x0000324c 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .debug_pubnames - 0x00003269 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .debug_pubnames - 0x0000329b 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .debug_pubnames - 0x000032c0 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .debug_pubnames - 0x000032e9 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .debug_pubnames - 0x00003307 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .debug_pubnames - 0x00003331 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .debug_pubnames - 0x0000335b 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .debug_pubnames - 0x0000337b 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .debug_pubnames - 0x00003397 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .debug_pubnames - 0x000033c3 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .debug_pubnames - 0x000033ef 0x21 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .debug_pubnames - 0x00003410 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .debug_pubnames - 0x0000342e 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .debug_pubnames - 0x0000344a 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .debug_pubnames - 0x00003465 0xe1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .debug_pubnames - 0x00003546 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .debug_pubnames - 0x00003563 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .debug_pubnames - 0x00003581 0x5c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .debug_pubnames - 0x000035dd 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .debug_pubnames - 0x000035f8 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .debug_pubnames - 0x00003614 0x22 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .debug_pubnames - 0x00003636 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .debug_pubnames - 0x0000365a 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .debug_pubnames - 0x0000367a 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug_info 0x00000000 0x43106 - *(.debug_info .gnu.linkonce.wi.*) - .debug_info 0x00000000 0xd2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .debug_info 0x000000d2 0x37b0 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .debug_info 0x00003882 0x1cee build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .debug_info 0x00005570 0x166e build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .debug_info 0x00006bde 0x406 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .debug_info 0x00006fe4 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - .debug_info 0x00006fe4 0x146 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .debug_info 0x0000712a 0x11ca build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .debug_info 0x000082f4 0x9b1 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .debug_info 0x00008ca5 0x496 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .debug_info 0x0000913b 0xc4d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .debug_info 0x00009d88 0x3b2f build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .debug_info 0x0000d8b7 0xa67 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .debug_info 0x0000e31e 0x55b build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .debug_info 0x0000e879 0x6a8 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .debug_info 0x0000ef21 0x141 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .debug_info 0x0000f062 0x986 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .debug_info 0x0000f9e8 0x142 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .debug_info 0x0000fb2a 0x1e42 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .debug_info 0x0001196c 0x825 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .debug_info 0x00012191 0x55b build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .debug_info 0x000126ec 0x115d build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .debug_info 0x00013849 0x3b5e build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .debug_info 0x000173a7 0x1abb build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .debug_info 0x00018e62 0x1a2f build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .debug_info 0x0001a891 0x1b15 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .debug_info 0x0001c3a6 0x151d build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .debug_info 0x0001d8c3 0x127e build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .debug_info 0x0001eb41 0x113f build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - .debug_info 0x0001fc80 0x1a5f build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .debug_info 0x000216df 0x113b build/ChaletDuinoV2_795F512H_/debug/Source/system.o - .debug_info 0x0002281a 0x113d build/ChaletDuinoV2_795F512H_/debug/Source/template.o - .debug_info 0x00023957 0x2185 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .debug_info 0x00025adc 0x32fb build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .debug_info 0x00028dd7 0x131c build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .debug_info 0x0002a0f3 0x1f61 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .debug_info 0x0002c054 0x17b3 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .debug_info 0x0002d807 0x12f9 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .debug_info 0x0002eb00 0x1a81 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .debug_info 0x00030581 0x15d0 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .debug_info 0x00031b51 0x1704 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .debug_info 0x00033255 0x18a1 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .debug_info 0x00034af6 0x15c0 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .debug_info 0x000360b6 0x1330 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .debug_info 0x000373e6 0x2e8d build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .debug_info 0x0003a273 0x132a build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .debug_info 0x0003b59d 0x14d4 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .debug_info 0x0003ca71 0x216c build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .debug_info 0x0003ebdd 0x2e4 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .debug_info 0x0003eec1 0x157c build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .debug_info 0x0004043d 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .debug_info 0x000404eb 0xbb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .debug_info 0x000405a6 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .debug_info 0x00040654 0xb0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .debug_info 0x00040704 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .debug_info 0x000407b6 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .debug_info 0x00040868 0x125 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .debug_info 0x0004098d 0xe2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .debug_info 0x00040a6f 0xbc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .debug_info 0x00040b2b 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .debug_info 0x00040bef 0xd6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .debug_info 0x00040cc5 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - .debug_info 0x00040cc5 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .debug_info 0x00040d7a 0xe4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .debug_info 0x00040e5e 0xc5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .debug_info 0x00040f23 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .debug_info 0x00040fee 0xb7 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .debug_info 0x000410a5 0xc2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .debug_info 0x00041167 0xc3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .debug_info 0x0004122a 0xb8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .debug_info 0x000412e2 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .debug_info 0x00041395 0xda c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .debug_info 0x0004146f 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - .debug_info 0x0004146f 0xe5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .debug_info 0x00041554 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .debug_info 0x00041634 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .debug_info 0x000416ea 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .debug_info 0x0004179d 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .debug_info 0x0004184e 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - .debug_info 0x0004184e 0x219 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .debug_info 0x00041a67 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - .debug_info 0x00041a67 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .debug_info 0x00041b1c 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .debug_info 0x00041bd2 0x115 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .debug_info 0x00041ce7 0xab c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .debug_info 0x00041d92 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .debug_info 0x00041e3f 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - .debug_info 0x00041e3f 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .debug_info 0x00041f0a 0x2c2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .debug_info 0x000421cc 0x782 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .debug_info 0x0004294e 0x7b8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug_abbrev 0x00000000 0x6335 - *(.debug_abbrev) - .debug_abbrev 0x00000000 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .debug_abbrev 0x00000025 0x1f2 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .debug_abbrev 0x00000217 0x203 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .debug_abbrev 0x0000041a 0x257 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .debug_abbrev 0x00000671 0xd7 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .debug_abbrev 0x00000748 0x1 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - .debug_abbrev 0x00000749 0x55 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .debug_abbrev 0x0000079e 0x27a build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .debug_abbrev 0x00000a18 0x175 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .debug_abbrev 0x00000b8d 0x123 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .debug_abbrev 0x00000cb0 0x22a build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .debug_abbrev 0x00000eda 0x26f build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .debug_abbrev 0x00001149 0x1cb build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .debug_abbrev 0x00001314 0x111 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .debug_abbrev 0x00001425 0x162 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .debug_abbrev 0x00001587 0x55 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .debug_abbrev 0x000015dc 0x1b1 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .debug_abbrev 0x0000178d 0x55 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .debug_abbrev 0x000017e2 0x2ae build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .debug_abbrev 0x00001a90 0x140 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .debug_abbrev 0x00001bd0 0xf7 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .debug_abbrev 0x00001cc7 0x17b build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .debug_abbrev 0x00001e42 0x2d9 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .debug_abbrev 0x0000211b 0x2a4 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .debug_abbrev 0x000023bf 0x2af build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .debug_abbrev 0x0000266e 0x2fb build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .debug_abbrev 0x00002969 0x26e build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .debug_abbrev 0x00002bd7 0x1b1 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .debug_abbrev 0x00002d88 0x166 build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - .debug_abbrev 0x00002eee 0x351 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .debug_abbrev 0x0000323f 0x166 build/ChaletDuinoV2_795F512H_/debug/Source/system.o - .debug_abbrev 0x000033a5 0x166 build/ChaletDuinoV2_795F512H_/debug/Source/template.o - .debug_abbrev 0x0000350b 0x226 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .debug_abbrev 0x00003731 0x341 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .debug_abbrev 0x00003a72 0x19d build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .debug_abbrev 0x00003c0f 0x2ae build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .debug_abbrev 0x00003ebd 0x1c4 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .debug_abbrev 0x00004081 0x18e build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .debug_abbrev 0x0000420f 0x22f build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .debug_abbrev 0x0000443e 0x26b build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .debug_abbrev 0x000046a9 0x1e9 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .debug_abbrev 0x00004892 0x298 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .debug_abbrev 0x00004b2a 0x233 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .debug_abbrev 0x00004d5d 0x18c build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .debug_abbrev 0x00004ee9 0x315 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .debug_abbrev 0x000051fe 0x1b5 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .debug_abbrev 0x000053b3 0x1b2 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .debug_abbrev 0x00005565 0x2b3 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .debug_abbrev 0x00005818 0xa9 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .debug_abbrev 0x000058c1 0x1f4 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .debug_abbrev 0x00005ab5 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .debug_abbrev 0x00005ae7 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .debug_abbrev 0x00005b0a 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .debug_abbrev 0x00005b2d 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .debug_abbrev 0x00005b50 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .debug_abbrev 0x00005b73 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .debug_abbrev 0x00005b96 0x5f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .debug_abbrev 0x00005bf5 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .debug_abbrev 0x00005c1a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .debug_abbrev 0x00005c3f 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .debug_abbrev 0x00005c64 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .debug_abbrev 0x00005c89 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - .debug_abbrev 0x00005c8a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .debug_abbrev 0x00005caf 0x41 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .debug_abbrev 0x00005cf0 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .debug_abbrev 0x00005d15 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .debug_abbrev 0x00005d3a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .debug_abbrev 0x00005d5f 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .debug_abbrev 0x00005d84 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .debug_abbrev 0x00005da9 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .debug_abbrev 0x00005dce 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .debug_abbrev 0x00005df3 0x49 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .debug_abbrev 0x00005e3c 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - .debug_abbrev 0x00005e3d 0x43 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .debug_abbrev 0x00005e80 0x36 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .debug_abbrev 0x00005eb6 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .debug_abbrev 0x00005edb 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .debug_abbrev 0x00005f00 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .debug_abbrev 0x00005f25 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - .debug_abbrev 0x00005f26 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .debug_abbrev 0x00005f4b 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - .debug_abbrev 0x00005f4c 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .debug_abbrev 0x00005f71 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .debug_abbrev 0x00005f96 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .debug_abbrev 0x00005fce 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .debug_abbrev 0x00005ff3 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .debug_abbrev 0x00006018 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - .debug_abbrev 0x00006019 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .debug_abbrev 0x0000604b 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .debug_abbrev 0x000060c4 0x132 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .debug_abbrev 0x000061f6 0x13f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug_line 0x00000000 0x85c8 - *(.debug_line) - .debug_line 0x00000000 0x8a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .debug_line 0x0000008a 0x210 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .debug_line 0x0000029a 0x251 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .debug_line 0x000004eb 0x339 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .debug_line 0x00000824 0x195 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .debug_line 0x000009b9 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - .debug_line 0x000009b9 0x7a build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .debug_line 0x00000a33 0x3b2 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .debug_line 0x00000de5 0x22d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .debug_line 0x00001012 0x1e8 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .debug_line 0x000011fa 0x2cd build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .debug_line 0x000014c7 0x568 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .debug_line 0x00001a2f 0x34b build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .debug_line 0x00001d7a 0x207 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .debug_line 0x00001f81 0x27e build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .debug_line 0x000021ff 0x7a build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .debug_line 0x00002279 0x2db build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .debug_line 0x00002554 0x7a build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .debug_line 0x000025ce 0x4ef build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .debug_line 0x00002abd 0x2d3 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .debug_line 0x00002d90 0x1f0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .debug_line 0x00002f80 0x156 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .debug_line 0x000030d6 0x2c8 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .debug_line 0x0000339e 0x262 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .debug_line 0x00003600 0x3de build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .debug_line 0x000039de 0x2f6 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .debug_line 0x00003cd4 0x25b build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .debug_line 0x00003f2f 0x161 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .debug_line 0x00004090 0x101 build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - .debug_line 0x00004191 0x390 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .debug_line 0x00004521 0x101 build/ChaletDuinoV2_795F512H_/debug/Source/system.o - .debug_line 0x00004622 0x101 build/ChaletDuinoV2_795F512H_/debug/Source/template.o - .debug_line 0x00004723 0x22f build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .debug_line 0x00004952 0x597 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .debug_line 0x00004ee9 0x155 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .debug_line 0x0000503e 0x25a build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .debug_line 0x00005298 0x1ad build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .debug_line 0x00005445 0x161 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .debug_line 0x000055a6 0x2e7 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .debug_line 0x0000588d 0x23e build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .debug_line 0x00005acb 0x1e9 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .debug_line 0x00005cb4 0x2a1 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .debug_line 0x00005f55 0x2b0 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .debug_line 0x00006205 0x165 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .debug_line 0x0000636a 0x51c build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .debug_line 0x00006886 0x193 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .debug_line 0x00006a19 0x19c build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .debug_line 0x00006bb5 0x3e3 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .debug_line 0x00006f98 0x137 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .debug_line 0x000070cf 0x1bf build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .debug_line 0x0000728e 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .debug_line 0x0000733f 0x62 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .debug_line 0x000073a1 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .debug_line 0x00007412 0x72 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .debug_line 0x00007484 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .debug_line 0x000074f7 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .debug_line 0x0000756a 0x8e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .debug_line 0x000075f8 0x97 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .debug_line 0x0000768f 0x84 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .debug_line 0x00007713 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .debug_line 0x0000779b 0x96 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .debug_line 0x00007831 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - .debug_line 0x00007831 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .debug_line 0x000078a1 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .debug_line 0x00007911 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .debug_line 0x0000797f 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .debug_line 0x000079ef 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .debug_line 0x00007a60 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .debug_line 0x00007ad0 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .debug_line 0x00007b41 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .debug_line 0x00007bb1 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .debug_line 0x00007c20 0x6d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .debug_line 0x00007c8d 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - .debug_line 0x00007c8d 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .debug_line 0x00007cfd 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .debug_line 0x00007d6d 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .debug_line 0x00007ddd 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .debug_line 0x00007e4c 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .debug_line 0x00007eba 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - .debug_line 0x00007eba 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .debug_line 0x00007f2a 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - .debug_line 0x00007f2a 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .debug_line 0x00007f9a 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .debug_line 0x0000800a 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .debug_line 0x00008082 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .debug_line 0x000080fa 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .debug_line 0x00008173 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - .debug_line 0x00008173 0x93 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .debug_line 0x00008206 0x105 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .debug_line 0x0000830b 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .debug_line 0x00008473 0x155 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug_frame 0x00000000 0x3878 - *(.debug_frame) - .debug_frame 0x00000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .debug_frame 0x00000020 0x2c build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .debug_frame 0x0000004c 0xfc build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .debug_frame 0x00000148 0x9c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .debug_frame 0x000001e4 0xd4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .debug_frame 0x000002b8 0x208 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .debug_frame 0x000004c0 0x10c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .debug_frame 0x000005cc 0xd4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .debug_frame 0x000006a0 0x10c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .debug_frame 0x000007ac 0x748 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .debug_frame 0x00000ef4 0x294 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .debug_frame 0x00001188 0x128 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .debug_frame 0x000012b0 0x10c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .debug_frame 0x000013bc 0x20c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .debug_frame 0x000015c8 0x25c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .debug_frame 0x00001824 0x17c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .debug_frame 0x000019a0 0x2c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .debug_frame 0x000019cc 0x2c build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .debug_frame 0x000019f8 0x138 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .debug_frame 0x00001b30 0x130 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .debug_frame 0x00001c60 0xf4 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .debug_frame 0x00001d54 0x128 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .debug_frame 0x00001e7c 0x10c build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .debug_frame 0x00001f88 0x2c build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .debug_frame 0x00001fb4 0x64 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .debug_frame 0x00002018 0x148 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .debug_frame 0x00002160 0x2b8 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .debug_frame 0x00002418 0x2c build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .debug_frame 0x00002444 0x80 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .debug_frame 0x000024c4 0xb8 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .debug_frame 0x0000257c 0x48 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .debug_frame 0x000025c4 0xd8 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .debug_frame 0x0000269c 0x198 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .debug_frame 0x00002834 0x9c build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .debug_frame 0x000028d0 0x17c build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .debug_frame 0x00002a4c 0xa0 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .debug_frame 0x00002aec 0x80 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .debug_frame 0x00002b6c 0x1d0 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .debug_frame 0x00002d3c 0x80 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .debug_frame 0x00002dbc 0x64 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .debug_frame 0x00002e20 0x1b4 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .debug_frame 0x00002fd4 0x64 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .debug_frame 0x00003038 0x80 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .debug_frame 0x000030b8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .debug_frame 0x000030e0 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .debug_frame 0x00003110 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .debug_frame 0x00003130 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .debug_frame 0x00003150 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .debug_frame 0x00003170 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .debug_frame 0x00003190 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .debug_frame 0x000031b8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .debug_frame 0x000031e0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .debug_frame 0x00003200 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .debug_frame 0x00003220 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .debug_frame 0x00003240 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .debug_frame 0x0000326c 0x6c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .debug_frame 0x000032d8 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .debug_frame 0x00003320 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .debug_frame 0x00003358 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .debug_frame 0x00003378 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .debug_frame 0x000033a0 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .debug_frame 0x000033cc 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .debug_frame 0x000033f4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .debug_frame 0x00003420 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .debug_frame 0x00003458 0x58 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .debug_frame 0x000034b0 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .debug_frame 0x00003524 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .debug_frame 0x0000354c 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .debug_frame 0x0000357c 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .debug_frame 0x0000359c 0x120 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .debug_frame 0x000036bc 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .debug_frame 0x000036dc 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .debug_frame 0x0000370c 0x8c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .debug_frame 0x00003798 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .debug_frame 0x000037c4 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .debug_frame 0x000037ec 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .debug_frame 0x0000380c 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .debug_frame 0x00003838 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .debug_frame 0x00003858 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug_str 0x00000000 0x3341 - *(.debug_str) - .debug_str 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .debug_str 0x00000000 0x242 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .debug_str 0x00000242 0x14a build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .debug_str 0x0000038c 0x149 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .debug_str 0x000004d5 0xa build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .debug_str 0x000004df 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - .debug_str 0x000004df 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .debug_str 0x000004df 0x36 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .debug_str 0x00000515 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .debug_str 0x00000515 0xa build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .debug_str 0x0000051f 0x25 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .debug_str 0x00000544 0x178 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .debug_str 0x000006bc 0x2d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .debug_str 0x000006e9 0x31 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .debug_str 0x0000071a 0x12 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .debug_str 0x0000072c 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .debug_str 0x0000072c 0x19 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .debug_str 0x00000745 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .debug_str 0x00000745 0x168 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .debug_str 0x000008ad 0x2d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .debug_str 0x000008da 0x16 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .debug_str 0x000008f0 0x12f build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .debug_str 0x00000a1f 0x21e build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .debug_str 0x00000c3d 0x14f build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .debug_str 0x00000d8c 0x1ac build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .debug_str 0x00000f38 0x18a build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .debug_str 0x000010c2 0x145 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .debug_str 0x00001207 0x12f build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .debug_str 0x00001336 0x12f build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - .debug_str 0x00001465 0x14d build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .debug_str 0x000015b2 0x12f build/ChaletDuinoV2_795F512H_/debug/Source/system.o - .debug_str 0x000016e1 0x12f build/ChaletDuinoV2_795F512H_/debug/Source/template.o - .debug_str 0x00001810 0x17f build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .debug_str 0x0000198f 0x281 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .debug_str 0x00001c10 0x146 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .debug_str 0x00001d56 0x18d build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .debug_str 0x00001ee3 0x15b build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .debug_str 0x0000203e 0x138 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .debug_str 0x00002176 0x1d9 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .debug_str 0x0000234f 0x18b build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .debug_str 0x000024da 0x17e build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .debug_str 0x00002658 0x19f build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .debug_str 0x000027f7 0x14b build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .debug_str 0x00002942 0x15e build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .debug_str 0x00002aa0 0x2cb build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .debug_str 0x00002d6b 0x13a build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .debug_str 0x00002ea5 0x159 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .debug_str 0x00002ffe 0x1fe build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .debug_str 0x000031fc 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .debug_str 0x000031fc 0x145 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .debug_str 0x00003341 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug_loc 0x00000000 0x1069b - *(.debug_loc) - .debug_loc 0x00000000 0x130 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .debug_loc 0x00000130 0x168 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .debug_loc 0x00000298 0x4b8 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .debug_loc 0x00000750 0x59d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .debug_loc 0x00000ced 0xcb3 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .debug_loc 0x000019a0 0x48f build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .debug_loc 0x00001e2f 0x2e2 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .debug_loc 0x00002111 0x7ba build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .debug_loc 0x000028cb 0x1f19 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .debug_loc 0x000047e4 0xfbb build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .debug_loc 0x0000579f 0x5e3 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .debug_loc 0x00005d82 0x685 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .debug_loc 0x00006407 0xd65 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .debug_loc 0x0000716c 0x12f2 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .debug_loc 0x0000845e 0xd61 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .debug_loc 0x000091bf 0x6a build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .debug_loc 0x00009229 0x2c build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .debug_loc 0x00009255 0x5b7 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .debug_loc 0x0000980c 0x369 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .debug_loc 0x00009b75 0x25f build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .debug_loc 0x00009dd4 0x768 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .debug_loc 0x0000a53c 0x6a1 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .debug_loc 0x0000abdd 0x4b build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .debug_loc 0x0000ac28 0x31e build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .debug_loc 0x0000af46 0x484 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .debug_loc 0x0000b3ca 0xcb7 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .debug_loc 0x0000c081 0x56 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .debug_loc 0x0000c0d7 0x4c0 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .debug_loc 0x0000c597 0x108 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .debug_loc 0x0000c69f 0x58 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .debug_loc 0x0000c6f7 0x249 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .debug_loc 0x0000c940 0x412 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .debug_loc 0x0000cd52 0x21a build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .debug_loc 0x0000cf6c 0x8d1 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .debug_loc 0x0000d83d 0x10e build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .debug_loc 0x0000d94b 0xb0 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .debug_loc 0x0000d9fb 0x8d5 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .debug_loc 0x0000e2d0 0xb0 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .debug_loc 0x0000e380 0x11e build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .debug_loc 0x0000e49e 0x9c9 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .debug_loc 0x0000ee67 0x2d1 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .debug_loc 0x0000f138 0xda build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .debug_loc 0x0000f212 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .debug_loc 0x0000f27a 0xc9 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .debug_loc 0x0000f343 0x9c3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .debug_loc 0x0000fd06 0x995 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug_macinfo - *(.debug_macinfo) - -.debug_weaknames - *(.debug_weaknames) - -.debug_funcnames - *(.debug_funcnames) - -.debug_typenames - *(.debug_typenames) - -.debug_varnames - *(.debug_varnames) - -.debug_pubtypes - 0x00000000 0x35bf - *(.debug_pubtypes) - .debug_pubtypes - 0x00000000 0x276 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .debug_pubtypes - 0x00000276 0x149 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .debug_pubtypes - 0x000003bf 0x14c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .debug_pubtypes - 0x0000050b 0x3c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .debug_pubtypes - 0x00000547 0x12 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .debug_pubtypes - 0x00000559 0x5e build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .debug_pubtypes - 0x000005b7 0xa2 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .debug_pubtypes - 0x00000659 0x48 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .debug_pubtypes - 0x000006a1 0x10c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .debug_pubtypes - 0x000007ad 0x41c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .debug_pubtypes - 0x00000bc9 0x40 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .debug_pubtypes - 0x00000c09 0x56 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .debug_pubtypes - 0x00000c5f 0x5a build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .debug_pubtypes - 0x00000cb9 0x12 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .debug_pubtypes - 0x00000ccb 0x47 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .debug_pubtypes - 0x00000d12 0x12 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .debug_pubtypes - 0x00000d24 0x29d build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .debug_pubtypes - 0x00000fc1 0x3c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .debug_pubtypes - 0x00000ffd 0xcf build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .debug_pubtypes - 0x000010cc 0xe7 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .debug_pubtypes - 0x000011b3 0x1f8 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .debug_pubtypes - 0x000013ab 0x136 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .debug_pubtypes - 0x000014e1 0x190 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .debug_pubtypes - 0x00001671 0x166 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .debug_pubtypes - 0x000017d7 0xe7 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .debug_pubtypes - 0x000018be 0xe7 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .debug_pubtypes - 0x000019a5 0xe7 build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - .debug_pubtypes - 0x00001a8c 0x13c build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .debug_pubtypes - 0x00001bc8 0xe7 build/ChaletDuinoV2_795F512H_/debug/Source/system.o - .debug_pubtypes - 0x00001caf 0xe7 build/ChaletDuinoV2_795F512H_/debug/Source/template.o - .debug_pubtypes - 0x00001d96 0x145 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .debug_pubtypes - 0x00001edb 0x2d3 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .debug_pubtypes - 0x000021ae 0xfc build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .debug_pubtypes - 0x000022aa 0x17e build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .debug_pubtypes - 0x00002428 0x136 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .debug_pubtypes - 0x0000255e 0xf8 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .debug_pubtypes - 0x00002656 0x141 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .debug_pubtypes - 0x00002797 0x121 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .debug_pubtypes - 0x000028b8 0x110 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .debug_pubtypes - 0x000029c8 0xf8 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .debug_pubtypes - 0x00002ac0 0x11a build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .debug_pubtypes - 0x00002bda 0xf8 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .debug_pubtypes - 0x00002cd2 0x325 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .debug_pubtypes - 0x00002ff7 0xe7 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .debug_pubtypes - 0x000030de 0x10d build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .debug_pubtypes - 0x000031eb 0x164 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .debug_pubtypes - 0x0000334f 0x2c build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .debug_pubtypes - 0x0000337b 0x11e build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .debug_pubtypes - 0x00003499 0x34 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .debug_pubtypes - 0x000034cd 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .debug_pubtypes - 0x0000350d 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .debug_pubtypes - 0x00003566 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.debug_ranges 0x00000000 0x290 - *(.debug_ranges) - .debug_ranges 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .debug_ranges 0x00000010 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .debug_ranges 0x00000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .debug_ranges 0x00000030 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .debug_ranges 0x00000040 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .debug_ranges 0x00000050 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .debug_ranges 0x00000060 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .debug_ranges 0x00000080 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .debug_ranges 0x00000098 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .debug_ranges 0x000000b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .debug_ranges 0x000000c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .debug_ranges 0x000000d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .debug_ranges 0x000000e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .debug_ranges 0x000000f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .debug_ranges 0x00000100 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .debug_ranges 0x00000118 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .debug_ranges 0x00000130 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .debug_ranges 0x00000150 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .debug_ranges 0x00000160 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .debug_ranges 0x00000170 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .debug_ranges 0x00000180 0x90 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .debug_ranges 0x00000210 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .debug_ranges 0x00000220 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .debug_ranges 0x00000230 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .debug_ranges 0x00000260 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .debug_ranges 0x00000270 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .debug_ranges 0x00000280 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - -.gnu.attributes - 0x00000000 0x10 - *(.gnu.attributes) - .gnu.attributes - 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - .gnu.attributes - 0x00000010 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - .gnu.attributes - 0x00000020 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - .gnu.attributes - 0x00000030 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - .gnu.attributes - 0x00000040 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - .gnu.attributes - 0x00000050 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - .gnu.attributes - 0x00000060 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - .gnu.attributes - 0x00000070 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - .gnu.attributes - 0x00000080 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - .gnu.attributes - 0x00000090 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - .gnu.attributes - 0x000000a0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - .gnu.attributes - 0x000000b0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - .gnu.attributes - 0x000000c0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - .gnu.attributes - 0x000000d0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - .gnu.attributes - 0x000000e0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - .gnu.attributes - 0x000000f0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - .gnu.attributes - 0x00000100 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - .gnu.attributes - 0x00000110 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - .gnu.attributes - 0x00000120 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - .gnu.attributes - 0x00000130 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - .gnu.attributes - 0x00000140 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - .gnu.attributes - 0x00000150 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - .gnu.attributes - 0x00000160 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .gnu.attributes - 0x00000170 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - .gnu.attributes - 0x00000180 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - .gnu.attributes - 0x00000190 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - .gnu.attributes - 0x000001a0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - .gnu.attributes - 0x000001b0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - .gnu.attributes - 0x000001c0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - .gnu.attributes - 0x000001d0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .gnu.attributes - 0x000001e0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/system.o - .gnu.attributes - 0x000001f0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/template.o - .gnu.attributes - 0x00000200 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - .gnu.attributes - 0x00000210 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .gnu.attributes - 0x00000220 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - .gnu.attributes - 0x00000230 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - .gnu.attributes - 0x00000240 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - .gnu.attributes - 0x00000250 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - .gnu.attributes - 0x00000260 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .gnu.attributes - 0x00000270 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - .gnu.attributes - 0x00000280 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - .gnu.attributes - 0x00000290 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - .gnu.attributes - 0x000002a0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .gnu.attributes - 0x000002b0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - .gnu.attributes - 0x000002c0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .gnu.attributes - 0x000002d0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - .gnu.attributes - 0x000002e0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .gnu.attributes - 0x000002f0 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - .gnu.attributes - 0x00000300 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - .gnu.attributes - 0x00000310 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - .gnu.attributes - 0x00000320 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - .gnu.attributes - 0x00000330 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - .gnu.attributes - 0x00000340 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - .gnu.attributes - 0x00000350 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - .gnu.attributes - 0x00000360 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - .gnu.attributes - 0x00000370 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - .gnu.attributes - 0x00000380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - .gnu.attributes - 0x00000390 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - .gnu.attributes - 0x000003a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - .gnu.attributes - 0x000003b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - .gnu.attributes - 0x000003c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - .gnu.attributes - 0x000003d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - .gnu.attributes - 0x000003e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - .gnu.attributes - 0x000003f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - .gnu.attributes - 0x00000400 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - .gnu.attributes - 0x00000410 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - .gnu.attributes - 0x00000420 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - .gnu.attributes - 0x00000430 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - .gnu.attributes - 0x00000440 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - .gnu.attributes - 0x00000450 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - .gnu.attributes - 0x00000460 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - .gnu.attributes - 0x00000470 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .gnu.attributes - 0x00000480 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - .gnu.attributes - 0x00000490 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - .gnu.attributes - 0x000004a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - .gnu.attributes - 0x000004b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - .gnu.attributes - 0x000004c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - .gnu.attributes - 0x000004d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - .gnu.attributes - 0x000004e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - .gnu.attributes - 0x000004f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - .gnu.attributes - 0x00000500 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - .gnu.attributes - 0x00000510 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - .gnu.attributes - 0x00000520 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - .gnu.attributes - 0x00000530 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .gnu.attributes - 0x00000540 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - .gnu.attributes - 0x00000550 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - .gnu.attributes - 0x00000560 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - .gnu.attributes - 0x00000570 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - .gnu.attributes - 0x00000580 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .gnu.attributes - 0x00000590 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - .gnu.attributes - 0x000005a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - 0x00000001 __MPLAB_DEBUG = 0x1 - 0x00000001 __DEBUG = 0x1 - 0x00000001 __MPLAB_DEBUGGER_ICD3 = 0x1 - 0x00000200 _min_heap_size = 0x200 -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a -START GROUP -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdebug.a -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdsp.a -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a -END GROUP -LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a -OUTPUT(dist/ChaletDuinoV2_795F512H_/debug/ChaletLora.X.debug.elf elf32-tradlittlemips) -LOAD stack -LOAD data_init - -.reginfo 0x00000000 0x18 - .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o - -.stack 0xa00044c8 0x400 - .stack 0xa00044c8 0x400 stack - -.data 0xa00032b4 0x4bc - .data 0xa00032b4 0x4bc build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - -.bss 0xa0003770 0x800 - .bss 0xa0003770 0x400 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .bss 0xa0003b70 0x400 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - -.data 0xa0003f70 0x2c4 - .data 0xa0003f70 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - 0xa0003f70 _iob - .data 0xa0004010 0x6c build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - .data 0xa000407c 0x58 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - .data 0xa00040d4 0x58 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .data 0xa000412c 0x58 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .data 0xa0004184 0x58 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - .data 0xa00041dc 0x58 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - -.bss 0xa0004234 0x74 - .bss 0xa0004234 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - 0xa0004234 _sibuf - 0xa0004254 _sobuf - .bss 0xa0004274 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - .bss 0xa0004290 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - 0xa0004290 __allocs - .bss 0xa00042a0 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - .bss 0xa00042a4 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - -.bss%z1 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.data%z2 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - -.bss%z3 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - -.data%z4 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - -.bss%z5 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - -.data%z6 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - -.bss%z7 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - -.data%z8 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - -.bss%z9 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) - -.data%z10 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) - -.bss%z11 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) - -.data%z12 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) - -.bss%z13 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) - -.data%z14 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) - -.bss%z15 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - -.data%z16 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - -.bss%z17 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - -.data%z18 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - -.bss%z19 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - -.data%z20 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - -.data%z21 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - -.bss%z22 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - -.data%z23 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - -.bss%z24 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - -.data%z25 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - -.bss%z26 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - -.data%z27 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - -.bss%z28 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - -.data%z29 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - -.bss%z30 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - -.data%z31 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - -.bss%z32 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - -.data%z33 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - -.bss%z34 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - -.data%z35 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - -.bss%z36 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - -.data%z37 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - -.data%z38 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - -.bss%z39 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - -.data%z40 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - -.bss%z41 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - -.data%z42 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - -.data%z43 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - -.bss%z44 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - -.data%z45 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - -.bss%z46 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - -.data%z47 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - -.bss%z48 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - -.data%z49 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - -.bss%z50 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - -.data%z51 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - -.bss%z52 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - -.data%z53 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - -.bss%z54 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - -.data%z55 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - -.bss%z56 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - -.data%z57 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - -.data%z58 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - -.bss%z59 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - -.data%z60 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - -.bss%z61 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) - -.data%z62 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) - -.bss%z63 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) - -.data%z64 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) - -.bss%z65 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) - -.data%z66 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) - -.bss%z67 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) - -.data%z68 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) - -.bss%z69 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - -.data%z70 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - -.bss%z71 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) - -.data%z72 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) - -.bss%z73 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) - -.data%z74 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) - -.bss%z75 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) - -.data%z76 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) - -.bss%z77 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) - -.data%z78 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) - -.bss%z79 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) - -.data%z80 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) - -.bss%z81 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) - -.data%z82 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) - -.bss%z83 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) - -.data%z84 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) - -.bss%z85 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) - -.data%z86 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) - -.bss%z87 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) - -.data%z88 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) - -.bss%z89 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) - -.data%z90 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) - -.bss%z91 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) - -.data%z92 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) - -.bss%z93 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) - -.data%z94 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) - -.bss%z95 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) - -.data%z96 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) - -.bss%z97 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) - -.data%z98 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) - -.bss%z99 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) - -.data%z100 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) - -.bss%z101 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) - -.data%z102 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) - -.bss%z103 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) - -.data%z104 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) - -.bss%z105 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) - -.data%z106 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) - -.bss%z107 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) - -.data%z108 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) - -.bss%z109 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) - -.data%z110 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) - -.bss%z111 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) - -.data%z112 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) - -.bss%z113 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) - -.data%z114 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) - -.bss%z115 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) - -.data%z116 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) - -.bss%z117 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) - -.data%z118 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) - -.bss%z119 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) - -.data%z120 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) - -.bss%z121 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) - -.data%z122 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) - -.bss%z123 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) - -.data%z124 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) - -.bss%z125 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) - -.data%z126 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) - -.bss%z127 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) - -.data%z128 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) - -.bss%z129 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) - -.data%z130 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) - -.bss%z131 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) - -.data%z132 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) - -.bss%z133 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) - -.data%z134 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) - -.bss%z135 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) - -.data%z136 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) - -.bss%z137 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) - -.data%z138 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) - -.bss%z139 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) - -.data%z140 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) - -.bss%z141 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) - -.data%z142 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) - -.bss%z143 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) - -.data%z144 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) - -.bss%z145 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) - -.data%z146 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) - -.bss%z147 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) - -.data%z148 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) - -.bss%z149 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) - -.data%z150 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) - -.bss%z151 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) - -.data%z152 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) - -.bss%z153 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) - -.data%z154 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) - -.bss%z155 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) - -.data%z156 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) - -.bss%z157 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) - -.data%z158 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) - -.bss%z159 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) - -.data%z160 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) - -.bss%z161 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) - -.data%z162 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) - -.bss%z163 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) - -.data%z164 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) - -.bss%z165 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) - -.data%z166 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) - -.bss%z167 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) - -.data%z168 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) - -.bss%z169 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) - -.data%z170 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) - -.bss%z171 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) - -.data%z172 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) - -.bss%z173 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) - -.data%z174 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) - -.bss%z175 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) - -.data%z176 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) - -.bss%z177 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) - -.data%z178 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) - -.bss%z179 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) - -.data%z180 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) - -.bss%z181 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) - -.data%z182 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) - -.bss%z183 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) - -.data%z184 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) - -.bss%z185 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) - -.data%z186 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) - -.bss%z187 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) - -.data%z188 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) - -.bss%z189 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) - -.data%z190 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) - -.bss%z191 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) - -.data%z192 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) - -.bss%z193 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) - -.data%z194 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) - -.bss%z195 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - -.data%z196 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - -.bss%z197 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - -.data%z198 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - -.bss%z199 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - -.data%z200 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - -.bss%z201 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) - -.data%z202 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) - -.bss%z203 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) - -.data%z204 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) - -.bss%z205 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) - -.data%z206 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) - -.bss%z207 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) - -.data%z208 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) - -.bss%z209 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - -.data%z210 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - -.bss%z211 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o - -.data%z212 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o - -.bss%z213 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o - -.data%z214 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o - -.bss%z215 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - -.data%z216 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - -.bss%z217 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - -.data%z218 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - -.bss%z219 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - -.data%z220 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - -.bss%z221 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - -.data%z222 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - -.bss%z223 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - -.data%z224 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - -.bss%z225 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - -.data%z226 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - -.bss%z227 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o - -.data%z228 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o - -.bss%z229 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - -.data%z230 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - -.data%z231 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - -.bss%z232 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - -.bss%z233 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - -.data%z234 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - -.bss%z235 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - -.data%z236 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - -.bss%z237 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - -.bss%z238 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - -.data%z239 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - -.bss%z240 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - -.bss%z241 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - -.data%z242 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - -.bss%z243 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - -.data%z244 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - -.bss%z245 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - -.data%z246 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - -.bss%z247 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - -.bss%z248 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - -.data%z249 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - -.bss%z250 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - -.data%z251 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - -.bss%z252 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - -.data%z253 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - -.bss%z254 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - -.data%z255 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - -.bss%z256 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - -.data%z257 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - -.bss%z258 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/template.o - -.data%z259 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/template.o - -.bss%z260 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/system.o - -.data%z261 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/system.o - -.bss%z262 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - -.bss%z263 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - -.data%z264 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - -.bss%z265 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - -.data%z266 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - -.bss%z267 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - -.data%z268 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - -.bss%z269 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - -.data%z270 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - -.bss%z271 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - -.bss%z272 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - -.data%z273 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - -.bss%z274 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - -.data%z275 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - -.bss%z276 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - -.data%z277 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - -.bss%z278 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - -.data%z279 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - -.bss%z280 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - -.data%z281 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - -.bss%z282 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - -.data%z283 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - -.bss%z284 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - -.data%z285 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - -.bss%z286 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - -.data%z287 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - -.bss%z288 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - -.data%z289 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - -.bss%z290 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - -.data%z291 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - -.bss%z292 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - -.data%z293 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - -.bss%z294 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - -.data%z295 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - -.bss%z296 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - -.data%z297 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - -.bss%z298 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - -.data%z299 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - -.bss%z300 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - -.data%z301 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - -.bss%z302 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - -.data%z303 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - -.bss%z304 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - -.data%z305 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - -.bss%z306 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - -.data%z307 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - -.bss%z308 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - -.data%z309 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - -.bss%z310 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - -.data%z311 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - -.bss%z312 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - -.data%z313 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - -.bss%z314 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - -.data%z315 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - -.bss%z316 0x00000000 0x0 - .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - -.data%z317 0x00000000 0x0 - .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - -.bss%z318 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - -.data%z319 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - -.bss%z320 0x00000000 0x0 - .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o - -.data%z321 0x00000000 0x0 - .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o - -.text 0x9d005800 0xc124 - .text 0x9d005800 0x2904 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o - 0x9d005fb4 m2m_wifi_download_mode - 0x9d0062f4 m2m_wifi_ble_set_gain_table - 0x9d006368 m2m_wifi_init_hold - 0x9d0063ac m2m_wifi_init_start - 0x9d0064f8 m2m_wifi_init - 0x9d006554 m2m_wifi_deinit - 0x9d00659c m2m_wifi_reinit_hold - 0x9d0065d8 m2m_wifi_reinit_start - 0x9d006610 m2m_wifi_reinit - 0x9d006670 m2m_wifi_yield - 0x9d0066a0 m2m_wifi_handle_events - 0x9d0066d4 m2m_wifi_default_connect - 0x9d006720 m2m_wifi_connect - 0x9d006794 m2m_wifi_connect_sc - 0x9d006bd8 m2m_wifi_disconnect - 0x9d006c24 m2m_wifi_set_mac_address - 0x9d006c90 m2m_wifi_set_static_ip - 0x9d006d24 m2m_wifi_request_dhcp_client - 0x9d006d48 m2m_wifi_request_dhcp_server - 0x9d006d70 m2m_wifi_enable_dhcp - 0x9d006de8 m2m_wifi_set_lsn_int - 0x9d006e3c m2m_wifi_set_cust_InfoElement - 0x9d006e9c m2m_wifi_set_scan_options - 0x9d006f14 m2m_wifi_set_scan_region - 0x9d006f84 m2m_wifi_request_scan - 0x9d00702c m2m_wifi_request_scan_passive - 0x9d0070d4 m2m_wifi_wps - 0x9d007160 m2m_wifi_wps_disable - 0x9d0071b8 m2m_wifi_p2p - 0x9d007264 m2m_wifi_p2p_disconnect - 0x9d0072bc m2m_wifi_enable_ap - 0x9d007334 m2m_wifi_disable_ap - 0x9d00738c m2m_wifi_req_curr_rssi - 0x9d0073e4 m2m_wifi_req_restrict_ble - 0x9d00743c m2m_wifi_req_unrestrict_ble - 0x9d007494 m2m_wifi_send_ethernet_pkt - 0x9d007534 m2m_wifi_get_otp_mac_address - 0x9d0075b0 m2m_wifi_get_mac_address - 0x9d007624 m2m_wifi_req_scan_result - 0x9d007690 m2m_wifi_get_num_ap_found - 0x9d0076b8 m2m_wifi_get_sleep_mode - 0x9d0076e8 m2m_wifi_set_sleep_mode - 0x9d007774 m2m_wifi_request_sleep - 0x9d0077f8 m2m_wifi_set_device_name - 0x9d007894 m2m_wifi_get_chipId - 0x9d0078c4 m2m_wifi_get_firmware_version - 0x9d007928 m2m_wifi_check_ota_rb - 0x9d007994 m2m_ota_get_firmware_version - 0x9d0079f8 m2m_wifi_enable_monitoring_mode - 0x9d007aac m2m_wifi_disable_monitoring_mode - 0x9d007af8 m2m_wifi_send_wlan_pkt - 0x9d007b94 m2m_wifi_start_provision_mode - 0x9d007c8c m2m_wifi_stop_provision_mode - 0x9d007cd8 m2m_wifi_get_connection_info - 0x9d007d24 m2m_wifi_set_sytem_time - 0x9d007d78 m2m_wifi_get_sytem_time - 0x9d007dc4 m2m_wifi_enable_sntp - 0x9d007e3c m2m_wifi_set_power_profile - 0x9d007ea8 m2m_wifi_set_tx_power - 0x9d007f14 m2m_wifi_enable_firmware_logs - 0x9d007f80 m2m_wifi_set_battery_voltage - 0x9d007ff0 m2m_wifi_prng_get_random_bytes - 0x9d008090 m2m_wifi_ble_api_send - .text 0x9d008104 0x2140 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/socket/source/socket.o - 0x9d008104 Socket_ReadSocketData - 0x9d008a3c socketInit - 0x9d008ab0 socketDeinit - 0x9d008b10 registerSocketCallback - 0x9d008b48 socket - 0x9d008dd0 bind - 0x9d008f00 listen - 0x9d008fe8 accept - 0x9d00905c connect - 0x9d0091d4 send - 0x9d009378 sendto - 0x9d009510 recv - 0x9d0096f8 close - 0x9d009838 recvfrom - 0x9d009a28 nmi_inet_addr - 0x9d009b9c gethostbyname - 0x9d009fd4 setsockopt - 0x9d00a160 getsockopt - 0x9d00a19c m2m_ping_req - .text 0x9d00a244 0x1ad8 build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - 0x9d00a244 InitUart - 0x9d00a4f4 UartResetPort - 0x9d00a7a8 UartOpenComPort - 0x9d00a998 UartReceiveData - 0x9d00aae4 UartGetPendingDataSize - 0x9d00abdc UartTransmitData - 0x9d00b320 DataSentNotification - 0x9d00b608 UartTick - 0x9d00bc28 UartBlockAndTick - 0x9d00bc88 UartBlockUntillBufEmpty - .text 0x9d00bd1c 0x1a58 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - 0x9d00c868 InitWiFi - 0x9d00cd24 TurnOFFWiFi - 0x9d00cdb8 CloseSockets - 0x9d00cea4 GetWiFiSate - 0x9d00cec8 TickWiFi - 0x9d00cfac OpenTerminalServer - 0x9d00d068 SendTerminalData - 0x9d00d0f0 SentTerminalByte - 0x9d00d16c OpenNetworkServer - 0x9d00d228 SendNetworkData - 0x9d00d2b0 SentNetworkByte - 0x9d00d32c OpenSyslogServer - 0x9d00d3e8 SendSyslogData - 0x9d00d460 SendSyslogByte - 0x9d00d4dc IsSyslogClientConnected - 0x9d00d51c OpenBootloaderServer - 0x9d00d5d8 CloseBootloaderServer - 0x9d00d640 SendBootloaderData - 0x9d00d6b8 SendSBootloaderByte - 0x9d00d734 IsBootloaderClientConnected - .text 0x9d00d774 0x1808 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - 0x9d00d774 BootloaderInterfaceInit - 0x9d00d7c8 BootloaderInterfaceTick - 0x9d00d800 BootloaderExecuteCmd - 0x9d00daa4 BootloaderCRCError - 0x9d00db0c BootloaderInterfaceStateMachine - 0x9d00e520 BootloaderResetStateMachine - 0x9d00e57c BootloaderActivateBootloader - 0x9d00e5bc BootloaderDeactivateBootloader - 0x9d00e5ec BootloaderFlashEraseStateMachine - 0x9d00e820 ResetBootloaderFlashEraseStateMachine - 0x9d00e854 BootloaderFlashWriteStateMachine - 0x9d00ea80 BootloaderPrintFlashData - 0x9d00eaa0 BootloaderCheckFlashBootloaderData - 0x9d00edc4 ResetBootloaderFlashWriteStateMachine - 0x9d00ee04 BootloaderBytesToInt - 0x9d00eebc BootloaderIntToBytes - .text 0x9d00ef7c 0x1584 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmasic.o - 0x9d00ef7c chip_apply_conf - 0x9d00f030 nm_clkless_wake - 0x9d00f270 chip_idle - 0x9d00f2e4 enable_rf_blocks - 0x9d00f384 enable_interrupts - 0x9d00f48c cpu_start - 0x9d00f608 nmi_get_chipid - 0x9d00f820 nmi_get_rfrevid - 0x9d00f878 restore_pmu_settings_after_global_reset - 0x9d00f8cc nmi_update_pll - 0x9d00f940 nmi_set_sys_clk_src_to_xo - 0x9d00f99c chip_wake - 0x9d00f9f0 chip_reset_and_cpu_halt - 0x9d00fb84 chip_reset - 0x9d00fbec wait_for_bootrom - 0x9d00fd78 wait_for_firmware_start - 0x9d00fe98 chip_deinit - 0x9d00ffb4 set_gpio_dir - 0x9d010088 set_gpio_val - 0x9d01015c get_gpio_val - 0x9d0101e8 pullup_ctrl - 0x9d0102a0 nmi_get_otp_mac_address - 0x9d010400 nmi_get_mac_address - .text 0x9d010500 0x1424 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_hif.o - 0x9d010638 hif_chip_wake - 0x9d010704 hif_set_sleep_mode - 0x9d010734 hif_get_sleep_mode - 0x9d01075c hif_chip_sleep - 0x9d010880 hif_init - 0x9d0108ec hif_deinit - 0x9d01094c hif_check_compatibility - 0x9d0109c4 hif_enable_access - 0x9d010ae4 hif_check_code - 0x9d010bd4 hif_send - 0x9d0114ec hif_yield - 0x9d011514 hif_handle_isr - 0x9d0115e0 hif_receive - 0x9d01183c hif_register_cb - -.text._vfprintf_cdfFnopsuxX - 0x9d011924 0x13d4 - .text._vfprintf_cdfFnopsuxX - 0x9d011924 0x13d4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - 0x9d011924 _vfprintf_cdfFnopsuxX - 0x9d011924 _vfprintf_cdfFnopuxX - 0x9d011924 _vfprintf_cdnopsuxX - 0x9d011924 _vfprintf_fF - 0x9d011924 _vfprintf_cdnopuxX - -.text 0x9d012cf8 0x8000 - .text 0x9d012cf8 0x117c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o - 0x9d0139f8 spi_flash_read - 0x9d013ad0 spi_flash_write - 0x9d013ca8 spi_flash_erase - 0x9d013df4 spi_flash_get_size - .text 0x9d013e74 0x1108 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - 0x9d014910 nm_spi_write_reg - 0x9d0149e8 nm_spi_write_block - 0x9d014af0 nm_spi_read_reg_with_ret - 0x9d014c3c nm_spi_read_block - 0x9d014df8 nm_spi_init - 0x9d014f10 nm_spi_deinit - 0x9d014f38 nm_spi_read_reg - .text 0x9d014f7c 0xf70 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - 0x9d014f7c InternalUartInit - 0x9d015158 OpenInternalPort - 0x9d015378 SendInternalUartData - 0x9d0156cc SendInternalUartDataBlocking - 0x9d0157dc TickInternalUart - 0x9d0157fc InternalUart1AInterrupt - 0x9d015a38 InternalUart2Interrupt - 0x9d015cc8 ResetUart1 - 0x9d015dd0 ResetUart2 - 0x9d015ecc process - .text 0x9d015eec 0xe68 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - 0x9d015eec InitTerminal - 0x9d015f6c TickTerminal - 0x9d015fc8 RxTerminalBuf - 0x9d016054 RxTerminalData - 0x9d0161a4 ParseNewBuffer - 0x9d016ca0 TerminalPrintString - 0x9d016cf4 TerminalPrintChar - 0x9d016d34 TerminalStateMachine - .text 0x9d016d54 0xddc build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - 0x9d016d54 InitSPIFlash - 0x9d016ecc SPIFlashCheckAndConfigure - 0x9d016fa8 SPIFlashIsPresent - 0x9d016fcc SPIFlashWriteEnable - 0x9d017030 SPIFlashReadStatusReg - 0x9d0170d8 SPIFlashCheckBusy - 0x9d017134 SPIFlashCheckChipID - 0x9d017270 SPIFlashReadBuffer - 0x9d0173f0 SPIFlashEraseSector - 0x9d017518 SPIFlashErase64KSector - 0x9d01766c SPIFlashWriteSectorWorkingBuffer - 0x9d017828 SPIFlashWriteByte - 0x9d01797c SPIFlashWriteBuffer - .text 0x9d017b30 0xd54 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - 0x9d017b30 BootloaderProtocolInit - 0x9d017b60 BootloaderProtocolStateMachine - 0x9d0180b0 BootloaderProtocolProtocolAnalyzeNewData - 0x9d01812c BootloaderProtocolResetStateMachine - 0x9d018180 BootloaderProtocolSendFrame - 0x9d01834c BootloaderProtocolGetDataBufferPtr - 0x9d018370 BootloaderProtocolSendHeartbeat - 0x9d0183b8 BootloaderProtocolSendACK - 0x9d01840c BootloaderProtocolSendNACK - 0x9d01845c BootloaderProtocolSendInitUploadResponse - 0x9d0185bc BootloaderProtocolSendDataChunkResult - 0x9d0186b0 BootloaderProtocolSendBootloaderState - 0x9d018714 BootloaderProtocolSendFirmwareUploadResult - 0x9d018778 BootloaderProtocolSendFlashCheckResult - 0x9d0187dc BootloaderProtocolSendStoredFirmwareInfoResponse - .text 0x9d018884 0xce8 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - 0x9d018884 SwapEndianShort - 0x9d0188d0 SwapEndianInt - 0x9d01892c ConvertIntToStrLeadingZero - 0x9d018d50 ConvertIntToStr - 0x9d0190a4 ConvertCharToStrLeadingZero - 0x9d01920c ConvertStrToValue - 0x9d0193f8 ConvertCharToStr - 0x9d0194b0 Crc8 - 0x9d019548 Delay - .text 0x9d01956c 0xbf4 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o - 0x9d019878 m2m_ssl_handshake_rsp - 0x9d0198f0 m2m_ssl_send_certs_to_winc - 0x9d019c38 m2m_ssl_retrieve_cert - 0x9d019f74 m2m_ssl_retrieve_hash - 0x9d01a034 m2m_ssl_stop_processing_certs - 0x9d01a074 m2m_ssl_ecc_process_done - 0x9d01a098 m2m_ssl_set_active_ciphersuites - 0x9d01a100 m2m_ssl_init - .text 0x9d01a160 0xb98 build/ChaletDuinoV2_795F512H_/debug/Source/timer.o - 0x9d01a160 TimerInit - 0x9d01a230 IsMilliSecTimerExpired - 0x9d01a398 IsSecTimerExpired - 0x9d01a4fc IsTimerExpired - 0x9d01a8b0 TimerStart - 0x9d01a9d8 TimerStartSeconds - 0x9d01aa7c TimerReset - 0x9d01ab00 IsTimerRunning - 0x9d01ab44 TimerStop - 0x9d01ab88 Sleep - 0x9d01abe4 Timer1MilliSecInterrupt - -.dinit 0x9d01acf8 0xb60 - .dinit 0x9d01acf8 0xb60 data_init - -.text 0x9d01b858 0x974 - .text 0x9d01b858 0x974 build/ChaletDuinoV2_795F512H_/debug/Source/NetworkProtocol.o - 0x9d01b858 ProtocolInit - 0x9d01b888 StateMachine - 0x9d01be04 ProtocolAnalyzeNewData - 0x9d01be44 ResetStateMachine - 0x9d01be8c ProtocolExecCmd - 0x9d01bec8 ProtocolAcknowledge - 0x9d01bf2c ProtocolCalcCrc - 0x9d01bfa8 ProtocolIsReceiving - 0x9d01bfe8 ProtocolGetFrame - 0x9d01c1a4 ProtocolMsgDataPtr - -.text._vfscanf_s - 0x9d01c1cc 0x868 - .text._vfscanf_s - 0x9d01c1cc 0x868 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - 0x9d01c1cc _vfscanf_s - 0x9d01c1cc _vfscanf_0 - -.text 0x9d01ca34 0x7e8 - .text 0x9d01ca34 0x7e8 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - 0x9d01ca34 ExecuteMasterCommand - 0x9d01d084 SendLoraNetworkCommand - 0x9d01d12c SendLoraNetworkCommandBlocking - 0x9d01d1d4 TestTx - -.rodata 0x9d01d21c 0x7b8 - .rodata 0x9d01d21c 0x7b8 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderInterface.o - -.text 0x9d01d9d4 0x2444 - .text 0x9d01d9d4 0x740 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmdrv.o - 0x9d01d9d4 nm_get_hif_info - 0x9d01da74 nm_get_firmware_full_info - 0x9d01dc08 nm_get_ota_firmware_info - 0x9d01dd9c nm_drv_init_download_mode - 0x9d01de18 nm_drv_init_hold - 0x9d01dec4 nm_drv_init_start - 0x9d01dff8 nm_drv_init - 0x9d01e05c nm_drv_deinit - 0x9d01e0dc nm_cpu_start - .text 0x9d01e114 0x720 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletduinoV2Board.o - 0x9d01e114 InitBoard - .text 0x9d01e834 0x654 build/ChaletDuinoV2_795F512H_/debug/Source/ina219.o - 0x9d01ea3c ina219SetCalibration_13V_10A - 0x9d01eaa0 ina219SetCalibration_32V_2A - 0x9d01eb04 ina219SetCalibration_32V_1A - 0x9d01eb68 ina219SetCalibration_16V_500mA - 0x9d01ebcc ina219SetCalibration_16V_200mA - 0x9d01ec30 ina219Init - 0x9d01ecb0 ina219GetShuntVoltage - 0x9d01ecf4 ina219GetBusVoltage - 0x9d01ed48 ina219GetPower - 0x9d01ed8c ina219GetPower_mW - 0x9d01ede8 ina219GetCurrent - 0x9d01ee2c ina219GetCurrent_mA - .text 0x9d01ee88 0x574 build/ChaletDuinoV2_795F512H_/debug/Source/I2C.o - 0x9d01ee88 I2CInit - 0x9d01eef4 I2CWrite - 0x9d01f0b8 I2CTransmitByte - 0x9d01f0e4 I2CRead - 0x9d01f3d8 I2CWasLastTransactionOK - .text 0x9d01f3fc 0x52c build/ChaletDuinoV2_795F512H_/debug/Source/main.o - 0x9d01f3fc main - 0x9d01f8e8 _mon_putc - .text 0x9d01f928 0x4f0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ota.o - 0x9d01fa60 m2m_ota_init - 0x9d01fad4 m2m_ota_notif_set_url - 0x9d01fb48 m2m_ota_notif_check_for_update - 0x9d01fba0 m2m_ota_notif_sched - 0x9d01fbfc m2m_ota_start_update - 0x9d01fc70 m2m_ota_rollback - 0x9d01fd18 m2m_ota_abort - 0x9d01fd70 m2m_ota_switch_firmware - -.rodata 0x9d01fe18 0x494 - .rodata 0x9d01fe18 0x494 build/ChaletDuinoV2_795F512H_/debug/Source/Terminal.o - -.text 0x9d0202ac 0x1534 - .text 0x9d0202ac 0x45c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) - 0x9d0202ac __umoddi3 - .text 0x9d020708 0x454 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmbus.o - 0x9d020708 nm_bus_iface_init - 0x9d020754 nm_bus_iface_deinit - 0x9d020790 nm_bus_iface_reconfigure - 0x9d0207bc nm_read_reg - 0x9d0207f4 nm_read_reg_with_ret - 0x9d020834 nm_write_reg - 0x9d0208c4 nm_read_block - 0x9d020a38 nm_write_block - .text 0x9d020b5c 0x44c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) - 0x9d020b5c __udivdi3 - .text 0x9d020fa8 0x42c build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - 0x9d020fa8 InitBatteryMonitor - 0x9d021020 BatteryMonitorTick - 0x9d0212b8 GetBatteryVoltage - 0x9d021320 GetSolarPanelCurrent - 0x9d02134c GetBatterySOC - 0x9d021370 SendNetworkBatteryData - 0x9d0213b0 GetCurrentModuleOK - .text 0x9d0213d4 0x40c build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/common/source/nm_common.o - 0x9d0213d4 m2m_memcpy - 0x9d021458 m2m_checksum - 0x9d0214c8 m2m_memset - 0x9d021540 m2m_strlen - 0x9d02159c m2m_strncmp - 0x9d021670 m2m_strstr - 0x9d021748 m2m_memcmp - -.rodata 0x9d0217e0 0x404 - .rodata 0x9d0217e0 0x404 build/ChaletDuinoV2_795F512H_/debug/Source/Util.o - 0x9d0217e4 CRC8_TABLE - -.text 0x9d021be4 0xd6c - .text 0x9d021be4 0x394 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - 0x9d021be4 TC77Configure - 0x9d021e34 TC77GetActualTemp - 0x9d021f54 TC77GetDeviceID - .text 0x9d021f78 0x390 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o - 0x9d021f78 nm_spi_rw - 0x9d022138 nm_bus_init - 0x9d022224 nm_bus_ioctl - 0x9d0222b8 nm_bus_deinit - 0x9d0222e0 nm_bus_reinit - .text 0x9d022308 0x380 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_periph.o - 0x9d022518 m2m_periph_init - 0x9d022540 m2m_periph_gpio_set_dir - 0x9d022598 m2m_periph_gpio_set_val - 0x9d0225f0 m2m_periph_gpio_get_val - 0x9d022640 m2m_periph_pullup_ctrl - .text 0x9d022688 0x2c8 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o - 0x9d022688 chip_isr - 0x9d0227b8 nm_bsp_init - 0x9d0227e0 nm_bsp_deinit - 0x9d022804 nm_bsp_reset - 0x9d02288c nm_bsp_sleep - 0x9d0228c4 nm_bsp_register_isr - 0x9d0228f0 nm_bsp_interrupt_ctrl - -.text.scale 0x9d022950 0x2a0 - .text.scale 0x9d022950 0x2a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - -.text.fpsubadd 0x9d022bf0 0x278 - .text.fpsubadd - 0x9d022bf0 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) - 0x9d022bf0 __subsf3 - 0x9d022bf0 fpsub - 0x9d022bf8 __addsf3 - 0x9d022bf8 fpadd - -.text.malloc 0x9d022e68 0x278 - .text.malloc 0x9d022e68 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - 0x9d022e68 malloc - -.text 0x9d0230e0 0x988 - .text 0x9d0230e0 0x26c build/ChaletDuinoV2_795F512H_/debug/Source/crc32.o - 0x9d0230e0 crc_32 - 0x9d0231d8 update_crc_32 - .text 0x9d02334c 0x264 build/ChaletDuinoV2_795F512H_/debug/Source/LoraWatchdog.o - 0x9d02334c InitLoraWatchdog - 0x9d02338c TickLoraWatchdog - 0x9d0233c0 LoraWatchdogStateMachine - 0x9d02357c KickLoraWatchdog - .text 0x9d0235b0 0x260 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - 0x9d0235b0 InitChaletPowerRelay - 0x9d02360c ChaletPowerRelayTick - 0x9d023710 ChaletPowerRelayKickTimer - 0x9d023748 ChaletPowerRelayTurnOn - 0x9d023798 ChaletPowerRelayTurnOff - 0x9d0237e8 GetChaletPowerRelayState - .text 0x9d023810 0x258 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - 0x9d023810 InitSyslog - 0x9d023864 SyslogTick - 0x9d023900 SyslogNewByte - 0x9d0239b4 SyslogNewString - 0x9d023a2c SyslogIsBufferEmpty - -.rodata 0x9d023a68 0x254 - .rodata 0x9d023a68 0x254 build/ChaletDuinoV2_795F512H_/debug/Source/WiFiCtrl.o - -.text.fp32div 0x9d023cbc 0x230 - .text.fp32div 0x9d023cbc 0x230 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) - 0x9d023cbc fpdiv - 0x9d023cbc __divsf3 - -.text.__floatdisf - 0x9d023eec 0x220 - .text.__floatdisf - 0x9d023eec 0x220 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - 0x9d023eec __floatdisf - -.text.fp32mul 0x9d02410c 0x1bc - .text.fp32mul 0x9d02410c 0x1bc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) - 0x9d02410c __mulsf3 - 0x9d02410c fpmul - -.text 0x9d0242c8 0x1a0 - .text 0x9d0242c8 0x1a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) - 0x9d0242c8 strcpy - -.text.realloc 0x9d024468 0x194 - .text.realloc 0x9d024468 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - 0x9d024468 realloc - -.text._sbrk_init - 0x9d0245fc 0x194 - .text._sbrk_init - 0x9d0245fc 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - 0x9d0245fc _sbrk_init - -.text._filbuf 0x9d024790 0x188 - .text._filbuf 0x9d024790 0x188 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - 0x9d024790 _filbuf - -.text.read 0x9d024918 0x174 - .text.read 0x9d024918 0x174 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - 0x9d024918 read - -.text 0x9d024a8c 0x2d0 - .text 0x9d024a8c 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) - 0x9d024a8c memcpy - .text 0x9d024bf4 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) - 0x9d024bf4 strlen - -.text.fputc 0x9d024d5c 0x15c - .text.fputc 0x9d024d5c 0x15c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - 0x9d024d5c fputc - -.text._flsbuf 0x9d024eb8 0x12c - .text._flsbuf 0x9d024eb8 0x12c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - 0x9d024eb8 _flsbuf - -.text 0x9d024fe4 0x11c - .text 0x9d024fe4 0x11c build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - 0x9d024fe4 InitTempSensor - 0x9d025028 TempSensorCheckAndConfigure - 0x9d025084 TempSensorGetTemp - 0x9d0250a8 TickTempSensor - -.text.fgetc 0x9d025100 0x108 - .text.fgetc 0x9d025100 0x108 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - 0x9d025100 fgetc - -.rodata 0x9d025208 0x204 - .rodata 0x9d025208 0x104 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - 0x9d025208 _ctype - .rodata 0x9d02530c 0x100 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmspi.o - -.text.setvbuf 0x9d02540c 0xfc - .text.setvbuf 0x9d02540c 0xfc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - 0x9d02540c setvbuf - -.rodata 0x9d025508 0xe0 - .rodata 0x9d025508 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - -.text.general_exception - 0x9d0255e8 0xdc - .text.general_exception - 0x9d0255e8 0xdc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) - 0x9d0255e8 _general_exception_context - -.text 0x9d0256c4 0x1ac - .text 0x9d0256c4 0xd8 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - 0x9d0256c4 InitWatchdog - 0x9d025718 EnableWatchdog - 0x9d025744 DisableWatchdog - 0x9d025770 KickWatchdog - .text 0x9d02579c 0xd4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - 0x9d02579c __floatundisf - -.rodata 0x9d025870 0xc8 - .rodata 0x9d025870 0xc8 build/ChaletDuinoV2_795F512H_/debug/Source/SPI_Flash.o - -.text._sbrk 0x9d025938 0xc4 - .text._sbrk 0x9d025938 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - 0x9d025938 _sbrk - -.text 0x9d0259fc 0xa8 - .text 0x9d0259fc 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) - 0x9d0259fc memset - -.text.atoi 0x9d025aa4 0xa8 - .text.atoi 0x9d025aa4 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - 0x9d025aa4 atoi - -.text.range 0x9d025b4c 0xa0 - .text.range 0x9d025b4c 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - -.text.fpcmp 0x9d025bec 0x9c - .text.fpcmp 0x9d025bec 0x9c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) - 0x9d025bec __eqsf2 - 0x9d025bec __lesf2 - 0x9d025bec __gtsf2 - 0x9d025bec __nesf2 - 0x9d025bec fpcmp - 0x9d025bec __gesf2 - 0x9d025bec __ltsf2 - -.text.fflush 0x9d025c88 0x94 - .text.fflush 0x9d025c88 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - 0x9d025c88 fflush - -.text.write 0x9d025d1c 0x94 - .text.write 0x9d025d1c 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - 0x9d025d1c write - -.text.libm 0x9d025db0 0x88 - .text.libm 0x9d025db0 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) - 0x9d025db0 frexpf - 0x9d025db0 fpfrexp - -.text 0x9d025e38 0x80 - .text 0x9d025e38 0x80 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/winc_init.o - 0x9d025e38 wifi_init - -.text.fptoul 0x9d025eb8 0x7c - .text.fptoul 0x9d025eb8 0x7c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) - 0x9d025eb8 fptoul - 0x9d025eb8 fptoui - 0x9d025eb8 __fixunssfsi - -.text.SoftReset - 0x9d025f34 0x78 - .text.SoftReset - 0x9d025f34 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - 0x9d025f34 SoftReset - -.text.fputs 0x9d025fac 0x78 - .text.fputs 0x9d025fac 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - 0x9d025fac fputs - -.text.strncmp 0x9d026024 0x78 - .text.strncmp 0x9d026024 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - 0x9d026024 strncmp - -.text.ungetc 0x9d02609c 0x74 - .text.ungetc 0x9d02609c 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - 0x9d02609c ungetc - -.text 0x9d026110 0xd8 - .text 0x9d026110 0x70 build/ChaletDuinoV2_795F512H_/debug/Source/SPI.o - 0x9d026110 SPITransaction - .text 0x9d026180 0x68 build/ChaletDuinoV2_795F512H_/debug/Source/HarakiriRelay.o - 0x9d026180 InitHarakiriRelay - 0x9d0261b0 HarakiriRelayTurnOff - -.text._sprintf_cdfFnopuxX - 0x9d0261e8 0x68 - .text._sprintf_cdfFnopuxX - 0x9d0261e8 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - 0x9d0261e8 _sprintf_cdnopuxX - 0x9d0261e8 _sprintf_cdfFnopuxX - -.rodata 0x9d026250 0x68 - .rodata 0x9d026250 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - 0x9d026250 _powers_f - 0x9d026284 _npowers_f - -.text.sitofp 0x9d0262b8 0x60 - .text.sitofp 0x9d0262b8 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) - 0x9d0262b8 sitofp - 0x9d0262b8 litofp - 0x9d0262b8 __floatsisf - -.text.wspace 0x9d026318 0x60 - .text.wspace 0x9d026318 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - -.text 0x9d026378 0x58 - .text 0x9d026378 0x58 build/ChaletDuinoV2_795F512H_/debug/Source/exceptions.o - 0x9d026378 _general_exception_handler - -.text._sscanf_s - 0x9d0263d0 0x54 - .text._sscanf_s - 0x9d0263d0 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - 0x9d0263d0 _sscanf_s - 0x9d0263d0 _sscanf_0 - -.text._bufallo 0x9d026424 0x54 - .text._bufallo - 0x9d026424 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - 0x9d026424 _bufallo - -.text.sbrk 0x9d026478 0x50 - .text.sbrk 0x9d026478 0x50 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - 0x9d026478 sbrk - -.text.main_entry - 0x9d0264c8 0x4c - .text.main_entry - 0x9d0264c8 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o - 0x9d0264f4 __crt0_exit - -.text 0x9d026514 0x4c - .text 0x9d026514 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) - 0x9d026514 __floatunsisf - -.text._bootstrap_exception_handler - 0x9d026560 0x48 - .text._bootstrap_exception_handler - 0x9d026560 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - 0x9d026560 _bootstrap_exception_handler - -.text 0x9d0265a8 0x44 - .text 0x9d0265a8 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o - 0x9d0265a8 __pic32_software_reset - -.text.puts 0x9d0265ec 0x44 - .text.puts 0x9d0265ec 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - 0x9d0265ec puts - -.text._printf_cdfFnopsuxX - 0x9d026630 0x40 - .text._printf_cdfFnopsuxX - 0x9d026630 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - 0x9d026630 _printf_cdnopsuxX - 0x9d026630 _printf_cdnopuxX - 0x9d026630 _printf_cdfFnopsuxX - 0x9d026630 _printf_fF - -.vector_default - 0x9d026670 0x38 - .vector_default - 0x9d026670 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - 0x9d026670 _DefaultInterrupt - -.rodata 0x9d0266a8 0x64 - .rodata 0x9d0266a8 0x34 build/ChaletDuinoV2_795F512H_/debug/Source/BatteryMonitor.o - .rodata 0x9d0266dc 0x30 build/ChaletDuinoV2_795F512H_/debug/Source/main.o - -.text.INTConfigureSystem - 0x9d02670c 0x30 - .text.INTConfigureSystem - 0x9d02670c 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - 0x9d02670c INTConfigureSystem - -.text.free 0x9d02673c 0x30 - .text.free 0x9d02673c 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - 0x9d02673c free - -.text._stub_sbd_memlayout - 0x9d02676c 0x2c - .text._stub_sbd_memlayout - 0x9d02676c 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - 0x9d02676c _sbd_memlayout - 0x9d02676c _stub_sbd_memlayout - -.rodata 0x9d026798 0x28 - .rodata 0x9d026798 0x28 build/ChaletDuinoV2_795F512H_/debug/Source/ChaletPowerRelay.o - -.text.tolower 0x9d0267c0 0x24 - .text.tolower 0x9d0267c0 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d0267c0 tolower - -.text.toupper 0x9d0267e4 0x24 - .text.toupper 0x9d0267e4 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d0267e4 toupper - -.text 0x9d026808 0x20 - .text 0x9d026808 0x20 build/ChaletDuinoV2_795F512H_/debug/Source/DigitalIO.o - 0x9d026808 InitDigitalIO - -.rodata 0x9d026828 0x1c - .rodata 0x9d026828 0x1c build/ChaletDuinoV2_795F512H_/debug/Source/Uart.o - -.text.INTRestoreInterrupts - 0x9d026844 0x1c - .text.INTRestoreInterrupts - 0x9d026844 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - 0x9d026844 INTRestoreInterrupts - -.text.setbuf 0x9d026860 0x1c - .text.setbuf 0x9d026860 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - 0x9d026860 setbuf - -.rodata 0x9d02687c 0x30 - .rodata 0x9d02687c 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/InternalUart.o - .rodata 0x9d026894 0x18 build/ChaletDuinoV2_795F512H_/debug/Source/Watchdog.o - -.text.CheKseg0CacheOff - 0x9d0268ac 0x18 - .text.CheKseg0CacheOff - 0x9d0268ac 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - 0x9d0268ac CheKseg0CacheOff - -.text.CheKseg0CacheOn - 0x9d0268c4 0x18 - .text.CheKseg0CacheOn - 0x9d0268c4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - 0x9d0268c4 CheKseg0CacheOn - -.text 0x9d0268dc 0x18 - .text 0x9d0268dc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) - 0x9d0268dc _nmi_handler - -.text.isalnum 0x9d0268f4 0x18 - .text.isalnum 0x9d0268f4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d0268f4 isalnum - -.text.isalpha 0x9d02690c 0x18 - .text.isalpha 0x9d02690c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d02690c isalpha - -.text.iscntrl 0x9d026924 0x18 - .text.iscntrl 0x9d026924 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d026924 iscntrl - -.text.isdigit 0x9d02693c 0x18 - .text.isdigit 0x9d02693c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d02693c isdigit - -.text.isgraph 0x9d026954 0x18 - .text.isgraph 0x9d026954 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d026954 isgraph - -.text.islower 0x9d02696c 0x18 - .text.islower 0x9d02696c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d02696c islower - -.text.isprint 0x9d026984 0x18 - .text.isprint 0x9d026984 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d026984 isprint - -.text.ispunct 0x9d02699c 0x18 - .text.ispunct 0x9d02699c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d02699c ispunct - -.text.isspace 0x9d0269b4 0x18 - .text.isspace 0x9d0269b4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d0269b4 isspace - -.text.isupper 0x9d0269cc 0x18 - .text.isupper 0x9d0269cc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d0269cc isupper - -.text.isxdigit 0x9d0269e4 0x18 - .text.isxdigit - 0x9d0269e4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d0269e4 isxdigit - -.text._buffree 0x9d0269fc 0x14 - .text._buffree - 0x9d0269fc 0x14 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - 0x9d0269fc _buffree - -.rodata 0x9d026a10 0x10 - .rodata 0x9d026a10 0x10 build/ChaletDuinoV2_795F512H_/debug/Source/LoraNetworkInterface.o - -.text.__exception_handler_break - 0x9d026a20 0xc - .text.__exception_handler_break - 0x9d026a20 0xc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - 0x9d026a20 __exception_handler_break - -.rodata 0x9d026a2c 0x18 - .rodata 0x9d026a2c 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/Syslog.o - .rodata 0x9d026a34 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/TC77.o - .rodata 0x9d026a3c 0x8 build/ChaletDuinoV2_795F512H_/debug/Source/BootloaderProtocol.o - -.text.INTEnableInterrupts - 0x9d026a44 0x8 - .text.INTEnableInterrupts - 0x9d026a44 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - 0x9d026a44 INTEnableInterrupts - -.text.INTDisableInterrupts - 0x9d026a4c 0x8 - .text.INTDisableInterrupts - 0x9d026a4c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - 0x9d026a4c INTDisableInterrupts - -.text._on_reset - 0x9d026a54 0x8 - .text._on_reset - 0x9d026a54 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - 0x9d026a54 _on_reset - -.text._on_bootstrap - 0x9d026a5c 0x8 - .text._on_bootstrap - 0x9d026a5c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - 0x9d026a5c _on_bootstrap - -.text.isascii 0x9d026a64 0x8 - .text.isascii 0x9d026a64 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d026a64 isascii - -.text.toascii 0x9d026a6c 0x8 - .text.toascii 0x9d026a6c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d026a6c toascii - -.text._tolower 0x9d026a74 0x8 - .text._tolower - 0x9d026a74 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d026a74 _tolower - -.text._toupper 0x9d026a7c 0x8 - .text._toupper - 0x9d026a7c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - 0x9d026a7c _toupper - -.text.getpagesize - 0x9d026a84 0x8 - .text.getpagesize - 0x9d026a84 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - 0x9d026a84 getpagesize - -.rodata 0x9d026a8c 0xc - .rodata 0x9d026a8c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) - .rodata 0x9d026a94 0x4 build/ChaletDuinoV2_795F512H_/debug/Source/TemperatureSensor.o - -.text%z322 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) - -.text%z323 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) - -.text%z324 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) - -.text%z325 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) - -.text%z326 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) - -.text%z327 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) - -.text%z328 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) - -.text%z329 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) - -.text%z330 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) - -.text%z331 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) - -.text%z332 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) - -.text%z333 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) - -.text%z334 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) - -.text%z335 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) - -.text%z336 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) - -.text%z337 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) - -.text%z338 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) - -.text%z339 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) - -.text%z340 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) - -.text%z341 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) - -.text%z342 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) - -.text%z343 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) - -.text%z344 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) - -.text%z345 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) - -.text%z346 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) - -.text%z347 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) - -.text%z348 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) - -.text%z349 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) - -.text%z350 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) - -.text%z351 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) - -.text%z352 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) - -.text%z353 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) - -.text%z354 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) - -.text%z355 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) - -.text%z356 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) - -.text%z357 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) - -.text%z358 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) - -.text%z359 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) - -.text%z360 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) - -.text%z361 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) - -.text%z362 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) - -.text%z363 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) - -.text%z364 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) - -.text%z365 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) - -.text%z366 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) - -.text%z367 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) - -.text%z368 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) - -.text%z369 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) - -.text%z370 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) - -.text%z371 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) - -.text%z372 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) - -.text%z373 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) - -.text%z374 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) - -.text%z375 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) - -.text%z376 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) - -.text%z377 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) - -.text%z378 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) - -.text%z379 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) - -.text%z380 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) - -.text%z381 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) - -.text%z382 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) - -.text%z383 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) - -.text%z384 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) - -.text%z385 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) - -.text%z386 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) - -.text%z387 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) - -.text%z388 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) - -.text%z389 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) - -.text%z390 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) - -.text%z391 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) - -.text%z392 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) - -.text%z393 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) - -.text%z394 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) - -.text%z395 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) - -.text%z396 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) - -.text%z397 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) - -.text%z398 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) - -.text%z399 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) - -.text%z400 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) - -.text%z401 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) - -.text%z402 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) - -.text%z403 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) - -.text%z404 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) - -.text%z405 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) - -.text%z406 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) - -.text%z407 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) - -.text%z408 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) - -.text%z409 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) - -.text%z410 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) - -.text%z411 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) - -.text%z412 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) - -.text%z413 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) - -.text%z414 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) - -.text%z415 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) - -.text%z416 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) - -.text%z417 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) - -.text%z418 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) - -.text%z419 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) - -.text%z420 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) - -.text%z421 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o - -.text%z422 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) - -.text%z423 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) - -.text%z424 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) - -.text%z425 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) - -.text%z426 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) - -.text%z427 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) - -.text%z428 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o - -.text%z429 0x00000000 0x0 - .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/template.o - -.text%z430 0x00000000 0x0 - .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/system.o - -.text%z431 0x00000000 0x0 - .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/interrupts.o - -.text%z432 0x00000000 0x0 - .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmuart.o - -.text%z433 0x00000000 0x0 - .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/nmi2c.o - -.text%z434 0x00000000 0x0 - .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o - -.text%z435 0x00000000 0x0 - .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o - -.text%z436 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o - -.text%z437 0x00000000 0x0 - .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o diff --git a/ChaletLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaletLora.X.production.elf b/ChaletLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaletLora.X.production.elf index e2e12a83964ff90f16856e1ed0b99a728b892f51..051c1fba0983aa9dc9a2955ae7106744992c450f 100644 GIT binary patch literal 977448 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

%{>yzai<&Pr@z zQ6Nu$#SGW`Jz(U$`JAw0$CY9)T_?h?206w;p18UIbCu&6%o86T&8cg|3qb4Z)y$r_ z_72HU3aj!T&GMbS?QO!iV@&Ibo1S7h*O=B51x_pch~4cwD%IAWC~&26Ti@VjEbtR0 zetsAnvdD|B*oWlXj{>jPmUho|P#Bu!56RyR_!i7C`CG68SdqU2Nm?`VTlGeu69w`G zLI$>Ubzllp$P!xJw*_%+z^^mXVX=&HY^&ksocTj}$=*5LY6 z;E5T;im)K@aeFbf6$>^Ce{UsSoHN_f)wv}|yH{*=L9ICQMUX9Zm>+Knmfh}fBpuQ=&;PSGfcA!<^Zf#6qdokf#1$mMIsM_B{%{T`X%(yJ z%>e)7Vf=oA_=5zn_zB_<65$-+*9@y@!~bLNZ2;q{?mN*ta|K+m@t0&<1_L5Ei9!Va zz<@~nA!Cu)*4QYP90W0uWoc|F=&RChN&s zcX8vC{TBZI9bjeOLW1W}Ojj9Zd>?l+{)m5$;Lpszz@HGPCZ0}3!kONLQtkN7+=)kb5%we!5hnH_(agjFB=#~fg2bOQ@n=YQz|YLr zkXVZZ8b|^Sm8fZi8U6=)^mS&q3K@QviJ3_Jh>1B!yv4+PByPlpyqQao*uX>`5|1O{ zly3lD%TeJK%(xhp{UPD2koXfO?nB~rCfbm=8awo6{u&Z@Gw}!#k1_ErB)*S?GrbMN zj^Q_R7>`~i?E6UY13fc;gv38FaTJN0u(NLFUm?L)b7ua(Nc;{H|A@rjBEf&Nf);o) zy5~%$1=axH0t<-qJm6ucr2W14?iYy%L31`-8sOWY4_*Qc{ z?fMVIV+Tkm!EX;ApT^^#^YIKmnu1^X#(25Rd;#Ja+Kt5PtXYG41#<7NZ@1 z2MJ-vg$*yK{k{q>jFi)UuVjMudp8o!jCtsA4LeQy{qG5*{XU9>u;0RVm(ys{+j4NVJ80cOH;oCy<_;1P&e z8k#WSa}z#4A%ylyu6A6HH!DjgOt^Z�k~l)5~UBIWE6i4Csm(IwPDXzlzIP1zx!m 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 J8t9!+x4Nv33CPK~z{1yM!<8M2D7!xl~ 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 literal 898029 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/BoardCfg_Pinguino.h Source/BoardCfg_ChaletduinoV2.h - + - Source/winc3400/bsp/include/nm_bsp.h - Source/winc3400/bsp/include/nm_bsp_internal.h - - - - - - - Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h - - + Source/winc3400_142/bsp/include/nm_bsp.h - Source/winc3400/common/include/nm_common.h - Source/winc3400/common/include/nm_debug.h + Source/winc3400_142/common/include/nm_common.h + Source/winc3400_142/common/include/nm_debug.h - Source/winc3400/driver/include/ecc_types.h - Source/winc3400/driver/include/m2m_ate_mode.h - Source/winc3400/driver/include/m2m_crypto.h - Source/winc3400/driver/include/m2m_flash.h - Source/winc3400/driver/include/m2m_ota.h - Source/winc3400/driver/include/m2m_periph.h - Source/winc3400/driver/include/m2m_ssl.h - Source/winc3400/driver/include/m2m_types.h - Source/winc3400/driver/include/m2m_wifi.h + Source/winc3400_142/driver/include/ecc_types.h + Source/winc3400_142/driver/include/m2m_flash.h + Source/winc3400_142/driver/include/m2m_hif.h + Source/winc3400_142/driver/include/m2m_ota.h + Source/winc3400_142/driver/include/m2m_periph.h + Source/winc3400_142/driver/include/m2m_ssl.h + Source/winc3400_142/driver/include/m2m_types.h + Source/winc3400_142/driver/include/m2m_wifi.h + Source/winc3400_142/driver/include/nmasic.h + Source/winc3400_142/driver/include/nmbus.h + Source/winc3400_142/driver/include/nmdrv.h + Source/winc3400_142/driver/include/nmspi.h - Source/winc3400/driver/source/m2m_hif.h - Source/winc3400/driver/source/nmasic.h - Source/winc3400/driver/source/nmbus.h - Source/winc3400/driver/source/nmdrv.h - Source/winc3400/driver/source/nmflash.h - Source/winc3400/driver/source/nmi2c.h - Source/winc3400/driver/source/nmspi.h - Source/winc3400/driver/source/nmuart.h - - Source/winc3400/programmer/programmer.h - - Source/winc3400/socket/include/m2m_socket_host_if.h - Source/winc3400/socket/include/socket.h + Source/winc3400_142/socket/include/m2m_socket_host_if.h + Source/winc3400_142/socket/include/netinet_in.h + Source/winc3400_142/socket/include/socket.h - Source/winc3400/socket/source/socket_internal.h - Source/winc3400/spi_flash/include/spi_flash.h - Source/winc3400/spi_flash/include/spi_flash_map.h + Source/winc3400_142/spi_flash/include/spi_flash.h + Source/winc3400_142/spi_flash/include/spi_flash_map.h - Source/winc3400/winc_init.h Source/define.h Source/DigitalIO.h @@ -127,66 +110,52 @@ Source/ChaletduinoBoard.c Source/ChaletduinoV2Board.c - + - - Source/winc3400/bsp/source/nm_bsp.c - - - - - - - Source/winc3400/bus_wrapper/source/nm_bus_wrapper.c - - Source/winc3400/common/source/nm_common.c + Source/winc3400_142/common/source/nm_common.c - Source/winc3400/driver/source/m2m_ate_mode.c - Source/winc3400/driver/source/m2m_crypto.c - Source/winc3400/driver/source/m2m_flash.c - Source/winc3400/driver/source/m2m_hif.c - Source/winc3400/driver/source/m2m_ota.c - Source/winc3400/driver/source/m2m_periph.c - Source/winc3400/driver/source/m2m_ssl.c - Source/winc3400/driver/source/m2m_wifi.c - Source/winc3400/driver/source/nmasic.c - Source/winc3400/driver/source/nmbus.c - Source/winc3400/driver/source/nmdrv.c - Source/winc3400/driver/source/nmflash.c - Source/winc3400/driver/source/nmi2c.c - Source/winc3400/driver/source/nmspi.c - Source/winc3400/driver/source/nmuart.c + Source/winc3400_142/driver/source/m2m_flash.c + Source/winc3400_142/driver/source/m2m_hif.c + Source/winc3400_142/driver/source/m2m_ota.c + Source/winc3400_142/driver/source/m2m_periph.c + Source/winc3400_142/driver/source/m2m_ssl.c + Source/winc3400_142/driver/source/m2m_wifi.c + Source/winc3400_142/driver/source/nmasic.c + Source/winc3400_142/driver/source/nmbus.c + Source/winc3400_142/driver/source/nmdrv.c + Source/winc3400_142/driver/source/nmspi.c - - - Source/winc3400/socket/source/socket.c + Source/winc3400_142/socket/source/inet_addr.c + Source/winc3400_142/socket/source/inet_ntop.c + Source/winc3400_142/socket/source/socket.c - Source/winc3400/spi_flash/source/spi_flash.c + Source/winc3400_142/spi_flash/source/spi_flash.c - Source/winc3400/winc_init.c Source/DigitalIO.c Source/InternalUart.c @@ -928,42 +897,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1128,7 +1061,8 @@ - + @@ -1186,7 +1120,6 @@ - @@ -1410,41 +1343,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/ChaletLora.X/nbproject/private/private.xml b/ChaletLora.X/nbproject/private/private.xml index 3510694..371fb63 100644 --- a/ChaletLora.X/nbproject/private/private.xml +++ b/ChaletLora.X/nbproject/private/private.xml @@ -16,16 +16,6 @@ - - file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/main.c - file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/BootloaderInterface.c - file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/WiFiCtrl.c - file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/winc3400/socket/source/socket.c - file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/LoraNetworkInterface.c - file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/main.h - file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/WiFiCtrl.h - file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/Terminal.c - file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/versionbuild.h - +

a5xi`dh%-?zTZuTcr960uh%;r%gNKPY^QJs_4-sebln3u1;>@7(-~&KBd3}-h z>m}T}IX;K#ox}YrSDbhJdrDi2nTf~eWhQ!-;eI%YC-r*#hI0o<_LN?a$zHOjq###* zl(Ri01-b4cXnRTuruUQ-PhY?sa$eTNwMUfl44Om zLEnVw6FN2Wq*gh09xv#Tik0jsjEP58S_g&fDQ)0x#X1fRUi2)xluSu_Pl*bkX?^aG z@gN)1>ROMoIT5X{V2V~((4o~8NYd(xC24iVlC-*F%II}$=;*|oauDrAQR(cERu?Eq zt1IL(&7{>8jj3bO>VlQf>Vl?ebuI3)!KBp{4e8x0as@o;$F#aCO490zC24iVlC-*F zNm^a8B(1KP+gJ>l?bcHzw7N={(CP}ueFGJ{Oht-TSIIQ3u4tN8S2RtlE9!P6YTIkI zmC))cT|%oX9QONIZaMoMqkmlWM5BLQt{pkqD>(%?uCu&A9Q|opoeD7e=U3fJO-8Fr zEh$=Euw&EeuTec6`5#h`L#wOBX$bud*n$Q8NBgo=#AcMx>eK*Lj~8EsHF|wiHv=$cpY-G-=UqfLhLN1)mi*^NUPK4bI~4msUSWz@>+$D*$3s+2Q41!9_^&#UGE6Ggp#9K9fB)O;-SyjP4v8>K@v@lfke( z|1$qcNb@28)Y)Y3-V7#0f~NbI{gh2P*i`%HT>D=(3mFJ;J$&T_xsfGnmN?-%}CGwgr5D(pq}owUeCXQm4gqZ*4KtwXO^+9I$xFdAhJOJ?wwa6 zpfKvQ?1 zbU{j={A!=vy zTCVA5Xo>Zvrp^o1fSK;uF+LoJF@H_Q&*D;1TX8Opc#=lQc)7B~2=dzF`yx(zx0YqO z-BR|4QQ6_i%1U%{&%a)avB(Fc*hz3t)+%3n%wm0eF7f=^v?NPaV?FB+za}bq$7Cg= z(ChbUK^E$gf^Ufm9(sX-eZ0z#XjzuyBHADRQdIWQsO%i9fR!=-7IMLla=JGB3+c#+ zF@IijxHfHk93wq5pt6m_Oblv*ii|N=VD8VEJN7O7zX+QnP|fur#f&kJ%Nb*CT8r~g z?h#82QOQwF%zK)Nm@z-BYPrCeA2a4E3&0q2OUI12DVt7ZG2{JBRmSJF`7z_IvQ7U* z*@h}heT}I`OU-u}Z_QtDH}e-)EkHX~gAGN?`BXPQV!Tbw$0)Wcuc`SlxJsg^I@dvWLCPmXhMI=HauOt z6heDchz|h^Z^U>0E%IiTeG@+kb7IE(kccfF#m7SaF8wLKoOmA!<-EqfgBpL+TSTJq zKlu~VX^EdR(ZjpF?>GJx6TO;9&x1*)z{?r^Q$O&hYRpghaG#Qqetd)c_i22;*wA(c z@iy7EkwJWtGiX8XHhM=+az<`>fNiuRCpp8nJorAgTTXJuaCz`7!&Cnl8!Q>`RVR}T zJwBSYePzq>bF}>lf(Y_WxE+rhTf+>zx!4yZUV49;XeRKEazJj&?5@&b!c(EZb%@Cw@ai7twweBuAUU z?_J2zijE{lD^LkXE2zuSDv;o46(Z>pbF_*@9PJ#|4dbs7JTiX!Y2@H;V+&}V8PDJC z(E5EWi6!8#GkXKvOnd0a`kRbum(^dlK+hW_tG_M^d4USa!cUj$zCpsl;T^^l%NQmc z9I)12yd20dStj@Nc2lm*Fj*z96Mx!rgJhN5vyoC+gM{S5dxv^DF7YxI1`5m7yka?g z$14p|-|^n=_7+r|Gf-I(c%!#_Y8q$csHhpy>Q@Bf0g+@aN=rY6PvNgBL(d?5Alk2vwg|86wGN%|Q*KJJ;ik@nST(;hB z6+7KPAssP-6g|Vx@S3a$7P0-XtBZ!6Y1uT4!~3k@0%oJ9&(@r%r<;N;$jO$Gvtt)# zsVD4d=Us=Hb43Mo-C9w|LKjJS2@E6iAhn$#SZX^%<)mA}?F@ya1LD9i0w%XJR4$_F zxt*bqbV|6Lp#{Spxu@bHJcc^k8JaDFLTtw-#X(h*J|d%%GBha3vk&*1q>K*%;e&t3 zz|?kz7MF2CNj)N?pbQiNq4Tg6kGcfZ>_dhnw==Y`^ivcVMzQ2}hGJ1aLEnVwlgS)y zXQ&)IkAve##ii^i430-tIvN}YD)u2KJHm0ni=Jhda&V-#GpGQX*5^Kn2ljY7L+eo% zE!xgdP^MyhNNpNCVTI>zXQ;*L?F>cbD)VRh;=BUk4X`J_f@;vP zUd@Rbwjtk!oa`4+U6xg`P3i3nmPMOJ@&Q(l@pgu`K<8-`7)I-rIf#vd=B_S8F*jp$ z5{BCuDkxJh+|Cdvxt*a>?skSEiR}!5ob8OcG!t#TG1b=L{0ih`FK2_<6lrUEJA;MM z*xL*5q?S0ciPkF(i%$tCC=Cm@GZd0`#oHMII@=k4L*34HMqG$>-(UE@%ts3j6(lFR zTDKK`j+|^e|IxlI6|os5+ZogVRgV`(L2@RxGqf(f5nEVlh2%Euo)S=4F0gw_Kw;jF zS;Nud-K+t|K3SBU$k@kc9w2uu=wwAJA*bK=XSsY&%0! z;dX|m!tD%AVLRhA6mhmQ29e};Mg^$Ga65zFsa3Z#G-cZvny~E*O@!MSn!QX;R4B`vV-CI zb9|yK_)HTEe-MSIcaDQ(Mii7eOyM1Z({~RIZy(zM;5^iforW6WyBkem4fY-8>i05l zMj2(Kir&%w;eC5{j;*<#A&f7UnpjKa0@m~+)?`_#wo;3cJoo&qB2Lj?Eu#2#u$t3* zcK2U9L{H73eRxmjRxMULy?uDES-e#(u8S--nW9>JsaZ*jFEi`u(vI%v-`9aRn~KT( z1KcE`Q}%l}npi)10r<8@6!W9Xu`;{U z{Yt2EB{utmEOlOR5^}Fon9Bw!zovVgmuU+ejlJE_*zO|TEm)LnG-S?|tRp72HMnn{ zkD5-5ThkX2+m?=rZ3X7EQCUoE7la1Q^OxHRbgQxrw@c%yEcGU~snJqyuxHJm{Uzov zu6iCHyHzWH-{WYvrsnS`wkoeFC)l$BbKcE5V`BSh)x;m*hUv`OY9$-?FtyE6v(IDd zrhFGZ{!@$acdX&PtnB8n$WNHMB}`Sa$N@{a!Jf^unAkSU8(83pddrT9ZOh&w+6$VR z{TikY7p}#}4eEo>pQVNg>R4Sgp*K+I>EbGUJfcGUIcR)8zVmM`W_~rMbX`nre^SKe zy#pVGe?>9BoKw#C3;Uti&uSt)rzV|FFJ~tGwkJ{P{F%zBGgY%@$|uZ}%$4JtCcjTJ zf*xA;^N%*RK2_jI-Qt=-+f zZ^!YI-^F|ViSJDK6E~cO%1g-aplbtu&y4&IF1{H*dnxie=vI&qos<&?<)BAFK5`Ni z2j!qwK|XL2)Sx%P7Df5&4b+0(1eYkv$8ROSgKdfki;Q2l;4)2fWh4&D!Q}#krYk_C+G~{L3wi5C?=x4#8EZ9+rUt%S{gPo$oCBK7R0;S0B;A%l* z@;lhAfS9cg%E2CmxI_=h?_gLlS?8hdy-lopzZYC1cx3$cGs&Lb?c*P!JDk0Eog&#DjL92hKyctuVuT8UU1MrS=R_px7-WvGf-AF0p)}lg2M(zU4qIVGR$H0g0~pvFnYn;409O0;95V2ff&MlaZ^XoArTF16w=5rw;qp~fr)SLFCodUH?? z`b?3-=moDa%whC`e#0C_FBmY)Vf2DQ!yHC07&6RlEQZW>gOiM2u*2XaqZjNnIPM#$ z*kz#0=ml3Bm|*mRJ%%P2y80vN;YTIjYlF5i^nyiI z11JtX9r+(oPw1c=Y|86AN-%msr=cOE7hG&WcmwRoSCd{x!+JF*YS@N+6A8-4P)n9o zu}uj^FW4ewVarJVU#Nr>*n0G|DoQvg2cuT6%jgCB4Ae;|j9xHim`p)o^n!7P97ZqL zZ&DGX7hG>h%;*I-C=@b!!Rzurx3=D>IZ<1O^VM{gJ%3j4MlX1S6h>q3sr!4# z+N%MBd+VIr7b0#VN?LHxFu8jXTZ!Kb!;}RBb|!u<43qm8m%%-SH&J&;Uj_%ALNx#W z!n>Id^ABlGWd3c1k0K{Ko&RWGmWtShBz+k?C>o&Z@#1PMj$`^Vcwf=EY(1negFiD! zu3AK22JbgmFI*VpB=~^AymmD9Xt9?yz}P1>Co=Z2;tmqUU!k3}LhMY@m%#_6_)DcP ztIIwBMQ~0W*wH@*G}r|9VxZ-UO2W@tmX@e2-#s$Cy-EHt zzhX0d@Vv5KcFJ*)nC08{Va1*w9op`dU&gQKj{LyxQLp@RO_k;M4Z(-`3Qbk!cOsBN z`KvWm?M?e7+7XeM<$WumA?Paa=ZWsT_+*z4@H@4V#4I1wRBe9jIbhvE*2S-#_T05w>#z%O}Vd^e~{A)E4k1@K@6h=SU^SN09;z8X#n z?2g)fdv`j?=~SPoVU9OLVp2ertbK40`|W5A7c}=C^ugNw1$52)9<+7=`Xc`B08m%J zzs$k1x=Q&(Xk^PQNI>a>xcSUtnP&lyL5<1RntXMAm|^lb#SahP(1w;BLjzYgGqwez zYK)J9{;Z=>G-&sIG%A*D-`52?a|l=8KaDcXzc(c#WNq7UKVw_?D@79|ej-w{qgqLv z_TYVScgoo(`^83%}b6&snp3WZ>$Z!?=D1H9Goa9H_EOMn)+X z_RA+lGqryItp=2WK<6GD^;2^2{jN(15Y^uc{M1s&Su6OO*Y8PE4oS z7d=eVF8~QWhglKP|D4ejdQMy`sz8YqRE>Z4PULnhRrp;RKg0#a`?l2 zAYSLmxVgsH=AS!H2hKGjnK^j=d>J{K3=V$OYl1I3`%LaKk!?C4F>{)tytd)NlI$kQ zMupPjW4^@yKUmkq%h=VweJBAJo5c9FJBN4f+cAXAka4rAvHl2J@KLm&Nk;*u`{-Cy z*=;7a*m7e9_gl_V&s#vwh0MvO5h0(av2zy&m?c59iE*dqkRn<18RiVA?4koq3~GXk zWD_H}N`b`{mXm56CsZpJ7bmHod~jl@<|ugYU{&7iH9z^_RR)|m zlid(+Crp#bFw^+-zvLCHV5Qs^fi+z}$Soe+Gp*1GN|EFQig^4(esA6=KsX2uis)+F0!2zD2&HT zyUr1@Q|j@t=)bwOP|iD*?=Sj{>@#R$89%l|FRLzDdp9oVj2aa#}|JFzT%N+DCHr}0)J)N&L^<`wA=8Wv};IFVz zaGEo`%Y%;)afUR4sKC$uG-q6w2Oouu_b>*0#{0qE@RKh14DWnBZa!u1-a=-VK&icj%+-R%dkdM}3OIWUnLP@TEDZM+ zGQ*15-ohV(pP+Aa!$G`-wR7CPg+By8DQlA5vOfer>FC(FxdU_b55Z3`S9audt|a#s zGCK`+_ZI#T{3O#%QdBR zd)XD5Qo6nD)tUm`egcX_bbDFf8YJm6{4FZA5Gec}((Pq~ni9IbY)BJAx0hX|38mZ1 zwrdJ>`yH&o^%*`)z=@dsJ#=LvBnnRpBqN}F8X`3(VA=di{MGVAdPdWm!t@+XzdB4e zX?i$JTg2>Ff@7cVM9gM+v~Bt%5wlqxB4#7YiI}b6LIpKqwnB@jHIA4~I}tG(a$v{8 zh}kN6Awef%wxSoYd^%z_TZ4$%(-RT1PZx0Vh}mpz6fs-6F^rhaPM(2q?hk=5pSixR zxx05wTXSz;M_X%O@5XLmE$f>*+IsuCIxlJK?!&3g=52i~o$VbK^4y=<)6v$})wi}~ zlOdUzYnpp|+q$>)ZS36C-rL!2crcl!=FPpGy_>r?b*^1&Vr4TgXtO8lt%g+0>}}iF)rTXqJ*c(2ZEbg3&w9(NoVlj6v$vzOxfQKg z+tG}SuFj6I6}g!mo!!lSmoz8Cxz8ji*xk3Wd21gw0!~1z8G5t#$Ql!YaT!X53&-`B z((}6B*9?s&UL^QU$tYOHrlI}HCa;q4EX;i9GL{T#u#=;_@hZ7}94vZHp`I~ph=6Qw zmtrhZi1VxLm2j6@QL<25y>P|d2mrkvQ@3N*f&*)hX9 zUEJNLF%rqVM_IvED><)^scn{;|52uH%2%Ous}^A-l6gNSd~;ajgG}8LruMU@1D2W_ zGOUQbZKlNz+h+M2Sp124%Z?qkE&DOiUeMJ12bels_%1%aqy{k($-Mhm>FS~hT}+{; zi=V~Eb1HNlhG|U|sCoW1fk^!>?)gs4-UY(iFL)l(3rk~f^DbT;>o06G# ze3S0?X}-PKRC6ZPwX(q=lWMUuG{MiF>K$3^j8DY1CqKIw8%P=NZe zJ$49McxnaduR}0=<*A}{T>=`t@>EfJFNL8`6cMVEXPYk5G&xNRPc1;`{hfLBm9!j( z8T$lp;$x?Tryd8Mz1PD(w#^);0X%!{o$kER5%%MP2Xj%o|nC@&3--Wkn;eX2x^SqT;w3#&ZzJH|NL9Jr#5Cyb*eT zXYMt3`@9)e5CMj-o;^>Vd=MNevZgl4T zjd%`PJn9k%K4h5V{hfJ>VUG8A=52;K-rt#r4U75-`X&q$uiq%1gVxK=;{`oZv5Gx~ zG4ZHM>!1*Zb|Z4K?Hn4s=vj6tecTe>-v6rm@zzHL zrOV@Z4hl+_Ydi-9q`RYd4vIP6-G?j#!F49>$Hr!jGB>H3lcWzcZr-hy6a5TgiUM z=pWadX!NhkZ9qTj82x{rtH(osu8Z%(`MlL4V}A{iFBl>N zzrD2sv2gy6K{D)RRqkc}!7#niwDy9t{6~Xy;9mk=Uou37c-z)qK>uWrjPEVoZR-%E z=*x!5AZh_Okok%s973G>|C~F6CZq9R)10XBpUbr%CwnD(fX!mNyPe;%uS-d&m|t}V zRag`Y84M|2TCijD(pym+dOGsork>E}J+mn<<@|)td#2OS(B~adEL1GK?f2w;tXkNj zUd@SGv>{)Qoa_y27GYU^;`$Lb_|DzdX|inKN1 z^PYJ_o`uoa+Y9564c)*qcNVl>*9|=LMgyf`VH69MlXk^XECdYQz%%z00u$(eShKotQ##jq&ZOwZYz)}%+BUN+LxswHY4c#X_Yy6>03zBBO%P*eA6>Wb9+by~xRagLcviu`}fcp822@ zf2nTZzXe8`tvOCcdK@gIMX}&lbc98*&{P=3LQ`QB3r!)4#jnv74kNt^8pue0nM#e3 z=67nP19;h>rYwquCM=4DCc-Edn!3o#-+2Iev{9o$b0bT4^Q*e z<2lY<<}>GumfN~>A049O>@$33d05A=@P?fOSI2p0`NX-#@rP^PyAUneFp?)JAhWUN z>likf4n=CYEaBo}lcuMCisF%P`m9D&vo8T^vK$WZy(9{v~%Ze`CB4sw97b>Yro=oF=7#^+%Y3)1;*8LZ`_L zoF)Y+3^RXm)l;bXIaR`6r@AP(u&H^FVsM&NHRd#l*Xb!R^KY3QQ+lmJi^|VO{qt-S zoF>(rzhVkblUn&a7P~2b13va^5#ELC2MEJyQj5%F3Qm)n`XW#PyJky;?8^ej6k+6$U0{FuUr3zq_{6oNC)n`-^D6oPN0=qNl)p{I){13XQIcr%-I z0lxDOuIFXXU{=+JzL90SdPQswUmIF;7K-`v9zzM=Pt1YiAO0_AjZi|2_@t7aP&e*sT>;Y8kr?&e$yve!}R$=betZ;B8(>GV1ukB&-=38QVS5 zKR7hnK8)8lT-84?bo@?@=l{%`Xsz)lK6@t2n1nLhjNb^Bf1 zB%I!cmSowsNhmWGBxN=u0|iEziH;;?CQu1wCa6o9DUhJd6yh2Jk|R{RoQV#-YPq$o4NQk0p>$rE-+nJJW_%mhqQW-1p^ zL8QzSlGT1lnQ6gr?Q~DYiTI&+C^OAYQDzFtBeW1Lu7WEVKO_;tUWu|iMJYLWv6&JFn zFeV;VX&n?onQbLs(95C0i=Jhday^iy%%}jG*5@8eP-a?BiZWABx;&=L6m%#v1*E$p z%1p5&Wu{n?GE+>~t??V(6qU{nDKmkRl$k;oBxR;pk}^{)Ntr2@q|6jcQf7*|jm41Ju7>#~l$lDGP-Y6p zeFGJ{Oht+^Q^_=Crf8ZnQ#4JPDe874YTIkIl~86XT|${D9QONI?gI8ZM*q0#iAMjr z+!hi>Bb)*p*I8a5j{Y=dMg&;6})UXZtlaYhB+~XgsVw=+B5zC@YBl+)8NkkrrqBMD=^`^)p z1$7dJbv@0f$1a!!w_foe*9>s-N_x*)WFdr>ARFItLYTZ`& zI&!k7^B?WYQW2X`LLN~AR6Sn21Ph}Cd8BnE$RmYH$RmYI$RmYg@`xb@Y3!3l$%%}8 ztavMOvOlGrv_kAGC68GArIJV0WuK$;RL2kqdTIG_Qb_ln5IHsSD}F#FhCtcnnhKp7 zH5EEFY6?z`MHF!;q)sGBA^nI-jY8sgYE=qJQ|8pD33F=HMCjD0DL6Ggz#3eq#&@ue zy7Jj0SoG%C?i}5-zkhV-s@?tD_j%>KOB0q~(gclB`9h*#cJ$rbld4C8$8_I>Tc zgG1MOW#uOpv2vfDbdOut)7K2zr*jj1<<|AJZ)$DZ`T{~*nmgLT3Bl`5CH+!$;zTEE zsuQL(OC(bow55Od_|QHWboxJ~3^G$*wHe-hy`6m^$NNy@=C-6ovB7ZeTif2f@sj55 zHWN%3WP)v*;HB8Nxr<~Ld=*LL-wQOwd z)2u`vkZkPS+-q5h_R|(Ek-Q3W++9N;gx6!!Fz6)L67~7i4#rB9V^y1VOewAs`qolT z#alZ!wRs6sU7e)XHmt!LGE8m4a940``=<7u^>DA9H?1N_PVfIR0iIJOb8FiGU z+qGk#Ug?d|s2ljV7id_|MtA_@s!TEn-RdBwMolszQ*!Yr%%pAGw?o5Ugro54+2Dst zyZn-Fyu5_h|5$ejtx?7BJhK+}DIG17bh=7KgLTa|sFtBRN$;y{dZ>N*FE&WEIt)_YIBi56bEHPX?ub6-Xn@jqL?`d7^6O^z_?A6`youbk z0HI>tW^m%*Nns0rL~%zi&6KImoW$5gG55!g`3Vb=kNadVexB*GFPam>6#485{B}3@ zwXEN~X@iI)MkqwAbTp1xO=5u3jIC`gn_>Lsu65nb>$DNsR14cT$rDZ=p17o*id4SL zDEr-J9hIs4bvQr~J&~x*kjf=)A6=s(VH653NknZnq^W4l~YYR7F< z&M$j2oRtXX5}p7mR``7RZG0uVamz_un(n^%;ce8uCIyd#ChP2*` zoSN0VP*-9gA5+#8CvGsu7Dj8?Xf-Br!*OqXp#_OMPEx>BBQ$+GVIfmh|3Xr7 zr}PRhDiSwxmMiQ2bjeQ??vlN2>+poSEgCz;mtMdup6!;<(bn0GJ6H50*uH6PXQY45 zOO!U{4byqUa3(8%avSm1;uDrVI1l%Uc(O;Q7^lC;DaPp~rx>TNnfw&vWSS;9#W;QP zQ;Z6`rx>S~oMN2*0;d?=j?&@eo?@In=_$tPsZ)&c5!=ese-2{LIbvIR#^MtqV8z*e zV_xNoFF~a4UFg@Z;;;S@GJ%@@&oDhl)4vGQO`6UjUX{r6h;8m26<M7E8rwYY;%8J!RFc#+p77}je5kk>MVBh zEI(%7qAh(swRrxiJgUaM`g`%mu$z-e>Y>uJDDi2Ln(aunT{ko^J~o6WbkASyGk^DU z)b!ydoZM7Y2wVi7!~-m7ww)9d*6`qBiLn?4{X3sU7-F-!j4g00K}mfY_3!Yh{)iKuDRhfg0bK0)ki@20SgD%>XP#yJ$yWa5pH~XyPJ7tW8xO5@v zkp(|+Y7P#5+MCnWKia=10zT_CKJzPYV*RhZi8sTn20W#JWcB}zWqC5T@p0sQ?l{1)atd2S{pf&Aed=}atBIeTZi~cskHQ!8A?7S(oK#L zF};+uWM@Wtgay7+L34`O;9f99deHNCX0$7d-a=nm5!-bveIJ%0RMl8XbtN{$bW7A5 zA6FY#V0{$}ebBMt<7PwCyiX(lNDdclfVO?taFB)zopyFH6s;J?%j)^d0ycqacZljm zj;uTni)`F3Ep@t-Vu`!+G-&Wd3?N7Aihu}5w4zb4%$0$To!Yr;ckUiqkJ!0Gqb=MA z@XxfICgkXr0`zgThZ&0(b59{kE?vw`g(!LIT-#MhYFj=RlN4JDk=&}eEhBsI;xd`N z%vfdh*3Ctv(e9yvkx|@Awn_Uk2QkD)hGE>LCUh<)*??M&7`rBPK0%!U3I&K;Dp(>; zXqfj2Z>}Die`CN&5*$2`or?gucbT?EuZ}mWarEDb{Av2j%rOSnBm?EWqJx*@vvOJ7 z!NofF^^V}qAWKdJ+z%*XJ=TX}Nkzl6XGUwurbm%G1|A?7}&t5IB>Gi}&+iqyl>Ri1jV03-ecIjU-F{lYDGRI#9md$4F*mIaCA5sN$MWUEF{>J6-@QRZrcbV4ru-qe- zD56&~M>TQsLFjQDe`}VA#q?!4C3gH(SpeqvYw6hW*OZ-0WwGP$<*JOX0jI={zbbp` zyC~aGWvM4Jk#*ft(9~&XFmEEDO`6BLx`o7HE zGmt4W_Y~h-+JTzN-#Sm^8@3~~#m1Ezo4YhZxmWdLK0uZSV>nSSKbSiqCqI~3uVM1j z{Z+rZ8#3j=s!V3$jBWT@#|V{=hULmxEAcFCW_6q#O2JHX9?-qCQD?Pv%nG`XJR2I zI#dr(^&-ppSLU2(iBp(3$;8?yw#0I-XUX9TF7aYF2okl&y%j8XZUqP{Q05(3>*ZlIdR_96B9{GquWt z?<4fUa%X;(2hS35CRus#D^DC;G0C8 zDF_#DBF;Q4557XgnT+MZGen#jiAW9_97Y}joRv_Uzt`L1eW7l!T zBG>VytQ*E(BY0%|_E!MU9%2h<-DIxgED6uFTPuEnFR|;m=t;Sb3zl*nS2^*o3th(* zO1X{;m~$pHk*KvhhZ)y*&1fj z)Y|-{>$u9fjm41JZlWcw<0@U^I<9csH&C(5RHR(TRWj{5u4vkIT+y`axT0=HqPD$O zTZ!wqN|(5fD;)OwSnd_U%mv%Uc?H57U{AiTQXAH*IZ?wlLd(Z#}$() z7`l!NR4$EJgGi5zhpSSq>$oBb*KvUy*Kv44$VI#{)z;yB9dfc4vcYVMw3W^2++?qx zL)-xtMq_U;+(9j|>-e3JFVlbu_WC)*9Z*mj7P^irB<+e_#|3m;$KR8KZpU>zF2uU; zFMOQ&7>0+mhUjYDR`?onG;#v%%Tf`WQQ|sI4N&!XaWmFu3D@yEr6CE|afM1;#}$?f z?8Y5XICdQ$VGS_$$)e;$#y(d3BjjX%oWnm_A$FF!jxW>8fRd_Fzx`qQ|ms7JD@3xJD>@RJD`a$ z?trEcci>H|!F3vc7{Ii$?6ReBgsz!nJG16Rwlix=wliyvv7I@Yrb)IlYbM{$RM_3l ztSQ;fta*X$%o=ACw{$zRX437GnnxEqo?pq;%ZKoXx0m^Gh7k10H{MPA zUl_}jtixI-DZOrJj72?v_F-HE=ASDvnX5to-v}&)C3h7S*t+(Uo&^?1NgsGLlW@epJGPV z#^sExHLd^7a*tSI3lm2*QTPtcila2VLDllD)o7_%4q2=Dvu|Yn;;QfCW1+@F;7|6fh^#d=4^wPaUQ@GT zvQ~k@=b0UowYyale^ZO~%-U)ti~q=mY_rttRm{67eku>Ns0yd z4GKvy(UBy@1S%oL1a(O<1rnr~LR{s>q?lq6Db~QcVf;0MN5*eIoutR@YyqvCj1*%@ zJag|ZTO8nt7%!FWUbEKA>?zX<^ohHxy_evyf%41^NkqxVlFC43I#?XwsDZMiqRvk6 zeftcQl}AtaM!2Vr86+zYYTS&7dgBHPbpTKoDfn14;HMdsGz!O1C z9ZDyqs6)Y0)S=2rD?{o~p%ir}V3Imixrh=Yb*PZA9wBw81;dr|Jr(DZ#v)JG27cjQ zEs>@UwTxU$N^XSYeI_Z(Cjo^zR7ttQ0!q{g1yj_af+^}yLAmTKz6LrETSZZqpz?>LziY@FZjEhHAIvN)TDn>||T+PA3i=Jhd za&V-nLn?r#^|_B{p(&ycwVo7psGxLt9CboLr6e%RI&uo=gzD&G+}DkUC8E}KT`P|=tkBXuZP33VuFnmW|tF5^Y&P|=XWx+1rlBn?f& zb?dXnCaFVJo}>;HOHzl5$vB9pL&cKRp<-@hQT2AKx`aAZ=@RNt;ka+0Vwb5%QHLs- zrVbTNQ-_MCsY6BGjzn#Ht+o>CP^C+#LxsbBAItT!-!b~fRZlef*X8ygCwm*G0LOKf z7l@-jO&wAJM*sY(r>M!OL#ZW29SU}A>hOT->B!H-6TC|us>NyQP*J(cN*yW?-T-^@ zr%??W)|;1{s9_uO&B)1q7S&~072A}i4p|m$8p%ITB@uNfiqcUhwB8hTsGv^5kUCUM zreH`N3Y4S{Rm!Cf6-iKs0y)$nBYLu}H>TP;oIedY*{y6an<8yZQ->^!#-3Bxj73nc zqq(;g!|L2RtyXSd#Bj?#&oH@r5yP**YQvOn19qmDd4*we|DxO~FLS>Mw1p<&W>#Lo3H7a1nE2x8}XnP$V}7C~$U8nVVfxkm_ymb4hi zLB+PW)m_H6qX*Y&PBdE1t{Xv4wvFA${$USNOZZ^0UP?m6?S*epMa;Zv|4G|o=2byy zT*$mCByEeCR{xjD1pb zB4ZybehoR<4g5zd#LiOYmBoLD%qtstoXqPtKpq(L%CG1MV_r2CGOwBnnO9ALdEJ2` z4)gj5l4M@jfKv*YSAM5fWnML9%&R7hdDTS7ylM)}>$g~g%e?*sz%;)X>qB)rgAax0 z=L$f%`ul#H1ZS0e5QK2B9`E0+G~q=bhb7Ff#tP9NW~#Qkf4^p~c?A@}ufA53EzHdv zti#1LGEu99N_8^B+ot@>S%%8E-aBZLy}x1Jk1d64?|oJ$_jw@ts_;lR0;ooE3AJ+G$c{dzrel_-pv{ zJI%sZTgAPEFY~etGIhC^TE^P#H>vWF>Cvbbm>!L4JiNgK(;t)m zeso>^|9LNei5>jK`gW)n^ZWQ&={ck(SL_ zco%w>O_33`YzkCh*%UNv*;F86*;I%h;elmSG2gPejAcXliv;(T?>mbIyX#p4YB!Z- zlR2^Ce5?C={1e#hL{7|RCs@p8r+l(9_iT0w#cXy0Ms0S==i8!avr|aS4W7+TGkTw_ z*SNL5X%QbT*J_Tq%}(>k(mSx(DJTo?z-FhQe1ruyI|XAlI|b!aMa*+3{RUIIe5wd2 zHaq3?n*@wE8OEs1PWhrXJH?_lJH`BVg1m!9Ueso%d~7^E&|BSCvZc@`Zc}dU6cX;Y zotC;zb`3uCG@F#)5pkOx1whi~?1!<+3T$>-PRwSfpfq`4vr|x-T*LhokmmMJid8IX zvr|kO+rL~%F=^|N%}!BiY|myVP}F9pP}qz`o1LP8UCM&ZPOt)-ouF}>on{Z4nrO3A z)UzF(pIz*t?R=Y^3X0n76pPyI6pPyI6pPyI6pPyI6bn}tU8YYJD?BMyxeIJ|3I}Zi z5f>N{F`J!o#%*?r#%*?r#%*?rh8q&4jhNC3Y<9|BV6#)$YxnW&S!{Ro{t1=i_x?@U zt)QfbI0V?Q(|kbe{c)Qe1)%pYDtZqk8JnGy60_L}c4V8~pvq}3{sZM;sjo9zYq4q^ zx7jHgve_x%O@N)na@P|o)};dcift)gmO*vyMJZ_(#X7}pcFc=94eOOhzRgZ+pySjJ z_tSD^41&>IGo+vnLeFNWm<&PBW+zb8W~W?Xo1G#No1H)*o1J&1(wky+9nve6*0aL? zl}d4&9W$e{SC(Iee?mqlEjMO#Qcx=98J!f8dId%&0YgTo4^cKgb~Mvud60=^UswLm zq~mEFP>TPwt|)&Jlr)W~Y3i4zATj22Z4NutZV(9&b+}?%5k!TJPFhyP=%i4A(Me%> zz~OK|g#)A0NRcXgPlZr?W$&!m4@&w4>Pam`&qAXUv;VC|r)kMY$bIZjihVoOJ4(~j zHTZlj9?kbz$@BOxUZCcrSWS5+#cIksDOOWBDOT=C$GvAb{ISbQ=2{_vrl(&}s5vQ? z|5K`(o-}1niq(WUDOMBSNwJ#3NwEizJz{!#FMt^hjoX@Vlo#$B$H7ObQ+MD)cV<%q zPH5}IVWs*%qF+1PaN(OxLOX6Y<=?t(xt6UvEQkL$@$&PQHtf_*GTDH`d^WV}yk zr3}BGCJL!(0-Y_Lx%%cNp490wjo#nb(TZb)wl#HhZLMp@l`rJtnW0;naUP)&mW`r3 zJEmh}U45ffM1o&*fFDP^4p++YC{xG@DAPzWfsFxL970W*(+Pzl2R#jE5O3XJRO6NH zGb4va>1k4_RrVw-2{S_itvzmeMrpFeZT)1+p|$tF1RGQHrnC7gJ1R?h&A&Utp1;qwKYxuS%biJA+5EhTTZDv_X*S@b^y6MU*4;Dhqdm~!#u_;w^FgB z&nt&@xC<1Ho=5I3R5W}Zxw}ZQBcDg^R1G8B#6d9DR1&=M>V~=pFL`~wHNRIgVIMW*yisJGft%<>mYjz20+TqpY0emiie z1wQr3+6o*1^Beu2Csnb`sp>VwNlAaQS9nL@S)EvUqZrch-=_2bB_Q3=A(TB0a1yPl_Yp|eP7!?sNwtWQ#pA5srF^-Rx68a4uPjvDjGg$0&9Y_zFWZ7wp}%v2>N zOrFvs>JS+4WsF(&e%ogGy`sY_q5V9cpuMX~OS-}<>4>7e!=e1vmO8$}wki8zk$;Ht zz1qLStDqKe&5IW>*ge)S8*4lfH`q1>uYfnf9{OWg_zh9vH@&EEz0AU^L(|aiVH9He z%OTrl5p-JELs#JJ*?AtHPAZ4YIIEhcbH}0RL%Pi?yb^QCdkwABs-j0i&RDtuB5}qN zhi`QcI$7Xk|F}}9Qe+!S79`& z9Uu74mG^|xS@8TKlj12k@SPjM_;914!@?b^iY#fRc~y&W&n;@7!p9Gc(*(X2^ky+>l?-vMw*z)RO&7!9|Wg|Dy`g zVst_swLY`LFx^Y0`zm(e&%#QnC@nQ5C*yzqEX7OjH^-s(1TOMMVOv&%KP7xYoriyx zbCHB&l@@0p+`ai6VW}uQR*4HDoI--5j7m7YTn|23U!|>zBOR-BKX`Do%C(7u%ifBA zOIje}Q7>PL`NGF4eNMRdSt#JuVEm28I9&>e9INyrVJ%&6-MaW@)ZP}8m2EG6Kib%y z`*w^*BwQxunZ#TsWE~626U-wESR~evBFk1J9%W)7-@QoWnOMYjLgKf~Q)LprAf@^` zoHmX3K=NJqyNr~ImP>-boLaV0%K1msCq7?HIaR!rS>o7F5XWk6IOfyBF_{sLZZi0L zng?EN3J4AM)m7}CGT2YtGv$p>ZVkWoY&};gGX7VDh80FI`tXX-*unuyL_z}$;R)Dk zwIVdiQcjXcXsD%}43W@yOF5TPPH4~}7s4D?ghpPg-=n-;bH;OJCD4WgJz00zPY>MT>wTJ$JesU}TN0i%2Utrl6>HkTs>ZqnN7LybJF_dW8OAk>m zXD0e^!cOF{h#$0y$bCQXJj~Bp>%RX*e{LQg?cUx!-qYVZ z+;{ZdnzcT#J#p~D^(cReFrQYa&!8MR)eB>>Fw956SeTE3^g}VTxe!{xc$kl(bjXFn zd=#Zm&I|KVBnb1-bSTV6fFR6gH#LVtE+=>u4LWkF*CoKy2T+qV>o!H04>K~%=Quna zFU&_|M8kXpDhTrtG#uumKqSmZA^PouFdxPIFrONh4dpKq+*iKuG~nrLSOaP|RhSQR z!i)G;_XYeDg!zb^SeTDsu`nOy6JMwo=A%$7%tydzn2+-L;VTUDQAi>byf7cl=y|!X zaTg{%H4zJNt>%b_`DmV4n2&Xe8cgydXjvd6-Flrt9QqhKt|M?rB82Vp)6`b`2g zZ!+aX!+ex48s?)|G|WdaznviOpph31^HDxF9v|qf?z*HpZEsUE|Px=f#WLIqp%l)E6zN8zAtAmRce zA{OSOobfOpMdM*UipIly6b&~dN*ghy6@>XHcR`qs!d|`3QF8FrVEjr@8poloJZ`QH|qaK8l9I zd=&5|z|P_sFj%l+UByE2E4HP$hEXpcMJZ_(#X7~qe3%z?8ZQ113SnG~oa!Zl;#>2y z+*p{8f;tGjFdxNa2zp^Y0!71olq($OqevvoN1#xc&mT-(-xRCsQ1Of`s>xlIX;ww* z8V~bfW>og{(i(hh2V3*B*yz?g#boy4_66CRrzvNFHuCWHBU>Bx&>SF6qL$&QBn#?-GV47 z0Ygzz|4G@QD5)S5%f7DskEBEW1LZ>T)xV;=3^tYYZjjT|FHJ$L17t;`q$mNR4p%TP zClV#4WksT-6q0@r-kPVdc7@Q^JcZdCSi;>EA7Tkm_MQr%_{!c{@i{7c5`R$((X%j0 zirJ6!Js5nRCGnw!Z^L6BA4Q#yGCt}{*mYyJ=J8)NgxQ*>DQ|0@ro63rn!?t+bC4yp zHSaPc86Q>4J!>XDivLsUm>i0xDYG?C6J~3kCcLeAn!?sRZgz~sNBtWB9*VXLyMtan z6s@a%b3@xE+-=)}2(F@nL(%f`rPzR|F7Gbdna{A@qDQK=dAAkE3Ahjqpw{Z@n|f_)mK^LB z{^GUlY5as8k&kyA?S}K$qT~{i-Y4V|J4}*R@V(b_Z1TJgU&7d^38iM6n}z25j-z<8 zqV#v$a3mbaWp>xZ=uq3njoSw{!cNdex(!b!blXx;_$~_M=e0dF2j9W!NBV{CXyo{; zc*BX1?r+vSPWSTh3w7?vD?sT{-noAuTdyW4$oP>In3p5#cr$)Cs{no_lFj&$f_%o0 zWTd`@`3{-HFImLhnwWnD6M-M;y(*TU8I^$_NqGSnKaxoYek3F8JroxBk$$eixN55m z{7A~XU@KLcUu04nn5s0X%8(yP=?mwQUR(4w{NY8`*a6G6U8V0wGGf+|ZEdlpDg!@~ z0`o5G^a4;#b;5jL_TvH1_$kdJH zDU`lPW$ea`*Lm!jAe01IT|9KC7iJkYw`faF(o~OP&_RyM8 z4~27r`ztR4oUlH8Hmx5=cUIiqfuWu?Ygew!ty;VKl%C-|dxnQj85^D$?a7}qv?r&) z(VJpRd*EHjCk`&(0KIasDNEp6;^f14Q8+PQf!h5U7?(KZ5us;%+rD@coUrr2nc8_^ zmYyLWLSoHaF@CzfF!3_PeG1NzeF{mZeLCJgDZG7PGIq|TJT)$*HrF+8#5PXL=}?f% za`MT}P^VKtF3Jgt$=K;qkV|rcx--<-rYOHofSR45&UQulfs*QMYG}5cor=(!l0pQB zbDpO8>7BwW)N)=UfSQbxN$0gEQ1iW(lM}p3OvdS?({=`MmzzRe){PH`%J?TvJKf9( z0sUX2fVz(MF3TAZ8DcU{)ge}Yi{)G(keG~9e1mJnFBDWv#wlI|;S4GuYS(YZV$O2* zC`22OfMJudbG-rOOPQP-AoB(T%9pZ$ka?p4{U!n9O$G~@jGcEGEMziv-fggu$=G?1 z!TffDyn_Y{nT(xV493Re1HIM#9a{>0;x?sdrzlD~``uYEmAS=u-ty3;N%Jb!Vv4Vz7|O*l9JG zG`8*xb=nLjZSCz0b=nOojV&f)=UjzCCS#}5Kw&GY3EUZHh%r#?B5!BPL_# z)h2t`(urBdpvH9RoS%IXi&A4Uc5+5g$Ykui&R`*vvD0m^kjdETF<8iC?DQHeWHNU0 z1`AgfU8c{#QIoOLZ{VoO*cmWz&^8cpfdRuNW9LExMoh-e9)m_q#?FvIBPL^K*r4Ht zL}?=ij+%^}iwqn!89So}_S$_s`x~}9djEt{{NBGQOS`GNltY01+T{ac?~j;_oxLIe zy?;^BHt>td*r_U#z8^LjJBt-Ng2~vaDLO$cmrir>Cn(1=89S}TI*uYHW2eoap2^rb z*8tuG*jfAyib2J?l;T%xOYsjuafkSeMX^p1ld-c+@}f?|#kb*W#h8qp5fv0M89Sq< zTp5Ef#&Tz?gkmyw#tkMzP)x?oghC;cv9s53`6grM5`zRLW9Rh>c_w4$jm4j# znyBlWl;YQQsQ4S8xW8vzSrw^k#ANKeMKYtZSC-e~qsg;*I#-ozyN7L_&f5(r71KA* z)drG!8Jnl`4h21%r*lnt4`q8cPiHceiIebkS#H8`LYzXn&7-vEmHEUQ8NTnb_} zqBc+G29W?!hbwsRKw$H9K2i~$i0kXHD)^{@qBc+GV+M}eJe`jl*w{RsyDOHn1Sort zQha6atav3T?nkL7wGcgHHc#ghlHEya#7T4w84j88jGbHYNpB@}kvB87^Xrf+=Eu}| z{1aKx3`IfOf;!{p`v0zI~W^hdavW)W5X2inSWZy4YX7%Uyaq*s8ox8Yu(6Srs z&!C}6EA6Gof2PQueh`RLQi+W$2+=_f6P9zX{T|TB&rb<^=nQ#|jknubGU}K69wkiSEo3bSTE!Q=$<+QdzDhw0si*xQ- zfsYm6pf#WruAeK;KM9l`<*iuGM6V_&NDNxeZUyGPlhpAy;P;1%MKss2WD|pyvoFXe z1}*1m1u8zue1}Y;nu)tLG4JzKD==u;uzNydE`sJ8gO+oLtGobc&~m=!rHw($*_buL zo}jS6pw+6v_)eK`3|h`1!&|wZTFfufoRt?bRcTW5J%g6B&>#yolU`f&N&I=AO68kp zz8bWg<2^BbWLsNo^fd-8=NtpfyP4#`p!K{;;;W(ZCscihVXXWRQ#(y+K@qcETHJ*{ z)oP;T3|o0N;mf=%e_@u(z0~_j+iz0yJ%g6>HV-idE$8W(rUCwi+3zYdnj5>7GgxlO zzZU5xwcy{Gy0LsM3b|Vq;)GfG01G{{LbEJ*H<|9MCr`uEf~U#we(I^bKxa4H?p z>OgdR!nzJYr7y_{)jK+HaemY@LhV_-C%2p1aE{&x_1Q1uBKybfgXIm->zEp$AkE*q znOKFOV(Tc(QrNR#VOm6ODPhVr8FHfO9>E|rPfh%tjThMSNUeCEx=tyE4r-P6lN)Aq*?0w6kyC!A|q;+ z5~#o|C1}_zr9i|ir4YX}1GAK3zFF$mEE~#SB)G49Uxv1aZV+8+Hg5qW=EjMPCQcwq>XO>b-hM;Gb5-4hxQm(LBN|A_JN}!Ng>QSnRy1pq^ z*P-J7pgm_Af3Yf3*SJ}VnNis*%jIHE6N(43l$IMaODQN7^UP8TNxcHIlz<_#)C9hj z!e*%;6U)A?{2J0xg9BQu|Fo_szk^1e|6vWNpG!fkMuAz15+Leu#bSJMMa)uKmQKXR zETvF^SxVsovy{StS?Vm70A=r~5Q?wtofYk%xDQZIY9V?Snx&ZiZ#GL!OD2qAO3H#^ zigq43H!O7?|HXSu&J9bwMpJrjSn7OD>A7L4*J=vqhF#Arfnn-4Bx#sxz*niB8%M!wdDQ*SMY)&^972_k9R;ae|?w0Pp zfgU}dAl)JsYm{hc8;3{tbdPV#kB;#mn{=BYCk?qXf6+vKs3+e#v1eC))JmUg=ov$A z?j9SL9se|T;lNQto@U7P6QiT~q4Dj*qZbYg^)>D3?rYn$Fl+ z@O8Acb>-?C5!GO&ryw`C!BT4I?i6$eT;|&AI_g@i%oOC!U0v`iock4-*N@gW9>we4!(AuIwoj6#JhslKzN!tMj z!nZrRVB<(;?3JYmlq>G;?S=6hTS!;y;K#HlXZc9%NunkR1<(zo@Rsh8Ms$TsEPE}B zoz1`-wQMlTW~7@paWsp?n|6yQAL7X$Poa!b7`WxQpynme+L^q=E_>C9B5t*~Er3IuO2K{+-K^|0pARQ_{FntuW2J^le!BEKHptOqRjT8(biq*iNTQcJZGJzgbxh9?kMZuhF$e%73sklKu&3VWPQ z(eJA`8~a#K$BtL=Hn8l&53~FdoElXM5-7&T0;Ts^ z_NcO2Y^dt7c1@_p;fGMpnk4@mh_XSbrlMpc1n)3iyZw2eZ{nYaz zwk$@DJU({LMYeB)%;iVB$MQL9Jq!(=k(QvsXMLSY4G-{0ZgXYk_ z!DG{~08tdP$1@5qUD!trp4A~SbKzMWf6tkrT46_ zy=Wx1hn|6Mi=_)}wzUtG*3jw6QvjO060KU8T^alCwEi0WI75m3_V{P%$MIc-GjOmL zD70ywP>SYudX)EsCMJ3{K|#hZWd^Ro z11gE1>&w5(oI6a;<;`T=X;LREy@0e;=!^eaw6HG3n4p*O&jEy77zk;80&}ujDKsebw5y z1TQM9WCNXCFCnzO(5u)#u>0tJir1cDA1rOL4>oLqRw19_hp}AvYk}=w75ZNbY>)aB ze^36uJ=A>}UP3R?r??PrE8nL`c?CX21!F!%1!?qRW)teJVBDvuD6M~CpQ55P0D3+} zMFO9qrb9kO0Ro>Qw}^>PQSd6?r`QDC?L|#o)@=%(A~Vvb_&o|RK1Goc^(hKe;8PSd z>{C=A;!{+JPJ+OvsF?3l{1wZFHSi+AedYVo^cm$qbgA7`K1Jq)$?~o4gJ2Cp-9=8! zrzlv=r>J~lc=ddW3dMYi0!Dp`%IEva=u=ck+##M%Q8Rib^=sVcqdr9?$9#$k#(atj zid|Kr+9lLo!I)1`!I)1`!I)1`L9s*!K1BunCV_wCCaqY^r>J~UpQ2(>pQ2)ZJ3-z- zBQNSxR6aHyALy-a1`9M=h;LJF?G)lutfoU{0lNktx-==x#BrY@1whi~?0CedsO7|b ziVDVjiV8}TYpA;dQJQJQJ>dpv!ii%2Odp<>hqCQ21!frPD6cr8pX7niv zR^U?>|s|JeTs^DzOD1KKaKblRZ!HYs94mes94mes94mes94mes93nN=rVn( zSnLucgt{wtflpE4plu-H0>c~gDJo~&r>JP$r>JP$r>JPSAyL|hDXqY#sN4lUMTNa~ zAJ3+-VrTE4P&t0@-;`Yhio1?Ofc@I#17h!w`xGevy?;^BZb~vfMJXlbQxxpTKE=~i zPIK{>DJSGpRE^_4MMXnCMFqSGu(SBzDFzkmDi(@gu`R{F0>ynZf3YamDehBbUesy0 z_%3{$1U^L(6!$4=xiO!jf;tF2pQ2(i1U;XkKvAEfa)o`0ibQ;h0)>2vU!$6+>ziVA z9V-5JI^&A?i&c@j#(j#+jLKeF-iZ&NP^i0>8}lhDC>8U3iV8`+0-vIQA)n$HW#dy! zGfkEUnOOF9Pam`&qALfv;QxAilPO4ioAf_ z_!Rjs-ebn6s435osK;PpmqvIX~1l-fyMr zo)eCQ8uj4<+YB>gdczJXH$Ji(Kz;Y%;0CznaP8)2fX+;Q5x-~I-@@+_3M`?7k~vtC zTCF=%rW_NB$JwyruW z8N)g|o2^tFYueOOXQg8(j5W9?2^&mZYTT4Khn9S5OqE1!oTVXN5mnEJdB6rbTCT34 z0UVu1Ri9kHwW9-9lXu?4p^j>KleA?F52vzIiQ+czB zIF*`OH?~=BxE3sv?k1sR!jyA)LzZ{tQfnPHux4XqRzBC>(YCFrlg>M?rE|@Vo9gO! zT18=2lo4=ALC1y3D5$F~%p!~OX)zY)0$ZCLi((Z=X^pLP=;b9H!{l@EU^=^`k#ddAjV-)PYgUw@lMxanVGJ?}<{H{s z8?D)43TjLO9vNBPTr8+(O!hx-N`~ow;qebgXVuBdlqW@xcCKo<(!prcP^qlq~oAc#p6$Ohct3 z#06m@YYm?(-Z6S@Sv&5iz}0OF!#oh+(>qWBWmyzv(Z=JrY^lecYgSd1$PQH3-XvvN z)nOWBdqnh&ZPwy2QKbg{V5=rf<-0T1szGTG~zo2{jsz&@CG3_hQLhx0B+K2G+rmPX-*#*KBncFZF$3zJc& zIDL7Ter^tf&C7XWn1YTFzsA#6tuL#tKNo- z^)^|jMj1SHLL8@sIZ(LH-hO93Jxn%ZLRd^^Ul*k}cXCeevd)OY4Q;P(w9brT9D3~? z(D4;v92)q9v%&=JHrCkz)`a27CvIXEUKvo>5%EZJ?1islFMKw!37*1$fxXa78FlU6 z%j2OKgV$Jf?bcUfBtNh9aEQWUA&#Z~i>x=QoTuZ(cA$a{n9I9l+&5VN70OSoI@;=5 z_~3pV!)5x#sBOqKH(?t2Nu1306kliIY5J!jChE4Su~n4&nJ9OT^Y3sdm3FpqUd!Pw z!`ue6sP)AN#KLf1#FrvqU44BcPO13k2G! zcC@vyi9>LGb6aO4+Bb|fw082X*4B&|ov%hHSa~Eb&OY$X2o$Oco??5e^{){!Vwhys_XR!? zA>*JE%qG_Vkw?EI*$Bs*42RaX9Hu7yAM;(^)~>deI-I3u7QcWthd^Ea0&Kv18Nzi5 z47{bTm3Mn4Ip{9P7Q>$;CfaFd9v?HxF3 zB-ggR)r2(ZvehezZCl@|gGCpuzThxPSFAoME>qUvKgl-Wo*5|{OM9sY&Vy{)D9ydK zquD}01mBZUB3+VOuY7U@kY3ZjX%8d{Jp#m&6pa~K*l>e||AnF+-c+J!Fz>t}%iGXG)n zd!8R+{Q64P+UwWPmoL8h{(+H};a&va)ai#FKLZJN>h9+aisJKc9X{(ib~FqRfwx}K z1kk3T@%-rM#0Y|N8WeSk5iHQLPh(RW`HhG8FU7ba*|Ik(mMI?Dy?tQ!Ks`?D-}HWd zJJw7C)HFh1vjQ^#Fm@0~lOm-+ItTjp2zHKQ6~Oq>39c=QRFZ3KkVuOnRsP2+0}=E4 z7#emC`cGN^z;48`jORx8<$9%ZSJ*eBjp*Nc-I)xBct2W71EJm~icgkmP}WssLwwAf z#*PkL4tY}pxUC9?$WUYtivEC22?s>VFCb;^_whw-e?XdPGBdYrB~$V(JvnV28cmz* z16s;VYrZXl@Gx?FyDvn;eM~f?yw|*fnyrF&P<6R0s>=iGLANR;KkFu2*>iGUr~SCi z%-4#53n5_M#Jcve@k>S^|8b)k?yO_U5+%fLU~)cXlg^xh|7Aaxu1I_RT7dk}B6z+Bl?DsVN6UeWEiLOV9I?rPYX}9Be{d z(xryMs@D4G{dbp{@)D-JF`G5Eai=jEa`iTf|BkOLC)j@)?%8Cz|4}J$p@_} zgl*Q3j}A)c=AAa@Y-jReX+Q((tZ=6k>P$W&In4ElmVMadc+6TXhn31B&>`WN-tG%keIzeVs z)zslTiQhG$4i7`tz4)hEWB>9AZLyNt@s0Mu_mRMwNGIKEWMXi_Fo|~4uH4@})Qhe> zKm~uO3R1atQScMKg3ovgnrx%_o;>z4TlSwc5BdMNg_U|`HT#e^_5I0|TE$Ky9p+C7 zb{NFx@p0o8R!C5#msSmo>C5O(3GL)7^uhndE8En4h4U0j@)hYD7{d!orsp#qX<;hD zNCtc8dQoQGrcuWKIA-Wn?M6WCnU1_gCQG%9vmAW@2y64B;NFkS2-u=2c*#2%qU1-x zeL*So!Y}Q`obU7~@6zL$=+y)TnJ72~mfcF~_~rO*Ef&%Agp? z7W0ctY9CXTCUs&c3Qp-K)stRZ^e_1HdzHGIQvE16BW8$fYl}5?Vh{zV!1BW+2T^bh z@G0Z*(809gM^t@>$+==bQ#(!Sq!hDVT6`Y-7YJ>$wJSp z&@3n2Pp11SW&u1&ndt5~`E2~ppHr~#+k`=ULJ$SlC2T8K0NK#THYtC!wrMpT>K9lJ1J)tE=`IL zkSWK;OBoi&encFr!EnsS!7&*EN7wuRo;v=E_4!cmUX55e+m_zFI@G&U&I6}dw_00a zU`bd`Bff-=Z6w|Bc=ypq(v6&xIC!`vaq!$N(CXz#I;S&m^}ZZQ$1cj)n3Q*DtTqlq zV_uG=dpVNs-adbc6S0@c^sq^?R7CYw9SWS6{#%jttG*(kMG*+y_K^)yd zNMIb@dVB!uomHtG{!ghIN2e)sXsjm8p|P6q4vp2+daL+{R4N=t_e%h{v+9d>27zod z=yjr7EgZ-e1L>=`>=?*EwiqOVY%vUe9xEBc;3~6HaZCf*VrVFkZ6-g{E1>Z#e&*Y( z!B4Vn(@hOLcT(J`Ci0@hDV%CkaCuI(2r1@Ni_!|5Y7uhCsTRRKr&SNZ5qGME zsORR4Q_aUhPPI%j{idQ1quEMus_uCAR=MXIyPa_WNEiJo={FaNEwN?_1}lB3A=)Jf zm}ppaTFy#eUBqsbz^%XD;Td6>9r>{lEB%i}d{D_sxA84A(63>h@y;yq+!F3aT5;IR zC)RnimhKC%U)$ZJ`XoY>j<({LI)U*u~1B1OV zs^=|t3zbULq!p7BWZdR!1S_$m+c6>C?l?^!^3oY~)U~YM(~-Z}a$CNNYBH+SZ&^6? zGW}lx`|RYS_+4uM0Kdzqg#5C~>4L+TxY&3%+Wfp;v4zJbkIv*(N9)=~)XT9^^q#Dm zV;l*_IVp`cSv$u!N~^naa%qJ*dtkFMzR$e_l1m}E0%mt#JALl*jO;D!6gX4?PBz)2 zPNmdE)h(81s`WNe?Q>KuT1UJ4F4PNK=PSfj)niHxiNfSHI-b+>2`qcBh@`k=Gi!SS zwzke0>1i0=J2W`l-Me)ZhfnV%h&$g^LX@Oo{4#c1BIqD=$Mak`5f zw`19Fm7-Y8VJT`HQdQ)Yo=7waAD{g;K3ACULvp%z;cOhszD0ykKoZ6ed*}{d$gM_5 zC{Mwr^$)8G$Vt#=ze1}Y87ZZ1DV$olyR$!~w zd%22ftFH=d^~wvt*y>F>u+eDy{11DwER$mp^>XoPJlNH>s+St=^~>*y@euMa*zl znIQ+ZdP6=k+5Xxt^+$#N*LJBN#h&ze_{MyRd(vm%eMDopoO4Zi1$)vJjO|HRFt#UM!T6qZ zMY(${yeC~zTGYHf>57O+TCQKybZAey0KuO0CDa@nvT}k~aXo7B`n5BGyIWBcmv!UA z(YLc_pXg>r?n!@y0?eLtkrCaKE>OXqbV0*=(iMnU(iMtY(iQXfq(9BFq5MUH`^xwI z7P#BaU)0Vh&lQ2E{TOq?xbjx_6IciYd(uTtY)`siu|4U^CzecaPr5>}J?R2Q_oOSI zzt@_3(iIXTptmPoGkRMxuW|o9>8S~m^0k`7j_pa;Jh46L3dZ)ND;V38u3&6Wx`JYV zk?rRw{RUII>|_k~q${W2Bw)PBFv?zJHWT*4zsq3JJ?WY^x+h&Rzn#RAt{8hs7B2Y~ z$h*bJW8?9G-s=7jTMB*RHl=8%kUi-oSe&`j@x0}sOOtY&VSGC;uBf*+`uyzoBYV=? z1{Lcn7K&f7EyYiR;tul{i(;MPd(xQ~x(pZJj?a%^Pr3+-?@8BkWef(_uPLa5(A$%) zm<&O0Pr5+SJ?Y97-jl9KWKX(4p*`uJrJAVgn__hxDt-(U_YbTqt0Hxc?@4E7RQAg9 z27KCt_M~gMF-y9FQZa8&x-K_o!b;fh)K_=@aF*Rmpe(iJM$ldf>Vo^*wSJ?SU1 z1Soq?g;0ED@2q$gDDKCoC$$hg3-_cm`~PB3x|9W5`s2uM_N4P)OjKr1x~9B6>6-HP zq-zR$()TkuW%i_N!t6=cgtsSMQ|qni|Hcx+wsdY% zpOO45+5TlLt4_5N1=wkpQ-H0rl5q?>Y<5^FtAsK0eIo#&?H48s^ttRq+9sH%kh(>Kz_A1S6 zQan7fX$S{5`}CzeTNW3)DaLc}5|b;+#D3UHO%Ul`#`3WDL6ft}bB#N2)UVzB^yb7t zO(5nu_Xtwf95Gtzrq$ggQ%MoIR~tJfa%5s~aAG9agJ5&ZexueJ()dMc4{e3S z(vg9oJ>6p$f||j%5F)lqb+-Tjui6#*VT6M=^T>f1R*vksHMA-DA;vVfgTjxhd5@CP zqrCHOW};UU6lBbn3e5jAspCJv?*~)>KWxZm%$7kuW41I>m!b&T41&`nxDb! zca<4(V74^myhtzC)S@<~ZY+Nv{yeM-@h!UWOcr`(g<(35O!rk>fj>V}CceF@{)GSe zQ;lK24#U18Fk6&0#^9niW4o3;|xe{II9;@HOgj*Sf-ea!E32knEG-f15^qa9j>?2;eGOZumUFe?^DS^MpPuQwTie8rS}L{a{B{ycrD9P_rDB1l^5xSr zB@WhdIyDT|2^;TTK0VV|Dz(=XSSl5cSt=EbSt=EbTPhWeTPhWeTPhVTuv98sV5wBN zz*4DjV5v-F8BVLq%Q3$%$Nb`JCSK7V+(>^<_G0uqM z*>de$xW)3IvBq=_n~K)75$%k9tVGT-NKh>}{-9S97Pii>_@; zEQ#ZJa(Z5!Wrz51S_F=?>gd>tL!%NgJjmh1C|g^%wBoEJoXm6_Z)ocp9FsfJG>X(p zAI?&{OeX!&>_S-RW+PG)hu>J~k7b|36M-?DNEhNtC3thqYAgM5LrIXL`>_e%W#FWW zczvGW-3Cl+oG}XT9KE=n_n*muuJ>d=%fgfCPh_`C;W)lxY(q=CmA)@4Cr-c?F9FIp zX{R$kUWXg3F3#7FHFJA-`jgo+kf&768!Bt;Y3<&V@5SL4I0Pc;zWPa!W;WL2Vb!;< zI%74C*_iDmSD$(sl5@P|nssZDtniYju3m-YTqeDi`-=^S0GcjRhCBF16j9#T(>^?a z!#En;iH$Jx74N_$yzKdOSM0Rh*X#dPJlj@+U)?urv#ux7K00vmmi#464VHVk!W-1} z0HsB$d&LVVB-!geb|r-) z$)x+ApP~>%9S`vdyFc_=SiBvLJ-uVyxC9fI%J~_eyG1kpJOu+A6_)0eh;#QBrhCkJ z4{UhuuQg@P>lIljW5}2E`)@%~QLkHJkI+_!ih!pdI~Xi?uFbj`XslbZ5npJtR3A60 zky2x`B35R^P1;X@haFBtrSyOn?X#wXyIBLGyRKQibu2&1Ls<|-p(nD`pu6I#v;0M^ z!qp&90nW-6~`$%u*$q}D^CJxoegVn5GpS5^3LR~_5xIf8fvKYCbp|H`98qj2_~EP z*myVL!m)MZa$%N+BhOm2?iL&cg`eA@!a`}{9yW{J%0|M~cGjZzfcjJXd>$NCBWqzi zeGSJQPMNW)Utn&i#+;#X+JUVAb|0q(1d1=*#bcLIbNFI3wtZ&x(nGk_i}}0@5BEr4 zm@HXn?m3hbxrP)hT{zCE#9R$GtYA5clnYbs5zdS}ZV3mHh--)~r}6CXmvC&hUDs`F zzZ=+op{HQK|0hz*s;WBH>x0@TGedHCvdmaNj=9Q>vQD2DffV+L2%G~`-U7B-eZ9uk zf1U_J*%!bIgI3@}!GSS2=I8SlOKYs7p>ay|Lc z@v+?aaE@0~TJ~e23-u^{KP&eq>Y@kK?8a57_G2uOXBx2^P>K8~OMFbb0?sp%I)Bp? zx#)Kgbm{H(!4E;q!jYc-3;TN^*WfS?68jO~wTa2Kc#60r z?^&4|CTkat_YaK8W8`g>&ndbh5c#}{T*>awE>hz^G*^pt*YC3TQk0NlS zo}?7+|5$MndbiV~yeob|wq8w8ka46ca8fT>$Ir#@Ar-*=A7nF*)F7X6q#CL3WWGZt z@f?e|TN5Y0fr-G8`ehZ%{U4_Uj#T9ZU>vC?9XL{rusnqYj?|L5Qho0KI3;kTD(}iy zQ>FPuCbfyFN|QPzH|#OSpEn6xpiX1Qgb&R2NKxz@67jgN*Y2f|Ak1INDmAFG~!%sc%t>F-C^)&HJ) z`HOY%P*;8j+_1JSUD?{W3#$n0bNIeK#xB{tI92xOeX`aL>)`mitb=!VLamTb_D(MH z?erMFnDV_dE;nu^PWhV9|8}43AISf=`(&5%gCglp3>gLZJ?msrgTq68 zRq{&#Hvl56*h1012yZig_Xy<`>>g1twtGau*zOSp@e-aVp#sO_D@q!2wy!8uHdNlY=y9(jRfL-~sY_m%H+u{LmD2ck>ujPjA) zBg~25)VI1{25aDx6*)1VtY9&ptnx*CvI@m~vI0hTk0_t-Yot$BA@QAgyGJym7d(B9 z``^*sBTA0#9#Js1dqlz5?hyrJyGIm^?H*B3EcwCi5e3DPAM74c&~Fm>P;b(T#cniI zzUb}|#iBl0#r$>>pR8h0pR8hmPd1AM9KBMvY3bT2WcSEohR!c!*Wg2!CS^cyeD??i zplfW-PDFN(XgRUnBMQcLk0==0J)%H#_lRQA-6M)gWBa>D6qB|Nox`N4G`4r6p+M2y zBMQZRvWfTH@*`GyrkEo#N?h(bJyGIm@?jBK0 z`T=)}VDCq-mL{jR1?Mm+U%0a9GJS@%VE2e}7x-iq4%!AHE-)fuK3V0A`(zc3`(zc3 z`(zajHzZ0MF{KswWR<(XC#$g6?&Db(D|+?G3dQgJo3d4)xMy$(uwT1;KP-yqaBUBT0eN(KiL&Z;l;vUCetcuh%zI%k3 zQQ0fYyP`f>EjQ+qRZuGC?H*A`>J{uB5isPF9jENj?vWr9%f7Dsous1%2g-%wKdmdu zKM0EZJJx{uxfH}|6zm?M1c*9ZQH@Wx$nFs>E3$h;p@Q8b3d;iy-)N|CuzTbcECI^i zQy~;z**h!RKykl7J*kE0S-5+I*Q{);8h^qxUn0QeeBC8xufW2Mj6RA&0X(8X5zwVIk{&A5YEyd5R! z+`UL9+tc0K@yR<~ZYW6i@PA5$;n_;}YHH^6@qJc0uZgPZqe$%5#LDTrxILs#Q|ql6 zzh?=-j*@hL7V>8Dn!!cz{m9OZ_~}eBQ2n$qkbc@2B!1c$CVtu&CVtvDrheKO8uHUZ z<8Rs>VU5FnT0dXdPm3%~iP>-;2vzQbVoiA&ATH-KJ6?R4u2OWE;AX;TuE^zsx(UW) zg_|`()ZH+?ToxDHOc)g!znL&fz31j3b z?nm=3mnsUgqKx>>gkdrYn(Ai47z-~C@~*Wjj?$*OnJ~)X-E9@Vyl_UC1uDjGCJd9O zyqPe{z?-P7k}w9D1kKHaVG3$Yg1LRLG)(d`8CqGGrcXq&dN&guf$ZH(SV)fDOjyVe z+)P+VE4Z1kkR@_6VU!%Xe6TW1L!~3c1z{p-)X>#~HDM|rCi-oNTpK3GZzhb=%&eq06GlmTxLYu$ zW0CP3ZT&4g1^^=85_&A)6f zbnoD)Q3g+)5XWg@4iv8QesD8km~6&`u(aznoa>@=|7OA{tTz)zG5-R>SA=nB;1kXY z6TF)V11x?sVL)L=#3L~`6QUPBo0y3!0s{tiH~)4)@8$7OjKOOxxtZ_?d98;-ndA^b z|7JoI`@6*Z3W{xCjR%Yyg1tfT-H?EgT41xj7bAHJk@jSaMzI}@?QNZ1*7rjsszegU z;}2xnG{ad4-)FQsdarJ-zDurI3)47wnwxl|vAn~diDm3;?7%&9pkdSLk3uwg07_%Y z&q~Qv&S&B!7v9qtEN`&4@$_wHV>HcAOoe z`)c}2ssW6PR6~n6=3cjQb#B!TvzJ*ITer6G_Q1_Kd~P;&Vn4G4rQs;X z&U}vs7JW);4J{vcJ`0y*&_KBSZdF(nq*sS^KzdDB0i@T4i$?lXD;1GB;T(R?o7_XtvY3h z9@)@6KE7>uaNKe~lKd}IwXLT@@W+IOXTD0+mVjTX#->7G40L1G{OBdj-Q9;XR_{ta ztI|K6oD}KnwCs-I?mdj)a6jYeS~g)w4gEbMmiu{w+a*%+7yXjGlC}?Q9Pp()m~4b} zG~}bnpW~mB-|#_v-BTW->qqmwo#Vr!c|@+V*8gh6CrU=vf%Us4>G&1F1&l+?#2{1m z$>d>*U*SHJd~+qlpTp<$BVTg_PtS?-^Gr3G!ygWpPhS{|}pvV{*hkzy`9WMssFyOx_Y^chnyAEXoK&W8P#2^mqMU%}jQU+k=JBaU+Bve($zJZ$4LMD6J)*s!d=Dge+0QWaOpNa3e}$nJ zv1u8LIg;<8h>qdmaVp>0-@VFm&z1&2lxi8`GQfpcC4_^zuSy|U18rMn;LVKp=BTMR zgjy1$Z!{WYDa%>4uWn+zzac-~JunFFO{uNCT(D+^J`yJ65zW?gFVf|l7$Z+;)jk<< z=cK;FXOwZfQqSr$(pURd?-6M)*qP!qECX)UX$)0vA4b9Fh1-@WTE%kD_nQ=|YFKkl zgePh;s?l$z)QEK=yXe)OdJ~v3E8WplXBGMmhMza~gg%zy{DXHvm?EQcBE@lwTV^BG zWoF5^H&q6CnJV|n)V=tpWDX~SxB0a_kJH4}CTRxhJB1SiRo^?4rY#m|WgdhSY3_NE z0x?YGFq*OEd|!9ZCAn2t0l5cKL*Oo|b8kt_sm7@&9FAC>xra1~N+O#!+3hI`)*_aG zSBhAVA|{3guIKS&y5NF~Qi|iV;21)A51Ss)Q1Unn_?oaM zYBrYK%*Ot@DZWoDmt1TrSLKy2(;OdIzGpmKzsFM_V)?c1cT?vglM4Ty5pHQ^o-z-o zIwGuY1oxY|KTIt{HoUxknwn((v#HI`Qtw7H`-_TSc^%!$-?Aw`giw2gl_L__eIYeK z5z|~N{S%6)rU*N&^E&3;p7w#E)`>m45DDx$!h$iQ-6oaRA(XXd)1v+dWS3{^`Xym) zWom7?Zu&3_>UZa)hiXueyuK>@f_N>n<<2u{TbrUX&BwwQir23errFIBH8t8ei$zwV zrdM13%@8aq_;2GDsG!}iCS3+9+G1>k5?(anns6r<;QTklV%t&q(m7`U&jl+ ztA8|)NLY8o=%ud!y!f#7q!Vj#6}T^L-T=D7d2?D{Xl9=a#u8a|6=AuTrk~V$|6}^g zsxVeFBW*)CGkvZA5Kd`J3+D(l|#c_Is40gZ}tCVj1BdHl&jtx%-peky$mvO$-B zPT#Bfk$ZSI`_qG-1hg;pW1t|G4-c8YtOg+TsfTYe~~tcHt~1Tk5JGG_lN20PLPf>pbM*~JwecM6i*uKLti}^B+nTJE)#lC zsUMrPQ*s^$>rd0VB24O-dEShfqB35%ur7x+qTxT$8<#R2jmhIu-F}%agGy+@zodVo zx*-gF)HIgmdXoXx*`s)A;a+ApVL;P@Nmsj||A3_k5m1k<4}DyQrQN%tyvJ12IH^VSTv+p8a*YG;1*;(?xg{UAoV<@Oi~pEs6&!=t>X+szvkQ^LB<`R?Al zzh3M!6f6kW)k}1_mOWtb6lc%Q(Vmv>9){2I0%Z3>S36Cbw1%aP1F80Y?37$ z1wU@k8(i(}d;&{U)PZ@P2?T(SO6;?0$k0HoNb0-@P0XWU26eS6^X9;0KMs zYF(y%$Rrn+$TICtldRG2sgJl^&?RbWb(QlmLwyx{3_b=o4{#*jWzhBVBw>JKXUdPl zo$KD?@=cqlsneGIgwejy8wxFTRDL)2<9*WoEp?yfKI9gih)&F2k>A}hJb`a=iu#HX zrIgmrppdT`N>X~+#IB({IupOh9yNqaL2-@yFuuOw-h)QUbh+PiTTo(2FXyr+rRBJG zxsJ=$r$m`V&E}8@+CMz4pLUN&R=kWCW)2vw(UB1~nbF>DUO&~D*b5Q{zeta-$qZ1= zO82D96Gl!$o+FYUJeGU1pwLQJ8Bc>nRvD-GY6aY$YAZ8$QDmumcINUGoE0!D;pH>X z!`6Id#!O0tH(_k-?ZyaSZ%~Y5jGER?%iUlQe5)aQsBIezK|a4|_Gr%IyIAM6jfOVU z*RIKb%uSgjltCx&%seJq;REx+acnAbyE6Z!t459^XHU}zFVg{w(VejYSxw~ic`1pu+75ysK_S`Mpc&zBi#;B9W$%$ATTW)`bZyTrP zZMJrS;SBquQ*)JBbdF^>JvcSj!$`(e=S3)29>%Nu>SB#`@xU0?A>pnvp7}4T+UveK z^DI@B!TFYq8Jz69v@h%(9>tsLvWzY=t99J{gQ%3K*~M|En+4ss8myy?8U=+e*m3 zX|N8w(U1ELgZa9VftE2$Q(w)bLB@dp*UZyK=FU7K*4-z3p=hz;A$}wNn`v6UMjJT3 zzHI<`gAPw1*LMxVHzzKF!eoaj$Y3cx?R?Mh5IV#U43^ffjvq?li5geugBPHQw6d{B zbY3zxp5LQ`@tMr4RpI9|&Dg2P2fC-br`vlC|F=I;?Pr7j!Y@bK_g5wvd{DJuwGL~J zyss_y*O}uW6QlXhnL`wg13O`P>gwJ#hWn0&Edw&sSS0pp*4&v{u))wQ3bQu`kv$uOR@7*kx*=VN1>G7MzGMjWMoCs0mX0gm>B{(61 z-Yk}BQc5yJ(VN9G=O`sLeS?3qSY`{A!p&leNgv8I?-Hy;Ta^jvZO3VP)JsQi7R$7- zY0O@6+E(g!S=kTV1ZKp);rCqoWB5IfD$L`5*8F>g_G$dCG}#)*`M1y&L zA$Wv|as?!S0~H!u>pOO~cQrP^ha}K{VMQ)Fyx%{6Td z!m5l4w5q~<+qe&J(D8A&JjSf-TKfsr;+6K})IzGUYDaFv&i1;_PDHtg`}@cLmC4RM(`7ESKZ8ynYk-M$`SJdao{KT$t?Z!9ZU9pz-v&M|#|>on z*gEX6*jWcL`BAJSb#-86hin}yMLKPP9Gs1v9k#hv&m^;Nv+sZ+CEvl)F?*GfChwh& zJWcXwLVk;AX>T|5@VcfR2N{c+SKGr7l&Q$xVxI(IS~YJF9kTbEx=D>qufJ7B25SZ* zVpPA|qe_A27`*(Brjcq^CmvGniwqON1|KRw-~8s5q=`>cU8C1t2<_Q$4^ zO)I&b$^SOV>9WQ)nYbp({>o5hmfVb@v%j$!jGU+`Eg59KKbmAkQ1ey$T5vW(_sD81 zYbCxwb!)SUMD7evT_>Rf4IffecbZ8iMP1*el*0-cQ3ZyWi4igLSlLoToJL~Eon&R_ z7|Kko>%4>x-%_pXB9knay80zbZEFlo37NnXTG~ znbOLxO$^~-E!cx2PxfLQ$(bkT*xdD)d7Xug^~=w~_Tu2o6M6YMli#)%ak{Y2q4Lh; zllDSz4PV3++4U4}fx4XGwcP5{4)G zhN)@9EUfK4{GgPxG#&(f#jCA@mm8k#u&~${(+aLK&I0Xi`1vsDs2C*-4)nk)imy=n zQuzp-Jj<%S2|Pc?&sV^w^|_jsRA=%5C}N#w9c;(X^QMrHQPaMjrc5oX>NVEE5&X=4 zh1Q#2Ve+A2f0Q3w%5*6h9>dRC!z4C!`;#=tJChHhu%|#=dA@aUYlPtedN+6k37Q4O zr|@$%8SoOp#{s?!*mLYhqytWtRAK$wf$Iq#<)?%*`3Q3T961JGYaKl7D~DyI{U7ak z899@Wf#HoHK7yae3?wcY}dFxL11dKJ?<_ z<;H_*q43-gx#M7^g>ykRgU4FJA%H{v2k?27&vlRFEMsjC z%UN|c%9)0C0Ez!YaV_WdrW~#d=}`$a2A*RMn=NvEco?~H`K+-IsbC7dLj>OeVatW6 zmr@+kS$%S)ioeZ>uR0!2&42$|_U$%5nRs<;s6d|flj|QI?6vFzDNNsIbN!AvMMZzo6Mg)|I<5w2 z!LaQ6y(;;S`dRyR5Ufc&o2TuSNTLDxE&gXn}ej@7NnQQSs^NJ4( z>CLlQEc>@Ah9atVvsS-`nB}~?1f&lf$68caCk9=4RPveT{EKF0#@9&Zkd}tgG+rtp zN|5V-aK7eMUgM<_Y&;fIklV70G#~T4Ao=q*~qfFpAx&)qfSli z0Lv3Mq3JjYEoE#F(w~NM&g2soJFK{Q?G*`nhxzIVY0|5n$s8;cbSqo-YAu8X9FRg} zeCoSUd2m)u9+N>nw+FTq`%Ked;QjUmRBF5qN?l1MUXkEu6<#sRv3le?RvZfUSqX-2 z;?9+&zv4hXTi?`^|ChaY0k5;D_Qv0Lzi+a$L(-;gn(j8CO`Ei&rKM>bpdd;wDQ#)m zh9-rU+isd$Q*zlPJ8eOPaz_Md0Hu5qE{cLu1<8ah^5=8{z4**bsjKIuU{b2-Wk9 z43$1un*6*3i((Sdx#oONG*D#_Ku8%p!hN`C%CfIhilp{NA8ts>j?d|xq-K$)XgXeq6 z#o0?eF7_HOo-viCWx=?v{Qy8ADVeikaLUIy+G z;MRWphQlGoCE!e%_8xb1Fih3tHnwRoeWs%XmfM6=F?A^@+7mX?W< zD^nG1qQ<>qD4u7^O~(?uvE`iZzLvImdMo5%rp&CFB6W?cQrA`O@~U8}=E7el&N(ha z}P{xnCXG7M9(mjlc$YL>l2{HiCRFyIg)RF8vP+{<@kydP1r_=A z#J!0%e`V8mxvFq=vmgfIK>*Oci>x3#E#sHES1FUKwUf>N6f9{w!}M-`Z!Yu2uIfhdNATlKrN%mA-{4YG41W)g z%+0%HN=;yoh`~w2PjOX;Q?=-!Og8QWKsVljV zgbOAJP(UHolv?uB%&SH}3d6te+IDY}ENZOHn*lS{t_}j(8xliF;C!65*?Y^bH`@P27{NZsN=?>nU%78G(@Z zE-KdEOb0{GEc=IwmMAZ|m@SZ7C5;-3F+({sn00jg$fGemUhpR_BimwoIkuA!#!-I8 zq}jh!vLyKjA^Q@^HbG(&h=vls(%C}^{>~>z{Rx$O)n&|Ej9!2H*@Nxq7SgorH`D#79h!#0wm931 z2tj+QA&Bk|wbFK)!H!fe$zjdq!N9Qr3Ro5j? zBcq(*22m<_?{PrQ5{r}?DeV+$W7l}*f+e23;mX$TC`@ zAMlkPj;be6*g|3Du_2GKN^va#a&qR+&Kr~tX>LZ2k7^Ag=8)9+u1*K$9Uhsg zZq&XXKl1I}!B8LjGkJ`(i))(f19I8u_x(|2gDf0(6(w1E5_-0gYW=8T0Q+d1q!_?$ z%J5zJ&}!|ouNpo|!rDVhkyXSGl?o}`DpaoXsr=BRqWFHaKYY{yPSv;+SYlx9KPo=r zD!Q6n|2Oc>(imN2Muy{`yq01Et!vjfU&K+{Z{{&bn5`6AD3Nu{Ry4(S^bI1O#4gMi z3lr(o39VS^0miQy6YzK~%W`c}HZ-K<8y6~DlP@0vmU~soKDiDuNT94`*Jv2usP*y{L?L~&Usa4fLvH?FH5B2$s>WwQNC2x}uy-Y7-^z8M@23aV%hHU(RY(UF` z&^#8R{&NY>HJl&ehpjHpY9X7w%oRO}2lzE)yP~Z(8@kLpYdB{E~ZAUTe^5m z#J(cmX7iJ&SB0@qZ&Eq2E|UNlUX#waIhd79r=oQ8F1F?$L=@5XZOmpG6jg6NX1bFz zKh4=8^sQUkThGei+WkyFE_%O5(Guk&g0^wJH&5>Ma7<_6EnOX0EqCB0=lk>|!O&QP zmAU)p`3Xf%#MMLO`A#60wg0+y@ccxS=kIv*!rY1pnm2lD{Gb_u&naReeO3@pKH2*Q zK9|qG`3L==qgLQOq{ZOxX ziSxLRP?jCQTf-yb$clVR}ux=2WFjst*a}9~;WySWz#67^OWX7;uWD zcEfSgarTHS#JyoQ!Wb|UCmF#Sa9T=Jswva4f+ydE~?Z4=-4z+E2G(%zL`~=z)yy(!aIlM9Y zh&p_7oK`J+#IKlW(*zNj7abHZw-ycIEJ~NgX|AvFL=@6Bt=$P0A#_74qA5p zxlm-h=wMP0k--X+niqP}LGu^FQ!n1p?7%E!I1t>rY`bQ zhf|(QOln@}MF+!L@S=mMejaJuJKkjD8kCjmPO_ZtGLxMkzKcw1!4#%$C_5X!9#DpO zMd-XT4lkxEc9Ud>-hC!EySxi$Nd_A^QR80zSE1KJ>H8B`CIJ_g)9FVaw|J| zvX{p>?Yatp^PEb&+Ax{}vQi&=5Kl1{hetB3GS8_-HYzQcFL7Po1p@ZbT*2l!*IUem zS##bFUPvI95!efP8AG0P(<0`D!cgsF8HJkX)Cfvc!gkq2qT27_Ak1@SE46qqs(lM+b_Z(29q_?+K*rfS8)663=z6<>6&gYaw(^FMwQCZ-2iCQ) zwjIEiBzk*V2D)0``8yKzqwV2`rrX0`$LBEoj>M2nF#P_~6wDh54^Wyhz%(@A+(j`^ z(m)mf+ONAMZ&u$f2%!B_ z3Y$>gdo@C+#9oaM*jv9Efy=BoiW-Xd5>M#W2<15bYJ@^VuSO`qn*f`NpCB3t)?6$( zzF@25J&EL5$WD?JWs1KV!Mfn3ulQzckb+ku1d*fT)PFTX>Be4-P@oRNbxS!PbBb$)*12I{9i}@r(@=uhNqKK^VS0h*%!d_ms z2%E3ex()h8`CysSjlCM7KoQJ)H9|omSMX|t07I`vY$9%K2es0WLC#8~eO=kP%!dTm zYmVPrmz7kiyV86RB6%12Bp1RbPSEdIjmwceP9I3K`rE!5;k^)%SPv_L zP{1XjW#P=ccPS=!M1e=(ZcZQ}4iugW6-kF*zvWm}V74LnB zybJ>#-Nw9@IoLoK$(fJ5R{l+_@CaCWZJH`6%I&c7+BH#G)Q?1mCTffLK15!prWRSn zPm@CMK1AM@pOHpEe$%C-fsHl7tTOE#a4cndx;9(+%`TRVq=zi;D0F5mJvMNgzGV&y!R zMG>h`cKk8eWxYr9N+;|_#pm#YLa@J{q~J7;Dl0X_v%prLv5CLCgf#Ymh8Awo!X-HJ z>=`IK5F60fdKT>9TWuCE8pA5%ynF?jZKIfggo`&`2} z<(Kf?H}2zcijr)B*Ki)rXZviG}yaJ+yvip)H7sv_TO60*K4~>>|l!$Vi3FXb9Z0 zn#uM+FmvEJ)6#)P%5>tDXuR8v5;Redvu)zKRq!1uGzYVC)+yWFEk~x9RXTxktQie* z0-oxV(ke7u!wHmW?LI3r(BI1Euy?@SILo$KGb^>PLhZ?-BD4M4lT;VPLvPtf+tT(d z{#=>_e?o$yKF63UrAUJ7W2GQOoubaRlW`Omt!>b4$IIZBeX3$3rrnc>?KHHiRzKaV zuE@_Y$kXM*zg$X!_JP)VIThuIPibK=um>rfk~wAZs%3Io%(Abv&jSgMzBFwH9*qq3 zYD)`a89uDskdxUJ@5 zufGqLLL8u?uCmg?$t2xA2IfLJYIMKN@sG$zZI=fOqXLKkhu$o zrBv4u>B^p%kGMd)0yM&W_--sSz+O{!$jXK(WT$Yf$Ifepomyq*^(Z@k2)c>vcuA^6 zr|**aqfK<+r(B%n^1?X61P!#3Ttev+$APj{%)w@K#ygiaAt6M`S*}tV3+S{tCMI-n z8XcUJFf%|oU8uO*$+F86+MHv6l|!O4+tr8IF&wm6q-cq9#Z;nwmO?Y1d0MNo(iGKX zwGNggQL0Nls#AY@3})NL#B87olfzj>%WhI~BvmnuKcy870@5;O7T^FO{w=};Bca3(4efW)NcnNM#OU5lE&#{yGKTu*x@muZF)tb9%vz? zHv#v>W3sMN4oLlxYI5*6IGFZZcF0vmzS_!gOqK_&Q^o$UPk#aHT;tI%hbIydbO|m4 zaFnDR5h9%kg&9h4u>l{})LU5mj>Iky4e=L=8XSQ2jbUX9+NIkc!vf1Nq4T6X$m zh~uyj~SiecEx0u8-CiZILu4y$O5n08H$X%%$mTfre$Zo$+G2zCRNH*g-O+f zylR?1YXkGE3;XcvKE=wtXpQexGicVZSY5HEY67pC0uFnb%@=sp{!1~v2uw3CWX%nx z=FDF(wb7(zeVVDA#gE`u?F4Bb?zv{x5PYFmrH!eJywnb+E-|T^kXOyH7I@VR=O1E) zd&isXz^i7mze~<9D$~@g=b5^p?7#5qQDul*sF{gl0X{Zu3gr{ygXw!v=-;#uw=N}b z;BWpMj+O3wjG-#etCqL5I8EVZ{|32n9p10{z8lRw@Jf52^!0$N>H*Qxcc!2RlWxA9 zT80$x!|+2H1+?zO1edVpoP@2Vy?o93%B7WcM;v*?{L0mh4U3mlZdkfte&y1>o-D$f z`YX51J7U2CeByEET5J2!>w_H-@CG>em@hS9qZ?gQ~|FrpGSgXBDCshT$AHI`{ z_(nLX6c}?-DUeo_kdsP*aVM2RX-*0|sT4}%kmsaQNZ_Q>bjV31fWS#rN6ulP$q2mC zcTz0}Jh>T?Bq`f|oK&nxC)JOLz&NP{N7P9rpb<_gfrgz_3WzwV6hy0Y;G|NR@1%N- zw88w@0{5Bkbm@sW1DQ#3w?8KpYr+P0Y4R&58aSy0Ps~Xru$Yrd%ZVk=b5bcN=A;r} z)Jdh~eCG?DR0rNEezN`Wyal>%c< zDg}yZGjLKV&~FkL+;^*Bv8T|_Kby8_LHXb|lRyf zv?_%-six3EUryCvr%RL4?ihDc5dko*NcBgYR7xl2q*7qaNu@wFev6Yz0Z}KF!lF(p zg+-lI3RC-d;G|NhG`8oY5>V7hrJ%6ihE6Jl296jysRTB{NhQ$u)8<+|>|3FeN}-;! zBTgzs6n)xUVNoZQ!lF(pg+-lI3X3|a6c!d1D$}Wq*(01(T6%<&O2I+f0L4~= zBIcyhl5r=MLgP*la zc@&2L^*YH8qV~s~R73#npHkRHOy+5Gp%Qaa3GA(%RCS7{q4=xB6LL~1$8jf>LPJg} z1$Yx+Q}IuU27)ygOO7wts^Zs>lRS_AkrZW$JE>R~GW8YTjr~U8q!L7NCzaBTIjIz= zgV1wQDNKf-=cE!))JdhK!cHoMM4VIt3OT91Nj4$t2V%1J7XOsqodW(xQAF0blZurg z?B!)AVJ{PMQYqb-lS+XinCGNYkjND{sRS5uQk_lQAtzN(iL|dP`w;UX!S!X5(B2t%#FKK_i@03LfF4QgGm;T1X0D_P(^_ z_{`pwZa_}*A@WHsgwK&qDpvoyom55U8FRN;Xu(bO0;(6&B%F5||HOB!Slv{ba*Jt9 z&pSg?1;y&7(o~T(YKT<=H`OqbbW<(DjO_6rAw6+`6%~FU3-jqVK=#|RilDn=PjJB5Dtk^3{#o&K3`JihfhRY+_BG`zj zZWbABqrXaOwt6+kdt4aLN1s$-@iwUv!;Cn5??jqqpCe^iZkLpOMwrdPuzQZOS)#<= zuf*t5gUJ1OSVH{>m)hg8NN3&0rM?5lO{Zc&o>NSK>9fHEB`w&nuO((!LJ(D)(v4l2T*){epH; zsS!)t#?XIC=#zHQ9MXT>r~gz$uBT#hJ>|(2YHow_1wl!4+*8}V%i*+9kzR<1^g>J| zlWRnJF(T5>V