選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

416 行
9.6 KiB

  1. /**
  2. *
  3. * \file
  4. *
  5. * \brief This module contains WINC3400 M2M driver APIs implementation.
  6. *
  7. * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries.
  8. *
  9. * \asf_license_start
  10. *
  11. * \page License
  12. *
  13. * Subject to your compliance with these terms, you may use Microchip
  14. * software and any derivatives exclusively with Microchip products.
  15. * It is your responsibility to comply with third party license terms applicable
  16. * to your use of third party software (including open source software) that
  17. * may accompany Microchip software.
  18. *
  19. * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
  20. * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
  21. * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
  22. * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
  23. * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
  24. * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
  25. * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
  26. * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
  27. * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
  28. * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
  29. * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
  30. *
  31. * \asf_license_stop
  32. *
  33. */
  34. #include "common/include/nm_common.h"
  35. #include "driver/source/nmbus.h"
  36. #include "bsp/include/nm_bsp.h"
  37. #include "driver/source/nmdrv.h"
  38. #include "driver/source/nmasic.h"
  39. #include "driver/include/m2m_types.h"
  40. #ifdef CONF_WINC_USE_SPI
  41. #include "driver/source/nmspi.h"
  42. #endif
  43. /**
  44. * @fn nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo);
  45. * @brief Get Hif info of images in both partitions (Firmware and Ota).
  46. * @param [out] pu16FwHifInfo
  47. * Pointer holding Hif info of image in the active partition.
  48. * @param [out] pu16OtaHifInfo
  49. * Pointer holding Hif info of image in the inactive partition.
  50. * @return ZERO in case of success and Negative error code in case of failure
  51. */
  52. sint8 nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo)
  53. {
  54. sint8 ret = M2M_SUCCESS;
  55. uint32 reg = 0;
  56. ret = nm_read_reg_with_ret(NMI_REV_REG, &reg);
  57. if(ret == M2M_SUCCESS)
  58. {
  59. if(pu16FwHifInfo != NULL)
  60. {
  61. *pu16FwHifInfo = (uint16)reg;
  62. }
  63. if(pu16OtaHifInfo)
  64. {
  65. *pu16OtaHifInfo = (uint16)(reg>>16);
  66. }
  67. }
  68. return ret;
  69. }
  70. /**
  71. * @fn nm_get_firmware_full_info(tstrM2mRev* M2mRev)
  72. * @brief Get Firmware version info
  73. * @param [out] M2mRev
  74. * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters
  75. * @version 1.0
  76. */
  77. sint8 nm_get_firmware_full_info(tstrM2mRev* pstrRev)
  78. {
  79. uint16 fw_hif_info = 0;
  80. uint32 reg = 0;
  81. sint8 ret = M2M_SUCCESS;
  82. tstrGpRegs strgp = {0};
  83. m2m_memset((uint8*)pstrRev,0,sizeof(tstrM2mRev));
  84. nm_get_hif_info(&fw_hif_info, NULL);
  85. M2M_INFO("Fw HIF: %04x\n", fw_hif_info);
  86. if(M2M_GET_HIF_BLOCK(fw_hif_info) == M2M_HIF_BLOCK_VALUE)
  87. {
  88. ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &reg);
  89. if(ret == M2M_SUCCESS)
  90. {
  91. if(reg != 0)
  92. {
  93. ret = nm_read_block(reg|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs));
  94. if(ret == M2M_SUCCESS)
  95. {
  96. reg = strgp.u32Firmware_Ota_rev;
  97. reg &= 0x0000ffff;
  98. if(reg != 0)
  99. {
  100. ret = nm_read_block(reg|0x30000,(uint8*)pstrRev,sizeof(tstrM2mRev));
  101. if(ret == M2M_SUCCESS)
  102. {
  103. M2M_INFO("Firmware HIF (%u) : %u.%u \n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo));
  104. M2M_INFO("Firmware ver : %u.%u.%u \n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch);
  105. M2M_INFO("Firmware Build %s Time %s\n", pstrRev->BuildDate, pstrRev->BuildTime);
  106. /* Check Hif info is consistent */
  107. if(fw_hif_info != pstrRev->u16FirmwareHifInfo)
  108. {
  109. ret = M2M_ERR_FAIL;
  110. M2M_ERR("Inconsistent Firmware Version\n");
  111. }
  112. }
  113. }
  114. else
  115. {
  116. ret = M2M_ERR_FAIL;
  117. }
  118. }
  119. }
  120. else
  121. {
  122. ret = M2M_ERR_FAIL;
  123. }
  124. }
  125. }
  126. else
  127. {
  128. ret = M2M_ERR_FAIL;
  129. }
  130. if(ret != M2M_SUCCESS)
  131. {
  132. M2M_ERR("Unknown Firmware Version\n");
  133. }
  134. return ret;
  135. }
  136. /**
  137. * @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev)
  138. * @brief Get Firmware version info
  139. * @param [out] M2mRev
  140. * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters
  141. * @version 1.0
  142. */
  143. sint8 nm_get_ota_firmware_info(tstrM2mRev* pstrRev)
  144. {
  145. uint16 ota_hif_info = 0;
  146. uint32 reg = 0;
  147. sint8 ret = M2M_SUCCESS;
  148. tstrGpRegs strgp = {0};
  149. m2m_memset((uint8*)pstrRev,0,sizeof(tstrM2mRev));
  150. nm_get_hif_info(NULL, &ota_hif_info);
  151. M2M_INFO("Ota HIF: %04x\n", ota_hif_info);
  152. if(M2M_GET_HIF_BLOCK(ota_hif_info) == M2M_HIF_BLOCK_VALUE)
  153. {
  154. ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &reg);
  155. if(ret == M2M_SUCCESS)
  156. {
  157. if(reg != 0)
  158. {
  159. ret = nm_read_block(reg|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs));
  160. if(ret == M2M_SUCCESS)
  161. {
  162. reg = strgp.u32Firmware_Ota_rev;
  163. reg >>= 16;
  164. if(reg != 0)
  165. {
  166. ret = nm_read_block(reg|0x30000,(uint8*)pstrRev,sizeof(tstrM2mRev));
  167. if(ret == M2M_SUCCESS)
  168. {
  169. M2M_INFO("OTA HIF (%u) : %u.%u \n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo));
  170. M2M_INFO("OTA ver : %u.%u.%u \n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch);
  171. M2M_INFO("OTA Build %s Time %s\n", pstrRev->BuildDate, pstrRev->BuildTime);
  172. /* Check Hif info is consistent */
  173. if(ota_hif_info != pstrRev->u16FirmwareHifInfo)
  174. {
  175. ret = M2M_ERR_FAIL;
  176. M2M_ERR("Inconsistent OTA Version\n");
  177. }
  178. }
  179. }
  180. else
  181. {
  182. ret = M2M_ERR_FAIL;
  183. }
  184. }
  185. }
  186. else
  187. {
  188. ret = M2M_ERR_FAIL;
  189. }
  190. }
  191. }
  192. else
  193. {
  194. ret = M2M_ERR_FAIL;
  195. }
  196. if(ret != M2M_SUCCESS)
  197. {
  198. M2M_INFO("No valid Ota image\n");
  199. }
  200. return ret;
  201. }
  202. /*
  203. * @fn nm_drv_init_download_mode
  204. * @brief Initialize NMC1000 driver
  205. * @return M2M_SUCCESS in case of success and Negative error code in case of failure
  206. * @param [in] arg
  207. * Generic argument
  208. * @author Viswanathan Murugesan
  209. * @date 10 Oct 2014
  210. * @version 1.0
  211. */
  212. sint8 nm_drv_init_download_mode(uint32 req_serial_number)
  213. {
  214. sint8 ret = M2M_SUCCESS;
  215. ret = nm_bus_iface_init(NULL, req_serial_number);
  216. if (M2M_SUCCESS != ret) {
  217. M2M_ERR("[nmi start]: fail init bus\n");
  218. goto ERR1;
  219. }
  220. #ifdef CONF_WINC_USE_SPI
  221. /* Must do this after global reset to set SPI data packet size. */
  222. nm_spi_init();
  223. #endif
  224. M2M_INFO("Chip ID %lx\n", nmi_get_chipid());
  225. /*disable all interrupt in ROM (to disable uart) in 2b0 chip*/
  226. nm_write_reg(0x20300,0);
  227. ERR1:
  228. return ret;
  229. }
  230. sint8 nm_drv_init_hold(uint32 req_serial_number)
  231. {
  232. sint8 ret = M2M_SUCCESS;
  233. ret = nm_bus_iface_init(NULL, req_serial_number);
  234. if (M2M_SUCCESS != ret) {
  235. M2M_ERR("[nmi start]: fail init bus\n");
  236. goto ERR1;
  237. }
  238. #ifdef BUS_ONLY
  239. return;
  240. #endif
  241. ret = chip_wake();
  242. nm_bsp_sleep(10);
  243. if (M2M_SUCCESS != ret) {
  244. M2M_ERR("[nmi start]: fail chip_wakeup\n");
  245. goto ERR2;
  246. }
  247. /**
  248. Go...
  249. **/
  250. //JFM 2021-02-07
  251. //chip_reset disbled because it failed. Probably because not RTC installed on the board
  252. //retry when available...
  253. // ret = chip_reset();
  254. // if (M2M_SUCCESS != ret) {
  255. // goto ERR2;
  256. // }
  257. M2M_INFO("Chip ID %lx\n", nmi_get_chipid());
  258. #ifdef CONF_WINC_USE_SPI
  259. /* Must do this after global reset to set SPI data packet size. */
  260. nm_spi_init();
  261. #endif
  262. /*return power save to default value*/
  263. chip_idle();
  264. return ret;
  265. ERR2:
  266. nm_bus_iface_deinit();
  267. ERR1:
  268. return ret;
  269. }
  270. sint8 nm_drv_init_start(void * arg)
  271. {
  272. sint8 ret = M2M_SUCCESS;
  273. uint8 u8Mode = M2M_WIFI_MODE_NORMAL;
  274. if(NULL != arg) {
  275. if(M2M_WIFI_MODE_CONFIG == *((uint8 *)arg)) {
  276. u8Mode = M2M_WIFI_MODE_CONFIG;
  277. } else {
  278. /*continue running*/
  279. }
  280. } else {
  281. /*continue running*/
  282. }
  283. ret = cpu_start();
  284. if (M2M_SUCCESS != ret) {
  285. goto ERR2;
  286. }
  287. ret = wait_for_bootrom(u8Mode);
  288. if (M2M_SUCCESS != ret) {
  289. goto ERR2;
  290. }
  291. ret = wait_for_firmware_start(u8Mode);
  292. if (M2M_SUCCESS != ret) {
  293. goto ERR2;
  294. }
  295. if(M2M_WIFI_MODE_CONFIG == u8Mode) {
  296. goto ERR1;
  297. } else {
  298. /*continue running*/
  299. }
  300. ret = enable_interrupts();
  301. if (M2M_SUCCESS != ret) {
  302. M2M_ERR("failed to enable interrupts..\n");
  303. goto ERR2;
  304. }
  305. return ret;
  306. ERR2:
  307. nm_bus_iface_deinit();
  308. #ifdef CONF_WINC_USE_SPI
  309. nm_spi_deinit();
  310. #endif
  311. ERR1:
  312. return ret;
  313. }
  314. /*
  315. * @fn nm_drv_init
  316. * @brief Initialize NMC1000 driver
  317. * @return M2M_SUCCESS in case of success and Negative error code in case of failure
  318. * @param [in] arg - Generic argument passed on to nm_drv_init_start
  319. * @author M. Abdelmawla
  320. * @date 15 July 2012
  321. * @version 1.0
  322. */
  323. sint8 nm_drv_init(void * arg, uint32 req_serial_number)
  324. {
  325. sint8 ret = M2M_SUCCESS;
  326. ret = nm_drv_init_hold(req_serial_number);
  327. if(ret == M2M_SUCCESS)
  328. ret = nm_drv_init_start(arg);
  329. return ret;
  330. }
  331. /*
  332. * @fn nm_drv_deinit
  333. * @brief Deinitialize NMC1000 driver
  334. * @author M. Abdelmawla
  335. * @date 17 July 2012
  336. * @version 1.0
  337. */
  338. sint8 nm_drv_deinit(void * arg)
  339. {
  340. sint8 ret;
  341. ret = chip_deinit();
  342. if (M2M_SUCCESS != ret) {
  343. M2M_ERR("[nmi stop]: chip_deinit fail\n");
  344. goto ERR1;
  345. }
  346. ret = nm_bus_iface_deinit();
  347. if (M2M_SUCCESS != ret) {
  348. M2M_ERR("[nmi stop]: fail init bus\n");
  349. goto ERR1;
  350. }
  351. #ifdef CONF_WINC_USE_SPI
  352. /* Must do this after global reset to set SPI data packet size. */
  353. nm_spi_deinit();
  354. #endif
  355. ERR1:
  356. return ret;
  357. }
  358. /**
  359. * @fn nm_cpu_start(void)
  360. * @brief Start CPU from the WINC module
  361. * @return ZERO in case of success and Negative error code in case of failure
  362. */
  363. sint8 nm_cpu_start(void)
  364. {
  365. sint8 ret;
  366. ret = cpu_start();
  367. return ret;
  368. }