FS_X_win32.c
上传用户:yj_qqy
上传日期:2017-01-28
资源大小:2911k
文件大小:9k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. **********************************************************************
  3. *                          Micrium, Inc.
  4. *                      949 Crestview Circle
  5. *                     Weston,  FL 33327-1848
  6. *
  7. *                            uC/FS
  8. *
  9. *             (c) Copyright 2001 - 2003, Micrium, Inc.
  10. *                      All rights reserved.
  11. *
  12. ***********************************************************************
  13. ----------------------------------------------------------------------
  14. File        : fs_x_win32.c
  15. Purpose     : Win32 API OS Layer for the file system
  16. ----------------------------------------------------------------------
  17. Known problems or limitations with current version
  18. ----------------------------------------------------------------------
  19. None.
  20. ---------------------------END-OF-HEADER------------------------------
  21. */
  22. /*********************************************************************
  23. *
  24. *             #include Section
  25. *
  26. **********************************************************************
  27. */
  28. #include "fs_port.h"
  29. #include "fs_api.h"
  30. #include "fs_dev.h"
  31. #include "fs_os.h"
  32. #include "fs_conf.h"
  33. #if (FS_OS_WINDOWS)
  34. #if FS_OS_TIME_SUPPORT
  35. #include <time.h>
  36. #endif
  37. #include <windows.h>
  38. /*********************************************************************
  39. *
  40. *             Local Variables        
  41. *
  42. **********************************************************************
  43. */
  44. static HANDLE _FS_fh_sema=NULL;
  45. static HANDLE _FS_fop_sema=NULL;
  46. static HANDLE _FS_mem_sema=NULL;
  47. static HANDLE _FS_dop_sema=NULL;
  48. #if FS_POSIX_DIR_SUPPORT
  49. static HANDLE _FS_dirh_sema=NULL;
  50. static HANDLE _FS_dirop_sema=NULL;
  51. #endif  /* FS_POSIX_DIR_SUPPORT */
  52. /*********************************************************************
  53. *
  54. *             Global functions section
  55. *
  56. **********************************************************************
  57. */
  58. /*********************************************************************
  59. *
  60. *             FS_X_OS_LockFileHandle
  61. *
  62.   Lock global table _FS_filehandle (fs_info.c).
  63. */
  64. void FS_X_OS_LockFileHandle(void) {
  65.   if (_FS_fh_sema==NULL) {
  66.     return;
  67.   }
  68.   WaitForSingleObject(_FS_fh_sema,INFINITE);
  69. }
  70. /*********************************************************************
  71. *
  72. *             FS_X_OS_UnlockFileHandle
  73. *
  74.   Unlock global table _FS_filehandle (fs_info.c).
  75. */
  76. void FS_X_OS_UnlockFileHandle(void) {
  77.   if (_FS_fh_sema==NULL) {
  78.     return;
  79.   }
  80.   ReleaseSemaphore(_FS_fh_sema, 1,NULL);
  81. }
  82. /*********************************************************************
  83. *
  84. *             FS_X_OS_LockFileOp
  85. *
  86.   The filesystem does allow unlimited number of file access 
  87.   operations at the same time. It is not allowed to access
  88.   a file during an operation to it is pending. Because different
  89.   fp's may access the same file, an implementation has to check
  90.   fp->fileid_lo, fp->fileid_hi and fp->fileid_ex, if it wants
  91.   to allow multiple file access operations at the same time.
  92.   This implementation does allow only one file access
  93.   operation at the same time.
  94. */
  95. void FS_X_OS_LockFileOp(FS_FILE *fp) {
  96.   if (_FS_fop_sema==NULL) {
  97.     return;
  98.   }
  99.   WaitForSingleObject(_FS_fop_sema,INFINITE);
  100. }
  101. /*********************************************************************
  102. *
  103. *             FS_X_OS_UnlockFileOp
  104. *
  105.   Please see FS_X_OS_LockFileOp.
  106. */
  107. void FS_X_OS_UnlockFileOp(FS_FILE *fp) {
  108.   if (_FS_fop_sema==NULL) {
  109.     return;
  110.   }
  111.   ReleaseSemaphore(_FS_fop_sema, 1,NULL);
  112. }
  113. /*********************************************************************
  114. *
  115. *             FS_X_OS_LockMem
  116. *
  117.   Lock global table _FS_memblock (fat_misc.c).
  118. */
  119. void FS_X_OS_LockMem(void) {
  120.   if (_FS_mem_sema==NULL) {
  121.     return;
  122.   }
  123.   WaitForSingleObject(_FS_mem_sema,INFINITE);
  124. }
  125. /*********************************************************************
  126. *
  127. *             FS_X_OS_UnlockMem
  128. *
  129.     Unlock global table _FS_memblock (fat_misc.c).
  130. */
  131. void FS_X_OS_UnlockMem(void) {
  132.   if (_FS_mem_sema==NULL) {
  133.     return;
  134.   }
  135.   ReleaseSemaphore(_FS_mem_sema, 1,NULL);
  136. }
  137. /*********************************************************************
  138. *
  139. *             FS_X_OS_LockDeviceOp
  140. *
  141.   The filesystem does allow unlimited number of device access 
  142.   operations at the same time. It is not allowed to access
  143.   the same driver and unit during an operation to it is already
  144.   pending. 
  145.    
  146.   This implementation does allow only one device access
  147.   operation at the same time.
  148. */
  149. void FS_X_OS_LockDeviceOp(const FS__device_type *driver, FS_u32 id) {
  150.   if (_FS_dop_sema==NULL) {
  151.     return;
  152.   }
  153.   WaitForSingleObject(_FS_dop_sema,INFINITE);
  154. }
  155. /*********************************************************************
  156. *
  157. *             FS_X_OS_UnlockDeviceOp
  158. *
  159.     Please see FS_X_OS_LockDeviceOp.
  160. */
  161. void FS_X_OS_UnlockDeviceOp(const FS__device_type *driver, FS_u32 id) {
  162.   if (_FS_dop_sema==NULL) {
  163.     return;
  164.   }
  165.   ReleaseSemaphore(_FS_dop_sema, 1,NULL);
  166. }
  167. #if FS_POSIX_DIR_SUPPORT
  168. /*********************************************************************
  169. *
  170. *             FS_X_OS_LockDirHandle
  171. *
  172.   Lock global table _FS_dirhandle (api_dir.c).
  173. */
  174. void FS_X_OS_LockDirHandle(void) {
  175.   if (_FS_dirh_sema==NULL) {
  176.     return;
  177.   }
  178.   WaitForSingleObject(_FS_dirh_sema,INFINITE);
  179. }
  180. /*********************************************************************
  181. *
  182. *             FS_X_OS_UnlockDirHandle
  183. *
  184.   Unlock global table _FS_dirhandle (api_dir.c).
  185. */
  186. void FS_X_OS_UnlockDirHandle(void) {
  187.   if (_FS_dirh_sema==NULL) {
  188.     return;
  189.   }
  190.   ReleaseSemaphore(_FS_dirh_sema, 1,NULL);
  191. }
  192. /*********************************************************************
  193. *
  194. *             FS_X_OS_LockDirOp
  195. *
  196.   The filesystem does allow unlimited number of directory access 
  197.   operations at the same time. It is not allowed to access
  198.   a directory during an operation to it is pending. Because different
  199.   dirp's may access the same directory, an implementation has to check
  200.   dirp->dirid_lo, dirp->dirid_hi and dirp->dirid_ex, if it wants
  201.   to allow multiple directory access operations at the same time.
  202.   This implementation does allow only one directory access
  203.   operation at the same time.
  204. */
  205. void FS_X_OS_LockDirOp(FS_DIR *dirp) {
  206.   if (_FS_dirop_sema==NULL) {
  207.     return;
  208.   }
  209.   WaitForSingleObject(_FS_dirop_sema,INFINITE);
  210. }
  211. /*********************************************************************
  212. *
  213. *             FS_X_OS_UnlockDirOp
  214. *
  215.   Please see FS_X_OS_LockDirOp.
  216. */
  217. void FS_X_OS_UnlockDirOp(FS_DIR *dirp) {
  218.   if (_FS_dirop_sema==NULL) {
  219.     return;
  220.   }
  221.   ReleaseSemaphore(_FS_dirop_sema, 1,NULL);
  222. }
  223. #endif  /* FS_POSIX_DIR_SUPPORT */
  224. /*********************************************************************
  225. *
  226. *             FS_X_OS_GetDate
  227. */
  228. FS_u16 FS_X_OS_GetDate(void) {
  229.   FS_u16 fdate;
  230. #if FS_OS_TIME_SUPPORT
  231.   time_t t;
  232.   struct tm *ltime;
  233.   time(&t);
  234.   ltime = localtime(&t);
  235.   fdate = ltime->tm_mday;
  236.   fdate += ((FS_u16) (ltime->tm_mon+1) << 5);
  237.   fdate += ((FS_u16) (ltime->tm_year-80) << 9);
  238. #else
  239.   fdate = 1;
  240.   fdate += ((FS_u16) 1 << 5);
  241.   fdate += ((FS_u16) 0 << 9);
  242. #endif /* FS_OS_TIME_SUPPORT */
  243.   return fdate;
  244. }
  245. /*********************************************************************
  246. *
  247. *             FS_X_OS_GetTime
  248. */
  249. FS_u16 FS_X_OS_GetTime(void) {
  250.   FS_u16 ftime;
  251. #if FS_OS_TIME_SUPPORT
  252.   time_t t;
  253.   struct tm *ltime;
  254.   time(&t);
  255.   ltime = localtime(&t);
  256.   ftime = ltime->tm_sec/2;
  257.   ftime += ((FS_u16) ltime->tm_min << 5);
  258.   ftime += ((FS_u16) ltime->tm_hour << 11);
  259. #else
  260.   ftime = 0;
  261.   ftime += ((FS_u16) 0 << 5);
  262.   ftime += ((FS_u16) 0 << 11);
  263. #endif /* FS_OS_TIME_SUPPORT */
  264.   return ftime;
  265. }
  266. /*********************************************************************
  267. *
  268. *             FS_X_OS_Init
  269. */
  270. int FS_X_OS_Init(void) {
  271.   _FS_fh_sema = CreateSemaphore(NULL, 1, 1, NULL);
  272.   if (_FS_fh_sema == NULL) {
  273.     return -1;
  274.   }
  275.   _FS_fop_sema = CreateSemaphore(NULL, 1, 1, NULL);
  276.   if (_FS_fop_sema == NULL) {
  277.     return -1;
  278.   }
  279.   _FS_mem_sema = CreateSemaphore(NULL, 1, 1, NULL);
  280.   if (_FS_mem_sema == NULL) {
  281.     return -1;
  282.   }
  283.   _FS_dop_sema = CreateSemaphore(NULL, 1, 1, NULL);
  284.   if (_FS_dop_sema == NULL) {
  285.     return -1;
  286.   }
  287. #if FS_POSIX_DIR_SUPPORT
  288.   _FS_dirh_sema = CreateSemaphore(NULL, 1, 1, NULL);
  289.   if (_FS_dirh_sema == NULL) {
  290.     return -1;
  291.   }
  292.   _FS_dirop_sema = CreateSemaphore(NULL, 1, 1, NULL);
  293.   if (_FS_dirop_sema == NULL) {
  294.     return -1;
  295.   }
  296. #endif  /* FS_POSIX_DIR_SUPPORT */
  297.   return 0;
  298. }
  299. /*********************************************************************
  300. *
  301. *             FS_OS_Exit
  302. */
  303. int FS_X_OS_Exit(void) {
  304.   if (_FS_fh_sema!=NULL) {
  305.     CloseHandle(_FS_fh_sema);
  306.   }
  307.   if (_FS_fop_sema!=NULL) {
  308.     CloseHandle(_FS_fop_sema);
  309.   }
  310.   if (_FS_mem_sema!=NULL) {
  311.     CloseHandle(_FS_mem_sema);
  312.   }
  313.   if (_FS_dop_sema!=NULL) {
  314.     CloseHandle(_FS_dop_sema);
  315.   }
  316. #if FS_POSIX_DIR_SUPPORT
  317.   if (_FS_dirh_sema!=NULL) {
  318.     CloseHandle(_FS_dirh_sema);
  319.   }
  320.   if (_FS_dirop_sema!=NULL) {
  321.     CloseHandle(_FS_dirop_sema);
  322.   }
  323. #endif  /* FS_POSIX_DIR_SUPPORT */
  324.   return 0;
  325. }
  326. #endif /* FS_OS_WINDOWS */