eprom.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:8k
源码类别:

DVD

开发平台:

C/C++

  1. #include "string.h"
  2. #include "i2c.h"
  3. #include "osp.h"
  4. #include "eprom.h"
  5. #include "ste2p.h"
  6. #define EPROM_SIZE  (0x2000)
  7. #define EPROM_I2C_ADDR (0xa0)  
  8. #define EPROM_TIME_WRITE (10)
  9. #define EPROM_TIME_READ (1)
  10. #define PAGE_WRITE_SIZE (32)
  11. #define SEQ_READ_SIZE (1)
  12. static UINT32 gE2pHandle;
  13. static UINT32 epromSem;
  14. static void E2P_Protect(void);
  15. static void E2P_UnProtect(void);
  16. INT32 KB_E2PInit(void)
  17. {
  18. KB_I2COpen(EPROM_I2C_ADDR, &gE2pHandle);
  19. KB_OSPSemInit("EEPS", 1, J_OSP_WAIT_FIFO, &epromSem);
  20. return RETOK;
  21. }
  22. INT32 KB_E2PRead(UINT32 offset, UINT8 *data, UINT32 byteCount, UINT32 *byteRead)
  23. {
  24. INT32  rc;
  25. UINT32  index;
  26. UINT8   addr[2];
  27. if( (NULL == data) || (byteCount == 0)
  28. || (offset + byteCount > EPROM_SIZE) )
  29. return RETFAIL3;
  30. E2P_Protect();
  31. index = 0;
  32. rc = RETOK;
  33. while(byteCount >= SEQ_READ_SIZE)
  34. {
  35. addr[0] = (UINT8)((offset >> 8) & 0xFF);
  36. addr[1] = (UINT8)(offset & 0xFF);
  37. if((rc = KB_I2CWriteWithoutStop(gE2pHandle, 2, addr)) == RETOK)
  38. {
  39. if((rc = KB_I2CReadWithStop(gE2pHandle, SEQ_READ_SIZE, &data[index])) == RETOK)
  40. {
  41. byteCount -= SEQ_READ_SIZE;
  42. index += SEQ_READ_SIZE;
  43. offset += SEQ_READ_SIZE;
  44. }
  45. else
  46. {
  47. break;
  48. }
  49. }
  50. else
  51. {
  52. break;
  53. }
  54. }
  55. if((byteCount > 0) && (byteCount < SEQ_READ_SIZE) && (rc == RETOK))
  56. {
  57. addr[0] = (UINT8)((offset >> 8) & 0xFF);
  58. addr[1] = (UINT8)(offset & 0xFF);
  59. if((rc = KB_I2CWriteWithoutStop(gE2pHandle, 2, addr)) == RETOK)
  60. {
  61. if((rc = KB_I2CReadWithStop(gE2pHandle, byteCount, &data[index])) == RETOK)
  62. {
  63. index += byteCount;
  64. offset += byteCount;
  65. byteCount = 0;
  66. }
  67. }
  68. }
  69. if(byteRead != NULL) *byteRead = index;
  70. E2P_UnProtect();
  71. return rc;
  72. }
  73. /* The data word address lower 5 bits are internally incremented
  74. ** following the receipt of each data word. The higher
  75. ** data word address bits are not incremented, retaining the
  76. ** memory page row location. When the word address, internally
  77. ** generated, reaches the page boundary, the following
  78. ** byte is placed at the beginning of the same page. If more
  79. ** than 32 data words are transmitted to the EEPROM, the
  80. ** data word address will “roll over” and previous data will be
  81. ** overwritten.
  82. */
  83. INT32 KB_E2PWrite(UINT32 offset, UINT8 *data, UINT32 byteCount, UINT32 *byteWrite)
  84. {
  85. INT32  rc;
  86. UINT32  index, tmp;
  87. UINT8   addr[2 + PAGE_WRITE_SIZE]; /* 2 Bytes addr, others are data */
  88. if( (NULL == data) || (byteCount == 0)
  89. || (offset + byteCount > EPROM_SIZE) )
  90. return RETFAIL3;
  91. E2P_Protect();
  92. index = 0;
  93. rc = RETOK;
  94. /* Align offset to 32 for page write. */
  95. tmp = offset % PAGE_WRITE_SIZE;
  96. if(tmp)
  97. {
  98. tmp = PAGE_WRITE_SIZE - tmp;
  99. if(byteCount <= tmp)
  100. {
  101. tmp = byteCount;
  102. }
  103. addr[0] = (UINT8)((offset >> 8) & 0xFF);
  104. addr[1] = (UINT8)(offset & 0xFF);
  105. memcpy(&addr[2], &data[index], (size_t)tmp); /* copy data to addr buf */
  106. if((rc = KB_I2CWriteWithStop(gE2pHandle, 2+tmp, addr)) == RETOK)
  107. {
  108. index += tmp;
  109. offset += tmp;
  110. byteCount -= tmp;
  111. }
  112. KB_OSPTaskDelay(EPROM_TIME_WRITE);
  113. }
  114. if(rc == RETOK)
  115. {
  116. while(byteCount >= PAGE_WRITE_SIZE)
  117. {
  118. addr[0] = (UINT8)((offset >> 8) & 0xFF);
  119. addr[1] = (UINT8)(offset & 0xFF);
  120. memcpy(&addr[2], &data[index], PAGE_WRITE_SIZE); /* copy data to addr buf */
  121. if((rc = KB_I2CWriteWithStop(gE2pHandle, 2+PAGE_WRITE_SIZE, addr)) == RETOK)
  122. {
  123. byteCount -= PAGE_WRITE_SIZE;
  124. index += PAGE_WRITE_SIZE;
  125. offset += PAGE_WRITE_SIZE;
  126. KB_OSPTaskDelay(EPROM_TIME_WRITE);
  127. }
  128. else
  129. {
  130. KB_OSPTaskDelay(EPROM_TIME_WRITE);
  131. break;
  132. }
  133. }
  134. }
  135. if((byteCount > 0) && (rc == RETOK))
  136. {
  137. addr[0] = (UINT8)((offset >> 8) & 0xFF);
  138. addr[1] = (UINT8)(offset & 0xFF);
  139. memcpy(&addr[2], &data[index], (size_t)byteCount); /* copy data to addr buf */
  140. if((rc = KB_I2CWriteWithStop(gE2pHandle, 2+byteCount, addr)) == RETOK)
  141. {
  142. index += byteCount;
  143. offset += byteCount;
  144. byteCount = 0;
  145. }
  146. KB_OSPTaskDelay(EPROM_TIME_WRITE);
  147. }
  148. if(byteWrite != NULL) *byteWrite = index;
  149. E2P_UnProtect();
  150. return rc;
  151. }
  152. INT32 KB_E2PGetSize(void)
  153. {
  154. return EPROM_SIZE;
  155. }
  156. static void E2P_Protect(void)
  157. {
  158. KB_OSPSemGet(epromSem, KB_Wait, 0);
  159. }
  160. static void E2P_UnProtect(void)
  161. {
  162. KB_OSPSemSet(epromSem);
  163. }
  164. #if 1
  165. extern ST_Partition_t  *SystemPartition;
  166. void E2P_Test(void)
  167. {
  168. U8 index;
  169. U32 byteWrited,byteReaded;
  170. U8 bufRead[255];
  171. U8 bufWrite[255];
  172. ST_ErrorCode_t rel;
  173. //------------------------------------------------------
  174. ST_ErrorCode_t      error, stored;
  175. STE2P_InitParams_t para;
  176. STE2P_OpenParams_t openPara;
  177. STE2P_Handle_t e2pHandle;
  178.      para.BaseAddress = NULL;                /* not memory-mapped */
  179.      strcpy( para.I2CDeviceName, "I2C_BACK" ); /* must match I2C Name */
  180.      para.MemoryWidth = 1;                   /* this is not used by driver */
  181.      para.SizeInBytes = 4*1024-4;
  182.      para.PagingBytes = 32;   /* max. number of writes in page */
  183.      para.DeviceCode  =  0xA0;                    /* Manufacturer's code */
  184.   para.MaxSimOpen  = 1;                   /* up to 2 simultaneous opens */
  185.      para.DriverPartition = SystemPartition;//TEST_PARTITION_1;
  186.      error = STE2P_Init("STACKTEST", &para );
  187.      if (error != ST_NO_ERROR)
  188.      {
  189.          printf("nSTE2P_Init error.");
  190.      }
  191. openPara.Offset = 0x00;             /* select small seg. base */
  192.      openPara.Length = 4*1024-4;             /* select small seg. size */
  193.      error = STE2P_Open("STACKTEST", &openPara, &e2pHandle);
  194. //------------------------------------------------------
  195. for(index=0;index<255;index++)
  196. {
  197. bufRead[index]=0xAA;
  198. bufWrite[index]=0xBB;
  199. }
  200. //rel=KB_E2PWrite(0,bufWrite,TEST_DATA_LEN,&byteWrited);
  201. rel=STE2P_Write(e2pHandle,0,(U8*)bufWrite,255,&byteWrited);
  202.        printf("nSTE2P_Write %d 0x%x.",bufWrite[22],bufWrite[22]);
  203. // for(index=0;index<(255*100);index++);
  204.        printf("nbefore STE2P_Read  bufRead[22] = %d 0x%xn",bufRead[22],bufRead[22]);
  205. rel=STE2P_Read(e2pHandle,0,(U8*)bufRead,255,&byteReaded);
  206.        printf("after STE2P_Read bufRead[22] = %d 0x%xn",bufRead[22],bufRead[22]);
  207. //rel=KB_E2PRead(0,bufRead,TEST_DATA_LEN,&byteReaded);
  208. }
  209. #else
  210. #define TEST_DATA_LEN 255
  211. U8 bufRead[TEST_DATA_LEN],bufWrite[TEST_DATA_LEN];
  212. extern ST_Partition_t  *SystemPartition;
  213. #define SML_SEG_BASE     0x00000701                 /* base for small seg. */ #define SML_SEG_SIZE     0x00000200                 /* size of small seg. */
  214. void E2P_Test(void)
  215. {
  216. UINT8 index;
  217. U32 byteWrited,byteReaded;
  218. //INT32 rel;
  219. ST_ErrorCode_t rel;
  220. //------------------------------------------------------
  221. ST_ErrorCode_t      error, stored;
  222. STE2P_InitParams_t para;
  223. STE2P_OpenParams_t openPara;
  224. STE2P_Handle_t e2pHandle;
  225.      para.BaseAddress = NULL;                /* not memory-mapped */
  226.      strcpy( para.I2CDeviceName, "I2C_BACK" ); /* must match I2C Name */
  227.      para.MemoryWidth = 1;                   /* this is not used by driver */
  228.      para.SizeInBytes = 4*1024-4;
  229.      para.PagingBytes = 32;   /* max. number of writes in page */
  230.      para.DeviceCode  =  0xA0;                    /* Manufacturer's code */
  231.   para.MaxSimOpen  = 1;                   /* up to 2 simultaneous opens */
  232.      para.DriverPartition = SystemPartition;//TEST_PARTITION_1;
  233.      error = STE2P_Init("STACKTEST", &para );
  234.      if (error != ST_NO_ERROR)
  235.      {
  236.          printf("nSTE2P_Init error.");
  237.      }
  238. openPara.Offset = 0x00;             /* select small seg. base */
  239.      openPara.Length = 4*1024-4;             /* select small seg. size */
  240.      error = STE2P_Open("STACKTEST", &openPara, &e2pHandle);
  241. //------------------------------------------------------
  242. for(index=0;index<TEST_DATA_LEN;index++)
  243. {
  244. bufRead[index]=0xAA;
  245. bufWrite[index]=0xBB;
  246. }
  247. //rel=KB_E2PWrite(0,bufWrite,TEST_DATA_LEN,&byteWrited);
  248. rel=STE2P_Write(e2pHandle,0,(U8*)bufWrite,TEST_DATA_LEN,&byteWrited);
  249. for(index=0;index<(TEST_DATA_LEN*100);index++);
  250. rel=STE2P_Read(e2pHandle,0,(U8*)bufRead,TEST_DATA_LEN,&byteReaded);
  251. //rel=KB_E2PRead(0,bufRead,TEST_DATA_LEN,&byteReaded);
  252. }
  253. #endif