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

VxWorks

开发平台:

C/C++

  1. /* i28F640j3Mem.c - Intel 28F640J3 Flash Memory library */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01a,16apr01,gh   written
  8. */
  9. /*
  10. DESCRIPTION
  11. This library contains routines to manipulate Intel 28F640J3 Flash memory.
  12. Read and write routines are included.
  13. The macros NV_RAM_ADRS and NV_RAM_SIZE must be defined to indicate the
  14. address and size of the Flash memory.
  15. This module use the visionWare flash algorithm.
  16. The Intel 28F640J3 access is BITS:8 BUS:8 ACCESS:INTEGER.
  17. */
  18. /* includes */
  19. #include "drv/mem/i28f640j3mem.h"
  20. #include "memLib.h"
  21. #include "stdlib.h"
  22. /* LOCALs */
  23. LOCAL void   IOSync(void){ }
  24. LOCAL UINT32 FlashWrite(volatile UINT8 *pDest, UINT8 *pSource, UINT32 Length);
  25. LOCAL UINT32 FlashEraseSector(volatile UINT8 *pSector);
  26. LOCAL const tFLASH Erase1 =  { 0x20 };
  27. LOCAL const tFLASH Erase2 =  { 0xD0 };
  28. LOCAL const tFLASH Program = { 0x40 };
  29. LOCAL const tFLASH ReadArray = { 0xFF };
  30. LOCAL const tFLASH ClearStatus = { 0x50 };
  31. LOCAL const tFLASH Erased =    { (UINT8)-1 };
  32. LOCAL const tFLASH ReadyBits = { 0x80 };
  33. LOCAL const tFLASH EraseBits = { 0x20 };
  34. LOCAL const tFLASH ProgramBits = { 0x10 };
  35. LOCAL const tFLASH BufferWrite = { 0xE8 };
  36. LOCAL const tFLASH ConfirmWrite = { 0xD0 };
  37. LOCAL const tFLASH BufferCount = { 0x1F };
  38. /*****************************************************************************
  39. *
  40. * sysNvRamGet - get the contents of non-volatile RAM
  41. *
  42. * This routine copies the contents of non-volatile memory into a specified
  43. * string.  The string will be terminated with an EOS.
  44. *
  45. * INTERNAL
  46. * The board has no NVRAM, so we've implemented some pseudo-NVRAM
  47. * in the flash.
  48. *
  49. * RETURNS: OK or ERROR
  50. *
  51. * SEE ALSO: sysNvRamSet()
  52. */
  53. STATUS sysNvRamGet
  54.     (
  55.     char * string, /* where to copy flash memory      */
  56.     int strLen, /* maximum number of bytes to copy */
  57.     int offset /* byte offset into flash memory   */
  58.     )
  59. {
  60. char *pNvRam,*pString;
  61. int i;
  62.     offset += NV_BOOT_OFFSET;   /* boot line begins at <offset> = 0 */
  63.     /* Check that the string is entirely within the NVRAM */
  64.     if ((offset < 0) || (strLen < 0) || ((offset + strLen) > NV_RAM_SIZE))
  65.         return ERROR;       
  66.     pNvRam  = (char *)(NV_RAM_ADRS + offset);
  67.     pString =  (char *)string;
  68.     for (i = 0; i < strLen; i++)
  69.         *pString++ = *pNvRam++;
  70.     *pString = EOS;       /* force EOS onto nvram string */
  71.     /* The generic boot-line code expects this function to check the contents
  72.  * and report any errors. The default boot line is only used if this 
  73.  * function returns ERROR. So, we return ERROR if the first character
  74.      * copied is 0xFF (= erased flash).
  75.      */
  76.     return ((*string == (char)0xff) ? ERROR : OK);
  77. }
  78. /******************************************************************************
  79. *
  80. * sysNvRamSet - write data to non-volatile RAM
  81. *
  82. * This routine copies the provided string to the non-volatile memory.
  83. *
  84. * INTERNAL
  85. * The board has no NVRAM, so we've implemented some pseudo-NVRAM
  86. * in the flash.
  87. * The "NVRAM" is a small region at the very top of flash memory, and can
  88. * thus be read using normal memory accesses. However, to write the data we
  89. * have to read the entire top sector, modify its contents, erase the top
  90. * sector, and then reprogram it.
  91. *
  92. * RETURNS: OK or ERROR
  93. *
  94. * SEE ALSO: sysNvRamGet()
  95. */
  96. STATUS sysNvRamSet
  97.     (
  98.     char * string, /* string to be copied into flash memory */
  99.     int strLen, /* maximum number of bytes to copy       */
  100.     int offset /* byte offset into flash memory         */
  101.     )
  102. {
  103. UINT32 blockOffs;
  104. char *pBlock, *pTmpBuf;
  105.     offset += NV_BOOT_OFFSET;   /* boot line begins at <offset> = 0 */
  106.     /* Check that the string will fit entirely into the NVRAM */
  107.     if ((offset < 0) || (strLen < 0) || ((offset + strLen) > NV_RAM_SIZE))
  108.         return ERROR;
  109.     /* see if contents are actually changing */
  110.     if (bcmp ((char *) (NV_RAM_ADRS + offset), string, strLen) == 0)
  111. return OK;
  112.     /* Allocate a temporary buffer for the operation */
  113.     pTmpBuf = (char *)malloc(FLASH_SECTOR_SIZE);
  114.     if ( pTmpBuf == NULL )
  115.         return ERROR;
  116.     pBlock = (UINT8 *)((UINT32)(NV_RAM_ADRS + offset) & ~(FLASH_SECTOR_SIZE-1));
  117.     /* Copy current contents of flash (entire sector) to the buffer */
  118.     memcpy(pTmpBuf,(void*)pBlock,FLASH_SECTOR_SIZE);
  119.     /* Now erase the flash sector */
  120.     FlashEraseSector((volatile UINT8 *)pBlock);
  121.     blockOffs = (NV_RAM_ADRS + offset) & (FLASH_SECTOR_SIZE-1);
  122.     /* Overwrite buffer contents with specified string */
  123.     memcpy((void*)(pTmpBuf + blockOffs),string,strLen);
  124.     /* Now program the flash sector */
  125.     FlashWrite((volatile UINT8 *)pBlock, pTmpBuf, FLASH_SECTOR_SIZE);
  126.     free (pTmpBuf);
  127.     return OK;
  128. }
  129. /******************************************************************************
  130. *
  131. * FlashWrite - write data to the Intel 29F640J3
  132. *
  133. * RETURNS: Number of byte writen
  134. *
  135. * NOMANUAL
  136. */
  137. LOCAL UINT32 FlashWrite(volatile UINT8 *pDest, UINT8 *pSource, UINT32 Length)
  138. {
  139. unsigned int OriginalLength = Length;
  140. tFLASH Data;
  141. unsigned int n;
  142. volatile UINT8 *pBlock = (UINT8 *)((UINT32)pDest & ~0x1FFFF);
  143. UINT8 TempBuffer[0x20];
  144. while(Length)
  145. {
  146. *(volatile UINT8 *)pDest = ReadArray.Float;
  147. if ((((UINT32)pDest & 0x1F) == 0) && (Length >= 0x20))
  148. {
  149. memcpy((char *)&TempBuffer, pSource, 0x20);
  150. *pBlock = BufferWrite.Float;
  151. IOSync();
  152. if (*pBlock == ReadyBits.Integer)
  153. {
  154. *pBlock = BufferCount.Float;
  155. for (n = 0; n < 0x20; ++n)
  156. ((volatile UINT8 *)pDest)[n] = TempBuffer[n];
  157. *pBlock = ConfirmWrite.Float;
  158. while (*(volatile UINT8 *)pDest != ReadyBits.Integer)
  159. ;
  160. pDest += 0x20;
  161. pSource += 0x20;
  162. Length -= 0x20;
  163. continue;
  164. }
  165. *(volatile UINT8 *)pDest = ReadArray.Float;
  166. }
  167. Data.Integer = *(UINT8 *)pSource++;
  168. *(volatile UINT8 *)pDest = ClearStatus.Float;
  169. IOSync();
  170. *(volatile UINT8 *)pDest = Program.Float;
  171. IOSync();
  172. *(volatile UINT8 *)pDest = Data.Float;
  173. IOSync();
  174. while (*(volatile UINT8 *)pDest != ReadyBits.Integer)
  175. ;
  176. ++pDest;
  177. --Length;
  178. }
  179. *(volatile UINT8 *)(pDest - 1) = ReadArray.Float;
  180. return OriginalLength - Length;
  181. }
  182. /******************************************************************************
  183. *
  184. * FlashEraseSector - erase sector in the Intel 29F640J3
  185. *
  186. * RETURNS: N/A
  187. *
  188. * NOMANUAL
  189. */
  190. LOCAL UINT32 FlashEraseSector(volatile UINT8 *pSector)
  191. {
  192. *(volatile UINT8 *)pSector = ClearStatus.Float;
  193. IOSync();
  194. *(volatile UINT8 *)pSector = Erase1.Float;
  195. IOSync();
  196. *(volatile UINT8 *)pSector = Erase2.Float;
  197. IOSync();
  198. while (*(volatile UINT8 *)pSector != ReadyBits.Integer);
  199. *(volatile UINT8 *)pSector = ReadArray.Float;
  200. return 0;
  201. }