You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

662 lines
18 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. /**
  2. ******************************************************************************
  3. * @file lan8742.c
  4. * @author MCD Application Team
  5. * @brief This file provides a set of functions needed to manage the LAN742
  6. * PHY devices.
  7. ******************************************************************************
  8. * @attention
  9. *
  10. * Copyright (c) 2017 STMicroelectronics.
  11. * All rights reserved.
  12. *
  13. * This software is licensed under terms that can be found in the LICENSE file
  14. * in the root directory of this software component.
  15. * If no LICENSE file comes with this software, it is provided AS-IS.
  16. *
  17. ******************************************************************************
  18. */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "lan8742.h"
  21. /** @addtogroup BSP
  22. * @{
  23. */
  24. /** @addtogroup Component
  25. * @{
  26. */
  27. /** @defgroup LAN8742 LAN8742
  28. * @{
  29. */
  30. /* Private typedef -----------------------------------------------------------*/
  31. /* Private define ------------------------------------------------------------*/
  32. /** @defgroup LAN8742_Private_Defines LAN8742 Private Defines
  33. * @{
  34. */
  35. #define LAN8742_SW_RESET_TO ((uint32_t)500U)
  36. #define LAN8742_INIT_TO ((uint32_t)2000U)
  37. #define LAN8742_MAX_DEV_ADDR ((uint32_t)31U)
  38. /**
  39. * @}
  40. */
  41. /* Private macro -------------------------------------------------------------*/
  42. /* Private variables ---------------------------------------------------------*/
  43. /* Private function prototypes -----------------------------------------------*/
  44. /* Private functions ---------------------------------------------------------*/
  45. /** @defgroup LAN8742_Private_Functions LAN8742 Private Functions
  46. * @{
  47. */
  48. /**
  49. * @brief Register IO functions to component object
  50. * @param pObj: device object of LAN8742_Object_t.
  51. * @param ioctx: holds device IO functions.
  52. * @retval LAN8742_STATUS_OK if OK
  53. * LAN8742_STATUS_ERROR if missing mandatory function
  54. */
  55. int32_t LAN8742_RegisterBusIO(lan8742_Object_t *pObj, lan8742_IOCtx_t *ioctx)
  56. {
  57. if(!pObj || !ioctx->ReadReg || !ioctx->WriteReg || !ioctx->GetTick)
  58. {
  59. return LAN8742_STATUS_ERROR;
  60. }
  61. pObj->IO.Init = ioctx->Init;
  62. pObj->IO.DeInit = ioctx->DeInit;
  63. pObj->IO.ReadReg = ioctx->ReadReg;
  64. pObj->IO.WriteReg = ioctx->WriteReg;
  65. pObj->IO.GetTick = ioctx->GetTick;
  66. return LAN8742_STATUS_OK;
  67. }
  68. /**
  69. * @brief Initialize the lan8742 and configure the needed hardware resources
  70. * @param pObj: device object LAN8742_Object_t.
  71. * @retval LAN8742_STATUS_OK if OK
  72. * LAN8742_STATUS_ADDRESS_ERROR if cannot find device address
  73. * LAN8742_STATUS_READ_ERROR if cannot read register
  74. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  75. * LAN8742_STATUS_RESET_TIMEOUT if cannot perform a software reset
  76. */
  77. int32_t LAN8742_Init(lan8742_Object_t *pObj)
  78. {
  79. uint32_t tickstart = 0, regvalue = 0, addr = 0;
  80. int32_t status = LAN8742_STATUS_OK;
  81. if(pObj->Is_Initialized == 0)
  82. {
  83. if(pObj->IO.Init != 0)
  84. {
  85. /* GPIO and Clocks initialization */
  86. pObj->IO.Init();
  87. }
  88. /* for later check */
  89. pObj->DevAddr = LAN8742_MAX_DEV_ADDR + 1;
  90. /* Get the device address from special mode register */
  91. for(addr = 0; addr <= LAN8742_MAX_DEV_ADDR; addr ++)
  92. {
  93. if(pObj->IO.ReadReg(addr, LAN8742_SMR, &regvalue) < 0)
  94. {
  95. status = LAN8742_STATUS_READ_ERROR;
  96. /* Can't read from this device address
  97. continue with next address */
  98. continue;
  99. }
  100. if((regvalue & LAN8742_SMR_PHY_ADDR) == addr)
  101. {
  102. pObj->DevAddr = addr;
  103. status = LAN8742_STATUS_OK;
  104. break;
  105. }
  106. }
  107. if(pObj->DevAddr > LAN8742_MAX_DEV_ADDR)
  108. {
  109. status = LAN8742_STATUS_ADDRESS_ERROR;
  110. }
  111. /* if device address is matched */
  112. if(status == LAN8742_STATUS_OK)
  113. {
  114. /* set a software reset */
  115. if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, LAN8742_BCR_SOFT_RESET) >= 0)
  116. {
  117. /* get software reset status */
  118. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &regvalue) >= 0)
  119. {
  120. tickstart = pObj->IO.GetTick();
  121. /* wait until software reset is done or timeout occurred */
  122. while(regvalue & LAN8742_BCR_SOFT_RESET)
  123. {
  124. if((pObj->IO.GetTick() - tickstart) <= LAN8742_SW_RESET_TO)
  125. {
  126. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &regvalue) < 0)
  127. {
  128. status = LAN8742_STATUS_READ_ERROR;
  129. break;
  130. }
  131. }
  132. else
  133. {
  134. status = LAN8742_STATUS_RESET_TIMEOUT;
  135. break;
  136. }
  137. }
  138. }
  139. else
  140. {
  141. status = LAN8742_STATUS_READ_ERROR;
  142. }
  143. }
  144. else
  145. {
  146. status = LAN8742_STATUS_WRITE_ERROR;
  147. }
  148. }
  149. }
  150. if(status == LAN8742_STATUS_OK)
  151. {
  152. tickstart = pObj->IO.GetTick();
  153. /* Wait for 2s to perform initialization */
  154. while((pObj->IO.GetTick() - tickstart) <= LAN8742_INIT_TO)
  155. {
  156. }
  157. pObj->Is_Initialized = 1;
  158. }
  159. return status;
  160. }
  161. /**
  162. * @brief De-Initialize the lan8742 and it's hardware resources
  163. * @param pObj: device object LAN8742_Object_t.
  164. * @retval None
  165. */
  166. int32_t LAN8742_DeInit(lan8742_Object_t *pObj)
  167. {
  168. if(pObj->Is_Initialized)
  169. {
  170. if(pObj->IO.DeInit != 0)
  171. {
  172. if(pObj->IO.DeInit() < 0)
  173. {
  174. return LAN8742_STATUS_ERROR;
  175. }
  176. }
  177. pObj->Is_Initialized = 0;
  178. }
  179. return LAN8742_STATUS_OK;
  180. }
  181. /**
  182. * @brief Disable the LAN8742 power down mode.
  183. * @param pObj: device object LAN8742_Object_t.
  184. * @retval LAN8742_STATUS_OK if OK
  185. * LAN8742_STATUS_READ_ERROR if cannot read register
  186. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  187. */
  188. int32_t LAN8742_DisablePowerDownMode(lan8742_Object_t *pObj)
  189. {
  190. uint32_t readval = 0;
  191. int32_t status = LAN8742_STATUS_OK;
  192. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &readval) >= 0)
  193. {
  194. readval &= ~LAN8742_BCR_POWER_DOWN;
  195. /* Apply configuration */
  196. if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, readval) < 0)
  197. {
  198. status = LAN8742_STATUS_WRITE_ERROR;
  199. }
  200. }
  201. else
  202. {
  203. status = LAN8742_STATUS_READ_ERROR;
  204. }
  205. return status;
  206. }
  207. /**
  208. * @brief Enable the LAN8742 power down mode.
  209. * @param pObj: device object LAN8742_Object_t.
  210. * @retval LAN8742_STATUS_OK if OK
  211. * LAN8742_STATUS_READ_ERROR if cannot read register
  212. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  213. */
  214. int32_t LAN8742_EnablePowerDownMode(lan8742_Object_t *pObj)
  215. {
  216. uint32_t readval = 0;
  217. int32_t status = LAN8742_STATUS_OK;
  218. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &readval) >= 0)
  219. {
  220. readval |= LAN8742_BCR_POWER_DOWN;
  221. /* Apply configuration */
  222. if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, readval) < 0)
  223. {
  224. status = LAN8742_STATUS_WRITE_ERROR;
  225. }
  226. }
  227. else
  228. {
  229. status = LAN8742_STATUS_READ_ERROR;
  230. }
  231. return status;
  232. }
  233. /**
  234. * @brief Start the auto negotiation process.
  235. * @param pObj: device object LAN8742_Object_t.
  236. * @retval LAN8742_STATUS_OK if OK
  237. * LAN8742_STATUS_READ_ERROR if cannot read register
  238. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  239. */
  240. int32_t LAN8742_StartAutoNego(lan8742_Object_t *pObj)
  241. {
  242. uint32_t readval = 0;
  243. int32_t status = LAN8742_STATUS_OK;
  244. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &readval) >= 0)
  245. {
  246. readval |= LAN8742_BCR_AUTONEGO_EN;
  247. /* Apply configuration */
  248. if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, readval) < 0)
  249. {
  250. status = LAN8742_STATUS_WRITE_ERROR;
  251. }
  252. }
  253. else
  254. {
  255. status = LAN8742_STATUS_READ_ERROR;
  256. }
  257. return status;
  258. }
  259. /**
  260. * @brief Get the link state of LAN8742 device.
  261. * @param pObj: Pointer to device object.
  262. * @param pLinkState: Pointer to link state
  263. * @retval LAN8742_STATUS_LINK_DOWN if link is down
  264. * LAN8742_STATUS_AUTONEGO_NOTDONE if Auto nego not completed
  265. * LAN8742_STATUS_100MBITS_FULLDUPLEX if 100Mb/s FD
  266. * LAN8742_STATUS_100MBITS_HALFDUPLEX if 100Mb/s HD
  267. * LAN8742_STATUS_10MBITS_FULLDUPLEX if 10Mb/s FD
  268. * LAN8742_STATUS_10MBITS_HALFDUPLEX if 10Mb/s HD
  269. * LAN8742_STATUS_READ_ERROR if cannot read register
  270. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  271. */
  272. int32_t LAN8742_GetLinkState(lan8742_Object_t *pObj)
  273. {
  274. uint32_t readval = 0;
  275. /* Read Status register */
  276. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BSR, &readval) < 0)
  277. {
  278. return LAN8742_STATUS_READ_ERROR;
  279. }
  280. /* Read Status register again */
  281. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BSR, &readval) < 0)
  282. {
  283. return LAN8742_STATUS_READ_ERROR;
  284. }
  285. if((readval & LAN8742_BSR_LINK_STATUS) == 0)
  286. {
  287. /* Return Link Down status */
  288. return LAN8742_STATUS_LINK_DOWN;
  289. }
  290. /* Check Auto negotiation */
  291. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &readval) < 0)
  292. {
  293. return LAN8742_STATUS_READ_ERROR;
  294. }
  295. if((readval & LAN8742_BCR_AUTONEGO_EN) != LAN8742_BCR_AUTONEGO_EN)
  296. {
  297. if(((readval & LAN8742_BCR_SPEED_SELECT) == LAN8742_BCR_SPEED_SELECT) && ((readval & LAN8742_BCR_DUPLEX_MODE) == LAN8742_BCR_DUPLEX_MODE))
  298. {
  299. return LAN8742_STATUS_100MBITS_FULLDUPLEX;
  300. }
  301. else if ((readval & LAN8742_BCR_SPEED_SELECT) == LAN8742_BCR_SPEED_SELECT)
  302. {
  303. return LAN8742_STATUS_100MBITS_HALFDUPLEX;
  304. }
  305. else if ((readval & LAN8742_BCR_DUPLEX_MODE) == LAN8742_BCR_DUPLEX_MODE)
  306. {
  307. return LAN8742_STATUS_10MBITS_FULLDUPLEX;
  308. }
  309. else
  310. {
  311. return LAN8742_STATUS_10MBITS_HALFDUPLEX;
  312. }
  313. }
  314. else /* Auto Nego enabled */
  315. {
  316. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_PHYSCSR, &readval) < 0)
  317. {
  318. return LAN8742_STATUS_READ_ERROR;
  319. }
  320. /* Check if auto nego not done */
  321. if((readval & LAN8742_PHYSCSR_AUTONEGO_DONE) == 0)
  322. {
  323. return LAN8742_STATUS_AUTONEGO_NOTDONE;
  324. }
  325. if((readval & LAN8742_PHYSCSR_HCDSPEEDMASK) == LAN8742_PHYSCSR_100BTX_FD)
  326. {
  327. return LAN8742_STATUS_100MBITS_FULLDUPLEX;
  328. }
  329. else if ((readval & LAN8742_PHYSCSR_HCDSPEEDMASK) == LAN8742_PHYSCSR_100BTX_HD)
  330. {
  331. return LAN8742_STATUS_100MBITS_HALFDUPLEX;
  332. }
  333. else if ((readval & LAN8742_PHYSCSR_HCDSPEEDMASK) == LAN8742_PHYSCSR_10BT_FD)
  334. {
  335. return LAN8742_STATUS_10MBITS_FULLDUPLEX;
  336. }
  337. else
  338. {
  339. return LAN8742_STATUS_10MBITS_HALFDUPLEX;
  340. }
  341. }
  342. }
  343. /**
  344. * @brief Set the link state of LAN8742 device.
  345. * @param pObj: Pointer to device object.
  346. * @param pLinkState: link state can be one of the following
  347. * LAN8742_STATUS_100MBITS_FULLDUPLEX if 100Mb/s FD
  348. * LAN8742_STATUS_100MBITS_HALFDUPLEX if 100Mb/s HD
  349. * LAN8742_STATUS_10MBITS_FULLDUPLEX if 10Mb/s FD
  350. * LAN8742_STATUS_10MBITS_HALFDUPLEX if 10Mb/s HD
  351. * @retval LAN8742_STATUS_OK if OK
  352. * LAN8742_STATUS_ERROR if parameter error
  353. * LAN8742_STATUS_READ_ERROR if cannot read register
  354. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  355. */
  356. int32_t LAN8742_SetLinkState(lan8742_Object_t *pObj, uint32_t LinkState)
  357. {
  358. uint32_t bcrvalue = 0;
  359. int32_t status = LAN8742_STATUS_OK;
  360. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &bcrvalue) >= 0)
  361. {
  362. /* Disable link config (Auto nego, speed and duplex) */
  363. bcrvalue &= ~(LAN8742_BCR_AUTONEGO_EN | LAN8742_BCR_SPEED_SELECT | LAN8742_BCR_DUPLEX_MODE);
  364. if(LinkState == LAN8742_STATUS_100MBITS_FULLDUPLEX)
  365. {
  366. bcrvalue |= (LAN8742_BCR_SPEED_SELECT | LAN8742_BCR_DUPLEX_MODE);
  367. }
  368. else if (LinkState == LAN8742_STATUS_100MBITS_HALFDUPLEX)
  369. {
  370. bcrvalue |= LAN8742_BCR_SPEED_SELECT;
  371. }
  372. else if (LinkState == LAN8742_STATUS_10MBITS_FULLDUPLEX)
  373. {
  374. bcrvalue |= LAN8742_BCR_DUPLEX_MODE;
  375. }
  376. else
  377. {
  378. /* Wrong link status parameter */
  379. status = LAN8742_STATUS_ERROR;
  380. }
  381. }
  382. else
  383. {
  384. status = LAN8742_STATUS_READ_ERROR;
  385. }
  386. if(status == LAN8742_STATUS_OK)
  387. {
  388. /* Apply configuration */
  389. if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, bcrvalue) < 0)
  390. {
  391. status = LAN8742_STATUS_WRITE_ERROR;
  392. }
  393. }
  394. return status;
  395. }
  396. /**
  397. * @brief Enable loopback mode.
  398. * @param pObj: Pointer to device object.
  399. * @retval LAN8742_STATUS_OK if OK
  400. * LAN8742_STATUS_READ_ERROR if cannot read register
  401. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  402. */
  403. int32_t LAN8742_EnableLoopbackMode(lan8742_Object_t *pObj)
  404. {
  405. uint32_t readval = 0;
  406. int32_t status = LAN8742_STATUS_OK;
  407. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &readval) >= 0)
  408. {
  409. readval |= LAN8742_BCR_LOOPBACK;
  410. /* Apply configuration */
  411. if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, readval) < 0)
  412. {
  413. status = LAN8742_STATUS_WRITE_ERROR;
  414. }
  415. }
  416. else
  417. {
  418. status = LAN8742_STATUS_READ_ERROR;
  419. }
  420. return status;
  421. }
  422. /**
  423. * @brief Disable loopback mode.
  424. * @param pObj: Pointer to device object.
  425. * @retval LAN8742_STATUS_OK if OK
  426. * LAN8742_STATUS_READ_ERROR if cannot read register
  427. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  428. */
  429. int32_t LAN8742_DisableLoopbackMode(lan8742_Object_t *pObj)
  430. {
  431. uint32_t readval = 0;
  432. int32_t status = LAN8742_STATUS_OK;
  433. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &readval) >= 0)
  434. {
  435. readval &= ~LAN8742_BCR_LOOPBACK;
  436. /* Apply configuration */
  437. if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, readval) < 0)
  438. {
  439. status = LAN8742_STATUS_WRITE_ERROR;
  440. }
  441. }
  442. else
  443. {
  444. status = LAN8742_STATUS_READ_ERROR;
  445. }
  446. return status;
  447. }
  448. /**
  449. * @brief Enable IT source.
  450. * @param pObj: Pointer to device object.
  451. * @param Interrupt: IT source to be enabled
  452. * should be a value or a combination of the following:
  453. * LAN8742_WOL_IT
  454. * LAN8742_ENERGYON_IT
  455. * LAN8742_AUTONEGO_COMPLETE_IT
  456. * LAN8742_REMOTE_FAULT_IT
  457. * LAN8742_LINK_DOWN_IT
  458. * LAN8742_AUTONEGO_LP_ACK_IT
  459. * LAN8742_PARALLEL_DETECTION_FAULT_IT
  460. * LAN8742_AUTONEGO_PAGE_RECEIVED_IT
  461. * @retval LAN8742_STATUS_OK if OK
  462. * LAN8742_STATUS_READ_ERROR if cannot read register
  463. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  464. */
  465. int32_t LAN8742_EnableIT(lan8742_Object_t *pObj, uint32_t Interrupt)
  466. {
  467. uint32_t readval = 0;
  468. int32_t status = LAN8742_STATUS_OK;
  469. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_IMR, &readval) >= 0)
  470. {
  471. readval |= Interrupt;
  472. /* Apply configuration */
  473. if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_IMR, readval) < 0)
  474. {
  475. status = LAN8742_STATUS_WRITE_ERROR;
  476. }
  477. }
  478. else
  479. {
  480. status = LAN8742_STATUS_READ_ERROR;
  481. }
  482. return status;
  483. }
  484. /**
  485. * @brief Disable IT source.
  486. * @param pObj: Pointer to device object.
  487. * @param Interrupt: IT source to be disabled
  488. * should be a value or a combination of the following:
  489. * LAN8742_WOL_IT
  490. * LAN8742_ENERGYON_IT
  491. * LAN8742_AUTONEGO_COMPLETE_IT
  492. * LAN8742_REMOTE_FAULT_IT
  493. * LAN8742_LINK_DOWN_IT
  494. * LAN8742_AUTONEGO_LP_ACK_IT
  495. * LAN8742_PARALLEL_DETECTION_FAULT_IT
  496. * LAN8742_AUTONEGO_PAGE_RECEIVED_IT
  497. * @retval LAN8742_STATUS_OK if OK
  498. * LAN8742_STATUS_READ_ERROR if cannot read register
  499. * LAN8742_STATUS_WRITE_ERROR if cannot write to register
  500. */
  501. int32_t LAN8742_DisableIT(lan8742_Object_t *pObj, uint32_t Interrupt)
  502. {
  503. uint32_t readval = 0;
  504. int32_t status = LAN8742_STATUS_OK;
  505. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_IMR, &readval) >= 0)
  506. {
  507. readval &= ~Interrupt;
  508. /* Apply configuration */
  509. if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_IMR, readval) < 0)
  510. {
  511. status = LAN8742_STATUS_WRITE_ERROR;
  512. }
  513. }
  514. else
  515. {
  516. status = LAN8742_STATUS_READ_ERROR;
  517. }
  518. return status;
  519. }
  520. /**
  521. * @brief Clear IT flag.
  522. * @param pObj: Pointer to device object.
  523. * @param Interrupt: IT flag to be cleared
  524. * should be a value or a combination of the following:
  525. * LAN8742_WOL_IT
  526. * LAN8742_ENERGYON_IT
  527. * LAN8742_AUTONEGO_COMPLETE_IT
  528. * LAN8742_REMOTE_FAULT_IT
  529. * LAN8742_LINK_DOWN_IT
  530. * LAN8742_AUTONEGO_LP_ACK_IT
  531. * LAN8742_PARALLEL_DETECTION_FAULT_IT
  532. * LAN8742_AUTONEGO_PAGE_RECEIVED_IT
  533. * @retval LAN8742_STATUS_OK if OK
  534. * LAN8742_STATUS_READ_ERROR if cannot read register
  535. */
  536. int32_t LAN8742_ClearIT(lan8742_Object_t *pObj, uint32_t Interrupt)
  537. {
  538. uint32_t readval = 0;
  539. int32_t status = LAN8742_STATUS_OK;
  540. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_ISFR, &readval) < 0)
  541. {
  542. status = LAN8742_STATUS_READ_ERROR;
  543. }
  544. return status;
  545. }
  546. /**
  547. * @brief Get IT Flag status.
  548. * @param pObj: Pointer to device object.
  549. * @param Interrupt: IT Flag to be checked,
  550. * should be a value or a combination of the following:
  551. * LAN8742_WOL_IT
  552. * LAN8742_ENERGYON_IT
  553. * LAN8742_AUTONEGO_COMPLETE_IT
  554. * LAN8742_REMOTE_FAULT_IT
  555. * LAN8742_LINK_DOWN_IT
  556. * LAN8742_AUTONEGO_LP_ACK_IT
  557. * LAN8742_PARALLEL_DETECTION_FAULT_IT
  558. * LAN8742_AUTONEGO_PAGE_RECEIVED_IT
  559. * @retval 1 IT flag is SET
  560. * 0 IT flag is RESET
  561. * LAN8742_STATUS_READ_ERROR if cannot read register
  562. */
  563. int32_t LAN8742_GetITStatus(lan8742_Object_t *pObj, uint32_t Interrupt)
  564. {
  565. uint32_t readval = 0;
  566. int32_t status = 0;
  567. if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_ISFR, &readval) >= 0)
  568. {
  569. status = ((readval & Interrupt) == Interrupt);
  570. }
  571. else
  572. {
  573. status = LAN8742_STATUS_READ_ERROR;
  574. }
  575. return status;
  576. }
  577. /**
  578. * @}
  579. */
  580. /**
  581. * @}
  582. */
  583. /**
  584. * @}
  585. */
  586. /**
  587. * @}
  588. */