STM32H735xx HAL User Manual
stm32h7xx_hal_mdios.c
Go to the documentation of this file.
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