Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

707 linhas
18 KiB

  1. /*******************************************************************************
  2. File Name:
  3. nmasic.c
  4. Summary:
  5. This module contains WINC3400 ASIC specific internal APIs.
  6. Description:
  7. This module contains WINC3400 ASIC specific internal APIs.
  8. *******************************************************************************/
  9. //DOM-IGNORE-BEGIN
  10. /*******************************************************************************
  11. * Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries.
  12. *
  13. * Subject to your compliance with these terms, you may use Microchip software
  14. * and any derivatives exclusively with Microchip products. It is your
  15. * responsibility to comply with third party license terms applicable to your
  16. * use of third party software (including open source software) that may
  17. * accompany Microchip software.
  18. *
  19. * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
  20. * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
  21. * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
  22. * PARTICULAR PURPOSE.
  23. *
  24. * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
  25. * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
  26. * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
  27. * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
  28. * FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
  29. * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
  30. * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
  31. *******************************************************************************/
  32. #include "nm_common.h"
  33. #include "nmbus.h"
  34. #include "nm_bsp.h"
  35. #include "nmasic.h"
  36. #include "m2m_types.h"
  37. #define NMI_GLB_RESET_0 (NMI_PERIPH_REG_BASE + 0x400)
  38. #define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00)
  39. #define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408)
  40. #define NMI_INTR_ENABLE (NMI_INTR_REG_BASE)
  41. #define GET_UINT32(X,Y) (X[0+Y] + ((uint32_t)X[1+Y]<<8) + ((uint32_t)X[2+Y]<<16) +((uint32_t)X[3+Y]<<24))
  42. #define CORT_HOST_COMM (0x14)
  43. #define HOST_CORT_COMM (0x0e)
  44. #define WAKE_CLK_REG (0x1)
  45. #define CLOCKS_EN_REG (0x13)
  46. #define TIMEOUT (2000)
  47. #define WAKEUP_TRIALS (4)
  48. int8_t chip_apply_conf(uint32_t u32Conf)
  49. {
  50. int8_t ret = M2M_SUCCESS;
  51. uint32_t val32 = u32Conf;
  52. #ifdef __ENABLE_PMU__
  53. val32 |= rHAVE_USE_PMU_BIT;
  54. #endif
  55. #ifdef __ENABLE_SLEEP_CLK_SRC_RTC__
  56. val32 |= rHAVE_SLEEP_CLK_SRC_RTC_BIT;
  57. #elif defined __ENABLE_SLEEP_CLK_SRC_XO__
  58. val32 |= rHAVE_SLEEP_CLK_SRC_XO_BIT;
  59. #endif
  60. #ifdef __ENABLE_EXT_PA_INV_TX_RX__
  61. val32 |= rHAVE_EXT_PA_INV_TX_RX;
  62. #endif
  63. #ifdef __ENABLE_LEGACY_RF_SETTINGS__
  64. val32 |= rHAVE_LEGACY_RF_SETTINGS;
  65. #endif
  66. #ifdef __DISABLE_FIRMWARE_LOGS__
  67. val32 |= rHAVE_LOGS_DISABLED_BIT;
  68. #endif
  69. do {
  70. nm_write_reg(rNMI_GP_REG_1, val32);
  71. if(val32 != 0) {
  72. uint32_t reg = 0;
  73. ret = nm_read_reg_with_ret(rNMI_GP_REG_1, &reg);
  74. if(ret == M2M_SUCCESS) {
  75. if(reg == val32)
  76. break;
  77. }
  78. } else {
  79. break;
  80. }
  81. } while(1);
  82. return M2M_SUCCESS;
  83. }
  84. void chip_idle(void)
  85. {
  86. uint32_t reg =0;
  87. nm_read_reg_with_ret(WAKE_CLK_REG, &reg);
  88. if(reg&NBIT1)
  89. {
  90. reg &=~NBIT1;
  91. nm_write_reg(WAKE_CLK_REG, reg);
  92. }
  93. }
  94. void enable_rf_blocks(void)
  95. {
  96. nm_write_reg(0x6, 0xdb);
  97. nm_write_reg(0x7, 0x6);
  98. nm_sleep(10);
  99. nm_write_reg(0x1480, 0);
  100. nm_write_reg(0x1484, 0);
  101. nm_sleep(10);
  102. nm_write_reg(0x6, 0x0);
  103. nm_write_reg(0x7, 0x0);
  104. }
  105. int8_t enable_interrupts(void)
  106. {
  107. uint32_t reg = 0;
  108. int8_t ret = M2M_SUCCESS;
  109. /**
  110. interrupt pin mux select
  111. **/
  112. ret = nm_read_reg_with_ret(NMI_PIN_MUX_0, &reg);
  113. if (M2M_SUCCESS != ret) {
  114. return M2M_ERR_BUS_FAIL;
  115. }
  116. reg |= ((uint32_t) 1 << 8);
  117. ret = nm_write_reg(NMI_PIN_MUX_0, reg);
  118. if (M2M_SUCCESS != ret) {
  119. return M2M_ERR_BUS_FAIL;
  120. }
  121. /**
  122. interrupt enable
  123. **/
  124. ret = nm_read_reg_with_ret(NMI_INTR_ENABLE, &reg);
  125. if (M2M_SUCCESS != ret) {
  126. return M2M_ERR_BUS_FAIL;
  127. }
  128. reg |= ((uint32_t) 1 << 16);
  129. ret = nm_write_reg(NMI_INTR_ENABLE, reg);
  130. if (M2M_SUCCESS != ret) {
  131. return M2M_ERR_BUS_FAIL;
  132. }
  133. return M2M_SUCCESS;
  134. }
  135. int8_t cpu_start(void) {
  136. uint32_t reg = 0;
  137. int8_t ret;
  138. /**
  139. reset regs
  140. */
  141. ret = nm_write_reg(BOOTROM_REG, 0);
  142. ret += nm_write_reg(NMI_STATE_REG, 0);
  143. ret += nm_write_reg(NMI_REV_REG, 0);
  144. /**
  145. Go...
  146. **/
  147. ret += nm_read_reg_with_ret(0x1118, &reg);
  148. if (M2M_SUCCESS != ret) {
  149. ret = M2M_ERR_BUS_FAIL;
  150. M2M_ERR("[nmi start]: fail read reg 0x1118 ...\r\n");
  151. }
  152. reg |= NBIT0;
  153. ret += nm_write_reg(0x1118, reg);
  154. ret = nm_write_reg(0x150014, 0x1); //DTODO WHY IS THIS HERE??
  155. ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, &reg);
  156. if ((reg & (1ul << 10)) == (1ul << 10)) {
  157. reg &= ~(1ul << 10);
  158. ret += nm_write_reg(NMI_GLB_RESET_0, reg);
  159. }
  160. reg |= (1ul << 10);
  161. ret += nm_write_reg(NMI_GLB_RESET_0, reg);
  162. nm_sleep(1); /* Removing this can cause a bus error. */
  163. return ret;
  164. }
  165. uint32_t nmi_get_chipid(void)
  166. {
  167. static uint32_t chipid = 0;
  168. if (chipid == 0) {
  169. uint32_t rfrevid;
  170. if ((nm_read_reg_with_ret(0x1000, &chipid)) != M2M_SUCCESS) {
  171. chipid = 0;
  172. return 0;
  173. }
  174. if ((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) {
  175. chipid = 0;
  176. return 0;
  177. }
  178. if (chipid == 0x1002a0) {
  179. if (rfrevid == 0x1) { /* 1002A0 */
  180. } else /* if (rfrevid == 0x2) */ { /* 1002A1 */
  181. chipid = 0x1002a1;
  182. }
  183. } else if (chipid == 0x1002b0) {
  184. if (rfrevid == 3) { /* 1002B0 */
  185. } else if (rfrevid == 4) { /* 1002B1 */
  186. chipid = 0x1002b1;
  187. } else /* if(rfrevid == 5) */ { /* 1002B2 */
  188. chipid = 0x1002b2;
  189. }
  190. } else if(chipid == 0x1000f0) {
  191. /* For 3400, the WiFi chip ID register reads 0x1000f0.
  192. * Therefore using BT chip ID register here which should read 0x3000D0
  193. */
  194. #define rBT_CHIP_ID_REG (0x3b0000)
  195. if((nm_read_reg_with_ret(rBT_CHIP_ID_REG, &chipid)) != M2M_SUCCESS) {
  196. chipid = 0;
  197. return 0;
  198. }
  199. if(chipid == 0x3000d0) {
  200. if(rfrevid == 6) {
  201. chipid = 0x3000d1;
  202. }
  203. else if(rfrevid == 2) {
  204. chipid = 0x3000d2;
  205. }
  206. }
  207. }
  208. //#define PROBE_FLASH
  209. #ifdef PROBE_FLASH
  210. if(chipid) {
  211. UWORD32 flashid;
  212. flashid = probe_spi_flash();
  213. if((chipid & 0xf00000) == 0x300000) {
  214. if(flashid == 0x1440ef) {
  215. chipid &= ~(0x0f0000);
  216. chipid |= 0x040000;
  217. }
  218. } else {
  219. if(flashid == 0x1230ef) {
  220. chipid &= ~(0x0f0000);
  221. chipid |= 0x050000;
  222. }
  223. if(flashid == 0xc21320c2) {
  224. chipid &= ~(0x0f0000);
  225. chipid |= 0x050000;
  226. }
  227. }
  228. }
  229. #else
  230. /*M2M is by default have SPI flash*/
  231. if((chipid & 0xf00000) == 0x300000) {
  232. chipid &= ~(0x0f0000);
  233. chipid |= 0x040000;
  234. } else {
  235. chipid &= ~(0x0f0000);
  236. chipid |= 0x050000;
  237. }
  238. #endif /* PROBE_FLASH */
  239. }
  240. return chipid;
  241. }
  242. uint32_t nmi_get_rfrevid(void)
  243. {
  244. uint32_t rfrevid;
  245. if((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) {
  246. rfrevid = 0;
  247. }
  248. return rfrevid;
  249. }
  250. void restore_pmu_settings_after_global_reset(void)
  251. {
  252. /*
  253. * Must restore PMU register value after
  254. * global reset if PMU toggle is done at
  255. * least once since the last hard reset.
  256. */
  257. if(REV(nmi_get_chipid()) >= REV_2B0) {
  258. nm_write_reg(0x1e48, 0xb78469ce);
  259. }
  260. }
  261. void nmi_update_pll(void)
  262. {
  263. uint32_t pll;
  264. pll = nm_read_reg(0x1428);
  265. pll &= ~0x1ul;
  266. nm_write_reg(0x1428, pll);
  267. pll |= 0x1ul;
  268. nm_write_reg(0x1428, pll);
  269. }
  270. void nmi_set_sys_clk_src_to_xo(void)
  271. {
  272. uint32_t val32;
  273. /* Switch system clock source to XO. This will take effect after nmi_update_pll(). */
  274. val32 = nm_read_reg(0x141c);
  275. val32 |= (1 << 2);
  276. nm_write_reg(0x141c, val32);
  277. /* Do PLL update */
  278. nmi_update_pll();
  279. }
  280. int8_t chip_sleep(void)
  281. {
  282. uint32_t reg;
  283. int8_t ret = M2M_SUCCESS;
  284. while(1)
  285. {
  286. ret = nm_read_reg_with_ret(CORT_HOST_COMM, &reg);
  287. if(ret != M2M_SUCCESS) goto ERR1;
  288. if((reg & NBIT0) == 0) break;
  289. }
  290. /* Clear bit 1 */
  291. ret = nm_read_reg_with_ret(WAKE_CLK_REG, &reg);
  292. if(ret != M2M_SUCCESS)goto ERR1;
  293. if(reg & NBIT1)
  294. {
  295. reg &=~NBIT1;
  296. ret = nm_write_reg(WAKE_CLK_REG, reg);
  297. if(ret != M2M_SUCCESS)goto ERR1;
  298. }
  299. ret = nm_read_reg_with_ret(HOST_CORT_COMM, &reg);
  300. if(ret != M2M_SUCCESS)goto ERR1;
  301. if(reg & NBIT0)
  302. {
  303. reg &= ~NBIT0;
  304. ret = nm_write_reg(HOST_CORT_COMM, reg);
  305. if(ret != M2M_SUCCESS)goto ERR1;
  306. }
  307. ERR1:
  308. return ret;
  309. }
  310. int8_t chip_wake(void)
  311. {
  312. int8_t ret = M2M_SUCCESS;
  313. uint32_t reg = 0, clk_status_reg = 0, trials = 0;
  314. nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg);
  315. ret = nm_read_reg_with_ret(HOST_CORT_COMM, &reg);
  316. if(ret != M2M_SUCCESS)goto _WAKE_EXIT;
  317. if(!(reg & NBIT0))
  318. {
  319. /*USE bit 0 to indicate host wakeup*/
  320. ret = nm_write_reg(HOST_CORT_COMM, reg|NBIT0);
  321. if(ret != M2M_SUCCESS)goto _WAKE_EXIT;
  322. }
  323. ret = nm_read_reg_with_ret(WAKE_CLK_REG, &reg);
  324. if(ret != M2M_SUCCESS) goto _WAKE_EXIT;
  325. /* Set bit 1 */
  326. if(!(reg & NBIT1))
  327. {
  328. ret = nm_write_reg(WAKE_CLK_REG, reg | NBIT1);
  329. if(ret != M2M_SUCCESS) goto _WAKE_EXIT;
  330. }
  331. do
  332. {
  333. ret = nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg);
  334. if(ret != M2M_SUCCESS) {
  335. M2M_ERR("Bus error (5).%d %" PRIx32 "\n", ret, clk_status_reg);
  336. goto _WAKE_EXIT;
  337. }
  338. if (clk_status_reg & NBIT2) {
  339. break;
  340. }
  341. nm_sleep(2);
  342. trials++;
  343. if (trials > WAKEUP_TRIALS)
  344. {
  345. M2M_ERR("Failed to wakeup the chip\n");
  346. ret = M2M_ERR_TIME_OUT;
  347. goto _WAKE_EXIT;
  348. }
  349. } while(1);
  350. /* Workaround sometimes spi fail to read clock regs after reading/writing clockless registers */
  351. //nm_bus_reset();
  352. _WAKE_EXIT:
  353. return ret;
  354. }
  355. int8_t chip_reset_and_cpu_halt(void)
  356. {
  357. int8_t ret = M2M_SUCCESS;
  358. uint32_t reg = 0;
  359. ret = chip_wake();
  360. if (ret != M2M_SUCCESS) {
  361. return ret;
  362. }
  363. chip_reset();
  364. ret = nm_read_reg_with_ret(0x1118, &reg);
  365. if (M2M_SUCCESS != ret) {
  366. ret = M2M_ERR_BUS_FAIL;
  367. M2M_ERR("[nmi start]: fail read reg 0x1118 ...\r\n");
  368. }
  369. reg |= (1 << 0);
  370. ret = nm_write_reg(0x1118, reg);
  371. ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, &reg);
  372. if ((reg & (1ul << 10)) == (1ul << 10)) {
  373. reg &= ~(1ul << 10);
  374. ret += nm_write_reg(NMI_GLB_RESET_0, reg);
  375. ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, &reg);
  376. }
  377. nm_write_reg(BOOTROM_REG, 0);
  378. nm_write_reg(NMI_STATE_REG, 0);
  379. nm_write_reg(NMI_REV_REG, 0);
  380. nm_write_reg(NMI_PIN_MUX_0, 0x11111000);
  381. return ret;
  382. }
  383. int8_t chip_reset(void)
  384. {
  385. int8_t ret = M2M_SUCCESS;
  386. ret += nm_write_reg(NMI_GLB_RESET_0, 0);
  387. nm_sleep(50);
  388. return ret;
  389. }
  390. int8_t wait_for_bootrom(uint8_t arg)
  391. {
  392. int8_t ret = M2M_SUCCESS;
  393. uint32_t reg = 0, cnt = 0;
  394. uint32_t u32GpReg1 = 0;
  395. reg = 0;
  396. while(1) {
  397. reg = nm_read_reg(0x1014); /* wait for efuse loading done */
  398. if (reg & 0x80000000) {
  399. break;
  400. }
  401. nm_sleep(1); /* Removing this can cause a bus error. */
  402. }
  403. reg = nm_read_reg(M2M_WAIT_FOR_HOST_REG);
  404. reg &= 0x1;
  405. /* check if waiting for the host will be skipped or not */
  406. if(reg == 0)
  407. {
  408. while(reg != M2M_FINISH_BOOT_ROM)
  409. {
  410. nm_sleep(1);
  411. reg = nm_read_reg(BOOTROM_REG);
  412. if (++cnt > TIMEOUT)
  413. {
  414. M2M_DBG("failed to load firmware from flash.\r\n");
  415. ret = M2M_ERR_INIT;
  416. goto ERR2;
  417. }
  418. }
  419. }
  420. if (M2M_WIFI_MODE_CONFIG == arg) {
  421. nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE);
  422. } else if (M2M_WIFI_MODE_ETHERNET == arg) {
  423. u32GpReg1 = rHAVE_ETHERNET_MODE_BIT;
  424. } else {
  425. /*bypass this step*/
  426. }
  427. if (REV(nmi_get_chipid()) == REV_3A0)
  428. {
  429. chip_apply_conf(u32GpReg1 | rHAVE_USE_PMU_BIT);
  430. }
  431. else
  432. {
  433. chip_apply_conf(u32GpReg1);
  434. }
  435. nm_write_reg(BOOTROM_REG, M2M_START_FIRMWARE);
  436. #ifdef __ROM_TEST__
  437. rom_test();
  438. #endif /* __ROM_TEST__ */
  439. ERR2:
  440. return ret;
  441. }
  442. int8_t wait_for_firmware_start(uint8_t arg)
  443. {
  444. int8_t ret = M2M_SUCCESS;
  445. uint32_t reg = 0, cnt = 0;
  446. volatile uint32_t regAddress = NMI_STATE_REG;
  447. volatile uint32_t checkValue = M2M_FINISH_INIT_STATE;
  448. if(M2M_WIFI_MODE_CONFIG == arg) {
  449. regAddress = NMI_REV_REG;
  450. checkValue = M2M_ATE_FW_START_VALUE;//M2M_ATE_FW_IS_UP_VALUE;
  451. } else {
  452. /*bypass this step*/
  453. }
  454. while (checkValue != reg)
  455. {
  456. nm_sleep(2); /* Removing this can cause a bus error. */
  457. M2M_DBG("%x %x %x\r\n", (unsigned int)nm_read_reg(0x108c), (unsigned int)nm_read_reg(0x108c), (unsigned int)nm_read_reg(0x14A0));
  458. if (nm_read_reg_with_ret(regAddress, &reg) != M2M_SUCCESS)
  459. {
  460. // ensure reg != checkValue
  461. reg = !checkValue;
  462. }
  463. if (++cnt > TIMEOUT)
  464. {
  465. M2M_DBG("Time out for wait firmware Run\r\n");
  466. ret = M2M_ERR_INIT;
  467. goto ERR;
  468. }
  469. }
  470. if (M2M_FINISH_INIT_STATE == checkValue)
  471. {
  472. nm_write_reg(NMI_STATE_REG, 0);
  473. }
  474. ERR:
  475. return ret;
  476. }
  477. int8_t chip_deinit(void)
  478. {
  479. uint32_t reg = 0;
  480. int8_t ret;
  481. uint8_t timeout = 10;
  482. /**
  483. stop the firmware, need a re-download
  484. **/
  485. ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, &reg);
  486. if (ret != M2M_SUCCESS) {
  487. M2M_ERR("failed to de-initialize\r\n");
  488. }
  489. reg &= ~(1 << 10);
  490. ret = nm_write_reg(NMI_GLB_RESET_0, reg);
  491. if (ret != M2M_SUCCESS) {
  492. M2M_ERR("Error while writing reg\r\n");
  493. return ret;
  494. }
  495. do {
  496. ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, &reg);
  497. if (ret != M2M_SUCCESS) {
  498. M2M_ERR("Error while reading reg\r\n");
  499. return ret;
  500. }
  501. /*Workaround to ensure that the chip is actually reset*/
  502. if ((reg & (1 << 10))) {
  503. M2M_DBG("Bit 10 not reset retry %d\r\n", timeout);
  504. reg &= ~(1 << 10);
  505. ret = nm_write_reg(NMI_GLB_RESET_0, reg);
  506. timeout--;
  507. } else {
  508. break;
  509. }
  510. } while (timeout);
  511. return ret;
  512. }
  513. int8_t set_gpio_dir(uint8_t gpio, uint8_t dir)
  514. {
  515. uint32_t val32;
  516. int8_t ret;
  517. ret = nm_read_reg_with_ret(0x20108, &val32);
  518. if(ret != M2M_SUCCESS) goto _EXIT;
  519. if(dir) {
  520. val32 |= (1ul << gpio);
  521. } else {
  522. val32 &= ~(1ul << gpio);
  523. }
  524. ret = nm_write_reg(0x20108, val32);
  525. _EXIT:
  526. return ret;
  527. }
  528. int8_t set_gpio_val(uint8_t gpio, uint8_t val)
  529. {
  530. uint32_t val32;
  531. int8_t ret;
  532. ret = nm_read_reg_with_ret(0x20100, &val32);
  533. if(ret != M2M_SUCCESS) goto _EXIT;
  534. if(val) {
  535. val32 |= (1ul << gpio);
  536. } else {
  537. val32 &= ~(1ul << gpio);
  538. }
  539. ret = nm_write_reg(0x20100, val32);
  540. _EXIT:
  541. return ret;
  542. }
  543. int8_t get_gpio_val(uint8_t gpio, uint8_t* val)
  544. {
  545. uint32_t val32;
  546. int8_t ret;
  547. ret = nm_read_reg_with_ret(0x20104, &val32);
  548. if(ret != M2M_SUCCESS) goto _EXIT;
  549. *val = (uint8_t)((val32 >> gpio) & 0x01);
  550. _EXIT:
  551. return ret;
  552. }
  553. int8_t pullup_ctrl(uint32_t pinmask, uint8_t enable)
  554. {
  555. int8_t s8Ret;
  556. uint32_t val32;
  557. s8Ret = nm_read_reg_with_ret(0x142c, &val32);
  558. if (s8Ret != M2M_SUCCESS) {
  559. M2M_ERR("[pullup_ctrl]: failed to read\r\n");
  560. goto _EXIT;
  561. }
  562. if (enable) {
  563. val32 &= ~pinmask;
  564. } else {
  565. val32 |= pinmask;
  566. }
  567. s8Ret = nm_write_reg(0x142c, val32);
  568. if (s8Ret != M2M_SUCCESS) {
  569. M2M_ERR("[pullup_ctrl]: failed to write\r\n");
  570. goto _EXIT;
  571. }
  572. _EXIT:
  573. return s8Ret;
  574. }
  575. int8_t nmi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid)
  576. {
  577. int8_t ret;
  578. uint32_t u32RegValue;
  579. uint8_t mac[6];
  580. tstrGpRegs strgp = {0};
  581. ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue);
  582. if (ret != M2M_SUCCESS) goto _EXIT_ERR;
  583. ret = nm_read_block(u32RegValue|0x30000,(uint8_t*)&strgp,sizeof(tstrGpRegs));
  584. if (ret != M2M_SUCCESS) goto _EXIT_ERR;
  585. u32RegValue = strgp.u32Mac_efuse_mib;
  586. if (!EFUSED_MAC(u32RegValue)) {
  587. M2M_DBG("Default MAC\r\n");
  588. memset(pu8MacAddr, 0, 6);
  589. goto _EXIT_ERR;
  590. }
  591. M2M_DBG("OTP MAC\r\n");
  592. u32RegValue >>=16;
  593. ret = nm_read_block(u32RegValue|0x30000, mac, 6);
  594. memcpy(pu8MacAddr, mac, 6);
  595. if (pu8IsValid) *pu8IsValid = 1;
  596. return ret;
  597. _EXIT_ERR:
  598. if (pu8IsValid) *pu8IsValid = 0;
  599. return ret;
  600. }
  601. int8_t nmi_get_mac_address(uint8_t *pu8MacAddr)
  602. {
  603. int8_t ret;
  604. uint32_t u32RegValue;
  605. uint8_t mac[6];
  606. tstrGpRegs strgp = {0};
  607. ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue);
  608. if (ret != M2M_SUCCESS) goto _EXIT_ERR;
  609. ret = nm_read_block(u32RegValue|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs));
  610. if (ret != M2M_SUCCESS) goto _EXIT_ERR;
  611. u32RegValue = strgp.u32Mac_efuse_mib;
  612. u32RegValue &=0x0000ffff;
  613. ret = nm_read_block(u32RegValue|0x30000, mac, 6);
  614. memcpy(pu8MacAddr, mac, 6);
  615. _EXIT_ERR:
  616. return ret;
  617. }
  618. //DOM-IGNORE-END