mv177-sysTffs.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:16k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysTffs.c - Motorola MVME177 system-dependent TrueFFS library */
  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-1996 */
  6. /*
  7. modification history
  8. --------------------
  9. 01j,31may99,yp  Added comments suggested in SPR #25319
  10. 01i,21apr98,yp   added tffs to files included from there
  11. 01h,11mar98,yp   made including tffsConfig.c conditional so man page
  12.                  generation does not include it.
  13. 01g,09mar99,kbw  made man page edits to fix problems found by QE
  14. 01f,02jan98,yp   doc cleanup 
  15. 01e,18dec97,hdn  added comment.  cleaned up.
  16. 01d,05dec97,hdn  added tffsSocket[].  cleaned up.
  17. 01c,11nov97,hdn  fixed typo.
  18. 01b,05nov97,hdn  cleaned up.
  19. 01a,09oct97,and  written by Andray in M-Systems
  20. */
  21. /*
  22. DESCRIPTION
  23. This library provides board-specific hardware access routines for TrueFFS.  
  24. In effect, these routines comprise the socket component driver (or drivers)
  25. for your flash device hardware.  At socket registration time, TrueFFS stores 
  26. pointers to the functions of this socket component driver in an 'FLSocket' 
  27. structure.  When TrueFFS needs to access the flash device, it uses these 
  28. functions.  
  29. Because this file is, for the most part, a device driver that exports its 
  30. functionality by registering function pointers with TrueFFS, very few of the 
  31. functions defined here are externally callable.  For the record, these 
  32. external functions are flFitInSocketWindow() and flDelayLoop().  You should 
  33. never have any need to call these functions.  
  34. However, one of the most import functions defined in this file is neither
  35. referenced in an 'FLSocket' structure, nor is it externally callable.  This
  36. function is sysTffsInit().  TrueFFS calls this function at initialization 
  37. time to register socket component drivers for all the flash devices attached 
  38. to your target.  It is this call to sysTffs() that results in assigning 
  39. drive numbers to the flash devices on your target hardware.  Drive numbers 
  40. are assigned by the order in which the socket component drivers are registered.
  41. The first to be registered is drive 0, the second is drive 1, and so on up to 
  42. 4.  As shipped, TrueFFS supports up to five flash drives.  
  43. After registering socket component drivers for a flash device, you may 
  44. format the flash medium even though there is not yet a block device driver
  45. associated with the flash (see the reference entry for the tffsDevCreate() 
  46. routine).  To format the flash medium for use with TrueFFS, 
  47. call tffsDevFormat() or, for some BSPs, sysTffsFormat().  
  48. The sysTffsFormat() routine is an optional but BSP-specific externally 
  49. callable helper function.  Internally, it calls tffsDevFormat() with a 
  50. pointer to a 'FormatParams' structure initialized to values that leave a 
  51. space on the flash device for a boot image. This space is outside the 
  52. region managed by TrueFFS.  This special region is necessary for boot 
  53. images because the normal translation and wear-leveling services of TrueFFS 
  54. are incompatible with the needs of the boot program and the boot image it 
  55. relies upon.  To write a boot image (or any other data) into this area, 
  56. use tffsBootImagePut().  
  57. Finally, this file also contains define statements for symbolic constants 
  58. that determine which MTDs, translation layer modules, and other utilities 
  59. are ultimately included in TrueFFS.  These defines are as follows:
  60. .IP "INCLUDE_TL_NFTL"
  61. To include the NAND-based translation layer module.
  62. .IP "INCLUDE_TL_FTL"
  63. To include the NOR-based translation layer module.
  64. .IP "INCLUDE_TL_SSFDC"
  65. To include the SSFDC-appropriate translation layer module.
  66. .IP "INCLUDE_MTD_I28F016"
  67. For Intel 28f016 flash devices.
  68. .IP "INCLUDE_MTD_I28F008"
  69. For Intel 28f008 flash devices.
  70. .IP "INCLUDE_MTD_I28F008_BAJA"
  71. For Intel 28f008 flash devices on the Heurikon Baja 4700.
  72. .IP "INCLUDE_MTD_AMD"
  73. For AMD, Fujitsu: 29F0{40,80,16} 8-bit flash devices.
  74. .IP "INCLUDE_MTD_CDSN"
  75. For Toshiba, Samsung: NAND CDSN flash devices.
  76. .IP "INCLUDE_MTD_DOC2"
  77. For Toshiba, Samsung: NAND DOC flash devices.
  78. .IP "INCLUDE_MTD_CFISCS"
  79. For CFI/SCS flash devices.
  80. .IP "INCLUDE_MTD_WAMD"
  81. For AMD, Fujitsu 29F0{40,80,16} 16-bit flash devices.
  82. .IP "INCLUDE_TFFS_BOOT_IMAGE"
  83. To include tffsBootImagePut() in TrueFFS for Tornado.
  84. .LP
  85. To exclude any of the modules mentioned above, edit sysTffs.c and undefine
  86. its associated symbolic constant.
  87. INCLUDE FILES: flsocket.h, tffsDrv.h
  88. SEE ALSO : tffsDrv tffsConfig
  89. */
  90. #include "vxWorks.h"
  91. #include "config.h"
  92. #include "tffs/flsocket.h"
  93. #include "tffs/tffsDrv.h"
  94. /* defines */
  95. #undef INCLUDE_MTD_I28F016 /* Intel: 28f016 */
  96. #define INCLUDE_MTD_I28F008 /* Intel: 28f008 */
  97. #undef INCLUDE_MTD_AMD /* AMD, Fujitsu: 29f0{40,80,16} 8bit */
  98. #undef INCLUDE_MTD_CDSN /* Toshiba, Samsung: NAND, CDSN */
  99. #undef INCLUDE_MTD_DOC2 /* Toshiba, Samsung: NAND, DOC */
  100. #undef INCLUDE_MTD_CFISCS /* CFI/SCS */
  101. #undef INCLUDE_MTD_WAMD /* AMD, Fujitsu: 29f0{40,80,16} 16bit */
  102. #undef INCLUDE_TL_NFTL /* NFTL translation layer */
  103. #define INCLUDE_TL_FTL /* FTL translation layer */
  104. #undef INCLUDE_TL_SSFDC /* SSFDC translation layer */
  105. #define INCLUDE_TFFS_BOOT_IMAGE /* include tffsBootImagePut() */
  106. #define FLASH_BASE_ADRS 0xffa00000
  107. #define FLASH_SIZE 0x00200000
  108. /* locals */
  109. /* forward declarations */
  110. LOCAL void rfaWriteProtect (void);
  111. LOCAL void rfaWriteEnable (void);
  112. LOCAL FLBoolean rfaCardDetected (FLSocket vol);
  113. LOCAL void rfaVccOn (FLSocket vol);
  114. LOCAL void rfaVccOff (FLSocket vol);
  115. #ifdef SOCKET_12_VOLTS
  116. LOCAL FLStatus rfaVppOn (FLSocket vol);
  117. LOCAL void rfaVppOff (FLSocket vol);
  118. #endif /* SOCKET_12_VOLTS */
  119. LOCAL FLBoolean rfaGetAndClearCardChangeIndicator (FLSocket vol);
  120. LOCAL FLBoolean rfaWriteProtected (FLSocket vol);
  121. LOCAL void rfaSetWindow (FLSocket vol);
  122. LOCAL void rfaSetMappingContext (FLSocket vol, unsigned page);
  123. LOCAL FLStatus rfaSocketInit (FLSocket vol);
  124. LOCAL FLStatus rfaRegister (void);
  125. #ifndef DOC
  126. #include "tffs/tffsConfig.c"
  127. #endif /* DOC */
  128. /*******************************************************************************
  129. *
  130. * sysTffsInit - board-level initialization for TrueFFS
  131. *
  132. * This routine calls the socket registration routines for the socket component
  133. * drivers that will be used with this BSP. The order of registration determines
  134. * the logical drive number given to the drive associated with the socket.
  135. *
  136. * RETURNS: N/A
  137. */
  138. LOCAL void sysTffsInit (void)
  139.     {
  140.     rfaRegister ();
  141.     }
  142. /*******************************************************************************
  143. *
  144. * rfaRegister - registration routine for the RFA on MVME177
  145. *
  146. * This routine populates the 'vol' structure for a logical drive with the
  147. * socket component driver routines for the RFA on the MVME177 board. All
  148. * socket routines are referanced through the 'vol' structure and never 
  149. * from here directly
  150. *
  151. * RETURNS: flOK, or flTooManyComponents if there're too many drives
  152. */
  153. LOCAL FLStatus rfaRegister (void)
  154.     {
  155.     FLSocket vol = flSocketOf (noOfDrives);
  156.     if (noOfDrives >= DRIVES)
  157.         return (flTooManyComponents);
  158.     tffsSocket[noOfDrives] = "RFA";
  159.     noOfDrives++;
  160.     vol.serialNo = 0;
  161.     vol.window.baseAddress = FLASH_BASE_ADRS >> 12;
  162.     /* fill in function pointers */
  163.     vol.cardDetected      = rfaCardDetected;
  164.     vol.VccOn             = rfaVccOn;
  165.     vol.VccOff            = rfaVccOff;
  166. #ifdef SOCKET_12_VOLTS
  167.     vol.VppOn             = rfaVppOn;
  168.     vol.VppOff            = rfaVppOff;
  169. #endif
  170.     vol.initSocket        = rfaSocketInit;
  171.     vol.setWindow         = rfaSetWindow;
  172.     vol.setMappingContext = rfaSetMappingContext;
  173.     vol.getAndClearCardChangeIndicator =
  174.                           rfaGetAndClearCardChangeIndicator;
  175.     vol.writeProtected    = rfaWriteProtected;
  176.     return (flOK);
  177.     }
  178. /*******************************************************************************
  179. *
  180. * rfaCardDetected - detect if a card is present (inserted)
  181. *
  182. * This routine detects if a card is present (inserted).
  183. *
  184. * RETURNS: TRUE, or FALSE if the card is not present.
  185. */
  186. LOCAL FLBoolean rfaCardDetected
  187.     (
  188.     FLSocket vol
  189.     )
  190.     {
  191.     return (TRUE);
  192.     }
  193. /*******************************************************************************
  194. *
  195. * rfaVccOn - turn on Vcc (3.3/5 Volts)
  196. *
  197. * This routine turns on Vcc (3.3/5 Volts).  Vcc must be known to be good
  198. * on exit.
  199. *
  200. * RETURNS: N/A
  201. */
  202. LOCAL void rfaVccOn 
  203.     (
  204.     FLSocket vol
  205.     )
  206.     {
  207.     rfaWriteEnable ();
  208.     }
  209. /*******************************************************************************
  210. *
  211. * rfaVccOff - turn off Vcc (3.3/5 Volts)
  212. *
  213. * This routine turns off Vcc (3.3/5 Volts). 
  214. *
  215. * RETURNS: N/A
  216. */
  217. LOCAL void rfaVccOff 
  218.     (
  219.     FLSocket vol
  220.     )
  221.     {
  222.     rfaWriteProtect ();
  223.     }
  224. #ifdef SOCKET_12_VOLTS
  225. /*******************************************************************************
  226. *
  227. * rfaVppOn - turns on Vpp (12 Volts)
  228. *
  229. * This routine turns on Vpp (12 Volts). Vpp must be known to be good on exit.
  230. *
  231. * RETURNS: flOK always
  232. */
  233. LOCAL FLStatus rfaVppOn
  234.     (
  235.     FLSocket vol /* pointer identifying drive */
  236.     )
  237.     {
  238.     return (flOK);
  239.     }
  240. /*******************************************************************************
  241. *
  242. * rfaVppOff - turns off Vpp (12 Volts)
  243. *
  244. * This routine turns off Vpp (12 Volts).
  245. *
  246. * RETURNS: N/A
  247. */
  248. LOCAL void rfaVppOff 
  249.     (
  250.     FLSocket vol /* pointer identifying drive */
  251.     ) 
  252.     {
  253.     }
  254. #endif /* SOCKET_12_VOLTS */
  255. /*******************************************************************************
  256. *
  257. * rfaSocketInit - perform all necessary initializations of the socket
  258. *
  259. * This routine performs all necessary initializations of the socket.
  260. *
  261. * RETURNS: flOK always
  262. */
  263. LOCAL FLStatus rfaSocketInit
  264.     (
  265.     FLSocket vol /* pointer identifying drive */
  266.     ) 
  267.     {
  268.     rfaWriteEnable ();
  269.     vol.cardChanged = FALSE;
  270.     /* enable memory window and map it at address 0 */
  271.     rfaSetWindow (&vol);
  272.     return (flOK);
  273.     }
  274. /*******************************************************************************
  275. *
  276. * rfaSetWindow - set current window attributes, Base address, size, etc
  277. *
  278. * This routine sets current window hardware attributes: Base address, size,
  279. * speed and bus width.  The requested settings are given in the 'vol.window' 
  280. * structure.  If it is not possible to set the window size requested in
  281. * 'vol.window.size', the window size should be set to a larger value, 
  282. * if possible. In any case, 'vol.window.size' should contain the 
  283. * actual window size (in 4 KB units) on exit.
  284. *
  285. * RETURNS: N/A
  286. */
  287. LOCAL void rfaSetWindow
  288.     (
  289.     FLSocket vol /* pointer identifying drive */
  290.     ) 
  291.     {
  292.     /* Physical base as a 4K page */
  293.     vol.window.baseAddress = FLASH_BASE_ADRS >> 12;
  294.     flSetWindowSize (&vol, FLASH_SIZE >> 12);
  295.     }
  296. /*******************************************************************************
  297. *
  298. * rfaSetMappingContext - sets the window mapping register to a card address
  299. *
  300. * This routine sets the window mapping register to a card address.
  301. * The window should be set to the value of 'vol.window.currentPage',
  302. * which is the card address divided by 4 KB. An address over 128MB,
  303. * (page over 32K) specifies an attribute-space address. On entry to this 
  304. * routine vol.window.currentPage is the page already mapped into the window.
  305. * (In otherwords the page that was mapped by the last call to this routine.)
  306. *
  307. * The page to map is guaranteed to be on a full window-size boundary.
  308. *
  309. * RETURNS: N/A
  310. */
  311. LOCAL void rfaSetMappingContext 
  312.     (
  313.     FLSocket vol, /* pointer identifying drive */
  314.     unsigned page /* page to be mapped */
  315.     )
  316.     {
  317.     }
  318. /*******************************************************************************
  319. *
  320. * rfaGetAndClearCardChangeIndicator - return the hardware card-change indicator
  321. *
  322. * This routine returns the hardware card-change indicator and clears it if set.
  323. *
  324. * RETURNS: FALSE, or TRUE if the card has been changed
  325. */
  326. LOCAL FLBoolean rfaGetAndClearCardChangeIndicator
  327.     (
  328.     FLSocket vol /* pointer identifying drive */
  329.     ) 
  330.     {
  331.     return (FALSE);
  332.     }
  333. /*******************************************************************************
  334. *
  335. * rfaWriteProtected - return the write-protect state of the media
  336. *
  337. * This routine returns the write-protect state of the media
  338. *
  339. * RETURNS: FALSE, or TRUE if the card is write-protected
  340. */
  341. LOCAL FLBoolean rfaWriteProtected 
  342.     (
  343.     FLSocket vol /* pointer identifying drive */
  344.     ) 
  345.     {
  346.     return (FALSE);
  347.     }
  348. /*******************************************************************************
  349. *
  350. * rfaWriteProtect - disable write access to the RFA
  351. *
  352. * This routine disables write access to the RFA.
  353. *
  354. * RETURNS: N/A
  355. */
  356. LOCAL void rfaWriteProtect (void)
  357.     {
  358.     /* clear GPOEN1 bit (#17), make sure GPIO1 bit (#13) is clear  */
  359.     *VMECHIP2_IOCR = (*VMECHIP2_IOCR) & ((~IOCR_GPOEN1) & (~IOCR_GPIOO1_HIGH));
  360.     }
  361. /*******************************************************************************
  362. *
  363. * rfaWriteEnable - enable write access to the RFA
  364. *
  365. * This routine enables write access to the RFA.
  366. *
  367. * RETURNS: N/A
  368. */
  369. LOCAL void  rfaWriteEnable (void)
  370.     {
  371.     /* set GPOEN1 bit (#17), make sure GPIO1 bit (#13) is clear */
  372.     *VMECHIP2_IOCR = ((*VMECHIP2_IOCR) | IOCR_GPOEN1) & (~IOCR_GPIOO1_HIGH);
  373.     }
  374. /*******************************************************************************
  375. *
  376. * flFitInSocketWindow - check whether the flash array fits in the socket window
  377. *
  378. * This routine checks whether the flash array fits in the socket window.
  379. *
  380. * RETURNS: A chip size guaranteed to fit in the socket window.
  381. */
  382. long int flFitInSocketWindow
  383.     (
  384.     long int chipSize, /* size of single physical chip in bytes */
  385.     int      interleaving, /* flash chip interleaving (1,2,4 etc) */
  386.     long int windowSize /* socket window size in bytes */
  387.     )
  388.     {
  389.     if (chipSize*interleaving > windowSize) /* doesn't fit in socket window */
  390.         {
  391.         int  roundedSizeBits;
  392.         /* fit chip in the socket window */
  393.         chipSize = windowSize / interleaving;
  394.         /* round chip size at powers of 2 */
  395.         for (roundedSizeBits = 0; (0x1L << roundedSizeBits) <= chipSize;
  396.              roundedSizeBits++)
  397.     ;
  398.         chipSize = (0x1L << (roundedSizeBits - 1));
  399.         }
  400.     return (chipSize);
  401.     }
  402. #if FALSE
  403. /*******************************************************************************
  404. *
  405. * sysTffsCpy - copy memory from one location to another
  406. *
  407. * This routine copies <size> characters from the object pointed
  408. * to by <source> into the object pointed to by <destination>. If copying
  409. * takes place between objects that overlap, the behavior is undefined.
  410. *
  411. * INCLUDE FILES: string.h
  412. *
  413. * RETURNS: A pointer to <destination>.
  414. *
  415. * NOMANUAL
  416. */
  417. void * sysTffsCpy
  418.     (
  419.     void *       destination,   /* destination of copy */
  420.     const void * source,        /* source of copy */
  421.     size_t       size           /* size of memory to copy */
  422.     )
  423.     {
  424.     bcopy ((char *) source, (char *) destination, (size_t) size);
  425.     return (destination);
  426.     }
  427. /*******************************************************************************
  428. *
  429. * sysTffsSet - set a block of memory
  430. *
  431. * This routine stores <c> converted to an `unsigned char' in each of the
  432. * elements of the array of `unsigned char' beginning at <m>, with size <size>.
  433. *
  434. * INCLUDE FILES: string.h
  435. *
  436. * RETURNS: A pointer to <m>.
  437. *
  438. * NOMANUAL
  439. */
  440. void * sysTffsSet
  441.     (
  442.     void * m,                   /* block of memory */
  443.     int    c,                   /* character to store */
  444.     size_t size                 /* size of memory */
  445.     )
  446.     {
  447.     bfill ((char *) m, (int) size, c);
  448.     return (m);
  449.     }
  450. #endif /* FALSE */
  451. /*******************************************************************************
  452. *
  453. * flDelayLoop - consume the specified time
  454. *
  455. * This routine consumes the specified time.
  456. *
  457. * RETURNS: N/A
  458. */
  459. void flDelayLoop 
  460.     (
  461.     int cycles /* loop count to be consumed */
  462.     )
  463.     {
  464.     while (--cycles)
  465. ;
  466.     }