Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:08

0001 /**
0002   ******************************************************************************
0003   * @file    stm32h7xx_hal_mdios.c
0004   * @author  MCD Application Team
0005   * @brief   MDIOS HAL module driver.
0006   *          This file provides firmware functions to manage the following
0007   *          functionalities of the MDIOS Peripheral.
0008   *           + Initialization and de-initialization functions
0009   *           + IO operation functions
0010   *           + Peripheral Control functions
0011   *
0012   *
0013   ******************************************************************************
0014   * @attention
0015   *
0016   * Copyright (c) 2017 STMicroelectronics.
0017   * All rights reserved.
0018   *
0019   * This software is licensed under terms that can be found in the LICENSE file
0020   * in the root directory of this software component.
0021   * If no LICENSE file comes with this software, it is provided AS-IS.
0022   *
0023   ******************************************************************************
0024   @verbatim
0025  ===============================================================================
0026                         ##### How to use this driver #####
0027  ===============================================================================
0028     [..]
0029     The MDIOS HAL driver can be used as follow:
0030 
0031     (#) Declare a MDIOS_HandleTypeDef handle structure.
0032 
0033     (#) Initialize the MDIOS low level resources by implementing the HAL_MDIOS_MspInit() API:
0034         (##) Enable the MDIOS interface clock.
0035         (##) MDIOS pins configuration:
0036             (+++) Enable clocks for the MDIOS GPIOs.
0037             (+++) Configure the MDIOS pins as alternate function.
0038         (##) NVIC configuration if you need to use interrupt process:
0039             (+++) Configure the MDIOS interrupt priority.
0040             (+++) Enable the NVIC MDIOS IRQ handle.
0041 
0042     (#) Program the Port Address and the Preamble Check in the Init structure.
0043 
0044     (#) Initialize the MDIOS registers by calling the HAL_MDIOS_Init() API.
0045 
0046     (#) Perform direct slave read/write operations using the following APIs:
0047         (##) Read the value of a DINn register: HAL_MDIOS_ReadReg()
0048         (##) Write a value to a DOUTn register: HAL_MDIOS_WriteReg()
0049 
0050     (#) Get the Master read/write operations flags using the following APIs:
0051         (##) Bit map of DOUTn registers read by Master: HAL_MDIOS_GetReadRegAddress()
0052         (##) Bit map of DINn registers written by Master : HAL_MDIOS_GetWrittenRegAddress()
0053 
0054     (#) Clear the read/write flags using the following APIs:
0055         (##) Clear read flags of a set of registers: HAL_MDIOS_ClearReadRegAddress()
0056         (##) Clear write flags of a set of registers: HAL_MDIOS_ClearWriteRegAddress()
0057 
0058     (#) Enable interrupts on events using HAL_MDIOS_EnableEvents(), when called
0059         the MDIOS will generate an interrupt in the following cases:
0060         (##) a DINn register written by the Master
0061         (##) a DOUTn register read by the Master
0062         (##) an error occur
0063 
0064         (@) A callback is executed for each genereted interrupt, so the driver provide the following
0065             HAL_MDIOS_WriteCpltCallback(), HAL_MDIOS_ReadCpltCallback() and HAL_MDIOS_ErrorCallback()
0066         (@) HAL_MDIOS_IRQHandler() must be called from the MDIOS IRQ Handler, to handle the interrupt
0067             and execute the previous callbacks
0068 
0069     (#) Reset the MDIOS peripheral and all related resources by calling the HAL_MDIOS_DeInit() API.
0070         (##) HAL_MDIOS_MspDeInit() must be implemented to reset low level resources
0071             (GPIO, Clocks, NVIC configuration ...)
0072 
0073   *** Callback registration ***
0074   =============================================
0075 
0076   The compilation define  USE_HAL_MDIOS_REGISTER_CALLBACKS when set to 1
0077   allows the user to configure dynamically the driver callbacks.
0078   Use Function @ref HAL_MDIOS_RegisterCallback() to register an interrupt callback.
0079 
0080   Function @ref HAL_MDIOS_RegisterCallback() allows to register following callbacks:
0081     (+) WriteCpltCallback  : Write Complete Callback.
0082     (+) ReadCpltCallback   : Read Complete Callback.
0083     (+) ErrorCallback      : Error Callback.
0084     (+) WakeUpCallback     : Wake UP Callback
0085     (+) MspInitCallback    : MspInit Callback.
0086     (+) MspDeInitCallback  : MspDeInit Callback.
0087 
0088   This function takes as parameters the HAL peripheral handle, the Callback ID
0089   and a pointer to the user callback function.
0090 
0091   Use function @ref HAL_MDIOS_UnRegisterCallback() to reset a callback to the default
0092   weak function.
0093   @ref HAL_MDIOS_UnRegisterCallback takes as parameters the HAL peripheral handle,
0094   and the Callback ID.
0095   This function allows to reset following callbacks:
0096     (+) WriteCpltCallback  : Write Complete Callback.
0097     (+) ReadCpltCallback   : Read Complete Callback.
0098     (+) ErrorCallback      : Error Callback.
0099     (+) WakeUpCallback     : Wake UP Callback
0100     (+) MspInitCallback    : MspInit Callback.
0101     (+) MspDeInitCallback  : MspDeInit Callback.
0102 
0103   By default, after the HAL_MDIOS_Init and when the state is HAL_MDIOS_STATE_RESET
0104   all callbacks are set to the corresponding weak functions:
0105   examples @ref HAL_MDIOS_WriteCpltCallback(), @ref HAL_MDIOS_ReadCpltCallback().
0106   Exception done for MspInit and MspDeInit functions that are
0107   reset to the legacy weak function in the HAL_MDIOS_Init/ @ref HAL_MDIOS_DeInit only when
0108   these callbacks are null (not registered beforehand).
0109   if not, MspInit or MspDeInit are not null, the HAL_MDIOS_Init/ @ref HAL_MDIOS_DeInit
0110   keep and use the user MspInit/MspDeInit callbacks (registered beforehand)
0111 
0112   Callbacks can be registered/unregistered in HAL_MDIOS_STATE_READY state only.
0113   Exception done MspInit/MspDeInit that can be registered/unregistered
0114   in HAL_MDIOS_STATE_READY or HAL_MDIOS_STATE_RESET state,
0115   thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
0116   In that case first register the MspInit/MspDeInit user callbacks
0117   using @ref HAL_MDIOS_RegisterCallback() before calling @ref HAL_MDIOS_DeInit
0118   or HAL_MDIOS_Init function.
0119 
0120   When The compilation define USE_HAL_MDIOS_REGISTER_CALLBACKS is set to 0 or
0121   not defined, the callback registration feature is not available and all callbacks
0122   are set to the corresponding weak functions.
0123 
0124 
0125   @endverbatim
0126   */
0127 
0128 /* Includes ------------------------------------------------------------------*/
0129 #include "stm32h7xx_hal.h"
0130 
0131 /** @addtogroup STM32H7xx_HAL_Driver
0132   * @{
0133   */
0134 #if defined (MDIOS)
0135 /** @defgroup MDIOS  MDIOS
0136   * @ingroup RTEMSBSPsARMSTM32H7
0137   * @brief HAL MDIOS module driver
0138   * @{
0139   */
0140 #ifdef HAL_MDIOS_MODULE_ENABLED
0141 
0142 
0143 
0144 /* Private typedef -----------------------------------------------------------*/
0145 /* Private define ------------------------------------------------------------*/
0146 /** @defgroup MDIOS_Private_Define MDIOS Private Define
0147   * @ingroup RTEMSBSPsARMSTM32H7
0148   * @{
0149   */
0150 #define MDIOS_PORT_ADDRESS_SHIFT        ((uint32_t)8)
0151 #define  MDIOS_ALL_REG_FLAG             ((uint32_t)0xFFFFFFFFU)
0152 #define  MDIOS_ALL_ERRORS_FLAG          ((uint32_t)(MDIOS_SR_PERF | MDIOS_SR_SERF | MDIOS_SR_TERF))
0153 
0154 #define MDIOS_DIN_BASE_ADDR             (MDIOS_BASE + 0x100U)
0155 #define MDIOS_DOUT_BASE_ADDR            (MDIOS_BASE + 0x180U)
0156 /**
0157   * @}
0158   */
0159 /* Private macro -------------------------------------------------------------*/
0160 /* Private variables ---------------------------------------------------------*/
0161 /* Private function prototypes -----------------------------------------------*/
0162 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0163 /** @defgroup MDIOS_Private_Functions MDIOS Private Functions
0164   * @ingroup RTEMSBSPsARMSTM32H7
0165   * @{
0166   */
0167 static void MDIOS_InitCallbacksToDefault(MDIOS_HandleTypeDef *hmdios);
0168 /**
0169   * @}
0170   */
0171 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
0172 /* Private functions ---------------------------------------------------------*/
0173 /* Exported functions --------------------------------------------------------*/
0174 /** @defgroup MDIOS_Exported_Functions MDIOS Exported Functions
0175   * @ingroup RTEMSBSPsARMSTM32H7
0176   * @{
0177   */
0178 
0179 /** @defgroup MDIOS_Exported_Functions_Group1 Initialization/de-initialization functions
0180   * @ingroup RTEMSBSPsARMSTM32H7
0181   *  @brief    Initialization and Configuration functions
0182   *
0183 @verbatim
0184 ===============================================================================
0185             ##### Initialization and Configuration functions #####
0186  ===============================================================================
0187     [..]
0188     This subsection provides a set of functions allowing to initialize the MDIOS
0189       (+) The following parameters can be configured:
0190         (++) Port Address
0191         (++) Preamble Check
0192 
0193 @endverbatim
0194   * @{
0195   */
0196 
0197 /**
0198   * @brief  Initializes the MDIOS according to the specified parameters in
0199   *         the MDIOS_InitTypeDef and creates the associated handle .
0200   * @param  hmdios: pointer to a MDIOS_HandleTypeDef structure that contains
0201   *         the configuration information for MDIOS module
0202   * @retval HAL status
0203   */
0204 HAL_StatusTypeDef HAL_MDIOS_Init(MDIOS_HandleTypeDef *hmdios)
0205 {
0206   uint32_t tmpcr;
0207 
0208   /* Check the MDIOS handle allocation */
0209   if(hmdios == NULL)
0210   {
0211     return HAL_ERROR;
0212   }
0213 
0214   /* Check the parameters */
0215   assert_param(IS_MDIOS_ALL_INSTANCE(hmdios->Instance));
0216   assert_param(IS_MDIOS_PORTADDRESS(hmdios->Init.PortAddress));
0217   assert_param(IS_MDIOS_PREAMBLECHECK(hmdios->Init.PreambleCheck));
0218 
0219 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0220 
0221   if(hmdios->State == HAL_MDIOS_STATE_RESET)
0222   {
0223     MDIOS_InitCallbacksToDefault(hmdios);
0224 
0225     if(hmdios->MspInitCallback == NULL)
0226     {
0227       hmdios->MspInitCallback = HAL_MDIOS_MspInit;
0228     }
0229 
0230     /* Init the low level hardware */
0231     hmdios->MspInitCallback(hmdios);
0232   }
0233 
0234 #else
0235 
0236   if(hmdios->State == HAL_MDIOS_STATE_RESET)
0237   {
0238     /* Init the low level hardware */
0239     HAL_MDIOS_MspInit(hmdios);
0240   }
0241 
0242 #endif /* (USE_HAL_MDIOS_REGISTER_CALLBACKS) */
0243 
0244   /* Change the MDIOS state */
0245   hmdios->State = HAL_MDIOS_STATE_BUSY;
0246 
0247   /* Get the MDIOS CR value */
0248   tmpcr = hmdios->Instance->CR;
0249 
0250   /* Clear PORT_ADDRESS, DPC and EN bits */
0251   tmpcr &= ((uint32_t)~(MDIOS_CR_EN | MDIOS_CR_DPC | MDIOS_CR_PORT_ADDRESS));
0252 
0253   /* Set MDIOS control parametrs and enable the peripheral */
0254   tmpcr |=  (uint32_t)(((hmdios->Init.PortAddress) << MDIOS_PORT_ADDRESS_SHIFT)    |\
0255                         (hmdios->Init.PreambleCheck) | \
0256                         (MDIOS_CR_EN));
0257 
0258   /* Write the MDIOS CR */
0259   hmdios->Instance->CR = tmpcr;
0260 
0261   hmdios->ErrorCode = HAL_MDIOS_ERROR_NONE;
0262 
0263   /* Change the MDIOS state */
0264   hmdios->State = HAL_MDIOS_STATE_READY;
0265 
0266   /* Release Lock */
0267   __HAL_UNLOCK(hmdios);
0268 
0269   /* Return function status */
0270   return HAL_OK;
0271 
0272 }
0273 
0274 /**
0275   * @brief  DeInitializes the MDIOS peripheral.
0276   * @param  hmdios: MDIOS handle
0277   * @retval HAL status
0278   */
0279 HAL_StatusTypeDef HAL_MDIOS_DeInit(MDIOS_HandleTypeDef *hmdios)
0280 {
0281   /* Check the MDIOS handle allocation */
0282   if(hmdios == NULL)
0283   {
0284     return HAL_ERROR;
0285   }
0286 
0287   /* Check the parameters */
0288   assert_param(IS_MDIOS_ALL_INSTANCE(hmdios->Instance));
0289 
0290   /* Change the MDIOS state */
0291   hmdios->State = HAL_MDIOS_STATE_BUSY;
0292 
0293   /* Disable the Peripheral */
0294   __HAL_MDIOS_DISABLE(hmdios);
0295 
0296 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0297 
0298   if(hmdios->MspDeInitCallback == NULL)
0299   {
0300     hmdios->MspDeInitCallback = HAL_MDIOS_MspDeInit;
0301   }
0302   /* DeInit the low level hardware */
0303   hmdios->MspDeInitCallback(hmdios);
0304 #else
0305 
0306   /* DeInit the low level hardware */
0307   HAL_MDIOS_MspDeInit(hmdios);
0308 
0309 #endif /* (USE_HAL_MDIOS_REGISTER_CALLBACKS) */
0310 
0311   /* Change the MDIOS state */
0312   hmdios->State = HAL_MDIOS_STATE_RESET;
0313 
0314   /* Release Lock */
0315   __HAL_UNLOCK(hmdios);
0316 
0317   /* Return function status */
0318   return HAL_OK;
0319 }
0320 
0321 /**
0322   * @brief  MDIOS MSP Init
0323   * @param  hmdios: mdios handle
0324   * @retval None
0325   */
0326  __weak void HAL_MDIOS_MspInit(MDIOS_HandleTypeDef *hmdios)
0327 {
0328   /* Prevent unused argument(s) compilation warning */
0329   UNUSED(hmdios);
0330 
0331   /* NOTE : This function should not be modified, when the callback is needed,
0332             the HAL_MDIOS_MspInit can be implemented in the user file
0333    */
0334 }
0335 
0336 /**
0337   * @brief  MDIOS MSP DeInit
0338   * @param  hmdios: mdios handle
0339   * @retval None
0340   */
0341  __weak void HAL_MDIOS_MspDeInit(MDIOS_HandleTypeDef *hmdios)
0342 {
0343   /* Prevent unused argument(s) compilation warning */
0344   UNUSED(hmdios);
0345 
0346   /* NOTE : This function should not be modified, when the callback is needed,
0347             the HAL_MDIOS_MspDeInit can be implemented in the user file
0348    */
0349 }
0350 
0351 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0352 /**
0353   * @brief  Register a User MDIOS Callback
0354   *         To be used instead of the weak predefined callback
0355   * @param hmdios mdios handle
0356   * @param CallbackID ID of the callback to be registered
0357   *        This parameter can be one of the following values:
0358   *          @arg @ref HAL_MDIOS_WRITE_COMPLETE_CB_ID Write Complete Callback ID
0359   *          @arg @ref HAL_MDIOS_READ_COMPLETE_CB_ID  Read Complete Callback ID
0360   *          @arg @ref HAL_MDIOS_ERROR_CB_ID          Error Callback ID
0361   *          @arg @ref HAL_MDIOS_WAKEUP_CB_ID         Wake Up Callback ID
0362   *          @arg @ref HAL_MDIOS_MSPINIT_CB_ID        MspInit callback ID
0363   *          @arg @ref HAL_MDIOS_MSPDEINIT_CB_ID      MspDeInit callback ID
0364   * @param pCallback pointer to the Callback function
0365   * @retval status
0366   */
0367 HAL_StatusTypeDef HAL_MDIOS_RegisterCallback(MDIOS_HandleTypeDef *hmdios, HAL_MDIOS_CallbackIDTypeDef CallbackID, pMDIOS_CallbackTypeDef pCallback)
0368 {
0369   HAL_StatusTypeDef status = HAL_OK;
0370 
0371   if(pCallback == NULL)
0372   {
0373     /* Update the error code */
0374     hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK;
0375 
0376     return HAL_ERROR;
0377   }
0378   /* Process locked */
0379   __HAL_LOCK(hmdios);
0380 
0381   if(hmdios->State == HAL_MDIOS_STATE_READY)
0382   {
0383     switch (CallbackID)
0384     {
0385     case HAL_MDIOS_WRITE_COMPLETE_CB_ID :
0386       hmdios->WriteCpltCallback = pCallback;
0387       break;
0388 
0389     case HAL_MDIOS_READ_COMPLETE_CB_ID :
0390       hmdios->ReadCpltCallback = pCallback;
0391       break;
0392 
0393     case HAL_MDIOS_ERROR_CB_ID :
0394       hmdios->ErrorCallback = pCallback;
0395       break;
0396 
0397     case HAL_MDIOS_WAKEUP_CB_ID :
0398       hmdios->WakeUpCallback = pCallback;
0399       break;
0400 
0401     case HAL_MDIOS_MSPINIT_CB_ID :
0402       hmdios->MspInitCallback = pCallback;
0403       break;
0404 
0405    case HAL_MDIOS_MSPDEINIT_CB_ID :
0406       hmdios->MspDeInitCallback = pCallback;
0407       break;
0408 
0409     default :
0410       /* Update the error code */
0411       hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK;
0412       /* Return error status */
0413       status =  HAL_ERROR;
0414       break;
0415     }
0416   }
0417   else if(hmdios->State == HAL_MDIOS_STATE_RESET)
0418   {
0419     switch (CallbackID)
0420     {
0421     case HAL_MDIOS_MSPINIT_CB_ID :
0422       hmdios->MspInitCallback = pCallback;
0423       break;
0424 
0425    case HAL_MDIOS_MSPDEINIT_CB_ID :
0426       hmdios->MspDeInitCallback = pCallback;
0427       break;
0428 
0429     default :
0430       /* Update the error code */
0431       hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK;
0432      /* Return error status */
0433       status =  HAL_ERROR;
0434       break;
0435     }
0436   }
0437   else
0438   {
0439     /* Update the error code */
0440     hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK;
0441     /* Return error status */
0442     status =  HAL_ERROR;
0443   }
0444 
0445   /* Release Lock */
0446   __HAL_UNLOCK(hmdios);
0447 
0448   return status;
0449 }
0450 
0451 /**
0452   * @brief  Unregister an MDIOS Callback
0453   *         MDIOS callback is redirected to the weak predefined callback
0454   * @param hmdios mdios handle
0455   * @param CallbackID ID of the callback to be unregistered
0456   *        This parameter can be one of the following values:
0457   *          @arg @ref HAL_MDIOS_WRITE_COMPLETE_CB_ID Write Complete Callback ID
0458   *          @arg @ref HAL_MDIOS_READ_COMPLETE_CB_ID  Read Complete Callback ID
0459   *          @arg @ref HAL_MDIOS_ERROR_CB_ID          Error Callback ID
0460   *          @arg @ref HAL_MDIOS_WAKEUP_CB_ID         Wake Up Callback ID
0461   *          @arg @ref HAL_MDIOS_MSPINIT_CB_ID        MspInit callback ID
0462   *          @arg @ref HAL_MDIOS_MSPDEINIT_CB_ID      MspDeInit callback ID
0463   * @retval status
0464   */
0465 HAL_StatusTypeDef HAL_MDIOS_UnRegisterCallback(MDIOS_HandleTypeDef *hmdios, HAL_MDIOS_CallbackIDTypeDef CallbackID)
0466 {
0467   HAL_StatusTypeDef status = HAL_OK;
0468 
0469   /* Process locked */
0470   __HAL_LOCK(hmdios);
0471 
0472   if(hmdios->State == HAL_MDIOS_STATE_READY)
0473   {
0474     switch (CallbackID)
0475     {
0476     case HAL_MDIOS_WRITE_COMPLETE_CB_ID :
0477       hmdios->WriteCpltCallback = HAL_MDIOS_WriteCpltCallback;
0478       break;
0479 
0480     case HAL_MDIOS_READ_COMPLETE_CB_ID :
0481       hmdios->ReadCpltCallback = HAL_MDIOS_ReadCpltCallback;
0482       break;
0483 
0484     case HAL_MDIOS_ERROR_CB_ID :
0485       hmdios->ErrorCallback = HAL_MDIOS_ErrorCallback;
0486       break;
0487 
0488     case HAL_MDIOS_WAKEUP_CB_ID :
0489       hmdios->WakeUpCallback = HAL_MDIOS_WakeUpCallback;
0490       break;
0491 
0492     case HAL_MDIOS_MSPINIT_CB_ID :
0493       hmdios->MspInitCallback = HAL_MDIOS_MspInit;
0494       break;
0495 
0496    case HAL_MDIOS_MSPDEINIT_CB_ID :
0497       hmdios->MspDeInitCallback = HAL_MDIOS_MspDeInit;
0498       break;
0499 
0500     default :
0501       /* Update the error code */
0502       hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK;
0503      /* Return error status */
0504       status =  HAL_ERROR;
0505       break;
0506     }
0507   }
0508   else if(hmdios->State == HAL_MDIOS_STATE_RESET)
0509   {
0510     switch (CallbackID)
0511     {
0512     case HAL_MDIOS_MSPINIT_CB_ID :
0513       hmdios->MspInitCallback = HAL_MDIOS_MspInit;
0514       break;
0515 
0516    case HAL_MDIOS_MSPDEINIT_CB_ID :
0517       hmdios->MspDeInitCallback = HAL_MDIOS_MspDeInit;
0518       break;
0519 
0520     default :
0521       /* Update the error code */
0522       hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK;
0523      /* Return error status */
0524       status =  HAL_ERROR;
0525       break;
0526     }
0527   }
0528   else
0529   {
0530     /* Update the error code */
0531     hmdios->ErrorCode |= HAL_MDIOS_ERROR_INVALID_CALLBACK;
0532     /* Return error status */
0533     status =  HAL_ERROR;
0534   }
0535 
0536   /* Release Lock */
0537   __HAL_UNLOCK(hmdios);
0538 
0539   return status;
0540 }
0541 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
0542 
0543 /**
0544   * @}
0545   */
0546 
0547 /** @defgroup MDIOS_Exported_Functions_Group2 IO operation functions
0548   * @ingroup RTEMSBSPsARMSTM32H7
0549   *  @brief MDIOS Read/Write functions
0550   *
0551 @verbatim
0552  ===============================================================================
0553                       ##### IO operation functions #####
0554  ===============================================================================
0555     This subsection provides a set of functions allowing to manage the MDIOS
0556     read and write operations.
0557 
0558     (#) APIs that allow to the MDIOS to read/write from/to the
0559         values of one of the DINn/DOUTn registers:
0560         (+) Read the value of a DINn register: HAL_MDIOS_ReadReg()
0561         (+) Write a value to a DOUTn register: HAL_MDIOS_WriteReg()
0562 
0563     (#) APIs that provide if there are some Slave registres have been
0564         read or written by the Master:
0565         (+) DOUTn registers read by Master: HAL_MDIOS_GetReadRegAddress()
0566         (+) DINn registers written by Master : HAL_MDIOS_GetWrittenRegAddress()
0567 
0568     (#) APIs that Clear the read/write flags:
0569         (+) Clear read registers flags: HAL_MDIOS_ClearReadRegAddress()
0570         (+) Clear write registers flags: HAL_MDIOS_ClearWriteRegAddress()
0571 
0572     (#) A set of Callbacks are provided:
0573         (+) HAL_MDIOS_WriteCpltCallback()
0574         (+) HAL_MDIOS_ReadCpltCallback()
0575         (+) HAL_MDIOS_ErrorCallback()
0576 
0577 @endverbatim
0578   * @{
0579   */
0580 
0581 /**
0582   * @brief  Writes to an MDIOS output register
0583   * @param  hmdios: mdios handle
0584   * @param  RegNum: MDIOS output register address
0585   * @param  Data: Data to write
0586   * @retval HAL status
0587   */
0588 HAL_StatusTypeDef HAL_MDIOS_WriteReg(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum, uint16_t Data)
0589 {
0590   uint32_t tmpreg;
0591 
0592   /* Check the parameters */
0593   assert_param(IS_MDIOS_REGISTER(RegNum));
0594 
0595   /* Process Locked */
0596   __HAL_LOCK(hmdios);
0597 
0598   /* Get the addr of output register to be written by the MDIOS */
0599   tmpreg = MDIOS_DOUT_BASE_ADDR + (4U * RegNum);
0600 
0601   /* Write to DOUTn register */
0602   *((uint32_t *)tmpreg) = Data;
0603 
0604     /* Process Unlocked */
0605   __HAL_UNLOCK(hmdios);
0606 
0607   return HAL_OK;
0608 }
0609 
0610 /**
0611   * @brief  Reads an MDIOS input register
0612   * @param  hmdios: mdios handle
0613   * @param  RegNum: MDIOS input register address
0614   * @param  pData: pointer to Data
0615   * @retval HAL status
0616   */
0617 HAL_StatusTypeDef HAL_MDIOS_ReadReg(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum, uint16_t *pData)
0618 {
0619   uint32_t tmpreg;
0620 
0621   /* Check the parameters */
0622   assert_param(IS_MDIOS_REGISTER(RegNum));
0623 
0624   /* Process Locked */
0625   __HAL_LOCK(hmdios);
0626 
0627   /* Get the addr of input register to be read by the MDIOS */
0628   tmpreg = MDIOS_DIN_BASE_ADDR + (4U * RegNum);
0629 
0630   /* Read DINn register */
0631   *pData = (uint16_t)(*((uint32_t *)tmpreg));
0632 
0633   /* Process Unlocked */
0634   __HAL_UNLOCK(hmdios);
0635 
0636   return HAL_OK;
0637 }
0638 
0639 /**
0640   * @brief  Gets Written registers by MDIO master
0641   * @param  hmdios: mdios handle
0642   * @retval bit map of written registers addresses
0643   */
0644 uint32_t HAL_MDIOS_GetWrittenRegAddress(MDIOS_HandleTypeDef *hmdios)
0645 {
0646   return hmdios->Instance->WRFR;
0647 }
0648 
0649 /**
0650   * @brief  Gets Read registers by MDIO master
0651   * @param  hmdios: mdios handle
0652   * @retval bit map of read registers addresses
0653   */
0654 uint32_t HAL_MDIOS_GetReadRegAddress(MDIOS_HandleTypeDef *hmdios)
0655 {
0656   return hmdios->Instance->RDFR;
0657 }
0658 
0659 /**
0660   * @brief  Clears Write registers flag
0661   * @param  hmdios: mdios handle
0662   * @param  RegNum: registers addresses to be cleared
0663   * @retval HAL status
0664   */
0665 HAL_StatusTypeDef HAL_MDIOS_ClearWriteRegAddress(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum)
0666 {
0667   /* Check the parameters */
0668   assert_param(IS_MDIOS_REGISTER(RegNum));
0669 
0670   /* Process Locked */
0671   __HAL_LOCK(hmdios);
0672 
0673   /* Clear write registers flags */
0674   hmdios->Instance->CWRFR |= (RegNum);
0675 
0676   /* Release Lock */
0677   __HAL_UNLOCK(hmdios);
0678 
0679   return HAL_OK;
0680 }
0681 
0682 /**
0683   * @brief  Clears Read register flag
0684   * @param  hmdios: mdios handle
0685   * @param  RegNum: registers addresses to be cleared
0686   * @retval HAL status
0687   */
0688 HAL_StatusTypeDef HAL_MDIOS_ClearReadRegAddress(MDIOS_HandleTypeDef *hmdios, uint32_t RegNum)
0689 {
0690   /* Check the parameters */
0691   assert_param(IS_MDIOS_REGISTER(RegNum));
0692 
0693   /* Process Locked */
0694   __HAL_LOCK(hmdios);
0695 
0696   /* Clear read registers flags */
0697   hmdios->Instance->CRDFR |= (RegNum);
0698 
0699   /* Release Lock */
0700   __HAL_UNLOCK(hmdios);
0701 
0702   return HAL_OK;
0703 }
0704 
0705 /**
0706   * @brief  Enables Events for MDIOS peripheral
0707   * @param  hmdios: mdios handle
0708   * @retval HAL status
0709   */
0710 HAL_StatusTypeDef HAL_MDIOS_EnableEvents(MDIOS_HandleTypeDef *hmdios)
0711 {
0712   /* Process Locked */
0713   __HAL_LOCK(hmdios);
0714 
0715   /* Enable MDIOS interrupts: Register Write, Register Read and Error ITs */
0716   __HAL_MDIOS_ENABLE_IT(hmdios, (MDIOS_IT_WRITE | MDIOS_IT_READ | MDIOS_IT_ERROR));
0717 
0718   /* Process Unlocked */
0719   __HAL_UNLOCK(hmdios);
0720 
0721   return HAL_OK;
0722 }
0723 
0724 /**
0725   * @brief This function handles MDIOS interrupt request.
0726   * @param hmdios: MDIOS handle
0727   * @retval None
0728   */
0729 void HAL_MDIOS_IRQHandler(MDIOS_HandleTypeDef *hmdios)
0730 {
0731   /* Write Register Interrupt enabled ? */
0732   if(__HAL_MDIOS_GET_IT_SOURCE(hmdios, MDIOS_IT_WRITE) != (uint32_t)RESET)
0733   {
0734     /* Write register flag */
0735     if(HAL_MDIOS_GetWrittenRegAddress(hmdios) != (uint32_t)RESET)
0736     {
0737 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0738         /*Call registered Write complete callback*/
0739         hmdios->WriteCpltCallback(hmdios);
0740 #else
0741       /* Write callback function */
0742       HAL_MDIOS_WriteCpltCallback(hmdios);
0743 #endif  /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
0744 
0745       /* Clear write register flag */
0746       hmdios->Instance->CWRFR |= MDIOS_ALL_REG_FLAG;
0747     }
0748   }
0749 
0750   /* Read Register Interrupt enabled ? */
0751   if(__HAL_MDIOS_GET_IT_SOURCE(hmdios, MDIOS_IT_READ) != (uint32_t)RESET)
0752   {
0753     /* Read register flag */
0754     if(HAL_MDIOS_GetReadRegAddress(hmdios) != (uint32_t)RESET)
0755     {
0756 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0757         /*Call registered Read complete callback*/
0758         hmdios->ReadCpltCallback(hmdios);
0759 #else
0760       /* Read callback function  */
0761       HAL_MDIOS_ReadCpltCallback(hmdios);
0762 #endif  /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
0763 
0764       /* Clear read register flag */
0765       hmdios->Instance->CRDFR |= MDIOS_ALL_REG_FLAG;
0766     }
0767   }
0768 
0769   /* Error Interrupt enabled ? */
0770   if(__HAL_MDIOS_GET_IT_SOURCE(hmdios, MDIOS_IT_ERROR) != (uint32_t)RESET)
0771   {
0772     /* All Errors Flag */
0773     if(__HAL_MDIOS_GET_ERROR_FLAG(hmdios, MDIOS_ALL_ERRORS_FLAG) != (uint32_t)RESET)
0774     {
0775       hmdios->ErrorCode |= HAL_MDIOS_ERROR_DATA;
0776 
0777 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0778         /*Call registered Error callback*/
0779         hmdios->ErrorCallback(hmdios);
0780 #else
0781       /* Error Callback */
0782       HAL_MDIOS_ErrorCallback(hmdios);
0783 #endif  /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
0784 
0785       /* Clear errors flag */
0786       __HAL_MDIOS_CLEAR_ERROR_FLAG(hmdios, MDIOS_ALL_ERRORS_FLAG);
0787     }
0788     hmdios->ErrorCode = HAL_MDIOS_ERROR_NONE;
0789   }
0790 #if defined(DUAL_CORE)
0791 
0792   if (HAL_GetCurrentCPUID() == CM7_CPUID)
0793   {
0794     if(__HAL_MDIOS_WAKEUP_EXTI_GET_FLAG(MDIOS_WAKEUP_EXTI_LINE) != (uint32_t)RESET)
0795     {
0796       /* Clear MDIOS WAKEUP Exti pending bit */
0797       __HAL_MDIOS_WAKEUP_EXTI_CLEAR_FLAG(MDIOS_WAKEUP_EXTI_LINE);
0798 
0799 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0800       /*Call registered WakeUp callback*/
0801       hmdios->WakeUpCallback(hmdios);
0802 #else
0803       /* MDIOS WAKEUP callback */
0804       HAL_MDIOS_WakeUpCallback(hmdios);
0805 #endif  /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
0806     }
0807   }
0808   else
0809   {
0810     if(__HAL_MDIOS_WAKEUP_EXTID2_GET_FLAG(MDIOS_WAKEUP_EXTI_LINE) != (uint32_t)RESET)
0811     {
0812       /* Clear MDIOS WAKEUP Exti D2 pending bit */
0813       __HAL_MDIOS_WAKEUP_EXTID2_CLEAR_FLAG(MDIOS_WAKEUP_EXTI_LINE);
0814 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0815       /*Call registered WakeUp callback*/
0816       hmdios->WakeUpCallback(hmdios);
0817 #else
0818       /* MDIOS WAKEUP callback */
0819       HAL_MDIOS_WakeUpCallback(hmdios);
0820 #endif  /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
0821     }
0822   }
0823 #else
0824   /* check MDIOS WAKEUP exti flag */
0825   if(__HAL_MDIOS_WAKEUP_EXTI_GET_FLAG(MDIOS_WAKEUP_EXTI_LINE) != (uint32_t)RESET)
0826   {
0827     /* Clear MDIOS WAKEUP Exti pending bit */
0828     __HAL_MDIOS_WAKEUP_EXTI_CLEAR_FLAG(MDIOS_WAKEUP_EXTI_LINE);
0829 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0830       /*Call registered WakeUp callback*/
0831       hmdios->WakeUpCallback(hmdios);
0832 #else
0833       /* MDIOS WAKEUP callback */
0834       HAL_MDIOS_WakeUpCallback(hmdios);
0835 #endif  /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
0836   }
0837 #endif
0838 }
0839 
0840 /**
0841   * @brief  Write Complete Callback
0842   * @param  hmdios: mdios handle
0843   * @retval None
0844   */
0845  __weak void HAL_MDIOS_WriteCpltCallback(MDIOS_HandleTypeDef *hmdios)
0846 {
0847   /* Prevent unused argument(s) compilation warning */
0848   UNUSED(hmdios);
0849 
0850   /* NOTE : This function should not be modified, when the callback is needed,
0851             the HAL_MDIOS_WriteCpltCallback can be implemented in the user file
0852    */
0853 }
0854 
0855 /**
0856   * @brief  Read Complete Callback
0857   * @param  hmdios: mdios handle
0858   * @retval None
0859   */
0860  __weak void HAL_MDIOS_ReadCpltCallback(MDIOS_HandleTypeDef *hmdios)
0861 {
0862   /* Prevent unused argument(s) compilation warning */
0863   UNUSED(hmdios);
0864 
0865   /* NOTE : This function should not be modified, when the callback is needed,
0866             the HAL_MDIOS_ReadCpltCallback can be implemented in the user file
0867    */
0868 }
0869 
0870 /**
0871   * @brief Error Callback
0872   * @param hmdios: mdios handle
0873   * @retval None
0874   */
0875  __weak void HAL_MDIOS_ErrorCallback(MDIOS_HandleTypeDef *hmdios)
0876 {
0877   /* Prevent unused argument(s) compilation warning */
0878   UNUSED(hmdios);
0879 
0880   /* NOTE : This function should not be modified, when the callback is needed,
0881             the HAL_MDIOS_ErrorCallback can be implemented in the user file
0882    */
0883 }
0884 
0885 /**
0886   * @brief  MDIOS WAKEUP interrupt callback
0887   * @param hmdios: mdios handle
0888   * @retval None
0889   */
0890 __weak void HAL_MDIOS_WakeUpCallback(MDIOS_HandleTypeDef *hmdios)
0891 {
0892   /* Prevent unused argument(s) compilation warning */
0893   UNUSED(hmdios);
0894 
0895   /* NOTE : This function Should not be modified, when the callback is needed,
0896             the HAL_MDIOS_WakeUpCallback could be implemented in the user file
0897    */
0898 }
0899 
0900 /**
0901   * @}
0902   */
0903 
0904 /** @defgroup MDIOS_Exported_Functions_Group3 Peripheral Control functions
0905   * @ingroup RTEMSBSPsARMSTM32H7
0906   *  @brief   MDIOS control functions
0907   *
0908 @verbatim
0909  ===============================================================================
0910                       ##### Peripheral Control functions #####
0911  ===============================================================================
0912     [..]
0913     This subsection provides a set of functions allowing to control the MDIOS.
0914      (+) HAL_MDIOS_GetState() API, helpful to check in run-time the state.
0915      (+) HAL_MDIOS_GetError() API, returns the errors code of the HAL state machine.
0916 
0917 @endverbatim
0918   * @{
0919   */
0920 
0921 /**
0922   * @brief  Gets MDIOS error code
0923   * @param  hmdios: mdios handle
0924   * @retval mdios error code
0925   */
0926 uint32_t HAL_MDIOS_GetError(MDIOS_HandleTypeDef *hmdios)
0927 {
0928   /* return the error code */
0929   return hmdios->ErrorCode;
0930 }
0931 
0932 /**
0933   * @brief  Return the MDIOS HAL state
0934   * @param  hmdios: mdios handle
0935   * @retval HAL state
0936   */
0937 HAL_MDIOS_StateTypeDef HAL_MDIOS_GetState(MDIOS_HandleTypeDef *hmdios)
0938 {
0939   /* Return MDIOS state */
0940   return hmdios->State;
0941 }
0942 
0943 /**
0944   * @}
0945   */
0946 
0947 /**
0948   * @}
0949   */
0950 
0951 #if (USE_HAL_MDIOS_REGISTER_CALLBACKS == 1)
0952 /** @addtogroup MDIOS_Private_Functions
0953   * @{
0954   */
0955 static void MDIOS_InitCallbacksToDefault(MDIOS_HandleTypeDef *hmdios)
0956 {
0957   /* Init the MDIOS Callback settings */
0958   hmdios->WriteCpltCallback  = HAL_MDIOS_WriteCpltCallback;   /* Legacy weak WriteCpltCallback   */
0959   hmdios->ReadCpltCallback   = HAL_MDIOS_ReadCpltCallback;    /* Legacy weak ReadCpltCallback   */
0960   hmdios->ErrorCallback      = HAL_MDIOS_ErrorCallback;       /* Legacy weak ErrorCallback */
0961   hmdios->WakeUpCallback     = HAL_MDIOS_WakeUpCallback;        /* Legacy weak WakeUpCallback   */
0962 }
0963 /**
0964   * @}
0965   */
0966 #endif /* USE_HAL_MDIOS_REGISTER_CALLBACKS */
0967 #endif /* HAL_MDIOS_MODULE_ENABLED */
0968 /**
0969   * @}
0970   */
0971 #endif /* MDIOS */
0972 /**
0973   * @}
0974   */
0975