STM32H735xx HAL User Manual
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32h7xx_hal_mdios.c 00004 * @author MCD Application Team 00005 * @brief MDIOS HAL module driver. 00006 * This file provides firmware functions to manage the following 00007 * functionalities of the MDIOS Peripheral. 00008 * + Initialization and de-initialization functions 00009 * + IO operation functions 00010 * + Peripheral Control functions 00011 * 00012 * 00013 ****************************************************************************** 00014 * @attention 00015 * 00016 * Copyright (c) 2017 STMicroelectronics. 00017 * All rights reserved. 00018 * 00019 * This software is licensed under terms that can be found in the LICENSE file 00020 * in the root directory of this software component. 00021 * If no LICENSE file comes with this software, it is provided AS-IS. 00022 * 00023 ****************************************************************************** 00024 @verbatim 00025 =============================================================================== 00026 ##### How to use this driver ##### 00027 =============================================================================== 00028 [..] 00029 The MDIOS HAL driver can be used as follow: 00030 00031 (#) Declare a MDIOS_HandleTypeDef handle structure. 00032 00033 (#) Initialize the MDIOS low level resources by implementing the HAL_MDIOS_MspInit() API: 00034 (##) Enable the MDIOS interface clock. 00035 (##) MDIOS pins configuration: 00036 (+++) Enable clocks for the MDIOS GPIOs. 00037 (+++) Configure the MDIOS pins as alternate function. 00038 (##) NVIC configuration if you need to use interrupt process: 00039 (+++) Configure the MDIOS interrupt priority. 00040 (+++) Enable the NVIC MDIOS IRQ handle. 00041 00042 (#) Program the Port Address and the Preamble Check in the Init structure. 00043 00044 (#) Initialize the MDIOS registers by calling the HAL_MDIOS_Init() API. 00045 00046 (#) Perform direct slave read/write operations using the following APIs: 00047 (##) Read the value of a DINn register: HAL_MDIOS_ReadReg() 00048 (##) Write a value to a DOUTn register: HAL_MDIOS_WriteReg() 00049 00050 (#) Get the Master read/write operations flags using the following APIs: 00051 (##) Bit map of DOUTn registers read by Master: HAL_MDIOS_GetReadRegAddress() 00052 (##) Bit map of DINn registers written by Master : HAL_MDIOS_GetWrittenRegAddress() 00053 00054 (#) Clear the read/write flags using the following APIs: 00055 (##) Clear read flags of a set of registers: HAL_MDIOS_ClearReadRegAddress() 00056 (##) Clear write flags of a set of registers: HAL_MDIOS_ClearWriteRegAddress() 00057 00058 (#) Enable interrupts on events using HAL_MDIOS_EnableEvents(), when called 00059 the MDIOS will generate an interrupt in the following cases: 00060 (##) a DINn register written by the Master 00061 (##) a DOUTn register read by the Master 00062 (##) an error occur 00063 00064 (@) A callback is executed for each genereted interrupt, so the driver provide the following 00065 HAL_MDIOS_WriteCpltCallback(), HAL_MDIOS_ReadCpltCallback() and HAL_MDIOS_ErrorCallback() 00066 (@) HAL_MDIOS_IRQHandler() must be called from the MDIOS IRQ Handler, to handle the interrupt 00067 and execute the previous callbacks 00068 00069 (#) Reset the MDIOS peripheral and all related resources by calling the HAL_MDIOS_DeInit() API. 00070 (##) HAL_MDIOS_MspDeInit() must be implemented to reset low level resources 00071 (GPIO, Clocks, NVIC configuration ...) 00072 00073 *** Callback registration *** 00074 ============================================= 00075 00076 The compilation define USE_HAL_MDIOS_REGISTER_CALLBACKS when set to 1 00077 allows the user to configure dynamically the driver callbacks. 00078 Use Function @ref HAL_MDIOS_RegisterCallback() to register an interrupt callback. 00079 00080 Function @ref HAL_MDIOS_RegisterCallback() allows to register following callbacks: 00081 (+) WriteCpltCallback : Write Complete Callback. 00082 (+) ReadCpltCallback : Read Complete Callback. 00083 (+) ErrorCallback : Error Callback. 00084 (+) WakeUpCallback : Wake UP Callback 00085 (+) MspInitCallback : MspInit Callback. 00086 (+) MspDeInitCallback : MspDeInit Callback. 00087 00088 This function takes as parameters the HAL peripheral handle, the Callback ID 00089 and a pointer to the user callback function. 00090 00091 Use function @ref HAL_MDIOS_UnRegisterCallback() to reset a callback to the default 00092 weak function. 00093 @ref HAL_MDIOS_UnRegisterCallback takes as parameters the HAL peripheral handle, 00094 and the Callback ID. 00095 This function allows to reset following callbacks: 00096 (+) WriteCpltCallback : Write Complete Callback. 00097 (+) ReadCpltCallback : Read Complete Callback. 00098 (+) ErrorCallback : Error Callback. 00099 (+) WakeUpCallback : Wake UP Callback 00100 (+) MspInitCallback : MspInit Callback. 00101 (+) MspDeInitCallback : MspDeInit Callback. 00102 00103 By default, after the HAL_MDIOS_Init and when the state is HAL_MDIOS_STATE_RESET 00104 all callbacks are set to the corresponding weak functions: 00105 examples @ref HAL_MDIOS_WriteCpltCallback(), @ref HAL_MDIOS_ReadCpltCallback(). 00106 Exception done for MspInit and MspDeInit functions that are 00107 reset to the legacy weak function in the HAL_MDIOS_Init/ @ref HAL_MDIOS_DeInit only when 00108 these callbacks are null (not registered beforehand). 00109 if not, MspInit or MspDeInit are not null, the HAL_MDIOS_Init/ @ref HAL_MDIOS_DeInit 00110 keep and use the user MspInit/MspDeInit callbacks (registered beforehand) 00111 00112 Callbacks can be registered/unregistered in HAL_MDIOS_STATE_READY state only. 00113 Exception done MspInit/MspDeInit that can be registered/unregistered 00114 in HAL_MDIOS_STATE_READY or HAL_MDIOS_STATE_RESET state, 00115 thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. 00116 In that case first register the MspInit/MspDeInit user callbacks 00117 using @ref HAL_MDIOS_RegisterCallback() before calling @ref HAL_MDIOS_DeInit 00118 or HAL_MDIOS_Init function. 00119 00120 When The compilation define USE_HAL_MDIOS_REGISTER_CALLBACKS is set to 0 or 00121 not defined, the callback registration feature is not available and all callbacks 00122 are set to the corresponding weak functions. 00123 00124 00125 @endverbatim 00126 */ 00127 00128 /* Includes ------------------------------------------------------------------*/ 00129 #include "stm32h7xx_hal.h" 00130 00131 /** @addtogroup STM32H7xx_HAL_Driver 00132 * @{ 00133 */ 00134 #if defined (MDIOS) 00135 /** @defgroup MDIOS MDIOS 00136 * @brief HAL MDIOS module driver 00137 * @{ 00138 */ 00139 #ifdef HAL_MDIOS_MODULE_ENABLED 00140 00141 00142 00143 /* Private typedef -----------------------------------------------------------*/ 00144 /* Private define ------------------------------------------------------------*/ 00145 #define MDIOS_PORT_ADDRESS_SHIFT ((uint32_t)8) 00146 #define MDIOS_ALL_REG_FLAG ((uint32_t)0xFFFFFFFFU) 00147 #define MDIOS_ALL_ERRORS_FLAG ((uint32_t)(MDIOS_SR_PERF | MDIOS_SR_SERF | MDIOS_SR_TERF)) 00148 00149 #define MDIOS_DIN_BASE_ADDR (MDIOS_BASE + 0x100U) 00150 #define MDIOS_DOUT_BASE_ADDR (MDIOS_BASE + 0x180U) 00151 00152 /* Private macro -------------------------------------------------------------*/ 00153 /* Private variables ---------------------------------------------------------*/ 00154 /* Private function prototypes -----------------------------------------------*/ 00155 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00156 static void MDIOS_InitCallbacksToDefault(MDIOS_HandleTypeDef *hmdios); 00157 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */ 00158 /* Private functions ---------------------------------------------------------*/ 00159 /* Exported functions --------------------------------------------------------*/ 00160 /** @defgroup MDIOS_Exported_Functions MDIOS Exported Functions 00161 * @{ 00162 */ 00163 00164 /** @defgroup MDIOS_Exported_Functions_Group1 Initialization/de-initialization functions 00165 * @brief Initialization and Configuration functions 00166 * 00167 @verbatim 00168 =============================================================================== 00169 ##### Initialization and Configuration functions ##### 00170 =============================================================================== 00171 [..] 00172 This subsection provides a set of functions allowing to initialize the MDIOS 00173 (+) The following parameters can be configured: 00174 (++) Port Address 00175 (++) Preamble Check 00176 00177 @endverbatim 00178 * @{ 00179 */ 00180 00181 /** 00182 * @brief Initializes the MDIOS according to the specified parameters in 00183 * the MDIOS_InitTypeDef and creates the associated handle . 00184 * @param hmdios: pointer to a MDIOS_HandleTypeDef structure that contains 00185 * the configuration information for MDIOS module 00186 * @retval HAL status 00187 */ 00188 HAL_StatusTypeDef HAL_MDIOS_Init(MDIOS_HandleTypeDef *hmdios) 00189 { 00190 uint32_t tmpcr; 00191 00192 /* Check the MDIOS handle allocation */ 00193 if(hmdios == NULL) 00194 { 00195 return HAL_ERROR; 00196 } 00197 00198 /* Check the parameters */ 00199 assert_param(IS_MDIOS_ALL_INSTANCE(hmdios->Instance)); 00200 assert_param(IS_MDIOS_PORTADDRESS(hmdios->Init.PortAddress)); 00201 assert_param(IS_MDIOS_PREAMBLECHECK(hmdios->Init.PreambleCheck)); 00202 00203 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00204 00205 if(hmdios->State == HAL_MDIOS_STATE_RESET) 00206 { 00207 MDIOS_InitCallbacksToDefault(hmdios); 00208 00209 if(hmdios->MspInitCallback == NULL) 00210 { 00211 hmdios->MspInitCallback = HAL_MDIOS_MspInit; 00212 } 00213 00214 /* Init the low level hardware */ 00215 hmdios->MspInitCallback(hmdios); 00216 } 00217 00218 #else 00219 00220 if(hmdios->State == HAL_MDIOS_STATE_RESET) 00221 { 00222 /* Init the low level hardware */ 00223 HAL_MDIOS_MspInit(hmdios); 00224 } 00225 00226 #endif /* (USE_HAL_MDIOS_REGISTER_CALLBACKS) */ 00227 00228 /* Change the MDIOS state */ 00229 hmdios->State = HAL_MDIOS_STATE_BUSY; 00230 00231 /* Get the MDIOS CR value */ 00232 tmpcr = hmdios->Instance->CR; 00233 00234 /* Clear PORT_ADDRESS, DPC and EN bits */ 00235 tmpcr &= ((uint32_t)~(MDIOS_CR_EN | MDIOS_CR_DPC | MDIOS_CR_PORT_ADDRESS)); 00236 00237 /* Set MDIOS control parametrs and enable the peripheral */ 00238 tmpcr |= (uint32_t)(((hmdios->Init.PortAddress) << MDIOS_PORT_ADDRESS_SHIFT) |\ 00239 (hmdios->Init.PreambleCheck) | \ 00240 (MDIOS_CR_EN)); 00241 00242 /* Write the MDIOS CR */ 00243 hmdios->Instance->CR = tmpcr; 00244 00245 hmdios->ErrorCode = HAL_MDIOS_ERROR_NONE; 00246 00247 /* Change the MDIOS state */ 00248 hmdios->State = HAL_MDIOS_STATE_READY; 00249 00250 /* Release Lock */ 00251 __HAL_UNLOCK(hmdios); 00252 00253 /* Return function status */ 00254 return HAL_OK; 00255 00256 } 00257 00258 /** 00259 * @brief DeInitializes the MDIOS peripheral. 00260 * @param hmdios: MDIOS handle 00261 * @retval HAL status 00262 */ 00263 HAL_StatusTypeDef HAL_MDIOS_DeInit(MDIOS_HandleTypeDef *hmdios) 00264 { 00265 /* Check the MDIOS handle allocation */ 00266 if(hmdios == NULL) 00267 { 00268 return HAL_ERROR; 00269 } 00270 00271 /* Check the parameters */ 00272 assert_param(IS_MDIOS_ALL_INSTANCE(hmdios->Instance)); 00273 00274 /* Change the MDIOS state */ 00275 hmdios->State = HAL_MDIOS_STATE_BUSY; 00276 00277 /* Disable the Peripheral */ 00278 __HAL_MDIOS_DISABLE(hmdios); 00279 00280 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00281 00282 if(hmdios->MspDeInitCallback == NULL) 00283 { 00284 hmdios->MspDeInitCallback = HAL_MDIOS_MspDeInit; 00285 } 00286 /* DeInit the low level hardware */ 00287 hmdios->MspDeInitCallback(hmdios); 00288 #else 00289 00290 /* DeInit the low level hardware */ 00291 HAL_MDIOS_MspDeInit(hmdios); 00292 00293 #endif /* (USE_HAL_MDIOS_REGISTER_CALLBACKS) */ 00294 00295 /* Change the MDIOS state */ 00296 hmdios->State = HAL_MDIOS_STATE_RESET; 00297 00298 /* Release Lock */ 00299 __HAL_UNLOCK(hmdios); 00300 00301 /* Return function status */ 00302 return HAL_OK; 00303 } 00304 00305 /** 00306 * @brief MDIOS MSP Init 00307 * @param hmdios: mdios handle 00308 * @retval None 00309 */ 00310 __weak void HAL_MDIOS_MspInit(MDIOS_HandleTypeDef *hmdios) 00311 { 00312 /* Prevent unused argument(s) compilation warning */ 00313 UNUSED(hmdios); 00314 00315 /* NOTE : This function should not be modified, when the callback is needed, 00316 the HAL_MDIOS_MspInit can be implemented in the user file 00317 */ 00318 } 00319 00320 /** 00321 * @brief MDIOS MSP DeInit 00322 * @param hmdios: mdios handle 00323 * @retval None 00324 */ 00325 __weak void HAL_MDIOS_MspDeInit(MDIOS_HandleTypeDef *hmdios) 00326 { 00327 /* Prevent unused argument(s) compilation warning */ 00328 UNUSED(hmdios); 00329 00330 /* NOTE : This function should not be modified, when the callback is needed, 00331 the HAL_MDIOS_MspDeInit can be implemented in the user file 00332 */ 00333 } 00334 00335 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00336 /** 00337 * @brief Register a User MDIOS Callback 00338 * To be used instead of the weak predefined callback 00339 * @param hmdios mdios handle 00340 * @param CallbackID ID of the callback to be registered 00341 * This parameter can be one of the following values: 00342 * @arg @ref HAL_MDIOS_WRITE_COMPLETE_CB_ID Write Complete Callback ID 00343 * @arg @ref HAL_MDIOS_READ_COMPLETE_CB_ID Read Complete Callback ID 00344 * @arg @ref HAL_MDIOS_ERROR_CB_ID Error Callback ID 00345 * @arg @ref HAL_MDIOS_WAKEUP_CB_ID Wake Up Callback ID 00346 * @arg @ref HAL_MDIOS_MSPINIT_CB_ID MspInit callback ID 00347 * @arg @ref HAL_MDIOS_MSPDEINIT_CB_ID MspDeInit callback ID 00348 * @param pCallback pointer to the Callback function 00349 * @retval status 00350 */ 00351 HAL_StatusTypeDef HAL_MDIOS_RegisterCallback(MDIOS_HandleTypeDef *hmdios, HAL_MDIOS_CallbackIDTypeDef CallbackID, pMDIOS_CallbackTypeDef pCallback) 00352 { 00353 HAL_StatusTypeDef status = HAL_OK; 00354 00355 if(pCallback == NULL) 00356 { 00357 /* Update the error code */ 00358 hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK; 00359 00360 return HAL_ERROR; 00361 } 00362 /* Process locked */ 00363 __HAL_LOCK(hmdios); 00364 00365 if(hmdios->State == HAL_MDIOS_STATE_READY) 00366 { 00367 switch (CallbackID) 00368 { 00369 case HAL_MDIOS_WRITE_COMPLETE_CB_ID : 00370 hmdios->WriteCpltCallback = pCallback; 00371 break; 00372 00373 case HAL_MDIOS_READ_COMPLETE_CB_ID : 00374 hmdios->ReadCpltCallback = pCallback; 00375 break; 00376 00377 case HAL_MDIOS_ERROR_CB_ID : 00378 hmdios->ErrorCallback = pCallback; 00379 break; 00380 00381 case HAL_MDIOS_WAKEUP_CB_ID : 00382 hmdios->WakeUpCallback = pCallback; 00383 break; 00384 00385 case HAL_MDIOS_MSPINIT_CB_ID : 00386 hmdios->MspInitCallback = pCallback; 00387 break; 00388 00389 case HAL_MDIOS_MSPDEINIT_CB_ID : 00390 hmdios->MspDeInitCallback = pCallback; 00391 break; 00392 00393 default : 00394 /* Update the error code */ 00395 hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK; 00396 /* Return error status */ 00397 status = HAL_ERROR; 00398 break; 00399 } 00400 } 00401 else if(hmdios->State == HAL_MDIOS_STATE_RESET) 00402 { 00403 switch (CallbackID) 00404 { 00405 case HAL_MDIOS_MSPINIT_CB_ID : 00406 hmdios->MspInitCallback = pCallback; 00407 break; 00408 00409 case HAL_MDIOS_MSPDEINIT_CB_ID : 00410 hmdios->MspDeInitCallback = pCallback; 00411 break; 00412 00413 default : 00414 /* Update the error code */ 00415 hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK; 00416 /* Return error status */ 00417 status = HAL_ERROR; 00418 break; 00419 } 00420 } 00421 else 00422 { 00423 /* Update the error code */ 00424 hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK; 00425 /* Return error status */ 00426 status = HAL_ERROR; 00427 } 00428 00429 /* Release Lock */ 00430 __HAL_UNLOCK(hmdios); 00431 00432 return status; 00433 } 00434 00435 /** 00436 * @brief Unregister an MDIOS Callback 00437 * MDIOS callabck is redirected to the weak predefined callback 00438 * @param hmdios mdios handle 00439 * @param CallbackID ID of the callback to be unregistered 00440 * This parameter can be one of the following values: 00441 * @arg @ref HAL_MDIOS_WRITE_COMPLETE_CB_ID Write Complete Callback ID 00442 * @arg @ref HAL_MDIOS_READ_COMPLETE_CB_ID Read Complete Callback ID 00443 * @arg @ref HAL_MDIOS_ERROR_CB_ID Error Callback ID 00444 * @arg @ref HAL_MDIOS_WAKEUP_CB_ID Wake Up Callback ID 00445 * @arg @ref HAL_MDIOS_MSPINIT_CB_ID MspInit callback ID 00446 * @arg @ref HAL_MDIOS_MSPDEINIT_CB_ID MspDeInit callback ID 00447 * @retval status 00448 */ 00449 HAL_StatusTypeDef HAL_MDIOS_UnRegisterCallback(MDIOS_HandleTypeDef *hmdios, HAL_MDIOS_CallbackIDTypeDef CallbackID) 00450 { 00451 HAL_StatusTypeDef status = HAL_OK; 00452 00453 /* Process locked */ 00454 __HAL_LOCK(hmdios); 00455 00456 if(hmdios->State == HAL_MDIOS_STATE_READY) 00457 { 00458 switch (CallbackID) 00459 { 00460 case HAL_MDIOS_WRITE_COMPLETE_CB_ID : 00461 hmdios->WriteCpltCallback = HAL_MDIOS_WriteCpltCallback; 00462 break; 00463 00464 case HAL_MDIOS_READ_COMPLETE_CB_ID : 00465 hmdios->ReadCpltCallback = HAL_MDIOS_ReadCpltCallback; 00466 break; 00467 00468 case HAL_MDIOS_ERROR_CB_ID : 00469 hmdios->ErrorCallback = HAL_MDIOS_ErrorCallback; 00470 break; 00471 00472 case HAL_MDIOS_WAKEUP_CB_ID : 00473 hmdios->WakeUpCallback = HAL_MDIOS_WakeUpCallback; 00474 break; 00475 00476 case HAL_MDIOS_MSPINIT_CB_ID : 00477 hmdios->MspInitCallback = HAL_MDIOS_MspInit; 00478 break; 00479 00480 case HAL_MDIOS_MSPDEINIT_CB_ID : 00481 hmdios->MspDeInitCallback = HAL_MDIOS_MspDeInit; 00482 break; 00483 00484 default : 00485 /* Update the error code */ 00486 hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK; 00487 /* Return error status */ 00488 status = HAL_ERROR; 00489 break; 00490 } 00491 } 00492 else if(hmdios->State == HAL_MDIOS_STATE_RESET) 00493 { 00494 switch (CallbackID) 00495 { 00496 case HAL_MDIOS_MSPINIT_CB_ID : 00497 hmdios->MspInitCallback = HAL_MDIOS_MspInit; 00498 break; 00499 00500 case HAL_MDIOS_MSPDEINIT_CB_ID : 00501 hmdios->MspDeInitCallback = HAL_MDIOS_MspDeInit; 00502 break; 00503 00504 default : 00505 /* Update the error code */ 00506 hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK; 00507 /* Return error status */ 00508 status = HAL_ERROR; 00509 break; 00510 } 00511 } 00512 else 00513 { 00514 /* Update the error code */ 00515 hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK; 00516 /* Return error status */ 00517 status = HAL_ERROR; 00518 } 00519 00520 /* Release Lock */ 00521 __HAL_UNLOCK(hmdios); 00522 00523 return status; 00524 } 00525 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */ 00526 00527 /** 00528 * @} 00529 */ 00530 00531 /** @defgroup MDIOS_Exported_Functions_Group2 IO operation functions 00532 * @brief MDIOS Read/Write functions 00533 * 00534 @verbatim 00535 =============================================================================== 00536 ##### IO operation functions ##### 00537 =============================================================================== 00538 This subsection provides a set of functions allowing to manage the MDIOS 00539 read and write operations. 00540 00541 (#) APIs that allow to the MDIOS to read/write from/to the 00542 values of one of the DINn/DOUTn registers: 00543 (+) Read the value of a DINn register: HAL_MDIOS_ReadReg() 00544 (+) Write a value to a DOUTn register: HAL_MDIOS_WriteReg() 00545 00546 (#) APIs that provide if there are some Slave registres have been 00547 read or written by the Master: 00548 (+) DOUTn registers read by Master: HAL_MDIOS_GetReadRegAddress() 00549 (+) DINn registers written by Master : HAL_MDIOS_GetWrittenRegAddress() 00550 00551 (#) APIs that Clear the read/write flags: 00552 (+) Clear read registers flags: HAL_MDIOS_ClearReadRegAddress() 00553 (+) Clear write registers flags: HAL_MDIOS_ClearWriteRegAddress() 00554 00555 (#) A set of Callbacks are provided: 00556 (+) HAL_MDIOS_WriteCpltCallback() 00557 (+) HAL_MDIOS_ReadCpltCallback() 00558 (+) HAL_MDIOS_ErrorCallback() 00559 00560 @endverbatim 00561 * @{ 00562 */ 00563 00564 /** 00565 * @brief Writes to an MDIOS output register 00566 * @param hmdios: mdios handle 00567 * @param RegNum: MDIOS output register address 00568 * @param Data: Data to write 00569 * @retval HAL status 00570 */ 00571 HAL_StatusTypeDef HAL_MDIOS_WriteReg(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum, uint16_t Data) 00572 { 00573 uint32_t tmpreg; 00574 00575 /* Check the parameters */ 00576 assert_param(IS_MDIOS_REGISTER(RegNum)); 00577 00578 /* Process Locked */ 00579 __HAL_LOCK(hmdios); 00580 00581 /* Get the addr of output register to be written by the MDIOS */ 00582 tmpreg = MDIOS_DOUT_BASE_ADDR + (4U * RegNum); 00583 00584 /* Write to DOUTn register */ 00585 *((uint32_t *)tmpreg) = Data; 00586 00587 /* Process Unlocked */ 00588 __HAL_UNLOCK(hmdios); 00589 00590 return HAL_OK; 00591 } 00592 00593 /** 00594 * @brief Reads an MDIOS input register 00595 * @param hmdios: mdios handle 00596 * @param RegNum: MDIOS input register address 00597 * @param pData: pointer to Data 00598 * @retval HAL status 00599 */ 00600 HAL_StatusTypeDef HAL_MDIOS_ReadReg(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum, uint16_t *pData) 00601 { 00602 uint32_t tmpreg; 00603 00604 /* Check the parameters */ 00605 assert_param(IS_MDIOS_REGISTER(RegNum)); 00606 00607 /* Process Locked */ 00608 __HAL_LOCK(hmdios); 00609 00610 /* Get the addr of input register to be read by the MDIOS */ 00611 tmpreg = MDIOS_DIN_BASE_ADDR + (4U * RegNum); 00612 00613 /* Read DINn register */ 00614 *pData = (uint16_t)(*((uint32_t *)tmpreg)); 00615 00616 /* Process Unlocked */ 00617 __HAL_UNLOCK(hmdios); 00618 00619 return HAL_OK; 00620 } 00621 00622 /** 00623 * @brief Gets Written registers by MDIO master 00624 * @param hmdios: mdios handle 00625 * @retval bit map of written registers addresses 00626 */ 00627 uint32_t HAL_MDIOS_GetWrittenRegAddress(MDIOS_HandleTypeDef *hmdios) 00628 { 00629 return hmdios->Instance->WRFR; 00630 } 00631 00632 /** 00633 * @brief Gets Read registers by MDIO master 00634 * @param hmdios: mdios handle 00635 * @retval bit map of read registers addresses 00636 */ 00637 uint32_t HAL_MDIOS_GetReadRegAddress(MDIOS_HandleTypeDef *hmdios) 00638 { 00639 return hmdios->Instance->RDFR; 00640 } 00641 00642 /** 00643 * @brief Clears Write registers flag 00644 * @param hmdios: mdios handle 00645 * @param RegNum: registers addresses to be cleared 00646 * @retval HAL status 00647 */ 00648 HAL_StatusTypeDef HAL_MDIOS_ClearWriteRegAddress(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum) 00649 { 00650 /* Check the parameters */ 00651 assert_param(IS_MDIOS_REGISTER(RegNum)); 00652 00653 /* Process Locked */ 00654 __HAL_LOCK(hmdios); 00655 00656 /* Clear write registers flags */ 00657 hmdios->Instance->CWRFR |= (RegNum); 00658 00659 /* Release Lock */ 00660 __HAL_UNLOCK(hmdios); 00661 00662 return HAL_OK; 00663 } 00664 00665 /** 00666 * @brief Clears Read register flag 00667 * @param hmdios: mdios handle 00668 * @param RegNum: registers addresses to be cleared 00669 * @retval HAL status 00670 */ 00671 HAL_StatusTypeDef HAL_MDIOS_ClearReadRegAddress(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum) 00672 { 00673 /* Check the parameters */ 00674 assert_param(IS_MDIOS_REGISTER(RegNum)); 00675 00676 /* Process Locked */ 00677 __HAL_LOCK(hmdios); 00678 00679 /* Clear read registers flags */ 00680 hmdios->Instance->CRDFR |= (RegNum); 00681 00682 /* Release Lock */ 00683 __HAL_UNLOCK(hmdios); 00684 00685 return HAL_OK; 00686 } 00687 00688 /** 00689 * @brief Enables Events for MDIOS peripheral 00690 * @param hmdios: mdios handle 00691 * @retval HAL status 00692 */ 00693 HAL_StatusTypeDef HAL_MDIOS_EnableEvents(MDIOS_HandleTypeDef *hmdios) 00694 { 00695 /* Process Locked */ 00696 __HAL_LOCK(hmdios); 00697 00698 /* Enable MDIOS interrupts: Register Write, Register Read and Error ITs */ 00699 __HAL_MDIOS_ENABLE_IT(hmdios, (MDIOS_IT_WRITE | MDIOS_IT_READ | MDIOS_IT_ERROR)); 00700 00701 /* Process Unlocked */ 00702 __HAL_UNLOCK(hmdios); 00703 00704 return HAL_OK; 00705 } 00706 00707 /** 00708 * @brief This function handles MDIOS interrupt request. 00709 * @param hmdios: MDIOS handle 00710 * @retval None 00711 */ 00712 void HAL_MDIOS_IRQHandler(MDIOS_HandleTypeDef *hmdios) 00713 { 00714 /* Write Register Interrupt enabled ? */ 00715 if(__HAL_MDIOS_GET_IT_SOURCE(hmdios, MDIOS_IT_WRITE) != (uint32_t)RESET) 00716 { 00717 /* Write register flag */ 00718 if(HAL_MDIOS_GetWrittenRegAddress(hmdios) != (uint32_t)RESET) 00719 { 00720 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00721 /*Call registered Write complete callback*/ 00722 hmdios->WriteCpltCallback(hmdios); 00723 #else 00724 /* Write callback function */ 00725 HAL_MDIOS_WriteCpltCallback(hmdios); 00726 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */ 00727 00728 /* Clear write register flag */ 00729 hmdios->Instance->CWRFR |= MDIOS_ALL_REG_FLAG; 00730 } 00731 } 00732 00733 /* Read Register Interrupt enabled ? */ 00734 if(__HAL_MDIOS_GET_IT_SOURCE(hmdios, MDIOS_IT_READ) != (uint32_t)RESET) 00735 { 00736 /* Read register flag */ 00737 if(HAL_MDIOS_GetReadRegAddress(hmdios) != (uint32_t)RESET) 00738 { 00739 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00740 /*Call registered Read complete callback*/ 00741 hmdios->ReadCpltCallback(hmdios); 00742 #else 00743 /* Read callback function */ 00744 HAL_MDIOS_ReadCpltCallback(hmdios); 00745 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */ 00746 00747 /* Clear read register flag */ 00748 hmdios->Instance->CRDFR |= MDIOS_ALL_REG_FLAG; 00749 } 00750 } 00751 00752 /* Error Interrupt enabled ? */ 00753 if(__HAL_MDIOS_GET_IT_SOURCE(hmdios, MDIOS_IT_ERROR) != (uint32_t)RESET) 00754 { 00755 /* All Errors Flag */ 00756 if(__HAL_MDIOS_GET_ERROR_FLAG(hmdios, MDIOS_ALL_ERRORS_FLAG) != (uint32_t)RESET) 00757 { 00758 hmdios->ErrorCode |= HAL_MDIOS_ERROR_DATA; 00759 00760 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00761 /*Call registered Error callback*/ 00762 hmdios->ErrorCallback(hmdios); 00763 #else 00764 /* Error Callback */ 00765 HAL_MDIOS_ErrorCallback(hmdios); 00766 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */ 00767 00768 /* Clear errors flag */ 00769 __HAL_MDIOS_CLEAR_ERROR_FLAG(hmdios, MDIOS_ALL_ERRORS_FLAG); 00770 } 00771 hmdios->ErrorCode = HAL_MDIOS_ERROR_NONE; 00772 } 00773 #if defined(DUAL_CORE) 00774 00775 if (HAL_GetCurrentCPUID() == CM7_CPUID) 00776 { 00777 if(__HAL_MDIOS_WAKEUP_EXTI_GET_FLAG(MDIOS_WAKEUP_EXTI_LINE) != (uint32_t)RESET) 00778 { 00779 /* Clear MDIOS WAKEUP Exti pending bit */ 00780 __HAL_MDIOS_WAKEUP_EXTI_CLEAR_FLAG(MDIOS_WAKEUP_EXTI_LINE); 00781 00782 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00783 /*Call registered WakeUp callback*/ 00784 hmdios->WakeUpCallback(hmdios); 00785 #else 00786 /* MDIOS WAKEUP callback */ 00787 HAL_MDIOS_WakeUpCallback(hmdios); 00788 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */ 00789 } 00790 } 00791 else 00792 { 00793 if(__HAL_MDIOS_WAKEUP_EXTID2_GET_FLAG(MDIOS_WAKEUP_EXTI_LINE) != (uint32_t)RESET) 00794 { 00795 /* Clear MDIOS WAKEUP Exti D2 pending bit */ 00796 __HAL_MDIOS_WAKEUP_EXTID2_CLEAR_FLAG(MDIOS_WAKEUP_EXTI_LINE); 00797 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00798 /*Call registered WakeUp callback*/ 00799 hmdios->WakeUpCallback(hmdios); 00800 #else 00801 /* MDIOS WAKEUP callback */ 00802 HAL_MDIOS_WakeUpCallback(hmdios); 00803 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */ 00804 } 00805 } 00806 #else 00807 /* check MDIOS WAKEUP exti flag */ 00808 if(__HAL_MDIOS_WAKEUP_EXTI_GET_FLAG(MDIOS_WAKEUP_EXTI_LINE) != (uint32_t)RESET) 00809 { 00810 /* Clear MDIOS WAKEUP Exti pending bit */ 00811 __HAL_MDIOS_WAKEUP_EXTI_CLEAR_FLAG(MDIOS_WAKEUP_EXTI_LINE); 00812 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00813 /*Call registered WakeUp callback*/ 00814 hmdios->WakeUpCallback(hmdios); 00815 #else 00816 /* MDIOS WAKEUP callback */ 00817 HAL_MDIOS_WakeUpCallback(hmdios); 00818 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */ 00819 } 00820 #endif 00821 } 00822 00823 /** 00824 * @brief Write Complete Callback 00825 * @param hmdios: mdios handle 00826 * @retval None 00827 */ 00828 __weak void HAL_MDIOS_WriteCpltCallback(MDIOS_HandleTypeDef *hmdios) 00829 { 00830 /* Prevent unused argument(s) compilation warning */ 00831 UNUSED(hmdios); 00832 00833 /* NOTE : This function should not be modified, when the callback is needed, 00834 the HAL_MDIOS_WriteCpltCallback can be implemented in the user file 00835 */ 00836 } 00837 00838 /** 00839 * @brief Read Complete Callback 00840 * @param hmdios: mdios handle 00841 * @retval None 00842 */ 00843 __weak void HAL_MDIOS_ReadCpltCallback(MDIOS_HandleTypeDef *hmdios) 00844 { 00845 /* Prevent unused argument(s) compilation warning */ 00846 UNUSED(hmdios); 00847 00848 /* NOTE : This function should not be modified, when the callback is needed, 00849 the HAL_MDIOS_ReadCpltCallback can be implemented in the user file 00850 */ 00851 } 00852 00853 /** 00854 * @brief Error Callback 00855 * @param hmdios: mdios handle 00856 * @retval None 00857 */ 00858 __weak void HAL_MDIOS_ErrorCallback(MDIOS_HandleTypeDef *hmdios) 00859 { 00860 /* Prevent unused argument(s) compilation warning */ 00861 UNUSED(hmdios); 00862 00863 /* NOTE : This function should not be modified, when the callback is needed, 00864 the HAL_MDIOS_ErrorCallback can be implemented in the user file 00865 */ 00866 } 00867 00868 /** 00869 * @brief MDIOS WAKEUP interrupt callback 00870 * @param hmdios: mdios handle 00871 * @retval None 00872 */ 00873 __weak void HAL_MDIOS_WakeUpCallback(MDIOS_HandleTypeDef *hmdios) 00874 { 00875 /* Prevent unused argument(s) compilation warning */ 00876 UNUSED(hmdios); 00877 00878 /* NOTE : This function Should not be modified, when the callback is needed, 00879 the HAL_MDIOS_WakeUpCallback could be implemented in the user file 00880 */ 00881 } 00882 00883 /** 00884 * @} 00885 */ 00886 00887 /** @defgroup MDIOS_Exported_Functions_Group3 Peripheral Control functions 00888 * @brief MDIOS control functions 00889 * 00890 @verbatim 00891 =============================================================================== 00892 ##### Peripheral Control functions ##### 00893 =============================================================================== 00894 [..] 00895 This subsection provides a set of functions allowing to control the MDIOS. 00896 (+) HAL_MDIOS_GetState() API, helpful to check in run-time the state. 00897 (+) HAL_MDIOS_GetError() API, returns the errors code of the HAL state machine. 00898 00899 @endverbatim 00900 * @{ 00901 */ 00902 00903 /** 00904 * @brief Gets MDIOS error code 00905 * @param hmdios: mdios handle 00906 * @retval mdios error code 00907 */ 00908 uint32_t HAL_MDIOS_GetError(MDIOS_HandleTypeDef *hmdios) 00909 { 00910 /* return the error code */ 00911 return hmdios->ErrorCode; 00912 } 00913 00914 /** 00915 * @brief Return the MDIOS HAL state 00916 * @param hmdios: mdios handle 00917 * @retval HAL state 00918 */ 00919 HAL_MDIOS_StateTypeDef HAL_MDIOS_GetState(MDIOS_HandleTypeDef *hmdios) 00920 { 00921 /* Return MDIOS state */ 00922 return hmdios->State; 00923 } 00924 00925 /** 00926 * @} 00927 */ 00928 00929 /** 00930 * @} 00931 */ 00932 00933 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1) 00934 static void MDIOS_InitCallbacksToDefault(MDIOS_HandleTypeDef *hmdios) 00935 { 00936 /* Init the MDIOS Callback settings */ 00937 hmdios->WriteCpltCallback = HAL_MDIOS_WriteCpltCallback; /* Legacy weak WriteCpltCallback */ 00938 hmdios->ReadCpltCallback = HAL_MDIOS_ReadCpltCallback; /* Legacy weak ReadCpltCallback */ 00939 hmdios->ErrorCallback = HAL_MDIOS_ErrorCallback; /* Legacy weak ErrorCallback */ 00940 hmdios->WakeUpCallback = HAL_MDIOS_WakeUpCallback; /* Legacy weak WakeUpCallback */ 00941 } 00942 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */ 00943 00944 /** 00945 * @} 00946 */ 00947 #endif /* HAL_MDIOS_MODULE_ENABLED */ 00948 /** 00949 * @} 00950 */ 00951 #endif /* MDIOS */ 00952 /** 00953 * @} 00954 */ 00955