hv_drv_Eeprom.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. /**
  2. * @file hv_drv_Eeprom.c
  3. * @brief eeprom driver layer file.
  4. * @details This file provides the following functions: \n
  5. * (1) eeprom write\n
  6. * (2) eeprom read\n
  7. * (3) eeprom protect \n
  8. *
  9. * @author HiView SoC Software Team
  10. * @version 1.0.0
  11. * @date 2023-05-08
  12. * @copyright Copyright(c),2023-5, Hiview Software. All rights reserved.
  13. * @par History:
  14. * <table>
  15. * <tr><th>Author <th>Date <th>Change Description
  16. * <tr><td>HiView SoC Software Team <td>2023-05-08 <td>init
  17. * <tr><td>HiView SoC Software Team <td>2023-06-27 <td>add simi2c、mi2c、wp control
  18. * </table>
  19. */
  20. #include "Common/hv_comm_DataType.h"
  21. #include "hv_comm_Define.h"
  22. #include "hv_cal_I2c.h"
  23. #include "hv_drv_I2c.h"
  24. #include "hv_chip_Config.h"
  25. #include "hv_vos_Comm.h"
  26. #include "hv_drv_Eeprom.h"
  27. #include "hv_comm_Define.h"
  28. #include "hv_drv_GpioSimI2c.h"
  29. #include "hv_cal_MI2c.h"
  30. #include "hv_drv_Gpio.h"
  31. static HvCalI2c *apSelf[I2C_PORT_MAX] = {NULL, NULL};
  32. typedef enum _EepromType
  33. {
  34. E2P_TYPE_1K_16PAGES_8BYTE = 0,
  35. E2P_TYPE_2K_32PAGES_8BYTE,
  36. E2P_TYPE_2K_16PAGES_16BYTE,
  37. E2P_TYPE_4K_32PAGES_16BYTE,
  38. E2P_TYPE_8K_64PAGES_16BYTE,
  39. E2P_TYPE_16K_128PAGES_16BYTE,
  40. E2P_TYPE_32K_128PAGES_32BYTE,
  41. E2P_TYPE_64K_256PAGES_32BYTE,
  42. } EepromType;
  43. static void I2C_E2pType(UCHAR8 ucBus, USHORT16 *pAddrByteSize, USHORT16 *pBytesPerPage, USHORT16 *pTotalPageNum)
  44. {
  45. USHORT16 usAddrByteSize = 1;
  46. USHORT16 usBytesPerPage = 8;
  47. USHORT16 usTotalPageNum = 16;
  48. EepromType enEepromType = E2P_TYPE_1K_16PAGES_8BYTE;
  49. switch (ucBus)
  50. {
  51. #ifdef HV_BOARD_CONFIG_E2P_USE_I2CS0
  52. case I2CS0:
  53. {
  54. enEepromType = HV_BOARD_CONFIG_E2P_TYPE_1;
  55. break;
  56. }
  57. #endif
  58. #ifdef HV_BOARD_CONFIG_E2P_USE_MI2C
  59. case MI2C:
  60. {
  61. enEepromType = HV_BOARD_CONFIG_E2P_TYPE_2;
  62. break;
  63. }
  64. #endif
  65. #ifdef HV_BOARD_CONFIG_E2P_USE_SIMI2C0
  66. case SIMI2C0:
  67. {
  68. enEepromType = HV_BOARD_CONFIG_E2P_TYPE_3;
  69. break;
  70. }
  71. #endif
  72. default:
  73. {
  74. break;
  75. }
  76. }
  77. switch (enEepromType)
  78. {
  79. case E2P_TYPE_1K_16PAGES_8BYTE:
  80. {
  81. usAddrByteSize = 1;
  82. usBytesPerPage = 8;
  83. usTotalPageNum = 16;
  84. break;
  85. }
  86. case E2P_TYPE_2K_32PAGES_8BYTE:
  87. {
  88. usAddrByteSize = 1;
  89. usBytesPerPage = 8;
  90. usTotalPageNum = 32;
  91. break;
  92. }
  93. case E2P_TYPE_2K_16PAGES_16BYTE:
  94. {
  95. usAddrByteSize = 1;
  96. usBytesPerPage = 16;
  97. usTotalPageNum = 16;
  98. break;
  99. }
  100. case E2P_TYPE_4K_32PAGES_16BYTE:
  101. {
  102. usAddrByteSize = 1;
  103. usBytesPerPage = 16;
  104. usTotalPageNum = 32;
  105. break;
  106. }
  107. case E2P_TYPE_8K_64PAGES_16BYTE:
  108. {
  109. usAddrByteSize = 1;
  110. usBytesPerPage = 16;
  111. usTotalPageNum = 64;
  112. break;
  113. }
  114. case E2P_TYPE_16K_128PAGES_16BYTE:
  115. {
  116. usAddrByteSize = 1;
  117. usBytesPerPage = 16;
  118. usTotalPageNum = 128;
  119. break;
  120. }
  121. case E2P_TYPE_32K_128PAGES_32BYTE:
  122. {
  123. usAddrByteSize = 2;
  124. usBytesPerPage = 32;
  125. usTotalPageNum = 128;
  126. break;
  127. }
  128. case E2P_TYPE_64K_256PAGES_32BYTE:
  129. {
  130. usAddrByteSize = 2;
  131. usBytesPerPage = 32;
  132. usTotalPageNum = 256;
  133. break;
  134. }
  135. default:
  136. {
  137. HV_LOGI("No such e2p type .\n");
  138. break;
  139. }
  140. }
  141. *pAddrByteSize = usAddrByteSize;
  142. *pBytesPerPage = usBytesPerPage;
  143. *pTotalPageNum = usTotalPageNum;
  144. return;
  145. }
  146. static Status _Eeprom_Write(UCHAR8 ucBus, USHORT16 usCmdAddr, USHORT16 usAddrByteSize, UCHAR8 *pucWtData, USHORT16 usWtDataSize)
  147. {
  148. int iLoop = 0;
  149. UCHAR8 aucCmdAddr[2] = { 0 };
  150. USHORT16 usDevAddress = 0;
  151. BOOL bSub2AddrEn = HV_FALSE;
  152. I2cFuncParam enI2cParam;
  153. UCHAR8 ucDevAddr = 0;
  154. UCHAR8 *pucCmdAddr = NULL;
  155. aucCmdAddr[0] = usCmdAddr >> 8;
  156. aucCmdAddr[1] = usCmdAddr & 0xff;
  157. if (1 == usAddrByteSize)
  158. {
  159. pucCmdAddr = &aucCmdAddr[1];
  160. }
  161. else
  162. {
  163. pucCmdAddr = aucCmdAddr;
  164. }
  165. switch (ucBus)
  166. {
  167. #ifdef HV_BOARD_CONFIG_E2P_USE_I2CS0
  168. case I2CS0:
  169. {
  170. enI2cParam.usDevAddress = HV_BOARD_CONFIG_E2P_ADDR_1;
  171. enI2cParam.pucCmdAddr = pucCmdAddr;
  172. enI2cParam.usCmdAddrSize = usAddrByteSize;
  173. enI2cParam.pucData = pucWtData;
  174. enI2cParam.usDataSize = usWtDataSize;
  175. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_1, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_1?GPIO_LEVEL_LOW:GPIO_LEVEL_HIGH);
  176. Hv_Drv_I2C_MasterPollingTransmit(apSelf[ucBus], &enI2cParam, 0);
  177. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_1, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_1?GPIO_LEVEL_HIGH:GPIO_LEVEL_LOW);
  178. break;
  179. }
  180. #endif
  181. #ifdef HV_BOARD_CONFIG_E2P_USE_MI2C
  182. case MI2C:
  183. {
  184. HV_LOGV("write: ucDevAddr %x, usCmdAddr %x\n", ucDevAddr, usCmdAddr);
  185. ucDevAddr = HV_BOARD_CONFIG_E2P_ADDR_2;
  186. if (usAddrByteSize == 1)
  187. {
  188. ucDevAddr |= (usCmdAddr >> 8) & 0x7;
  189. usCmdAddr &= 0xff;
  190. bSub2AddrEn = HV_FALSE;
  191. }
  192. else if (usAddrByteSize == 2)
  193. {
  194. bSub2AddrEn = HV_TRUE;
  195. }
  196. else
  197. {
  198. return HV_FAILURE;
  199. }
  200. HV_LOGV("write: ucDevAddr %x, usCmdAddr %x\n", ucDevAddr, usCmdAddr);
  201. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_2, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_2?GPIO_LEVEL_LOW:GPIO_LEVEL_HIGH);
  202. HV_LOGV("write: addr %x, addsize %d size %d\n", usCmdAddr, bSub2AddrEn, usWtDataSize);
  203. #if 0
  204. for (iLoop = 0; iLoop < usWtDataSize; iLoop++)
  205. {
  206. HV_LOGI("write:%d %x\n", iLoop,*(pucWtData+iLoop));
  207. Hv_Cal_MI2C_E2PWriteByte(HV_BOARD_CONFIG_E2P_ADDR_2, usCmdAddr++, bSub2AddrEn, *(pucWtData + iLoop));
  208. }
  209. #else
  210. Hv_Cal_MI2C_E2PWriteBytes(ucDevAddr, usCmdAddr, bSub2AddrEn, usWtDataSize, pucWtData);
  211. for (iLoop = 0; iLoop < usWtDataSize; iLoop++)
  212. {
  213. HV_LOGV("write:%d %x\n", iLoop,*(pucWtData+iLoop));
  214. }
  215. #endif
  216. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_2, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_2?GPIO_LEVEL_HIGH:GPIO_LEVEL_LOW);
  217. break;
  218. }
  219. #endif
  220. #ifdef HV_BOARD_CONFIG_E2P_USE_SIMI2C0
  221. case SIMI2C0:
  222. {
  223. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_3, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_3?GPIO_LEVEL_LOW:GPIO_LEVEL_HIGH);
  224. Hv_Drv_GpioSimI2c_SendData(SIMI2C0, HV_BOARD_CONFIG_E2P_ADDR_3, pucCmdAddr, usAddrByteSize,
  225. pucWtData, usWtDataSize);
  226. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_3, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_3?GPIO_LEVEL_HIGH:GPIO_LEVEL_LOW);
  227. break;
  228. }
  229. #endif
  230. default:
  231. {
  232. return HV_FAILURE;
  233. }
  234. }
  235. return HV_SUCCESS;
  236. }
  237. static Status _Eeprom_Read(UCHAR8 ucBus, USHORT16 usCmdAddr, USHORT16 usAddrByteSize, UCHAR8 *pucRDData, USHORT16 usRDDataSize)
  238. {
  239. int iLoop = 0;
  240. USHORT16 usDevAddress = 0;
  241. UCHAR8 aucCmdAddr[2] = { 0 };
  242. BOOL bSub2AddrEn = HV_FALSE;
  243. I2cFuncParam enI2cParam;
  244. UCHAR8 ucDevAddr = 0;
  245. UCHAR8 *pucCmdAddr = NULL;
  246. aucCmdAddr[0] = usCmdAddr >> 8;
  247. aucCmdAddr[1] = usCmdAddr & 0xff;
  248. if (1 == usAddrByteSize)
  249. {
  250. pucCmdAddr = &aucCmdAddr[1];
  251. }
  252. else
  253. {
  254. pucCmdAddr = aucCmdAddr;
  255. }
  256. switch (ucBus)
  257. {
  258. #ifdef HV_BOARD_CONFIG_E2P_USE_I2CS0
  259. case I2CS0:
  260. {
  261. enI2cParam.usDevAddress = HV_BOARD_CONFIG_E2P_ADDR_1;
  262. enI2cParam.pucCmdAddr = pucCmdAddr;
  263. enI2cParam.usCmdAddrSize = usAddrByteSize;
  264. enI2cParam.pucData = pucRDData;
  265. enI2cParam.usDataSize = usRDDataSize;
  266. return Hv_Drv_I2C_MasterPollingReceive(apSelf[ucBus], &enI2cParam, 0);
  267. break;
  268. }
  269. #endif
  270. #ifdef HV_BOARD_CONFIG_E2P_USE_MI2C
  271. case MI2C:
  272. {
  273. HV_LOGV("write: ucDevAddr %x, usCmdAddr %x\n", ucDevAddr, usCmdAddr);
  274. ucDevAddr = HV_BOARD_CONFIG_E2P_ADDR_2;
  275. if (usAddrByteSize == 1)
  276. {
  277. ucDevAddr |= (usCmdAddr >> 8) & 0x7;
  278. usCmdAddr &= 0xff;
  279. bSub2AddrEn = HV_FALSE;
  280. }
  281. else if (usAddrByteSize == 2)
  282. {
  283. bSub2AddrEn = HV_TRUE;
  284. }
  285. else
  286. {
  287. return HV_FAILURE;
  288. }
  289. if (usRDDataSize < 4)
  290. {
  291. HV_LOGV("read: addr %x, addsize %d\n", usCmdAddr, bSub2AddrEn);
  292. for (iLoop = 0; iLoop < usRDDataSize; iLoop++)
  293. {
  294. *(pucRDData + iLoop) = Hv_Cal_MI2C_E2PReadByte(HV_BOARD_CONFIG_E2P_ADDR_2, usCmdAddr++, bSub2AddrEn);
  295. HV_LOGV("read: %d:%x\n", iLoop,*(pucRDData+iLoop));
  296. }
  297. }
  298. else
  299. {
  300. HV_LOGV("write: ucDevAddr %x, usCmdAddr %x\n", ucDevAddr, usCmdAddr);
  301. HV_LOGV("read: addr %x, addsize %d, size %d\n", usCmdAddr, bSub2AddrEn, usRDDataSize);
  302. Hv_Cal_MI2C_E2PReadBytes(ucDevAddr, usCmdAddr, bSub2AddrEn, usRDDataSize, pucRDData);
  303. for (iLoop = 0; iLoop < usRDDataSize; iLoop++)
  304. {
  305. HV_LOGV("read: %d:%x\n", iLoop,*(pucRDData+iLoop));
  306. }
  307. }
  308. break;
  309. }
  310. #endif
  311. #ifdef HV_BOARD_CONFIG_E2P_USE_SIMI2C0
  312. case SIMI2C0:
  313. {
  314. return Hv_Drv_GpioSimI2c_RecvData(SIMI2C0, HV_BOARD_CONFIG_E2P_ADDR_3, pucCmdAddr, usAddrByteSize,
  315. pucRDData, usRDDataSize);
  316. }
  317. #endif
  318. default:
  319. {
  320. return HV_FAILURE;
  321. }
  322. }
  323. return HV_SUCCESS;
  324. }
  325. /** Transmit an amount of data to Eeprom
  326. * @param ucBus i2c bus
  327. * @param usWtAddr address to write data
  328. * @param pucWtData pointer to write data
  329. * @param usWtDataSize size to write data.
  330. * @retval Status
  331. */
  332. Status Hv_Drv_Eeprom_Write(UCHAR8 ucBus, USHORT16 usWtAddr, UCHAR8 *pucWtData, USHORT16 usWtDataSize)
  333. {
  334. USHORT16 usPageNum = 0;
  335. USHORT16 usStartDataSize = 0;
  336. USHORT16 usEndDataSize = 0;
  337. USHORT16 usAddrByteSize = 0;
  338. USHORT16 usBytesPerPage = 0;
  339. USHORT16 usTotalPageNum = 0;
  340. USHORT16 usLoop = 0;
  341. Status enStatus = HV_SUCCESS;
  342. UCHAR8 *pData = NULL;
  343. HvCalI2c *pstSelf = NULL;
  344. pData = pucWtData;
  345. I2C_E2pType(ucBus, &usAddrByteSize, &usBytesPerPage, &usTotalPageNum);
  346. usStartDataSize = usBytesPerPage - (usWtAddr % usBytesPerPage);
  347. if (usStartDataSize != usBytesPerPage)
  348. {
  349. if (usWtDataSize < usStartDataSize)
  350. {
  351. usStartDataSize = 0;
  352. }
  353. else
  354. {
  355. usWtDataSize -= usStartDataSize;
  356. }
  357. }
  358. else
  359. {
  360. usStartDataSize = 0;
  361. }
  362. usPageNum = usWtDataSize / usBytesPerPage;
  363. usEndDataSize = usWtDataSize % usBytesPerPage;
  364. if (usStartDataSize != 0)
  365. {
  366. enStatus = _Eeprom_Write(ucBus, usWtAddr, usAddrByteSize, pData, usStartDataSize);
  367. pData += usStartDataSize;
  368. usWtAddr += usStartDataSize;
  369. Hv_Vos_Delayus(5000);
  370. }
  371. for (usLoop = 0; usLoop < usPageNum; usLoop++)
  372. {
  373. enStatus = _Eeprom_Write(ucBus, usWtAddr, usAddrByteSize, pData, usBytesPerPage);
  374. pData += usBytesPerPage;
  375. usWtAddr += usBytesPerPage;
  376. Hv_Vos_Delayus(5000);
  377. }
  378. if (usEndDataSize != 0)
  379. {
  380. enStatus = _Eeprom_Write(ucBus, usWtAddr, usAddrByteSize, pData, usEndDataSize);
  381. Hv_Vos_Delayus(5000);
  382. }
  383. return enStatus;
  384. }
  385. /** receive an amount of data from eeprom
  386. * @param ucBus i2c bus
  387. * @param usRdAddr address to write data
  388. * @param pucRdData pointer to write data
  389. * @param usRdDataSize size to read data.
  390. * @retval Status
  391. */
  392. Status Hv_Drv_Eeprom_Read(UCHAR8 ucBus, USHORT16 usRdAddr, UCHAR8 *pucRdData, USHORT16 usRdDataSize)
  393. {
  394. USHORT16 usPageNum = 0;
  395. USHORT16 usStartDataSize = 0;
  396. USHORT16 usEndDataSize = 0;
  397. USHORT16 usAddrByteSize = 0;
  398. USHORT16 usBytesPerPage = 0;
  399. USHORT16 usTotalPageNum = 0;
  400. USHORT16 usLoop = 0;
  401. Status enStatus = HV_SUCCESS;
  402. UCHAR8 *pData = NULL;
  403. HvCalI2c *pstSelf = NULL;
  404. I2C_E2pType(ucBus, &usAddrByteSize, &usBytesPerPage, &usTotalPageNum);
  405. pData = pucRdData;
  406. usStartDataSize = usBytesPerPage - (usRdAddr % usBytesPerPage);
  407. if (usStartDataSize != usBytesPerPage)
  408. {
  409. if (usRdDataSize < usStartDataSize)
  410. {
  411. usStartDataSize = 0;
  412. }
  413. else
  414. {
  415. usRdDataSize -= usStartDataSize;
  416. }
  417. }
  418. else
  419. {
  420. usStartDataSize = 0;
  421. }
  422. usPageNum = usRdDataSize / usBytesPerPage;
  423. usEndDataSize = usRdDataSize % usBytesPerPage;
  424. if (usStartDataSize != 0)
  425. {
  426. enStatus = _Eeprom_Read(ucBus, usRdAddr, usAddrByteSize, pData, usStartDataSize);
  427. pData += usStartDataSize;
  428. usRdAddr += usStartDataSize;
  429. Hv_Vos_Delayus(5000);
  430. }
  431. for (usLoop = 0; usLoop < usPageNum; usLoop++)
  432. {
  433. enStatus = _Eeprom_Read(ucBus, usRdAddr, usAddrByteSize, pData, usBytesPerPage);
  434. pData += usBytesPerPage;
  435. usRdAddr += usBytesPerPage;
  436. Hv_Vos_Delayus(5000);
  437. }
  438. if (usEndDataSize != 0)
  439. {
  440. enStatus = _Eeprom_Read(ucBus, usRdAddr, usAddrByteSize, pData, usEndDataSize);
  441. Hv_Vos_Delayus(5000);
  442. }
  443. return HV_SUCCESS;
  444. }
  445. /** init i2c for eeprom
  446. * @retval Status
  447. */
  448. Status Hv_Drv_Eeprom_Init(void)
  449. {
  450. I2cInitParam stInitParam;
  451. GpioSimI2c stGpioSimi2c = {INVALID_PARAM_UHCAR8, INVALID_PARAM_UHCAR8};
  452. #ifdef HV_BOARD_CONFIG_E2P_USE_I2CS0
  453. stInitParam.enPort = I2C_PORT_1;
  454. stInitParam.enMode = I2C_MODE_MASTER;
  455. stInitParam.enSpeed = I2C_SPEED_100K;
  456. stInitParam.enAddressingMode = I2C_ADDR_7BIT;
  457. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_1, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_1?GPIO_LEVEL_HIGH:GPIO_LEVEL_LOW);
  458. Hv_Drv_Gpio_SetDirection(HV_BOARD_CONFIG_E2P_WP_GPIO_1, GPIO_DIR_OUTPUT);
  459. apSelf[I2CS0] = Hv_Drv_I2C_Init(&stInitParam);
  460. #endif
  461. #ifdef HV_BOARD_CONFIG_E2P_USE_I2CM0
  462. stInitParam.enPort = I2C_PORT_0;
  463. stInitParam.enMode = I2C_MODE_MASTER;
  464. stInitParam.enSpeed = I2C_SPEED_100K;
  465. stInitParam.enAddressingMode = I2C_ADDR_7BIT;
  466. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_0, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_0?GPIO_LEVEL_HIGH:GPIO_LEVEL_LOW);
  467. Hv_Drv_Gpio_SetDirection(HV_BOARD_CONFIG_E2P_WP_GPIO_0, GPIO_DIR_OUTPUT);
  468. apSelf[I2CM0] = Hv_Drv_I2C_Init(&stInitParam);
  469. #endif
  470. #ifdef HV_BOARD_CONFIG_E2P_USE_SIMI2C0
  471. stGpioSimi2c.ucSdaPin = SIMI2C_SDA;
  472. stGpioSimi2c.ucSclPin = SIMI2C_SCL;
  473. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_3, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_3?GPIO_LEVEL_HIGH:GPIO_LEVEL_LOW);
  474. Hv_Drv_Gpio_SetDirection(HV_BOARD_CONFIG_E2P_WP_GPIO_3, GPIO_DIR_OUTPUT);
  475. Hv_Drv_GpioSimI2c_Init(SIMI2C0, &stGpioSimi2c);
  476. #endif
  477. #ifdef HV_BOARD_CONFIG_E2P_USE_MI2C
  478. Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_E2P_WP_GPIO_2, HV_BOARD_CONFIG_E2P_WP_PROTECT_LEVEL_2?GPIO_LEVEL_HIGH:GPIO_LEVEL_LOW);
  479. Hv_Drv_Gpio_SetDirection(HV_BOARD_CONFIG_E2P_WP_GPIO_2, GPIO_DIR_OUTPUT);
  480. Hv_Cal_MI2C_Init();
  481. #endif
  482. return HV_SUCCESS;
  483. }