tffsLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:9k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* tffsLib.c - TFFS FLite library for VxWorks. */
  2. /* Copyright 1984-1997 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /* FAT-FTL Lite Software Development Kit
  5.  * Copyright (C) M-Systems Ltd. 1995-1997 */
  6. /*
  7. modification history
  8. --------------------
  9. 01f,13apr98,yp   made interval timer a task instead of exc task.(SPR #20693)
  10. 01e,06jan98,hdn  added INVERSION_SAFE to the mutex semaphore.
  11. 01d,17dec97,hdn  fixed a typo in return value at RETURNS:
  12. 01c,15dec97,yp   doc cleanup.
  13. 01b,07nov97,hdn  cleaned up.
  14. 01a,20mar96,ami  written by Amirban in M-Systems
  15. */
  16. /*
  17. DESCRIPTION
  18. This library provides the OS binding to vxWorks for TFFS FLite .
  19. INCLUDE FILES: 
  20. */
  21. /* includes */
  22. #include "flbase.h"
  23. #include "tffsDrv.h"
  24. #include "taskLib.h"
  25. /* defines */
  26. #if     (POLLING_INTERVAL > 0)
  27. #define FL_POLL_TASK_PRIORITY  100
  28. #define FL_POLL_TASK_OPT  0
  29. #define FL_POLL_TASK_STACK_SIZE 2048
  30. #endif /* (POLLING_INTERVAL > 0) */
  31. /* externs */
  32. #if (POLLING_INTERVAL > 0)
  33. IMPORT SEM_ID  flPollSemId;
  34. #endif /* (POLLING_INTERVAL > 0) */
  35. /* globals */
  36. /* locals */
  37. LOCAL int flSysClkRate; /* ticks per second       */
  38. #if (POLLING_INTERVAL > 0)
  39. LOCAL int flPollInterval; /* socket polling interval in milliseconds */
  40. LOCAL int flPollTaskId;
  41. #endif /* (POLLING_INTERVAL > 0) */
  42. /* forward declarations */
  43. LOCAL void flTimerInit (void);
  44. #if (POLLING_INTERVAL > 0)
  45. LOCAL void (*flSocketPollingRoutine) (void);
  46. #endif /* (POLLING_INTERVAL > 0) */
  47. /*******************************************************************************
  48. *
  49. * flCreateMutex - create a mutex semaphore
  50. *
  51. * This translates a TFFS mutex create call to vxWorks.
  52. *
  53. * RETURNS: flOK, or flNotEnoughMemory if it fails.
  54. */
  55. FLStatus flCreateMutex 
  56.     (
  57.     FLMutex * mutex /* pointer to mutex */
  58.     )
  59.     {
  60.     /* Io requests should be processed exactly in the same */
  61.     /* sequence they are received                          */
  62.     *mutex = semMCreate (SEM_DELETE_SAFE | SEM_INVERSION_SAFE | SEM_Q_PRIORITY);
  63.     return ((*mutex != NULL) ? flOK : flNotEnoughMemory);
  64.     }
  65. /*******************************************************************************
  66. *
  67. * flTakeMutex - take a mutex semaphore
  68. *
  69. * This routine translates a mutex take call from TFFS to vxWorks.
  70. *
  71. * RETURNS: 0 if mutex not available otherwise returns 1.
  72. */
  73. int flTakeMutex 
  74.     (
  75.     FLMutex * mutex, /* pointer to mutex */
  76.     int mode /* 0 - nowait */
  77.     )
  78.     {
  79.     STATUS status;
  80.     status = semTake (*mutex, (mode == 0 ? NO_WAIT : WAIT_FOREVER));
  81.     if (status == ERROR)
  82. return (0);
  83.     else
  84.         return (1);
  85.     }
  86. /*******************************************************************************
  87. *
  88. * flFreeMutex - release a mutex semaphore
  89. *
  90. * This routine translates a mutex release call from TFFS to vxWorks.
  91. *
  92. * RETURNS: N/A
  93. */
  94. void flFreeMutex
  95.     (
  96.     FLMutex * mutex     /* pointer to mutex */
  97.     )
  98.     {
  99.     semGive (*mutex);
  100.     }
  101. #ifdef EXIT
  102. /*******************************************************************************
  103. *
  104. * flDeleteMutex - delete a mutex semaphore
  105. *
  106. * This routine translates a deletes mutex semaphore call from TFFS to vxWorks.
  107. *
  108. * RETURNS: N/A
  109. */
  110. void flDeleteMutex
  111.     (
  112.     FLMutex * mutex     /* pointer to mutex */
  113.     )
  114.     {
  115.     semDelete (*mutex);
  116.     *mutex = NULL;
  117.     }
  118. #endif /* EXIT */
  119. /*******************************************************************************
  120. *
  121. * flSysfunInit - initialize all the OS bindings
  122. *
  123. * This routine initializes all the OS bindings.
  124. *
  125. * RETURNS: N/A
  126. */
  127. void flSysfunInit (void)
  128.     {
  129.     flTimerInit ();
  130.     }
  131. /*******************************************************************************
  132. *
  133. * flTimerInit - initialize timer for socket polling
  134. *
  135. * This routine initializes timer for socket polling.
  136. *
  137. * RETURNS: N/A
  138. */
  139. static void flTimerInit (void)
  140.     {
  141.     flSysClkRate = sysClkRateGet ();
  142.     }
  143. #if (POLLING_INTERVAL > 0)
  144. /*******************************************************************************
  145. *
  146. * flPollTask - interval polling task
  147. *
  148. * This routine waits on the polling semaphore and invokes the interval
  149. * timer work routine when the semaphore becomes available. The function 
  150. * is not local so the task list on the shell can display the entry point.
  151. *
  152. * RETURNS: 
  153. */
  154. void flPollTask (void)
  155.     {
  156.     int delay;
  157.     semTake (flPollSemId, WAIT_FOREVER);
  158.     delay = (flPollInterval * flSysClkRate )/1000;
  159.     if (delay == 0)
  160.         delay = 1;
  161.     /* remove the polling semaphore */
  162.     semDelete (flPollSemId);
  163.     FOREVER
  164. {
  165. taskDelay (delay);
  166. (*flSocketPollingRoutine)();
  167. }
  168.     }
  169. /*******************************************************************************
  170. *
  171. * flInstallTimer - install the timer for socket polling
  172. *
  173. * This routine installs the timer used for socket polling.
  174. *
  175. * RETURNS: flOK, or flNotEnoughMemory if wdCreate() failed.
  176. */
  177. FLStatus flInstallTimer 
  178.     (
  179.     void (*routine)(void),
  180.     unsigned int intervalMsec
  181.     )
  182.     {
  183.     flPollInterval         = intervalMsec;
  184.     flSocketPollingRoutine = routine;
  185.     /* Spawn the polling task */
  186.     if ((flPollTaskId = taskSpawn ("tTffsPTask",
  187.   FL_POLL_TASK_PRIORITY,
  188.   FL_POLL_TASK_OPT,
  189.   FL_POLL_TASK_STACK_SIZE,
  190.   (FUNCPTR) flPollTask,0,0,0,0,0,0,0,0,0,0)) == ERROR)
  191.         return (flNotEnoughMemory);
  192.     return (flOK);
  193.     }
  194. #ifdef EXIT
  195. /*******************************************************************************
  196. *
  197. * flRemoveTimer - cancel socket polling
  198. *
  199. * This routine cancels socket polling.
  200. *
  201. * RETURNS: N/A
  202. */
  203. void flRemoveTimer (void)
  204.     {
  205.     /* Call it twice to shut down everything */
  206.     (*flSocketPollingRoutine)();
  207.     (*flSocketPollingRoutine)();
  208.     /* remove socket polling */
  209.     flSocketPollingRoutine = NULL;
  210.     /* remove the polling task */
  211.     taskDelete (flPollTaskId);
  212.     }
  213. #endif /* EXIT */
  214. #endif /* POLLING_INTERVAL */
  215. /*******************************************************************************
  216. *
  217. * flRandByte - return a random number from 0 to 255
  218. *
  219. * This routine returns a random number from 0 to 255.
  220. *
  221. * RETURNS: random number
  222. */
  223. unsigned flRandByte (void)
  224.     {
  225.     /* XXX return (tickGet () & 0xff); */
  226.     return (rand () & 0xff);
  227.     }
  228. /*******************************************************************************
  229. *
  230. * flCurrentTime - returns current time of day
  231. *
  232. * This routine Returns current time of day in the format described below.
  233. *      bits  4 ..  0  - seconds
  234. *      bits 10 ..  5  - minutes
  235. *      bits 15 .. 11  - hours
  236. *
  237. * RETURNS: current time
  238. */
  239. unsigned flCurrentTime (void)
  240.     {
  241.     unsigned char hour, minute, second;
  242.     time_t        flAnsiTime;
  243.     struct tm    *flLocalTimePtr;
  244.     time (&flAnsiTime);
  245.     flLocalTimePtr = localtime (&flAnsiTime);
  246.     hour   = (unsigned char) flLocalTimePtr->tm_hour;
  247.     minute = (unsigned char) flLocalTimePtr->tm_min;
  248.     second = (unsigned char) flLocalTimePtr->tm_sec;
  249.     return ((hour << 11) | (minute << 5) | second);
  250.     }
  251. /*******************************************************************************
  252. *
  253. * flCurrentDate - returns current date
  254. *
  255. * This routine Returns current date in the format described below.
  256. *      bits  4 .. 0  - day
  257. *      bits  8 .. 5  - month
  258. *      bits 15 .. 9  - year (0 for 1980)
  259. *
  260. * RETURNS: current date
  261. */
  262. unsigned flCurrentDate (void)
  263.     {
  264.     short int  year;
  265.     char       month, day;
  266.     struct tm *flLocalTimePtr;
  267.     time_t     flAnsiTime;
  268.     time (&flAnsiTime);
  269.     flLocalTimePtr = localtime (&flAnsiTime);
  270.     year  = (short int) (flLocalTimePtr->tm_year - 80);
  271.     month = (char)       flLocalTimePtr->tm_mon + 1;
  272.     day   = (char)       flLocalTimePtr->tm_mday;
  273.     return ((year << 9) | (month << 5) | day);
  274.     }
  275. /*******************************************************************************
  276. *
  277. * flAddLongToFarPointer - add unsigned long offset to the far pointer
  278. *
  279. * This routine adds an unsigned long offset to a far pointer.
  280. *
  281. * RETURNS: far pointer
  282. */
  283. void FAR0*  flAddLongToFarPointer
  284.     (
  285.     void FAR0 *ptr, 
  286.     unsigned long offset
  287.     )
  288.     {
  289.     return (physicalToPointer( pointerToPhysical(ptr) + offset, 0,0));
  290.     }
  291. #if FALSE /* moved to the BSP/sysTffs.c */
  292. /*******************************************************************************
  293. *
  294. * flDelayMsecs - wait for specified number of milliseconds
  295. *
  296. * This routine waits for a specified number of milliseconds doing nothing.
  297. *
  298. * RETURNS: N/A
  299. */
  300. void flDelayMsecs 
  301.     (
  302.     unsigned milliseconds /* milliseconds to wait */
  303.     )
  304.     {
  305.     unsigned long stop, ticksToWait;
  306.     ticksToWait = (milliseconds * flSysClkRate) / 500;
  307.     if (ticksToWait == 0x0l)
  308.         ticksToWait++;
  309.     stop = tickGet () + ticksToWait;
  310.     while (tickGet () <= stop)
  311. ;
  312.     }
  313. /*----------------------------------------------------------------------*/
  314. /*                        f l D e l a y L o o p                         */
  315. /* */
  316. /* Short delay.                                                         */
  317. /*                                                                      */
  318. /* Parameters:                                                          */
  319. /*      cycles          : wait loop cycles to perform                   */
  320. /*----------------------------------------------------------------------*/
  321. void flDelayLoop (int  cycles)     /* HOOK for VME-177 */
  322. {
  323.   while(--cycles) ; 
  324. }
  325. #endif /* FLASE */