NetBurner 3.1
fsm.h
1 /*NB_REVISION*/
2 
3 #ifndef _FSM_H_
4 #define _FSM_H_
5 
6 /****************************************************************************
7  *
8  * Copyright (c) 2003 by HCC Embedded
9  *
10  * This software is copyrighted by and is the sole property of
11  * HCC. All rights, title, ownership, or other interests
12  * in the software remain the property of HCC. This
13  * software may only be used in accordance with the corresponding
14  * license agreement. Any unauthorized use, duplication, transmission,
15  * distribution, or disclosure of this software is expressly forbidden.
16  *
17  * This Copyright notice may not be removed or modified without prior
18  * written consent of HCC.
19  *
20  * HCC reserves the right to modify this software without notice.
21  *
22  * HCC Embedded
23  * Budapest 1132
24  * Victor Hugo Utca 11-15
25  * Hungary
26  *
27  * Tel: +36 (1) 450 1302
28  * Fax: +36 (1) 450 1303
29  * http: www.hcc-embedded.com
30  * email: info@hcc-embedded.com
31  *
32  ***************************************************************************/
33 
34 #include <file/port_s.h>
35 #include <file/udefs.h>
36 
37 #ifdef __cplusplus
38 extern "C"
39 {
40 #endif
41 
42 #define FS_MAXDENAME 13 /* maximum direntry name */
43 
44  /* Directory entry definition */
45 
46  typedef struct
47  {
48  char attr; /* attribute of the file */
49  W_CHAR lname[FS_MAXDENAME]; /* file name */
50  unsigned short nlfn; /* next lfn entry */
51 
52  unsigned short ctime; /* creation time */
53  unsigned short cdate; /* creation date */
54 
55  unsigned short sector; /* start sector */
56  unsigned short dirnum; /* directory relative number */
57 
58  long len; /* length of file */
59 
60  unsigned long secure; /* security code */
61  } FS_DIRENTRY;
62 
63  typedef struct
64  {
65  char attr; /* attribute of the file */
66  unsigned short nlfn1; /* next lfn entry */
67  unsigned short nlfn2; /* next lfn entry */
68  } FS_DIRENTRY_LFN;
69 
70 #define FS_MAXLFN ((sizeof(FS_DIRENTRY) - sizeof(FS_DIRENTRY_LFN)) >> 1)
71 
72 #define FS_MAXLNAME (FS_MAXDENAME + 4 * FS_MAXLFN) /* maximum name length -> 13+4*13 => 65 */
73 
74  /* definitions for file/entry attribute */
75 
76 #define FS_ATTR_DE 0x01 /* entry is used for direntry */
77 #define FS_ATTR_DIR 0x02 /* directory */
78 #define FS_ATTR_LFN1 0x04 /* structure holds long file name in the 1st half */
79 #define FS_ATTR_LFN2 0x08 /* structure holds long file name in the 2nd half */
80 #define FS_ATTR_LFN1NXT 0x10 /* there is next entry of 1 on next bottom */
81 #define FS_ATTR_LFN1NXTTOP 0x20 /* there is next entry of 1 on next top */
82 #define FS_ATTR_LFN2NXT 0x40 /* there is next entry of 2 on next bottom */
83 #define FS_ATTR_LFN2NXTTOP 0x80 /* there is next entry of 2 on next top */
84 
85 #define FS_ATTR_ALLLFN1 (FS_ATTR_LFN1 | FS_ATTR_LFN1NXT | FS_ATTR_LFN1NXTTOP)
86 #define FS_ATTR_ALLLFN2 (FS_ATTR_LFN2 | FS_ATTR_LFN2NXT | FS_ATTR_LFN2NXTTOP)
87  /* definitions for ctime */
88 
89 #define FSSEC_ATTR_ARC (0x20UL << (31 - 6))
90 #define FSSEC_ATTR_DIR (0x10UL << (31 - 6))
91 #define FSSEC_ATTR_VOLUME (0x08UL << (31 - 6))
92 #define FSSEC_ATTR_SYSTEM (0x04UL << (31 - 6))
93 #define FSSEC_ATTR_HIDDEN (0x02UL << (31 - 6))
94 #define FSSEC_ATTR_READONLY (0x01UL << (31 - 6))
95 
96 #define FS_CTIME_SEC_SHIFT 0
97 #define FS_CTIME_SEC_MASK 0x001f /* 0-30 in 2seconds */
98 #define FS_CTIME_MIN_SHIFT 5
99 #define FS_CTIME_MIN_MASK 0x07e0 /* 0-59 */
100 #define FS_CTIME_HOUR_SHIFT 11
101 #define FS_CTIME_HOUR_MASK 0xf800 /* 0-23 */
102 
103  /* definitions for cdate */
104 
105 #define FS_CDATE_DAY_SHIFT 0
106 #define FS_CDATE_DAY_MASK 0x001f /* 0-31 */
107 #define FS_CDATE_MONTH_SHIFT 5
108 #define FS_CDATE_MONTH_MASK 0x01e0 /* 1-12 */
109 #define FS_CDATE_YEAR_SHIFT 9
110 #define FS_CDATE_YEAR_MASK 0xfe00 /* 0-119 (1980+value) */
111 
112  /* definitions for dirnum variable */
113 
114 #define FS_DIR_ROOT ((unsigned short)0xffff)
115 #define FS_DIR_LABEL ((unsigned short)0xfff0)
116 
117  typedef struct
118  {
119  unsigned long total;
120  unsigned long free;
121  unsigned long used;
122  unsigned long bad;
123  } FS_SPACE;
124 
125  /* struct for FS_NAME */
126 
127  typedef struct
128  {
129  int drivenum; /* 0-A 1-B 2-C */
130  W_CHAR path[FS_MAXPATH]; /* /directory1/dir2/ */
131  W_CHAR lname[FS_MAXPATH]; /* filename */
132  unsigned short dirnum; /* 0xffff-root other case in subdir n */
133  } FS_NAME;
134 
135  /* struct for find file */
136 
137  typedef struct
138  {
139  char attr; /* attribute of the file/entry */
140  char filename[FS_MAXPATH]; /* file name+ext */
141 
142  unsigned short ctime; /* creation time */
143  unsigned short cdate; /* creation date */
144 
145  long len; /* length of file */
146 
147  unsigned long secure; /* secure */
148 
149  FS_NAME findfsname; /* find properties */
150  unsigned short findpos; /* find position */
151  } FS_FIND;
152 
153 #ifdef HCC_UNICODE
154  typedef struct
155  {
156  char attr; /* attribute of the file/entry */
157  W_CHAR filename[FS_MAXPATH]; /* file name+ext */
158 
159  unsigned short ctime; /* creation time */
160  unsigned short cdate; /* creation date */
161 
162  long len; /* length of file */
163 
164  unsigned long secure; /* secure */
165 
166  FS_NAME findfsname; /* find properties */
167  unsigned short findpos; /* find position */
168  } FS_WFIND;
169 #endif
170 
171  /* definitions for FS_FILE */
172 
173  typedef struct
174  {
175  long reference; /* reference which fileint used */
176  } FS_FILE;
177 
178  /* definitions for FS_FILE internally used */
179 
180  typedef struct
181  {
182  FS_FILE file;
183  FS_DIRENTRY *direntry; /* link to directory list */
184  long pos; /* current position for read, file size for write */
185  long relpos; /* relative position in a sector */
186  int mode; /* mode to open 0-close, 1-read, 2-write/append */
187  int drivenum; /* drive number */
188  char *buffer; /* rd/write buffer */
189  int modified; /* if write buffer is modified */
190 
191  unsigned short *sector; /* this points where to write/read next sector info */
192  unsigned short sectorstart; /* after file is closed this has to be copied into direntry */
193 
194  unsigned short *discard; /* this points where to write/read last discard sector is */
195  unsigned short discardstart; /* after file is closed this has to be set as discardable */
196  long len; /* file size, this is copied after fs_close */
197  int loaded; /* signalled if sector is loaded */
198  } FS_FILEINT;
199 
200  /* definitions for fs_file mode */
201 
202 #define FS_FILE_CLOSE 0
203 #define FS_FILE_RD 1
204 #define FS_FILE_RDP 2
205 #define FS_FILE_WR 3
206 #define FS_FILE_WRP 4
207 #define FS_FILE_A 5
208 #define FS_FILE_AP 6
209 #define FS_FILE_ABORT 7
210 
211  /* definitions for FLASH physical functions */
212 
213  typedef int (*FS_PHYREAD)(void *data, long block, long blockrel, long datalen);
214  typedef int (*FS_PHYERASE)(long block);
215  typedef int (*FS_PHYWRITE)(void *data, long block, long relsector, long size, long sdata);
216  typedef int (*FS_PHYVERIFY)(void *data, long block, long relsector, long size, long sdata);
217  typedef int (*FS_PHYCHECK)(long block);
218  typedef long (*FS_PHYSIGN)(long block);
219  typedef int (*FS_PHYCACHE)(void *data, long block, long page, long pagenum, long sdata);
220  typedef int (*FS_PHYBLKCPY)(long destblock, long soublock);
221 
222  /* definitions for FLASH info and phy */
223 
224  typedef struct
225  {
226  long maxblock; /* maximum number of block can be used */
227  long blocksize; /* block size in bytes */
228  long sectorsize; /* sector size wanted to use (less than block size */
229  long sectorperblock; /* sector per block (block size/sector size); */
230  long blockstart; /* where relative physically block start */
231  long descsize; /* max size of fat+directory+block index */
232  long descblockstart; /* 1st block which is used for descriptor above (NOR) */
233  long descblockend; /* last block which is used for descriptor above (NOR) */
234  long separatedir; /* if directory used separatelly from FAT (NAND) */
235  long cacheddescsize; /* cached descriptor size in descriptor < descsize (NOR) */
236  long cachedpagenum; /* cached pagenum (page/block NAND) */
237  long cachedpagesize; /* cached page size (page size. cachedpagenum*cachedpagesize=blocksize */
238  FS_PHYREAD ReadFlash; /* read content */
239  FS_PHYERASE EraseFlash; /* erase a block */
240  FS_PHYWRITE WriteFlash; /* write content */
241  FS_PHYVERIFY VerifyFlash; /* verify content */
242  FS_PHYCHECK CheckBadBlock; /* check if block is bad block (NAND) */
243  FS_PHYSIGN GetBlockSignature; /* get block signature data (NAND) */
244  FS_PHYCACHE WriteVerifyPage; /* Write and verify page (NAND) */
245  FS_PHYBLKCPY BlockCopy; /* HW/SW accelerated block copy in physical (NAND/NOR) optional */
246  unsigned char *chkeraseblk; /* buffer for preerasing blocks optional */
247  } FS_FLASH;
248 
249  typedef int (*FS_PHYGETID)(FS_FLASH *flash);
250 
251  /* definitions for fat descriptor */
252 
253  typedef struct
254  {
255  unsigned long crc32; /* crc of this structure */
256  unsigned long reference; /* reference counter */
257  long nextdesc; /* which desc needs to be written */
258  unsigned long dircrc32; /* directory crc32 */
259  /* FAT + Direntries + Block index is allocated here, the extra's size is flash->descsize */
260  } FS_FATDESC;
261 
262  typedef struct
263  {
264  char *desc; /* NOR+NAND */
265  char *changes; /* next changes pointer NAND+NOR */
266  unsigned long reference; /* reference counter NAND+NOR */
267  long free; /* free space in cache NAND+NOR */
268  long currdescnum; /* current descriptor block for NOR */
269  } FS_WRCACHE;
270  /* definitions for volume info */
271 
272  typedef struct
273  {
274  int drivenum; /* which drive is to belong 0-a, 1-b, ... */
275  char *buffer; /* next alloc pointer for alloc data function */
276  long freemem; /* free memory space on alloc */
277  long usedmem; /* used memory */
278  long maxsectornum; /* maximum sector used */
279  unsigned short *fat; /* pointer to memory FAT (data found after volumeinfo) */
280  unsigned short *fatmirror; /* pointer to memory FAT (data found after volumeinfo) */
281 
282  W_CHAR *cwd; /* current working folder in this volume */
283 
284  unsigned int maxdirentry; /* directory entry used */
285  FS_DIRENTRY *direntries; /* pointer to dirinfo */
286  long sectorsize; /* sector size */
287  int maxfile; /* maximum number of used file */
288  FS_FILEINT *files; /* s_fileint pointers */
289  FS_FLASH *flash; /* flash device properties */
290  FS_FATDESC *fatdesc; /* user driver data 1 */
291  char *ramdrivedata; /* ramdrive data pointer */
292  unsigned char *zerosector; /* nandflash zero sector */
293  long *wearlevel; /* used for wear leveling */
294  long resetwear; /* signal if wear leveling useable or need resetting */
295  long maxfat; /* maximum number of fat */
296  long currfat; /* current fat */
297  long prevfat; /* previous fat */
298  long *fatbits; /* preerased blocks sectors state */
299  long fatbitsblock; /* preerased blocks logical number */
300  unsigned short *blockindex; /* block orders (maxblock used size); */
301  char *rdbuffer; /* temporary block reading then writing (block size) */
302  FS_WRCACHE cache; /* descriptor cache */
303  long laststaticwear; /* last static weared block */
304  long staticcou; /* static counter for period counter */
305  FS_MUTEX_TYPE mutex; /* for multitasking */
306  } FS_VOLUMEINFO;
307 
308  /* definitions for multicwd */
309 
310 #if (!FS_CAPI_USED)
311  typedef struct
312  {
313  long ID;
314  int fs_curdrive; /* current drive */
315  struct
316  {
317  W_CHAR cwd[FS_MAXPATH]; /* current working folder in this volume */
318  } fs_vols[FS_MAXVOLUME];
319 
320  FS_MUTEX_TYPE *pmutex; /* for multitasking */
321 
322  } FS_MULTI;
323 #endif
324 
325  extern void fl_releaseFS(long ID);
326 
327  extern long fs_gettaskID(void);
328 
329  /* definitions for driver functions */
330 
331  typedef int (*FS_DRVFUNC1)(FS_VOLUMEINFO *vi);
332  typedef int (*FS_DRVFUNC2)(FS_VOLUMEINFO *vi, FS_FILEINT *file, void *data, long datalen);
333  typedef int (*FS_DRVFUNC4)(FS_VOLUMEINFO *vi, long secnum, void *data, long offset, long datalen);
334 
335  /* definitions for volume descriptor */
336 
337  typedef struct
338  {
339  FS_DRVFUNC1 storefat; /* function pointer */
340  FS_DRVFUNC2 storesector; /* function pointer */
341  FS_DRVFUNC4 getsector; /* function pointer */
342  FS_DRVFUNC1 format; /* function pointer */
343  FS_VOLUMEINFO *vi; /* volumeinfo pointer */
344  int state; /* state of this volume */
345  } FS_VOLUMEDESC;
346 
347  /* definitions for volumedesc state */
348 
349 #define FS_VOL_OK 0 /* mounted, formatted */
350 #define FS_VOL_NOTMOUNT 1 /* not mounted (init value) */
351 #define FS_VOL_NOTFORMATTED 2 /* not formatted */
352 #define FS_VOL_NOMEMORY 3 /* not enougth memory */
353 #define FS_VOL_NOMORE 4 /* no more drive availabale */
354 #define FS_VOL_DRVERROR 5 /* driver error */
355 
356  /* definitions for drive function mount */
357 
358  typedef int (*FS_DRVMOUNT)(FS_VOLUMEDESC *vd, FS_PHYGETID phyfunc);
359 
360  /* definitions for file system */
361 
362  typedef struct
363  {
364  FS_VOLUMEDESC vd[FS_MAXVOLUME]; /* volumes */
365  } FS_FILESYSTEM;
366 
367  /* define fat entries */
368 
369 #define FS_FAT_FREE ((unsigned short)0x0FFFF) /* - free of used */
370 #define FS_FAT_EOF ((unsigned short)0x0FFF0) /* - end of file */
371 #define FS_FAT_NOTUSED ((unsigned short)0x0FFF1) /* - not useable (maybe bad block or reserved) */
372 #define FS_FAT_DISCARD ((unsigned short)0x0FFF2) /* - needs to be discard */
373 #define FS_FAT_CHBLK ((unsigned short)0x0FFF3) /* - cache block */
374 #define FS_FAT_DIR ((unsigned short)0x0FFF8) /* - directory entry, if separated */
375 
376  /* crc defs */
377 
378 #define FS_CRCINIT 0xffffffffL
379 
380  /* functions for middle layer file system */
381 
382  extern void *fsm_allocdata(FS_VOLUMEINFO *vi, long size);
383  extern int fsm_checkname(W_CHAR *lname);
384  extern int fsm_checknamewc(const W_CHAR *lname);
385  extern long fsm_setnameext(char *s, char *name, char *ext);
386  extern int fsm_setmaxfile(FS_VOLUMEINFO *vi, long maxfile);
387  extern int fsm_setsectorsize(FS_VOLUMEINFO *vi, long sectorsize);
388  extern void fsm_memcpy(void *d, void *s, long len);
389  extern unsigned long fsm_calccrc32(unsigned long dwcrc, const void *vbuf, unsigned long dwlen);
390  extern int fsm_findfreeblock(FS_VOLUMEINFO *vi, unsigned short *sector);
391  extern void fsm_memset(void *d, unsigned char fill, long len);
392  extern int fsm_findfreesector(FS_VOLUMEINFO *vi, unsigned short *badsector);
393  extern void fsm_swapbadblock(FS_VOLUMEINFO *vi, unsigned short badsector);
394  extern void fsm_wearleveling(FS_VOLUMEINFO *vi);
395  extern void fsm_addsectorchain(FS_VOLUMEINFO *vi, FS_FILEINT *file, unsigned short sector);
396  extern long fsm_checksectorfree(FS_VOLUMEINFO *vi, long sector);
397  extern long fsm_checksectorbad(FS_VOLUMEINFO *vi, long sector);
398  extern unsigned long _fs_checkfreeblocks(FS_VOLUMEINFO *vi, unsigned long sbnum);
399  extern W_CHAR _fsm_toupper(W_CHAR ch);
400 #ifdef HCC_UNICODE
401  extern W_CHAR *_fsm_towchar(W_CHAR *nconv, const char *s);
402  extern void _fsm_fromwchar(char *d, W_CHAR *s);
403 #endif
404 #ifdef __cplusplus
405 }
406 #endif
407 
408 /****************************************************************************
409  *
410  * End of fsm.h
411  *
412  ***************************************************************************/
413 
414 #endif /* _FSM_H_ */