NetBurner 3.5.0
PDF Version
 
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
38extern "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_ */