1 /*
2  * Copyright 2021 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #ifndef __FSL_ADAPTER_RFIMU_H__
10 #define __FSL_ADAPTER_RFIMU_H__
11 
12 #include "fsl_adapter_rfcommon.h"
13 #include "fsl_adapter_rpmsg.h"
14 
15 /*!
16  * @addtogroup IMU_Adapter
17  * @{
18  */
19 
20 /*******************************************************************************
21  * Definitions
22  ******************************************************************************/
23 
24 #ifndef IMU_TASK_PRIORITY
25 #if defined(__ZEPHYR__)
26 #define IMU_TASK_PRIORITY (3U)
27 #elif defined(CPU2)
28 #define IMU_TASK_PRIORITY (2U)
29 #else
30 #define IMU_TASK_PRIORITY                                                                                       \
31     (6U) /* makesure the calculated priority of HAL_ImuMainCpu13 task is the same with tcp/ip task(priority 2), \
32             otherwise the throughput of udp rx will be very low */
33 #endif
34 #endif
35 
36 #ifndef IMU_TASK_STACK_SIZE
37 #define IMU_TASK_STACK_SIZE (2048U)
38 #endif
39 
40 #define IMU_MAX_MSG_CNT_LONG      (16U)
41 #define IMU_MAX_MSG_CNT_SHORT     (2U)
42 #define IMU_SYNC_MAGIC_PATTERN    (0xABCDEF89U)
43 #define IMU_TXQ_BUFSIZE           (32U) /*! must be power of 2 */
44 #define IMU_TXQ_BUFSIZE_THRESHOLD (8U)
45 #define IMU_TXQ_ENTRY_MASK        (IMU_TXQ_BUFSIZE - 1U)
46 #define IMU_EVENT_TRIGGERS        ((1U << kIMU_LinkMax) - 1U)
47 /*! @brief IMU message payload size. */
48 #define IMU_PAYLOAD_SIZE (8U)
49 
50 #define RPMSG_EVENT_ENDPOINT_QUERY_RSP (1U << 0U)
51 
52 #ifndef RPMSG_TXQ13_BUFSIZE
53 #define RPMSG_TXQ13_BUFSIZE (8U)
54 #endif
55 
56 #ifndef RPMSG_TXQ23_BUFSIZE
57 #define RPMSG_TXQ23_BUFSIZE (16U)
58 #endif
59 
60 #ifndef RPMSG_TXQ13_BUFLENGTH
61 #define RPMSG_TXQ13_BUFLENGTH (512U)
62 #endif
63 
64 #ifndef RPMSG_TXQ23_BUFLENGTH
65 #define RPMSG_TXQ23_BUFLENGTH (264U)
66 #endif
67 
68 #define RPMSG_TXQ13_ENTRY_MASK (RPMSG_TXQ13_BUFSIZE - 1U)
69 #define RPMSG_TXQ23_ENTRY_MASK (RPMSG_TXQ23_BUFSIZE - 1U)
70 
71 #ifdef CONFIG_IMU_GDMA
72 #define IMU_GDMA_ENABLE (1U)
73 #else
74 #define IMU_GDMA_ENABLE (0U)
75 #endif
76 /*! @brief IMU initialization state. */
77 enum imu_init_state_t
78 {
79     IMU_UNINITIALIZED,
80     IMU_INITIALIZING,
81     IMU_INITIALIZED
82 };
83 
84 /*! @brief RPMSG type. */
85 typedef enum _imu_msg_type_t
86 {
87     IMU_MSG_CONTROL,
88     IMU_MSG_COMMAND,
89     IMU_MSG_COMMAND_RESPONSE,
90     IMU_MSG_EVENT,
91     IMU_MSG_TX_DATA,
92     IMU_MSG_RX_DATA,
93     IMU_MSG_MULTI_TX_DATA,
94     IMU_MSG_MULTI_RX_DATA,
95     IMU_MSG_RPMSG,
96     IMU_MSG_MAX,
97     /* The header is 8 bits hence max types =255 */
98 } imu_msg_type_t;
99 
100 /*! @brief RPMSG control message subtype. */
101 typedef enum _imu_ctrl_msg_subtype_t
102 {
103     IMU_MSG_CONTROL_DEFAULT,
104     IMU_MSG_CONTROL_SYNC,
105     IMU_MSG_CONTROL_SYNC_ACK,
106     IMU_MSG_CONTROL_ACK_FOR_UNLOCK,
107     IMU_MSG_CONTROL_ERROR,
108     IMU_MSG_CONTROL_SHUTDOWN,
109     IMU_MSG_CONTROL_CMD_BUF_ADDR,
110     IMU_MSG_CONTROL_EVT_ACK,
111     IMU_MSG_CONTROL_COMMAND_RSP_ACK,
112     IMU_MSG_CONTROL_TX_BUF_ADDR,
113     IMU_MSG_CONTROL_FREE_RX_BUF,
114     IMU_MSG_CONTROL_RPMSG_EPT_QUIRY,
115     IMU_MSG_CONTROL_RPMSG_EPT_QUIRY_RSP,
116     IMU_MSG_CONTROL_RPMSG_BUF_FREE,
117     IMU_MSG_CONTROL_EVT_DUMP,
118     IMU_MSG_CONTROL_MAX,
119     /* The header is 8 bits hence max types =255 */
120 } imu_ctrl_msg_subtype_t;
121 
122 /*! @brief IMU message header structure. */
123 typedef struct IMU_Hdr_t_
124 {
125     volatile uint8_t type;
126     volatile uint8_t sub_type; // user of icc module needs to define own msg sub_types
127     volatile uint8_t seq_num;  // may be used by user of icc module for own purpose
128     volatile uint8_t length;   // length of Payload in bytes
129 } IMU_Hdr_t;
130 
131 /*! @brief IMU message structure. */
132 typedef struct IMU_Msg_t_
133 {
134     IMU_Hdr_t Hdr;
135     volatile uint32_t PayloadPtr[IMU_PAYLOAD_SIZE];
136 } IMU_Msg_t;
137 
138 /*! @brief IMU message wrapper 1. */
139 typedef struct IMU_Msg_Wrapper_long_t_
140 {
141     volatile uint32_t magic[2];
142     IMU_Msg_t msgQ[2][IMU_MAX_MSG_CNT_LONG];
143 } IMU_Msg_Wrapper_long_t;
144 
145 /*! @brief IMU message wrapper 2. */
146 typedef struct IMU_Msg_Wrapper_short_t_
147 {
148     volatile uint32_t magic[2];
149     IMU_Msg_t msgQ[2][IMU_MAX_MSG_CNT_SHORT];
150 } IMU_Msg_Wrapper_short_t;
151 
152 /* rpmsg_std_hdr contains a reserved field,
153  * this implementation of RPMSG uses this reserved
154  * field to hold the idx and totlen of the buffer
155  * not being returned to the vring in the receive
156  * callback function. This way, the no-copy API
157  * can use this field to return the buffer later.
158  */
159 struct rpmsg_hdr_reserved
160 {
161     uint16_t rfu; /* reserved for future usage */
162     uint16_t idx;
163 };
164 
165 /*!
166  * Common header for all rpmsg messages.
167  * Every message sent/received on the rpmsg bus begins with this header.
168  */
169 struct rpmsg_std_hdr
170 {
171     uint32_t src;                       /*!< source endpoint address */
172     uint32_t dst;                       /*!< destination endpoint address */
173     struct rpmsg_hdr_reserved reserved; /*!< reserved for future use */
174     uint16_t len;                       /*!< length of payload (in bytes) */
175     uint16_t flags;                     /*!< message flags */
176 };
177 
178 /*!
179  * Common message structure.
180  * Contains the header and the payload.
181  */
182 struct rpmsg_std_msg
183 {
184     struct rpmsg_std_hdr hdr; /*!< RPMsg message header */
185     uint32_t data;            /*!< bytes of message payload data */
186 };
187 
188 typedef hal_rpmsg_status_t (*imu_callback_t)(IMU_Msg_t *pImuMsg, uint32_t length);
189 
190 /*! @brief IMU interrupt callback */
191 typedef void (*imu_irq_callback_t)(void);
192 
193 /*! @brief Checks whether a tx buffer queue is empty */
194 #define IS_WLAN_TXBQ_EMPTY(q) ((q)->writeIndex == (q)->readIndex)
195 
196 /*! @brief Checks whether a tx buffer queue is full */
197 #define IS_WLAN_TXBQ_FULL(q)                                                  \
198     ((((q)->writeIndex & (1UL << 31U)) != ((q)->readIndex & (1UL << 31U))) && \
199      (((q)->writeIndex & IMU_TXQ_ENTRY_MASK) == ((q)->readIndex & IMU_TXQ_ENTRY_MASK)))
200 
201 /*! @brief Increments write pointer*/
202 #define INCR_WLAN_TXBQ_WR_INDEX(q, n)                                \
203     {                                                                \
204         unsigned int wrapBit = (q)->writeIndex & (1UL << 31U);       \
205         unsigned int val     = (q)->writeIndex & IMU_TXQ_ENTRY_MASK; \
206         unsigned int newVal  = (val + (n)) & IMU_TXQ_ENTRY_MASK;     \
207         if ((n) > 0U)                                                \
208         {                                                            \
209             if (newVal <= val)                                       \
210             {                                                        \
211                 (q)->writeIndex = newVal | (wrapBit ^ (1UL << 31U)); \
212             }                                                        \
213             else                                                     \
214             {                                                        \
215                 (q)->writeIndex = newVal | wrapBit;                  \
216             }                                                        \
217         }                                                            \
218     }
219 
220 /*! @brief Increments read pointer */
221 #define INCR_WLAN_TXBQ_RD_INDEX(q, n)                               \
222     {                                                               \
223         unsigned int wrapBit = (q)->readIndex & (1UL << 31U);       \
224         unsigned int val     = (q)->readIndex & IMU_TXQ_ENTRY_MASK; \
225         unsigned int newVal  = (val + (n)) & IMU_TXQ_ENTRY_MASK;    \
226         if ((n) > 0U)                                               \
227         {                                                           \
228             if (newVal <= val)                                      \
229             {                                                       \
230                 (q)->readIndex = newVal | (wrapBit ^ (1UL << 31U)); \
231             }                                                       \
232             else                                                    \
233             {                                                       \
234                 (q)->readIndex = newVal | wrapBit;                  \
235             }                                                       \
236         }                                                           \
237     }
238 
239 /*! @brief Checks whether a tx buffer queue is empty */
240 #define IS_RPMSG_TXBQ13_EMPTY(q) ((q)->writeIndex == (q)->readIndex)
241 #define IS_RPMSG_TXBQ23_EMPTY(q) ((q)->writeIndex == (q)->readIndex)
242 
243 /*! @brief Checks whether a tx buffer queue is full */
244 #define IS_RPMSG_TXBQ13_FULL(q)                                               \
245     ((((q)->writeIndex & (1UL << 31U)) != ((q)->readIndex & (1UL << 31U))) && \
246      (((q)->writeIndex & RPMSG_TXQ13_ENTRY_MASK) == ((q)->readIndex & RPMSG_TXQ13_ENTRY_MASK)))
247 #define IS_RPMSG_TXBQ23_FULL(q)                                               \
248     ((((q)->writeIndex & (1UL << 31U)) != ((q)->readIndex & (1UL << 31U))) && \
249      (((q)->writeIndex & RPMSG_TXQ23_ENTRY_MASK) == ((q)->readIndex & RPMSG_TXQ23_ENTRY_MASK)))
250 
251 /*! @brief Increments write pointer*/
252 #define INCR_RPMSG_TXBQ13_WR_INDEX(q, n)                                 \
253     {                                                                    \
254         unsigned int wrapBit = (q)->writeIndex & (1UL << 31U);           \
255         unsigned int val     = (q)->writeIndex & RPMSG_TXQ13_ENTRY_MASK; \
256         unsigned int newVal  = (val + (n)) & RPMSG_TXQ13_ENTRY_MASK;     \
257         if ((n) > 0U)                                                    \
258         {                                                                \
259             if (newVal <= val)                                           \
260             {                                                            \
261                 (q)->writeIndex = newVal | (wrapBit ^ (1UL << 31U));     \
262             }                                                            \
263             else                                                         \
264             {                                                            \
265                 (q)->writeIndex = newVal | wrapBit;                      \
266             }                                                            \
267         }                                                                \
268     }
269 
270 #define INCR_RPMSG_TXBQ23_WR_INDEX(q, n)                                 \
271     {                                                                    \
272         unsigned int wrapBit = (q)->writeIndex & (1UL << 31U);           \
273         unsigned int val     = (q)->writeIndex & RPMSG_TXQ23_ENTRY_MASK; \
274         unsigned int newVal  = (val + (n)) & RPMSG_TXQ23_ENTRY_MASK;     \
275         if ((n) > 0U)                                                    \
276         {                                                                \
277             if (newVal <= val)                                           \
278             {                                                            \
279                 (q)->writeIndex = newVal | (wrapBit ^ (1UL << 31U));     \
280             }                                                            \
281             else                                                         \
282             {                                                            \
283                 (q)->writeIndex = newVal | wrapBit;                      \
284             }                                                            \
285         }                                                                \
286     }
287 
288 /*! @brief Increments read pointer */
289 #define INCR_RPMSG_TXBQ13_RD_INDEX(q, n)                                \
290     {                                                                   \
291         unsigned int wrapBit = (q)->readIndex & (1UL << 31U);           \
292         unsigned int val     = (q)->readIndex & RPMSG_TXQ13_ENTRY_MASK; \
293         unsigned int newVal  = (val + (n)) & RPMSG_TXQ13_ENTRY_MASK;    \
294         if ((n) > 0U)                                                   \
295         {                                                               \
296             if (newVal <= val)                                          \
297             {                                                           \
298                 (q)->readIndex = newVal | (wrapBit ^ (1UL << 31U));     \
299             }                                                           \
300             else                                                        \
301             {                                                           \
302                 (q)->readIndex = newVal | wrapBit;                      \
303             }                                                           \
304         }                                                               \
305     }
306 
307 #define INCR_RPMSG_TXBQ23_RD_INDEX(q, n)                                \
308     {                                                                   \
309         unsigned int wrapBit = (q)->readIndex & (1UL << 31U);           \
310         unsigned int val     = (q)->readIndex & RPMSG_TXQ23_ENTRY_MASK; \
311         unsigned int newVal  = (val + (n)) & RPMSG_TXQ23_ENTRY_MASK;    \
312         if ((n) > 0U)                                                   \
313         {                                                               \
314             if (newVal <= val)                                          \
315             {                                                           \
316                 (q)->readIndex = newVal | (wrapBit ^ (1UL << 31U));     \
317             }                                                           \
318             else                                                        \
319             {                                                           \
320                 (q)->readIndex = newVal | wrapBit;                      \
321             }                                                           \
322         }                                                               \
323     }
324 
325 typedef struct _hal_rpmsg_rx_state
326 {
327     rpmsg_rx_callback_t callback;
328     void *param;
329 } hal_rpmsg_rx_state_t;
330 
331 /*! @brief rpmsg state structure. */
332 typedef struct _hal_rpmsg_state
333 {
334     LIST_ELEM_st eptLink;
335     uint32_t local_addr;
336     uint32_t remote_addr;
337     uint8_t imuLink;
338     bool eptLinkIsReady;
339     hal_rpmsg_rx_state_t rx;
340 } hal_rpmsg_state_t;
341 
342 /*! @brief rpmsg ept buf structure. */
343 typedef struct _hal_rpmsg_ept_uf
344 {
345     LIST_ELEM_st eptLink;
346     uint32_t addr;
347 } hal_rpmsg_ept_buf_t;
348 
349 /*! @brief IMU WLAN Tx buffer control structure */
350 typedef struct IMU_WLAN_TXQ_CTRL_st
351 {
352     uint32_t writeIndex;
353     uint32_t readIndex;
354     uint32_t txBufQue[IMU_TXQ_BUFSIZE];
355 } IMU_WLAN_TXQ_CTRL_st;
356 
357 /*! @brief RPMSG Tx buffer control structure */
358 typedef struct RPMSG_TXQ_CTRL_st
359 {
360     uint32_t writeIndex;
361     uint32_t readIndex;
362     uint32_t txBufQue[RPMSG_TXQ23_BUFSIZE];
363 } RPMSG_TXQ_CTRL_st;
364 
365 /*! @brief imu handle structure. */
366 typedef struct _hal_imu_handle_t
367 {
368     /*! Word 0 */
369     uint8_t imuLink;
370     uint8_t imuSyncState; /*! 0:Link Off, 1:Link Ongoing, 2: Link Up */
371     uint8_t freeTxMportBufCnt;
372     uint8_t imuMsgBufIdx;
373     /*! Word 1 */
374     bool cmd_buffer_available;
375     bool cmd_response_buffer_available;
376     bool rsvdbool1;
377     bool rsvdbool2;
378     /*! Word 2 */
379     uint32_t *cmd_buffer;
380     /*! Word 3 */
381     IMU_WLAN_TXQ_CTRL_st wlanTxqCtl;
382     /*! Word 37 */
383     uint32_t imuMsgBuf[IMU_PAYLOAD_SIZE];
384     /*! Word 45 */
385     LIST_ELEM_st eptList;
386     /*! Word 47 */
387     RPMSG_TXQ_CTRL_st rpmsgTxqCtl;
388     /*! Word 57 */
389     imu_callback_t imuHandler[IMU_MSG_MAX];
390 } hal_imu_handle_t;
391 
392 /*******************************************************************************
393  * API
394  ******************************************************************************/
395 
396 #if defined(__cplusplus)
397 extern "C" {
398 #endif /* _cplusplus */
399 
400 /*!
401  * @brief Add wlan Tx packet for sending multiple Tx packets within one message.
402  *
403  * This function is used to add a wlan Tx packet for IMU_MSG_MULTI_TX_DATA.
404  *
405  * @param imuLink           IMU link ID.
406  * @param txBuf             Tx buffer to be sent.
407  * @param length            Length of Tx data.
408  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
409  */
410 hal_rpmsg_status_t HAL_ImuAddWlanTxPacket(uint8_t imuLink, uint8_t *txBuf, uint32_t length);
411 
412 /*!
413  * @brief Add wlan Tx packet for sending multiple Tx packets within one message.
414  *
415  * This function is used to add a wlan Tx packet with callback function for IMU_MSG_MULTI_TX_DATA.
416  *
417  * @param imuLink           IMU link ID.
418  * @param txBuf             Tx buffer to be sent.
419  * @param length            Length of Tx data.
420  * @param cb                Callback function to add packet.
421  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
422  */
423 hal_rpmsg_status_t HAL_ImuAddWlanTxPacketExt(uint8_t imuLink,
424                                              uint8_t *txBuf,
425                                              uint32_t length,
426                                              void (*cb)(void *destAddr, void *srcAddr, uint32_t len));
427 
428 /*!
429  * @brief Install wlan callback.
430  *
431  * This function is used to imstall wlan callback
432  *
433  * @param imuLink        IMU link ID.
434  * @param callback       Callback to be installed.
435  * @param type           Callback type.
436  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
437  */
438 hal_rpmsg_status_t HAL_ImuInstallCallback(uint8_t imuLink, imu_callback_t callback, uint8_t type);
439 
440 /*!
441  * @brief Install imu interrupt callback.
442  *
443  * This function is used to install imu interrupt callback
444  *
445  * @param imuLink        IMU link ID.
446  * @param callback       Callback to be installed.
447  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
448  */
449 hal_rpmsg_status_t HAL_ImuInstallIrqCallback(uint8_t imuLink, imu_irq_callback_t callback);
450 
451 /*!
452  * @brief Send wlan command packet.
453  *
454  * This function is used to send wlan command packet
455  *
456  * @param imuLink        IMU link ID.
457  * @param cmdBuf         Command buffer to be sent.
458  * @param length         Length of command data.
459  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
460  */
461 hal_rpmsg_status_t HAL_ImuSendCommand(uint8_t imuLink, uint8_t *cmdBuf, uint32_t length);
462 
463 /*!
464  * @brief Add wlan Tx packet for sending one Tx packet within one message.
465  *
466  * This function is used to send a wlan Tx packet.
467  *
468  * @param imuLink           IMU link ID.
469  * @param txBuf             Tx buffer to be sent.
470  * @param length            Length of Tx data.
471  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
472  */
473 hal_rpmsg_status_t HAL_ImuSendTxData(uint8_t imuLink, uint8_t *txBuf, uint32_t length);
474 
475 /*!
476  * @brief Send multiple Tx packets within one message.
477  *
478  * This function is used to send multiple wlan Tx packets within one IMU message,
479  * which have been added by HAL_ImuAddWlanTxPacket already.
480  *
481  * @param imuLink           IMU link ID.
482  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
483  */
484 hal_rpmsg_status_t HAL_ImuSendMultiTxData(uint8_t imuLink);
485 
486 /*!
487  * @brief Check if IMU link is up.
488  *
489  * This function is used to check if IMU link is up.
490  *
491  * @param imuLink        IMU link ID.
492  * @retval kStatus_HAL_RpmsgSuccess for IMU link up or kStatus_HAL_RpmsgError for IMU link not up.
493  */
494 hal_rpmsg_status_t HAL_ImuLinkIsUp(uint8_t imuLink);
495 
496 /*!
497  * @brief Start IMU link
498  *
499  * This function is used to start specified IMU link.
500  *
501  * @param imuLink        IMU link ID.
502  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
503  */
504 hal_rpmsg_status_t HAL_ImuInit(imu_link_t link);
505 
506 /*!
507  * @brief Stop IMU link
508  *
509  * This function is used to stop specified IMU link.
510  *
511  * @param imuLink        IMU link ID.
512  * @param flag           flag with bits to control.
513  *        flag bit0: control if need send imu msg to fw (imu tx return /imu shutdown)
514  *        flag bit1: control if need destroy ImuTask and ImuQFlagsRef
515  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
516  */
517 hal_rpmsg_status_t HAL_ImuDeinit(imu_link_t link, uint32_t flag);
518 
519 /*!
520  * @brief Return all tx buffer.
521  *
522  * This function is used to return all tx buffer to CPU1.
523  *
524  * @param imuLink              IMU link ID.
525  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
526  */
527 hal_rpmsg_status_t HAL_ImuReturnAllTxBuf(imu_link_t link);
528 
529 /*!
530  * @brief Receive IMU message.
531  *
532  * This function is used to receive and process IMU message
533  *
534  * @param imuLink              IMU link ID.
535  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
536  */
537 hal_rpmsg_status_t HAL_ImuReceive(uint8_t imuLink);
538 
539 /*!
540  * @brief Check if tx buffer queue empty.
541  *
542  * This function is used to check if tx buffer queue empty
543  *
544  * @param imuLink              IMU link ID.
545  * @retval TRUE or FALSE.
546  */
547 bool HAL_ImuIsTxBufQueueEmpty(uint8_t imuLink);
548 
549 #if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)
550 /*!
551  * @brief Copy data by GDMA.
552  *
553  * This function is used to copy data by GDMA between shared memory and local memory.
554  *
555  * @param destAddr          Source address of data.
556  * @param srcAddr           Destination address of data.
557  * @param len               Data Length.
558  */
559 void HAL_ImuGdmaCopyData(void *destAddr, void *srcAddr, uint32_t len);
560 
561 /*! @}*/
562 #endif
563 
564 #ifdef CONFIG_FW_DUMP_EVENT
565 /*!
566  * @brief Send fw dump event ack.
567  *
568  * This function is used to Send fw dump event ack to fw, When the event data process is completed.
569  *
570  * @param imuLink              IMU link ID.
571  * @param rxBuf                Rx buffer to be sent.
572  * @param length               Length of Rx buffer
573  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
574  */
575 hal_rpmsg_status_t HAL_ImuSendEventDumpAck(imu_link_t link, uint8_t *rxBuf, uint8_t length);
576 #endif
577 
578 /*!
579  * @brief Create imu task mutex.
580  *
581  * This function creates a imu task mutex.
582  *
583  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
584  */
585 hal_rpmsg_status_t HAL_ImuCreateTaskLock(void);
586 
587 /*!
588  * @brief Delete imu task mutex.
589  *
590  * This function deletes the imu task mutex.
591  */
592 void HAL_ImuDeleteTaskLock(void);
593 
594 /*!
595  * @brief Acquire imu task mutex.
596  *
597  * This function acquires the imu task mutex. Only one thread can acquire the mutex at any
598  * given time.
599  *
600  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
601  */
602 hal_rpmsg_status_t HAL_ImuGetTaskLock(void);
603 
604 /*!
605  * @brief Release imu task mutex.
606  *
607  * This function releases the imu task mutex.
608  *
609  * @retval kStatus_HAL_RpmsgSuccess or kStatus_HAL_RpmsgError.
610  */
611 hal_rpmsg_status_t HAL_ImuPutTaskLock(void);
612 
613 /*!
614  * @brief Reset imu readIndex and writeIndex to 0.
615  *
616  * This function reset the imu txq.
617  */
618 void HAL_ImuResetWlanTxq(uint8_t imuLink);
619 
620 #if defined(__cplusplus)
621 }
622 #endif
623 /*! @}*/
624 #endif /* __FSL_ADAPTER_RFIMU_H__ */
625