1 /**
2   **********************************************************************************************************************
3   * @file    stm32n6xx_hal_i3c.h
4   * @author  MCD Application Team
5   * @brief   Header file of I3C HAL 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_I3C_H
21 #define STM32N6xx_HAL_I3C_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 
28 /* Includes ----------------------------------------------------------------------------------------------------------*/
29 #include "stm32n6xx_hal_def.h"
30 #include "stm32n6xx_ll_i3c.h"
31 
32 /** @addtogroup STM32N6xx_HAL_Driver
33   * @{
34   */
35 
36 /** @addtogroup I3C
37   * @{
38   */
39 
40 /* Exported types ----------------------------------------------------------------------------------------------------*/
41 /** @defgroup I3C_Exported_Types I3C Exported Types
42   * @{
43   */
44 /** @defgroup I3C_Init_Structure_definition I3C Init Structure definition
45   * @brief    I3C Init Structure definition
46   * @{
47   */
48 typedef struct
49 {
50   LL_I3C_CtrlBusConfTypeDef CtrlBusCharacteristic; /*!< Specifies the I3C controller bus characteristic configuration
51                                                         when Controller mode                                          */
52 
53   LL_I3C_TgtBusConfTypeDef  TgtBusCharacteristic;  /*!< Specifies the I3C target bus characteristic configuration
54                                                         when Target mode                                              */
55 
56 } I3C_InitTypeDef;
57 /**
58   * @}
59   */
60 
61 /** @defgroup I3C_FIFO_Config_Structure_definition I3C FIFO Configuration Structure definition
62   * @brief    I3C FIFO configuration structure definition
63   * @{
64   */
65 typedef struct
66 {
67   uint32_t RxFifoThreshold; /*!< Specifies the I3C Rx FIFO threshold level.
68                                  This parameter must be a value of @ref I3C_RX_FIFO_THRESHOLD                         */
69 
70   uint32_t TxFifoThreshold; /*!< Specifies the I3C Tx FIFO threshold level.
71                                  This parameter must be a value of @ref I3C_TX_FIFO_THRESHOLD                         */
72 
73   uint32_t ControlFifo;     /*!< Specifies the I3C control FIFO enable/disable state.
74                                  This parameter is configured only with controller mode and it
75                                  must be a value of @ref I3C_CONTROL_FIFO_STATE                                       */
76 
77   uint32_t StatusFifo;      /*!< Specifies the I3C status FIFO enable/disable state.
78                                  This parameter is configured only with controller mode and it
79                                  must be a value of @ref I3C_STATUS_FIFO_STATE                                        */
80 } I3C_FifoConfTypeDef;
81 /**
82   * @}
83   */
84 
85 /** @defgroup I3C_Controller_Config_Structure_definition I3C Controller Configuration Structure definition
86   * @brief    I3C controller configuration structure definition
87   * @{
88   */
89 typedef struct
90 {
91   uint8_t DynamicAddr;            /*!< Specifies the dynamic address of the controller when goes in target mode.
92                                        This parameter must be a number between Min_Data=0x00 and Max_Data=0x7F        */
93 
94   uint8_t StallTime;              /*!< Specifies the controller clock stall time in number of kernel clock cycles.
95                                        This parameter must be a number between Min_Data=0x00 and Max_Data=0xFF        */
96 
97   FunctionalState HotJoinAllowed; /*!< Specifies the Enable/Disable state of the controller Hot Join acknowledgement
98                                        when receiving a hot join request from target.
99                                        This parameter can be set to ENABLE or DISABLE                                 */
100 
101   FunctionalState ACKStallState;  /*!< Specifies the Enable/Disable state of the controller clock stall
102                                        on the ACK phase.
103                                        This parameter can be set to ENABLE or DISABLE                                 */
104 
105   FunctionalState CCCStallState;  /*!< Specifies the Enable/Disable state of the controller clock stall on the
106                                        T bit phase of a CCC communication to allow the target to decode command.
107                                        This parameter can be set to ENABLE or DISABLE                                 */
108 
109   FunctionalState TxStallState;   /*!< Specifies the Enable/Disable state of the controller clock stall on
110                                        parity phase of data to allow the target to read received data.
111                                        This parameter can be set to ENABLE or DISABLE                                 */
112 
113   FunctionalState RxStallState;   /*!< Specifies the Enable/Disable state of the controller clock stall on the T bit
114                                        phase of data enable to allow the target to prepare data to be sent.
115                                        This parameter can be set to ENABLE or DISABLE                                 */
116 
117   FunctionalState HighKeeperSDA;  /*!< Specifies the Enable/Disable state of the controller SDA high keeper.
118                                        This parameter can be set to ENABLE or DISABLE                                 */
119 } I3C_CtrlConfTypeDef;
120 /**
121   * @}
122   */
123 
124 /** @defgroup I3C_Target_Config_Structure_definition I3C Target Configuration Structure definition
125   * @brief    I3C target configuration structure definition
126   * @{
127   */
128 typedef struct
129 {
130   uint8_t Identifier;                  /*!< Specifies the target characteristic ID (MIPI named reference DCR).
131                                             This parameter must be a number between Min_Data=0x00 and Max_Data=0xFF   */
132 
133   uint8_t MIPIIdentifier;              /*!< Specifies the bits [12-15] of the 48-provisioned ID
134                                             (MIPI named reference PID), other 48-provisioned ID are hardcoded.
135                                             This parameter must be a number between Min_Data=0x00 and Max_Data=0x0F   */
136 
137   FunctionalState CtrlRoleRequest;     /*!< Specifies the Enable/Disable state of the target authorization request
138                                             for a second master Chip.
139                                             This parameter can be set to ENABLE or DISABLE                            */
140 
141   FunctionalState HotJoinRequest;      /*!< Specifies the Enable/Disable state of the target hot join
142                                             authorization request.
143                                             This parameter can be set to ENABLE or DISABLE                            */
144 
145   FunctionalState IBIRequest;          /*!< Specifies the Enable/Disable state of the target in Band Interrupt
146                                             authorization request.
147                                             This parameter can be set to ENABLE or DISABLE                            */
148 
149   FunctionalState IBIPayload;          /*!< Specifies the Enable/Disable state of sending data payload after
150                                             an accepted IBI.
151                                             This parameter can be set to ENABLE or DISABLE                            */
152 
153   uint32_t IBIPayloadSize;             /*!< Specifies the I3C target payload data size.
154                                             This parameter must be a value of @ref I3C_PAYLOAD_SIZE                   */
155 
156   uint16_t MaxReadDataSize;            /*!< Specifies the numbers of data bytes that the target can read at maximum.
157                                             This parameter must be a number between Min_Data=0x00 and Max_Data=0xFFFF */
158 
159   uint16_t MaxWriteDataSize;           /*!< Specifies the numbers of data bytes that the target can write at maximum.
160                                             This parameter must be a number between Min_Data=0x00 and Max_Data=0xFFFF */
161 
162   FunctionalState CtrlCapability;      /*!< Specifies the Enable/Disable state of the target controller capability.
163                                             This parameter can be set to ENABLE or DISABLE                            */
164 
165   FunctionalState GroupAddrCapability; /*!< Specifies the Enable/Disable state of the target support of group address
166                                             after a controller role hand-off.
167                                             This parameter can be set to ENABLE or DISABLE                            */
168 
169   uint32_t DataTurnAroundDuration;     /*!< Specifies the I3C target clock-to-data turnaround time.
170                                             This parameter must be a value of @ref I3C_TURNAROUND_TIME_TSCO           */
171 
172   uint8_t MaxReadTurnAround;           /*!< Specifies the target maximum read turnaround byte.
173                                             This parameter must be a number between Min_Data=0x00 and Max_Data=0xFF   */
174 
175   uint32_t MaxDataSpeed;               /*!< Specifies the I3C target returned GETMXDS CCC format.
176                                             This parameter must be a value of @ref I3C_GETMXDS_FORMAT                 */
177 
178   FunctionalState MaxSpeedLimitation;  /*!< Specifies the Enable/Disable state of the target max data speed limitation.
179                                             This parameter can be set to ENABLE or DISABLE                            */
180 
181   uint32_t HandOffActivityState;       /*!< Specifies the I3C target activity state when becoming controller.
182                                             This parameter must be a value of @ref I3C_HANDOFF_ACTIVITY_STATE         */
183 
184   FunctionalState HandOffDelay;        /*!< Specifies the Enable/Disable state of the target need of delay to process
185                                             the controller role hand-off.
186                                             This parameter can be set to ENABLE or DISABLE                            */
187 
188   FunctionalState PendingReadMDB;      /*!< Specifies the Enable/Disable state of the transmission of a mandatory
189                                             data bytes indicating a pending read notification for GETCAPR CCC command.
190                                             This parameter can be set to ENABLE or DISABLE                            */
191 } I3C_TgtConfTypeDef;
192 /**
193   * @}
194   */
195 
196 /** @defgroup I3C_Device_Config_Structure_definition I3C Device Configuration Structure definition
197   * @brief    I3C device configuration structure definition
198   * @{
199   */
200 typedef struct
201 {
202   uint8_t         DeviceIndex;       /*!< Specifies the index value of the device in the DEVRx register.
203                                           This parameter must be a number between Min_Data=1 and Max_Data=4           */
204 
205   uint8_t         TargetDynamicAddr; /*!< Specifies the dynamic address of the target x (1 to 4) connected on the bus.
206                                           This parameter must be a number between Min_Data=0x00 and Max_Data=0x7F     */
207 
208   FunctionalState IBIAck;            /*!< Specifies the Enable/Disable state of the controller's ACK when receiving
209                                           an IBI from a target x (1 to 4) connected on the bus.
210                                           This parameter can be set to ENABLE or DISABLE                              */
211 
212   FunctionalState IBIPayload;        /*!< Specifies the Enable/Disable state of the controller's receiving IBI payload
213                                           after acknowledging an IBI requested from a target x (1 to 4) connected
214                                           on the bus.
215                                           This parameter can be set to ENABLE or DISABLE                              */
216 
217   FunctionalState CtrlRoleReqAck;    /*!< Specifies the Enable/Disable state of the controller's ACK when receiving
218                                           a control request from a target x (1 to 4) connected on the bus.
219                                           This parameter can be set to ENABLE or DISABLE                              */
220 
221   FunctionalState CtrlStopTransfer;  /*!< Specifies the Enable/Disable state of the controller's stop transfer after
222                                           receiving an IBI request from a target x (1 to 4) connected on the bus.
223                                           This parameter can be set to ENABLE or DISABLE                              */
224 
225 } I3C_DeviceConfTypeDef;
226 /**
227   * @}
228   */
229 
230 /** @defgroup I3C_mode_structure_definition I3C mode structure definition
231   * @brief    I3C Mode structure definition
232   * @{
233   */
234 typedef enum
235 {
236   HAL_I3C_MODE_NONE       = 0x00U,  /*!< No I3C communication on going             */
237   HAL_I3C_MODE_CONTROLLER = 0x01U,  /*!< I3C communication is in controller Mode   */
238   HAL_I3C_MODE_TARGET     = 0x02U,  /*!< I3C communication is in target Mode       */
239 
240 } HAL_I3C_ModeTypeDef;
241 /**
242   * @}
243   */
244 
245 /** @defgroup HAL_state_structure_definition HAL state structure definition
246   * @brief    HAL State structure definition
247   * @{
248   */
249 typedef enum
250 {
251   HAL_I3C_STATE_RESET       = 0x00U,   /*!< Peripheral is not yet Initialized                   */
252   HAL_I3C_STATE_READY       = 0x10U,   /*!< Peripheral Initialized and ready for use            */
253   HAL_I3C_STATE_BUSY        = 0x20U,   /*!< An internal process is ongoing                      */
254   HAL_I3C_STATE_BUSY_TX     = 0x21U,   /*!< Data Transmission process is ongoing                */
255   HAL_I3C_STATE_BUSY_RX     = 0x22U,   /*!< Data Reception process is ongoing                   */
256   HAL_I3C_STATE_BUSY_TX_RX  = 0x23U,   /*!< Data Multiple Transfer process is ongoing           */
257   HAL_I3C_STATE_BUSY_DAA    = 0x24U,   /*!< Dynamic address assignment process is ongoing       */
258   HAL_I3C_STATE_LISTEN      = 0x30U,   /*!< Listen process is ongoing                           */
259   HAL_I3C_STATE_ABORT       = 0x60U,   /*!< Abort user request ongoing                          */
260   HAL_I3C_STATE_ERROR       = 0xE0U,   /*!< Error                                               */
261 
262 } HAL_I3C_StateTypeDef;
263 /**
264   * @}
265   */
266 
267 /** @defgroup I3C_CCCInfoTypeDef_Structure_definition I3C CCCInfoTypeDef Structure definition
268   * @brief    I3C CCCInfoTypeDef Structure definition
269   * @{
270   */
271 typedef struct
272 {
273   uint32_t DynamicAddrValid;    /*!< I3C target Dynamic Address Valid (updated during ENTDAA/RSTDAA/SETNEWDA CCC)
274                                      This parameter can be Valid=1U or Not Valid=0U                                   */
275   uint32_t DynamicAddr;         /*!< I3C target Dynamic Address (updated during ENTDAA/RSTDAA/SETNEWDA CCC)           */
276   uint32_t MaxWriteLength;      /*!< I3C target Maximum Write Length (updated during SETMWL CCC)                      */
277   uint32_t MaxReadLength;       /*!< I3C target Maximum Read Length (updated during SETMRL CCC)                       */
278   uint32_t ResetAction;         /*!< I3C target Reset Action level (updated during RSTACT CCC)                        */
279   uint32_t ActivityState;       /*!< I3C target Activity State (updated during ENTASx CCC)                            */
280   uint32_t HotJoinAllowed;      /*!< I3C target Hot Join (updated during ENEC/DISEC CCC)
281                                      This parameter can be Allowed=1U or Not Allowed=0U                               */
282   uint32_t InBandAllowed;       /*!< I3C target In Band Interrupt (updated during ENEC/DISEC CCC)
283                                      This parameter can be Allowed=1U or Not Allowed=0U                               */
284   uint32_t CtrlRoleAllowed;     /*!< I3C target Controller Role Request (updated during ENEC/DISEC CCC)
285                                      This parameter can be Allowed=1U or Not Allowed=0U                               */
286   uint32_t IBICRTgtAddr;        /*!< I3C controller receive Target Address during IBI or Controller Role Request event*/
287   uint32_t IBITgtNbPayload;     /*!< I3C controller get Number of Data Payload after an IBI event                     */
288   uint32_t IBITgtPayload;       /*!< I3C controller receive IBI Payload after an IBI event                            */
289 
290 } I3C_CCCInfoTypeDef;
291 /**
292   * @}
293   */
294 
295 /** @defgroup I3C_ControlTypeDef_Structure_definition I3C ControlTypeDef Structure definition
296   * @brief    I3C ControlTypeDef Structure definition
297   * @{
298   */
299 typedef struct
300 {
301   uint32_t *pBuffer;  /*!< Pointer to the buffer containing the control or status register values */
302   uint32_t  Size;     /*!< The size of pBuffer in words                                           */
303 
304 } I3C_ControlTypeDef;
305 /**
306   * @}
307   */
308 
309 /** @defgroup I3C_DataTypeDef_Structure_definition I3C DataTypeDef Structure definition
310   * @brief    I3C DataTypeDef Structure definition
311   * @{
312   */
313 typedef struct
314 {
315   uint8_t   *pBuffer;  /*!< Pointer to the buffer containing all data values to transfer */
316   uint32_t  Size;      /*!< The size of pBuffer in bytes                                 */
317 
318 } I3C_DataTypeDef;
319 
320 /**
321   * @}
322   */
323 
324 /** @defgroup I3C_CCCTypeDef_Structure_definition I3C CCCTypeDef Structure definition
325   * @brief    I3C CCCTypeDef Structure definition
326   * @{
327   */
328 typedef struct
329 {
330   uint8_t            TargetAddr; /*!< Dynamic or Static target Address                                      */
331   uint8_t            CCC;        /*!< CCC value code                                                        */
332   I3C_DataTypeDef    CCCBuf;     /*!< Contain size of associated data and size of defining byte if any.
333                                       Contain pointer to CCC associated data                                */
334   uint32_t           Direction;  /*!< CCC read and/or write direction message                               */
335 
336 } I3C_CCCTypeDef;
337 /**
338   * @}
339   */
340 
341 /** @defgroup I3C_BCRTypeDef_Structure_definition I3C BCRTypeDef Structure definition
342   * @brief    I3C BCRTypeDef Structure definition
343   * @{
344   */
345 typedef struct
346 {
347   FunctionalState         MaxDataSpeedLimitation;  /*!< Max data speed limitation */
348   FunctionalState         IBIRequestCapable;       /*!< IBI request capable */
349   FunctionalState         IBIPayload;              /*!< IBI payload data */
350   FunctionalState         OfflineCapable;          /*!< Offline capable */
351   FunctionalState         VirtualTargetSupport;    /*!< Virtual target support */
352   FunctionalState         AdvancedCapabilities;    /*!< Advanced capabilities */
353   FunctionalState         DeviceRole;              /*!< Device role */
354 
355 } I3C_BCRTypeDef;
356 /**
357   * @}
358   */
359 
360 /** @defgroup I3C_PIDTypeDef_Structure_definition I3C PIDTypeDef Structure definition
361   * @brief    I3C_PIDTypeDef Structure definition
362   * @{
363   */
364 typedef struct
365 {
366   uint16_t  MIPIMID;         /*!< MIPI Manufacturer ID */
367   uint8_t   IDTSEL;          /*!< Provisioned ID Type Selector */
368   uint16_t  PartID;          /*!< Part ID device vendor to define */
369   uint8_t   MIPIID;          /*!< Instance ID */
370 
371 } I3C_PIDTypeDef;
372 /**
373   * @}
374   */
375 
376 /** @defgroup I3C_ENTDAAPayloadTypeDef_Structure_definition I3C ENTDAAPayloadTypeDef Structure definition
377   * @brief    I3C ENTDAAPayloadTypeDef Structure definition
378   * @{
379   */
380 typedef struct
381 {
382   I3C_BCRTypeDef   BCR;             /*!< Bus Characteristics Register */
383   uint32_t         DCR;             /*!< Device Characteristics Register */
384   I3C_PIDTypeDef   PID;             /*!< Provisioned ID */
385 
386 } I3C_ENTDAAPayloadTypeDef;
387 /**
388   * @}
389   */
390 
391 /** @defgroup I3C_PrivateTypeDef_Structure_definition I3C PrivateTypeDef Structure definition
392   * @brief    I3C PrivateTypeDef Structure definition
393   * @{
394   */
395 typedef struct
396 {
397   uint8_t            TargetAddr;  /*!< Dynamic or Static target Address                                 */
398   I3C_DataTypeDef    TxBuf;       /*!< Buffer structure containing the data to transmit (little endian) */
399   I3C_DataTypeDef    RxBuf;       /*!< Buffer structure containing the data to receive (little endian)  */
400   uint32_t           Direction;   /*!< Read and/or write message                                        */
401 
402 } I3C_PrivateTypeDef;
403 /**
404   * @}
405   */
406 
407 /** @defgroup I3C_XferTypeDef_Structure_definition I3C XferTypeDef Structure definition
408   * @brief    I3C XferTypeDef Structure definition
409   * @{
410   */
411 typedef struct
412 {
413   I3C_ControlTypeDef CtrlBuf;      /*!< Buffer structure containing the control register values  */
414   I3C_ControlTypeDef StatusBuf;    /*!< Buffer structure containing the status register values   */
415   I3C_DataTypeDef    TxBuf;        /*!< Buffer structure containing the data to transmit         */
416   I3C_DataTypeDef    RxBuf;        /*!< Buffer structure containing the data to receive          */
417 
418 } I3C_XferTypeDef;
419 /**
420   * @}
421   */
422 
423 /** @defgroup I3C_handle_Structure_definition I3C handle Structure definition
424   * @brief    I3C handle Structure definition
425   * @{
426   */
427 typedef struct __I3C_HandleTypeDef
428 {
429   I3C_TypeDef                *Instance;                           /*!< I3C registers base address                */
430 
431   I3C_InitTypeDef            Init;                                /*!< I3C communication parameters              */
432 
433   HAL_I3C_ModeTypeDef        Mode;                                /*!< I3C communication mode.
434                                                                        This parameter must be a value of
435                                                                        @ref I3C_mode_structure_definition        */
436 
437   I3C_XferTypeDef            *pXferData;                          /*!< I3C transfer buffers pointer              */
438 
439   const I3C_CCCTypeDef       *pCCCDesc;                           /*!< I3C CCC descriptor pointer                */
440 
441   const I3C_PrivateTypeDef   *pPrivateDesc;                       /*!< I3C private transfer descriptor pointer   */
442 
443   uint32_t                   ControlXferCount;                    /*!< I3C counter indicating the remaining
444                                                                        control data bytes to write in
445                                                                        the control register                      */
446 
447   uint32_t                   RxXferCount;                         /*!< I3C counter indicating the remaining
448                                                                        data bytes to receive                     */
449 
450   uint32_t                   TxXferCount;                         /*!< I3C counter indicating the remaining
451                                                                        data bytes to transmit                    */
452 
453 #if defined(HAL_DMA_MODULE_ENABLED)
454   DMA_HandleTypeDef          *hdmacr;                             /*!< I3C control DMA handle parameters         */
455 
456   DMA_HandleTypeDef          *hdmatx;                             /*!< I3C Tx DMA handle parameters              */
457 
458   DMA_HandleTypeDef          *hdmarx;                             /*!< I3C Rx DMA handle parameters              */
459 
460   DMA_HandleTypeDef          *hdmasr;                             /*!< I3C status DMA handle parameters          */
461 #endif /* HAL_DMA_MODULE_ENABLED */
462 
463   HAL_LockTypeDef            Lock;                                /*!< I3C locking object                        */
464 
465   __IO HAL_I3C_StateTypeDef  State;                               /*!< I3C communication state                   */
466 
467   __IO HAL_I3C_StateTypeDef  PreviousState;                       /*!< I3C communication previous state          */
468 
469   __IO uint32_t              ErrorCode;                           /*!< I3C Error code                            */
470 
471   HAL_StatusTypeDef(*XferISR)(struct __I3C_HandleTypeDef *hi3c,
472                               uint32_t itMasks);                  /*!< I3C transfer IRQ handler function pointer */
473 
474   void(*ptrTxFunc)(struct __I3C_HandleTypeDef *hi3c);             /*!< I3C transmit function pointer             */
475 
476   void(*ptrRxFunc)(struct __I3C_HandleTypeDef *hi3c);             /*!< I3C receive function pointer              */
477 
478 #if (USE_HAL_I3C_REGISTER_CALLBACKS == 1U)
479 
480   void (* CtrlTxCpltCallback)(struct __I3C_HandleTypeDef *hi3c);
481   /*!< I3C Controller private data and CCC Tx Transfer complete callback                           */
482 
483   void (* CtrlRxCpltCallback)(struct __I3C_HandleTypeDef *hi3c);
484   /*!< I3C Controller private data and CCC Rx Transfer completed callback                          */
485 
486   void (* CtrlMultipleXferCpltCallback)(struct __I3C_HandleTypeDef *hi3c);
487   /*!< I3C Controller multiple Direct CCC, I3C private or I2C Transfer completed callback          */
488 
489   void (* CtrlDAACpltCallback)(struct __I3C_HandleTypeDef *hi3c);
490   /*!< I3C Controller Dynamic Address Assignment completed callback                                */
491 
492   void (* TgtReqDynamicAddrCallback)(struct __I3C_HandleTypeDef *hi3c, uint64_t targetPayload);
493   /*!< I3C Controller request dynamic address callback during Dynamic Address Assignment processus */
494 
495   void (* TgtTxCpltCallback)(struct __I3C_HandleTypeDef *hi3c);
496   /*!< I3C Target private data Tx Transfer completed callback                                      */
497 
498   void (* TgtRxCpltCallback)(struct __I3C_HandleTypeDef *hi3c);
499   /*!< I3C Target private data Rx Transfer completed callback                                      */
500 
501   void (* TgtHotJoinCallback)(struct __I3C_HandleTypeDef *hi3c, uint8_t dynamicAddress);
502   /*!< I3C Target Hot-Join callback                                                                */
503 
504   void (* NotifyCallback)(struct __I3C_HandleTypeDef *hi3c, uint32_t eventId);
505   /*!< I3C Target or Controller asynchronous events callback                                       */
506 
507   void (* ErrorCallback)(struct __I3C_HandleTypeDef *hi3c);
508   /*!< I3C Error callback                                                                          */
509 
510   void (* AbortCpltCallback)(struct __I3C_HandleTypeDef *hi3c);
511   /*!< I3C Abort complete callback                                                                 */
512 
513   void (* MspInitCallback)(struct __I3C_HandleTypeDef *hi3c);
514   /*!< I3C Msp Init callback                                                                       */
515 
516   void (* MspDeInitCallback)(struct __I3C_HandleTypeDef *hi3c);
517   /*!< I3C Msp DeInit callback                                                                     */
518 
519 #endif /* USE_HAL_I3C_REGISTER_CALLBACKS == 1U */
520 
521 } I3C_HandleTypeDef;
522 /**
523   * @}
524   */
525 
526 #if (USE_HAL_I3C_REGISTER_CALLBACKS == 1U)
527 /** @defgroup HAL_I3C_Callback_ID_definition I3C callback ID definition
528   * @brief    HAL I3C callback ID definition
529   * @{
530   */
531 typedef enum
532 {
533   /*!< I3C Controller Tx Transfer completed callback ID                  */
534   HAL_I3C_CTRL_TX_COMPLETE_CB_ID               = 0x00U,
535   /*!< I3C Controller Rx Transfer completed callback ID                  */
536   HAL_I3C_CTRL_RX_COMPLETE_CB_ID               = 0x01U,
537   /*!< I3C Controller Multiple Transfer completed callback ID            */
538   HAL_I3C_CTRL_MULTIPLE_XFER_COMPLETE_CB_ID    = 0x02U,
539   /*!< I3C Controller Dynamic Address Assignment completed callback ID   */
540   HAL_I3C_CTRL_DAA_COMPLETE_CB_ID              = 0x03U,
541   /*!< I3C Controller request dynamic address completed callback ID      */
542   HAL_I3C_TGT_REQ_DYNAMIC_ADDR_CB_ID           = 0x04U,
543   /*!< I3C Target Tx Transfer completed callback ID                      */
544   HAL_I3C_TGT_TX_COMPLETE_CB_ID                = 0x05U,
545   /*!< I3C Target Rx Transfer completed callback ID                      */
546   HAL_I3C_TGT_RX_COMPLETE_CB_ID                = 0x06U,
547   /*!< I3C Target Hot-join notification callback ID                      */
548   HAL_I3C_TGT_HOTJOIN_CB_ID                    = 0x07U,
549   /*!< I3C Target or Controller receive notification callback ID         */
550   HAL_I3C_NOTIFY_CB_ID                         = 0x08U,
551   /*!< I3C Error callback ID                                             */
552   HAL_I3C_ERROR_CB_ID                          = 0x09U,
553   /*!< I3C Abort callback ID                                             */
554   HAL_I3C_ABORT_CB_ID                          = 0x0AU,
555   /*!< I3C Msp Init callback ID                                          */
556   HAL_I3C_MSPINIT_CB_ID                        = 0x0BU,
557   /*!< I3C Msp DeInit callback ID                                        */
558   HAL_I3C_MSPDEINIT_CB_ID                      = 0x0CU
559 
560 } HAL_I3C_CallbackIDTypeDef;
561 /**
562   * @}
563   */
564 
565 /** @defgroup HAL_I3C_Callback_Pointer_definition I3C callback Pointer definition
566   * @brief    HAL I3C callback pointer definition
567   * @{
568   */
569 typedef  void (*pI3C_CallbackTypeDef)(I3C_HandleTypeDef *hi3c);
570 typedef  void (*pI3C_NotifyCallbackTypeDef)(I3C_HandleTypeDef *hi3c, uint32_t notifyId);
571 typedef  void (*pI3C_TgtHotJoinCallbackTypeDef)(I3C_HandleTypeDef *hi3c, uint8_t dynamicAddress);
572 typedef  void (*pI3C_TgtReqDynamicAddrCallbackTypeDef)(I3C_HandleTypeDef *hi3c, uint64_t targetPayload);
573 /**
574   * @}
575   */
576 #endif /* USE_HAL_I3C_REGISTER_CALLBACKS == 1U */
577 
578 /**
579   * @}
580   */
581 
582 /* Exported constants ------------------------------------------------------------------------------------------------*/
583 /** @defgroup I3C_Exported_Constants I3C Exported Constants
584   * @{
585   */
586 
587 /** @defgroup HAL_I3C_Notification_ID_definition I3C Notification ID definition
588   * @brief    HAL I3C Notification ID definition
589   * @{
590   */
591 
592 #define EVENT_ID_GETACCCR   (0x00000001U)
593 /*!< I3C target complete controller-role hand-off (direct GETACCR CCC) event         */
594 #define EVENT_ID_IBIEND     (0x00000002U)
595 /*!< I3C target IBI end process event                                                */
596 #define EVENT_ID_DAU        (0x00000004U)
597 /*!< I3C target receive a dynamic address update (ENTDAA/RSTDAA/SETNEWDA CCC) event  */
598 #define EVENT_ID_GETx       (0x00000008U)
599 /*!< I3C target receive any direct GETxxx CCC event                                  */
600 #define EVENT_ID_GETSTATUS  (0x00000010U)
601 /*!< I3C target receive get status command (direct GETSTATUS CCC) event              */
602 #define EVENT_ID_SETMWL     (0x00000020U)
603 /*!< I3C target receive maximum write length update (direct SETMWL CCC) event        */
604 #define EVENT_ID_SETMRL     (0x00000040U)
605 /*!< I3C target receive maximum read length update(direct SETMRL CCC) event          */
606 #define EVENT_ID_RSTACT     (0x00000080U)
607 /*!< I3C target detect reset pattern (broadcast or direct RSTACT CCC) event          */
608 #define EVENT_ID_ENTASx     (0x00000100U)
609 /*!< I3C target receive activity state update (direct or broadcast ENTASx) event     */
610 #define EVENT_ID_ENEC_DISEC (0x00000200U)
611 /*!< I3C target receive a direct or broadcast ENEC/DISEC CCC event                   */
612 #define EVENT_ID_DEFTGTS    (0x00000400U)
613 /*!< I3C target receive a broadcast DEFTGTS CCC event                                */
614 #define EVENT_ID_DEFGRPA    (0x00000800U)
615 /*!< I3C target receive a group addressing (broadcast DEFGRPA CCC) event             */
616 #define EVENT_ID_WKP        (0x00001000U)
617 /*!< I3C target wakeup event                                                         */
618 #define EVENT_ID_IBI        (0x00002000U)
619 /*!< I3C controller receive IBI event                                                */
620 #define EVENT_ID_CR         (0x00004000U)
621 /*!< I3C controller controller-role request event                                    */
622 #define EVENT_ID_HJ         (0x00008000U)
623 /*!< I3C controller hot-join event                                                   */
624 /**
625   * @}
626   */
627 
628 /** @defgroup I3C_OPTION_DEFINITION OPTION DEFINITION
629   * @note     HAL I3C option value coding follow below described bitmap:
630   *           b31
631   *                0  : message end type restart
632   *                1  : message end type stop
633   *           b30-b29-b28-b27
634   *                0010  : I3C private message
635   *                0011  : direct CCC message
636   *                0110  : broadcast CCC message
637   *                0100  : I2C private message
638   *           b4
639   *                0  : message without arbitration header
640   *                1  : message with arbitration header
641   *           b0
642   *                0  : message without defining byte
643   *                1  : message with defining byte
644   *
645   *           other bits (not used)
646   * @{
647   */
648 #define I3C_DIRECT_WITH_DEFBYTE_RESTART       (0x18000001U) /*!< Restart between each Direct Command then Stop
649                                                                  request for last command.
650                                                                  Each Command have an associated defining byte        */
651 #define I3C_DIRECT_WITH_DEFBYTE_STOP          (0x98000001U) /*!< Stop between each Direct Command.
652                                                                  Each Command have an associated defining byte        */
653 #define I3C_DIRECT_WITHOUT_DEFBYTE_RESTART    (0x18000000U) /*!< Restart between each Direct Command then Stop
654                                                                  request for last command.
655                                                                  Each Command have not an associated defining byte    */
656 #define I3C_DIRECT_WITHOUT_DEFBYTE_STOP       (0x98000000U) /*!< Stop between each Direct Command.
657                                                                  Each Command have not an associated defining byte    */
658 #define I3C_BROADCAST_WITH_DEFBYTE_RESTART    (0x30000001U) /*!< Restart between each Broadcast Command then Stop
659                                                                  request for last command.
660                                                                  Each Command have an associated defining byte        */
661 #define I3C_BROADCAST_WITH_DEFBYTE_STOP       (0xB0000001U) /*!< Stop between each Broadcast Command.
662                                                                  Each Command have an associated defining byte        */
663 #define I3C_BROADCAST_WITHOUT_DEFBYTE_RESTART (0x30000000U) /*!< Restart between each Broadcast Command then Stop
664                                                                  request for last command.
665                                                                  Each Command have not an associated defining byte    */
666 #define I3C_BROADCAST_WITHOUT_DEFBYTE_STOP    (0xB0000000U) /*!< Stop between each Broadcast Command.
667                                                                  Each Command have not an associated defining byte    */
668 #define I3C_PRIVATE_WITH_ARB_RESTART          (0x10000000U) /*!< Restart between each I3C Private message then Stop
669                                                                  request for last message.
670                                                                  Each Message start with an arbitration header after
671                                                                  start bit condition                                  */
672 #define I3C_PRIVATE_WITH_ARB_STOP             (0x90000000U) /*!< Stop between each I3C Private message.
673                                                                  Each Message start with an arbitration header after
674                                                                  start bit condition                                  */
675 #define I3C_PRIVATE_WITHOUT_ARB_RESTART       (0x10000004U) /*!< Restart between each I3C message then Stop request
676                                                                  for last message.
677                                                                  Each Message start with Target address after start
678                                                                  bit condition                                        */
679 #define I3C_PRIVATE_WITHOUT_ARB_STOP          (0x90000004U) /*!< Stop between each I3C Private message.
680                                                                  Each Message start with Target address after
681                                                                  start bit condition                                  */
682 #define I2C_PRIVATE_WITH_ARB_RESTART          (0x20000000U) /*!< Restart between each I2C Private message then Stop
683                                                                  request for last message.
684                                                                  Each Message start with an arbitration header after
685                                                                  start bit condition                                  */
686 #define I2C_PRIVATE_WITH_ARB_STOP             (0xA0000000U) /*!< Stop between each I2C Private message.
687                                                                  Each Message start with an arbitration header after
688                                                                  start bit condition                                  */
689 #define I2C_PRIVATE_WITHOUT_ARB_RESTART       (0x20000004U) /*!< Restart between each I2C message then Stop request
690                                                                  for last message.
691                                                                  Each Message start with Target address after start
692                                                                  bit condition                                        */
693 #define I2C_PRIVATE_WITHOUT_ARB_STOP          (0xA0000004U) /*!< Stop between each I2C Private message.
694                                                                  Each Message start with Target address after start
695                                                                  bit condition                                        */
696 /**
697   * @}
698   */
699 
700 /** @defgroup I3C_DYNAMIC_ADDRESS_OPTION_DEFINITION I3C DYNAMIC ADDRESS OPTION DEFINITION
701   * @{
702   */
703 #define I3C_RSTDAA_THEN_ENTDAA  (0x00000001U) /*!< Initiate a RSTDAA before a ENTDAA procedure */
704 #define I3C_ONLY_ENTDAA         (0x00000002U) /*!< Initiate a ENTDAA without RSTDAA            */
705 /**
706   * @}
707   */
708 
709 /** @defgroup I3C_ERROR_CODE_DEFINITION ERROR CODE DEFINITION
710   * @{
711   */
712 #define HAL_I3C_ERROR_NONE (0x00000000U)                                /*!< No error                                 */
713 
714 #define HAL_I3C_ERROR_CE0  (I3C_SER_PERR | LL_I3C_CONTROLLER_ERROR_CE0) /*!< Controller detected an illegally
715                                                                              formatted CCC                            */
716 #define HAL_I3C_ERROR_CE1  (I3C_SER_PERR | LL_I3C_CONTROLLER_ERROR_CE1) /*!< Controller detected that transmitted data
717                                                                              on the bus is different than expected    */
718 #define HAL_I3C_ERROR_CE2  (I3C_SER_PERR | LL_I3C_CONTROLLER_ERROR_CE2) /*!< Controller detected that broadcast address
719                                                                              7'h7E has been nacked                    */
720 #define HAL_I3C_ERROR_CE3  (I3C_SER_PERR | LL_I3C_CONTROLLER_ERROR_CE3) /*!< Controller detected that new Controller
721                                                                              did not drive the bus after
722                                                                              Controller-role handoff                  */
723 #define HAL_I3C_ERROR_TE0  (I3C_SER_PERR | LL_I3C_TARGET_ERROR_TE0)     /*!< Target detected an invalid broadcast
724                                                                              address                                  */
725 #define HAL_I3C_ERROR_TE1  (I3C_SER_PERR | LL_I3C_TARGET_ERROR_TE1)     /*!< Target detected an invalid CCC Code      */
726 #define HAL_I3C_ERROR_TE2  (I3C_SER_PERR | LL_I3C_TARGET_ERROR_TE2)     /*!< Target detected a parity error during
727                                                                              a write data                             */
728 #define HAL_I3C_ERROR_TE3  (I3C_SER_PERR | LL_I3C_TARGET_ERROR_TE3)     /*!< Target detected a parity error on assigned
729                                                                              address during dynamic address
730                                                                              arbitration                              */
731 #define HAL_I3C_ERROR_TE4  (I3C_SER_PERR | LL_I3C_TARGET_ERROR_TE4)     /*!< Target detected 7'h7E missing after Restart
732                                                                              during Dynamic Address Assignment
733                                                                              procedure                                */
734 #define HAL_I3C_ERROR_TE5  (I3C_SER_PERR | LL_I3C_TARGET_ERROR_TE5)     /*!< Target detected an illegally
735                                                                              formatted CCC                            */
736 #define HAL_I3C_ERROR_TE6  (I3C_SER_PERR | LL_I3C_TARGET_ERROR_TE6)     /*!< Target detected that transmitted data on
737                                                                              the bus is different than expected       */
738 #define HAL_I3C_ERROR_DATA_HAND_OFF (I3C_SER_DERR)  /*!< I3C data error during controller-role hand-off process       */
739 #define HAL_I3C_ERROR_DATA_NACK     (I3C_SER_DNACK) /*!< I3C data not acknowledged error                              */
740 #define HAL_I3C_ERROR_ADDRESS_NACK  (I3C_SER_ANACK) /*!< I3C address not acknowledged error                           */
741 #define HAL_I3C_ERROR_COVR          (I3C_SER_COVR)  /*!< I3C S FIFO Over-Run or C FIFO Under-Run error                */
742 #define HAL_I3C_ERROR_DOVR          (I3C_SER_DOVR)  /*!< I3C Rx FIFO Over-Run or Tx FIFO Under-Run error              */
743 #define HAL_I3C_ERROR_STALL         (I3C_SER_STALL) /*!< I3C SCL stall error                                          */
744 #define HAL_I3C_ERROR_DMA           (0x00010000U)   /*!< DMA transfer error                                           */
745 #define HAL_I3C_ERROR_TIMEOUT       (0x00020000U)   /*!< Timeout error                                                */
746 #define HAL_I3C_ERROR_DMA_PARAM     (0x00040000U)   /*!< DMA Parameter Error                                          */
747 #define HAL_I3C_ERROR_INVALID_PARAM (0x00080000U)   /*!< Invalid Parameters error                                     */
748 #define HAL_I3C_ERROR_SIZE          (0x00100000U)   /*!< I3C size management error                                    */
749 #define HAL_I3C_ERROR_NOT_ALLOWED   (0x00200000U)   /*!< I3C operation is not allowed                                 */
750 #define HAL_I3C_ERROR_DYNAMIC_ADDR  (0x00400000U)   /*!< I3C dynamic address error                                    */
751 
752 #if (USE_HAL_I3C_REGISTER_CALLBACKS == 1U)
753 #define HAL_I3C_ERROR_INVALID_CALLBACK (0x00800000U) /*!< Invalid Callback error                                      */
754 #endif /* USE_HAL_I3C_REGISTER_CALLBACKS == 1U */
755 /**
756   * @}
757   */
758 
759 /** @defgroup I3C_SDA_HOLD_TIME SDA HOLD TIME
760   * @{
761   */
762 #define HAL_I3C_SDA_HOLD_TIME_0_5  LL_I3C_SDA_HOLD_TIME_0_5 /*!< SDA hold time equal to 0.5 x ti3cclk */
763 #define HAL_I3C_SDA_HOLD_TIME_1_5  LL_I3C_SDA_HOLD_TIME_1_5 /*!< SDA hold time equal to 1.5 x ti3cclk */
764 /**
765   * @}
766   */
767 
768 /** @defgroup I3C_OWN_ACTIVITY_STATE OWN ACTIVITY STATE
769   * @{
770   */
771 #define HAL_I3C_OWN_ACTIVITY_STATE_0  LL_I3C_OWN_ACTIVITY_STATE_0 /*!< Own Controller Activity state 0 */
772 #define HAL_I3C_OWN_ACTIVITY_STATE_1  LL_I3C_OWN_ACTIVITY_STATE_1 /*!< Own Controller Activity state 1 */
773 #define HAL_I3C_OWN_ACTIVITY_STATE_2  LL_I3C_OWN_ACTIVITY_STATE_2 /*!< Own Controller Activity state 2 */
774 #define HAL_I3C_OWN_ACTIVITY_STATE_3  LL_I3C_OWN_ACTIVITY_STATE_3 /*!< Own Controller Activity state 3 */
775 /**
776   * @}
777   */
778 
779 /** @defgroup I3C_RX_FIFO_THRESHOLD RX FIFO THRESHOLD
780   * @{
781   */
782 #define HAL_I3C_RXFIFO_THRESHOLD_1_4  LL_I3C_RXFIFO_THRESHOLD_1_4  /*!< Rx Fifo Threshold is 1 byte  */
783 #define HAL_I3C_RXFIFO_THRESHOLD_4_4  LL_I3C_RXFIFO_THRESHOLD_4_4  /*!< Rx Fifo Threshold is 4 bytes */
784 /**
785   * @}
786   */
787 
788 /** @defgroup I3C_TX_FIFO_THRESHOLD TX FIFO THRESHOLD
789   * @{
790   */
791 #define HAL_I3C_TXFIFO_THRESHOLD_1_4  LL_I3C_TXFIFO_THRESHOLD_1_4  /*!< Tx Fifo Threshold is 1 byte  */
792 #define HAL_I3C_TXFIFO_THRESHOLD_4_4  LL_I3C_TXFIFO_THRESHOLD_4_4  /*!< Tx Fifo Threshold is 4 bytes */
793 /**
794   * @}
795   */
796 
797 /** @defgroup I3C_CONTROL_FIFO_STATE CONTROL FIFO STATE
798   * @{
799   */
800 #define HAL_I3C_CONTROLFIFO_DISABLE  0x00000000U      /*!< Control FIFO mode disable */
801 #define HAL_I3C_CONTROLFIFO_ENABLE   I3C_CFGR_TMODE   /*!< Control FIFO mode enable  */
802 /**
803   * @}
804   */
805 
806 /** @defgroup I3C_STATUS_FIFO_STATE STATUS FIFO STATE
807   * @{
808   */
809 #define HAL_I3C_STATUSFIFO_DISABLE  0x00000000U      /*!< Status FIFO mode disable */
810 #define HAL_I3C_STATUSFIFO_ENABLE   I3C_CFGR_SMODE   /*!< Status FIFO mode enable  */
811 /**
812   * @}
813   */
814 
815 /** @defgroup I3C_DIRECTION DIRECTION
816   * @{
817   */
818 #define HAL_I3C_DIRECTION_WRITE     LL_I3C_DIRECTION_WRITE       /*!< Write transfer          */
819 #define HAL_I3C_DIRECTION_READ      LL_I3C_DIRECTION_READ        /*!< Read transfer           */
820 #define HAL_I3C_DIRECTION_BOTH      (LL_I3C_DIRECTION_READ | 1U) /*!< Read and Write transfer */
821 /**
822   * @}
823   */
824 
825 /** @defgroup I3C_PAYLOAD_SIZE PAYLOAD SIZE
826   * @{
827   */
828 #define HAL_I3C_PAYLOAD_EMPTY    LL_I3C_PAYLOAD_EMPTY   /*!< Empty payload, no additional data after IBI acknowledge */
829 #define HAL_I3C_PAYLOAD_1_BYTE   LL_I3C_PAYLOAD_1_BYTE  /*!< One additional data byte after IBI acknowledge          */
830 #define HAL_I3C_PAYLOAD_2_BYTES  LL_I3C_PAYLOAD_2_BYTES /*!< Two additional data bytes after IBI acknowledge         */
831 #define HAL_I3C_PAYLOAD_3_BYTES  LL_I3C_PAYLOAD_3_BYTES /*!< Three additional data bytes after IBI acknowledge       */
832 #define HAL_I3C_PAYLOAD_4_BYTES  LL_I3C_PAYLOAD_4_BYTES /*!< Four additional data bytes after IBI acknowledge        */
833 /**
834   * @}
835   */
836 
837 /** @defgroup I3C_HANDOFF_ACTIVITY_STATE HANDOFF ACTIVITY STATE
838   * @{
839   */
840 #define HAL_I3C_HANDOFF_ACTIVITY_STATE_0  LL_I3C_HANDOFF_ACTIVITY_STATE_0  /*!< Activity state 0 after handoff */
841 #define HAL_I3C_HANDOFF_ACTIVITY_STATE_1  LL_I3C_HANDOFF_ACTIVITY_STATE_1  /*!< Activity state 1 after handoff */
842 #define HAL_I3C_HANDOFF_ACTIVITY_STATE_2  LL_I3C_HANDOFF_ACTIVITY_STATE_2  /*!< Activity state 2 after handoff */
843 #define HAL_I3C_HANDOFF_ACTIVITY_STATE_3  LL_I3C_HANDOFF_ACTIVITY_STATE_3  /*!< Activity state 3 after handoff */
844 /**
845   * @}
846   */
847 
848 /** @defgroup I3C_GETMXDS_FORMAT GETMXDS FORMAT
849   * @{
850   */
851 #define HAL_I3C_GETMXDS_FORMAT_1     LL_I3C_GETMXDS_FORMAT_1      /*!< GETMXDS CCC Format 1 is used, no MaxRdTurn
852                                                                        field in response                              */
853 #define HAL_I3C_GETMXDS_FORMAT_2_LSB LL_I3C_GETMXDS_FORMAT_2_LSB  /*!< GETMXDS CCC Format 2 is used, MaxRdTurn field
854                                                                        in response, LSB = RDTURN[7:0]                 */
855 #define HAL_I3C_GETMXDS_FORMAT_2_MID LL_I3C_GETMXDS_FORMAT_2_MID  /*!< GETMXDS CCC Format 2 is used, MaxRdTurn field
856                                                                        in response, Middle byte = RDTURN[7:0]         */
857 #define HAL_I3C_GETMXDS_FORMAT_2_MSB LL_I3C_GETMXDS_FORMAT_2_MSB  /*!< GETMXDS CCC Format 2 is used, MaxRdTurn field
858                                                                        in response, MSB = RDTURN[7:0]                 */
859 /**
860   * @}
861   */
862 
863 /** @defgroup I3C_TURNAROUND_TIME_TSCO TURNAROUND TIME TSCO
864   * @{
865   */
866 #define HAL_I3C_TURNAROUND_TIME_TSCO_LESS_12NS    LL_I3C_TURNAROUND_TIME_TSCO_LESS_12NS
867 /*!< clock-to-data turnaround time tSCO <= 12ns */
868 #define HAL_I3C_TURNAROUND_TIME_TSCO_GREATER_12NS  LL_I3C_TURNAROUND_TIME_TSCO_GREATER_12NS
869 /*!< clock-to-data turnaround time tSCO > 12ns  */
870 /**
871   * @}
872   */
873 
874 /** @defgroup I3C_COMMON_INTERRUPT I3C COMMON INTERRUPT
875   * @{
876   */
877 #define HAL_I3C_IT_TXFNFIE      LL_I3C_IER_TXFNFIE /*!< Tx FIFO not full interrupt enable      */
878 #define HAL_I3C_IT_RXFNEIE      LL_I3C_IER_RXFNEIE /*!< Rx FIFO not empty interrupt enable     */
879 #define HAL_I3C_IT_FCIE         LL_I3C_IER_FCIE    /*!< Frame complete interrupt enable        */
880 #define HAL_I3C_IT_ERRIE        LL_I3C_IER_ERRIE   /*!< Error interrupt enable                 */
881 #define HAL_I3C_ALL_COMMON_ITS  (uint32_t)(LL_I3C_IER_TXFNFIE | LL_I3C_IER_RXFNEIE | \
882                                            LL_I3C_IER_FCIE    | LL_I3C_IER_ERRIE)
883 /**
884   * @}
885   */
886 
887 /** @defgroup I3C_TARGET_INTERRUPT I3C TARGET INTERRUPT
888   * @{
889   */
890 #define HAL_I3C_IT_IBIENDIE     LL_I3C_IER_IBIENDIE /*!< IBI end interrupt enable                    */
891 #define HAL_I3C_IT_CRUPDIE      LL_I3C_IER_CRUPDIE  /*!< controller-role update interrupt enable     */
892 #define HAL_I3C_IT_WKPIE        LL_I3C_IER_WKPIE    /*!< wakeup interrupt enable                     */
893 #define HAL_I3C_IT_GETIE        LL_I3C_IER_GETIE    /*!< GETxxx CCC interrupt enable                 */
894 #define HAL_I3C_IT_STAIE        LL_I3C_IER_STAIE    /*!< GETSTATUS CCC interrupt enable              */
895 #define HAL_I3C_IT_DAUPDIE      LL_I3C_IER_DAUPDIE  /*!< ENTDAA/RSTDAA/SETNEWDA CCC interrupt enable */
896 #define HAL_I3C_IT_MWLUPDIE     LL_I3C_IER_MWLUPDIE /*!< SETMWL CCC interrupt enable                 */
897 #define HAL_I3C_IT_MRLUPDIE     LL_I3C_IER_MRLUPDIE /*!< SETMRL CCC interrupt enable                 */
898 #define HAL_I3C_IT_RSTIE        LL_I3C_IER_RSTIE    /*!< reset pattern interrupt enable              */
899 #define HAL_I3C_IT_ASUPDIE      LL_I3C_IER_ASUPDIE  /*!< ENTASx CCC interrupt enable                 */
900 #define HAL_I3C_IT_INTUPDIE     LL_I3C_IER_INTUPDIE /*!< ENEC/DISEC CCC interrupt enable             */
901 #define HAL_I3C_IT_DEFIE        (LL_I3C_IER_DEFIE | LL_I3C_IER_RXFNEIE)
902 /*!< DEFTGTS CCC interrupt enable                */
903 #define HAL_I3C_IT_GRPIE        (LL_I3C_IER_GRPIE | LL_I3C_IER_RXFNEIE)
904 /*!< DEFGRPA CCC interrupt enable                */
905 #define HAL_I3C_ALL_TGT_ITS     (uint32_t)(LL_I3C_IER_IBIENDIE | LL_I3C_IER_CRUPDIE  | LL_I3C_IER_WKPIE   | \
906                                            LL_I3C_IER_GETIE    | LL_I3C_IER_STAIE    | LL_I3C_IER_DAUPDIE | \
907                                            LL_I3C_IER_MWLUPDIE | LL_I3C_IER_MRLUPDIE | LL_I3C_IER_RSTIE   | \
908                                            LL_I3C_IER_ASUPDIE  | LL_I3C_IER_INTUPDIE | LL_I3C_IER_DEFIE   | \
909                                            LL_I3C_IER_GRPIE)
910 /**
911   * @}
912   */
913 
914 /** @defgroup I3C_CONTROLLER_INTERRUPT I3C CONTROLLER INTERRUPT
915   * @{
916   */
917 #define HAL_I3C_IT_CFNFIE      LL_I3C_IER_CFNFIE     /*!< Control FIFO not full interrupt enable     */
918 #define HAL_I3C_IT_SFNEIE      LL_I3C_IER_SFNEIE     /*!< Status FIFO not empty interrupt enable     */
919 #define HAL_I3C_IT_HJIE        LL_I3C_IER_HJIE       /*!< Hot-join interrupt enable                  */
920 #define HAL_I3C_IT_CRIE        LL_I3C_IER_CRIE       /*!< Controller-role request interrupt enable   */
921 #define HAL_I3C_IT_IBIIE       LL_I3C_IER_IBIIE      /*!< IBI request interrupt enable               */
922 #define HAL_I3C_IT_RXTGTENDIE  LL_I3C_IER_RXTGTENDIE /*!< Target-initiated read end interrupt enable */
923 #define HAL_I3C_ALL_CTRL_ITS   (uint32_t)(LL_I3C_IER_CFNFIE | LL_I3C_IER_SFNEIE | LL_I3C_IER_HJIE | \
924                                           LL_I3C_IER_CRIE  | LL_I3C_IER_IBIIE  | LL_I3C_IER_RXTGTENDIE)
925 /**
926   * @}
927   */
928 
929 /** @defgroup I3C_FLAGS I3C FLAGS
930   * @{
931   */
932 #define HAL_I3C_FLAG_CFEF       LL_I3C_EVR_CFEF      /*!< Control FIFO not empty flag      */
933 #define HAL_I3C_FLAG_TXFEF      LL_I3C_EVR_TXFEF     /*!< Tx FIFO empty flag               */
934 #define HAL_I3C_FLAG_CFNFF      LL_I3C_EVR_CFNFF     /*!< Control FIFO not full flag       */
935 #define HAL_I3C_FLAG_SFNEF      LL_I3C_EVR_SFNEF     /*!< Status FIFO not empty flag       */
936 #define HAL_I3C_FLAG_TXFNFF     LL_I3C_EVR_TXFNFF    /*!< Tx FIFO not full flag            */
937 #define HAL_I3C_FLAG_RXFNEF     LL_I3C_EVR_RXFNEF    /*!< Rx FIFO not empty flag           */
938 #define HAL_I3C_FLAG_RXLASTF    LL_I3C_EVR_RXLASTF   /*!< Last read data byte/word flag    */
939 #define HAL_I3C_FLAG_TXLASTF    LL_I3C_EVR_TXLASTF   /*!< Last written data byte/word flag */
940 #define HAL_I3C_FLAG_FCF        LL_I3C_EVR_FCF       /*!< Frame complete flag              */
941 #define HAL_I3C_FLAG_RXTGTENDF  LL_I3C_EVR_RXTGTENDF /*!< Target-initiated read end flag   */
942 #define HAL_I3C_FLAG_ERRF       LL_I3C_EVR_ERRF      /*!< Error flag                       */
943 #define HAL_I3C_FLAG_IBIF       LL_I3C_EVR_IBIF      /*!< IBI request flag                 */
944 #define HAL_I3C_FLAG_IBIENDF    LL_I3C_EVR_IBIENDF   /*!< IBI end flag                     */
945 #define HAL_I3C_FLAG_CRF        LL_I3C_EVR_CRF       /*!< Controller-role request flag     */
946 #define HAL_I3C_FLAG_CRUPDF     LL_I3C_EVR_CRUPDF    /*!< Controller-role update flag      */
947 #define HAL_I3C_FLAG_HJF        LL_I3C_EVR_HJF       /*!< Hot-join flag                    */
948 #define HAL_I3C_FLAG_WKPF       LL_I3C_EVR_WKPF      /*!< Wakeup flag                      */
949 #define HAL_I3C_FLAG_GETF       LL_I3C_EVR_GETF      /*!< GETxxx CCC flag                  */
950 #define HAL_I3C_FLAG_STAF       LL_I3C_EVR_STAF      /*!< Format 1 GETSTATUS CCC flag      */
951 #define HAL_I3C_FLAG_DAUPDF     LL_I3C_EVR_DAUPDF    /*!< ENTDAA/RSTDAA/SETNEWDA CCC flag  */
952 #define HAL_I3C_FLAG_MWLUPDF    LL_I3C_EVR_MWLUPDF   /*!< SETMWL CCC flag                  */
953 #define HAL_I3C_FLAG_MRLUPDF    LL_I3C_EVR_MRLUPDF   /*!< SETMRL CCC flag                  */
954 #define HAL_I3C_FLAG_RSTF       LL_I3C_EVR_RSTF      /*!< Reset pattern flag               */
955 #define HAL_I3C_FLAG_ASUPDF     LL_I3C_EVR_ASUPDF    /*!< ENTASx CCC flag                  */
956 #define HAL_I3C_FLAG_INTUPDF    LL_I3C_EVR_INTUPDF   /*!< ENEC/DISEC CCC flag              */
957 #define HAL_I3C_FLAG_DEFF       LL_I3C_EVR_DEFF      /*!< DEFTGTS CCC flag                 */
958 #define HAL_I3C_FLAG_GRPF       LL_I3C_EVR_GRPF      /*!< DEFGRPA CCC flag                 */
959 /**
960   * @}
961   */
962 
963 /** @defgroup I3C_BCR_IN_PAYLOAD I3C BCR IN PAYLOAD
964   * @{
965   */
966 #define HAL_I3C_BCR_IN_PAYLOAD_SHIFT             48                  /*!< BCR field in target payload */
967 /**
968   * @}
969   */
970 
971 /** @defgroup I3C_PATTERN_CONFIGURATION I3C PATTERN CONFIGURATION
972   * @{
973   */
974 #define HAL_I3C_TARGET_RESET_PATTERN             0x00000001U        /*!< Target reset pattern */
975 #define HAL_I3C_HDR_EXIT_PATTERN                 0x00000002U        /*!< HDR exit pattern */
976 /**
977   * @}
978   */
979 
980 /** @defgroup I3C_RESET_PATTERN RESET PATTERN
981   * @{
982   */
983 #define HAL_I3C_RESET_PATTERN_DISABLE            0x00000000U
984 /*!< Standard STOP condition emitted at the end of a frame */
985 #define HAL_I3C_RESET_PATTERN_ENABLE             I3C_CFGR_RSTPTRN
986 /*!< Reset pattern is inserted before the STOP condition of any emitted frame */
987 /**
988   * @}
989   */
990 
991 /**
992   * @}
993   */
994 
995 /* Exported macros ---------------------------------------------------------------------------------------------------*/
996 /** @defgroup I3C_Exported_Macros I3C Exported Macros
997   * @{
998   */
999 
1000 /** @brief Reset I3C handle state.
1001   * @param  __HANDLE__ specifies the I3C Handle.
1002   * @retval None
1003   */
1004 #if (USE_HAL_I3C_REGISTER_CALLBACKS == 1)
1005 #define __HAL_I3C_RESET_HANDLE_STATE(__HANDLE__)                do{                                             \
1006                                                                     (__HANDLE__)->State = HAL_I3C_STATE_RESET;  \
1007                                                                     (__HANDLE__)->MspInitCallback = NULL;       \
1008                                                                     (__HANDLE__)->MspDeInitCallback = NULL;     \
1009                                                                   } while(0)
1010 #else
1011 #define __HAL_I3C_RESET_HANDLE_STATE(__HANDLE__)                ((__HANDLE__)->State = HAL_I3C_STATE_RESET)
1012 #endif /* USE_HAL_I3C_REGISTER_CALLBACKS */
1013 
1014 /** @brief  Enable the specified I3C interrupt.
1015   * @param  __HANDLE__ specifies the I3C Handle.
1016   * @param  __INTERRUPT__ specifies the interrupt source to enable.
1017   *         This parameter can be one value or a combination of the following group's values:
1018   *            @arg @ref I3C_CONTROLLER_INTERRUPT
1019   *            @arg @ref I3C_TARGET_INTERRUPT
1020   *            @arg @ref I3C_COMMON_INTERRUPT
1021   * @retval None
1022   */
1023 #define __HAL_I3C_ENABLE_IT(__HANDLE__, __INTERRUPT__)   ((__HANDLE__)->Instance->IER |= (__INTERRUPT__))
1024 
1025 /** @brief  Disable the specified I3C interrupt.
1026   * @param  __HANDLE__ specifies the I3C Handle.
1027   * @param  __INTERRUPT__ specifies the interrupt source to disable.
1028   *         This parameter can be one value or a combination of the following group's values:
1029   *            @arg @ref I3C_CONTROLLER_INTERRUPT
1030   *            @arg @ref I3C_TARGET_INTERRUPT
1031   *            @arg @ref I3C_COMMON_INTERRUPT
1032   * @retval None
1033   */
1034 #define __HAL_I3C_DISABLE_IT(__HANDLE__, __INTERRUPT__)  ((__HANDLE__)->Instance->IER &= (~(__INTERRUPT__)))
1035 
1036 /** @brief  Check whether the specified I3C flag is set or not.
1037   * @param  __HANDLE__ specifies the I3C Handle.
1038   * @param  __FLAG__ specifies the flag to check.
1039   *         This parameter can be one value of the group @arg @ref I3C_FLAGS values.
1040   * @retval The new state of __FLAG__ (SET or RESET).
1041   */
1042 #define __HAL_I3C_GET_FLAG(__HANDLE__, __FLAG__) (((((__HANDLE__)->Instance->EVR) &\
1043                                                     (__FLAG__)) == (__FLAG__)) ? SET : RESET)
1044 
1045 /** @brief  Get Bus Characterics in payload (64bits) receive during ENTDAA procedure.
1046   * @param  __PAYLOAD__ specifies the Bus Characteristics capabilities retrieve during ENTDAA procedure.
1047   *         This parameter must be a number between Min_Data=0x00(uint64_t) and Max_Data=0xFFFFFFFFFFFFFFFFFF.
1048   * @retval The value of BCR Return value between Min_Data=0x00 and Max_Data=0xFF.
1049   */
1050 #define __HAL_I3C_GET_BCR(__PAYLOAD__) (((uint32_t)((uint64_t)(__PAYLOAD__) >> HAL_I3C_BCR_IN_PAYLOAD_SHIFT)) & \
1051                                         I3C_BCR_BCR)
1052 
1053 /** @brief  Check IBI request capabilities.
1054   * @param  __BCR__ specifies the Bus Characteristics capabilities retrieve during ENTDAA procedure.
1055   *         This parameter must be a number between Min_Data=0x00 and Max_Data=0xFF.
1056   * @retval The state of IBI request capabilities (ENABLE or DISABLE).
1057   */
1058 #define __HAL_I3C_GET_IBI_CAPABLE(__BCR__) (((((__BCR__) & I3C_BCR_BCR1_Msk) >> I3C_BCR_BCR1_Pos) == 1U) \
1059                                             ? ENABLE : DISABLE)
1060 
1061 /** @brief  Check IBI additional data byte capabilities.
1062   * @param  __BCR__ specifies the Bus Characteristics capabilities retrieve during ENTDAA procedure.
1063   *         This parameter must be a number between Min_Data=0x00 and Max_Data=0xFF.
1064   * @retval The state of IBI additional data byte capabilities (ENABLE or DISABLE).
1065   */
1066 #define __HAL_I3C_GET_IBI_PAYLOAD(__BCR__) (((((__BCR__) & I3C_BCR_BCR2_Msk) >> I3C_BCR_BCR2_Pos) == 1U) \
1067                                             ? ENABLE : DISABLE)
1068 
1069 /** @brief  Check Controller role request capabilities.
1070   * @param  __BCR__ specifies the Bus Characteristics capabilities retrieve during ENTDAA procedure.
1071   *         This parameter must be a number between Min_Data=0x00 and Max_Data=0xFF.
1072   * @retval The state of Controller role request capabilities (ENABLE or DISABLE).
1073   */
1074 #define __HAL_I3C_GET_CR_CAPABLE(__BCR__) (((((__BCR__) & I3C_BCR_BCR6_Msk) >> I3C_BCR_BCR6_Pos) == 1U) \
1075                                            ? ENABLE : DISABLE)
1076 
1077 /**
1078   * @}
1079   */
1080 
1081 /* Exported functions ------------------------------------------------------------------------------------------------*/
1082 /** @addtogroup I3C_Exported_Functions
1083   * @{
1084   */
1085 
1086 /** @addtogroup I3C_Exported_Functions_Group1 Initialization and de-initialization functions.
1087   * @{
1088   */
1089 HAL_StatusTypeDef HAL_I3C_Init(I3C_HandleTypeDef *hi3c);
1090 HAL_StatusTypeDef HAL_I3C_DeInit(I3C_HandleTypeDef *hi3c);
1091 void HAL_I3C_MspInit(I3C_HandleTypeDef *hi3c);
1092 void HAL_I3C_MspDeInit(I3C_HandleTypeDef *hi3c);
1093 /**
1094   * @}
1095   */
1096 
1097 /** @addtogroup I3C_Exported_Functions_Group2 Interrupt and callback functions.
1098   * @{
1099   */
1100 #if (USE_HAL_I3C_REGISTER_CALLBACKS == 1U)
1101 HAL_StatusTypeDef HAL_I3C_RegisterCallback(I3C_HandleTypeDef *hi3c,
1102                                            HAL_I3C_CallbackIDTypeDef callbackID,
1103                                            pI3C_CallbackTypeDef pCallback);
1104 HAL_StatusTypeDef HAL_I3C_RegisterNotifyCallback(I3C_HandleTypeDef *hi3c,
1105                                                  pI3C_NotifyCallbackTypeDef pNotifyCallback);
1106 HAL_StatusTypeDef HAL_I3C_RegisterTgtReqDynamicAddrCallback(I3C_HandleTypeDef *hi3c,
1107                                                             pI3C_TgtReqDynamicAddrCallbackTypeDef pTgtReqAddrCallback);
1108 HAL_StatusTypeDef HAL_I3C_RegisterTgtHotJoinCallback(I3C_HandleTypeDef *hi3c,
1109                                                      pI3C_TgtHotJoinCallbackTypeDef pTgtHotJoinCallback);
1110 HAL_StatusTypeDef HAL_I3C_UnRegisterCallback(I3C_HandleTypeDef *hi3c, HAL_I3C_CallbackIDTypeDef callbackID);
1111 #endif /* USE_HAL_I3C_REGISTER_CALLBACKS == 1U */
1112 
1113 HAL_StatusTypeDef HAL_I3C_ActivateNotification(I3C_HandleTypeDef *hi3c, I3C_XferTypeDef *pXferData,
1114                                                uint32_t interruptMask);
1115 HAL_StatusTypeDef HAL_I3C_DeactivateNotification(I3C_HandleTypeDef *hi3c, uint32_t interruptMask);
1116 void HAL_I3C_CtrlTxCpltCallback(I3C_HandleTypeDef *hi3c);
1117 void HAL_I3C_CtrlRxCpltCallback(I3C_HandleTypeDef *hi3c);
1118 void HAL_I3C_CtrlMultipleXferCpltCallback(I3C_HandleTypeDef *hi3c);
1119 void HAL_I3C_CtrlDAACpltCallback(I3C_HandleTypeDef *hi3c);
1120 void HAL_I3C_TgtReqDynamicAddrCallback(I3C_HandleTypeDef *hi3c, uint64_t targetPayload);
1121 void HAL_I3C_TgtTxCpltCallback(I3C_HandleTypeDef *hi3c);
1122 void HAL_I3C_TgtRxCpltCallback(I3C_HandleTypeDef *hi3c);
1123 void HAL_I3C_TgtHotJoinCallback(I3C_HandleTypeDef *hi3c, uint8_t dynamicAddress);
1124 void HAL_I3C_NotifyCallback(I3C_HandleTypeDef *hi3c, uint32_t eventId);
1125 void HAL_I3C_AbortCpltCallback(I3C_HandleTypeDef *hi3c);
1126 void HAL_I3C_ErrorCallback(I3C_HandleTypeDef *hi3c);
1127 void HAL_I3C_ER_IRQHandler(I3C_HandleTypeDef *hi3c);
1128 void HAL_I3C_EV_IRQHandler(I3C_HandleTypeDef *hi3c);
1129 /**
1130   * @}
1131   */
1132 
1133 /** @addtogroup I3C_Exported_Functions_Group3 Configuration functions.
1134   * @{
1135   */
1136 HAL_StatusTypeDef HAL_I3C_Ctrl_BusCharacteristicConfig(I3C_HandleTypeDef *hi3c,
1137                                                        const LL_I3C_CtrlBusConfTypeDef *pConfig);
1138 HAL_StatusTypeDef HAL_I3C_Tgt_BusCharacteristicConfig(I3C_HandleTypeDef *hi3c,
1139                                                       const LL_I3C_TgtBusConfTypeDef *pConfig);
1140 HAL_StatusTypeDef HAL_I3C_SetConfigFifo(I3C_HandleTypeDef *hi3c, const I3C_FifoConfTypeDef *pConfig);
1141 HAL_StatusTypeDef HAL_I3C_Ctrl_Config(I3C_HandleTypeDef *hi3c, const I3C_CtrlConfTypeDef *pConfig);
1142 HAL_StatusTypeDef HAL_I3C_Tgt_Config(I3C_HandleTypeDef *hi3c, const I3C_TgtConfTypeDef *pConfig);
1143 HAL_StatusTypeDef HAL_I3C_Ctrl_ConfigBusDevices(I3C_HandleTypeDef           *hi3c,
1144                                                 const I3C_DeviceConfTypeDef *pDesc,
1145                                                 uint8_t                      nbDevice);
1146 HAL_StatusTypeDef HAL_I3C_AddDescToFrame(I3C_HandleTypeDef         *hi3c,
1147                                          const I3C_CCCTypeDef      *pCCCDesc,
1148                                          const I3C_PrivateTypeDef  *pPrivateDesc,
1149                                          I3C_XferTypeDef           *pXferData,
1150                                          uint8_t                   nbFrame,
1151                                          uint32_t                  option);
1152 HAL_StatusTypeDef HAL_I3C_Ctrl_SetConfigResetPattern(I3C_HandleTypeDef *hi3c, uint32_t resetPattern);
1153 HAL_StatusTypeDef HAL_I3C_Ctrl_GetConfigResetPattern(I3C_HandleTypeDef *hi3c, uint32_t *pResetPattern);
1154 /**
1155   * @}
1156   */
1157 
1158 /** @addtogroup I3C_Exported_Functions_Group4 FIFO Management functions.
1159   * @{
1160   */
1161 HAL_StatusTypeDef HAL_I3C_FlushAllFifo(I3C_HandleTypeDef *hi3c);
1162 HAL_StatusTypeDef HAL_I3C_FlushTxFifo(I3C_HandleTypeDef *hi3c);
1163 HAL_StatusTypeDef HAL_I3C_FlushRxFifo(I3C_HandleTypeDef *hi3c);
1164 HAL_StatusTypeDef HAL_I3C_FlushControlFifo(I3C_HandleTypeDef *hi3c);
1165 HAL_StatusTypeDef HAL_I3C_FlushStatusFifo(I3C_HandleTypeDef *hi3c);
1166 HAL_StatusTypeDef HAL_I3C_ClearConfigFifo(I3C_HandleTypeDef *hi3c);
1167 HAL_StatusTypeDef HAL_I3C_GetConfigFifo(I3C_HandleTypeDef *hi3c, I3C_FifoConfTypeDef *pConfig);
1168 /**
1169   * @}
1170   */
1171 
1172 /** @addtogroup I3C_Exported_Functions_Group5 Controller operational functions.
1173   * @{
1174   */
1175 /* Controller transmit direct write or a broadcast CCC command APIs */
1176 HAL_StatusTypeDef HAL_I3C_Ctrl_TransmitCCC(I3C_HandleTypeDef *hi3c,
1177                                            I3C_XferTypeDef   *pXferData,
1178                                            uint32_t           timeout);
1179 HAL_StatusTypeDef HAL_I3C_Ctrl_TransmitCCC_IT(I3C_HandleTypeDef *hi3c,
1180                                               I3C_XferTypeDef   *pXferData);
1181 HAL_StatusTypeDef HAL_I3C_Ctrl_TransmitCCC_DMA(I3C_HandleTypeDef *hi3c,
1182                                                I3C_XferTypeDef   *pXferData);
1183 
1184 /* Controller transmit direct read CCC command APIs */
1185 HAL_StatusTypeDef HAL_I3C_Ctrl_ReceiveCCC(I3C_HandleTypeDef *hi3c,
1186                                           I3C_XferTypeDef   *pXferData,
1187                                           uint32_t           timeout);
1188 HAL_StatusTypeDef HAL_I3C_Ctrl_ReceiveCCC_IT(I3C_HandleTypeDef *hi3c,
1189                                              I3C_XferTypeDef   *pXferData);
1190 HAL_StatusTypeDef HAL_I3C_Ctrl_ReceiveCCC_DMA(I3C_HandleTypeDef *hi3c,
1191                                               I3C_XferTypeDef   *pXferData);
1192 
1193 /* Controller private write APIs */
1194 HAL_StatusTypeDef HAL_I3C_Ctrl_Transmit(I3C_HandleTypeDef   *hi3c,
1195                                         I3C_XferTypeDef     *pXferData,
1196                                         uint32_t             timeout);
1197 HAL_StatusTypeDef HAL_I3C_Ctrl_Transmit_IT(I3C_HandleTypeDef   *hi3c,
1198                                            I3C_XferTypeDef     *pXferData);
1199 HAL_StatusTypeDef HAL_I3C_Ctrl_Transmit_DMA(I3C_HandleTypeDef   *hi3c,
1200                                             I3C_XferTypeDef     *pXferData);
1201 
1202 /* Controller private read APIs */
1203 HAL_StatusTypeDef HAL_I3C_Ctrl_Receive(I3C_HandleTypeDef   *hi3c,
1204                                        I3C_XferTypeDef     *pXferData,
1205                                        uint32_t             timeout);
1206 HAL_StatusTypeDef HAL_I3C_Ctrl_Receive_IT(I3C_HandleTypeDef   *hi3c,
1207                                           I3C_XferTypeDef     *pXferData);
1208 HAL_StatusTypeDef HAL_I3C_Ctrl_Receive_DMA(I3C_HandleTypeDef   *hi3c,
1209                                            I3C_XferTypeDef     *pXferData);
1210 
1211 /* Controller multiple Direct CCC Command, I3C private or I2C transfer APIs */
1212 HAL_StatusTypeDef HAL_I3C_Ctrl_MultipleTransfer_IT(I3C_HandleTypeDef   *hi3c,
1213                                                    I3C_XferTypeDef     *pXferData);
1214 HAL_StatusTypeDef HAL_I3C_Ctrl_MultipleTransfer_DMA(I3C_HandleTypeDef   *hi3c,
1215                                                     I3C_XferTypeDef     *pXferData);
1216 
1217 /* Controller assign dynamic address APIs */
1218 HAL_StatusTypeDef HAL_I3C_Ctrl_SetDynAddr(I3C_HandleTypeDef *hi3c, uint8_t devAddress);
1219 HAL_StatusTypeDef HAL_I3C_Ctrl_DynAddrAssign_IT(I3C_HandleTypeDef *hi3c, uint32_t dynOption);
1220 HAL_StatusTypeDef HAL_I3C_Ctrl_DynAddrAssign(I3C_HandleTypeDef *hi3c,
1221                                              uint64_t          *target_payload,
1222                                              uint32_t           dynOption,
1223                                              uint32_t           timeout);
1224 /* Controller check device ready APIs */
1225 HAL_StatusTypeDef HAL_I3C_Ctrl_IsDeviceI3C_Ready(I3C_HandleTypeDef *hi3c,
1226                                                  uint8_t            devAddress,
1227                                                  uint32_t           trials,
1228                                                  uint32_t           timeout);
1229 HAL_StatusTypeDef HAL_I3C_Ctrl_IsDeviceI2C_Ready(I3C_HandleTypeDef *hi3c,
1230                                                  uint8_t            devAddress,
1231                                                  uint32_t           trials,
1232                                                  uint32_t           timeout);
1233 /* Controller arbitration APIs */
1234 HAL_StatusTypeDef HAL_I3C_Ctrl_GenerateArbitration(I3C_HandleTypeDef *hi3c, uint32_t timeout);
1235 
1236 /**
1237   * @}
1238   */
1239 
1240 /** @addtogroup I3C_Exported_Functions_Group6 Target operational functions.
1241   * @{
1242   */
1243 HAL_StatusTypeDef HAL_I3C_Tgt_Transmit(I3C_HandleTypeDef *hi3c, I3C_XferTypeDef *pXferData, uint32_t timeout);
1244 HAL_StatusTypeDef HAL_I3C_Tgt_Transmit_IT(I3C_HandleTypeDef *hi3c, I3C_XferTypeDef *pXferData);
1245 HAL_StatusTypeDef HAL_I3C_Tgt_Transmit_DMA(I3C_HandleTypeDef *hi3c, I3C_XferTypeDef *pXferData);
1246 HAL_StatusTypeDef HAL_I3C_Tgt_Receive(I3C_HandleTypeDef *hi3c, I3C_XferTypeDef *pXferData, uint32_t timeout);
1247 HAL_StatusTypeDef HAL_I3C_Tgt_Receive_IT(I3C_HandleTypeDef *hi3c, I3C_XferTypeDef *pXferData);
1248 HAL_StatusTypeDef HAL_I3C_Tgt_Receive_DMA(I3C_HandleTypeDef *hi3c, I3C_XferTypeDef *pXferData);
1249 HAL_StatusTypeDef HAL_I3C_Tgt_ControlRoleReq(I3C_HandleTypeDef *hi3c, uint32_t timeout);
1250 HAL_StatusTypeDef HAL_I3C_Tgt_ControlRoleReq_IT(I3C_HandleTypeDef *hi3c);
1251 HAL_StatusTypeDef HAL_I3C_Tgt_HotJoinReq(I3C_HandleTypeDef *hi3c, uint8_t *pAddress, uint32_t timeout);
1252 HAL_StatusTypeDef HAL_I3C_Tgt_HotJoinReq_IT(I3C_HandleTypeDef *hi3c);
1253 HAL_StatusTypeDef HAL_I3C_Tgt_IBIReq(I3C_HandleTypeDef *hi3c, const uint8_t *pPayload,
1254                                      uint8_t payloadSize, uint32_t timeout);
1255 HAL_StatusTypeDef HAL_I3C_Tgt_IBIReq_IT(I3C_HandleTypeDef *hi3c, const uint8_t *pPayload, uint8_t payloadSize);
1256 /**
1257   * @}
1258   */
1259 
1260 /** @addtogroup I3C_Exported_Functions_Group7 Generic and Common functions.
1261   * @{
1262   */
1263 HAL_StatusTypeDef HAL_I3C_Abort_IT(I3C_HandleTypeDef *hi3c);
1264 HAL_I3C_StateTypeDef HAL_I3C_GetState(const I3C_HandleTypeDef *hi3c);
1265 HAL_I3C_ModeTypeDef HAL_I3C_GetMode(const I3C_HandleTypeDef *hi3c);
1266 uint32_t HAL_I3C_GetError(const I3C_HandleTypeDef *hi3c);
1267 HAL_StatusTypeDef HAL_I3C_GetCCCInfo(I3C_HandleTypeDef *hi3c,
1268                                      uint32_t notifyId,
1269                                      I3C_CCCInfoTypeDef *pCCCInfo);
1270 HAL_StatusTypeDef HAL_I3C_Get_ENTDAA_Payload_Info(I3C_HandleTypeDef *hi3c,
1271                                                   uint64_t ENTDAA_payload,
1272                                                   I3C_ENTDAAPayloadTypeDef *pENTDAA_payload);
1273 /**
1274   * @}
1275   */
1276 
1277 /**
1278   * @}
1279   */
1280 
1281 /* Private constants -------------------------------------------------------------------------------------------------*/
1282 /** @defgroup I3C_Private_Constants I3C Private Constants
1283   * @{
1284   */
1285 
1286 /**
1287   * @}
1288   */
1289 
1290 /* Private macros ----------------------------------------------------------------------------------------------------*/
1291 /** @defgroup I3C_Private_Macro I3C Private Macros
1292   * @{
1293   */
1294 #define IS_I3C_MODE(__MODE__) (((__MODE__) == HAL_I3C_MODE_NONE)       || \
1295                                ((__MODE__) == HAL_I3C_MODE_CONTROLLER) || \
1296                                ((__MODE__) == HAL_I3C_MODE_TARGET))
1297 
1298 #define IS_I3C_INTERRUPTMASK(__MODE__, __ITMASK__) (((__MODE__) == HAL_I3C_MODE_CONTROLLER)             ? \
1299                                                     ((((__ITMASK__) & HAL_I3C_ALL_CTRL_ITS) != 0x0U)   || \
1300                                                      (((__ITMASK__) & HAL_I3C_ALL_COMMON_ITS) != 0x0U)) : \
1301                                                     ((((__ITMASK__) & HAL_I3C_ALL_TGT_ITS) != 0x0U)    || \
1302                                                      (((__ITMASK__) & HAL_I3C_ALL_COMMON_ITS) != 0x0U)))
1303 
1304 #define IS_I3C_ENTDAA_OPTION(__OPTION__) (((__OPTION__) == I3C_RSTDAA_THEN_ENTDAA) || \
1305                                           ((__OPTION__) == I3C_ONLY_ENTDAA))
1306 
1307 #define IS_I3C_SDAHOLDTIME_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_SDA_HOLD_TIME_0_5) || \
1308                                              ((__VALUE__) == HAL_I3C_SDA_HOLD_TIME_1_5))
1309 
1310 #define IS_I3C_WAITTIME_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_OWN_ACTIVITY_STATE_0) || \
1311                                           ((__VALUE__) == HAL_I3C_OWN_ACTIVITY_STATE_1) || \
1312                                           ((__VALUE__) == HAL_I3C_OWN_ACTIVITY_STATE_2) || \
1313                                           ((__VALUE__) == HAL_I3C_OWN_ACTIVITY_STATE_3))
1314 
1315 #define IS_I3C_TXFIFOTHRESHOLD_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_TXFIFO_THRESHOLD_1_4) || \
1316                                                  ((__VALUE__) == HAL_I3C_TXFIFO_THRESHOLD_4_4))
1317 
1318 #define IS_I3C_RXFIFOTHRESHOLD_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_RXFIFO_THRESHOLD_1_4) || \
1319                                                  ((__VALUE__) == HAL_I3C_RXFIFO_THRESHOLD_4_4))
1320 
1321 #define IS_I3C_CONTROLFIFOSTATE_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_CONTROLFIFO_DISABLE) || \
1322                                                   ((__VALUE__) == HAL_I3C_CONTROLFIFO_ENABLE))
1323 
1324 #define IS_I3C_STATUSFIFOSTATE_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_STATUSFIFO_DISABLE) || \
1325                                                  ((__VALUE__) == HAL_I3C_STATUSFIFO_ENABLE))
1326 
1327 #define IS_I3C_DEVICE_VALUE(__VALUE__) (((__VALUE__) >= 1U) && ((__VALUE__) <= 4U))
1328 
1329 #define IS_I3C_DYNAMICADDRESS_VALUE(__VALUE__) ((__VALUE__) <= 0x7FU)
1330 
1331 #define IS_I3C_FUNCTIONALSTATE_VALUE(__VALUE__) (((__VALUE__) == DISABLE) || \
1332                                                  ((__VALUE__) == ENABLE))
1333 
1334 #define IS_I3C_HANDOFFACTIVITYSTATE_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_HANDOFF_ACTIVITY_STATE_0) || \
1335                                                       ((__VALUE__) == HAL_I3C_HANDOFF_ACTIVITY_STATE_1) || \
1336                                                       ((__VALUE__) == HAL_I3C_HANDOFF_ACTIVITY_STATE_2) || \
1337                                                       ((__VALUE__) == HAL_I3C_HANDOFF_ACTIVITY_STATE_3))
1338 
1339 #define IS_I3C_TSCOTIME_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_TURNAROUND_TIME_TSCO_LESS_12NS) || \
1340                                           ((__VALUE__) == HAL_I3C_TURNAROUND_TIME_TSCO_GREATER_12NS))
1341 
1342 #define IS_I3C_MAXSPEEDDATA_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_GETMXDS_FORMAT_1    ) || \
1343                                               ((__VALUE__) == HAL_I3C_GETMXDS_FORMAT_2_LSB) || \
1344                                               ((__VALUE__) == HAL_I3C_GETMXDS_FORMAT_2_MID) || \
1345                                               ((__VALUE__) == HAL_I3C_GETMXDS_FORMAT_2_MSB))
1346 
1347 #define IS_I3C_IBIPAYLOADSIZE_VALUE(__VALUE__) (((__VALUE__) == HAL_I3C_PAYLOAD_EMPTY  ) || \
1348                                                 ((__VALUE__) == HAL_I3C_PAYLOAD_1_BYTE ) || \
1349                                                 ((__VALUE__) == HAL_I3C_PAYLOAD_2_BYTES) || \
1350                                                 ((__VALUE__) == HAL_I3C_PAYLOAD_3_BYTES) || \
1351                                                 ((__VALUE__) == HAL_I3C_PAYLOAD_4_BYTES))
1352 
1353 #define IS_I3C_MIPIIDENTIFIER_VALUE(__VALUE__) ((__VALUE__) <= 0x0FU)
1354 
1355 #define IS_I3C_MAXREADTURNARROUND_VALUE(__VALUE__) ((__VALUE__) <= 0xFFU)
1356 
1357 #define I3C_CHECK_IT_SOURCE(__IER__, __IT__)  ((((__IER__) & (__IT__)) == (__IT__)) ? SET : RESET)
1358 
1359 #define I3C_CHECK_FLAG(__ISR__, __FLAG__) ((((__ISR__) & (__FLAG__)) == (__FLAG__)) ? SET : RESET)
1360 
1361 #define IS_I3C_DMASOURCEBYTE_VALUE(__VALUE__) ((__VALUE__) == DMA_SRC_DATAWIDTH_BYTE)
1362 
1363 #define IS_I3C_DMASOURCEWORD_VALUE(__VALUE__) ((__VALUE__) == DMA_SRC_DATAWIDTH_WORD)
1364 
1365 #define IS_I3C_DMADESTINATIONBYTE_VALUE(__VALUE__) ((__VALUE__) == DMA_DEST_DATAWIDTH_BYTE)
1366 
1367 #define IS_I3C_DMADESTINATIONWORD_VALUE(__VALUE__) ((__VALUE__) == DMA_DEST_DATAWIDTH_WORD)
1368 
1369 #define I3C_GET_DMA_REMAIN_DATA(__HANDLE__) (__HAL_DMA_GET_COUNTER(__HANDLE__) + HAL_DMAEx_GetFifoLevel(__HANDLE__))
1370 #define IS_I3C_RESET_PATTERN(__RSTPTRN__) (((__RSTPTRN__) == HAL_I3C_RESET_PATTERN_ENABLE)   || \
1371                                            ((__RSTPTRN__) == HAL_I3C_RESET_PATTERN_DISABLE))
1372 /**
1373   * @}
1374   */
1375 
1376 /* Private functions -------------------------------------------------------------------------------------------------*/
1377 /** @defgroup I3C_Private_Functions I3C Private Functions
1378   * @{
1379   */
1380 /* Private functions are defined in stm32n6xx_hal_i3c.c file */
1381 /**
1382   * @}
1383   */
1384 
1385 /**
1386   * @}
1387   */
1388 
1389 /**
1390   * @}
1391   */
1392 
1393 #ifdef __cplusplus
1394 }
1395 #endif
1396 
1397 #endif /* STM32N6xx_HAL_I3C_H */
1398