SimpleLink CC31xx/CC32xx Host Driver  Version 3.0.1.55
Simplifies the implementation of Internet connectivity
fs.c
1 /*
2  * fs.c - CC31xx/CC32xx Host Driver Implementation
3  *
4  * Copyright (C) 2017 Texas Instruments Incorporated - https://www.ti.com/
5  *
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in the
16  * documentation and/or other materials provided with the
17  * distribution.
18  *
19  * Neither the name of Texas Instruments Incorporated nor the names of
20  * its contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  *
35 */
36 
37 
38 /*****************************************************************************/
39 /* Include files */
40 /*****************************************************************************/
41 #include <ti/drivers/net/wifi/simplelink.h>
42 #include <ti/drivers/net/wifi/source/protocol.h>
43 #include <ti/drivers/net/wifi/source/driver.h>
44 
45 /*****************************************************************************/
46 /* Macro declarations */
47 /*****************************************************************************/
48 #define sl_min(a,b) (((a) < (b)) ? (a) : (b))
49 #define MAX_NVMEM_CHUNK_SIZE 1456 /*should be 16 bytes align, because of encryption data*/
50 
51 /*****************************************************************************/
52 /* Internal functions */
53 /*****************************************************************************/
54 
55 static _u16 _SlFsStrlen(const _u8 *buffer);
56 
57 static _u32 FsGetCreateFsMode(_u8 Mode, _u32 MaxSizeInBytes,_u32 AccessFlags);
58 
59 /*****************************************************************************/
60 /* _SlFsStrlen */
61 /*****************************************************************************/
62 static _u16 _SlFsStrlen(const _u8 *buffer)
63 {
64  _u16 len = 0;
65  if( buffer != NULL )
66  {
67  while(*buffer++) len++;
68  }
69  return len;
70 }
71 /*****************************************************************************/
72 /* _SlFsGetCreateFsMode */
73 /*****************************************************************************/
74 
75 /* Convert the user flag to the file System flag */
76 #define FS_CONVERT_FLAGS( ModeAndMaxSize ) (((_u32)ModeAndMaxSize & SL_FS_OPEN_FLAGS_BIT_MASK)>>SL_NUM_OF_MAXSIZE_BIT)
77 
78 typedef enum
79 {
80  FS_MODE_OPEN_READ = 0,
81  FS_MODE_OPEN_WRITE,
82  FS_MODE_OPEN_CREATE,
83  FS_MODE_OPEN_WRITE_CREATE_IF_NOT_EXIST
84 }FsFileOpenAccessType_e;
85 
86 #define FS_MODE_ACCESS_RESERVED_OFFSET (27)
87 #define FS_MODE_ACCESS_RESERVED_MASK (0x1F)
88 #define FS_MODE_ACCESS_FLAGS_OFFSET (16)
89 #define FS_MODE_ACCESS_FLAGS_MASK (0x7FF)
90 #define FS_MODE_ACCESS_OFFSET (12)
91 #define FS_MODE_ACCESS_MASK (0xF)
92 #define FS_MODE_OPEN_SIZE_GRAN_OFFSET (8)
93 #define FS_MODE_OPEN_SIZE_GRAN_MASK (0xF)
94 #define FS_MODE_OPEN_SIZE_OFFSET (0)
95 #define FS_MODE_OPEN_SIZE_MASK (0xFF)
96 #define FS_MAX_MODE_SIZE (0xFF)
97 
98 /* SizeGran is up to 4 bit , Size can be up to 8 bit */
99 #define FS_MODE(Access, SizeGran, Size,Flags) (_u32)(((_u32)((Access) &FS_MODE_ACCESS_MASK)<<FS_MODE_ACCESS_OFFSET) | \
100  ((_u32)((SizeGran) &FS_MODE_OPEN_SIZE_GRAN_MASK)<<FS_MODE_OPEN_SIZE_GRAN_OFFSET) | \
101  ((_u32)((Size) &FS_MODE_OPEN_SIZE_MASK)<<FS_MODE_OPEN_SIZE_OFFSET) | \
102  ((_u32)((Flags) &FS_MODE_ACCESS_FLAGS_MASK)<<FS_MODE_ACCESS_FLAGS_OFFSET))
103 
104 
105 typedef enum
106 {
107  FS_MODE_SIZE_GRAN_256B = 0, /* MAX_SIZE = 64K */
108  FS_MODE_SIZE_GRAN_1KB, /* MAX_SIZE = 256K */
109  FS_MODE_SIZE_GRAN_4KB, /* MAX_SZIE = 1M */
110  FS_MODE_SIZE_GRAN_16KB, /* MAX_SIZE = 4M */
111  FS_MODE_SIZE_GRAN_64KB, /* MAX_SIZE = 16M */
112  FS_MAX_MODE_SIZE_GRAN
113 }FsFileOpenMaxSizeGran_e;
114 
115 
116 static _u32 FsGetCreateFsMode(_u8 Mode, _u32 MaxSizeInBytes,_u32 AccessFlags)
117 {
118  _u32 granIdx = 0;
119  _u32 granNum = 0;
120  _u32 granTable[FS_MAX_MODE_SIZE_GRAN] = {256,1024,4096,16384,65536};
121 
122  for(granIdx= FS_MODE_SIZE_GRAN_256B ;granIdx< FS_MAX_MODE_SIZE_GRAN;granIdx++)
123  {
124  if( granTable[granIdx]*255 >= MaxSizeInBytes )
125  break;
126  }
127  granNum = MaxSizeInBytes/granTable[granIdx];
128  if( MaxSizeInBytes % granTable[granIdx] != 0 )
129  granNum++;
130 
131  return (_u32)FS_MODE( Mode, granIdx, granNum, AccessFlags );
132 
133 }
134 
135 /*****************************************************************************/
136 /* API functions */
137 /*****************************************************************************/
138 
139 /*****************************************************************************/
140 /* sl_FsOpen */
141 /*****************************************************************************/
142 typedef union
143 {
144  SlFsOpenCommand_t Cmd;
145  SlFsOpenResponse_t Rsp;
146 }_SlFsOpenMsg_u;
147 
148 #if _SL_INCLUDE_FUNC(sl_FsOpen)
149 
150 static const _SlCmdCtrl_t _SlFsOpenCmdCtrl =
151 {
152  SL_OPCODE_NVMEM_FILEOPEN,
153  (_SlArgSize_t)sizeof(SlFsOpenCommand_t),
154  (_SlArgSize_t)sizeof(SlFsOpenResponse_t)
155 };
156 
157 _i32 sl_FsOpen(const _u8 *pFileName,const _u32 ModeAndMaxSize, _u32 *pToken)
158 {
159 
160  _SlFsOpenMsg_u Msg;
161  _SlCmdExt_t CmdExt;
162  _i32 FileHandle;
163  _u32 MaxSizeInBytes;
164  _u32 OpenMode;
165  _u8 CreateMode;
166 
167  /* verify that this api is allowed. if not allowed then
168  ignore the API execution and return immediately with an error */
169  VERIFY_API_ALLOWED(SL_OPCODE_SILO_FS);
170 
171  _SlDrvMemZero(&CmdExt, (_u16)sizeof(_SlCmdExt_t));
172 
173  if ( _SlFsStrlen(pFileName) >= SL_FS_MAX_FILE_NAME_LENGTH )
174  {
175  return SL_ERROR_FS_WRONG_FILE_NAME;
176  }
177 
178  CmdExt.TxPayload1Len = (_u16)((_SlFsStrlen(pFileName)+4) & (~3)); /* add 4: 1 for NULL and the 3 for align */
179  CmdExt.pTxPayload1 = (_u8*)pFileName;
180 
181  OpenMode = ModeAndMaxSize & SL_FS_OPEN_MODE_BIT_MASK;
182 
183  /*convert from the interface flags to the device flags*/
184  if( OpenMode == SL_FS_READ )
185  {
186  Msg.Cmd.Mode = FS_MODE(FS_MODE_OPEN_READ, 0, 0, 0);
187  }
188  else if (( OpenMode == SL_FS_WRITE ) ||( OpenMode == SL_FS_OVERWRITE))
189  {
190  Msg.Cmd.Mode = FS_MODE(FS_MODE_OPEN_WRITE, 0, 0, FS_CONVERT_FLAGS ( ModeAndMaxSize));
191  }
192  /* one of the creation mode */
193  else if ( ( OpenMode == (SL_FS_CREATE | SL_FS_OVERWRITE )) || ( OpenMode == SL_FS_CREATE) ||(OpenMode == (SL_FS_CREATE | SL_FS_WRITE )))
194  {
195  /* test that the size is correct */
196  MaxSizeInBytes = (ModeAndMaxSize & SL_FS_OPEN_MAXSIZE_BIT_MASK) * 256;
197  if (MaxSizeInBytes > 0xFF0000 )
198  {
199  return SL_ERROR_FS_FILE_MAX_SIZE_EXCEEDED;
200  }
201 
202  CreateMode = ((OpenMode == (SL_FS_CREATE | SL_FS_OVERWRITE )) ? FS_MODE_OPEN_WRITE_CREATE_IF_NOT_EXIST : FS_MODE_OPEN_CREATE );
203 
204  Msg.Cmd.Mode = FsGetCreateFsMode( CreateMode ,MaxSizeInBytes, FS_CONVERT_FLAGS ( ModeAndMaxSize) );
205  }
206  else
207  {
208  return SL_ERROR_FS_INVALID_FILE_MODE;
209  }
210 
211  if(pToken != NULL)
212  {
213  Msg.Cmd.Token = *pToken;
214  }
215  else
216  {
217  Msg.Cmd.Token = 0;
218  }
219 
220  _SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsOpenCmdCtrl, &Msg, &CmdExt);
221  FileHandle = (_i32)Msg.Rsp.FileHandle;
222  if (pToken != NULL)
223  {
224  *pToken = Msg.Rsp.Token;
225  }
226 
227  /* in case of an error, return the erros file handler as an error code */
228  return FileHandle;
229 }
230 #endif
231 
232 /*****************************************************************************/
233 /* sl_FsClose */
234 /*****************************************************************************/
235 typedef union
236 {
237  SlFsCloseCommand_t Cmd;
238  _BasicResponse_t Rsp;
239 }_SlFsCloseMsg_u;
240 
241 #if _SL_INCLUDE_FUNC(sl_FsClose)
242 
243 static const _SlCmdCtrl_t _SlFsCloseCmdCtrl =
244 {
245  SL_OPCODE_NVMEM_FILECLOSE,
246  (_SlArgSize_t)sizeof(SlFsCloseCommand_t),
247  (_SlArgSize_t)sizeof(SlFsCloseResponse_t)
248 };
249 
250 _i16 sl_FsClose(const _i32 FileHdl, const _u8* pCeritificateFileName,const _u8* pSignature ,const _u32 SignatureLen)
251 {
252  _SlFsCloseMsg_u Msg;
253  _SlCmdExt_t ExtCtrl;
254 
255  _SlDrvMemZero(&Msg, (_u16)sizeof(SlFsCloseCommand_t));
256 
257  /* verify that this api is allowed. if not allowed then
258  ignore the API execution and return immediately with an error */
259  VERIFY_API_ALLOWED(SL_OPCODE_SILO_FS);
260 
261  Msg.Cmd.FileHandle = (_u32)FileHdl;
262  if( pCeritificateFileName != NULL )
263  {
264  Msg.Cmd.CertificFileNameLength = (_u32)((_SlFsStrlen(pCeritificateFileName)+4) & (~3)); /* add 4: 1 for NULL and the 3 for align */
265  }
266  Msg.Cmd.SignatureLen = SignatureLen;
267 
268  _SlDrvMemZero(&ExtCtrl, (_u16)sizeof(_SlCmdExt_t));
269 
270  ExtCtrl.TxPayload1Len = (_u16)(((SignatureLen+3) & (~3))); /* align */
271  ExtCtrl.pTxPayload1 = (_u8*)pSignature;
272  ExtCtrl.RxPayloadLen = (_i16)Msg.Cmd.CertificFileNameLength;
273  ExtCtrl.pRxPayload = (_u8*)pCeritificateFileName; /* Add signature */
274 
275  if(ExtCtrl.pRxPayload != NULL && ExtCtrl.RxPayloadLen != 0)
276  {
277  ExtCtrl.RxPayloadLen = ExtCtrl.RxPayloadLen * (-1);
278  }
279 
280  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsCloseCmdCtrl, &Msg, &ExtCtrl));
281 
282  return (_i16)((_i16)Msg.Rsp.status);
283 }
284 #endif
285 
286 
287 /*****************************************************************************/
288 /* sl_FsRead */
289 /*****************************************************************************/
290 typedef union
291 {
292  SlFsReadCommand_t Cmd;
293  SlFsReadResponse_t Rsp;
294 }_SlFsReadMsg_u;
295 
296 #if _SL_INCLUDE_FUNC(sl_FsRead)
297 
298 static const _SlCmdCtrl_t _SlFsReadCmdCtrl =
299 {
300  SL_OPCODE_NVMEM_FILEREADCOMMAND,
301  (_SlArgSize_t)sizeof(SlFsReadCommand_t),
302  (_SlArgSize_t)sizeof(SlFsReadResponse_t)
303 };
304 
305 _i32 sl_FsRead(const _i32 FileHdl,_u32 Offset, _u8* pData,_u32 Len)
306 {
307  _SlFsReadMsg_u Msg;
308  _SlCmdExt_t ExtCtrl;
309  _u16 ChunkLen;
310  _SlReturnVal_t RetVal =0;
311  _i32 RetCount = 0;
312 
313  /* verify that this api is allowed. if not allowed then
314  ignore the API execution and return immediately with an error */
315  VERIFY_API_ALLOWED(SL_OPCODE_SILO_FS);
316 
317  _SlDrvMemZero(&ExtCtrl, (_u16)sizeof(_SlCmdExt_t));
318 
319  ChunkLen = (_u16)sl_min(MAX_NVMEM_CHUNK_SIZE,Len);
320  ExtCtrl.RxPayloadLen = (_i16)ChunkLen;
321  ExtCtrl.pRxPayload = (_u8 *)(pData);
322  Msg.Cmd.Offset = Offset;
323  Msg.Cmd.Len = ChunkLen;
324  Msg.Cmd.FileHandle = (_u32)FileHdl;
325  do
326  {
327  RetVal = _SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsReadCmdCtrl, &Msg, &ExtCtrl);
328  if(SL_OS_RET_CODE_OK == RetVal)
329  {
330  if( Msg.Rsp.status < 0)
331  {
332  if( RetCount > 0)
333  {
334  return RetCount;
335  }
336  else
337  {
338  return Msg.Rsp.status;
339  }
340  }
341  RetCount += (_i32)Msg.Rsp.status;
342  Len -= ChunkLen;
343  Offset += ChunkLen;
344  Msg.Cmd.Offset = Offset;
345  ExtCtrl.pRxPayload += ChunkLen;
346  ChunkLen = (_u16)sl_min(MAX_NVMEM_CHUNK_SIZE,Len);
347  ExtCtrl.RxPayloadLen = (_i16)ChunkLen;
348  Msg.Cmd.Len = ChunkLen;
349  Msg.Cmd.FileHandle = (_u32)FileHdl;
350  }
351  else
352  {
353  return RetVal;
354  }
355  }while(ChunkLen > 0);
356 
357  return (_i32)RetCount;
358 }
359 #endif
360 
361 /*****************************************************************************/
362 /* sl_FsWrite */
363 /*****************************************************************************/
364 typedef union
365 {
366  SlFsWriteCommand_t Cmd;
368 }_SlFsWriteMsg_u;
369 
370 #if _SL_INCLUDE_FUNC(sl_FsWrite)
371 
372 static const _SlCmdCtrl_t _SlFsWriteCmdCtrl =
373 {
374  SL_OPCODE_NVMEM_FILEWRITECOMMAND,
375  (_SlArgSize_t)sizeof(SlFsWriteCommand_t),
376  (_SlArgSize_t)sizeof(SlFsWriteResponse_t)
377 };
378 
379 _i32 sl_FsWrite(const _i32 FileHdl,_u32 Offset, _u8* pData,_u32 Len)
380 {
381  _SlFsWriteMsg_u Msg;
382  _SlCmdExt_t ExtCtrl;
383  _u16 ChunkLen;
384  _SlReturnVal_t RetVal;
385  _i32 RetCount = 0;
386 
387  /* verify that this api is allowed. if not allowed then
388  ignore the API execution and return immediately with an error */
389  VERIFY_API_ALLOWED(SL_OPCODE_SILO_FS);
390 
391  _SlDrvMemZero(&ExtCtrl, (_u16)sizeof(_SlCmdExt_t));
392 
393  ChunkLen = (_u16)sl_min(MAX_NVMEM_CHUNK_SIZE,Len);
394  ExtCtrl.TxPayload1Len = ChunkLen;
395  ExtCtrl.pTxPayload1 = (_u8 *)(pData);
396  Msg.Cmd.Offset = Offset;
397  Msg.Cmd.Len = ChunkLen;
398  Msg.Cmd.FileHandle = (_u32)FileHdl;
399 
400  do
401  {
402  RetVal = _SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsWriteCmdCtrl, &Msg, &ExtCtrl);
403  if(SL_OS_RET_CODE_OK == RetVal)
404  {
405  if( Msg.Rsp.status < 0)
406  {
407  if( RetCount > 0)
408  {
409  return RetCount;
410  }
411  else
412  {
413  return Msg.Rsp.status;
414  }
415  }
416 
417  RetCount += (_i32)Msg.Rsp.status;
418  Len -= ChunkLen;
419  Offset += ChunkLen;
420  Msg.Cmd.Offset = Offset;
421  ExtCtrl.pTxPayload1 += ChunkLen;
422  ChunkLen = (_u16)sl_min(MAX_NVMEM_CHUNK_SIZE,Len);
423  ExtCtrl.TxPayload1Len = ChunkLen;
424  Msg.Cmd.Len = ChunkLen;
425  Msg.Cmd.FileHandle = (_u32)FileHdl;
426  }
427  else
428  {
429  return RetVal;
430  }
431  }while(ChunkLen > 0);
432 
433  return (_i32)RetCount;
434 }
435 #endif
436 
437 /*****************************************************************************/
438 /* sl_FsGetInfo */
439 /*****************************************************************************/
440 typedef union
441 {
444 }_SlFsGetInfoMsg_u;
445 
446 #if _SL_INCLUDE_FUNC(sl_FsGetInfo)
447 
448 static const _SlCmdCtrl_t _SlFsGetInfoCmdCtrl =
449 {
450  SL_OPCODE_NVMEM_FILEGETINFOCOMMAND,
451  (_SlArgSize_t)sizeof(SlFsGetInfoCommand_t),
452  (_SlArgSize_t)sizeof(SlFsGetInfoResponse_t)
453 };
454 
455 const _u16 FlagsTranslate[] =
456 {
457  SL_FS_INFO_OPEN_WRITE,
458  SL_FS_INFO_OPEN_READ,
459  SL_FS_INFO_NOT_FAILSAFE,
460  SL_FS_INFO_NOT_VALID,
461  SL_FS_INFO_SYS_FILE,
462  SL_FS_INFO_MUST_COMMIT,
463  SL_FS_INFO_BUNDLE_FILE,
464  SL_FS_INFO_PENDING_COMMIT,
465  SL_FS_INFO_PENDING_BUNDLE_COMMIT,
466  0,
467  SL_FS_INFO_SECURE,
468  SL_FS_INFO_NOSIGNATURE,
469  SL_FS_INFO_PUBLIC_WRITE,
470  SL_FS_INFO_PUBLIC_READ,
471  0,
472  0
473 };
474 
475 _i16 sl_FsGetInfo(const _u8 *pFileName,const _u32 Token,SlFsFileInfo_t* pFsFileInfo)
476 {
477  _SlFsGetInfoMsg_u Msg;
478  _SlCmdExt_t CmdExt;
479  _u16 BitNum;
480 
481  /* verify that this api is allowed. if not allowed then
482  ignore the API execution and return immediately with an error */
483  VERIFY_API_ALLOWED(SL_OPCODE_SILO_FS);
484 
485  _SlDrvMemZero(&CmdExt, (_u16)sizeof(_SlCmdExt_t));
486 
487  if ( _SlFsStrlen(pFileName) >= SL_FS_MAX_FILE_NAME_LENGTH )
488  {
489  return SL_ERROR_FS_WRONG_FILE_NAME;
490  }
491 
492  CmdExt.TxPayload1Len = (_u16)((_SlFsStrlen(pFileName)+4) & (~3)); /* add 4: 1 for NULL and the 3 for align */
493  CmdExt.pTxPayload1 = (_u8*)pFileName;
494 
495  Msg.Cmd.Token = Token;
496 
497  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsGetInfoCmdCtrl, &Msg, &CmdExt));
498 
499  /* convert flags */
500  pFsFileInfo->Flags = 0;
501  for (BitNum = 0; BitNum < 16; BitNum++ )
502  {
503  if (( Msg.Rsp.Flags >> BitNum) & 0x1 )
504  {
505  pFsFileInfo->Flags |= FlagsTranslate[BitNum];
506  }
507  }
508 
509  pFsFileInfo->Len = Msg.Rsp.FileLen;
510  pFsFileInfo->MaxSize = Msg.Rsp.AllocatedLen;
511  pFsFileInfo->Token[0] = Msg.Rsp.Token[0];
512  pFsFileInfo->Token[1] = Msg.Rsp.Token[1];
513  pFsFileInfo->Token[2] = Msg.Rsp.Token[2];
514  pFsFileInfo->Token[3] = Msg.Rsp.Token[3];
515  pFsFileInfo->StorageSize = Msg.Rsp.FileStorageSize;
516  pFsFileInfo->WriteCounter = Msg.Rsp.FileWriteCounter;
517 
518  return (_i16)((_i16)Msg.Rsp.Status);
519 }
520 #endif
521 
522 /*****************************************************************************/
523 /* sl_FsDel */
524 /*****************************************************************************/
525 typedef union
526 {
529 }_SlFsDeleteMsg_u;
530 
531 
532 #if _SL_INCLUDE_FUNC(sl_FsDel)
533 
534 static const _SlCmdCtrl_t _SlFsDeleteCmdCtrl =
535 {
536  SL_OPCODE_NVMEM_FILEDELCOMMAND,
537  (_SlArgSize_t)sizeof(SlFsDeleteCommand_t),
538  (_SlArgSize_t)sizeof(SlFsDeleteResponse_t)
539 };
540 
541 _i16 sl_FsDel(const _u8 *pFileName,const _u32 Token)
542 {
543  _SlFsDeleteMsg_u Msg;
544  _SlCmdExt_t CmdExt;
545 
546  /* verify that this api is allowed. if not allowed then
547  ignore the API execution and return immediately with an error */
548  VERIFY_API_ALLOWED(SL_OPCODE_SILO_FS);
549 
550  if ( _SlFsStrlen(pFileName) >= SL_FS_MAX_FILE_NAME_LENGTH )
551  {
552  return SL_ERROR_FS_WRONG_FILE_NAME;
553  }
554 
555  _SlDrvMemZero(&CmdExt, (_u16)sizeof(_SlCmdExt_t));
556 
557  CmdExt.TxPayload1Len = (_u16)((_SlFsStrlen(pFileName)+4) & (~3)); /* add 4: 1 for NULL and the 3 for align */
558  CmdExt.pTxPayload1 = (_u8*)pFileName;
559  Msg.Cmd.Token = Token;
560 
561  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsDeleteCmdCtrl, &Msg, &CmdExt));
562 
563  return (_i16)((_i16)Msg.Rsp.status);
564 }
565 #endif
566 
567 /*****************************************************************************/
568 /* sl_FsCtl */
569 /*****************************************************************************/
570 typedef union
571 {
574 }_SlFsFileSysControlMsg_u;
575 
576 #if _SL_INCLUDE_FUNC(sl_FsCtl)
577 
578 const _SlCmdCtrl_t _SlFsFileSysControlCmdCtrl =
579 {
580  SL_OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLCOMMAND,
583 };
584 
585 _i32 sl_FsCtl( SlFsCtl_e Command, _u32 Token, _u8 *pFileName, const _u8 *pData, _u16 DataLen, _u8 *pOutputData, _u16 OutputDataLen,_u32 *pNewToken )
586 {
587  _SlFsFileSysControlMsg_u Msg;
588  _SlCmdExt_t CmdExt;
589 
590  /* verify that this api is allowed. if not allowed then
591  ignore the API execution and return immediately with an error */
592  VERIFY_API_ALLOWED(SL_OPCODE_SILO_FS);
593 
594  Msg.Cmd.Token = Token;
595  Msg.Cmd.Operation = (_u8)Command;
596 
597  _SlDrvMemZero(&CmdExt, (_u16)sizeof(_SlCmdExt_t));
598 
599  if ((SL_FS_CTL_ROLLBACK == Command) || (SL_FS_CTL_COMMIT == Command ))
600  {
601  Msg.Cmd.FileNameLength = _SlFsStrlen(pFileName) + 1 ;
602 
603  if ( _SlFsStrlen(pFileName) >= SL_FS_MAX_FILE_NAME_LENGTH )
604  {
605  return SL_ERROR_FS_WRONG_FILE_NAME;
606  }
607 
608  /*the data is aligned*/
609  CmdExt.RxPayloadLen = DataLen;
610  CmdExt.pRxPayload = (_u8 *)(pData);
611 
612  CmdExt.TxPayload1Len = (_SlFsStrlen(pFileName) + 4) & (~3);
613  CmdExt.pTxPayload1 = pFileName;
614 
615  Msg.Cmd.BufferLength = CmdExt.RxPayloadLen + CmdExt.TxPayload1Len;
616 
617  if(CmdExt.pRxPayload != NULL && CmdExt.RxPayloadLen != 0)
618  {
619  CmdExt.RxPayloadLen = CmdExt.RxPayloadLen * (-1);
620  }
621  }
622  else if( SL_FS_CTL_RENAME == Command )
623  {
624  if ( _SlFsStrlen(pFileName) >= SL_FS_MAX_FILE_NAME_LENGTH )
625  {
626  return SL_ERROR_FS_WRONG_FILE_NAME;
627  }
628 
629  Msg.Cmd.FileNameLength = (_SlFsStrlen(pFileName) + 4) & (~3);
630 
631  /*current file name*/
632  CmdExt.RxPayloadLen = (_u16)Msg.Cmd.FileNameLength;
633  CmdExt.pRxPayload = pFileName;
634 
635  /*New file name*/
636  CmdExt.TxPayload1Len = (_SlFsStrlen(pData) + 4) & (~3);;
637  CmdExt.pTxPayload1 = (_u8 *)(pData);
638 
639  Msg.Cmd.BufferLength = CmdExt.RxPayloadLen + CmdExt.TxPayload1Len;
640 
641  if(CmdExt.pRxPayload != NULL && CmdExt.RxPayloadLen != 0)
642  {
643  CmdExt.RxPayloadLen = CmdExt.RxPayloadLen * (-1);
644  }
645  }
646  else
647  {
648  Msg.Cmd.FileNameLength = 0;
649 
650  CmdExt.TxPayload1Len = (DataLen + 3) & (~3);
651  CmdExt.pTxPayload1 = (_u8 *)(pData);
652 
653  CmdExt.RxPayloadLen = OutputDataLen;
654  CmdExt.pRxPayload = pOutputData;
655 
656  Msg.Cmd.BufferLength = CmdExt.TxPayload1Len;
657  }
658 
659  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsFileSysControlCmdCtrl, &Msg, &CmdExt));
660 
661  if( pNewToken != NULL )
662  {
663  *pNewToken = Msg.Rsp.Token;
664  }
665 
666  return (_i32)((_i32)Msg.Rsp.Status);
667 }
668 #endif
669 
670 
671 /*****************************************************************************/
672 /* sl_FsProgram */
673 /*****************************************************************************/
674 typedef union
675 {
678 }_SlFsProgrammingMsg_u;
679 
680 #if _SL_INCLUDE_FUNC(sl_FsProgram)
681 
682 const _SlCmdCtrl_t _SlFsProgrammingCmdCtrl =
683 {
684  SL_OPCODE_NVMEM_NVMEMFSPROGRAMMINGCOMMAND,
685  sizeof(SlFsProgramCommand_t),
686  sizeof(SlFsProgramResponse_t)
687 };
688 
689 _i32 sl_FsProgram(const _u8* pData , _u16 DataLen ,const _u8 * pKey , _u32 Flags )
690 {
691  _SlFsProgrammingMsg_u Msg;
692  _SlCmdExt_t CmdExt;
693  _u16 ChunkLen;
694 
695  VERIFY_API_ALLOWED(SL_OPCODE_SILO_FS);
696 
697  Msg.Cmd.Flags = (_u32)Flags;
698 
699  _SlDrvResetCmdExt(&CmdExt);
700 
701  /* no data and no key, called only for extracting the image */
702  if( (DataLen == 0) && (pKey == NULL) )
703  {
704  Msg.Cmd.ChunkLen = 0;
705  Msg.Cmd.KeyLen = 0;
706  Msg.Cmd.Flags = Flags;
707  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsProgrammingCmdCtrl, &Msg, &CmdExt));
708  }
709  else if( (DataLen> 0) && ( pData == NULL))
710  {
711  return( ((_i32)SL_ERROR_FS_WRONG_INPUT_SIZE) << 16 );
712  }
713  else if( (DataLen == 0) && (pKey != NULL) )
714  {
715  Msg.Cmd.ChunkLen = 0;
716  Msg.Cmd.KeyLen = sizeof(SlFsKey_t);;
717  Msg.Cmd.Flags = Flags;
718  CmdExt.pTxPayload1 = (_u8*)pKey;
719  CmdExt.TxPayload1Len = sizeof(SlFsKey_t);
720  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsProgrammingCmdCtrl, &Msg, &CmdExt));
721  }
722  else /* DataLen > 0 */
723  {
724  if( (DataLen & 0xF) > 0)
725  {
726  return( ((_i32)SL_ERROR_FS_NOT_16_ALIGNED) << 16 );
727  }
728  Msg.Cmd.Flags = Flags;
729 
730  CmdExt.pTxPayload1 = (_u8 *)pData;
731  ChunkLen = (_u16)sl_min(MAX_NVMEM_CHUNK_SIZE, DataLen);
732 
733  while(ChunkLen > 0)
734  {
735  Msg.Cmd.ChunkLen = ChunkLen;
736  CmdExt.TxPayload1Len = ChunkLen;
737  if( pKey != NULL )
738  {
739  Msg.Cmd.KeyLen = sizeof(SlFsKey_t);
740  CmdExt.RxPayloadLen = sizeof(SlFsKey_t);
741  CmdExt.pRxPayload = (_u8 *)pKey;
742 
743  if(CmdExt.pRxPayload != NULL && CmdExt.RxPayloadLen != 0)
744  {
745  CmdExt.RxPayloadLen = CmdExt.RxPayloadLen * (-1);
746  }
747  }
748  else /* No key */
749  {
750  Msg.Cmd.KeyLen = 0;
751  CmdExt.RxPayloadLen = 0;
752  CmdExt.pRxPayload = NULL;
753  }
754 
755  VERIFY_RET_OK( _SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsProgrammingCmdCtrl, &Msg, &CmdExt));
756 
757  if( Msg.Rsp.Status <= 0 ) /* Error or finished */
758  {
759  return (_i32)(Msg.Rsp.Status);
760  }
761 
762  DataLen -= ChunkLen;
763  CmdExt.pTxPayload1 += ChunkLen;
764 
765  ChunkLen = (_u16)sl_min(MAX_NVMEM_CHUNK_SIZE, DataLen);
766  }
767  }
768 
769  return (_i32)(Msg.Rsp.Status);
770 }
771 #endif
772 
773 /*****************************************************************************/
774 /* sl_FsGetFileList */
775 /*****************************************************************************/
776 typedef union
777 {
780 }_SlFsGetFileListMsg_u;
781 
782 #if _SL_INCLUDE_FUNC(sl_FsGetFileList)
783 
784 const _SlCmdCtrl_t _SlFsGetFileListCmdCtrl =
785 {
786  SL_OPCODE_NVMEM_NVMEMGETFILELISTCOMMAND,
787  sizeof(SlFsGetFileListCommand_t),
789 };
790 
791 _i32 sl_FsGetFileList(_i32* pIndex, _u8 Count, _u8 MaxEntryLen , _u8* pBuff, SlFileListFlags_t Flags )
792 {
793  _SlFsGetFileListMsg_u Msg;
794  _SlCmdExt_t CmdExt;
795  _u16 OutputBufferSize;
796 
797  /* verify that this api is allowed. if not allowed then
798  ignore the API execution and return immediately with an error */
799  VERIFY_API_ALLOWED(SL_OPCODE_SILO_FS);
800 
801  _SlDrvResetCmdExt(&CmdExt);
802 
803  Msg.Cmd.Index = *pIndex;
804  Msg.Cmd.MaxEntryLen = MaxEntryLen & (~3); /* round to modulu 4 */
805  Msg.Cmd.Count = Count;
806  Msg.Cmd.Flags = (_u8)Flags;
807 
808  OutputBufferSize = Msg.Cmd.Count * Msg.Cmd.MaxEntryLen;
809  if( OutputBufferSize > MAX_NVMEM_CHUNK_SIZE )
810  {
811  return SL_ERROR_FS_WRONG_INPUT_SIZE;
812  }
813 
814  CmdExt.RxPayloadLen = OutputBufferSize;
815  CmdExt.pRxPayload = pBuff;
816 
817  VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsGetFileListCmdCtrl, &Msg, &CmdExt));
818 
819  *pIndex = Msg.Rsp.Index;
820 
821  return (_i32)((_i32)Msg.Rsp.NumOfEntriesOrError);
822 }
823 #endif
824 
_i32 sl_FsOpen(const _u8 *pFileName, const _u32 ModeAndMaxSize, _u32 *pToken)
open file for read or write from/to storage device
Definition: fs.c:157
_i32 sl_FsCtl(SlFsCtl_e Command, _u32 Token, _u8 *pFileName, const _u8 *pData, _u16 DataLen, _u8 *pOutputData, _u16 OutputDataLen, _u32 *pNewToken)
Controls various file system operations.
Definition: fs.c:585
_i16 sl_FsGetInfo(const _u8 *pFileName, const _u32 Token, SlFsFileInfo_t *pFsFileInfo)
Get information of a file.
Definition: fs.c:475
_i16 sl_FsClose(const _i32 FileHdl, const _u8 *pCeritificateFileName, const _u8 *pSignature, const _u32 SignatureLen)
Close file in storage device.
Definition: fs.c:250
_i32 sl_FsProgram(const _u8 *pData, _u16 DataLen, const _u8 *pKey, _u32 Flags)
Enables to format and configure the device with pre-prepared configuration.
Definition: fs.c:689
_i16 sl_FsDel(const _u8 *pFileName, const _u32 Token)
Delete specific file from a storage or all files from a storage (format)
Definition: fs.c:541
_i32 sl_FsGetFileList(_i32 *pIndex, _u8 Count, _u8 MaxEntryLen, _u8 *pBuff, SlFileListFlags_t Flags)
The list of file names, the files are retrieve in chunks.
Definition: fs.c:791
_i32 sl_FsWrite(const _i32 FileHdl, _u32 Offset, _u8 *pData, _u32 Len)
Write block of data to a file in storage device.
Definition: fs.c:379
_i32 sl_FsRead(const _i32 FileHdl, _u32 Offset, _u8 *pData, _u32 Len)
Read block of data from a file in storage device.
Definition: fs.c:305
Definition: fs.h:175