TI's MQTT Demo with freertos CM4F

Dependencies:   mbed

Committer:
dflet
Date:
Thu Sep 03 14:07:01 2015 +0000
Revision:
0:1e7b5dd9edb4
First commit, it's been hanging around for a while. Updated SPI mode change 1 to 0.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:1e7b5dd9edb4 1 /*
dflet 0:1e7b5dd9edb4 2 * fs.c - CC31xx/CC32xx Host Driver Implementation
dflet 0:1e7b5dd9edb4 3 *
dflet 0:1e7b5dd9edb4 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:1e7b5dd9edb4 5 *
dflet 0:1e7b5dd9edb4 6 *
dflet 0:1e7b5dd9edb4 7 * Redistribution and use in source and binary forms, with or without
dflet 0:1e7b5dd9edb4 8 * modification, are permitted provided that the following conditions
dflet 0:1e7b5dd9edb4 9 * are met:
dflet 0:1e7b5dd9edb4 10 *
dflet 0:1e7b5dd9edb4 11 * Redistributions of source code must retain the above copyright
dflet 0:1e7b5dd9edb4 12 * notice, this list of conditions and the following disclaimer.
dflet 0:1e7b5dd9edb4 13 *
dflet 0:1e7b5dd9edb4 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:1e7b5dd9edb4 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:1e7b5dd9edb4 16 * documentation and/or other materials provided with the
dflet 0:1e7b5dd9edb4 17 * distribution.
dflet 0:1e7b5dd9edb4 18 *
dflet 0:1e7b5dd9edb4 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:1e7b5dd9edb4 20 * its contributors may be used to endorse or promote products derived
dflet 0:1e7b5dd9edb4 21 * from this software without specific prior written permission.
dflet 0:1e7b5dd9edb4 22 *
dflet 0:1e7b5dd9edb4 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:1e7b5dd9edb4 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:1e7b5dd9edb4 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:1e7b5dd9edb4 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:1e7b5dd9edb4 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:1e7b5dd9edb4 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:1e7b5dd9edb4 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:1e7b5dd9edb4 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:1e7b5dd9edb4 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:1e7b5dd9edb4 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:1e7b5dd9edb4 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:1e7b5dd9edb4 34 *
dflet 0:1e7b5dd9edb4 35 */
dflet 0:1e7b5dd9edb4 36
dflet 0:1e7b5dd9edb4 37
dflet 0:1e7b5dd9edb4 38
dflet 0:1e7b5dd9edb4 39 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 40 /* Include files */
dflet 0:1e7b5dd9edb4 41 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 42 #include "cc3100_simplelink.h"
dflet 0:1e7b5dd9edb4 43 #include "cc3100_protocol.h"
dflet 0:1e7b5dd9edb4 44 #include "cc3100_driver.h"
dflet 0:1e7b5dd9edb4 45
dflet 0:1e7b5dd9edb4 46 #include "cc3100_fs.h"
dflet 0:1e7b5dd9edb4 47
dflet 0:1e7b5dd9edb4 48
dflet 0:1e7b5dd9edb4 49
dflet 0:1e7b5dd9edb4 50 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 51 /* Macro declarations */
dflet 0:1e7b5dd9edb4 52 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 53 #define sl_min(a,b) (((a) < (b)) ? (a) : (b))
dflet 0:1e7b5dd9edb4 54 #define MAX_NVMEM_CHUNK_SIZE 1460
dflet 0:1e7b5dd9edb4 55
dflet 0:1e7b5dd9edb4 56 namespace mbed_cc3100 {
dflet 0:1e7b5dd9edb4 57
dflet 0:1e7b5dd9edb4 58 cc3100_fs::cc3100_fs(cc3100_driver &driver)
dflet 0:1e7b5dd9edb4 59 : _driver(driver)
dflet 0:1e7b5dd9edb4 60 {
dflet 0:1e7b5dd9edb4 61
dflet 0:1e7b5dd9edb4 62 }
dflet 0:1e7b5dd9edb4 63
dflet 0:1e7b5dd9edb4 64 cc3100_fs::~cc3100_fs()
dflet 0:1e7b5dd9edb4 65 {
dflet 0:1e7b5dd9edb4 66
dflet 0:1e7b5dd9edb4 67 }
dflet 0:1e7b5dd9edb4 68
dflet 0:1e7b5dd9edb4 69 #ifndef SL_TINY
dflet 0:1e7b5dd9edb4 70 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 71 /* Internal functions */
dflet 0:1e7b5dd9edb4 72 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 73
dflet 0:1e7b5dd9edb4 74
dflet 0:1e7b5dd9edb4 75 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 76 /* _sl_Strlen */
dflet 0:1e7b5dd9edb4 77 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 78 uint16_t cc3100_fs::_sl_Strlen(const uint8_t *buffer)
dflet 0:1e7b5dd9edb4 79 {
dflet 0:1e7b5dd9edb4 80 uint16_t len = 0;
dflet 0:1e7b5dd9edb4 81 if( buffer != NULL ) {
dflet 0:1e7b5dd9edb4 82 while(*buffer++) len++;
dflet 0:1e7b5dd9edb4 83 }
dflet 0:1e7b5dd9edb4 84 return len;
dflet 0:1e7b5dd9edb4 85 }
dflet 0:1e7b5dd9edb4 86
dflet 0:1e7b5dd9edb4 87 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 88 /* _sl_GetCreateFsMode */
dflet 0:1e7b5dd9edb4 89 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 90 uint32_t cc3100_fs::_sl_GetCreateFsMode(uint32_t maxSizeInBytes,uint32_t accessFlags)
dflet 0:1e7b5dd9edb4 91 {
dflet 0:1e7b5dd9edb4 92 uint32_t granIdx = 0;
dflet 0:1e7b5dd9edb4 93 uint32_t granNum = 0;
dflet 0:1e7b5dd9edb4 94 uint32_t granTable[_FS_MAX_MODE_SIZE_GRAN] = {256,1024,4096,16384,65536};
dflet 0:1e7b5dd9edb4 95 for(granIdx= _FS_MODE_SIZE_GRAN_256B ; granIdx< _FS_MAX_MODE_SIZE_GRAN; granIdx++) {
dflet 0:1e7b5dd9edb4 96 if( granTable[granIdx]*255 >= maxSizeInBytes )
dflet 0:1e7b5dd9edb4 97 break;
dflet 0:1e7b5dd9edb4 98 }
dflet 0:1e7b5dd9edb4 99 granNum = maxSizeInBytes/granTable[granIdx];
dflet 0:1e7b5dd9edb4 100 if( maxSizeInBytes % granTable[granIdx] != 0 )
dflet 0:1e7b5dd9edb4 101 granNum++;
dflet 0:1e7b5dd9edb4 102
dflet 0:1e7b5dd9edb4 103 return _FS_MODE(_FS_MODE_OPEN_WRITE_CREATE_IF_NOT_EXIST, granIdx, granNum, accessFlags);
dflet 0:1e7b5dd9edb4 104 }
dflet 0:1e7b5dd9edb4 105 #endif
dflet 0:1e7b5dd9edb4 106
dflet 0:1e7b5dd9edb4 107 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 108 /* API functions */
dflet 0:1e7b5dd9edb4 109 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 110
dflet 0:1e7b5dd9edb4 111 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 112 /* sl_FsOpen */
dflet 0:1e7b5dd9edb4 113 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 114 typedef union {
dflet 0:1e7b5dd9edb4 115 _FsOpenCommand_t Cmd;
dflet 0:1e7b5dd9edb4 116 _FsOpenResponse_t Rsp;
dflet 0:1e7b5dd9edb4 117 } _SlFsOpenMsg_u;
dflet 0:1e7b5dd9edb4 118
dflet 0:1e7b5dd9edb4 119 #if _SL_INCLUDE_FUNC(sl_FsOpen)
dflet 0:1e7b5dd9edb4 120 const _SlCmdCtrl_t _SlFsOpenCmdCtrl = {
dflet 0:1e7b5dd9edb4 121 SL_OPCODE_NVMEM_FILEOPEN,
dflet 0:1e7b5dd9edb4 122 sizeof(_FsOpenCommand_t),
dflet 0:1e7b5dd9edb4 123 sizeof(_FsOpenResponse_t)
dflet 0:1e7b5dd9edb4 124 };
dflet 0:1e7b5dd9edb4 125
dflet 0:1e7b5dd9edb4 126 int32_t cc3100_fs::sl_FsOpen(const uint8_t *pFileName, const uint32_t AccessModeAndMaxSize, uint32_t *pToken,int32_t *pFileHandle)
dflet 0:1e7b5dd9edb4 127 {
dflet 0:1e7b5dd9edb4 128 _SlReturnVal_t RetVal;
dflet 0:1e7b5dd9edb4 129 _SlFsOpenMsg_u Msg;
dflet 0:1e7b5dd9edb4 130 _SlCmdExt_t CmdExt;
dflet 0:1e7b5dd9edb4 131
dflet 0:1e7b5dd9edb4 132 CmdExt.TxPayloadLen = (_sl_Strlen(pFileName)+4) & (~3); // add 4: 1 for NULL and the 3 for align
dflet 0:1e7b5dd9edb4 133 CmdExt.RxPayloadLen = 0;
dflet 0:1e7b5dd9edb4 134 CmdExt.pTxPayload = (uint8_t *)pFileName;
dflet 0:1e7b5dd9edb4 135 CmdExt.pRxPayload = NULL;
dflet 0:1e7b5dd9edb4 136
dflet 0:1e7b5dd9edb4 137 Msg.Cmd.Mode = AccessModeAndMaxSize;
dflet 0:1e7b5dd9edb4 138
dflet 0:1e7b5dd9edb4 139 if(pToken != NULL) {
dflet 0:1e7b5dd9edb4 140 Msg.Cmd.Token = *pToken;
dflet 0:1e7b5dd9edb4 141 } else {
dflet 0:1e7b5dd9edb4 142 Msg.Cmd.Token = 0;
dflet 0:1e7b5dd9edb4 143 }
dflet 0:1e7b5dd9edb4 144
dflet 0:1e7b5dd9edb4 145 RetVal = _driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsOpenCmdCtrl, &Msg, &CmdExt);
dflet 0:1e7b5dd9edb4 146 *pFileHandle = Msg.Rsp.FileHandle;
dflet 0:1e7b5dd9edb4 147 if (pToken != NULL) {
dflet 0:1e7b5dd9edb4 148 *pToken = Msg.Rsp.Token;
dflet 0:1e7b5dd9edb4 149 }
dflet 0:1e7b5dd9edb4 150
dflet 0:1e7b5dd9edb4 151 /* in case of an error, return the erros file handler as an error code */
dflet 0:1e7b5dd9edb4 152 if( *pFileHandle < 0 ) {
dflet 0:1e7b5dd9edb4 153 return *pFileHandle;
dflet 0:1e7b5dd9edb4 154 }
dflet 0:1e7b5dd9edb4 155 return (int32_t)RetVal;
dflet 0:1e7b5dd9edb4 156 }
dflet 0:1e7b5dd9edb4 157 #endif
dflet 0:1e7b5dd9edb4 158
dflet 0:1e7b5dd9edb4 159 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 160 /* sl_FsClose */
dflet 0:1e7b5dd9edb4 161 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 162 typedef union {
dflet 0:1e7b5dd9edb4 163 _FsCloseCommand_t Cmd;
dflet 0:1e7b5dd9edb4 164 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 165 } _SlFsCloseMsg_u;
dflet 0:1e7b5dd9edb4 166
dflet 0:1e7b5dd9edb4 167 #if _SL_INCLUDE_FUNC(sl_FsClose)
dflet 0:1e7b5dd9edb4 168 const _SlCmdCtrl_t _SlFsCloseCmdCtrl = {
dflet 0:1e7b5dd9edb4 169 SL_OPCODE_NVMEM_FILECLOSE,
dflet 0:1e7b5dd9edb4 170 sizeof(_FsCloseCommand_t),
dflet 0:1e7b5dd9edb4 171 sizeof(_FsCloseResponse_t)
dflet 0:1e7b5dd9edb4 172 };
dflet 0:1e7b5dd9edb4 173
dflet 0:1e7b5dd9edb4 174 int16_t cc3100_fs::sl_FsClose(const int32_t FileHdl, const uint8_t* pCeritificateFileName, const uint8_t* pSignature ,const uint32_t SignatureLen)
dflet 0:1e7b5dd9edb4 175 {
dflet 0:1e7b5dd9edb4 176 _SlFsCloseMsg_u Msg = {0};
dflet 0:1e7b5dd9edb4 177 _SlCmdExt_t ExtCtrl;
dflet 0:1e7b5dd9edb4 178
dflet 0:1e7b5dd9edb4 179 Msg.Cmd.FileHandle = FileHdl;
dflet 0:1e7b5dd9edb4 180 if( pCeritificateFileName != NULL ) {
dflet 0:1e7b5dd9edb4 181 Msg.Cmd.CertificFileNameLength = (_sl_Strlen(pCeritificateFileName)+4) & (~3); /* add 4: 1 for NULL and the 3 for align */
dflet 0:1e7b5dd9edb4 182 }
dflet 0:1e7b5dd9edb4 183 Msg.Cmd.SignatureLen = SignatureLen;
dflet 0:1e7b5dd9edb4 184
dflet 0:1e7b5dd9edb4 185 ExtCtrl.TxPayloadLen = ((SignatureLen+3) & (~3)); /* align */
dflet 0:1e7b5dd9edb4 186 ExtCtrl.pTxPayload = (uint8_t*)pSignature;
dflet 0:1e7b5dd9edb4 187 ExtCtrl.RxPayloadLen = (int16_t)Msg.Cmd.CertificFileNameLength;
dflet 0:1e7b5dd9edb4 188 ExtCtrl.pRxPayload = (uint8_t*)pCeritificateFileName; /* Add signature */
dflet 0:1e7b5dd9edb4 189
dflet 0:1e7b5dd9edb4 190 if(ExtCtrl.pRxPayload != NULL && ExtCtrl.RxPayloadLen != 0) {
dflet 0:1e7b5dd9edb4 191 ExtCtrl.RxPayloadLen = ExtCtrl.RxPayloadLen * (-1);
dflet 0:1e7b5dd9edb4 192 }
dflet 0:1e7b5dd9edb4 193
dflet 0:1e7b5dd9edb4 194 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsCloseCmdCtrl, &Msg, &ExtCtrl));
dflet 0:1e7b5dd9edb4 195
dflet 0:1e7b5dd9edb4 196 return (int16_t)((int16_t)Msg.Rsp.status);
dflet 0:1e7b5dd9edb4 197 }
dflet 0:1e7b5dd9edb4 198 #endif
dflet 0:1e7b5dd9edb4 199
dflet 0:1e7b5dd9edb4 200
dflet 0:1e7b5dd9edb4 201 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 202 /* sl_FsRead */
dflet 0:1e7b5dd9edb4 203 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 204 typedef union {
dflet 0:1e7b5dd9edb4 205 _FsReadCommand_t Cmd;
dflet 0:1e7b5dd9edb4 206 _FsReadResponse_t Rsp;
dflet 0:1e7b5dd9edb4 207 } _SlFsReadMsg_u;
dflet 0:1e7b5dd9edb4 208
dflet 0:1e7b5dd9edb4 209 #if _SL_INCLUDE_FUNC(sl_FsRead)
dflet 0:1e7b5dd9edb4 210 const _SlCmdCtrl_t _SlFsReadCmdCtrl = {
dflet 0:1e7b5dd9edb4 211 SL_OPCODE_NVMEM_FILEREADCOMMAND,
dflet 0:1e7b5dd9edb4 212 sizeof(_FsReadCommand_t),
dflet 0:1e7b5dd9edb4 213 sizeof(_FsReadResponse_t)
dflet 0:1e7b5dd9edb4 214 };
dflet 0:1e7b5dd9edb4 215
dflet 0:1e7b5dd9edb4 216 int32_t cc3100_fs::sl_FsRead(const int32_t FileHdl, uint32_t Offset, uint8_t* pData, uint32_t Len)
dflet 0:1e7b5dd9edb4 217 {
dflet 0:1e7b5dd9edb4 218 _SlFsReadMsg_u Msg;
dflet 0:1e7b5dd9edb4 219 _SlCmdExt_t ExtCtrl;
dflet 0:1e7b5dd9edb4 220 uint16_t ChunkLen;
dflet 0:1e7b5dd9edb4 221 _SlReturnVal_t RetVal =0;
dflet 0:1e7b5dd9edb4 222 int32_t RetCount = 0;
dflet 0:1e7b5dd9edb4 223
dflet 0:1e7b5dd9edb4 224 ExtCtrl.TxPayloadLen = 0;
dflet 0:1e7b5dd9edb4 225 ExtCtrl.pTxPayload = NULL;
dflet 0:1e7b5dd9edb4 226
dflet 0:1e7b5dd9edb4 227 ChunkLen = (uint16_t)sl_min(MAX_NVMEM_CHUNK_SIZE,Len);
dflet 0:1e7b5dd9edb4 228 ExtCtrl.RxPayloadLen = ChunkLen;
dflet 0:1e7b5dd9edb4 229 ExtCtrl.pRxPayload = (uint8_t *)(pData);
dflet 0:1e7b5dd9edb4 230 Msg.Cmd.Offset = Offset;
dflet 0:1e7b5dd9edb4 231 Msg.Cmd.Len = ChunkLen;
dflet 0:1e7b5dd9edb4 232 Msg.Cmd.FileHandle = FileHdl;
dflet 0:1e7b5dd9edb4 233 do {
dflet 0:1e7b5dd9edb4 234 RetVal = _driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsReadCmdCtrl, &Msg, &ExtCtrl);
dflet 0:1e7b5dd9edb4 235 if(SL_OS_RET_CODE_OK == RetVal) {
dflet 0:1e7b5dd9edb4 236 if( Msg.Rsp.status < 0) {
dflet 0:1e7b5dd9edb4 237 if( RetCount > 0) {
dflet 0:1e7b5dd9edb4 238 return RetCount;
dflet 0:1e7b5dd9edb4 239 } else {
dflet 0:1e7b5dd9edb4 240 return Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 241 }
dflet 0:1e7b5dd9edb4 242 }
dflet 0:1e7b5dd9edb4 243 RetCount += (int32_t)Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 244 Len -= ChunkLen;
dflet 0:1e7b5dd9edb4 245 Offset += ChunkLen;
dflet 0:1e7b5dd9edb4 246 Msg.Cmd.Offset = Offset;
dflet 0:1e7b5dd9edb4 247 ExtCtrl.pRxPayload += ChunkLen;
dflet 0:1e7b5dd9edb4 248 ChunkLen = (uint16_t)sl_min(MAX_NVMEM_CHUNK_SIZE,Len);
dflet 0:1e7b5dd9edb4 249 ExtCtrl.RxPayloadLen = ChunkLen;
dflet 0:1e7b5dd9edb4 250 Msg.Cmd.Len = ChunkLen;
dflet 0:1e7b5dd9edb4 251 Msg.Cmd.FileHandle = FileHdl;
dflet 0:1e7b5dd9edb4 252 } else {
dflet 0:1e7b5dd9edb4 253 return RetVal;
dflet 0:1e7b5dd9edb4 254 }
dflet 0:1e7b5dd9edb4 255 } while(ChunkLen > 0);
dflet 0:1e7b5dd9edb4 256
dflet 0:1e7b5dd9edb4 257 return (int32_t)RetCount;
dflet 0:1e7b5dd9edb4 258 }
dflet 0:1e7b5dd9edb4 259 #endif
dflet 0:1e7b5dd9edb4 260
dflet 0:1e7b5dd9edb4 261 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 262 /* sl_FsWrite */
dflet 0:1e7b5dd9edb4 263 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 264 typedef union {
dflet 0:1e7b5dd9edb4 265 _FsWriteCommand_t Cmd;
dflet 0:1e7b5dd9edb4 266 _FsWriteResponse_t Rsp;
dflet 0:1e7b5dd9edb4 267 } _SlFsWriteMsg_u;
dflet 0:1e7b5dd9edb4 268
dflet 0:1e7b5dd9edb4 269 #if _SL_INCLUDE_FUNC(sl_FsWrite)
dflet 0:1e7b5dd9edb4 270 const _SlCmdCtrl_t _SlFsWriteCmdCtrl = {
dflet 0:1e7b5dd9edb4 271 SL_OPCODE_NVMEM_FILEWRITECOMMAND,
dflet 0:1e7b5dd9edb4 272 sizeof(_FsWriteCommand_t),
dflet 0:1e7b5dd9edb4 273 sizeof(_FsWriteResponse_t)
dflet 0:1e7b5dd9edb4 274 };
dflet 0:1e7b5dd9edb4 275
dflet 0:1e7b5dd9edb4 276 int32_t cc3100_fs::sl_FsWrite(const int32_t FileHdl, uint32_t Offset, uint8_t* pData, uint32_t Len)
dflet 0:1e7b5dd9edb4 277 {
dflet 0:1e7b5dd9edb4 278 _SlFsWriteMsg_u Msg;
dflet 0:1e7b5dd9edb4 279 _SlCmdExt_t ExtCtrl;
dflet 0:1e7b5dd9edb4 280 uint16_t ChunkLen;
dflet 0:1e7b5dd9edb4 281 _SlReturnVal_t RetVal;
dflet 0:1e7b5dd9edb4 282 int32_t RetCount = 0;
dflet 0:1e7b5dd9edb4 283
dflet 0:1e7b5dd9edb4 284 ExtCtrl.RxPayloadLen = 0;
dflet 0:1e7b5dd9edb4 285 ExtCtrl.pRxPayload = NULL;
dflet 0:1e7b5dd9edb4 286
dflet 0:1e7b5dd9edb4 287 ChunkLen = (uint16_t)sl_min(MAX_NVMEM_CHUNK_SIZE,Len);
dflet 0:1e7b5dd9edb4 288 ExtCtrl.TxPayloadLen = ChunkLen;
dflet 0:1e7b5dd9edb4 289 ExtCtrl.pTxPayload = (uint8_t *)(pData);
dflet 0:1e7b5dd9edb4 290 Msg.Cmd.Offset = Offset;
dflet 0:1e7b5dd9edb4 291 Msg.Cmd.Len = ChunkLen;
dflet 0:1e7b5dd9edb4 292 Msg.Cmd.FileHandle = FileHdl;
dflet 0:1e7b5dd9edb4 293
dflet 0:1e7b5dd9edb4 294 do {
dflet 0:1e7b5dd9edb4 295
dflet 0:1e7b5dd9edb4 296 RetVal = _driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsWriteCmdCtrl, &Msg, &ExtCtrl);
dflet 0:1e7b5dd9edb4 297 if(SL_OS_RET_CODE_OK == RetVal) {
dflet 0:1e7b5dd9edb4 298 if( Msg.Rsp.status < 0) {
dflet 0:1e7b5dd9edb4 299 if( RetCount > 0) {
dflet 0:1e7b5dd9edb4 300 return RetCount;
dflet 0:1e7b5dd9edb4 301 } else {
dflet 0:1e7b5dd9edb4 302 return Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 303 }
dflet 0:1e7b5dd9edb4 304 }
dflet 0:1e7b5dd9edb4 305
dflet 0:1e7b5dd9edb4 306 RetCount += (int32_t)Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 307 Len -= ChunkLen;
dflet 0:1e7b5dd9edb4 308 Offset += ChunkLen;
dflet 0:1e7b5dd9edb4 309 Msg.Cmd.Offset = Offset;
dflet 0:1e7b5dd9edb4 310 ExtCtrl.pTxPayload += ChunkLen;
dflet 0:1e7b5dd9edb4 311 ChunkLen = (uint16_t)sl_min(MAX_NVMEM_CHUNK_SIZE,Len);
dflet 0:1e7b5dd9edb4 312 ExtCtrl.TxPayloadLen = ChunkLen;
dflet 0:1e7b5dd9edb4 313 Msg.Cmd.Len = ChunkLen;
dflet 0:1e7b5dd9edb4 314 Msg.Cmd.FileHandle = FileHdl;
dflet 0:1e7b5dd9edb4 315 } else {
dflet 0:1e7b5dd9edb4 316 return RetVal;
dflet 0:1e7b5dd9edb4 317 }
dflet 0:1e7b5dd9edb4 318 } while(ChunkLen > 0);
dflet 0:1e7b5dd9edb4 319
dflet 0:1e7b5dd9edb4 320 return (int32_t)RetCount;
dflet 0:1e7b5dd9edb4 321 }
dflet 0:1e7b5dd9edb4 322 #endif
dflet 0:1e7b5dd9edb4 323
dflet 0:1e7b5dd9edb4 324 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 325 /* sl_FsGetInfo */
dflet 0:1e7b5dd9edb4 326 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 327 typedef union {
dflet 0:1e7b5dd9edb4 328 _FsGetInfoCommand_t Cmd;
dflet 0:1e7b5dd9edb4 329 _FsGetInfoResponse_t Rsp;
dflet 0:1e7b5dd9edb4 330 } _SlFsGetInfoMsg_u;
dflet 0:1e7b5dd9edb4 331
dflet 0:1e7b5dd9edb4 332 #if _SL_INCLUDE_FUNC(sl_FsGetInfo)
dflet 0:1e7b5dd9edb4 333 const _SlCmdCtrl_t _SlFsGetInfoCmdCtrl = {
dflet 0:1e7b5dd9edb4 334 SL_OPCODE_NVMEM_FILEGETINFOCOMMAND,
dflet 0:1e7b5dd9edb4 335 sizeof(_FsGetInfoCommand_t),
dflet 0:1e7b5dd9edb4 336 sizeof(_FsGetInfoResponse_t)
dflet 0:1e7b5dd9edb4 337 };
dflet 0:1e7b5dd9edb4 338
dflet 0:1e7b5dd9edb4 339 int16_t cc3100_fs::sl_FsGetInfo(const uint8_t *pFileName, const uint32_t Token,SlFsFileInfo_t* pFsFileInfo)
dflet 0:1e7b5dd9edb4 340 {
dflet 0:1e7b5dd9edb4 341 _SlFsGetInfoMsg_u Msg;
dflet 0:1e7b5dd9edb4 342 _SlCmdExt_t CmdExt;
dflet 0:1e7b5dd9edb4 343
dflet 0:1e7b5dd9edb4 344 CmdExt.TxPayloadLen = (_sl_Strlen(pFileName)+4) & (~3); /* add 4: 1 for NULL and the 3 for align */
dflet 0:1e7b5dd9edb4 345 CmdExt.RxPayloadLen = 0;
dflet 0:1e7b5dd9edb4 346 CmdExt.pTxPayload = (uint8_t *)pFileName;
dflet 0:1e7b5dd9edb4 347 CmdExt.pRxPayload = NULL;
dflet 0:1e7b5dd9edb4 348 Msg.Cmd.Token = Token;
dflet 0:1e7b5dd9edb4 349
dflet 0:1e7b5dd9edb4 350 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsGetInfoCmdCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 351
dflet 0:1e7b5dd9edb4 352 pFsFileInfo->flags = Msg.Rsp.flags;
dflet 0:1e7b5dd9edb4 353 pFsFileInfo->FileLen = Msg.Rsp.FileLen;
dflet 0:1e7b5dd9edb4 354 pFsFileInfo->AllocatedLen = Msg.Rsp.AllocatedLen;
dflet 0:1e7b5dd9edb4 355 pFsFileInfo->Token[0] = Msg.Rsp.Token[0];
dflet 0:1e7b5dd9edb4 356 pFsFileInfo->Token[1] = Msg.Rsp.Token[1];
dflet 0:1e7b5dd9edb4 357 pFsFileInfo->Token[2] = Msg.Rsp.Token[2];
dflet 0:1e7b5dd9edb4 358 pFsFileInfo->Token[3] = Msg.Rsp.Token[3];
dflet 0:1e7b5dd9edb4 359 return (int16_t)((int16_t)Msg.Rsp.Status);
dflet 0:1e7b5dd9edb4 360 }
dflet 0:1e7b5dd9edb4 361 #endif
dflet 0:1e7b5dd9edb4 362
dflet 0:1e7b5dd9edb4 363 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 364 /* sl_FsDel */
dflet 0:1e7b5dd9edb4 365 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 366 typedef union {
dflet 0:1e7b5dd9edb4 367 _FsDeleteCommand_t Cmd;
dflet 0:1e7b5dd9edb4 368 _FsDeleteResponse_t Rsp;
dflet 0:1e7b5dd9edb4 369 } _SlFsDeleteMsg_u;
dflet 0:1e7b5dd9edb4 370
dflet 0:1e7b5dd9edb4 371 #if _SL_INCLUDE_FUNC(sl_FsDel)
dflet 0:1e7b5dd9edb4 372 const _SlCmdCtrl_t _SlFsDeleteCmdCtrl = {
dflet 0:1e7b5dd9edb4 373 SL_OPCODE_NVMEM_FILEDELCOMMAND,
dflet 0:1e7b5dd9edb4 374 sizeof(_FsDeleteCommand_t),
dflet 0:1e7b5dd9edb4 375 sizeof(_FsDeleteResponse_t)
dflet 0:1e7b5dd9edb4 376 };
dflet 0:1e7b5dd9edb4 377
dflet 0:1e7b5dd9edb4 378 int16_t cc3100_fs::sl_FsDel(const uint8_t *pFileName, const uint32_t Token)
dflet 0:1e7b5dd9edb4 379 {
dflet 0:1e7b5dd9edb4 380 _SlFsDeleteMsg_u Msg;
dflet 0:1e7b5dd9edb4 381 _SlCmdExt_t CmdExt;
dflet 0:1e7b5dd9edb4 382
dflet 0:1e7b5dd9edb4 383 CmdExt.TxPayloadLen = (_sl_Strlen(pFileName)+4) & (~3); /* add 4: 1 for NULL and the 3 for align */
dflet 0:1e7b5dd9edb4 384 CmdExt.RxPayloadLen = 0;
dflet 0:1e7b5dd9edb4 385 CmdExt.pTxPayload = (uint8_t *)pFileName;
dflet 0:1e7b5dd9edb4 386 CmdExt.pRxPayload = NULL;
dflet 0:1e7b5dd9edb4 387 Msg.Cmd.Token = Token;
dflet 0:1e7b5dd9edb4 388
dflet 0:1e7b5dd9edb4 389
dflet 0:1e7b5dd9edb4 390 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsDeleteCmdCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 391
dflet 0:1e7b5dd9edb4 392 return (int16_t)((int16_t)Msg.Rsp.status);
dflet 0:1e7b5dd9edb4 393 }
dflet 0:1e7b5dd9edb4 394 #endif
dflet 0:1e7b5dd9edb4 395
dflet 0:1e7b5dd9edb4 396 }//namespace mbed_cc3100
dflet 0:1e7b5dd9edb4 397
dflet 0:1e7b5dd9edb4 398