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

VxWorks

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include "tffs/flflash.h"
  3. #include "tffs/backgrnd.h"
  4. /* support 28f320 28f640 28f128*/
  5. #undef CFI_DEBUG 
  6. #ifdef CFI_DEBUG
  7. #define DEBUG_PRINT    printf
  8. #else
  9. #undef DEBUG_PRINT
  10. #endif
  11. /* JEDEC ids for this MTD */
  12. #define I28F128_FLASH 0x18  /* device code 28F128 */
  13. #define I28F640_FLASH 0x17  /* device code 28F640 */
  14. #define I28F320_FLASH 0x16  /* device code 28F320 */
  15. #define SETUP_ERASE 0x2020
  16. #define SETUP_WRITE 0x4040
  17. #define CLEAR_STATUS 0x5050
  18. #define READ_STATUS 0x7070
  19. #define READ_ID  0x9090
  20. #define SUSPEND_ERASE 0xb0b0
  21. #define CONFIRM_ERASE 0xd0d0
  22. #define RESUME_ERASE 0xd0d0
  23. #define READ_ARRAY 0xffff
  24. #define STAT_WSMS 0x0080
  25. /* Defintion for Bit macro */
  26. #ifndef BIT    
  27. #define BIT(bitNumber) (1 << (bitNumber))
  28. #endif /* BIT */
  29. static FLStatus i28f128Write(FLFlash vol,
  30.    CardAddress address,
  31.    const void FAR1 *buffer,
  32.    int length,
  33.    FLBoolean overwrite)
  34. {
  35. unsigned long writeTimeout;
  36. int           i;
  37. FlashWPTR flashPtr;
  38. FlashWPTR ptr;
  39. STATUS retVal;
  40. #ifdef DEBUG_PRINT
  41. DEBUG_PRINT("Debug: Entering i28f128Write function.n");
  42. DEBUG_PRINT("Debug: address=0x%x, length=%d, overwrite=%dn", address, length, overwrite);
  43. #endif
  44. if ( flWriteProtected(vol.socket) )
  45. return flWriteProtect;
  46. if ((length & 1) || (address & 1)) /* Only write words on word-boundary */
  47. return flBadParameter;
  48. flashPtr = (FlashWPTR) flMap(vol.socket, address);
  49. /* Set timeout to 5 seconds from now */
  50. writeTimeout = flMsecCounter + 5000;
  51. retVal = OK;
  52. ptr = flashPtr;
  53. for (i = 0; i < length ; i += 2, ptr++)
  54. {
  55. unsigned short value;
  56. value = *((FlashWPTR)(buffer + i));
  57. *ptr = SETUP_WRITE;
  58. *ptr = value;
  59. do
  60. {
  61. /*ptr = READ_STATUS;*/
  62. if (flMsecCounter > writeTimeout)
  63. {
  64. retVal = ERROR;
  65. *ptr = CLEAR_STATUS;
  66. break;
  67. }
  68. }while((*ptr & STAT_WSMS) != STAT_WSMS);
  69. if (retVal == ERROR)
  70. {
  71. *ptr = READ_ARRAY;
  72. break;
  73. }
  74. if (*ptr & (BIT(5) | BIT(4) | BIT(3) | BIT(1)))
  75. {
  76. retVal = ERROR;
  77. *ptr = CLEAR_STATUS;
  78. }
  79. if (retVal == ERROR)
  80. {
  81. *ptr = READ_ARRAY;
  82. break;
  83. }
  84. *ptr = READ_ARRAY;
  85. }
  86. if (retVal == ERROR)
  87. {
  88. #ifdef DEBUG_PRINT
  89. DEBUG_PRINT("Debug: In i28f128Write, write failedn");
  90. #endif
  91. return flWriteFault;
  92. }
  93. if (tffscmp((void FAR0 *)flashPtr, buffer, length))
  94. {
  95. #ifdef DEBUG_PRINT
  96. DEBUG_PRINT("Debug: In i28f128Write, write  data errorn");
  97. {
  98. int i;
  99. /*dump data*/
  100. for (i = 0; i < length/2; i++)
  101. {
  102. unsigned short data;
  103. data = *((unsigned short*)(buffer + i * 2));
  104. DEBUG_PRINT("%x==>%xn", data, *(flashPtr+i));
  105. }
  106. }
  107. #endif
  108. return flWriteFault;
  109. }
  110. #ifdef DEBUG_PRINT
  111. DEBUG_PRINT("Debug: In i28f128Write, erase OKn");
  112. #endif
  113. return flOK;
  114. }
  115. static FLStatus i28f128Erase (FLFlash  vol,
  116.                                 int      firstBlock,
  117.                                 int      numOfBlocks)
  118. {
  119. unsigned long writeTimeout;
  120. FlashWPTR ptr;
  121. int        i;
  122. STATUS retVal;
  123. #ifdef DEBUG_PRINT
  124. DEBUG_PRINT("Debug: Entering i28f128Erase function.n");
  125. DEBUG_PRINT("Debug: firstblock=%d, numOfBlocks=%d.n", firstBlock, numOfBlocks);
  126. #endif
  127. if ( flWriteProtected(vol.socket) )
  128. return flWriteProtect;
  129. /* Set timeout to 5 seconds from now */
  130. writeTimeout = flMsecCounter + 5000;
  131. retVal = OK;
  132. for (i = 0;  i < numOfBlocks;  i++)
  133. {
  134. ptr = (FlashWPTR) flMap(vol.socket, (firstBlock + i) * vol.erasableBlockSize);
  135. #ifdef DEBUG_PRINT
  136. DEBUG_PRINT("Debug: Erase ptr=0x%x.n", ptr);
  137. #endif
  138. *ptr = SETUP_ERASE;
  139. *ptr = CONFIRM_ERASE;
  140. do
  141. {
  142. if (flMsecCounter > writeTimeout)
  143. {
  144. retVal = ERROR;
  145. *ptr = CLEAR_STATUS;
  146. break;
  147. }
  148. }while((*ptr & STAT_WSMS) != STAT_WSMS);
  149. if (retVal == ERROR)
  150. {
  151. *ptr = READ_ARRAY;
  152. break;
  153. }
  154. if (*ptr & (BIT(5) | BIT(4) | BIT(3) | BIT(1)))
  155. {
  156. retVal = ERROR;
  157. *ptr = CLEAR_STATUS;
  158. }
  159. if (retVal == ERROR)
  160. {
  161. *ptr = READ_ARRAY;
  162. break;
  163. }
  164. *ptr = READ_ARRAY;
  165. }
  166. if (retVal == ERROR)
  167. {
  168. #ifdef DEBUG_PRINT
  169. DEBUG_PRINT("Debug: In i28f128Erase, erase failedn");
  170. #endif
  171. return flWriteFault;
  172. }
  173. #ifdef DEBUG_PRINT
  174. DEBUG_PRINT("Debug: In i28f128Erase, erase OKn");
  175. #endif
  176. return flOK;
  177. }
  178. FLStatus i28f128Identify(FLFlash vol)
  179. {
  180. FlashWPTR flashPtr;
  181. #ifdef DEBUG_PRINT
  182. DEBUG_PRINT("Debug: Entering i28f128Identify.n");
  183. #endif
  184. flSetWindowBusWidth(vol.socket,16);/* use 16-bits */
  185. flSetWindowSpeed(vol.socket,120);  /* 120 nsec. */
  186. flSetWindowSize(vol.socket,2); /* 8 KBytes */
  187. flashPtr = (FlashWPTR) flMap(vol.socket,0);
  188.   
  189. flashPtr[0] = READ_ARRAY;
  190. flashPtr[1] = READ_ID;
  191. switch (flashPtr[1])
  192. {
  193. case I28F640_FLASH:
  194. vol.type = I28F640_FLASH;
  195. vol.chipSize = 0x800000;
  196. #ifdef DEBUG_PRINT
  197. DEBUG_PRINT("Debug: Detect Intel 28f640n");
  198. #endif
  199. break;
  200. case I28F320_FLASH:
  201. vol.type = I28F320_FLASH;
  202. vol.chipSize = 0x400000;
  203. #ifdef DEBUG_PRINT
  204. DEBUG_PRINT("Debug: Detect Intel 28f320n");
  205. #endif
  206. break;
  207. case I28F128_FLASH:
  208. vol.type = I28F128_FLASH;
  209. vol.chipSize = 0x1000000;
  210. #ifdef DEBUG_PRINT
  211. DEBUG_PRINT("Debug: Detect Intel 28f128n");
  212. #endif
  213. break;
  214. default:
  215. #ifdef DEBUG_PRINT
  216. DEBUG_PRINT("Debug: Can't detect flash typen");
  217. #endif
  218. vol.type = NOT_FLASH;
  219. #ifdef DEBUG_PRINT
  220. DEBUG_PRINT("Debug: failed to identify 16-bit Intel media.n");
  221. #endif
  222. return flUnknownMedia;  /* not ours */  
  223. }  
  224. flashPtr[0] = READ_ARRAY;
  225. vol.interleaving = 1;
  226. vol.noOfChips = 1;
  227. vol.erasableBlockSize = 128*1024;
  228. /* Register our flash handlers */
  229. vol.write = i28f128Write;
  230. vol.erase = i28f128Erase;
  231.   
  232. #ifdef DEBUG_PRINT  
  233. DEBUG_PRINT("Debug: identified 16-bit Intel media.n");
  234. #endif  
  235. return flOK;
  236. }