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

VxWorks

开发平台:

C/C++

  1. /*
  2.  * $Log:   P:/user/amir/lite/vcs/flsocket.c_v  $
  3.  * 
  4.  *    Rev 1.21   09 Jan 1998 17:10:00   Hdei
  5.  * changed MALLOC FREE to MALLOC_TFFS FREE_TFFS.
  6.  *
  7.  *    Rev 1.21   29 Sep 1997 14:22:36   danig
  8.  * flExitSocket
  9.  * 
  10.  *    Rev 1.21   28 Sep 1997 18:24:02   danig
  11.  * flExitSocket
  12.  * 
  13.  *    Rev 1.20   10 Sep 1997 16:27:54   danig
  14.  * Got rid of generic names
  15.  * 
  16.  *    Rev 1.19   04 Sep 1997 16:23:36   danig
  17.  * Debug messages
  18.  * 
  19.  *    Rev 1.18   28 Aug 1997 17:49:24   danig
  20.  * Buffer & remapped per socket
  21.  * 
  22.  *    Rev 1.17   17 Aug 1997 15:10:48   danig
  23.  * Turn off the card change indicator in flResetCardChanged
  24.  * 
  25.  *    Rev 1.16   27 Jul 1997 11:59:38   amirban
  26.  * Socket.volNo initialization
  27.  * 
  28.  *    Rev 1.15   27 Jul 1997 10:12:12   amirban
  29.  * physicalToPointer and FAR -> FAR0
  30.  * 
  31.  *    Rev 1.14   20 Jul 1997 17:15:38   amirban
  32.  * No watchDogTimer
  33.  * 
  34.  *    Rev 1.13   07 Jul 1997 15:21:46   amirban
  35.  * Ver 2.0
  36.  * 
  37.  *    Rev 1.12   08 Jun 1997 17:03:22   amirban
  38.  * power on callback
  39.  * 
  40.  *    Rev 1.11   15 Apr 1997 19:13:48   danig
  41.  * Added SOCKET_12_VOLTS before a call to vppOff.
  42.  * 
  43.  *    Rev 1.10   25 Nov 1996 17:23:38   danig
  44.  * Changed doNotDisturb from Boolean to counter
  45.  * 
  46.  *    Rev 1.9   20 Nov 1996 16:24:34   danig
  47.  * added remapped to socketSetBusy.
  48.  * 
  49.  *    Rev 1.8   08 Oct 1996 12:17:52   amirban
  50.  * Defined remapped
  51.  * 
  52.  *    Rev 1.7   18 Aug 1996 13:48:38   amirban
  53.  * Comments
  54.  * 
  55.  *    Rev 1.6   15 Aug 1996 11:51:16   amirban
  56.  * Wait state mistake
  57.  *
  58.  *    Rev 1.5   31 Jul 1996 14:31:14   amirban
  59.  * Background stuff, and 5V Vpp
  60.  * 
  61.  *    Rev 1.4   09 Jul 1996 14:36:52   amirban
  62.  * CPU_i386 define
  63.  * 
  64.  *    Rev 1.3   01 Jul 1996 15:41:44   amirban
  65.  * init for all sockets
  66.  * 
  67.  *    Rev 1.2   09 Jun 1996 18:16:30   amirban
  68.  * Correction of socketSetBusy
  69.  * 
  70.  *    Rev 1.1   03 Jun 1996 16:20:26   amirban
  71.  * Typo fix
  72.  * 
  73.  *    Rev 1.0   20 Mar 1996 13:33:06   amirban
  74.  * Initial revision.
  75.  */
  76. /************************************************************************/
  77. /*                                                                      */
  78. /* FAT-FTL Lite Software Development Kit */
  79. /* Copyright (C) M-Systems Ltd. 1995-1996 */
  80. /* */
  81. /************************************************************************/
  82. #include "flsocket.h"
  83. unsigned noOfDrives = 0; /* No. of drives actually registered */
  84. static FLSocket vols[DRIVES];
  85. #ifndef SINGLE_BUFFER
  86. #ifdef MALLOC_TFFS
  87. static FLBuffer *volBuffers[DRIVES];
  88. #else
  89. static FLBuffer volBuffers[DRIVES];
  90. #endif
  91. #endif
  92. /*----------------------------------------------------------------------*/
  93. /*                 f l S o c k e t N o O f  */
  94. /* */
  95. /* Gets the volume no. connected to a socket */
  96. /* */
  97. /* Parameters:                                                          */
  98. /* vol : Pointer identifying drive */
  99. /*                                                                      */
  100. /* Returns:                                                             */
  101. /*  volume no. of socket */
  102. /*----------------------------------------------------------------------*/
  103. unsigned flSocketNoOf(const FLSocket vol)
  104. {
  105.   return vol.volNo;
  106. }
  107. /*----------------------------------------------------------------------*/
  108. /*                 f l S o c k e t O f     */
  109. /* */
  110. /* Gets the socket connected to a volume no. */
  111. /* */
  112. /* Parameters:                                                          */
  113. /* volNo : Volume no. for which to get socket */
  114. /*                                                                      */
  115. /* Returns:                                                             */
  116. /*  socket of volume no. */
  117. /*----------------------------------------------------------------------*/
  118. FLSocket *flSocketOf(unsigned volNo)
  119. {
  120.   return &vols[volNo];
  121. }
  122. #ifndef SINGLE_BUFFER
  123. /*----------------------------------------------------------------------*/
  124. /*                 f l B u f f e r O f     */
  125. /* */
  126. /* Gets the buffer connected to a volume no. */
  127. /* */
  128. /* Parameters:                                                          */
  129. /* volNo : Volume no. for which to get socket */
  130. /*                                                                      */
  131. /* Returns:                                                             */
  132. /*  buffer of volume no. */
  133. /*----------------------------------------------------------------------*/
  134. FLBuffer *flBufferOf(unsigned volNo)
  135. {
  136. #ifdef MALLOC_TFFS
  137.   return volBuffers[volNo];
  138. #else
  139.   return &volBuffers[volNo];
  140. #endif
  141. }
  142. #endif /* SINGLE_BUFFER */
  143. /*----------------------------------------------------------------------*/
  144. /*               f l W r i t e P r o t e c t e d */
  145. /* */
  146. /* Returns the write-protect state of the media */
  147. /* */
  148. /* Parameters:                                                          */
  149. /* vol : Pointer identifying drive */
  150. /*                                                                      */
  151. /* Returns:                                                             */
  152. /* 0 = not write-protected, other = write-protected */
  153. /*----------------------------------------------------------------------*/
  154. FLBoolean flWriteProtected(FLSocket vol)
  155. {
  156.   return vol.writeProtected(&vol);
  157. }
  158. #ifndef FIXED_MEDIA
  159. /*----------------------------------------------------------------------*/
  160. /*             f l R e s e t C a r d C h a n g e d */
  161. /* */
  162. /* Acknowledges a media-change condition and turns off the condition. */
  163. /* */
  164. /* Parameters:                                                          */
  165. /* vol : Pointer identifying drive */
  166. /*                                                                      */
  167. /*----------------------------------------------------------------------*/
  168. void flResetCardChanged(FLSocket vol)
  169. {
  170.   if (vol.getAndClearCardChangeIndicator)
  171.       vol.getAndClearCardChangeIndicator(&vol);  /* turn off the indicator */
  172.   vol.cardChanged = FALSE;
  173. }
  174. /*----------------------------------------------------------------------*/
  175. /*                 f l M e d i a C h e c k */
  176. /* */
  177. /* Checks the presence and change status of the media */
  178. /* */
  179. /* Parameters:                                                          */
  180. /* vol : Pointer identifying drive */
  181. /*                                                                      */
  182. /* Returns:                                                             */
  183. /*  flOK -> Media present and not changed */
  184. /* driveNotReady   -> Media not present */
  185. /* diskChange -> Media present but changed */
  186. /*----------------------------------------------------------------------*/
  187. FLStatus flMediaCheck(FLSocket vol)
  188. {
  189.   if (!vol.cardDetected(&vol)) {
  190.     vol.cardChanged = TRUE;
  191.     return flDriveNotReady;
  192.   }
  193.   if (vol.getAndClearCardChangeIndicator &&
  194.       vol.getAndClearCardChangeIndicator(&vol))
  195.     vol.cardChanged = TRUE;
  196.   return vol.cardChanged ? flDiskChange : flOK;
  197. }
  198. #endif
  199. /*----------------------------------------------------------------------*/
  200. /*                f l I n i t S o c k e t s         */
  201. /* */
  202. /* First call to this module: Initializes the controller and all sockets*/
  203. /* */
  204. /* Parameters:                                                          */
  205. /* vol : Pointer identifying drive */
  206. /*                                                                      */
  207. /* Returns:                                                             */
  208. /* FLStatus : 0 on success, failed otherwise */
  209. /*----------------------------------------------------------------------*/
  210. FLStatus flInitSockets(void)
  211. {
  212.   unsigned volNo;
  213.   FLSocket vol = vols;
  214.   for (volNo = 0; volNo < noOfDrives; volNo++, pVol++) {
  215.     flSetWindowSpeed(&vol, 250);
  216.     flSetWindowBusWidth(&vol, 16);
  217.     flSetWindowSize(&vol, 2); /* make it 8 KBytes */
  218.     vol.cardChanged = FALSE;
  219.   #ifndef SINGLE_BUFFER
  220.   #ifdef MALLOC_TFFS
  221.     /* allocate buffer for this socket */
  222.     volBuffers[volNo] = (FLBuffer *)MALLOC_TFFS(sizeof(FLBuffer));
  223.     if (volBuffers[volNo] == NULL) {
  224.     #ifdef DEBUG_PRINT
  225.       DEBUG_PRINT("Debug: failed allocating sector buffer.n");
  226.     #endif
  227.       return flNotEnoughMemory;
  228.     }
  229.   #endif
  230.   #endif
  231.     checkStatus(vol.initSocket(&vol));
  232.   #ifdef SOCKET_12_VOLTS
  233.     vol.VppOff(&vol);
  234.     vol.VppState = PowerOff;
  235.     vol.VppUsers = 0;
  236.   #endif
  237.     vol.VccOff(&vol);
  238.     vol.VccState = PowerOff;
  239.     vol.VccUsers = 0;
  240.   }
  241.   return flOK;
  242. }
  243. /*----------------------------------------------------------------------*/
  244. /*            f l G e t M a p p i n g C o n t e x t */
  245. /* */
  246. /* Returns the currently mapped window page (in 4KB units) */
  247. /* */
  248. /* Parameters:                                                          */
  249. /* vol : Pointer identifying drive */
  250. /*                                                                      */
  251. /* Returns:                                                             */
  252. /* unsigned int : Current mapped page no. */
  253. /*----------------------------------------------------------------------*/
  254. unsigned flGetMappingContext(FLSocket vol)
  255. {
  256.   return vol.window.currentPage;
  257. }
  258. /*----------------------------------------------------------------------*/
  259. /*                       f l M a p         */
  260. /* */
  261. /* Maps the window to a specified card address and returns a pointer to */
  262. /* that location (some offset within the window). */
  263. /* */
  264. /* NOTE: Addresses over 128M are attribute memory. On PCMCIA adapters, */
  265. /* subtract 128M from the address and map to attribute memory. */
  266. /*                                                                      */
  267. /* Parameters:                                                          */
  268. /* vol : Pointer identifying drive */
  269. /*      address : Byte-address on card. NOT necessarily on a  */
  270. /*   full-window boundary. */
  271. /*   If above 128MB, address is in attribute space.*/
  272. /*                                                                      */
  273. /* Returns:                                                             */
  274. /* Pointer to a location within the window mapping the address. */
  275. /*----------------------------------------------------------------------*/
  276. void FAR0 *flMap(FLSocket vol, CardAddress address)
  277. {
  278.   unsigned pageToMap;
  279.   if (vol.window.currentPage == UNDEFINED_MAPPING)
  280.     vol.setWindow(&vol);
  281.   pageToMap = (unsigned) ((address & -vol.window.size) >> 12);
  282.   if (vol.window.currentPage != pageToMap) {
  283.     vol.setMappingContext(&vol, pageToMap);
  284.     vol.window.currentPage = pageToMap;
  285.     vol.remapped = TRUE; /* indicate remapping done */
  286.   }
  287.   return addToFarPointer(vol.window.base,address & (vol.window.size - 1));
  288. }
  289. /*----------------------------------------------------------------------*/
  290. /*             f l S e t W i n d o w B u s W i d t h */
  291. /* */
  292. /* Requests to set the window bus width to 8 or 16 bits. */
  293. /* Whether the request is filled depends on hardware capabilities. */
  294. /* */
  295. /* Parameters:                                                          */
  296. /* vol : Pointer identifying drive */
  297. /*      width : Requested bus width */
  298. /*                                                                      */
  299. /*----------------------------------------------------------------------*/
  300. void flSetWindowBusWidth(FLSocket vol, unsigned width)
  301. {
  302.   vol.window.busWidth = width;
  303.   vol.window.currentPage = UNDEFINED_MAPPING; /* force remapping */
  304. }
  305. /*----------------------------------------------------------------------*/
  306. /*            f l S e t W i n d o w S p e e d */
  307. /* */
  308. /* Requests to set the window speed to a specified value. */
  309. /* The window speed is set to a speed equal or slower than requested, */
  310. /* if possible in hardware. */
  311. /* */
  312. /* Parameters:                                                          */
  313. /* vol : Pointer identifying drive */
  314. /*      nsec : Requested window speed in nanosec. */
  315. /*                                                                      */
  316. /*----------------------------------------------------------------------*/
  317. void flSetWindowSpeed(FLSocket vol, unsigned nsec)
  318. {
  319.   vol.window.speed = nsec;
  320.   vol.window.currentPage = UNDEFINED_MAPPING; /* force remapping */
  321. }
  322. /*----------------------------------------------------------------------*/
  323. /*             f l S e t W i n d o w S i z e */
  324. /* */
  325. /* Requests to set the window size to a specified value (power of 2). */
  326. /* The window size is set to a size equal or greater than requested, */
  327. /* if possible in hardware. */
  328. /* */
  329. /* Parameters:                                                          */
  330. /* vol : Pointer identifying drive */
  331. /*      sizeIn4KBUnits : Requested window size in 4 KByte units. */
  332. /*  MUST be a power of 2. */
  333. /*                                                                      */
  334. /*----------------------------------------------------------------------*/
  335. void flSetWindowSize(FLSocket vol, unsigned sizeIn4KBunits)
  336. {
  337.   vol.window.size = (long) (sizeIn4KBunits) * 0x1000L;
  338. /* Size may not be possible. Actual size will be set by 'setWindow' */
  339.   vol.window.base = physicalToPointer((long) vol.window.baseAddress << 12,
  340.       vol.window.size,vol.volNo);
  341.   vol.window.currentPage = UNDEFINED_MAPPING; /* force remapping */
  342. }
  343. /*----------------------------------------------------------------------*/
  344. /*            f l S o c k e t S e t B u s y */
  345. /* */
  346. /* Notifies the start and end of a file-system operation. */
  347. /* */
  348. /* Parameters:                                                          */
  349. /* vol : Pointer identifying drive */
  350. /*      state : TFFS_ON (1) = operation entry */
  351. /*   TFFS_OFF(0) = operation exit */
  352. /*                                                                      */
  353. /*----------------------------------------------------------------------*/
  354. void flSocketSetBusy(FLSocket vol, FLBoolean state)
  355. {
  356.   if (state == TFFS_OFF) {
  357. #if POLLING_INTERVAL == 0
  358.     /* If we are not polling, activate the interval routine before exit */
  359.     flIntervalRoutine(&vol);
  360. #endif
  361.   }
  362.   else {
  363.     vol.window.currentPage = UNDEFINED_MAPPING; /* don't assume mapping still valid */
  364.     vol.remapped = TRUE;
  365.   }
  366. }
  367. /*----------------------------------------------------------------------*/
  368. /*                   f l N e e d V c c */
  369. /* */
  370. /* Turns on Vcc, if not on already */
  371. /* */
  372. /* Parameters:                                                          */
  373. /* vol : Pointer identifying drive */
  374. /*                                                                      */
  375. /* Returns:                                                             */
  376. /* FLStatus : 0 on success, failed otherwise */
  377. /*----------------------------------------------------------------------*/
  378. void flNeedVcc(FLSocket vol)
  379. {
  380.   vol.VccUsers++;
  381.   if (vol.VccState == PowerOff) {
  382.     vol.VccOn(&vol);
  383.     if (vol.powerOnCallback)
  384.       vol.powerOnCallback(vol.flash);
  385.   }
  386.   vol.VccState = PowerOn;
  387. }
  388. /*----------------------------------------------------------------------*/
  389. /*                f l D o n t N e e d V c c */
  390. /* */
  391. /* Notifies that Vcc is no longer needed, allowing it to be turned off. */
  392. /* */
  393. /* Parameters:                                                          */
  394. /* vol : Pointer identifying drive */
  395. /*                                                                      */
  396. /*----------------------------------------------------------------------*/
  397. void flDontNeedVcc(FLSocket vol)
  398. {
  399.   if (vol.VccUsers > 0)
  400.     vol.VccUsers--;
  401. }
  402. #ifdef SOCKET_12_VOLTS
  403. /*----------------------------------------------------------------------*/
  404. /*                   f l N e e d V p p */
  405. /* */
  406. /* Turns on Vpp, if not on already */
  407. /* */
  408. /* Parameters:                                                          */
  409. /* vol : Pointer identifying drive */
  410. /*                                                                      */
  411. /* Returns:                                                             */
  412. /* FLStatus : 0 on success, failed otherwise */
  413. /*----------------------------------------------------------------------*/
  414. FLStatus flNeedVpp(FLSocket vol)
  415. {
  416.   vol.VppUsers++;
  417.   if (vol.VppState == PowerOff)
  418.     checkStatus(vol.VppOn(&vol));
  419.   vol.VppState = PowerOn;
  420.   return flOK;
  421. }
  422. /*----------------------------------------------------------------------*/
  423. /*                f l D o n t N e e d V p p */
  424. /* */
  425. /* Notifies that Vpp is no longer needed, allowing it to be turned off. */
  426. /* */
  427. /* Parameters:                                                          */
  428. /* vol : Pointer identifying drive */
  429. /*                                                                      */
  430. /*----------------------------------------------------------------------*/
  431. void flDontNeedVpp(FLSocket vol)
  432. {
  433.   if (vol.VppUsers > 0)
  434.     vol.VppUsers--;
  435.   
  436.   if (vol.VppUsers == 0) /* ADDED. to support ss5 */
  437.       {
  438.       vol.VppState = PowerOff;
  439.       vol.VppOff (&vol);
  440.       }
  441. }
  442. #endif /* SOCKET_12_VOLTS */
  443. /*----------------------------------------------------------------------*/
  444. /*           f l S e t P o w e r O n C a l l b a c k */
  445. /* */
  446. /* Sets a routine address to call when powering on the socket. */
  447. /* */
  448. /* Parameters:                                                          */
  449. /* vol : Pointer identifying drive */
  450. /*      routine : Routine to call when turning on power */
  451. /* flash : Flash object of routine */
  452. /*                                                                      */
  453. /*----------------------------------------------------------------------*/
  454. void flSetPowerOnCallback(FLSocket vol, void (*routine)(void *flash), void *flash)
  455. {
  456.   vol.powerOnCallback = routine;
  457.   vol.flash = flash;
  458. }
  459. /*----------------------------------------------------------------------*/
  460. /*             f l I n t e r v a l R o u t i n e */
  461. /* */
  462. /* Performs periodic socket actions: Checks card presence, and handles  */
  463. /* the Vcc & Vpp turn off mechanisms. */
  464. /*                                                                      */
  465. /* The routine may be called from the interval timer or sunchronously. */
  466. /* */
  467. /* Parameters:                                                          */
  468. /* vol : Pointer identifying drive */
  469. /*                                                                      */
  470. /*----------------------------------------------------------------------*/
  471. void flIntervalRoutine(FLSocket vol)
  472. {
  473. #ifndef FIXED_MEDIA
  474.   if (vol.getAndClearCardChangeIndicator == NULL &&
  475.       !vol.cardChanged)
  476.     if (!vol.cardDetected(&vol)) /* Check that the card is still there */
  477.       vol.cardChanged = TRUE;
  478. #endif
  479.   if (vol.VppUsers == 0) {
  480.     if (vol.VppState == PowerOn)
  481.       vol.VppState = PowerGoingOff;
  482.     else if (vol.VppState == PowerGoingOff) {
  483.       vol.VppState = PowerOff;
  484. #ifdef SOCKET_12_VOLTS
  485.       vol.VppOff(&vol);
  486. #endif
  487.     }
  488.     if (vol.VccUsers == 0) {
  489.       if (vol.VccState == PowerOn)
  490. vol.VccState = PowerGoingOff;
  491.       else if (vol.VccState == PowerGoingOff) {
  492. vol.VccState = PowerOff;
  493. vol.VccOff(&vol);
  494.       }
  495.     }
  496.   }
  497. }
  498. #ifdef EXIT
  499. /*----------------------------------------------------------------------*/
  500. /*             f l E x i t S o c k e t */
  501. /* */
  502. /* Reset the socket and free resources that were allocated for this */
  503. /* socket. */
  504. /* This function is called when FLite exits. */
  505. /* */
  506. /* Parameters:                                                          */
  507. /* vol : Pointer identifying drive */
  508. /*                                                                      */
  509. /*----------------------------------------------------------------------*/
  510. void flExitSocket(FLSocket vol)
  511. {
  512.   flMap(&vol, 0);                           /* reset the mapping register */
  513.   flDontNeedVcc(&vol);
  514.   flSocketSetBusy(&vol,TFFS_OFF);
  515.   vol.freeSocket(&vol);                     /* free allocated resources */
  516. #ifndef SINGLE_BUFFER
  517. #ifdef MALLOC_TFFS
  518.   FREE_TFFS(volBuffers[vol.volNo]);
  519. #endif
  520. #endif
  521. }
  522. #endif /* EXIT */