flsystem.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:9k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*
  2.  * $Log:   V:/flsystem.h_v  $
  3.       Rev 1.0   13 Jan 1999 22:18:07   Yogu
  4.    added vxLib.h and macro for fault safe write in isRAM.
  5.       Rev 1.0   08 Jan 1998 17:20:00   Hdei
  6.    changed MALLOC FREE to MALLOC_TFFS FREE_TFFS.
  7.       Rev 1.0   24 Jul 1997 18:13:06   amirban
  8.    Initial revision.
  9.  */
  10. /************************************************************************/
  11. /*                                                                      */
  12. /* FAT-FTL Lite Software Development Kit */
  13. /* Copyright (C) M-Systems Ltd. 1995-1996 */
  14. /* */
  15. /************************************************************************/
  16. #ifndef FLSYSTEM_H
  17. #define FLSYSTEM_H
  18. #ifdef __cplusplus
  19. extern "C" {
  20. #endif
  21. #include <vxWorks.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <time.h>
  25. #include <ctype.h>
  26. #include <tickLib.h>
  27. #include <wdLib.h>
  28. #include <sysLib.h>
  29. #include <excLib.h>
  30. #include <semLib.h>
  31. #include <ioLib.h>
  32. #include <iosLib.h>
  33. #include <memLib.h>
  34. #include <errnoLib.h>
  35. #include <vxLib.h>
  36. /*
  37.  *  signed/unsigned char
  38.  *
  39.  * It is assumed that 'char' is signed. If this is not your compiler
  40.  * default, use compiler switches, or insert a #pragma here to define this.
  41.  *
  42.  */
  43. /* char is signed by default in GNU C */
  44. /*  CPU target
  45.  *
  46.  * Use compiler switches or insert a #pragma here to select the CPU type
  47.  * you are targeting.
  48.  *
  49.  * If the target is an Intel 80386 or above, also uncomment the CPU_i386
  50.  * definition.
  51.  */
  52. /* defined in VxWorks makefile */
  53. /*  NULL constant
  54.  *
  55.  * Some compilers require a different definition for the NULL pointer
  56.  */
  57. /* #include <_null.h> */
  58. /*  Little-endian/big-endian
  59.  *
  60.  * FAT and FTL structures use the little-endian (Intel) format for integers.
  61.  * If your machine uses the big-endian (Motorola) format, uncomment the
  62.  * following line.
  63.  * This option needs a C++ compiler.
  64.  * Note that even on big-endian machines you may omit the BIG_ENDIAN
  65.  * definition for smaller code size and better performance, but your media
  66.  * will not be compatible with standard FAT and FTL.
  67.  */
  68. /* we are using VxWorks #define _BYTE_ORDER here */
  69. #ifndef _BYTE_ORDER
  70. #error "byte order is not defined"
  71. #else  /* _BYTE_ORDER */
  72. #if (_BYTE_ORDER == _BIG_ENDIAN)
  73. #define TFFS_BIG_ENDIAN  
  74. #else  /* (_BYTE_ORDER == _BIG_ENDIAN) */
  75. #undef TFFS_BIG_ENDIAN
  76. #endif /* (_BYTE_ORDER == _BIG_ENDIAN) */
  77. #endif /* _BYTE_ORDER */
  78. /*  Far pointers
  79.  *
  80.  * Specify here which pointers may be far, if any.
  81.  * Far pointers are usually relevant only to 80x86 architectures.
  82.  *
  83.  * Specify FAR_LEVEL:
  84.  *   0 - if using a flat memory model or having no far pointers.
  85.  *   1 -        if only the socket window may be far
  86.  *   2 - if only the socket window and caller's read/write buffers
  87.  * may be far.
  88.  *   3 - if socket window, caller's read/write buffers and the
  89.  * caller's I/O request packet may be far
  90.  */
  91. #define FAR_LEVEL       0
  92. /*  Memory routines
  93.  *
  94.  * You need to supply library routines to copy, set and compare blocks of
  95.  * memory, internally and to/from callers. The code uses the names 'tffscpy',
  96.  * 'tffsset' and 'tffscmp' with parameters as in the standard 'memcpy',
  97.  * 'memset' and 'memcmp' C library routines.
  98.  */
  99. #if FAR_LEVEL > 0
  100. #define tffscpy _fmemcpy
  101. #define tffsset  _fmemset
  102. #define tffscmp  _fmemcmp
  103. #else
  104. /* XXX
  105. #define tffscpy  sysTffsCpy
  106. #define tffsset  sysTffsSet
  107. */
  108. #define tffscpy  memcpy
  109. #define tffsset  memset
  110. #define tffscmp  memcmp
  111. #endif
  112. #define tffscpyWords(dest,src,nbytes)     bcopyWords((char *)(src), 
  113.                                                   (char *)(dest), (nbytes)/2)
  114. #define tffscpyLongs(dest,src,nbytes)     bcopyLongs((char *)(src), 
  115.                                                   (char *)(dest), (nbytes)/4)
  116. extern int tffscmpWords(void *buf1, void *buf2, int nbytes);
  117. /*  Pointer arithmetic
  118.  *
  119.  * The following macros define machine- and compiler-dependent macros for
  120.  * handling pointers to physical window addresses. The definitions below are
  121.  * for PC real-mode Borland-C.
  122.  *
  123.  * 'physicalToPointer' translates a physical flat address to a (far) pointer.
  124.  * Note that if when your processor uses virtual memory, the code should
  125.  * map the physical address to virtual memory, and return a pointer to that
  126.  * memory (the size parameter tells how much memory should be mapped).
  127.  *
  128.  * 'addToFarPointer' adds an increment to a pointer and returns a new
  129.  * pointer. The increment may be as large as your window size. The code
  130.  * below assumes that the increment may be larger than 64 KB and so performs
  131.  * huge pointer arithmetic.
  132.  */
  133. #if FAR_LEVEL > 0
  134. #include <dos.h>
  135. #define physicalToPointer(physical,size,drive)
  136. MK_FP((int) ((physical) >> 4),(int) (physical) & 0xF)
  137. #define addToFarPointer(base,increment)
  138. MK_FP(FP_SEG(base) +
  139. ((unsigned short) ((FP_OFF(base) + (increment)) >> 16) << 12), 
  140.       FP_OFF(base) + (int) (increment))
  141. #else
  142. #define physicalToPointer(physical,size,drive)          
  143. ((void *) (physical))
  144. #define addToFarPointer(base,increment)
  145. ((void *) ((unsigned char *) (base) + (increment)))
  146. #endif
  147. /*  Default calling convention
  148.  *
  149.  * C compilers usually use the C calling convention to routines (cdecl), but
  150.  * often can also use the pascal calling convention, which is somewhat more
  151.  * economical in code size. Some compilers also have specialized calling
  152.  * conventions which may be suitable. Use compiler switches or insert a
  153.  * #pragma here to select your favorite calling convention.
  154.  */
  155. /* use GNU C default calling convention */
  156. /*  Mutex type
  157.  *
  158.  * If you intend to access the FLite API in a multi-tasking environment,
  159.  * you may need to implement some resource management and mutual-exclusion
  160.  * of FLite with mutex & semaphore services that are available to you. In
  161.  * this case, define here the Mutex type you will use, and provide your own
  162.  * implementation of the Mutex functions incustom.c
  163.  *
  164.  * By default, a Mutex is defined as a simple counter, and the Mutex
  165.  * functions in custom.c implement locking and unlocking by incrementing
  166.  * and decrementing the counter. This will work well on all single-tasking
  167.  * environment, as well as on many multi-tasking environments.
  168.  */
  169. typedef SEM_ID FLMutex;
  170. #define flStartCriticalSection(mutexPtr)  flTakeMutex(mutexPtr,1)
  171. #define flEndCriticalSection(mutexPtr)    flFreeMutex(mutexPtr)
  172. /*  Memory allocation
  173.  *
  174.  * The translation layers (e.g. FTL) need to allocate memory to handle
  175.  * Flash media. The size needed depends on the media being handled.
  176.  *
  177.  * You may choose to use the standard 'malloc' and 'free' to handle such
  178.  * memory allocations, provide your own equivalent routines, or you may
  179.  * choose not to define any memory allocation routine. In this case, the
  180.  * memory will be allocated statically at compile-time on the assumption of
  181.  * the largest media configuration you need to support. This is the simplest
  182.  * choice, but may cause your RAM requirements to be larger than you
  183.  * actually need.
  184.  *
  185.  * If you define routines other than malloc & free, they should have the
  186.  * same parameters and return types as malloc & free. You should either code
  187.  * these routines in custom.c or include them when you link your application.
  188.  */
  189. #define MALLOC_TFFS malloc
  190. #define FREE_TFFS free
  191. /* isRAM fault safe write
  192.  * The function isRAM() does a direct write to verify if the location 
  193.  * specified is RAM. It is possible that hardware is tailered to fault 
  194.  * in such situations. 
  195.  */
  196. #ifdef ORIG
  197. #define ISRAM_WRITE(src,dst) dst = src
  198. #else /* !ORG */
  199. #define ISRAM_WRITE(src,dst) 
  200. vxMemProbe ((char *)dst, VX_WRITE, 4, (char *)&src)
  201. #endif /* ORIG */
  202. /*                      Pointer arithmetic
  203.  *
  204.  * The following macros define machine- and compiler-dependent macros for
  205.  * handling pointers to physical window addresses. The definitions below are
  206.  * for PC real-mode Borland-C.
  207.  *
  208.  * 'physicalToPointer' translates a physical flat address to a (far) pointer.
  209.  * Note that if when your processor uses virtual memory, the code should
  210.  * map the physical address to virtual memory, and return a pointer to that
  211.  * memory (the size parameter tells how much memory should be mapped).
  212.  *
  213.  * 'addToFarPointer' adds an increment to a pointer and returns a new
  214.  * pointer. The increment may be as large as your window size. The code
  215.  * below assumes that the increment may be larger than 64 KB and so performs
  216.  * huge pointer arithmetic.
  217.  */
  218. #if FAR_LEVEL > 0
  219. #include <dos.h>
  220. #define physicalToPointer(physical,size,drive)          
  221.         MK_FP((int) ((physical) >> 4),(int) (physical) & 0xF)
  222. /*NEW*/ #define pointerToPhysical(ptr)                  
  223.         (((unsigned long) FP_SEG(ptr) << 4) + FP_OFF(ptr))
  224. #define addToFarPointer(base,increment)         
  225.         MK_FP(FP_SEG(base) +                    
  226.                 ((unsigned short) ((FP_OFF(base) + (increment)) >> 16) << 12), 
  227.         FP_OFF(base) + (int) (increment))
  228. #else
  229. #define physicalToPointer(physical,size,drive)          
  230.         ((void *) (physical))
  231. /*NEW*/ #define pointerToPhysical(ptr)  ((unsigned long)(ptr))
  232. #define addToFarPointer(base,increment)         
  233.         ((void *) ((unsigned char *) (base) + (increment)))
  234. #endif
  235. #ifdef __cplusplus
  236. }
  237. #endif
  238. #endif