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

VxWorks

开发平台:

C/C++

  1. /* sysTffs.c - PC 386/486 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-1997 */
  6. /*
  7. modification history
  8. --------------------
  9. 01d,31may99,yp   Added comments suggested in SPR #25319
  10. 01c,05feb99,yp   fixed SPR #22515. Bad preprocessor define
  11. 01b,03jun98,yp   made scan addresses BSP specific
  12. 01a,02jun98,yp   derived from pc386-sysTffs.c
  13. */
  14. /*
  15. DESCRIPTION
  16. This library provides board-specific hardware access routines for TrueFFS.  
  17. In effect, these routines comprise the socket component driver (or drivers)
  18. for your flash device hardware.  At socket registration time, TrueFFS stores 
  19. pointers to the functions of this socket component driver in an 'FLSocket' 
  20. structure.  When TrueFFS needs to access the flash device, it uses these 
  21. functions.  
  22. Because this file is, for the most part, a device driver that exports its 
  23. functionality by registering function pointers with TrueFFS, very few of the 
  24. functions defined here are externally callable.  For the record, these 
  25. external functions are flFitInSocketWindow() and flDelayLoop().  You should 
  26. never have any need to call these functions.  
  27. However, one of the most import functions defined in this file is neither
  28. referenced in an 'FLSocket' structure, nor is it externally callable.  This
  29. function is sysTffsInit().  TrueFFS calls this function at initialization 
  30. time to register socket component drivers for all the flash devices attached 
  31. to your target.  It is this call to sysTffs() that results in assigning 
  32. drive numbers to the flash devices on your target hardware.  Drive numbers 
  33. are assigned by the order in which the socket component drivers are registered.
  34. The first to be registered is drive 0, the second is drive 1, and so on up to 
  35. 4.  As shipped, TrueFFS supports up to five flash drives.  
  36. After registering socket component drivers for a flash device, you may 
  37. format the flash medium even though there is not yet a block device driver
  38. associated with the flash (see the reference entry for the tffsDevCreate() 
  39. routine).  To format the flash medium for use with TrueFFS, 
  40. call tffsDevFormat() or, for some BSPs, sysTffsFormat().  
  41. The sysTffsFormat() routine is an optional but BSP-specific externally 
  42. callable helper function.  Internally, it calls tffsDevFormat() with a 
  43. pointer to a 'FormatParams' structure initialized to values that leave a 
  44. space on the flash device for a boot image. This space is outside the 
  45. region managed by TrueFFS.  This special region is necessary for boot 
  46. images because the normal translation and wear-leveling services of TrueFFS 
  47. are incompatible with the needs of the boot program and the boot image it 
  48. relies upon.  To write a boot image (or any other data) into this area, 
  49. use tffsBootImagePut().  
  50. Finally, this file also contains define statements for symbolic constants 
  51. that determine which MTDs, translation layer modules, and other utilities 
  52. are ultimately included in TrueFFS.  These defines are as follows:
  53. .IP "INCLUDE_TL_NFTL"
  54. To include the NAND-based translation layer module.
  55. .IP "INCLUDE_TL_FTL"
  56. To include the NOR-based translation layer module.
  57. .IP "INCLUDE_TL_SSFDC"
  58. To include the SSFDC-appropriate translation layer module.
  59. .IP "INCLUDE_MTD_I28F016"
  60. For Intel 28f016 flash devices.
  61. .IP "INCLUDE_MTD_I28F008"
  62. For Intel 28f008 flash devices.
  63. .IP "INCLUDE_MTD_I28F008_BAJA"
  64. For Intel 28f008 flash devices on the Heurikon Baja 4700.
  65. .IP "INCLUDE_MTD_AMD"
  66. For AMD, Fujitsu: 29F0{40,80,16} 8-bit flash devices.
  67. .IP "INCLUDE_MTD_CDSN"
  68. For Toshiba, Samsung: NAND CDSN flash devices.
  69. .IP "INCLUDE_MTD_DOC2"
  70. For Toshiba, Samsung: NAND DOC flash devices.
  71. .IP "INCLUDE_MTD_CFISCS"
  72. For CFI/SCS flash devices.
  73. .IP "INCLUDE_MTD_WAMD"
  74. For AMD, Fujitsu 29F0{40,80,16} 16-bit flash devices.
  75. .IP "INCLUDE_TFFS_BOOT_IMAGE"
  76. To include tffsBootImagePut() in TrueFFS for Tornado.
  77. .LP
  78. To exclude any of the modules mentioned above, edit sysTffs.c and undefine
  79. its associated symbolic constant.
  80. INCLUDE FILES: flsocket.h
  81. SEE ALSO : tffsDevFormat tffsRawio
  82. */
  83. /* includes */
  84. #include "vxWorks.h"
  85. #include "config.h"
  86. #include "tffs/flsocket.h"
  87. #include "tffs/pcic.h"
  88. /* defines */
  89. #define INCLUDE_MTD_DOC2 /* Toshiba, Samsung: NAND, DOC */
  90. #define INCLUDE_TL_NFTL /* NFTL translation layer */
  91. #define INCLUDE_SOCKET_DOC /* DOC socket interface */
  92. #define INCLUDE_TFFS_BOOT_IMAGE /* include tffsBootImagePut() */
  93. #define WINDOW_ID 0 /* PCIC window used (0-4) */
  94. #define VPP_DELAY_MSEC 100 /* Millisecs to wait for Vpp ramp up */
  95. #ifdef  MBX860_BD_SIZE /* only way to know if bsp is MBX860 */
  96. #define DOC2_SCAN_ADRS_0 (CPU_PCI_ISA_MEM_BA + 0xc8000)         /* start */
  97. #define DOC2_SCAN_ADRS_1 (CPU_PCI_ISA_MEM_BA + 0xf0000)         /* end */
  98. #else /* ! MBX860 */
  99. #define DOC2_SCAN_ADRS_0 (0xc8000)                              /* start */
  100. #define DOC2_SCAN_ADRS_1 (0xf0000)                              /* end */
  101. #endif  /* MBX 860 */
  102. #define KILL_TIME_FUNC  ((iz * iz) / (iz + iz)) / ((iy + iz) / (iy * iz))
  103. #define PC_WINDOW 1 /* PCIC window no. used by TFFS */
  104. #define PC_EXTRAWS 1 /* PCIC wait state used by TFFS */
  105. #define PC_SOCKET_NAME_DOC "DOC" /* DOC socket name for DOC */
  106. /* externs */
  107. IMPORT unsigned windowBaseAddress (unsigned driveNo, unsigned long startAddr,
  108.                                    unsigned long endAddr);   /* nfdc2148.c */
  109. /* globals */
  110. char pcDriveNo[2] = {NONE, NONE};       /* drive number of the sockets */
  111. /* locals */
  112. LOCAL UINT32 sysTffsMsecLoopCount = 0; /* loop count to consume milli sec */
  113. /* forward declarations */
  114. #ifdef INCLUDE_SOCKET_DOC
  115. LOCAL FLStatus docRegister (void);
  116. LOCAL unsigned docWindowBaseAddress (unsigned driveNo);
  117. LOCAL FLBoolean docCardDetected (FLSocket vol);
  118. LOCAL void docVccOn (FLSocket vol);
  119. LOCAL void docVccOff (FLSocket vol);
  120. #ifdef SOCKET_12_VOLTS
  121. LOCAL FLStatus docVppOn (FLSocket vol);
  122. LOCAL void docVppOff (FLSocket vol);
  123. #endif /* SOCKET_12_VOLTS */
  124. LOCAL FLStatus docInitSocket (FLSocket vol);
  125. LOCAL void docSetWindow (FLSocket vol);
  126. LOCAL void docSetMappingContext (FLSocket vol, unsigned page);
  127. LOCAL FLBoolean docGetAndClearCardChangeIndicator (FLSocket vol);
  128. LOCAL FLBoolean docWriteProtected (FLSocket vol);
  129. #ifdef EXIT
  130. LOCAL void docFreeSocket (FLSocket vol);
  131. #endif /* EXIT */
  132. #endif /* INCLUDE_SOCKET_DOC */
  133. #ifndef DOC
  134. #include "tffs/tffsConfig.c"
  135. #endif /* DOC */
  136. /*******************************************************************************
  137. *
  138. * sysTffsInit - board level initialization for TFFS
  139. *
  140. * This routine calls the socket registration routines for the socket component
  141. * drivers that will be used with this BSP. The order of registration signifies
  142. * the logical drive number given to the drive associated with the socket.
  143. *
  144. * RETURNS: N/A
  145. */
  146. LOCAL void sysTffsInit (void)
  147.     {
  148.     UINT32 ix = 0;
  149.     UINT32 iy = 1;
  150.     UINT32 iz = 2;
  151.     int oldTick;
  152.     /* we assume followings:
  153.      *   - no interrupts except timer is happening.
  154.      *   - the loop count that consumes 1 msec is in 32 bit.
  155.      * it should be done in the early stage of usrRoot() in tffsDrv().  */
  156.     oldTick = tickGet();
  157.     while (oldTick == tickGet()) /* wait for next clock interrupt */
  158. ;
  159.     oldTick = tickGet();
  160.     while (oldTick == tickGet()) /* loop one clock tick */
  161. {
  162. iy = KILL_TIME_FUNC; /* consume time */
  163. ix++; /* increment the counter */
  164. }
  165.     
  166.     sysTffsMsecLoopCount = ix * sysClkRateGet() / 1000;
  167.     (void) docRegister (); /* Disk On Chip */
  168.     }
  169. #ifdef INCLUDE_SOCKET_DOC
  170. /*******************************************************************************
  171. *
  172. * docRegister - registration routine for M-Systems Disk On Chip (DOC) 
  173. * socket component driver
  174. *
  175. * This routine populates the 'vol' structure for a logical drive with the
  176. * socket component driver routines for the M-System DOC. All socket routines
  177. * are referanced through the 'vol' structure and never from here directly
  178. *
  179. * RETURNS: flOK, or flTooManyComponents if there're too many drives,
  180. *                or flAdapterNotFound if there's no controller.
  181. */
  182. LOCAL FLStatus docRegister (void)
  183.     {
  184.     FLSocket vol;
  185.     if (noOfDrives >= DRIVES)
  186.         return (flTooManyComponents);
  187.     pVol = flSocketOf (noOfDrives);
  188.     vol.window.baseAddress = docWindowBaseAddress (vol.volNo);
  189.     if (vol.window.baseAddress == 0)
  190.         return (flAdapterNotFound);
  191.     vol.cardDetected = docCardDetected;
  192.     vol.VccOn = docVccOn;
  193.     vol.VccOff = docVccOff;
  194. #ifdef SOCKET_12_VOLTS
  195.     vol.VppOn = docVppOn;
  196.     vol.VppOff = docVppOff;
  197. #endif
  198.     vol.initSocket = docInitSocket;
  199.     vol.setWindow = docSetWindow;
  200.     vol.setMappingContext = docSetMappingContext;
  201.     vol.getAndClearCardChangeIndicator = docGetAndClearCardChangeIndicator;
  202.     vol.writeProtected = docWriteProtected;
  203. #ifdef EXIT
  204.     vol.freeSocket = docFreeSocket;
  205. #endif
  206.     tffsSocket[noOfDrives] = PC_SOCKET_NAME_DOC;
  207.     noOfDrives++;
  208.     return (flOK);
  209.     }
  210.  
  211. /*******************************************************************************
  212. *
  213. * docWindowBaseAddress - Return the host base address of the DOC2 window
  214. *
  215. * This routine Return the host base address of the window.
  216. * It scans the host address range from DOC2_SCAN_ADRS_0 to DOC2_SCAN_ADRS_1
  217. * (inclusive) attempting to identify DiskOnChip 2000 memory window.
  218. *
  219. * RETURNS: Host physical address of window divided by 4 KB
  220. */
  221. LOCAL unsigned docWindowBaseAddress
  222.     (
  223.     unsigned driveNo /* drive number */
  224.     )
  225.     {
  226.     return (windowBaseAddress (driveNo, DOC2_SCAN_ADRS_0, DOC2_SCAN_ADRS_1));
  227.     }
  228. /*******************************************************************************
  229. *
  230. * docCardDetected - detect if a card is present (inserted)
  231. *
  232. * This routine detects if a card is present (inserted).
  233. *
  234. * RETURNS: TRUE, or FALSE if the card is not present.
  235. */
  236. LOCAL FLBoolean docCardDetected
  237.     (
  238.     FLSocket vol /* pointer identifying drive */
  239.     )
  240.     {
  241.     return (TRUE);
  242.     }
  243. /*******************************************************************************
  244. *
  245. * docVccOn - turn on Vcc (3.3/5 Volts)
  246. *
  247. * This routine turns on Vcc (3.3/5 Volts).  Vcc must be known to be good
  248. * on exit.
  249. *
  250. * RETURNS: N/A
  251. */
  252. LOCAL void docVccOn
  253.     (
  254.     FLSocket vol /* pointer identifying drive */
  255.     )
  256.     {
  257.     }
  258. /*******************************************************************************
  259. *
  260. * docVccOff - turn off Vcc (3.3/5 Volts)
  261. *
  262. * This routine turns off Vcc (3.3/5 Volts). 
  263. *
  264. * RETURNS: N/A
  265. */
  266. LOCAL void docVccOff
  267.     (
  268.     FLSocket vol /* pointer identifying drive */
  269.     )
  270.     {
  271.     }
  272. #ifdef SOCKET_12_VOLTS
  273. /*******************************************************************************
  274. *
  275. * docVppOn - turns on Vpp (12 Volts)
  276. *
  277. * This routine turns on Vpp (12 Volts). Vpp must be known to be good on exit.
  278. *
  279. * RETURNS: flOK always
  280. */
  281. LOCAL FLStatus docVppOn
  282.     (
  283.     FLSocket vol /* pointer identifying drive */
  284.     )
  285.     {
  286.     return (flOK);
  287.     }
  288. /*******************************************************************************
  289. *
  290. * docVppOff - turns off Vpp (12 Volts)
  291. *
  292. * This routine turns off Vpp (12 Volts).
  293. *
  294. * RETURNS: N/A
  295. */
  296. LOCAL void docVppOff
  297.     (
  298.     FLSocket vol /* pointer identifying drive */
  299.     )
  300.     {
  301.     }
  302. #endif /* SOCKET_12_VOLTS */
  303. /*******************************************************************************
  304. *
  305. * docInitSocket - perform all necessary initializations of the socket
  306. *
  307. * This routine performs all necessary initializations of the socket.
  308. *
  309. * RETURNS: flOK always
  310. */
  311. LOCAL FLStatus docInitSocket
  312.     (
  313.     FLSocket vol /* pointer identifying drive */
  314.     )
  315.     {
  316.     return (flOK);
  317.     }
  318. /*******************************************************************************
  319. *
  320. * docSetWindow - set current window attributes, Base address, size, etc
  321. *
  322. * This routine sets current window hardware attributes: Base address, size,
  323. * speed and bus width.  The requested settings are given in the 'vol.window' 
  324. * structure.  If it is not possible to set the window size requested in
  325. * 'vol.window.size', the window size should be set to a larger value, 
  326. * if possible. In any case, 'vol.window.size' should contain the 
  327. * actual window size (in 4 KB units) on exit.
  328. *
  329. * RETURNS: N/A
  330. */
  331. LOCAL void docSetWindow
  332.     (
  333.     FLSocket vol /* pointer identifying drive */
  334.     )
  335.     {
  336.     }
  337. /*******************************************************************************
  338. *
  339. * docSetMappingContext - sets the window mapping register to a card address
  340. *
  341. * This routine sets the window mapping register to a card address.
  342. * The window should be set to the value of 'vol.window.currentPage',
  343. * which is the card address divided by 4 KB. An address over 128MB,
  344. * (page over 32K) specifies an attribute-space address. On entry to this 
  345. * routine vol.window.currentPage is the page already mapped into the window.
  346. * (In otherwords the page that was mapped by the last call to this routine.)
  347. *
  348. * The page to map is guaranteed to be on a full window-size boundary.
  349. *
  350. * RETURNS: N/A
  351. */
  352. LOCAL void docSetMappingContext
  353.     (
  354.     FLSocket vol, /* pointer identifying drive */
  355.     unsigned page /* page to be mapped */
  356.     )
  357.     {
  358.     }
  359. /*******************************************************************************
  360. *
  361. * docGetAndClearCardChangeIndicator - return the hardware card-change indicator
  362. *
  363. * This routine returns the hardware card-change indicator and clears it if set.
  364. *
  365. * RETURNS: FALSE, or TRUE if the card has been changed
  366. */
  367. LOCAL FLBoolean docGetAndClearCardChangeIndicator
  368.     (
  369.     FLSocket vol /* pointer identifying drive */
  370.     )
  371.     {
  372.     return (FALSE);
  373.     }
  374. /*******************************************************************************
  375. *
  376. * docWriteProtected - return the write-protect state of the media
  377. *
  378. * This routine returns the write-protect state of the media
  379. *
  380. * RETURNS: FALSE, or TRUE if the card is write-protected
  381. */
  382. LOCAL FLBoolean docWriteProtected
  383.     (
  384.     FLSocket vol /* pointer identifying drive */
  385.     )
  386.     {
  387.     return (FALSE);
  388.     }
  389. #ifdef EXIT
  390. /*******************************************************************************
  391. *
  392. * docFreeSocket - free resources that were allocated for this socket.
  393. *
  394. * This routine free resources that were allocated for this socket.
  395. * This function is called when FLite exits.
  396. *
  397. * RETURNS: N/A
  398. */
  399. LOCAL void docFreeSocket
  400.     (
  401.     FLSocket vol /* pointer identifying drive */
  402.     )
  403.     {
  404.     }
  405. #endif  /* EXIT */
  406. #endif /* INCLUDE_SOCKET_DOC */
  407. /*******************************************************************************
  408. *
  409. * flFitInSocketWindow - check whether the flash array fits in the socket window
  410. *
  411. * This routine checks whether the flash array fits in the socket window.
  412. *
  413. * RETURNS: A chip size guaranteed to fit in the socket window.
  414. */
  415. long int flFitInSocketWindow 
  416.     (
  417.     long int chipSize, /* size of single physical chip in bytes */
  418.     int      interleaving, /* flash chip interleaving (1,2,4 etc) */
  419.     long int windowSize /* socket window size in bytes */
  420.     )
  421.     {
  422.     /* x86 architectures use sliding windows for flash arrays */
  423.     /* so this check is irrelevant for them                   */
  424.     return (chipSize);
  425.     }
  426. #if FALSE
  427. /*******************************************************************************
  428. *
  429. * sysTffsCpy - copy memory from one location to another
  430. *
  431. * This routine copies <size> characters from the object pointed
  432. * to by <source> into the object pointed to by <destination>. If copying
  433. * takes place between objects that overlap, the behavior is undefined.
  434. *
  435. * INCLUDE FILES: string.h
  436. *
  437. * RETURNS: A pointer to <destination>.
  438. * NOMANUAL
  439. */
  440. void * sysTffsCpy
  441.     (
  442.     void *       destination,   /* destination of copy */
  443.     const void * source,        /* source of copy */
  444.     size_t       size           /* size of memory to copy */
  445.     )
  446.     {
  447.     bcopy ((char *) source, (char *) destination, (size_t) size);
  448.     return (destination);
  449.     }
  450. /*******************************************************************************
  451. *
  452. * sysTffsSet - set a block of memory
  453. *
  454. * This routine stores <c> converted to an `unsigned char' in each of the
  455. * elements of the array of `unsigned char' beginning at <m>, with size <size>.
  456. *
  457. * INCLUDE FILES: string.h
  458. *
  459. * RETURNS: A pointer to <m>.
  460. * NOMANUAL
  461. */
  462. void * sysTffsSet
  463.     (
  464.     void * m,                   /* block of memory */
  465.     int    c,                   /* character to store */
  466.     size_t size                 /* size of memory */
  467.     )
  468.     {
  469.     bfill ((char *) m, (int) size, c);
  470.     return (m);
  471.     }
  472. #endif /* FALSE */
  473. /*******************************************************************************
  474. *
  475. * flDelayMsecs - wait for specified number of milliseconds
  476. *
  477. * This routine waits for specified number of milliseconds.
  478. *
  479. * RETURNS: N/A
  480. * NOMANUAL
  481. */
  482. void flDelayMsecs
  483.     (
  484.     unsigned milliseconds       /* milliseconds to wait */
  485.     )
  486.     {
  487.     UINT32 ix;
  488.     UINT32 iy = 1;
  489.     UINT32 iz = 2;
  490.     /* it doesn't count time consumed in interrupt level */
  491.     for (ix = 0; ix < milliseconds; ix++)
  492.         for (ix = 0; ix < sysTffsMsecLoopCount; ix++)
  493.     {
  494.     tickGet (); /* dummy */
  495.     iy = KILL_TIME_FUNC; /* consume time */
  496.     }
  497.     }
  498. /*******************************************************************************
  499. *
  500. * flDelayLoop - consume the specified time
  501. *
  502. * This routine consumes the specified time.
  503. *
  504. * RETURNS: N/A
  505. */
  506. void flDelayLoop 
  507.     (
  508.     int  cycles
  509.     )
  510.     {
  511.     }