/**
  ******************************************************************************
  * @file    stm32f7xx_hal_mdios.c
  * @author  MCD Application Team
  * @brief   MDIOS HAL module driver.
  *          This file provides firmware functions to manage the following 
  *          functionalities of the MDIOS Peripheral.
  *           + Initialization and de-initialization functions
  *           + IO operation functions
  *           + Peripheral Control functions
  *           
  @verbatim       
 ===============================================================================
                        ##### How to use this driver #####
 ===============================================================================
    [..]
    The MDIOS HAL driver can be used as follows:

    (#) Declare a MDIOS_HandleTypeDef handle structure.

    (#) Initialize the MDIOS low level resources by implementing the HAL_MDIOS_MspInit() API:
        (##) Enable the MDIOS interface clock.
        (##) MDIOS pins configuration:
            (+++) Enable clocks for the MDIOS GPIOs.
            (+++) Configure the MDIOS pins as alternate function.
        (##) NVIC configuration if you need to use interrupt process:
            (+++) Configure the MDIOS interrupt priority.
            (+++) Enable the NVIC MDIOS IRQ handle.

    (#) Program the Port Address and the Preamble Check in the Init structure.

    (#) Initialize the MDIOS registers by calling the HAL_MDIOS_Init() API.

    (#) Perform direct slave read/write operations using the following APIs:
        (##) Read the value of a DINn register: HAL_MDIOS_ReadReg()
        (##) Write a value to a DOUTn register: HAL_MDIOS_WriteReg()

    (#) Get the Master read/write operations flags using the following APIs:
        (##) Bit map of DOUTn registers read by Master: HAL_MDIOS_GetReadRegAddress()
        (##) Bit map of DINn registers written by Master : HAL_MDIOS_GetWrittenRegAddress()

    (#) Clear the read/write flags using the following APIs:
        (##) Clear read flags of a set of registers: HAL_MDIOS_ClearReadRegAddress()
        (##) Clear write flags of a set of registers: HAL_MDIOS_ClearWriteRegAddress()

    (#) Enable interrupts on events using HAL_MDIOS_EnableEvents(), when called
        the MDIOS will generate an interrupt in the following cases: 
        (##) a DINn register written by the Master
        (##) a DOUTn register read by the Master
        (##) an error occur

       -@@- A callback is executed for each genereted interrupt, so the driver provides the following 
            HAL_MDIOS_WriteCpltCallback(), HAL_MDIOS_ReadCpltCallback() and HAL_MDIOS_ErrorCallback()
       -@@- HAL_MDIOS_IRQHandler() must be called from the MDIOS IRQ Handler, to handle the interrupt
            and execute the previous callbacks
   
    (#) Reset the MDIOS peripheral and all related ressources by calling the HAL_MDIOS_DeInit() API.
        (##) HAL_MDIOS_MspDeInit() must be implemented to reset low level ressources 
            (GPIO, Clocks, NVIC configuration ...)

  *** Callback registration ***
  =============================================

  The compilation define  USE_HAL_MDIOS_REGISTER_CALLBACKS when set to 1
  allows the user to configure dynamically the driver callbacks.
  Use Function @ref HAL_MDIOS_RegisterCallback() to register an interrupt callback.

  Function @ref HAL_MDIOS_RegisterCallback() allows to register following callbacks:
    (+) WriteCpltCallback  : Write Complete Callback.
    (+) ReadCpltCallback   : Read Complete Callback.
    (+) ErrorCallback      : Error Callback.
    (+) WakeUpCallback     : Wake UP Callback
    (+) MspInitCallback    : MspInit Callback.
    (+) MspDeInitCallback  : MspDeInit Callback.

  This function takes as parameters the HAL peripheral handle, the Callback ID
  and a pointer to the user callback function.

  Use function @ref HAL_MDIOS_UnRegisterCallback() to reset a callback to the default
  weak function.
  @ref HAL_MDIOS_UnRegisterCallback takes as parameters the HAL peripheral handle,
  and the Callback ID.
  This function allows to reset following callbacks:
    (+) WriteCpltCallback  : Write Complete Callback.
    (+) ReadCpltCallback   : Read Complete Callback.
    (+) ErrorCallback      : Error Callback.
    (+) WakeUpCallback     : Wake UP Callback
    (+) MspInitCallback    : MspInit Callback.
    (+) MspDeInitCallback  : MspDeInit Callback.

  By default, after the HAL_MDIOS_Init and when the state is HAL_MDIOS_STATE_RESET
  all callbacks are set to the corresponding weak functions:
  examples @ref HAL_MDIOS_WriteCpltCallback(), @ref HAL_MDIOS_ReadCpltCallback().
  Exception done for MspInit and MspDeInit functions that are
  reset to the legacy weak function in the HAL_MDIOS_Init/ @ref HAL_MDIOS_DeInit only when
  these callbacks are null (not registered beforehand).
  if not, MspInit or MspDeInit are not null, the HAL_MDIOS_Init/ @ref HAL_MDIOS_DeInit
  keep and use the user MspInit/MspDeInit callbacks (registered beforehand)

  Callbacks can be registered/unregistered in HAL_MDIOS_STATE_READY state only.
  Exception done MspInit/MspDeInit that can be registered/unregistered
  in HAL_MDIOS_STATE_READY or HAL_MDIOS_STATE_RESET state,
  thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
  In that case first register the MspInit/MspDeInit user callbacks
  using @ref HAL_MDIOS_RegisterCallback() before calling @ref HAL_MDIOS_DeInit
  or HAL_MDIOS_Init function.

  When The compilation define USE_HAL_MDIOS_REGISTER_CALLBACKS is set to 0 or
  not defined, the callback registration feature is not available and all callbacks
  are set to the corresponding weak functions.


  @endverbatim
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f7xx_hal.h"

/** @addtogroup STM32F7xx_HAL_Driver
  * @{
  */

/** @defgroup MDIOS MDIOS
  * @brief HAL MDIOS module driver
  * @{
  */
#ifdef HAL_MDIOS_MODULE_ENABLED
    
#if defined (MDIOS)
    
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define MDIOS_PORT_ADDRESS_SHIFT        ((uint32_t)8)
#define	MDIOS_ALL_REG_FLAG	        ((uint32_t)0xFFFFFFFFU)
#define	MDIOS_ALL_ERRORS_FLAG           ((uint32_t)(MDIOS_SR_PERF | MDIOS_SR_SERF | MDIOS_SR_TERF))

#define MDIOS_DIN_BASE_ADDR             (MDIOS_BASE + 0x100)
#define MDIOS_DOUT_BASE_ADDR            (MDIOS_BASE + 0x180)

/* Private macro -------------------------------------------------------------*/ 
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
#if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
static void MDIOS_InitCallbacksToDefault(MDIOS_HandleTypeDef *hmdios);
#endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
/* Private functions ---------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
/** @defgroup MDIOS_Exported_Functions MDIOS Exported Functions
  * @{
  */

/** @defgroup MDIOS_Exported_Functions_Group1 Initialization/de-initialization functions 
  *  @brief    Initialization and Configuration functions 
  *
@verbatim                                               
===============================================================================
            ##### Initialization and Configuration functions #####
 ===============================================================================  
    [..]
    This subsection provides a set of functions allowing to initialize the MDIOS
      (+) The following parameters can be configured: 
        (++) Port Address
        (++) Preamble Check

@endverbatim
  * @{
  */

/**
  * @brief  Initializes the MDIOS according to the specified parameters in 
  *         the MDIOS_InitTypeDef and creates the associated handle .
  * @param  hmdios pointer to a MDIOS_HandleTypeDef structure that contains
  *         the configuration information for MDIOS module
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_MDIOS_Init(MDIOS_HandleTypeDef *hmdios)
{
  uint32_t tmpcr = 0;

  /* Check the MDIOS handle allocation */
  if(hmdios == NULL)
  {
    return HAL_ERROR;
  }
  
  /* Check the parameters */
  assert_param(IS_MDIOS_ALL_INSTANCE(hmdios->Instance));
  assert_param(IS_MDIOS_PORTADDRESS(hmdios->Init.PortAddress));
  assert_param(IS_MDIOS_PREAMBLECHECK(hmdios->Init.PreambleCheck));
  
  /* Process Locked */
  __HAL_LOCK(hmdios);
  
  if(hmdios->State == HAL_MDIOS_STATE_RESET)
  {
#if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)

    MDIOS_InitCallbacksToDefault(hmdios);

    if(hmdios->MspInitCallback == NULL)
    {
      hmdios->MspInitCallback = HAL_MDIOS_MspInit;
    }

    /* Init the low level hardware */
    hmdios->MspInitCallback(hmdios);

#else
   /* Init the low level hardware */
    HAL_MDIOS_MspInit(hmdios);

#endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
  }
  
  /* Change the MDIOS state */
  hmdios->State = HAL_MDIOS_STATE_BUSY;
  
  /* Get the MDIOS CR value */
  tmpcr = hmdios->Instance->CR;
  
  /* Clear PORT_ADDRESS, DPC and EN bits */
  tmpcr &= ((uint32_t)~(MDIOS_CR_EN | MDIOS_CR_DPC | MDIOS_CR_PORT_ADDRESS));
  
  /* Set MDIOS control parametrs and enable the peripheral */
  tmpcr |=  (uint32_t)(((hmdios->Init.PortAddress) << MDIOS_PORT_ADDRESS_SHIFT)    |\
                        (hmdios->Init.PreambleCheck) | \
                        (MDIOS_CR_EN));
  
  /* Write the MDIOS CR */
  hmdios->Instance->CR = tmpcr;
  
  /* Change the MDIOS state */
  hmdios->State = HAL_MDIOS_STATE_READY;
  
  /* Release Lock */
  __HAL_UNLOCK(hmdios);
  
  /* Return function status */
  return HAL_OK;

}

/**
  * @brief  DeInitializes the MDIOS peripheral.
  * @param  hmdios MDIOS handle
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_MDIOS_DeInit(MDIOS_HandleTypeDef *hmdios)
{
  /* Check the MDIOS handle allocation */
  if(hmdios == NULL)
  {
    return HAL_ERROR;
  }
  
  /* Check the parameters */
  assert_param(IS_MDIOS_ALL_INSTANCE(hmdios->Instance));
  
  /* Change the MDIOS state */
  hmdios->State = HAL_MDIOS_STATE_BUSY;
  
  /* Disable the Peripheral */
  __HAL_MDIOS_DISABLE(hmdios);
  
#if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)

  if(hmdios->MspDeInitCallback == NULL)
  {
    hmdios->MspDeInitCallback = HAL_MDIOS_MspDeInit;
  }
  /* DeInit the low level hardware */
  hmdios->MspDeInitCallback(hmdios);

#else

  /* DeInit the low level hardware */
  HAL_MDIOS_MspDeInit(hmdios);
  
#endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */

  /* Change the MDIOS state */
  hmdios->State = HAL_MDIOS_STATE_RESET;
  
  /* Release Lock */
  __HAL_UNLOCK(hmdios);
  
  /* Return function status */
  return HAL_OK;
}

/**
  * @brief  MDIOS MSP Init
  * @param  hmdios mdios handle
  * @retval None
  */
 __weak void HAL_MDIOS_MspInit(MDIOS_HandleTypeDef *hmdios)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hmdios);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_MDIOS_MspInit can be implemented in the user file
   */ 
}

/**
  * @brief  MDIOS MSP DeInit
  * @param  hmdios mdios handle
  * @retval None
  */
 __weak void HAL_MDIOS_MspDeInit(MDIOS_HandleTypeDef *hmdios)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hmdios);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_MDIOS_MspDeInit can be implemented in the user file
   */ 
}

#if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
/**
* @brief  Register a User MDIOS Callback
*         To be used instead of the weak predefined callback
* @param hmdios mdios handle
* @param CallbackID ID of the callback to be registered
*        This parameter can be one of the following values:
*          @arg @ref HAL_MDIOS_WRITE_COMPLETE_CB_ID Write Complete Callback ID
*          @arg @ref HAL_MDIOS_READ_COMPLETE_CB_ID  Read Complete Callback ID
*          @arg @ref HAL_MDIOS_ERROR_CB_ID          Error Callback ID
*          @arg @ref HAL_MDIOS_WAKEUP_CB_ID         Wake Up Callback ID
*          @arg @ref HAL_MDIOS_MSPINIT_CB_ID        MspInit callback ID
*          @arg @ref HAL_MDIOS_MSPDEINIT_CB_ID      MspDeInit callback ID
* @param pCallback pointer to the Callback function
* @retval status
*/
HAL_StatusTypeDef HAL_MDIOS_RegisterCallback(MDIOS_HandleTypeDef *hmdios, HAL_MDIOS_CallbackIDTypeDef CallbackID, pMDIOS_CallbackTypeDef pCallback)
{
  HAL_StatusTypeDef status = HAL_OK;

  if(pCallback == NULL)
  {
    /* Return error status */
    return HAL_ERROR;
  }
  /* Process locked */
  __HAL_LOCK(hmdios);

  if(hmdios->State == HAL_MDIOS_STATE_READY)
  {
    switch (CallbackID)
    {
    case HAL_MDIOS_WRITE_COMPLETE_CB_ID :
      hmdios->WriteCpltCallback = pCallback;
      break;

    case HAL_MDIOS_READ_COMPLETE_CB_ID :
      hmdios->ReadCpltCallback = pCallback;
      break;

    case HAL_MDIOS_ERROR_CB_ID :
      hmdios->ErrorCallback = pCallback;
      break;

    case HAL_MDIOS_WAKEUP_CB_ID :
      hmdios->WakeUpCallback = pCallback;
      break;

    case HAL_MDIOS_MSPINIT_CB_ID :
      hmdios->MspInitCallback = pCallback;
      break;

    case HAL_MDIOS_MSPDEINIT_CB_ID :
      hmdios->MspDeInitCallback = pCallback;
      break;

    default :
      /* Return error status */
      status =  HAL_ERROR;
      break;
    }
  }
  else if(hmdios->State == HAL_MDIOS_STATE_RESET)
  {
    switch (CallbackID)
    {
    case HAL_MDIOS_MSPINIT_CB_ID :
      hmdios->MspInitCallback = pCallback;
      break;

    case HAL_MDIOS_MSPDEINIT_CB_ID :
      hmdios->MspDeInitCallback = pCallback;
      break;

    default :
      /* Return error status */
      status =  HAL_ERROR;
      break;
    }
  }
  else
  {
    /* Return error status */
    status =  HAL_ERROR;
  }

  /* Release Lock */
  __HAL_UNLOCK(hmdios);

  return status;
}

/**
* @brief  Unregister an MDIOS Callback
*         MDIOS callabck is redirected to the weak predefined callback
* @param hmdios mdios handle
* @param CallbackID ID of the callback to be unregistered
*        This parameter can be one of the following values:
*          @arg @ref HAL_MDIOS_WRITE_COMPLETE_CB_ID Write Complete Callback ID
*          @arg @ref HAL_MDIOS_READ_COMPLETE_CB_ID  Read Complete Callback ID
*          @arg @ref HAL_MDIOS_ERROR_CB_ID          Error Callback ID
*          @arg @ref HAL_MDIOS_WAKEUP_CB_ID         Wake Up Callback ID
*          @arg @ref HAL_MDIOS_MSPINIT_CB_ID        MspInit callback ID
*          @arg @ref HAL_MDIOS_MSPDEINIT_CB_ID      MspDeInit callback ID
* @retval status
*/
HAL_StatusTypeDef HAL_MDIOS_UnRegisterCallback(MDIOS_HandleTypeDef *hmdios, HAL_MDIOS_CallbackIDTypeDef CallbackID)
{
  HAL_StatusTypeDef status = HAL_OK;

  /* Process locked */
  __HAL_LOCK(hmdios);

  if(hmdios->State == HAL_MDIOS_STATE_READY)
  {
    switch (CallbackID)
    {
    case HAL_MDIOS_WRITE_COMPLETE_CB_ID :
      hmdios->WriteCpltCallback = HAL_MDIOS_WriteCpltCallback;
      break;

    case HAL_MDIOS_READ_COMPLETE_CB_ID :
      hmdios->ReadCpltCallback = HAL_MDIOS_ReadCpltCallback;
      break;

    case HAL_MDIOS_ERROR_CB_ID :
      hmdios->ErrorCallback = HAL_MDIOS_ErrorCallback;
      break;

    case HAL_MDIOS_WAKEUP_CB_ID :
      hmdios->WakeUpCallback = HAL_MDIOS_WakeUpCallback;
      break;

    case HAL_MDIOS_MSPINIT_CB_ID :
      hmdios->MspInitCallback = HAL_MDIOS_MspInit;
      break;

    case HAL_MDIOS_MSPDEINIT_CB_ID :
      hmdios->MspDeInitCallback = HAL_MDIOS_MspDeInit;
      break;

    default :
      /* Return error status */
      status =  HAL_ERROR;
      break;
    }
  }
  else if(hmdios->State == HAL_MDIOS_STATE_RESET)
  {
    switch (CallbackID)
    {
    case HAL_MDIOS_MSPINIT_CB_ID :
      hmdios->MspInitCallback = HAL_MDIOS_MspInit;
      break;

    case HAL_MDIOS_MSPDEINIT_CB_ID :
      hmdios->MspDeInitCallback = HAL_MDIOS_MspDeInit;
      break;

    default :
      /* Return error status */
      status =  HAL_ERROR;
      break;
    }
  }
  else
  {
    /* Return error status */
    status =  HAL_ERROR;
  }

  /* Release Lock */
  __HAL_UNLOCK(hmdios);

  return status;
}

static void MDIOS_InitCallbacksToDefault(MDIOS_HandleTypeDef *hmdios)
{
  /* Init the MDIOS Callback settings */
  hmdios->WriteCpltCallback  = HAL_MDIOS_WriteCpltCallback;   /* Legacy weak WriteCpltCallback   */
  hmdios->ReadCpltCallback   = HAL_MDIOS_ReadCpltCallback;    /* Legacy weak ReadCpltCallback    */
  hmdios->ErrorCallback      = HAL_MDIOS_ErrorCallback;       /* Legacy weak ErrorCallback       */
  hmdios->WakeUpCallback     = HAL_MDIOS_WakeUpCallback;      /* Legacy weak WakeUpCallback      */
}
#endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */

/**
  * @}
  */

/** @defgroup MDIOS_Exported_Functions_Group2 IO operation functions 
  *  @brief MDIOS Read/Write functions 
  *
@verbatim   
 ===============================================================================
                      ##### IO operation functions #####
 ===============================================================================
    This subsection provides a set of functions allowing to manage the MDIOS 
    read and write operations.

    (#) APIs that allow to the MDIOS to read/write from/to the 
        values of one of the DINn/DOUTn registers:
        (+) Read the value of a DINn register: HAL_MDIOS_ReadReg()
        (+) Write a value to a DOUTn register: HAL_MDIOS_WriteReg()

    (#) APIs that provide if there are some Slave registres have been 
        read or written by the Master:
        (+) DOUTn registers read by Master: HAL_MDIOS_GetReadRegAddress()
        (+) DINn registers written by Master : HAL_MDIOS_GetWrittenRegAddress()

    (#) APIs that Clear the read/write flags:
        (+) Clear read registers flags: HAL_MDIOS_ClearReadRegAddress()
        (+) Clear write registers flags: HAL_MDIOS_ClearWriteRegAddress()

    (#) A set of Callbacks are provided:
        (+) HAL_MDIOS_WriteCpltCallback()
        (+) HAL_MDIOS_ReadCpltCallback()
        (+) HAL_MDIOS_ErrorCallback() 

@endverbatim
  * @{
  */

/**
  * @brief  Writes to an MDIOS output register
  * @param  hmdios mdios handle
  * @param  RegNum MDIOS input register number    
  * @param  Data Data to write
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_MDIOS_WriteReg(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum, uint16_t Data)
{
  uint32_t tmpreg;
  
  /* Check the parameters */
  assert_param(IS_MDIOS_REGISTER(RegNum));
      
  /* Process Locked */
  __HAL_LOCK(hmdios);
  
  /* Get the addr of output register to be written by the MDIOS */
  tmpreg = MDIOS_DOUT_BASE_ADDR + (4 * RegNum);
    
  /* Write to DOUTn register */
  *((uint32_t *)tmpreg) = Data;  
        
    /* Process Unlocked */
  __HAL_UNLOCK(hmdios);
        
  return HAL_OK;   
}
      
/**
  * @brief  Reads an MDIOS input register
  * @param  hmdios mdios handle
  * @param  RegNum MDIOS input register number
  * @param  pData pointer to Data
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_MDIOS_ReadReg(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum, uint16_t *pData)
{
  uint32_t tmpreg;
  
  /* Check the parameters */
  assert_param(IS_MDIOS_REGISTER(RegNum));

  /* Process Locked */
  __HAL_LOCK(hmdios);
  
  /* Get the addr of input register to be read by the MDIOS */
  tmpreg = MDIOS_DIN_BASE_ADDR + (4 * RegNum);

  /* Read DINn register */
  *pData = (uint16_t)(*((uint32_t *)tmpreg));

  /* Process Unlocked */
  __HAL_UNLOCK(hmdios);

  return HAL_OK;
}

/**
  * @brief  Gets Written registers by MDIO master
  * @param  hmdios mdios handle
  * @retval bit map of written registers addresses
  */
uint32_t HAL_MDIOS_GetWrittenRegAddress(MDIOS_HandleTypeDef *hmdios)
{        
  return hmdios->Instance->WRFR;   
}

/**
  * @brief  Gets Read registers by MDIO master
  * @param  hmdios mdios handle
  * @retval bit map of read registers addresses
  */
uint32_t HAL_MDIOS_GetReadRegAddress(MDIOS_HandleTypeDef *hmdios)
{        
  return hmdios->Instance->RDFR;   
}

/**
  * @brief  Clears Write registers flag
  * @param  hmdios mdios handle
  * @param  RegNum registers addresses to be cleared
  * @retval HAL status 
  */
HAL_StatusTypeDef HAL_MDIOS_ClearWriteRegAddress(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum)
{
  /* Check the parameters */
  assert_param(IS_MDIOS_REGISTER(RegNum));
  
  /* Process Locked */
  __HAL_LOCK(hmdios);
         
  /* Clear write registers flags */
  hmdios->Instance->CWRFR |= (RegNum);
 
  /* Release Lock */
  __HAL_UNLOCK(hmdios);
  
  return HAL_OK;  
}

/**
  * @brief  Clears Read register flag
  * @param  hmdios mdios handle
  * @param  RegNum registers addresses to be cleared
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_MDIOS_ClearReadRegAddress(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum)
{
  /* Check the parameters */
  assert_param(IS_MDIOS_REGISTER(RegNum));
  
  /* Process Locked */
  __HAL_LOCK(hmdios);
          
  /* Clear read registers flags */
  hmdios->Instance->CRDFR |= (RegNum); 
  
  /* Release Lock */
  __HAL_UNLOCK(hmdios);
  
  return HAL_OK;    
}

/**
  * @brief  Enables Events for MDIOS peripheral 
  * @param  hmdios mdios handle
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_MDIOS_EnableEvents(MDIOS_HandleTypeDef *hmdios)
{        
  /* Process Locked */
  __HAL_LOCK(hmdios);
  
  /* Enable MDIOS interrupts: Register Write, Register Read and Error ITs */
  __HAL_MDIOS_ENABLE_IT(hmdios, (MDIOS_IT_WRITE | MDIOS_IT_READ | MDIOS_IT_ERROR));
  
  /* Process Unlocked */
  __HAL_UNLOCK(hmdios);
    
  return HAL_OK;   
}

/**
  * @brief This function handles MDIOS interrupt request.
  * @param hmdios MDIOS handle
  * @retval None
  */
void HAL_MDIOS_IRQHandler(MDIOS_HandleTypeDef *hmdios)
{
  /* Write Register Interrupt enabled ? */
  if(__HAL_MDIOS_GET_IT_SOURCE(hmdios, MDIOS_IT_WRITE) != RESET)
  {
    /* Write register flag */
    if(HAL_MDIOS_GetWrittenRegAddress(hmdios) != RESET)
    {
#if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
        /* Call registered Write complete callback */
        hmdios->WriteCpltCallback(hmdios);
#else
      /* Write callback function */
      HAL_MDIOS_WriteCpltCallback(hmdios);
#endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
      
      /* Clear write register flag */
      HAL_MDIOS_ClearWriteRegAddress(hmdios, MDIOS_ALL_REG_FLAG);
    }
  }
  
  /* Read Register Interrupt enabled ? */
  if(__HAL_MDIOS_GET_IT_SOURCE(hmdios, MDIOS_IT_READ) != RESET)
  {
    /* Read register flag */
    if(HAL_MDIOS_GetReadRegAddress(hmdios) != RESET)
    {
#if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
      /* Call registered Read complete callback */
      hmdios->ReadCpltCallback(hmdios);
#else
      /* Read callback function  */
      HAL_MDIOS_ReadCpltCallback(hmdios);
#endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
      
      /* Clear read register flag */
      HAL_MDIOS_ClearReadRegAddress(hmdios, MDIOS_ALL_REG_FLAG);
    }
  }
  
  /* Error Interrupt enabled ? */
  if(__HAL_MDIOS_GET_IT_SOURCE(hmdios, MDIOS_IT_ERROR) != RESET)
  {
    /* All Errors Flag */
    if(__HAL_MDIOS_GET_ERROR_FLAG(hmdios, MDIOS_ALL_ERRORS_FLAG) !=RESET)
    {
#if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
      /* Call registered Error callback */
      hmdios->ErrorCallback(hmdios);
#else
      /* Error Callback */
      HAL_MDIOS_ErrorCallback(hmdios);
#endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
      
      /* Clear errors flag */
      __HAL_MDIOS_CLEAR_ERROR_FLAG(hmdios, MDIOS_ALL_ERRORS_FLAG);
    }
  }
   
  /* check MDIOS WAKEUP exti flag */
  if(__HAL_MDIOS_WAKEUP_EXTI_GET_FLAG() != RESET)
  {
#if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
    /* Call registered WakeUp callback */
    hmdios->WakeUpCallback(hmdios);
#else
    /* MDIOS WAKEUP interrupt user callback */
    HAL_MDIOS_WakeUpCallback(hmdios);
#endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */

    /* Clear MDIOS WAKEUP Exti pending bit */
    __HAL_MDIOS_WAKEUP_EXTI_CLEAR_FLAG();
  }
}

/**
  * @brief  Write Complete Callback
  * @param  hmdios mdios handle
  * @retval None
  */
 __weak void HAL_MDIOS_WriteCpltCallback(MDIOS_HandleTypeDef *hmdios)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hmdios);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_MDIOS_WriteCpltCallback can be implemented in the user file
   */ 
}

/**
  * @brief  Read Complete Callback
  * @param  hmdios mdios handle
  * @retval None
  */
 __weak void HAL_MDIOS_ReadCpltCallback(MDIOS_HandleTypeDef *hmdios)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hmdios);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_MDIOS_ReadCpltCallback can be implemented in the user file
   */ 
}

/**
  * @brief Error Callback
  * @param hmdios mdios handle
  * @retval None
  */
 __weak void HAL_MDIOS_ErrorCallback(MDIOS_HandleTypeDef *hmdios)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hmdios);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_MDIOS_ErrorCallback can be implemented in the user file
   */ 
}

/**
  * @brief  MDIOS WAKEUP interrupt callback
  * @param hmdios mdios handle
  * @retval None
  */
__weak void HAL_MDIOS_WakeUpCallback(MDIOS_HandleTypeDef *hmdios)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hmdios);
  
  /* NOTE : This function Should not be modified, when the callback is needed,
            the HAL_MDIOS_WakeUpCallback could be implemented in the user file
   */ 
}

/**
  * @}
  */

/** @defgroup MDIOS_Exported_Functions_Group3 Peripheral Control functions 
  *  @brief   MDIOS control functions 
  *
@verbatim   
 ===============================================================================
                      ##### Peripheral Control functions #####
 ===============================================================================  
    [..]
    This subsection provides a set of functions allowing to control the MDIOS.
     (+) HAL_MDIOS_GetState() API, helpful to check in run-time the state. 
     (+) HAL_MDIOS_GetError() API, returns the errors occurred during data transfer. 
        
@endverbatim
  * @{
  */

/**
  * @brief  Gets MDIOS error flags 
  * @param  hmdios mdios handle
  * @retval bit map of occurred errors 
  */
uint32_t HAL_MDIOS_GetError(MDIOS_HandleTypeDef *hmdios)
{
  /* return errors flags on status register */
  return hmdios->Instance->SR;
}

/**
  * @brief  Return the MDIOS HAL state
  * @param  hmdios mdios handle
  * @retval MDIOS state
  */
HAL_MDIOS_StateTypeDef HAL_MDIOS_GetState(MDIOS_HandleTypeDef *hmdios)
{
  /* Return MDIOS state */
  return hmdios->State;
}

/**
  * @}
  */ 

/**
  * @}
  */ 
#endif /* MDIOS */
#endif /* HAL_MDIOS_MODULE_ENABLED */
/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
