1 /**
2   ******************************************************************************
3   * @file    stm32u5xx_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) 2021 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 STM32U5xx_HAL_IRDA_EX_H
21 #define STM32U5xx_HAL_IRDA_EX_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32u5xx_hal_def.h"
29 
30 /** @addtogroup STM32U5xx_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 #if defined(USART6)
73 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)        \
74   do {                                                         \
75     if((__HANDLE__)->Instance == USART1)                       \
76     {                                                          \
77       switch(__HAL_RCC_GET_USART1_SOURCE())                    \
78       {                                                        \
79         case RCC_USART1CLKSOURCE_PCLK2:                        \
80           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2;          \
81           break;                                               \
82         case RCC_USART1CLKSOURCE_HSI:                          \
83           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
84           break;                                               \
85         case RCC_USART1CLKSOURCE_SYSCLK:                       \
86           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
87           break;                                               \
88         case RCC_USART1CLKSOURCE_LSE:                          \
89           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
90           break;                                               \
91         default:                                               \
92           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
93           break;                                               \
94       }                                                        \
95     }                                                          \
96     else if((__HANDLE__)->Instance == USART2)                  \
97     {                                                          \
98       switch(__HAL_RCC_GET_USART2_SOURCE())                    \
99       {                                                        \
100         case RCC_USART2CLKSOURCE_PCLK1:                        \
101           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
102           break;                                               \
103         case RCC_USART2CLKSOURCE_HSI:                          \
104           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
105           break;                                               \
106         case RCC_USART2CLKSOURCE_SYSCLK:                       \
107           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
108           break;                                               \
109         case RCC_USART2CLKSOURCE_LSE:                          \
110           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
111           break;                                               \
112         default:                                               \
113           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
114           break;                                               \
115       }                                                        \
116     }                                                          \
117     else if((__HANDLE__)->Instance == USART3)                  \
118     {                                                          \
119       switch(__HAL_RCC_GET_USART3_SOURCE())                    \
120       {                                                        \
121         case RCC_USART3CLKSOURCE_PCLK1:                        \
122           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
123           break;                                               \
124         case RCC_USART3CLKSOURCE_HSI:                          \
125           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
126           break;                                               \
127         case RCC_USART3CLKSOURCE_SYSCLK:                       \
128           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
129           break;                                               \
130         case RCC_USART3CLKSOURCE_LSE:                          \
131           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
132           break;                                               \
133         default:                                               \
134           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
135           break;                                               \
136       }                                                        \
137     }                                                          \
138     else if((__HANDLE__)->Instance == UART4)                   \
139     {                                                          \
140       switch(__HAL_RCC_GET_UART4_SOURCE())                     \
141       {                                                        \
142         case RCC_UART4CLKSOURCE_PCLK1:                         \
143           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
144           break;                                               \
145         case RCC_UART4CLKSOURCE_HSI:                           \
146           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
147           break;                                               \
148         case RCC_UART4CLKSOURCE_SYSCLK:                        \
149           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
150           break;                                               \
151         case RCC_UART4CLKSOURCE_LSE:                           \
152           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
153           break;                                               \
154         default:                                               \
155           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
156           break;                                               \
157       }                                                        \
158     }                                                          \
159     else if((__HANDLE__)->Instance == UART5)                   \
160     {                                                          \
161       switch(__HAL_RCC_GET_UART5_SOURCE())                     \
162       {                                                        \
163         case RCC_UART5CLKSOURCE_PCLK1:                         \
164           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
165           break;                                               \
166         case RCC_UART5CLKSOURCE_HSI:                           \
167           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
168           break;                                               \
169         case RCC_UART5CLKSOURCE_SYSCLK:                        \
170           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
171           break;                                               \
172         case RCC_UART5CLKSOURCE_LSE:                           \
173           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
174           break;                                               \
175         default:                                               \
176           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
177           break;                                               \
178       }                                                        \
179     }                                                          \
180     else if((__HANDLE__)->Instance == USART6)                  \
181     {                                                          \
182       switch(__HAL_RCC_GET_USART6_SOURCE())                    \
183       {                                                        \
184         case RCC_USART6CLKSOURCE_PCLK1:                        \
185           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
186           break;                                               \
187         case RCC_USART6CLKSOURCE_SYSCLK:                       \
188           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
189           break;                                               \
190         case RCC_USART6CLKSOURCE_HSI:                          \
191           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
192           break;                                               \
193         case RCC_USART6CLKSOURCE_LSE:                          \
194           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
195           break;                                               \
196         default:                                               \
197           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
198           break;                                               \
199       }                                                        \
200     }                                                          \
201     else                                                       \
202     {                                                          \
203       (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;          \
204     }                                                          \
205   } while(0U)
206 #elif defined(USART2)
207 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)        \
208   do {                                                         \
209     if((__HANDLE__)->Instance == USART1)                       \
210     {                                                          \
211       switch(__HAL_RCC_GET_USART1_SOURCE())                    \
212       {                                                        \
213         case RCC_USART1CLKSOURCE_PCLK2:                        \
214           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2;          \
215           break;                                               \
216         case RCC_USART1CLKSOURCE_HSI:                          \
217           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
218           break;                                               \
219         case RCC_USART1CLKSOURCE_SYSCLK:                       \
220           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
221           break;                                               \
222         case RCC_USART1CLKSOURCE_LSE:                          \
223           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
224           break;                                               \
225         default:                                               \
226           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
227           break;                                               \
228       }                                                        \
229     }                                                          \
230     else if((__HANDLE__)->Instance == USART2)                  \
231     {                                                          \
232       switch(__HAL_RCC_GET_USART2_SOURCE())                    \
233       {                                                        \
234         case RCC_USART2CLKSOURCE_PCLK1:                        \
235           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
236           break;                                               \
237         case RCC_USART2CLKSOURCE_HSI:                          \
238           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
239           break;                                               \
240         case RCC_USART2CLKSOURCE_SYSCLK:                       \
241           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
242           break;                                               \
243         case RCC_USART2CLKSOURCE_LSE:                          \
244           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
245           break;                                               \
246         default:                                               \
247           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
248           break;                                               \
249       }                                                        \
250     }                                                          \
251     else if((__HANDLE__)->Instance == USART3)                  \
252     {                                                          \
253       switch(__HAL_RCC_GET_USART3_SOURCE())                    \
254       {                                                        \
255         case RCC_USART3CLKSOURCE_PCLK1:                        \
256           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
257           break;                                               \
258         case RCC_USART3CLKSOURCE_HSI:                          \
259           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
260           break;                                               \
261         case RCC_USART3CLKSOURCE_SYSCLK:                       \
262           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
263           break;                                               \
264         case RCC_USART3CLKSOURCE_LSE:                          \
265           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
266           break;                                               \
267         default:                                               \
268           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
269           break;                                               \
270       }                                                        \
271     }                                                          \
272     else if((__HANDLE__)->Instance == UART4)                   \
273     {                                                          \
274       switch(__HAL_RCC_GET_UART4_SOURCE())                     \
275       {                                                        \
276         case RCC_UART4CLKSOURCE_PCLK1:                         \
277           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
278           break;                                               \
279         case RCC_UART4CLKSOURCE_HSI:                           \
280           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
281           break;                                               \
282         case RCC_UART4CLKSOURCE_SYSCLK:                        \
283           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
284           break;                                               \
285         case RCC_UART4CLKSOURCE_LSE:                           \
286           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
287           break;                                               \
288         default:                                               \
289           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
290           break;                                               \
291       }                                                        \
292     }                                                          \
293     else if((__HANDLE__)->Instance == UART5)                   \
294     {                                                          \
295       switch(__HAL_RCC_GET_UART5_SOURCE())                     \
296       {                                                        \
297         case RCC_UART5CLKSOURCE_PCLK1:                         \
298           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
299           break;                                               \
300         case RCC_UART5CLKSOURCE_HSI:                           \
301           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
302           break;                                               \
303         case RCC_UART5CLKSOURCE_SYSCLK:                        \
304           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
305           break;                                               \
306         case RCC_UART5CLKSOURCE_LSE:                           \
307           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
308           break;                                               \
309         default:                                               \
310           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
311           break;                                               \
312       }                                                        \
313     }                                                          \
314     else                                                       \
315     {                                                          \
316       (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;          \
317     }                                                          \
318   } while(0U)
319 #else
320 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)        \
321   do {                                                         \
322     if((__HANDLE__)->Instance == USART1)                       \
323     {                                                          \
324       switch(__HAL_RCC_GET_USART1_SOURCE())                    \
325       {                                                        \
326         case RCC_USART1CLKSOURCE_PCLK2:                        \
327           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2;          \
328           break;                                               \
329         case RCC_USART1CLKSOURCE_HSI:                          \
330           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
331           break;                                               \
332         case RCC_USART1CLKSOURCE_SYSCLK:                       \
333           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
334           break;                                               \
335         case RCC_USART1CLKSOURCE_LSE:                          \
336           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
337           break;                                               \
338         default:                                               \
339           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
340           break;                                               \
341       }                                                        \
342     }                                                          \
343     else if((__HANDLE__)->Instance == USART3)                  \
344     {                                                          \
345       switch(__HAL_RCC_GET_USART3_SOURCE())                    \
346       {                                                        \
347         case RCC_USART3CLKSOURCE_PCLK1:                        \
348           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
349           break;                                               \
350         case RCC_USART3CLKSOURCE_HSI:                          \
351           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
352           break;                                               \
353         case RCC_USART3CLKSOURCE_SYSCLK:                       \
354           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
355           break;                                               \
356         case RCC_USART3CLKSOURCE_LSE:                          \
357           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
358           break;                                               \
359         default:                                               \
360           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
361           break;                                               \
362       }                                                        \
363     }                                                          \
364     else if((__HANDLE__)->Instance == UART4)                   \
365     {                                                          \
366       switch(__HAL_RCC_GET_UART4_SOURCE())                     \
367       {                                                        \
368         case RCC_UART4CLKSOURCE_PCLK1:                         \
369           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
370           break;                                               \
371         case RCC_UART4CLKSOURCE_HSI:                           \
372           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
373           break;                                               \
374         case RCC_UART4CLKSOURCE_SYSCLK:                        \
375           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
376           break;                                               \
377         case RCC_UART4CLKSOURCE_LSE:                           \
378           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
379           break;                                               \
380         default:                                               \
381           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
382           break;                                               \
383       }                                                        \
384     }                                                          \
385     else if((__HANDLE__)->Instance == UART5)                   \
386     {                                                          \
387       switch(__HAL_RCC_GET_UART5_SOURCE())                     \
388       {                                                        \
389         case RCC_UART5CLKSOURCE_PCLK1:                         \
390           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;          \
391           break;                                               \
392         case RCC_UART5CLKSOURCE_HSI:                           \
393           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;            \
394           break;                                               \
395         case RCC_UART5CLKSOURCE_SYSCLK:                        \
396           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;         \
397           break;                                               \
398         case RCC_UART5CLKSOURCE_LSE:                           \
399           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;            \
400           break;                                               \
401         default:                                               \
402           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;      \
403           break;                                               \
404       }                                                        \
405     }                                                          \
406     else                                                       \
407     {                                                          \
408       (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;          \
409     }                                                          \
410   } while(0U)
411 #endif /* USART6 */
412 
413 /** @brief  Compute the mask to apply to retrieve the received data
414   *         according to the word length and to the parity bits activation.
415   * @param  __HANDLE__ specifies the IRDA Handle.
416   * @retval None, the mask to apply to the associated UART RDR register is stored in (__HANDLE__)->Mask field.
417   */
418 #define IRDA_MASK_COMPUTATION(__HANDLE__)                             \
419   do {                                                                \
420     if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_9B)          \
421     {                                                                 \
422       if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE)              \
423       {                                                               \
424         (__HANDLE__)->Mask = 0x01FFU ;                                \
425       }                                                               \
426       else                                                            \
427       {                                                               \
428         (__HANDLE__)->Mask = 0x00FFU ;                                \
429       }                                                               \
430     }                                                                 \
431     else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_8B)     \
432     {                                                                 \
433       if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE)              \
434       {                                                               \
435         (__HANDLE__)->Mask = 0x00FFU ;                                \
436       }                                                               \
437       else                                                            \
438       {                                                               \
439         (__HANDLE__)->Mask = 0x007FU ;                                \
440       }                                                               \
441     }                                                                 \
442     else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_7B)     \
443     {                                                                 \
444       if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE)              \
445       {                                                               \
446         (__HANDLE__)->Mask = 0x007FU ;                                \
447       }                                                               \
448       else                                                            \
449       {                                                               \
450         (__HANDLE__)->Mask = 0x003FU ;                                \
451       }                                                               \
452     }                                                                 \
453     else                                                              \
454     {                                                                 \
455       (__HANDLE__)->Mask = 0x0000U;                                   \
456     }                                                                 \
457   } while(0U)
458 
459 /** @brief Ensure that IRDA frame length is valid.
460   * @param __LENGTH__ IRDA frame length.
461   * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
462   */
463 #define IS_IRDA_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == IRDA_WORDLENGTH_7B) || \
464                                          ((__LENGTH__) == IRDA_WORDLENGTH_8B) || \
465                                          ((__LENGTH__) == IRDA_WORDLENGTH_9B))
466 /**
467   * @}
468   */
469 
470 /* Exported functions --------------------------------------------------------*/
471 
472 /**
473   * @}
474   */
475 
476 /**
477   * @}
478   */
479 
480 #ifdef __cplusplus
481 }
482 #endif
483 
484 #endif /* STM32U5xx_HAL_IRDA_EX_H */
485