NNN50 WIFI_API library

Dependents:   NNN50_CE_Test_UDP NNN50_linux_firmware NNN50_SoftAP_HelloWorld NNN50_BLEWIFISensor ... more

This is mbed compatible EthernetInterface lib exclude for Delta DFCM-NNN50 platform.

Additional information and examples can be found in mbed Handbook

Committer:
tsungta
Date:
Mon Sep 04 05:40:11 2017 +0000
Revision:
32:8298a2fb074f
Parent:
28:2abbf8463fa8
56:f4cc53f; Add getRSSI() to readout RSSI while connected with AP router; Add SSL support refer to TCPSocketConnection.connect()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tsungta 28:2abbf8463fa8 1 /**
tsungta 28:2abbf8463fa8 2 *
tsungta 28:2abbf8463fa8 3 * \file
tsungta 28:2abbf8463fa8 4 *
tsungta 28:2abbf8463fa8 5 * \brief This module contains M2M host interface APIs implementation.
tsungta 28:2abbf8463fa8 6 *
tsungta 28:2abbf8463fa8 7 * Copyright (c) 2016-2017 Atmel Corporation. All rights reserved.
tsungta 28:2abbf8463fa8 8 *
tsungta 28:2abbf8463fa8 9 * \asf_license_start
tsungta 28:2abbf8463fa8 10 *
tsungta 28:2abbf8463fa8 11 * \page License
tsungta 28:2abbf8463fa8 12 *
tsungta 28:2abbf8463fa8 13 * Redistribution and use in source and binary forms, with or without
tsungta 28:2abbf8463fa8 14 * modification, are permitted provided that the following conditions are met:
tsungta 28:2abbf8463fa8 15 *
tsungta 28:2abbf8463fa8 16 * 1. Redistributions of source code must retain the above copyright notice,
tsungta 28:2abbf8463fa8 17 * this list of conditions and the following disclaimer.
tsungta 28:2abbf8463fa8 18 *
tsungta 28:2abbf8463fa8 19 * 2. Redistributions in binary form must reproduce the above copyright notice,
tsungta 28:2abbf8463fa8 20 * this list of conditions and the following disclaimer in the documentation
tsungta 28:2abbf8463fa8 21 * and/or other materials provided with the distribution.
tsungta 28:2abbf8463fa8 22 *
tsungta 28:2abbf8463fa8 23 * 3. The name of Atmel may not be used to endorse or promote products derived
tsungta 28:2abbf8463fa8 24 * from this software without specific prior written permission.
tsungta 28:2abbf8463fa8 25 *
tsungta 28:2abbf8463fa8 26 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
tsungta 28:2abbf8463fa8 27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
tsungta 28:2abbf8463fa8 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
tsungta 28:2abbf8463fa8 29 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
tsungta 28:2abbf8463fa8 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
tsungta 28:2abbf8463fa8 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
tsungta 28:2abbf8463fa8 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
tsungta 28:2abbf8463fa8 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
tsungta 28:2abbf8463fa8 34 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
tsungta 28:2abbf8463fa8 35 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
tsungta 28:2abbf8463fa8 36 * POSSIBILITY OF SUCH DAMAGE.
tsungta 28:2abbf8463fa8 37 *
tsungta 28:2abbf8463fa8 38 * \asf_license_stop
tsungta 28:2abbf8463fa8 39 *
tsungta 28:2abbf8463fa8 40 */
tsungta 28:2abbf8463fa8 41
tsungta 28:2abbf8463fa8 42 #include "common/include/nm_common.h"
tsungta 28:2abbf8463fa8 43 #include "driver/source/nmbus.h"
tsungta 28:2abbf8463fa8 44 #include "bsp/include/nm_bsp.h"
tsungta 28:2abbf8463fa8 45 #include "m2m_hif.h"
tsungta 28:2abbf8463fa8 46 #include "driver/include/m2m_types.h"
tsungta 28:2abbf8463fa8 47 #include "driver/source/nmasic.h"
tsungta 28:2abbf8463fa8 48 #include "driver/include/m2m_periph.h"
tsungta 28:2abbf8463fa8 49
tsungta 28:2abbf8463fa8 50 #if (defined NM_EDGE_INTERRUPT)&&(defined NM_LEVEL_INTERRUPT)
tsungta 28:2abbf8463fa8 51 #error "only one type of interrupt NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT"
tsungta 28:2abbf8463fa8 52 #endif
tsungta 28:2abbf8463fa8 53
tsungta 28:2abbf8463fa8 54 #if !((defined NM_EDGE_INTERRUPT)||(defined NM_LEVEL_INTERRUPT))
tsungta 28:2abbf8463fa8 55 #error "define interrupt type NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT"
tsungta 28:2abbf8463fa8 56 #endif
tsungta 28:2abbf8463fa8 57
tsungta 28:2abbf8463fa8 58 #ifndef CORTUS_APP
tsungta 28:2abbf8463fa8 59 #define NMI_AHB_DATA_MEM_BASE 0x30000
tsungta 28:2abbf8463fa8 60 #define NMI_AHB_SHARE_MEM_BASE 0xd0000
tsungta 28:2abbf8463fa8 61
tsungta 28:2abbf8463fa8 62 #define WIFI_HOST_RCV_CTRL_0 (0x1070)
tsungta 28:2abbf8463fa8 63 #define WIFI_HOST_RCV_CTRL_1 (0x1084)
tsungta 28:2abbf8463fa8 64 #define WIFI_HOST_RCV_CTRL_2 (0x1078)
tsungta 28:2abbf8463fa8 65 #define WIFI_HOST_RCV_CTRL_3 (0x106c)
tsungta 28:2abbf8463fa8 66 #define WIFI_HOST_RCV_CTRL_4 (0x150400)
tsungta 28:2abbf8463fa8 67 #define WIFI_HOST_RCV_CTRL_5 (0x1088)
tsungta 28:2abbf8463fa8 68
tsungta 28:2abbf8463fa8 69 typedef struct {
tsungta 28:2abbf8463fa8 70 uint8 u8ChipMode;
tsungta 28:2abbf8463fa8 71 uint8 u8ChipSleep;
tsungta 28:2abbf8463fa8 72 uint8 u8HifRXDone;
tsungta 28:2abbf8463fa8 73 uint8 u8Interrupt;
tsungta 28:2abbf8463fa8 74 uint32 u32RxAddr;
tsungta 28:2abbf8463fa8 75 uint32 u32RxSize;
tsungta 28:2abbf8463fa8 76 tpfHifCallBack pfWifiCb;
tsungta 28:2abbf8463fa8 77 tpfHifCallBack pfIpCb;
tsungta 28:2abbf8463fa8 78 tpfHifCallBack pfOtaCb;
tsungta 28:2abbf8463fa8 79 tpfHifCallBack pfSigmaCb;
tsungta 28:2abbf8463fa8 80 tpfHifCallBack pfHifCb;
tsungta 28:2abbf8463fa8 81 tpfHifCallBack pfCryptoCb;
tsungta 28:2abbf8463fa8 82 tpfHifCallBack pfSslCb;
tsungta 28:2abbf8463fa8 83 }tstrHifContext;
tsungta 28:2abbf8463fa8 84
tsungta 28:2abbf8463fa8 85 volatile tstrHifContext gstrHifCxt;
tsungta 28:2abbf8463fa8 86
tsungta 28:2abbf8463fa8 87 static void isr(void)
tsungta 28:2abbf8463fa8 88 {
tsungta 28:2abbf8463fa8 89 gstrHifCxt.u8Interrupt++;
tsungta 28:2abbf8463fa8 90 #ifdef NM_LEVEL_INTERRUPT
tsungta 28:2abbf8463fa8 91 nm_bsp_interrupt_ctrl(0);
tsungta 28:2abbf8463fa8 92 #endif
tsungta 28:2abbf8463fa8 93 }
tsungta 28:2abbf8463fa8 94 static sint8 hif_set_rx_done(void)
tsungta 28:2abbf8463fa8 95 {
tsungta 28:2abbf8463fa8 96 uint32 reg;
tsungta 28:2abbf8463fa8 97 sint8 ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 98
tsungta 28:2abbf8463fa8 99 gstrHifCxt.u8HifRXDone = 0;
tsungta 28:2abbf8463fa8 100 #ifdef NM_EDGE_INTERRUPT
tsungta 28:2abbf8463fa8 101 nm_bsp_interrupt_ctrl(1);
tsungta 28:2abbf8463fa8 102 #endif
tsungta 28:2abbf8463fa8 103 ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0,&reg);
tsungta 28:2abbf8463fa8 104 if(ret != M2M_SUCCESS)goto ERR1;
tsungta 28:2abbf8463fa8 105 /* Set RX Done */
tsungta 28:2abbf8463fa8 106 reg |= NBIT1;
tsungta 28:2abbf8463fa8 107 ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0,reg);
tsungta 28:2abbf8463fa8 108 if(ret != M2M_SUCCESS)goto ERR1;
tsungta 28:2abbf8463fa8 109 #ifdef NM_LEVEL_INTERRUPT
tsungta 28:2abbf8463fa8 110 nm_bsp_interrupt_ctrl(1);
tsungta 28:2abbf8463fa8 111 #endif
tsungta 28:2abbf8463fa8 112 ERR1:
tsungta 28:2abbf8463fa8 113 return ret;
tsungta 28:2abbf8463fa8 114
tsungta 28:2abbf8463fa8 115 }
tsungta 28:2abbf8463fa8 116 /**
tsungta 28:2abbf8463fa8 117 * @fn static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr)
tsungta 28:2abbf8463fa8 118 * @brief WiFi call back function
tsungta 28:2abbf8463fa8 119 * @param [in] u8OpCode
tsungta 28:2abbf8463fa8 120 * HIF Opcode type.
tsungta 28:2abbf8463fa8 121 * @param [in] u16DataSize
tsungta 28:2abbf8463fa8 122 * HIF data length.
tsungta 28:2abbf8463fa8 123 * @param [in] u32Addr
tsungta 28:2abbf8463fa8 124 * HIF address.
tsungta 28:2abbf8463fa8 125 * @param [in] grp
tsungta 28:2abbf8463fa8 126 * HIF group type.
tsungta 28:2abbf8463fa8 127 * @author
tsungta 28:2abbf8463fa8 128 * @date
tsungta 28:2abbf8463fa8 129 * @version 1.0
tsungta 28:2abbf8463fa8 130 */
tsungta 28:2abbf8463fa8 131 static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr)
tsungta 28:2abbf8463fa8 132 {
tsungta 28:2abbf8463fa8 133
tsungta 28:2abbf8463fa8 134
tsungta 28:2abbf8463fa8 135 }
tsungta 28:2abbf8463fa8 136 /**
tsungta 28:2abbf8463fa8 137 * @fn NMI_API sint8 hif_chip_wake(void);
tsungta 28:2abbf8463fa8 138 * @brief To Wakeup the chip.
tsungta 28:2abbf8463fa8 139 * @return The function shall return ZERO for successful operation and a negative value otherwise.
tsungta 28:2abbf8463fa8 140 */
tsungta 28:2abbf8463fa8 141
tsungta 28:2abbf8463fa8 142 sint8 hif_chip_wake(void)
tsungta 28:2abbf8463fa8 143 {
tsungta 28:2abbf8463fa8 144 sint8 ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 145 if(gstrHifCxt.u8HifRXDone)
tsungta 28:2abbf8463fa8 146 {
tsungta 28:2abbf8463fa8 147 /*chip already wake for the rx not done no need to send wake request*/
tsungta 28:2abbf8463fa8 148 return ret;
tsungta 28:2abbf8463fa8 149 }
tsungta 28:2abbf8463fa8 150 if(gstrHifCxt.u8ChipSleep == 0)
tsungta 28:2abbf8463fa8 151 {
tsungta 28:2abbf8463fa8 152 if(gstrHifCxt.u8ChipMode != M2M_NO_PS)
tsungta 28:2abbf8463fa8 153 {
tsungta 28:2abbf8463fa8 154 ret = chip_wake();
tsungta 28:2abbf8463fa8 155 if(ret != M2M_SUCCESS)goto ERR1;
tsungta 28:2abbf8463fa8 156 }
tsungta 28:2abbf8463fa8 157 else
tsungta 28:2abbf8463fa8 158 {
tsungta 28:2abbf8463fa8 159 }
tsungta 28:2abbf8463fa8 160 }
tsungta 28:2abbf8463fa8 161 gstrHifCxt.u8ChipSleep++;
tsungta 28:2abbf8463fa8 162 ERR1:
tsungta 28:2abbf8463fa8 163 return ret;
tsungta 28:2abbf8463fa8 164 }
tsungta 28:2abbf8463fa8 165 /*!
tsungta 28:2abbf8463fa8 166 @fn \
tsungta 28:2abbf8463fa8 167 NMI_API void hif_set_sleep_mode(uint8 u8Pstype);
tsungta 28:2abbf8463fa8 168
tsungta 28:2abbf8463fa8 169 @brief
tsungta 28:2abbf8463fa8 170 Set the sleep mode of the HIF layer.
tsungta 28:2abbf8463fa8 171
tsungta 28:2abbf8463fa8 172 @param [in] u8Pstype
tsungta 28:2abbf8463fa8 173 Sleep mode.
tsungta 28:2abbf8463fa8 174
tsungta 28:2abbf8463fa8 175 @return
tsungta 28:2abbf8463fa8 176 The function SHALL return 0 for success and a negative value otherwise.
tsungta 28:2abbf8463fa8 177 */
tsungta 28:2abbf8463fa8 178
tsungta 28:2abbf8463fa8 179 void hif_set_sleep_mode(uint8 u8Pstype)
tsungta 28:2abbf8463fa8 180 {
tsungta 28:2abbf8463fa8 181 gstrHifCxt.u8ChipMode = u8Pstype;
tsungta 28:2abbf8463fa8 182 }
tsungta 28:2abbf8463fa8 183 /*!
tsungta 28:2abbf8463fa8 184 @fn \
tsungta 28:2abbf8463fa8 185 NMI_API uint8 hif_get_sleep_mode(void);
tsungta 28:2abbf8463fa8 186
tsungta 28:2abbf8463fa8 187 @brief
tsungta 28:2abbf8463fa8 188 Get the sleep mode of the HIF layer.
tsungta 28:2abbf8463fa8 189
tsungta 28:2abbf8463fa8 190 @return
tsungta 28:2abbf8463fa8 191 The function SHALL return the sleep mode of the HIF layer.
tsungta 28:2abbf8463fa8 192 */
tsungta 28:2abbf8463fa8 193
tsungta 28:2abbf8463fa8 194 uint8 hif_get_sleep_mode(void)
tsungta 28:2abbf8463fa8 195 {
tsungta 28:2abbf8463fa8 196 return gstrHifCxt.u8ChipMode;
tsungta 28:2abbf8463fa8 197 }
tsungta 28:2abbf8463fa8 198
tsungta 28:2abbf8463fa8 199 /**
tsungta 28:2abbf8463fa8 200 * @fn NMI_API sint8 hif_chip_sleep_sc(void);
tsungta 28:2abbf8463fa8 201 * @brief To clear the chip sleep but keep the chip sleep
tsungta 28:2abbf8463fa8 202 * @return The function shall return ZERO for successful operation and a negative value otherwise.
tsungta 28:2abbf8463fa8 203 */
tsungta 28:2abbf8463fa8 204
tsungta 28:2abbf8463fa8 205 sint8 hif_chip_sleep_sc(void)
tsungta 28:2abbf8463fa8 206 {
tsungta 28:2abbf8463fa8 207 if(gstrHifCxt.u8ChipSleep >= 1)
tsungta 28:2abbf8463fa8 208 {
tsungta 28:2abbf8463fa8 209 gstrHifCxt.u8ChipSleep--;
tsungta 28:2abbf8463fa8 210 }
tsungta 28:2abbf8463fa8 211 return M2M_SUCCESS;
tsungta 28:2abbf8463fa8 212 }
tsungta 28:2abbf8463fa8 213 /**
tsungta 28:2abbf8463fa8 214 * @fn NMI_API sint8 hif_chip_sleep(void);
tsungta 28:2abbf8463fa8 215 * @brief To make the chip sleep.
tsungta 28:2abbf8463fa8 216 * @return The function shall return ZERO for successful operation and a negative value otherwise.
tsungta 28:2abbf8463fa8 217 */
tsungta 28:2abbf8463fa8 218
tsungta 28:2abbf8463fa8 219 sint8 hif_chip_sleep(void)
tsungta 28:2abbf8463fa8 220 {
tsungta 28:2abbf8463fa8 221 sint8 ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 222
tsungta 28:2abbf8463fa8 223 if(gstrHifCxt.u8ChipSleep >= 1)
tsungta 28:2abbf8463fa8 224 {
tsungta 28:2abbf8463fa8 225 gstrHifCxt.u8ChipSleep--;
tsungta 28:2abbf8463fa8 226 }
tsungta 28:2abbf8463fa8 227
tsungta 28:2abbf8463fa8 228 if(gstrHifCxt.u8ChipSleep == 0)
tsungta 28:2abbf8463fa8 229 {
tsungta 28:2abbf8463fa8 230 if(gstrHifCxt.u8ChipMode != M2M_NO_PS)
tsungta 28:2abbf8463fa8 231 {
tsungta 28:2abbf8463fa8 232 ret = chip_sleep();
tsungta 28:2abbf8463fa8 233 if(ret != M2M_SUCCESS)goto ERR1;
tsungta 28:2abbf8463fa8 234
tsungta 28:2abbf8463fa8 235 }
tsungta 28:2abbf8463fa8 236 else
tsungta 28:2abbf8463fa8 237 {
tsungta 28:2abbf8463fa8 238 }
tsungta 28:2abbf8463fa8 239 }
tsungta 28:2abbf8463fa8 240 ERR1:
tsungta 28:2abbf8463fa8 241 return ret;
tsungta 28:2abbf8463fa8 242 }
tsungta 28:2abbf8463fa8 243 /**
tsungta 28:2abbf8463fa8 244 * @fn NMI_API sint8 hif_init(void * arg);
tsungta 28:2abbf8463fa8 245 * @brief To initialize HIF layer.
tsungta 28:2abbf8463fa8 246 * @param [in] arg
tsungta 28:2abbf8463fa8 247 * Pointer to the arguments.
tsungta 28:2abbf8463fa8 248 * @return The function shall return ZERO for successful operation and a negative value otherwise.
tsungta 28:2abbf8463fa8 249 */
tsungta 28:2abbf8463fa8 250
tsungta 28:2abbf8463fa8 251 sint8 hif_init(void * arg)
tsungta 28:2abbf8463fa8 252 {
tsungta 28:2abbf8463fa8 253 m2m_memset((uint8*)&gstrHifCxt,0,sizeof(tstrHifContext));
tsungta 28:2abbf8463fa8 254 nm_bsp_register_isr(isr);
tsungta 28:2abbf8463fa8 255 hif_register_cb(M2M_REQ_GROUP_HIF,m2m_hif_cb);
tsungta 28:2abbf8463fa8 256 return M2M_SUCCESS;
tsungta 28:2abbf8463fa8 257 }
tsungta 28:2abbf8463fa8 258 /**
tsungta 28:2abbf8463fa8 259 * @fn NMI_API sint8 hif_deinit(void * arg);
tsungta 28:2abbf8463fa8 260 * @brief To De-initialize HIF layer.
tsungta 28:2abbf8463fa8 261 * @param [in] arg
tsungta 28:2abbf8463fa8 262 * Pointer to the arguments.
tsungta 28:2abbf8463fa8 263 * @return The function shall return ZERO for successful operation and a negative value otherwise.
tsungta 28:2abbf8463fa8 264 */
tsungta 28:2abbf8463fa8 265 sint8 hif_deinit(void * arg)
tsungta 28:2abbf8463fa8 266 {
tsungta 28:2abbf8463fa8 267 sint8 ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 268 ret = hif_chip_wake();
tsungta 28:2abbf8463fa8 269 m2m_memset((uint8*)&gstrHifCxt,0,sizeof(tstrHifContext));
tsungta 28:2abbf8463fa8 270 return ret;
tsungta 28:2abbf8463fa8 271 }
tsungta 28:2abbf8463fa8 272 /**
tsungta 28:2abbf8463fa8 273 * @fn NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize,
tsungta 28:2abbf8463fa8 274 uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset)
tsungta 28:2abbf8463fa8 275 * @brief Send packet using host interface.
tsungta 28:2abbf8463fa8 276
tsungta 28:2abbf8463fa8 277 * @param [in] u8Gid
tsungta 28:2abbf8463fa8 278 * Group ID.
tsungta 28:2abbf8463fa8 279 * @param [in] u8Opcode
tsungta 28:2abbf8463fa8 280 * Operation ID.
tsungta 28:2abbf8463fa8 281 * @param [in] pu8CtrlBuf
tsungta 28:2abbf8463fa8 282 * Pointer to the Control buffer.
tsungta 28:2abbf8463fa8 283 * @param [in] u16CtrlBufSize
tsungta 28:2abbf8463fa8 284 Control buffer size.
tsungta 28:2abbf8463fa8 285 * @param [in] u16DataOffset
tsungta 28:2abbf8463fa8 286 Packet Data offset.
tsungta 28:2abbf8463fa8 287 * @param [in] pu8DataBuf
tsungta 28:2abbf8463fa8 288 * Packet buffer Allocated by the caller.
tsungta 28:2abbf8463fa8 289 * @param [in] u16DataSize
tsungta 28:2abbf8463fa8 290 Packet buffer size (including the HIF header).
tsungta 28:2abbf8463fa8 291 * @return The function shall return ZERO for successful operation and a negative value otherwise.
tsungta 28:2abbf8463fa8 292 */
tsungta 28:2abbf8463fa8 293
tsungta 28:2abbf8463fa8 294 sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize,
tsungta 28:2abbf8463fa8 295 uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset)
tsungta 28:2abbf8463fa8 296 {
tsungta 28:2abbf8463fa8 297 sint8 ret = M2M_ERR_SEND;
tsungta 28:2abbf8463fa8 298 volatile tstrHifHdr strHif;
tsungta 28:2abbf8463fa8 299
tsungta 28:2abbf8463fa8 300 strHif.u8Opcode = u8Opcode&(~NBIT7);
tsungta 28:2abbf8463fa8 301 strHif.u8Gid = u8Gid;
tsungta 28:2abbf8463fa8 302 strHif.u16Length = M2M_HIF_HDR_OFFSET;
tsungta 28:2abbf8463fa8 303 if(pu8DataBuf != NULL)
tsungta 28:2abbf8463fa8 304 {
tsungta 28:2abbf8463fa8 305 strHif.u16Length += u16DataOffset + u16DataSize;
tsungta 28:2abbf8463fa8 306 }
tsungta 28:2abbf8463fa8 307 else
tsungta 28:2abbf8463fa8 308 {
tsungta 28:2abbf8463fa8 309 strHif.u16Length += u16CtrlBufSize;
tsungta 28:2abbf8463fa8 310 }
tsungta 28:2abbf8463fa8 311 ret = hif_chip_wake();
tsungta 28:2abbf8463fa8 312 if(ret == M2M_SUCCESS)
tsungta 28:2abbf8463fa8 313 {
tsungta 28:2abbf8463fa8 314 volatile uint32 reg, dma_addr = 0;
tsungta 28:2abbf8463fa8 315 volatile uint16 cnt = 0;
tsungta 28:2abbf8463fa8 316 //#define OPTIMIZE_BUS
tsungta 28:2abbf8463fa8 317 /*please define in firmware also*/
tsungta 28:2abbf8463fa8 318 #ifndef OPTIMIZE_BUS
tsungta 28:2abbf8463fa8 319 reg = 0UL;
tsungta 28:2abbf8463fa8 320 reg |= (uint32)u8Gid;
tsungta 28:2abbf8463fa8 321 reg |= ((uint32)u8Opcode<<8);
tsungta 28:2abbf8463fa8 322 reg |= ((uint32)strHif.u16Length<<16);
tsungta 28:2abbf8463fa8 323 ret = nm_write_reg(NMI_STATE_REG,reg);
tsungta 28:2abbf8463fa8 324 if(M2M_SUCCESS != ret) goto ERR1;
tsungta 28:2abbf8463fa8 325
tsungta 28:2abbf8463fa8 326 reg = 0UL;
tsungta 28:2abbf8463fa8 327 reg |= NBIT1;
tsungta 28:2abbf8463fa8 328 ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg);
tsungta 28:2abbf8463fa8 329 if(M2M_SUCCESS != ret) goto ERR1;
tsungta 28:2abbf8463fa8 330 #else
tsungta 28:2abbf8463fa8 331 reg = 0UL;
tsungta 28:2abbf8463fa8 332 reg |= NBIT1;
tsungta 28:2abbf8463fa8 333 reg |= ((u8Opcode & NBIT7) ? (NBIT2):(0)); /*Data = 1 or config*/
tsungta 28:2abbf8463fa8 334 reg |= (u8Gid == M2M_REQ_GROUP_IP) ? (NBIT3):(0); /*IP = 1 or non IP*/
tsungta 28:2abbf8463fa8 335 reg |= ((uint32)strHif.u16Length << 4); /*length of pkt max = 4096*/
tsungta 28:2abbf8463fa8 336 ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg);
tsungta 28:2abbf8463fa8 337 if(M2M_SUCCESS != ret) goto ERR1;
tsungta 28:2abbf8463fa8 338 #endif
tsungta 28:2abbf8463fa8 339 dma_addr = 0;
tsungta 28:2abbf8463fa8 340
tsungta 28:2abbf8463fa8 341 for(cnt = 0; cnt < 1000; cnt ++)
tsungta 28:2abbf8463fa8 342 {
tsungta 28:2abbf8463fa8 343 ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_2,(uint32 *)&reg);
tsungta 28:2abbf8463fa8 344 if(ret != M2M_SUCCESS) break;
tsungta 28:2abbf8463fa8 345 /*
tsungta 28:2abbf8463fa8 346 * If it takes too long to get a response, the slow down to
tsungta 28:2abbf8463fa8 347 * avoid back-to-back register read operations.
tsungta 28:2abbf8463fa8 348 */
tsungta 28:2abbf8463fa8 349 if(cnt >= 500) {
tsungta 28:2abbf8463fa8 350 if(cnt < 501) {
tsungta 28:2abbf8463fa8 351 M2M_INFO("Slowing down...\n");
tsungta 28:2abbf8463fa8 352 }
tsungta 28:2abbf8463fa8 353 nm_bsp_sleep(1);
tsungta 28:2abbf8463fa8 354 }
tsungta 28:2abbf8463fa8 355 if (!(reg & NBIT1))
tsungta 28:2abbf8463fa8 356 {
tsungta 28:2abbf8463fa8 357 ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_4,(uint32 *)&dma_addr);
tsungta 28:2abbf8463fa8 358 if(ret != M2M_SUCCESS) {
tsungta 28:2abbf8463fa8 359 /*in case of read error clear the DMA address and return error*/
tsungta 28:2abbf8463fa8 360 dma_addr = 0;
tsungta 28:2abbf8463fa8 361 goto ERR1;
tsungta 28:2abbf8463fa8 362 }
tsungta 28:2abbf8463fa8 363 /*in case of success break */
tsungta 28:2abbf8463fa8 364 break;
tsungta 28:2abbf8463fa8 365 }
tsungta 28:2abbf8463fa8 366 }
tsungta 28:2abbf8463fa8 367
tsungta 28:2abbf8463fa8 368 if (dma_addr != 0)
tsungta 28:2abbf8463fa8 369 {
tsungta 28:2abbf8463fa8 370 volatile uint32 u32CurrAddr;
tsungta 28:2abbf8463fa8 371 u32CurrAddr = dma_addr;
tsungta 28:2abbf8463fa8 372 strHif.u16Length=NM_BSP_B_L_16(strHif.u16Length);
tsungta 28:2abbf8463fa8 373 ret = nm_write_block(u32CurrAddr, (uint8*)&strHif, M2M_HIF_HDR_OFFSET);
tsungta 28:2abbf8463fa8 374 if(M2M_SUCCESS != ret) goto ERR1;
tsungta 28:2abbf8463fa8 375 u32CurrAddr += M2M_HIF_HDR_OFFSET;
tsungta 28:2abbf8463fa8 376 if(pu8CtrlBuf != NULL)
tsungta 28:2abbf8463fa8 377 {
tsungta 28:2abbf8463fa8 378 ret = nm_write_block(u32CurrAddr, pu8CtrlBuf, u16CtrlBufSize);
tsungta 28:2abbf8463fa8 379 if(M2M_SUCCESS != ret) goto ERR1;
tsungta 28:2abbf8463fa8 380 u32CurrAddr += u16CtrlBufSize;
tsungta 28:2abbf8463fa8 381 }
tsungta 28:2abbf8463fa8 382 if(pu8DataBuf != NULL)
tsungta 28:2abbf8463fa8 383 {
tsungta 28:2abbf8463fa8 384 u32CurrAddr += (u16DataOffset - u16CtrlBufSize);
tsungta 28:2abbf8463fa8 385 ret = nm_write_block(u32CurrAddr, pu8DataBuf, u16DataSize);
tsungta 28:2abbf8463fa8 386 if(M2M_SUCCESS != ret) goto ERR1;
tsungta 28:2abbf8463fa8 387 u32CurrAddr += u16DataSize;
tsungta 28:2abbf8463fa8 388 }
tsungta 28:2abbf8463fa8 389
tsungta 28:2abbf8463fa8 390 reg = dma_addr << 2;
tsungta 28:2abbf8463fa8 391 reg |= NBIT1;
tsungta 28:2abbf8463fa8 392 ret = nm_write_reg(WIFI_HOST_RCV_CTRL_3, reg);
tsungta 28:2abbf8463fa8 393 if(M2M_SUCCESS != ret) goto ERR1;
tsungta 28:2abbf8463fa8 394 }
tsungta 28:2abbf8463fa8 395 else
tsungta 28:2abbf8463fa8 396 {
tsungta 28:2abbf8463fa8 397 ret = hif_chip_sleep();
tsungta 28:2abbf8463fa8 398 M2M_DBG("Failed to alloc rx size %d\r",ret);
tsungta 28:2abbf8463fa8 399 ret = M2M_ERR_MEM_ALLOC;
tsungta 28:2abbf8463fa8 400 goto ERR2;
tsungta 28:2abbf8463fa8 401 }
tsungta 28:2abbf8463fa8 402
tsungta 28:2abbf8463fa8 403 }
tsungta 28:2abbf8463fa8 404 else
tsungta 28:2abbf8463fa8 405 {
tsungta 28:2abbf8463fa8 406 M2M_ERR("(HIF)Fail to wakup the chip\n");
tsungta 28:2abbf8463fa8 407 goto ERR2;
tsungta 28:2abbf8463fa8 408 }
tsungta 28:2abbf8463fa8 409 /*actual sleep ret = M2M_SUCCESS*/
tsungta 28:2abbf8463fa8 410 ret = hif_chip_sleep();
tsungta 28:2abbf8463fa8 411 return ret;
tsungta 28:2abbf8463fa8 412 ERR1:
tsungta 28:2abbf8463fa8 413 /*reset the count but no actual sleep as it already bus error*/
tsungta 28:2abbf8463fa8 414 hif_chip_sleep_sc();
tsungta 28:2abbf8463fa8 415 ERR2:
tsungta 28:2abbf8463fa8 416 /*logical error*/
tsungta 28:2abbf8463fa8 417 return ret;
tsungta 28:2abbf8463fa8 418 }
tsungta 28:2abbf8463fa8 419 /**
tsungta 28:2abbf8463fa8 420 * @fn hif_isr
tsungta 28:2abbf8463fa8 421 * @brief Host interface interrupt service routine
tsungta 28:2abbf8463fa8 422 * @author M. Abdelmawla
tsungta 28:2abbf8463fa8 423 * @date 15 July 2012
tsungta 28:2abbf8463fa8 424 * @return 1 in case of interrupt received else 0 will be returned
tsungta 28:2abbf8463fa8 425 * @version 1.0
tsungta 28:2abbf8463fa8 426 */
tsungta 28:2abbf8463fa8 427 static sint8 hif_isr(void)
tsungta 28:2abbf8463fa8 428 {
tsungta 28:2abbf8463fa8 429 sint8 ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 430 uint32 reg;
tsungta 28:2abbf8463fa8 431 volatile tstrHifHdr strHif;
tsungta 28:2abbf8463fa8 432
tsungta 28:2abbf8463fa8 433 ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, &reg);
tsungta 28:2abbf8463fa8 434 if(M2M_SUCCESS == ret)
tsungta 28:2abbf8463fa8 435 {
tsungta 28:2abbf8463fa8 436 if(reg & 0x1) /* New interrupt has been received */
tsungta 28:2abbf8463fa8 437 {
tsungta 28:2abbf8463fa8 438 uint16 size;
tsungta 28:2abbf8463fa8 439
tsungta 28:2abbf8463fa8 440 nm_bsp_interrupt_ctrl(0);
tsungta 28:2abbf8463fa8 441 /*Clearing RX interrupt*/
tsungta 28:2abbf8463fa8 442 reg &= ~NBIT0;
tsungta 28:2abbf8463fa8 443 ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0,reg);
tsungta 28:2abbf8463fa8 444 if(ret != M2M_SUCCESS)goto ERR1;
tsungta 28:2abbf8463fa8 445 gstrHifCxt.u8HifRXDone = 1;
tsungta 28:2abbf8463fa8 446 size = (uint16)((reg >> 2) & 0xfff);
tsungta 28:2abbf8463fa8 447 if (size > 0) {
tsungta 28:2abbf8463fa8 448 uint32 address = 0;
tsungta 28:2abbf8463fa8 449 /**
tsungta 28:2abbf8463fa8 450 start bus transfer
tsungta 28:2abbf8463fa8 451 **/
tsungta 28:2abbf8463fa8 452 ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1, &address);
tsungta 28:2abbf8463fa8 453 if(M2M_SUCCESS != ret)
tsungta 28:2abbf8463fa8 454 {
tsungta 28:2abbf8463fa8 455 M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_1 bus fail\n");
tsungta 28:2abbf8463fa8 456 nm_bsp_interrupt_ctrl(1);
tsungta 28:2abbf8463fa8 457 goto ERR1;
tsungta 28:2abbf8463fa8 458 }
tsungta 28:2abbf8463fa8 459 gstrHifCxt.u32RxAddr = address;
tsungta 28:2abbf8463fa8 460 gstrHifCxt.u32RxSize = size;
tsungta 28:2abbf8463fa8 461 ret = nm_read_block(address, (uint8*)&strHif, sizeof(tstrHifHdr));
tsungta 28:2abbf8463fa8 462 strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length);
tsungta 28:2abbf8463fa8 463 if(M2M_SUCCESS != ret)
tsungta 28:2abbf8463fa8 464 {
tsungta 28:2abbf8463fa8 465 M2M_ERR("(hif) address bus fail\n");
tsungta 28:2abbf8463fa8 466 nm_bsp_interrupt_ctrl(1);
tsungta 28:2abbf8463fa8 467 goto ERR1;
tsungta 28:2abbf8463fa8 468 }
tsungta 28:2abbf8463fa8 469 if(strHif.u16Length != size)
tsungta 28:2abbf8463fa8 470 {
tsungta 28:2abbf8463fa8 471 if((size - strHif.u16Length) > 4)
tsungta 28:2abbf8463fa8 472 {
tsungta 28:2abbf8463fa8 473 M2M_ERR("(hif) Corrupted packet Size = %u <L = %u, G = %u, OP = %02X>\n",
tsungta 28:2abbf8463fa8 474 size, strHif.u16Length, strHif.u8Gid, strHif.u8Opcode);
tsungta 28:2abbf8463fa8 475 nm_bsp_interrupt_ctrl(1);
tsungta 28:2abbf8463fa8 476 ret = M2M_ERR_BUS_FAIL;
tsungta 28:2abbf8463fa8 477 goto ERR1;
tsungta 28:2abbf8463fa8 478 }
tsungta 28:2abbf8463fa8 479 }
tsungta 28:2abbf8463fa8 480
tsungta 28:2abbf8463fa8 481 if(M2M_REQ_GROUP_WIFI == strHif.u8Gid)
tsungta 28:2abbf8463fa8 482 {
tsungta 28:2abbf8463fa8 483 if(gstrHifCxt.pfWifiCb)
tsungta 28:2abbf8463fa8 484 gstrHifCxt.pfWifiCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET);
tsungta 28:2abbf8463fa8 485 else
tsungta 28:2abbf8463fa8 486 M2M_ERR("WIFI callback is not registered\n");
tsungta 28:2abbf8463fa8 487
tsungta 28:2abbf8463fa8 488 }
tsungta 28:2abbf8463fa8 489 else if(M2M_REQ_GROUP_IP == strHif.u8Gid)
tsungta 28:2abbf8463fa8 490 {
tsungta 28:2abbf8463fa8 491 if(gstrHifCxt.pfIpCb)
tsungta 28:2abbf8463fa8 492 gstrHifCxt.pfIpCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET);
tsungta 28:2abbf8463fa8 493 else
tsungta 28:2abbf8463fa8 494 M2M_ERR("Scoket callback is not registered\n");
tsungta 28:2abbf8463fa8 495
tsungta 28:2abbf8463fa8 496 }
tsungta 28:2abbf8463fa8 497 else if(M2M_REQ_GROUP_OTA == strHif.u8Gid)
tsungta 28:2abbf8463fa8 498 {
tsungta 28:2abbf8463fa8 499 if(gstrHifCxt.pfOtaCb)
tsungta 28:2abbf8463fa8 500 gstrHifCxt.pfOtaCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET);
tsungta 28:2abbf8463fa8 501 else
tsungta 28:2abbf8463fa8 502 M2M_ERR("Ota callback is not registered\n");
tsungta 28:2abbf8463fa8 503
tsungta 28:2abbf8463fa8 504 }
tsungta 28:2abbf8463fa8 505 else if(M2M_REQ_GROUP_CRYPTO == strHif.u8Gid)
tsungta 28:2abbf8463fa8 506 {
tsungta 28:2abbf8463fa8 507 if(gstrHifCxt.pfCryptoCb)
tsungta 28:2abbf8463fa8 508 gstrHifCxt.pfCryptoCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET);
tsungta 28:2abbf8463fa8 509
tsungta 28:2abbf8463fa8 510 else
tsungta 28:2abbf8463fa8 511 M2M_ERR("Crypto callback is not registered\n");
tsungta 28:2abbf8463fa8 512 }
tsungta 28:2abbf8463fa8 513 else if(M2M_REQ_GROUP_SIGMA == strHif.u8Gid)
tsungta 28:2abbf8463fa8 514 {
tsungta 28:2abbf8463fa8 515 if(gstrHifCxt.pfSigmaCb)
tsungta 28:2abbf8463fa8 516 gstrHifCxt.pfSigmaCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET);
tsungta 28:2abbf8463fa8 517 else
tsungta 28:2abbf8463fa8 518 M2M_ERR("Sigma callback is not registered\n");
tsungta 28:2abbf8463fa8 519 }
tsungta 28:2abbf8463fa8 520 else if(M2M_REQ_GROUP_SSL == strHif.u8Gid)
tsungta 28:2abbf8463fa8 521 {
tsungta 28:2abbf8463fa8 522 if(gstrHifCxt.pfSslCb)
tsungta 28:2abbf8463fa8 523 gstrHifCxt.pfSslCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET);
tsungta 28:2abbf8463fa8 524 }
tsungta 28:2abbf8463fa8 525 else
tsungta 28:2abbf8463fa8 526 {
tsungta 28:2abbf8463fa8 527 M2M_ERR("(hif) invalid group ID\n");
tsungta 28:2abbf8463fa8 528 ret = M2M_ERR_BUS_FAIL;
tsungta 28:2abbf8463fa8 529 goto ERR1;
tsungta 28:2abbf8463fa8 530 }
tsungta 28:2abbf8463fa8 531 if(gstrHifCxt.u8HifRXDone)
tsungta 28:2abbf8463fa8 532 {
tsungta 28:2abbf8463fa8 533 M2M_ERR("(hif) host app didn't set RX Done <%u><%X>\n", strHif.u8Gid, strHif.u8Opcode);
tsungta 28:2abbf8463fa8 534 ret = hif_set_rx_done();
tsungta 28:2abbf8463fa8 535 if(ret != M2M_SUCCESS) goto ERR1;
tsungta 28:2abbf8463fa8 536 }
tsungta 28:2abbf8463fa8 537 }
tsungta 28:2abbf8463fa8 538 else
tsungta 28:2abbf8463fa8 539 {
tsungta 28:2abbf8463fa8 540 M2M_ERR("(hif) Wrong Size\n");
tsungta 28:2abbf8463fa8 541 ret = M2M_ERR_RCV;
tsungta 28:2abbf8463fa8 542 goto ERR1;
tsungta 28:2abbf8463fa8 543 }
tsungta 28:2abbf8463fa8 544 }
tsungta 28:2abbf8463fa8 545 else
tsungta 28:2abbf8463fa8 546 {
tsungta 28:2abbf8463fa8 547 #ifndef WIN32
tsungta 28:2abbf8463fa8 548 M2M_ERR("(hif) False interrupt %lx",reg);
tsungta 28:2abbf8463fa8 549 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 550 goto ERR1;
tsungta 28:2abbf8463fa8 551 #else
tsungta 28:2abbf8463fa8 552 #endif
tsungta 28:2abbf8463fa8 553 }
tsungta 28:2abbf8463fa8 554 }
tsungta 28:2abbf8463fa8 555 else
tsungta 28:2abbf8463fa8 556 {
tsungta 28:2abbf8463fa8 557 M2M_ERR("(hif) Fail to Read interrupt reg\n");
tsungta 28:2abbf8463fa8 558 goto ERR1;
tsungta 28:2abbf8463fa8 559 }
tsungta 28:2abbf8463fa8 560
tsungta 28:2abbf8463fa8 561 ERR1:
tsungta 28:2abbf8463fa8 562 return ret;
tsungta 28:2abbf8463fa8 563 }
tsungta 28:2abbf8463fa8 564
tsungta 28:2abbf8463fa8 565 /**
tsungta 28:2abbf8463fa8 566 * @fn hif_handle_isr(void)
tsungta 28:2abbf8463fa8 567 * @brief Handle interrupt received from NMC1500 firmware.
tsungta 28:2abbf8463fa8 568 * @return The function SHALL return 0 for success and a negative value otherwise.
tsungta 28:2abbf8463fa8 569 */
tsungta 28:2abbf8463fa8 570
tsungta 28:2abbf8463fa8 571 sint8 hif_handle_isr(void)
tsungta 28:2abbf8463fa8 572 {
tsungta 28:2abbf8463fa8 573 sint8 ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 574 while (gstrHifCxt.u8Interrupt) {
tsungta 28:2abbf8463fa8 575 /*must be at that place because of the race of interrupt increment and that decrement*/
tsungta 28:2abbf8463fa8 576 /*when the interrupt enabled*/
tsungta 28:2abbf8463fa8 577 gstrHifCxt.u8Interrupt--;
tsungta 28:2abbf8463fa8 578 while(1)
tsungta 28:2abbf8463fa8 579 {
tsungta 28:2abbf8463fa8 580 ret = hif_isr();
tsungta 28:2abbf8463fa8 581 if(ret == M2M_SUCCESS) {
tsungta 28:2abbf8463fa8 582 /*we will try forever untill we get that interrupt*/
tsungta 28:2abbf8463fa8 583 /*Fail return errors here due to bus errors (reading expected values)*/
tsungta 28:2abbf8463fa8 584 break;
tsungta 28:2abbf8463fa8 585 } else {
tsungta 28:2abbf8463fa8 586 M2M_ERR("(HIF) Fail to handle interrupt %d try Again..\n",ret);
tsungta 28:2abbf8463fa8 587 }
tsungta 28:2abbf8463fa8 588 }
tsungta 28:2abbf8463fa8 589 }
tsungta 28:2abbf8463fa8 590
tsungta 28:2abbf8463fa8 591 return ret;
tsungta 28:2abbf8463fa8 592 }
tsungta 28:2abbf8463fa8 593 /*
tsungta 28:2abbf8463fa8 594 * @fn hif_receive
tsungta 28:2abbf8463fa8 595 * @brief Host interface interrupt serviece routine
tsungta 28:2abbf8463fa8 596 * @param [in] u32Addr
tsungta 28:2abbf8463fa8 597 * Receive start address
tsungta 28:2abbf8463fa8 598 * @param [out] pu8Buf
tsungta 28:2abbf8463fa8 599 * Pointer to receive buffer. Allocated by the caller
tsungta 28:2abbf8463fa8 600 * @param [in] u16Sz
tsungta 28:2abbf8463fa8 601 * Receive buffer size
tsungta 28:2abbf8463fa8 602 * @param [in] isDone
tsungta 28:2abbf8463fa8 603 * If you don't need any more packets send True otherwise send false
tsungta 28:2abbf8463fa8 604 * @return The function shall return ZERO for successful operation and a negative value otherwise.
tsungta 28:2abbf8463fa8 605 */
tsungta 28:2abbf8463fa8 606 sint8 hif_receive(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz, uint8 isDone)
tsungta 28:2abbf8463fa8 607 {
tsungta 28:2abbf8463fa8 608 sint8 ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 609 if((u32Addr == 0)||(pu8Buf == NULL) || (u16Sz == 0))
tsungta 28:2abbf8463fa8 610 {
tsungta 28:2abbf8463fa8 611 if(isDone)
tsungta 28:2abbf8463fa8 612 {
tsungta 28:2abbf8463fa8 613 /* set RX done */
tsungta 28:2abbf8463fa8 614 ret = hif_set_rx_done();
tsungta 28:2abbf8463fa8 615 }
tsungta 28:2abbf8463fa8 616 else
tsungta 28:2abbf8463fa8 617 {
tsungta 28:2abbf8463fa8 618 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 619 M2M_ERR(" hif_receive: Invalid argument\n");
tsungta 28:2abbf8463fa8 620 }
tsungta 28:2abbf8463fa8 621 goto ERR1;
tsungta 28:2abbf8463fa8 622 }
tsungta 28:2abbf8463fa8 623
tsungta 28:2abbf8463fa8 624 if(u16Sz > gstrHifCxt.u32RxSize)
tsungta 28:2abbf8463fa8 625 {
tsungta 28:2abbf8463fa8 626 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 627 M2M_ERR("APP Requested Size is larger than the recived buffer size <%u><%lu>\n",u16Sz, gstrHifCxt.u32RxSize);
tsungta 28:2abbf8463fa8 628 goto ERR1;
tsungta 28:2abbf8463fa8 629 }
tsungta 28:2abbf8463fa8 630 if((u32Addr < gstrHifCxt.u32RxAddr)||((u32Addr + u16Sz)>(gstrHifCxt.u32RxAddr + gstrHifCxt.u32RxSize)))
tsungta 28:2abbf8463fa8 631 {
tsungta 28:2abbf8463fa8 632 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 633 M2M_ERR("APP Requested Address beyond the recived buffer address and length\n");
tsungta 28:2abbf8463fa8 634 goto ERR1;
tsungta 28:2abbf8463fa8 635 }
tsungta 28:2abbf8463fa8 636
tsungta 28:2abbf8463fa8 637 /* Receive the payload */
tsungta 28:2abbf8463fa8 638 ret = nm_read_block(u32Addr, pu8Buf, u16Sz);
tsungta 28:2abbf8463fa8 639 if(ret != M2M_SUCCESS)goto ERR1;
tsungta 28:2abbf8463fa8 640
tsungta 28:2abbf8463fa8 641 /* check if this is the last packet */
tsungta 28:2abbf8463fa8 642 if((((gstrHifCxt.u32RxAddr + gstrHifCxt.u32RxSize) - (u32Addr + u16Sz)) <= 0) || isDone)
tsungta 28:2abbf8463fa8 643 {
tsungta 28:2abbf8463fa8 644 /* set RX done */
tsungta 28:2abbf8463fa8 645 ret = hif_set_rx_done();
tsungta 28:2abbf8463fa8 646 }
tsungta 28:2abbf8463fa8 647
tsungta 28:2abbf8463fa8 648 ERR1:
tsungta 28:2abbf8463fa8 649 return ret;
tsungta 28:2abbf8463fa8 650 }
tsungta 28:2abbf8463fa8 651
tsungta 28:2abbf8463fa8 652 /**
tsungta 28:2abbf8463fa8 653 * @fn hif_register_cb
tsungta 28:2abbf8463fa8 654 * @brief To set Callback function for every compantent Component
tsungta 28:2abbf8463fa8 655 * @param [in] u8Grp
tsungta 28:2abbf8463fa8 656 * Group to which the Callback function should be set.
tsungta 28:2abbf8463fa8 657 * @param [in] fn
tsungta 28:2abbf8463fa8 658 * function to be set
tsungta 28:2abbf8463fa8 659 * @return The function shall return ZERO for successful operation and a negative value otherwise.
tsungta 28:2abbf8463fa8 660 */
tsungta 28:2abbf8463fa8 661
tsungta 28:2abbf8463fa8 662 sint8 hif_register_cb(uint8 u8Grp,tpfHifCallBack fn)
tsungta 28:2abbf8463fa8 663 {
tsungta 28:2abbf8463fa8 664 sint8 ret = M2M_SUCCESS;
tsungta 28:2abbf8463fa8 665 switch(u8Grp)
tsungta 28:2abbf8463fa8 666 {
tsungta 28:2abbf8463fa8 667 case M2M_REQ_GROUP_IP:
tsungta 28:2abbf8463fa8 668 gstrHifCxt.pfIpCb = fn;
tsungta 28:2abbf8463fa8 669 break;
tsungta 28:2abbf8463fa8 670 case M2M_REQ_GROUP_WIFI:
tsungta 28:2abbf8463fa8 671 gstrHifCxt.pfWifiCb = fn;
tsungta 28:2abbf8463fa8 672 break;
tsungta 28:2abbf8463fa8 673 case M2M_REQ_GROUP_OTA:
tsungta 28:2abbf8463fa8 674 gstrHifCxt.pfOtaCb = fn;
tsungta 28:2abbf8463fa8 675 break;
tsungta 28:2abbf8463fa8 676 case M2M_REQ_GROUP_HIF:
tsungta 28:2abbf8463fa8 677 gstrHifCxt.pfHifCb = fn;
tsungta 28:2abbf8463fa8 678 break;
tsungta 28:2abbf8463fa8 679 case M2M_REQ_GROUP_CRYPTO:
tsungta 28:2abbf8463fa8 680 gstrHifCxt.pfCryptoCb = fn;
tsungta 28:2abbf8463fa8 681 break;
tsungta 28:2abbf8463fa8 682 case M2M_REQ_GROUP_SIGMA:
tsungta 28:2abbf8463fa8 683 gstrHifCxt.pfSigmaCb = fn;
tsungta 28:2abbf8463fa8 684 break;
tsungta 28:2abbf8463fa8 685 case M2M_REQ_GROUP_SSL:
tsungta 28:2abbf8463fa8 686 gstrHifCxt.pfSslCb = fn;
tsungta 28:2abbf8463fa8 687 break;
tsungta 28:2abbf8463fa8 688 default:
tsungta 28:2abbf8463fa8 689 M2M_ERR("GRp ? %d\n",u8Grp);
tsungta 28:2abbf8463fa8 690 ret = M2M_ERR_FAIL;
tsungta 28:2abbf8463fa8 691 break;
tsungta 28:2abbf8463fa8 692 }
tsungta 28:2abbf8463fa8 693 return ret;
tsungta 28:2abbf8463fa8 694 }
tsungta 28:2abbf8463fa8 695
tsungta 28:2abbf8463fa8 696 #endif
tsungta 28:2abbf8463fa8 697