1 /**
2   ******************************************************************************
3   * @file    stm32n6xx_hal_irda_ex.h
4   * @author  MCD Application Team
5   * @brief   Header file of IRDA HAL Extended module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2023 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 
19 /* Define to prevent recursive inclusion -------------------------------------*/
20 #ifndef STM32N6xx_HAL_IRDA_EX_H
21 #define STM32N6xx_HAL_IRDA_EX_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32n6xx_hal_def.h"
29 
30 /** @addtogroup STM32N6xx_HAL_Driver
31   * @{
32   */
33 
34 /** @defgroup IRDAEx IRDAEx
35   * @brief IRDA Extended HAL module driver
36   * @{
37   */
38 
39 /* Exported types ------------------------------------------------------------*/
40 /* Exported constants --------------------------------------------------------*/
41 /** @defgroup IRDAEx_Extended_Exported_Constants IRDAEx Extended Exported Constants
42   * @{
43   */
44 
45 /** @defgroup IRDAEx_Word_Length IRDAEx Word Length
46   * @{
47   */
48 #define IRDA_WORDLENGTH_7B                  USART_CR1_M1   /*!< 7-bit long frame */
49 #define IRDA_WORDLENGTH_8B                  0x00000000U    /*!< 8-bit long frame */
50 #define IRDA_WORDLENGTH_9B                  USART_CR1_M0   /*!< 9-bit long frame */
51 /**
52   * @}
53   */
54 
55 /**
56   * @}
57   */
58 
59 /* Exported macros -----------------------------------------------------------*/
60 
61 /* Private macros ------------------------------------------------------------*/
62 
63 /** @defgroup IRDAEx_Private_Macros IRDAEx Private Macros
64   * @{
65   */
66 
67 /** @brief  Report the IRDA clock source.
68   * @param  __HANDLE__ specifies the IRDA Handle.
69   * @param  __CLOCKSOURCE__ output variable.
70   * @retval IRDA clocking source, written in __CLOCKSOURCE__.
71   */
72 /** @brief  Return clock source used for USART instance used for IRDA.
73   * @param  __HANDLE__ specifies the UART Handle.
74   * @param  __CLOCKSOURCE__ output variable.
75   * @retval USART clocking source, written in __CLOCKSOURCE__.
76   */
77 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)           \
78   do {                                                            \
79     if((__HANDLE__)->Instance == USART1)                          \
80     {                                                             \
81       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_USART1;         \
82     }                                                             \
83     else if((__HANDLE__)->Instance == USART2)                     \
84     {                                                             \
85       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_USART2;         \
86     }                                                             \
87     else if((__HANDLE__)->Instance == USART3)                     \
88     {                                                             \
89       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_USART3;         \
90     }                                                             \
91     else if((__HANDLE__)->Instance == UART4)                      \
92     {                                                             \
93       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_UART4;          \
94     }                                                             \
95     else if((__HANDLE__)->Instance == UART5)                      \
96     {                                                             \
97       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_UART5;          \
98     }                                                             \
99     else if((__HANDLE__)->Instance == USART6)                     \
100     {                                                             \
101       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_USART6;         \
102     }                                                             \
103     else if((__HANDLE__)->Instance == UART7)                      \
104     {                                                             \
105       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_UART7;          \
106     }                                                             \
107     else if((__HANDLE__)->Instance == UART8)                      \
108     {                                                             \
109       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_UART8;          \
110     }                                                             \
111     else if((__HANDLE__)->Instance == UART9)                      \
112     {                                                             \
113       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_UART9;          \
114     }                                                             \
115     else if((__HANDLE__)->Instance == USART10)                    \
116     {                                                             \
117       (__CLOCKSOURCE__) = (uint64_t)RCC_PERIPHCLK_USART10;        \
118     }                                                             \
119     else                                                          \
120     {                                                             \
121       (__CLOCKSOURCE__) = 0U;                                     \
122     }                                                             \
123   } while(0U)
124 
125 
126 /** @brief  Compute the mask to apply to retrieve the received data
127   *         according to the word length and to the parity bits activation.
128   * @param  __HANDLE__ specifies the IRDA Handle.
129   * @retval None, the mask to apply to the associated UART RDR register is stored in (__HANDLE__)->Mask field.
130   */
131 #define IRDA_MASK_COMPUTATION(__HANDLE__)                             \
132   do {                                                                \
133     if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_9B)          \
134     {                                                                 \
135       if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE)              \
136       {                                                               \
137         (__HANDLE__)->Mask = 0x01FFU ;                                \
138       }                                                               \
139       else                                                            \
140       {                                                               \
141         (__HANDLE__)->Mask = 0x00FFU ;                                \
142       }                                                               \
143     }                                                                 \
144     else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_8B)     \
145     {                                                                 \
146       if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE)              \
147       {                                                               \
148         (__HANDLE__)->Mask = 0x00FFU ;                                \
149       }                                                               \
150       else                                                            \
151       {                                                               \
152         (__HANDLE__)->Mask = 0x007FU ;                                \
153       }                                                               \
154     }                                                                 \
155     else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_7B)     \
156     {                                                                 \
157       if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE)              \
158       {                                                               \
159         (__HANDLE__)->Mask = 0x007FU ;                                \
160       }                                                               \
161       else                                                            \
162       {                                                               \
163         (__HANDLE__)->Mask = 0x003FU ;                                \
164       }                                                               \
165     }                                                                 \
166     else                                                              \
167     {                                                                 \
168       (__HANDLE__)->Mask = 0x0000U;                                   \
169     }                                                                 \
170   } while(0U)
171 
172 /** @brief Ensure that IRDA frame length is valid.
173   * @param __LENGTH__ IRDA frame length.
174   * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
175   */
176 #define IS_IRDA_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == IRDA_WORDLENGTH_7B) || \
177                                          ((__LENGTH__) == IRDA_WORDLENGTH_8B) || \
178                                          ((__LENGTH__) == IRDA_WORDLENGTH_9B))
179 /**
180   * @}
181   */
182 
183 /* Exported functions --------------------------------------------------------*/
184 
185 /**
186   * @}
187   */
188 
189 /**
190   * @}
191   */
192 
193 #ifdef __cplusplus
194 }
195 #endif
196 
197 #endif /* STM32N6xx_HAL_IRDA_EX_H */
198 
199