tffsConfig.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:13k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* tffsConfig.c - TrueFFS configuration file for VxWorks */
  2. /*
  3.  * Copyright (c) 1997-2002, 2004, 2006-2007 Wind River Systems, Inc.
  4.  *
  5.  * The right to copy, distribute, modify, or otherwise make use
  6.  * of this software may be licensed only pursuant to the terms
  7.  * of an applicable Wind River license agreement.
  8.  */
  9. /* FAT-FTL Lite Software Development Kit
  10.  * Copyright (C) M-Systems Ltd. 1995-2001 */
  11. /*
  12. modification history
  13. --------------------
  14. 02f,30mar07,b_m  add v28F128J3 MTD identify.
  15. 02e,23mar06,jb3  Bump Version for Spring 06.
  16. 02d,23nov04,mil  Fixed compilation warning. (SPR 103341)
  17. 02c,02oct02,nrv  fixing diab build error
  18. 02b,28mar02,nrv  adding INCLUDE_MTD_CFIAMD
  19. 02a,12dec01,nrv  supressing the compiler warning on tffsVersion
  20. 01z,07nov01,yp   fixing SPR #63838
  21. 01y,02nov01,nrv  changing the version number to 2.2
  22. 01x,17sep01,yp   merging code changes from T3. Preserving T2 specifics that
  23.                  were removed in T3
  24. 01w,25apr01,mem  Remove NFTL, CDSN and DOC2.
  25. 01v,20dec00,tlc  Add user-defined "Identify" routine to MTD table.
  26. 01u,23apr01,yp   Incrementing version number to 2.1
  27. 01t,29nov00,tlc  Added MTD_USR_IDENTIFY to the mtdTable. This allows
  28.                  user-defined identify routines to be used for trueFFS
  29.                   support.
  30. 01s,06Sep00,csh  Added code to free pBuf on error SPR #34246
  31. 01r,06Sep00,csh  Added check for pBuf == NULL SPR #34246
  32. 01q,01Sep00,csh  Removed MACRO for INCLUDE_SHOW_ROUTINES
  33. 01p,04feb99,yp   added MACRO INCLUDE_TFFS_SHOW for better scalability.
  34. 01o,21apr98,yp   added tffs subdir to include path
  35. 01n,28feb98,kbw  made man page edits to fix problems found by QE
  36. 01m,28feb98,kbw  made man page edits
  37. 01l,19jan98,hdn  added new function tffsShowAll().
  38. 01k,08jan98,hdn  added new MTD for Heurikon Baja4700.
  39. 01j,06jan98,hdn  cleaned up tffsShow() and tffsBootImagePut().
  40. 01i,18dec97,yp   added documentation on sharing bootrom with TFFS
  41. 01h,15dec97,yp   doc cleanup
  42. 01g,11dec97,hdn  added tffsRawio()'s return value check in tffsShow().
  43. 01f,08dec97,hdn  renamed mkbootTffs() to tffsCopy().
  44. 01e,05dec97,hdn  changed tffsSocket[] to LOCAL variable.
  45. 01d,05dec97,hdn  added tffsShow() and mkbootTffs().
  46. 01c,11nov97,hdn  fixed documentation of flRegisterComponents().
  47. 01b,07nov97,hdn  cleaned up.
  48. 01a,07jul97,ami  written by Amirban at M-Systems
  49. */
  50. /*
  51. DESCRIPTION
  52. This source file, with the help of sysTffs.c, configures TrueFFS for VxWorks.
  53. The functions defined here are generic to all BSPs.  To include these functions
  54. in the BSP-specific module, the BSP's sysTffs.c file includes this file.
  55. Within the sysTffs.c file, define statements determine which functions from
  56. the tffsConfig.c file are ultimately included in TrueFFS.
  57. The only externally callable routines defined in this file
  58. are tffsShow(), tffsShowAll(), and tffsBootImagePut().  You can
  59. exclude the show utilities if you edit config.h and
  60. undefine INCLUDE_SHOW_ROUTINES.  You can exclude tffsBootImagePut() if you
  61. edit sysTffs.c and undefine INCLUDE_TFFS_BOOT_IMAGE.  (If you find these
  62. utilities are missing and you want them included, edit config.h and
  63. define INCLUDE_SHOW_ROUTINES and INCLUDE_TFFS_BOOT_IMAGE.)
  64. If you wish to include only the TrueFFS specific show routines you could
  65. define INCLUDE_TFFS_SHOW instead of INCLUDE_SHOW_ROUTINES in config.h.
  66. However, for the most part, these externally callable routines are only
  67. a small part of the TrueFFS configuration needs handled by this file.
  68. The routines internal to this file make calls into the MTDs and translation
  69. layer modules of TrueFFS.  At link time, resolving the symbols associated
  70. with these calls pulls MTD and translation layer modules into VxWorks.
  71. However, each of these calls to the MTDs and the translation layer modules
  72. is only conditionally included.  The constants that control the includes
  73. are defined in sysTffs.c.  To exclude an MTD or translation layer module,
  74. you edit sysTffs.c, undefine the appropriate constant, and rebuild sysTffs.o.
  75. These constants are described in the reference entry for 'sysTffs'.
  76. INCLUDE FILES: stdcomp.h
  77. */
  78. /* includes */
  79. #include "tffs/stdcomp.h"
  80. #include "tffs/tffsDrv.h"
  81. #include "tffs/fatlite.h"
  82. #include "stdio.h"
  83. /* defines */
  84. #ifdef INCLUDE_SHOW_ROUTINES
  85. #define INCLUDE_TFFS_SHOW
  86. #endif /* INCLUDE_SHOW_ROUTINES */
  87. /* externs */
  88. #ifdef INCLUDE_MTD_USR
  89. FLStatus  MTD_USR_IDENTIFY (FLFlash vol);
  90. #endif /* INCLUDE_MTD_USR */
  91. /* globals */
  92. MTDidentifyRoutine mtdTable[] =  /* MTD tables */
  93.     {
  94. #ifdef  INCLUDE_MTD_SBC8548
  95.     v28F128J3Identify,
  96. #endif  /* INCLUDE_MTD_SBC8548 */
  97. #ifdef  INCLUDE_MTD_CFIAMD
  98.     cfiAmdIdentify,
  99. #endif  /* INCLUDE_MTD_CFIAMD */
  100. #ifdef INCLUDE_MTD_CFISCS
  101.     cfiscsIdentify,
  102. #endif /* INCLUDE_MTD_CFISCS */
  103. #ifdef INCLUDE_MTD_I28F016
  104.     i28f016Identify,
  105. #endif /* INCLUDE_MTD_I28F016 */
  106. #ifdef INCLUDE_MTD_I28F008
  107.     i28f008Identify,
  108. #endif /* INCLUDE_MTD_I28F008 */
  109. #ifdef INCLUDE_MTD_I28F008_BAJA
  110.     i28f008BajaIdentify,
  111. #endif /* INCLUDE_MTD_I28F008_BAJA */
  112. #ifdef INCLUDE_MTD_AMD
  113.     amdMTDIdentify,
  114. #endif /* INCLUDE_MTD_AMD */
  115. #ifdef INCLUDE_MTD_USR
  116.     MTD_USR_IDENTIFY,
  117. #endif  /* INCLUDE_MTD_USR */
  118. #ifdef INCLUDE_MTD_WAMD
  119.     flwAmdMTDIdentify,
  120. #endif /* INCLUDE_MTD_WAMD */
  121.     NULL
  122.     };
  123. int noOfMTDs = NELEMENTS (mtdTable) - 1; /* number of MTDs */
  124. TLentry tlTable[] =  /* TL tables */
  125.     {
  126. #ifdef INCLUDE_TL_FTL
  127. #ifdef FORMAT_VOLUME
  128.     {mountFTL, formatFTL},
  129. #else
  130.     mountFTL,
  131. #endif /* FORMAT_VOLUME */
  132. #endif /* INCLUDE_TL_FTL */
  133. #ifdef INCLUDE_TL_SSFDC
  134. #ifdef FORMAT_VOLUME
  135.     {mountSSFDC, formatSSFDC},
  136. #else
  137.     mountSSFDC,
  138. #endif /* FORMAT_VOLUME */
  139. #endif /* INCLUDE_TL_SSFDC */
  140. #ifdef FORMAT_VOLUME
  141.     {NULL, NULL}
  142. #else
  143.     NULL
  144. #endif /* FORMAT_VOLUME */
  145.     };
  146. int noOfTLs = NELEMENTS (tlTable) - 1; /* number of TLs */
  147. /* locals */
  148. LOCAL char * tffsSocket[DRIVES] = {NULL}; /* name of the socket interface */
  149. #ifdef INCLUDE_TFFS_SHOW
  150. LOCAL char * tffsVersion = "2.2.1"; /* WRS version number of TFFS */
  151. #endif /* INCLUDE_TFFS_SHOW */
  152. /* forward declarations */
  153. LOCAL VOID sysTffsInit (void); /* BSP dependent init routine */
  154. /*******************************************************************************
  155. *
  156. * flRegisterComponents - register MTD and translation layer components for use
  157. *
  158. * This routine registers MTD and translation layer components for use.
  159. * This function is called by FLite once only, at initialization of the
  160. * FLite system.
  161. *
  162. * NOMANUAL
  163. *
  164. * RETURNS: N/A
  165. */
  166. void flRegisterComponents (void)
  167.     {
  168.     sysTffsInit ();
  169.     }
  170. #ifdef INCLUDE_TFFS_SHOW
  171. /*******************************************************************************
  172. *
  173. * tffsShowAll - show device information on all socket interfaces
  174. *
  175. * This routine prints device information on all socket interfaces.
  176. *
  177. * RETURNS: N/A
  178. */
  179. void tffsShowAll (void)
  180.     {
  181.     int ix;
  182.     printf ("TFFS Version %sn", tffsVersion);
  183.     for (ix = 0; ix < noOfDrives; ix++)
  184. tffsShow (ix);
  185.     }
  186. /*******************************************************************************
  187. *
  188. * tffsShow - show device information on a specific socket interface
  189. *
  190. * This routine prints device information on the specified socket interface.
  191. * This information is particularly useful when trying to determine the
  192. * number of Erase Units required to contain a boot image.  The field called
  193. * unitSize reports the size of an Erase Unit.
  194. *
  195. * If the process of getting physical information fails, an error code is
  196. * printed. The error codes can be found in flbase.h.
  197. *
  198. * RETURNS: N/A
  199. */
  200. void tffsShow
  201.     (
  202.     int driveNo /* TFFS drive number */
  203.     )
  204.     {
  205.     PhysicalInfo info;
  206.     FLStatus status;
  207.     if (tffsSocket[driveNo] == NULL)
  208. {
  209.         printf ("%d: ---- no socket interface installed ----n", driveNo);
  210. return;
  211. }
  212.     status = tffsRawio (driveNo, TFFS_GET_PHYSICAL_INFO, (int)&info, 0, 0);
  213.     if (status != OK)
  214. {
  215.         printf ("%d: **** communication failed with error %d ****n",
  216.                 driveNo, status);
  217. return;
  218. }
  219.     printf ("%d: socket=%s: ", driveNo, tffsSocket[driveNo]);
  220.     printf ("type=0x%x, unitSize=0x%x, mediaSize=0x%xn", info.type,
  221.     (UINT)info.unitSize, (UINT)info.mediaSize);
  222.     }
  223. #endif /* INCLUDE_TFFS_SHOW */
  224. #ifdef INCLUDE_TFFS_BOOT_IMAGE
  225. /*******************************************************************************
  226. *
  227. * tffsBootImagePut - write to the boot-image region of the flash device
  228. *
  229. * This routine writes an input stream to the boot-image region (if any) of
  230. * a flash memory device.  Typically, the input stream contains a boot image,
  231. * such as the VxWorks boot image, but you are free to use this function to
  232. * write any data needed. The size of the boot-image region is set by
  233. * the tffsDevFormat() call (or the sysTffsFormat() call, a BSP-specific helper
  234. * function that calls tffsDevFormat() internally) that formats the flash
  235. * device for use with TrueFFS.
  236. *
  237. * If tffsBootImagePut() is used to put a VxWorks boot image in flash, you
  238. * should not use the s-record version of the boot image typically produced
  239. * by make.  Instead, you should take the pre s-record version (usually
  240. * called 'bootrom' instead of 'bootrom.hex'), and filter out its loader
  241. * header information using an <xxx>'ToBin' utility.  For example:
  242. * .CS
  243. * elfToBin < bootrom > bootrom.bin
  244. * .CE
  245. *
  246. * Use the resulting 'bootrom.bin' as input to tffsBootImagePut().
  247. *
  248. * The discussion above assumes that you want only to use the flash device to
  249. * store a VxWorks image that is retrieved from the flash device and then run
  250. * out of RAM. However, because it is possible to map many flash devices
  251. * directly into the target's memory, it is also possible run the VxWorks
  252. * image from flash memory, although there are some restrictions:
  253. * .IP "-"
  254. * The flash device must be non-NAND.
  255. * .IP "-"
  256. * Only the text segment of the VxWorks image ('vxWorks.res_rom') may run out
  257. * of flash memory. The data segment of the image must reside in standard RAM.
  258. * .IP "-"
  259. * No part of the flash device may be erased while the VxWorks image is running
  260. * from flash memory.
  261. * .LP
  262. * Because TrueFFS garbage collection triggers an erase, this last restriction
  263. * means that you cannot run a VxWorks boot image out of a flash device that
  264. * must also support a writable file system (although a read-only file system
  265. * is OK).
  266. *
  267. * This last restriction arises from the way in which flash devices are
  268. * constructed. The current physical construction of flash memory devices does
  269. * not allow access to the device while an erase is in
  270. * progress anywhere on the flash device. As a result, if TrueFFS tries to
  271. * erase a portion of the flash device, the entire device becomes inaccessible
  272. * to all other users.  If that other user happens to be the VxWorks image
  273. * looking for its next instruction, the VxWorks image crashes.
  274. *
  275. *RETURNS: OK or ERROR
  276. */
  277. STATUS tffsBootImagePut
  278.     (
  279.     int driveNo, /* TFFS drive number */
  280.     int offset, /* offset in the flash chip/card */
  281.     char * filename /* binary format of the bootimage */
  282.     )
  283.     {
  284.     PhysicalInfo info;
  285.     UINT unitNo;
  286.     UINT unitSize;
  287.     UINT addr;
  288.     char * pBuf;
  289.     int fd;
  290.     int ix;
  291.     if (tffsSocket[driveNo] == NULL)
  292. return (ERROR);
  293.     if (tffsRawio (driveNo, TFFS_GET_PHYSICAL_INFO, (int)&info, 0, 0) != OK)
  294.         {
  295.         printErr ("Unable to get physical info from driven");
  296. return (ERROR);
  297. }
  298.     if ((pBuf = (char *)malloc (info.unitSize)) == NULL)
  299. {
  300.         printErr ("Can't allocate %d bytes of memoryn", info.unitSize);
  301. return( ERROR ) ;
  302. }
  303.     if ((fd = open (filename, O_RDONLY, 0644)) == ERROR)
  304.         {
  305.         printErr ("Can't open "%s"n", filename);
  306. free( pBuf ) ;
  307.         return (ERROR);
  308. }
  309.     addr = offset;
  310.     unitNo = offset / info.unitSize;
  311.     unitSize = info.unitSize - (offset % info.unitSize);
  312.     /* If the offset is not Erase Unit aligned we need to save the the
  313.      * contents of the region begining at the start of this erase unit
  314.      * and ending at the specified address so we can restore it after
  315.      * we erase the Erase Unit
  316.      */
  317.     if (tffsRawio (driveNo, TFFS_PHYSICAL_READ, unitNo * info.unitSize,
  318.            offset % info.unitSize, (int)pBuf) != OK)
  319.         {
  320. printErr ("Failed attempting to save Erase Unit %dn", unitNo);
  321. close (fd);
  322. free( pBuf ) ;
  323. return (ERROR);
  324. }
  325.     if (tffsRawio (driveNo, TFFS_PHYSICAL_ERASE, unitNo, 1, 0) != OK)
  326. {
  327. printErr ("Failed attempting to erase Erase Unit %dn", unitNo);
  328. close (fd);
  329. free( pBuf ) ;
  330. return (ERROR);
  331. }
  332.     if (tffsRawio (driveNo, TFFS_PHYSICAL_WRITE, unitNo * info.unitSize,
  333.            offset % info.unitSize, (int)pBuf) != OK)
  334.         {
  335. printErr ("Failed attempting to restore Erase Unit %dn", unitNo);
  336. close (fd);
  337. free( pBuf ) ;
  338. return (ERROR);
  339. }
  340.     while (unitSize)
  341. {
  342.         if ((ix = read (fd, pBuf, unitSize)) == ERROR)
  343.             {
  344.             printErr ("Error reading inputfile: 0x%xn", errno);
  345.     free( pBuf ) ;
  346.             return (ERROR);
  347.             }
  348.         if (ix == 0)
  349.     break;
  350.         if ((addr + ix) > info.mediaSize)
  351.     {
  352.     printErr ("Error : Attempting to write beyond Flash boundaryn");
  353.     close (fd);
  354.     free( pBuf ) ;
  355.     return (ERROR);
  356.     }
  357.         if (tffsRawio (driveNo, TFFS_PHYSICAL_WRITE, addr, ix, (int)pBuf) != OK)
  358.     {
  359.     printErr ("Physical write failed at address 0x%xn", addr);
  360.     close (fd);
  361.     free( pBuf ) ;
  362.     return (ERROR);
  363.     }
  364. addr += ix;
  365. unitSize -= ix;
  366. if (unitSize == 0)
  367.     {
  368.             unitSize = info.unitSize;
  369.             unitNo++;
  370.             if (tffsRawio (driveNo, TFFS_PHYSICAL_ERASE, unitNo, 1, 0) != OK)
  371.         {
  372. printErr ("Failed attempting to erase Erase Unit %dn", unitNo);
  373.         close (fd);
  374.         free( pBuf ) ;
  375.         return (ERROR);
  376.         }
  377.     }
  378. }
  379.     close (fd);
  380.     free( pBuf ) ;
  381.     return (OK);
  382.     }
  383. #endif /* INCLUDE_TFFS_BOOT_IMAGE */