1 /*
2  * Copyright 2021 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include "fsl_adapter_imu_common.h"
10 #include "fsl_adapter_imu.h"
11 #if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)
12 #include "fsl_gdma.h"
13 #endif
14 
15 /*******************************************************************************
16  * Definitions
17  ******************************************************************************/
18 #if defined(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)
19 #ifndef IMU_ISR_PRIORITY
20 #define IMU_ISR_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)
21 #endif
22 #else
23 #ifndef IMU_ISR_PRIORITY
24 #define IMU_ISR_PRIORITY (2U)
25 #endif
26 #endif
27 
28 #ifndef IMU_LINK_WAIT_DELAY_MS
29 #define IMU_LINK_WAIT_DELAY_MS 1U
30 #endif
31 
32 #ifndef IMUMC_ALLOC_FAILED_DELAY_MS
33 #define IMUMC_ALLOC_FAILED_DELAY_MS 1U
34 #endif
35 
36 #ifndef IMUMC_ALLOC_RETRY_COUNT
37 #define IMUMC_ALLOC_RETRY_COUNT 10U
38 #endif
39 
40 #if defined(CPU2)
41 #define os_InterruptMaskClear(irq_num) DisableIRQ((IRQn_Type)irq_num)
42 #define os_InterruptMaskSet(irq_num)   EnableIRQ((IRQn_Type)irq_num)
43 #define os_ClearPendingISR(irq_num)    NVIC_ClearPendingIRQ((IRQn_Type)irq_num)
44 #else
45 #define os_InterruptMaskClear(irq_num) DisableIRQ(irq_num)
46 #define os_InterruptMaskSet(irq_num)   EnableIRQ(irq_num)
47 #define os_ClearPendingISR(irq_num)    NVIC_ClearPendingIRQ(irq_num)
48 #endif
49 
50 #if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)
51 #define HAL_GDMA            GDMA
52 #define HAL_GDMA_CH         0
53 #define HAL_GDMA_IRQn       GDMA_IRQn
54 #define HAL_GDMA_DONE_EVENT (1U << 0U)
55 #define GDMA_ISR_PRIORITY   IMU_ISR_PRIORITY
56 #define HAL_IMU_MEMCPY      HAL_ImuGdmaCopyData
57 #else
58 #define HAL_IMU_MEMCPY memcpy
59 #endif
60 
61 /*******************************************************************************
62  * Declaration
63  ******************************************************************************/
64 #ifdef __ZEPHYR__
65 const uint8_t gUseRtos_c = 1;
66 #endif
67 
68 /*! IMU handle instance for each IMU link */
69 static hal_imu_handle_t imuHandleCh[kIMU_LinkMax];
70 
71 /*! IMU interrput callback for each IMU link */
72 static imu_irq_callback_t imuIrqCallback[kIMU_LinkMax];
73 
74 /*! IMU message sequence number */
75 static uint8_t seq_num = 0;
76 
77 /*! IMU initializtion flag
78     bit 0: flag for IMU link #0
79     bit 1: flag for IMU link #1
80 */
81 static uint8_t imu_init_flag = 0;
82 
83 /*! IMUMC initializtion flag
84  */
85 static uint8_t imumc_init_flag = 0;
86 
87 /*! imu task created flag
88  */
89 static uint8_t imu_task_flag = 0;
90 
91 #ifndef CPU2
92 /*! Sleep flag address between CPU1 and CPU3 or CPU2 and CPU3 */
93 #define IMU_SLEEP_FLAG13 0x4138248C
94 #define IMU_SLEEP_FLAG23 0x443CFE88
95 #define IMU_SLEEP_FLAG_ADDR(imuLinkId) \
96     (((imuLinkId) == kIMU_LinkCpu1Cpu3) ? ((uint32_t *)IMU_SLEEP_FLAG13) : ((uint32_t *)IMU_SLEEP_FLAG23))
97 #endif
98 
99 /*! wait imu task lock
100  */
101 #if (defined(USE_RTOS) && (USE_RTOS > 0U))
102 #ifdef __ZEPHYR__
103 struct k_mutex imu_task_lock;
104 #else
105 static OSA_MUTEX_HANDLE_DEFINE(imu_task_lock);
106 #endif
107 #endif
108 /*******************************************************************************
109  * Code
110  ******************************************************************************/
111 #if defined(CPU2)
112 extern IMU_Msg_Wrapper_short_t __attribute__((aligned(4))) SQRAM_CPU12_MBOX;
113 extern IMU_Msg_Wrapper_long_t __attribute__((aligned(4))) SQRAM_CPU23_MBOX;
114 volatile static IMU_Msg_Wrapper_short_t *imuMsgQ12 = &SQRAM_CPU12_MBOX;
115 volatile static IMU_Msg_Wrapper_long_t *imuMsgQ23  = &SQRAM_CPU23_MBOX;
116 __attribute__((section(".smu_cpu23_txq"))) volatile static uint8_t __attribute__((aligned(4)))
117 imumcTxBuf23[IMUMC_TXQ23_BUFSIZE][IMUMC_TXQ23_BUFLENGTH];
118 
119 static void HAL_ImuMain(void *argv);
120 static OSA_TASK_HANDLE_DEFINE(ImuTaskHandle);
121 static OSA_TASK_DEFINE(HAL_ImuMain, IMU_TASK_PRIORITY, 1, IMU_TASK_STACK_SIZE, 0);
122 OSA_EVENT_HANDLE_DEFINE(ImuQFlagsRef);
123 #else
124 __attribute__((section(".smu_cpu13_mbox"))) static volatile IMU_Msg_Wrapper_long_t __attribute__((aligned(4)))
125 SQRAM_CPU13_MBOX;
126 __attribute__((section(".smu_cpu23_mbox"))) static volatile IMU_Msg_Wrapper_long_t __attribute__((aligned(4)))
127 SQRAM_CPU23_MBOX;
128 static volatile IMU_Msg_Wrapper_long_t *imuMsgQ13 = &SQRAM_CPU13_MBOX;
129 static volatile IMU_Msg_Wrapper_long_t *imuMsgQ23 = &SQRAM_CPU23_MBOX;
130 __attribute__((section(".smu_cpu31_txq"))) static volatile uint8_t __attribute__((aligned(4)))
131 imumcTxBuf13[IMUMC_TXQ13_BUFSIZE][IMUMC_TXQ13_BUFLENGTH];
132 __attribute__((section(".smu_cpu32_txq"))) static volatile uint8_t __attribute__((aligned(4)))
133 imumcTxBuf23[IMUMC_TXQ23_BUFSIZE][IMUMC_TXQ23_BUFLENGTH];
134 
135 /* seperate CPU2 to CPU3 and CPU1 to CPU3 IMU RX tasks */
136 #ifdef __ZEPHYR__
137 static void HAL_ImuMainCpu13(void *argv1, void *argv2, void *argv3);
138 static void HAL_ImuMainCpu23(void *argv1, void *argv2, void *argv3);
139 
140 K_THREAD_STACK_DEFINE(ImuTaskStackCpu13, IMU_TASK_STACK_SIZE);
141 K_THREAD_STACK_DEFINE(ImuTaskStackCpu23, IMU_TASK_STACK_SIZE);
142 
143 k_tid_t ImuTaskCpu13;
144 k_tid_t ImuTaskCpu23;
145 
146 K_EVENT_DEFINE(ImuQ13FlagsRef);
147 K_EVENT_DEFINE(ImuQ23FlagsRef);
148 
149 struct k_thread ImuTaskHandleCpu13;
150 struct k_thread ImuTaskHandleCpu23;
151 #else
152 static void HAL_ImuMainCpu13(void *argv);
153 static void HAL_ImuMainCpu23(void *argv);
154 
155 static OSA_TASK_HANDLE_DEFINE(ImuTaskHandleCpu13);
156 static OSA_TASK_HANDLE_DEFINE(ImuTaskHandleCpu23);
157 static OSA_TASK_DEFINE(HAL_ImuMainCpu13, IMU_TASK_PRIORITY, 1, IMU_TASK_STACK_SIZE, 0);
158 static OSA_TASK_DEFINE(HAL_ImuMainCpu23, IMU_TASK_PRIORITY, 1, IMU_TASK_STACK_SIZE, 0);
159 OSA_EVENT_HANDLE_DEFINE(ImuQ13FlagsRef);
160 OSA_EVENT_HANDLE_DEFINE(ImuQ23FlagsRef);
161 #endif /* __ZEPHYR__ */
162 #endif
163 
164 #ifdef __ZEPHYR__
165 struct k_event imumcQFlagsRef;
166 #else
167 OSA_EVENT_HANDLE_DEFINE(imumcQFlagsRef);
168 #endif /* __ZEPHYR__ */
169 
170 #if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)
171 static gdma_handle_t gdmaHandle;
172 OSA_SEMAPHORE_HANDLE_DEFINE(gdmaSemHandle);
173 OSA_EVENT_HANDLE_DEFINE(gdmaFlagsRef);
174 #endif
175 
176 /**************Internal helper functions***********************/
177 /// \cond
178 #if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)
HAL_GdmaCallback(gdma_handle_t * handle,void * userData,uint32_t interrupts)179 static void HAL_GdmaCallback(gdma_handle_t *handle, void *userData, uint32_t interrupts)
180 {
181     if (0UL != (interrupts & kGDMA_TransferDoneFlag))
182     {
183         (void)OSA_EventSet((osa_event_handle_t)gdmaFlagsRef, HAL_GDMA_DONE_EVENT);
184     }
185 }
186 
HAL_InitGdma(void)187 static void HAL_InitGdma(void)
188 {
189     if (gdmaHandle.callback)
190         return;
191 
192     GDMA_Init(HAL_GDMA);
193     GDMA_CreateHandle(&gdmaHandle, HAL_GDMA, HAL_GDMA_CH);
194     GDMA_SetCallback(&gdmaHandle, HAL_GdmaCallback, NULL);
195     OSA_SemaphoreCreate(gdmaSemHandle, 1U);
196     (void)OSA_EventCreate(gdmaFlagsRef, 1U);
197     NVIC_SetPriority(GDMA_IRQn, GDMA_ISR_PRIORITY);
198 }
199 
HAL_ImuGdmaCopyData(void * destAddr,void * srcAddr,uint32_t len)200 void HAL_ImuGdmaCopyData(void *destAddr, void *srcAddr, uint32_t len)
201 {
202     uint32_t Events;
203     gdma_channel_xfer_config_t xferConfig = {0};
204 
205     xferConfig.srcAddr        = (uint32_t)srcAddr;
206     xferConfig.destAddr       = (uint32_t)destAddr;
207     xferConfig.linkListAddr   = 0; /* Don't use LLI */
208     xferConfig.ahbProt        = kGDMA_ProtPrevilegedMode;
209     xferConfig.srcBurstSize   = kGDMA_BurstSize16;
210     xferConfig.destBurstSize  = kGDMA_BurstSize16;
211     xferConfig.srcWidth       = kGDMA_TransferWidth1Byte;
212     xferConfig.destWidth      = kGDMA_TransferWidth1Byte;
213     xferConfig.srcAddrInc     = true;
214     xferConfig.destAddrInc    = true;
215     xferConfig.transferLen    = len;
216     xferConfig.enableLinkList = false;
217 
218     if (KOSA_StatusSuccess == OSA_SemaphoreWait(gdmaSemHandle, osaWaitForever_c))
219     {
220         GDMA_SubmitTransfer(&gdmaHandle, &xferConfig);
221         GDMA_StartTransfer(&gdmaHandle);
222         /* Wait for GMDA transfer done. */
223         (void)OSA_EventWait((osa_event_handle_t)gdmaFlagsRef, HAL_GDMA_DONE_EVENT, 0, osaWaitForever_c, &Events);
224         OSA_SemaphorePost(gdmaSemHandle);
225     }
226 }
227 #endif
228 
HAL_ImuSetCpuReadyFlag(uint8_t cpuId)229 static void HAL_ImuSetCpuReadyFlag(uint8_t cpuId)
230 {
231 }
232 
HAL_ImuGetCpuReadyFlag(uint8_t cpuId)233 bool HAL_ImuGetCpuReadyFlag(uint8_t cpuId)
234 {
235     return TRUE;
236 }
237 
238 /*!
239  * @brief
240  * Create a new imumc endpoint, which can be used
241  * for communication.
242  *
243  * @param handle            Imumc instance
244  * @param addr              source endpoint address
245  *
246  * @return       RL_NULL if not found, node pointer containing the ept on success
247  *
248  */
HAL_ImumcGetEndpointFromAddr(hal_imu_handle_t * imuHandle,uint32_t addr)249 static hal_imumc_handle_t HAL_ImumcGetEndpointFromAddr(hal_imu_handle_t *imuHandle, uint32_t addr)
250 {
251     LIST_ELEM_st *cur;
252     hal_imumc_state_t *pEnd;
253 
254     assert(NULL != imuHandle);
255 
256     list_for_each(cur, &imuHandle->eptList)
257     {
258         pEnd = (hal_imumc_state_t *)cur;
259         if (pEnd->local_addr == addr)
260         {
261             return pEnd;
262         }
263     }
264 
265     return NULL;
266 }
267 
HAL_ImumcCreateEndpoint(hal_imumc_handle_t handle)268 static hal_imumc_handle_t HAL_ImumcCreateEndpoint(hal_imumc_handle_t handle)
269 {
270     hal_imu_handle_t *imuHandle;
271     hal_imumc_state_t *imumcHandle;
272     assert(NULL != handle);
273 
274     imumcHandle = (hal_imumc_state_t *)handle;
275     imuHandle   = &imuHandleCh[imumcHandle->imuLink];
276     // env_lock_mutex(imumcHandle->lock);
277     {
278         if (NULL == HAL_ImumcGetEndpointFromAddr(imuHandle, imumcHandle->local_addr))
279         {
280             LIST_addTail(&imuHandle->eptList, &imumcHandle->eptLink);
281             // env_unlock_mutex(imumcHandle->lock);
282             return imumcHandle;
283         }
284     }
285     // env_unlock_mutex(imumcHandle->lock);
286     return NULL;
287 }
288 
HAL_ImumcDestroyEndpoint(hal_imumc_handle_t handle)289 static hal_imumc_status_t HAL_ImumcDestroyEndpoint(hal_imumc_handle_t handle)
290 {
291     hal_imu_handle_t *imuHandle;
292     hal_imumc_state_t *imumcHandle;
293     assert(NULL != handle);
294 
295     imumcHandle = (hal_imumc_state_t *)handle;
296     imuHandle   = &imuHandleCh[imumcHandle->imuLink];
297 
298     // env_lock_mutex(imumcHandle->lock);
299     {
300         imumcHandle = HAL_ImumcGetEndpointFromAddr(imuHandle, imumcHandle->local_addr);
301 
302         if (NULL == imumcHandle)
303         {
304             // env_unlock_mutex(imumcHandle->lock);
305             return kStatus_HAL_ImumcError;
306         }
307         LIST_remove(&imuHandle->eptList, &imumcHandle->eptLink);
308     }
309     // env_unlock_mutex(imumcHandle->lock);
310     return kStatus_HAL_ImumcSuccess;
311 }
312 
HAL_ImuGetWlanTxBuf(hal_imu_handle_t * imuHandle)313 static uint8_t *HAL_ImuGetWlanTxBuf(hal_imu_handle_t *imuHandle)
314 {
315     uint32_t wlanTxBuf;
316     IMU_WLAN_TXQ_CTRL_st *wlanTxqCtl;
317 
318     assert(NULL != imuHandle);
319     wlanTxqCtl = &imuHandle->wlanTxqCtl;
320 
321     if (IS_WLAN_TXBQ_EMPTY(wlanTxqCtl))
322     {
323         return NULL;
324     }
325     else
326     {
327         wlanTxBuf = wlanTxqCtl->txBufQue[wlanTxqCtl->readIndex & IMU_TXQ_ENTRY_MASK];
328         INCR_WLAN_TXBQ_RD_INDEX(wlanTxqCtl, 1U);
329         return (uint8_t *)wlanTxBuf;
330     }
331 }
332 
HAL_ImuPutWlanTxBuf(hal_imu_handle_t * imuHandle,uint8_t * txBuf)333 static hal_imumc_status_t HAL_ImuPutWlanTxBuf(hal_imu_handle_t *imuHandle, uint8_t *txBuf)
334 {
335     hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;
336     IMU_WLAN_TXQ_CTRL_st *wlanTxqCtl;
337 
338     assert(NULL != imuHandle);
339     wlanTxqCtl = &imuHandle->wlanTxqCtl;
340 
341     if (IS_WLAN_TXBQ_FULL(wlanTxqCtl))
342     {
343         state = kStatus_HAL_ImumcError;
344     }
345     else
346     {
347         wlanTxqCtl->txBufQue[wlanTxqCtl->writeIndex & IMU_TXQ_ENTRY_MASK] = (uint32_t)txBuf;
348         INCR_WLAN_TXBQ_WR_INDEX(wlanTxqCtl, 1U);
349     }
350 
351     return state;
352 }
353 
HAL_ImumcGetTxBuf(hal_imu_handle_t * imuHandle)354 static uint8_t *HAL_ImumcGetTxBuf(hal_imu_handle_t *imuHandle)
355 {
356     uint8_t *imumcTxBuf = NULL;
357     IMUMC_TXQ_CTRL_st *imumcTxqCtl;
358     OSA_SR_ALLOC();
359 
360     assert(NULL != imuHandle);
361     imumcTxqCtl = &imuHandle->imumcTxqCtl;
362 
363     OSA_ENTER_CRITICAL();
364 
365     do
366     {
367         if (imuHandle->imuLink == (uint8_t)kIMU_LinkCpu2Cpu3)
368         {
369             if (IS_IMUMC_TXBQ23_EMPTY(imumcTxqCtl))
370             {
371                 break;
372             }
373             else
374             {
375                 imumcTxBuf = (uint8_t *)(imumcTxqCtl->txBufQue[imumcTxqCtl->readIndex & IMUMC_TXQ23_ENTRY_MASK]);
376                 INCR_IMUMC_TXBQ23_RD_INDEX(imumcTxqCtl, 1U);
377             }
378         }
379         else
380         {
381             if (IS_IMUMC_TXBQ13_EMPTY(imumcTxqCtl))
382             {
383                 break;
384             }
385             else
386             {
387                 imumcTxBuf = (uint8_t *)(imumcTxqCtl->txBufQue[imumcTxqCtl->readIndex & IMUMC_TXQ13_ENTRY_MASK]);
388                 INCR_IMUMC_TXBQ13_RD_INDEX(imumcTxqCtl, 1U);
389             }
390         }
391     } while (false);
392 
393     OSA_EXIT_CRITICAL();
394 
395     return imumcTxBuf;
396 }
397 
HAL_ImumcPutTxBuf(hal_imu_handle_t * imuHandle,uint8_t * txBuf)398 static hal_imumc_status_t HAL_ImumcPutTxBuf(hal_imu_handle_t *imuHandle, uint8_t *txBuf)
399 {
400     hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;
401     IMUMC_TXQ_CTRL_st *imumcTxqCtl;
402     OSA_SR_ALLOC();
403 
404     assert(NULL != imuHandle);
405     imumcTxqCtl = &imuHandle->imumcTxqCtl;
406 
407     OSA_ENTER_CRITICAL();
408 
409     if (imuHandle->imuLink == (uint8_t)kIMU_LinkCpu2Cpu3)
410     {
411         if (IS_IMUMC_TXBQ23_FULL(imumcTxqCtl))
412         {
413             state = kStatus_HAL_ImumcError;
414         }
415         else
416         {
417             imumcTxqCtl->txBufQue[imumcTxqCtl->writeIndex & IMUMC_TXQ23_ENTRY_MASK] = (uint32_t)txBuf;
418             INCR_IMUMC_TXBQ23_WR_INDEX(imumcTxqCtl, 1U);
419         }
420     }
421     else
422     {
423         if (IS_IMUMC_TXBQ13_FULL(imumcTxqCtl))
424         {
425             state = kStatus_HAL_ImumcError;
426         }
427         else
428         {
429             imumcTxqCtl->txBufQue[imumcTxqCtl->writeIndex & IMUMC_TXQ13_ENTRY_MASK] = (uint32_t)txBuf;
430             INCR_IMUMC_TXBQ13_WR_INDEX(imumcTxqCtl, 1U);
431         }
432     }
433 
434     OSA_EXIT_CRITICAL();
435 
436     return state;
437 }
438 
HAL_ImuLinkIsUp(uint8_t imuLink)439 hal_imumc_status_t HAL_ImuLinkIsUp(uint8_t imuLink)
440 {
441     hal_imu_handle_t *imuHandle;
442 
443     assert((uint8_t)kIMU_LinkMax > imuLink);
444     imuHandle = &imuHandleCh[imuLink];
445 
446     if ((uint8_t)IMU_INITIALIZED == imuHandle->imuSyncState)
447     {
448         return kStatus_HAL_ImumcSuccess;
449     }
450     else
451     {
452         return kStatus_HAL_ImumcError;
453     }
454 }
455 
HAL_ImuResetWlanTxq(uint8_t imuLink)456 void HAL_ImuResetWlanTxq(uint8_t imuLink)
457 {
458     hal_imu_handle_t *imuHandle = NULL;
459 
460     imuHandle                        = &imuHandleCh[imuLink];
461     imuHandle->wlanTxqCtl.writeIndex = 0;
462     imuHandle->wlanTxqCtl.readIndex  = 0;
463 }
464 
HAL_ImuSendMsgBlockingCommon(hal_imu_handle_t * imuHandle,uint8_t type,uint8_t subtype,uint8_t * data,uint32_t length,bool lockTxFifo)465 static hal_imumc_status_t HAL_ImuSendMsgBlockingCommon(
466     hal_imu_handle_t *imuHandle, uint8_t type, uint8_t subtype, uint8_t *data, uint32_t length, bool lockTxFifo)
467 {
468     IMU_Msg_t *imuMsg;
469     IMU_Msg_t localImuMsg;
470     OSA_SR_ALLOC();
471     int32_t ret = 0;
472 
473     assert(NULL != imuHandle);
474     assert(IMU_PAYLOAD_SIZE >= length);
475 
476     (void)memset((void *)&localImuMsg, 0, sizeof(IMU_Msg_t));
477 
478     localImuMsg.Hdr.type     = type;
479     localImuMsg.Hdr.sub_type = subtype;
480     localImuMsg.Hdr.seq_num  = seq_num & (uint8_t)0xff;
481 
482     switch ((imu_msg_type_t)type)
483     {
484         case IMU_MSG_CONTROL:
485             if (((uint8_t)IMU_MSG_CONTROL_TX_BUF_ADDR == subtype) ||
486                 ((uint8_t)IMU_MSG_CONTROL_FREE_RX_BUF == subtype) ||
487                 ((uint8_t)IMU_MSG_CONTROL_CMD_BUF_ADDR == subtype) || ((uint8_t)IMU_MSG_CONTROL_EVT_ACK == subtype) ||
488                 ((uint8_t)IMU_MSG_CONTROL_COMMAND_RSP_ACK == subtype) ||
489                 ((uint8_t)IMU_MSG_CONTROL_IMUMC_EPT_QUIRY == subtype) ||
490                 ((uint8_t)IMU_MSG_CONTROL_IMUMC_EPT_QUIRY_RSP == subtype) ||
491                 ((uint8_t)IMU_MSG_CONTROL_IMUMC_BUF_FREE == subtype) ||
492                 ((uint8_t)IMU_MSG_CONTROL_EVT_DUMP == subtype) || ((uint8_t)IMU_MSG_CONTROL_ERROR == subtype))
493             {
494                 (void)memcpy((void *)&localImuMsg.PayloadPtr[0], data, length << 2U);
495                 localImuMsg.Hdr.length = (uint8_t)length;
496             }
497             break;
498         case IMU_MSG_COMMAND:
499             if (imuHandle->cmd_buffer_available)
500             {
501                 localImuMsg.Hdr.length    = 1;
502                 localImuMsg.PayloadPtr[0] = (uint32_t)imuHandle->cmd_buffer;
503             }
504             else
505             {
506                 return kStatus_HAL_ImumcError;
507             }
508             break;
509         case IMU_MSG_TX_DATA:
510             localImuMsg.Hdr.length    = 1;
511             localImuMsg.PayloadPtr[0] = (uint32_t)data;
512             break;
513         case IMU_MSG_MULTI_TX_DATA:
514             (void)memcpy((void *)&localImuMsg.PayloadPtr[0], imuHandle->imuMsgBuf, (imuHandle->imuMsgBufIdx) << 2U);
515             localImuMsg.Hdr.length  = imuHandle->imuMsgBufIdx;
516             imuHandle->imuMsgBufIdx = 0;
517             break;
518         case IMU_MSG_IMUMC:
519             (void)memcpy((void *)&localImuMsg.PayloadPtr[0], data, length << 2U);
520             localImuMsg.Hdr.length = length;
521             break;
522         default:
523             // Do nothing for the commands without expansion.
524             break;
525     }
526 
527     /* Added at 02/18/2022, in case second task overwriting imuMsg*/
528     while (IMU_TX_FIFO_ALMOST_FULL((imu_link_t)imuHandle->imuLink))
529     {
530     }
531 
532     OSA_ENTER_CRITICAL();
533     imuMsg = (IMU_Msg_t *)&((IMU_MSG_SND_Q(imuHandle->imuLink))[IMU_WR_PTR(imuHandle->imuLink)]);
534     (void)memcpy(imuMsg, &localImuMsg, sizeof(IMU_Hdr_t) + ((uint32_t)localImuMsg.Hdr.length << 2U));
535     ret = IMU_SendMsgPtrBlocking((imu_link_t)imuHandle->imuLink, (uint32_t)imuMsg, lockTxFifo);
536     OSA_EXIT_CRITICAL();
537 
538     if (0 == ret)
539     {
540         return kStatus_HAL_ImumcSuccess;
541     }
542     else
543     {
544         return kStatus_HAL_ImumcError;
545     }
546 }
547 
HAL_ImuSendMsgBlocking(hal_imu_handle_t * imuHandle,uint8_t type,uint8_t subtype,uint8_t * data,uint32_t length)548 static hal_imumc_status_t HAL_ImuSendMsgBlocking(
549     hal_imu_handle_t *imuHandle, uint8_t type, uint8_t subtype, uint8_t *data, uint32_t length)
550 {
551     return HAL_ImuSendMsgBlockingCommon(imuHandle, type, subtype, data, length, FALSE);
552 }
553 
HAL_ImuSendSync(hal_imu_handle_t * imuHandle)554 static hal_imumc_status_t HAL_ImuSendSync(hal_imu_handle_t *imuHandle)
555 {
556     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
557     OSA_SR_ALLOC();
558     assert(NULL != imuHandle);
559 
560     *IMU_MSG_CUR_MAGIC_P(imuHandle->imuLink) = IMU_SYNC_MAGIC_PATTERN;
561     while (IMU_SYNC_MAGIC_PATTERN != (*IMU_MSG_CUR_MAGIC_P((imu_link_t)imuHandle->imuLink)))
562     {
563     }
564 
565     OSA_ENTER_CRITICAL();
566     if (((uint8_t)IMU_UNINITIALIZED == imuHandle->imuSyncState) &&
567         (IMU_SYNC_MAGIC_PATTERN == (*IMU_MSG_PEER_MAGIC_P(imuHandle->imuLink))))
568     {
569         if (kStatus_HAL_ImumcSuccess ==
570             HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_SYNC, NULL, 0))
571         {
572             imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZING;
573             seq_num++;
574         }
575         else
576         {
577             imumcStatus = kStatus_HAL_ImumcError;
578         }
579     }
580     OSA_EXIT_CRITICAL();
581 
582     return imumcStatus;
583 }
584 
HAL_ImuSendImumcEptQuiry(hal_imu_handle_t * imuHandle,uint32_t addr)585 static hal_imumc_status_t HAL_ImuSendImumcEptQuiry(hal_imu_handle_t *imuHandle, uint32_t addr)
586 {
587     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
588     OSA_SR_ALLOC();
589     assert(NULL != imuHandle);
590 
591     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
592     {
593         return kStatus_HAL_ImumcError;
594     }
595 
596     OSA_ENTER_CRITICAL();
597     if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,
598                                                            (uint8_t)IMU_MSG_CONTROL_IMUMC_EPT_QUIRY, (uint8_t *)&addr,
599                                                            1))
600     {
601         seq_num++;
602     }
603     else
604     {
605         imumcStatus = kStatus_HAL_ImumcError;
606     }
607     OSA_EXIT_CRITICAL();
608 
609     return imumcStatus;
610 }
611 
HAL_ImuSendImumcEptQuiryRsp(hal_imu_handle_t * imuHandle,uint32_t addr,bool found)612 static hal_imumc_status_t HAL_ImuSendImumcEptQuiryRsp(hal_imu_handle_t *imuHandle, uint32_t addr, bool found)
613 {
614     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
615     uint32_t quiryRsp[2];
616     OSA_SR_ALLOC();
617 
618     assert(NULL != imuHandle);
619 
620     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
621     {
622         return kStatus_HAL_ImumcError;
623     }
624 
625     OSA_ENTER_CRITICAL();
626     quiryRsp[0] = addr;
627     if (TRUE == found)
628     {
629         quiryRsp[1] = 1;
630     }
631     else
632     {
633         quiryRsp[1] = 0;
634     }
635 
636     if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,
637                                                            (uint8_t)IMU_MSG_CONTROL_IMUMC_EPT_QUIRY_RSP,
638                                                            (uint8_t *)&quiryRsp[0], 2))
639     {
640         seq_num++;
641     }
642     else
643     {
644         imumcStatus = kStatus_HAL_ImumcError;
645     }
646     OSA_EXIT_CRITICAL();
647 
648     return imumcStatus;
649 }
650 
HAL_ImuSendImumcFreeBuf(hal_imu_handle_t * imuHandle,uint8_t * buf)651 static hal_imumc_status_t HAL_ImuSendImumcFreeBuf(hal_imu_handle_t *imuHandle, uint8_t *buf)
652 {
653     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
654     OSA_SR_ALLOC();
655     assert(NULL != imuHandle);
656 
657     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
658     {
659         return kStatus_HAL_ImumcError;
660     }
661 
662     OSA_ENTER_CRITICAL();
663     if (kStatus_HAL_ImumcSuccess ==
664         HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_IMUMC_BUF_FREE, buf, 1U))
665     {
666         seq_num++;
667     }
668     else
669     {
670         imumcStatus = kStatus_HAL_ImumcError;
671     }
672     OSA_EXIT_CRITICAL();
673 
674     return imumcStatus;
675 }
676 
HAL_ImuSendEventAck(hal_imu_handle_t * imuHandle,uint8_t * rxBuf,uint8_t length)677 static hal_imumc_status_t HAL_ImuSendEventAck(hal_imu_handle_t *imuHandle, uint8_t *rxBuf, uint8_t length)
678 {
679     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
680     OSA_SR_ALLOC();
681     assert(NULL != imuHandle);
682 
683     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
684     {
685         return kStatus_HAL_ImumcError;
686     }
687 
688     OSA_ENTER_CRITICAL();
689     if (kStatus_HAL_ImumcSuccess ==
690         HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_EVT_ACK, rxBuf, length))
691     {
692         seq_num++;
693     }
694     else
695     {
696         imumcStatus = kStatus_HAL_ImumcError;
697     }
698     OSA_EXIT_CRITICAL();
699 
700     return imumcStatus;
701 }
702 
HAL_ImuSendEventDumpAck(imu_link_t link,uint8_t * rxBuf,uint8_t length)703 hal_imumc_status_t HAL_ImuSendEventDumpAck(imu_link_t link, uint8_t *rxBuf, uint8_t length)
704 {
705     hal_imu_handle_t *imuHandle;
706     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
707     OSA_SR_ALLOC();
708 
709     assert(kIMU_LinkMax > link);
710     imuHandle = &imuHandleCh[link];
711 
712     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
713     {
714         return kStatus_HAL_ImumcError;
715     }
716 
717     OSA_ENTER_CRITICAL();
718     if (kStatus_HAL_ImumcSuccess ==
719         HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_EVT_DUMP, rxBuf, length))
720     {
721         seq_num++;
722     }
723     else
724     {
725         imumcStatus = kStatus_HAL_ImumcError;
726     }
727 
728     OSA_EXIT_CRITICAL();
729 
730     return imumcStatus;
731 }
732 
HAL_ImuSendCommandRspAck(hal_imu_handle_t * imuHandle,uint8_t * rxBuf,uint8_t length)733 static hal_imumc_status_t HAL_ImuSendCommandRspAck(hal_imu_handle_t *imuHandle, uint8_t *rxBuf, uint8_t length)
734 {
735     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
736     OSA_SR_ALLOC();
737     assert(NULL != imuHandle);
738 
739     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
740     {
741         return kStatus_HAL_ImumcError;
742     }
743 
744     OSA_ENTER_CRITICAL();
745     if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,
746                                                            (uint8_t)IMU_MSG_CONTROL_COMMAND_RSP_ACK, rxBuf, length))
747     {
748         seq_num++;
749     }
750     else
751     {
752         imumcStatus = kStatus_HAL_ImumcError;
753     }
754     OSA_EXIT_CRITICAL();
755 
756     return imumcStatus;
757 }
758 
HAL_ImuFreeRxBuf(hal_imu_handle_t * imuHandle,uint8_t * rxBuf,uint8_t length)759 static hal_imumc_status_t HAL_ImuFreeRxBuf(hal_imu_handle_t *imuHandle, uint8_t *rxBuf, uint8_t length)
760 {
761     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
762     OSA_SR_ALLOC();
763     assert(NULL != imuHandle);
764 
765     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
766     {
767         return kStatus_HAL_ImumcError;
768     }
769 
770     OSA_ENTER_CRITICAL();
771     if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,
772                                                            (uint8_t)IMU_MSG_CONTROL_FREE_RX_BUF, rxBuf, length))
773     {
774         seq_num++;
775     }
776     else
777     {
778         imumcStatus = kStatus_HAL_ImumcError;
779     }
780     OSA_EXIT_CRITICAL();
781 
782     return imumcStatus;
783 }
784 
HAL_ImuSendCommand(uint8_t imuLink,uint8_t * cmdBuf,uint32_t length)785 hal_imumc_status_t HAL_ImuSendCommand(uint8_t imuLink, uint8_t *cmdBuf, uint32_t length)
786 {
787     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
788     hal_imu_handle_t *imuHandle;
789     OSA_SR_ALLOC();
790 
791     assert((uint8_t)kIMU_LinkMax > imuLink);
792     imuHandle = &imuHandleCh[imuLink];
793 
794     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink) || FALSE == imuHandle->cmd_buffer_available)
795     {
796         return kStatus_HAL_ImumcError;
797     }
798 
799     if (length != 0U)
800     {
801         // To be DMAed
802         (void)HAL_IMU_MEMCPY((void *)imuHandle->cmd_buffer, cmdBuf, length);
803     }
804     else
805     {
806         return kStatus_HAL_ImumcError;
807     }
808 
809     OSA_ENTER_CRITICAL();
810     if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_COMMAND, 0U, NULL, 0))
811     {
812         seq_num++;
813         imuHandle->cmd_buffer_available = FALSE;
814     }
815     else
816     {
817         imumcStatus = kStatus_HAL_ImumcError;
818     }
819     OSA_EXIT_CRITICAL();
820 
821     return imumcStatus;
822 }
823 
HAL_ImuSendTxData(uint8_t imuLink,uint8_t * txBuf,uint32_t length)824 hal_imumc_status_t HAL_ImuSendTxData(uint8_t imuLink, uint8_t *txBuf, uint32_t length)
825 {
826     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
827     hal_imu_handle_t *imuHandle;
828     uint8_t *wlan_tx_buf;
829     OSA_SR_ALLOC();
830 
831     assert((uint8_t)kIMU_LinkMax > imuLink);
832     imuHandle = &imuHandleCh[imuLink];
833 
834     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
835     {
836         return kStatus_HAL_ImumcError;
837     }
838 
839     wlan_tx_buf = HAL_ImuGetWlanTxBuf(imuHandle);
840     if ((wlan_tx_buf != NULL) && (length != 0U))
841     {
842         // To be DMAed
843         (void)HAL_IMU_MEMCPY(wlan_tx_buf, txBuf, length);
844     }
845     else
846     {
847         return kStatus_HAL_ImumcError;
848     }
849 
850     OSA_ENTER_CRITICAL();
851     if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_TX_DATA, 0U, wlan_tx_buf, 1U))
852     {
853         seq_num++;
854     }
855     else
856     {
857         (void)HAL_ImuPutWlanTxBuf(imuHandle, wlan_tx_buf);
858         imumcStatus = kStatus_HAL_ImumcError;
859     }
860     OSA_EXIT_CRITICAL();
861 
862     return imumcStatus;
863 }
864 
HAL_ImuAddWlanTxPacket(uint8_t imuLink,uint8_t * txBuf,uint32_t length)865 hal_imumc_status_t HAL_ImuAddWlanTxPacket(uint8_t imuLink, uint8_t *txBuf, uint32_t length)
866 {
867     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
868     hal_imu_handle_t *imuHandle;
869     uint8_t *wlan_tx_buf;
870 
871     assert((uint8_t)kIMU_LinkMax > imuLink);
872     assert(NULL != txBuf);
873     assert(0U != length);
874     imuHandle = &imuHandleCh[imuLink];
875 
876     if (imuHandle->imuMsgBufIdx > IMU_PAYLOAD_SIZE - 1U)
877     {
878         return kStatus_HAL_ImumcError;
879     }
880 
881     wlan_tx_buf = HAL_ImuGetWlanTxBuf(imuHandle);
882 
883     if (NULL == wlan_tx_buf)
884     {
885         return kStatus_HAL_ImumcError;
886     }
887 
888     // To be DMAed
889     (void)HAL_IMU_MEMCPY(wlan_tx_buf, txBuf, length);
890 
891     imuHandle->imuMsgBuf[imuHandle->imuMsgBufIdx] = (uint32_t)wlan_tx_buf;
892     imuHandle->imuMsgBufIdx++;
893 
894     return imumcStatus;
895 }
896 
HAL_ImuAddWlanTxPacketExt(uint8_t imuLink,uint8_t * txBuf,uint32_t length,void (* cb)(void * destAddr,void * srcAddr,uint32_t len))897 hal_imumc_status_t HAL_ImuAddWlanTxPacketExt(uint8_t imuLink,
898                                              uint8_t *txBuf,
899                                              uint32_t length,
900                                              void (*cb)(void *destAddr, void *srcAddr, uint32_t len))
901 {
902     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
903     hal_imu_handle_t *imuHandle;
904     uint8_t *wlan_tx_buf;
905 
906     assert((uint8_t)kIMU_LinkMax > imuLink);
907     assert(NULL != txBuf);
908     assert(0U != length);
909     imuHandle = &imuHandleCh[imuLink];
910 
911     if (imuHandle->imuMsgBufIdx > IMU_PAYLOAD_SIZE - 1U)
912     {
913         return kStatus_HAL_ImumcError;
914     }
915 
916     wlan_tx_buf = HAL_ImuGetWlanTxBuf(imuHandle);
917 
918     if (NULL == wlan_tx_buf)
919     {
920         return kStatus_HAL_ImumcError;
921     }
922 
923     // To be DMAed
924     cb(wlan_tx_buf, txBuf, length);
925 
926     imuHandle->imuMsgBuf[imuHandle->imuMsgBufIdx] = (uint32_t)wlan_tx_buf;
927     imuHandle->imuMsgBufIdx++;
928 
929     return imumcStatus;
930 }
931 
HAL_ImuSendMultiTxData(uint8_t imuLink)932 hal_imumc_status_t HAL_ImuSendMultiTxData(uint8_t imuLink)
933 {
934     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
935     hal_imu_handle_t *imuHandle;
936     OSA_SR_ALLOC();
937 
938     assert((uint8_t)kIMU_LinkMax > imuLink);
939     imuHandle = &imuHandleCh[imuLink];
940 
941     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
942     {
943         return kStatus_HAL_ImumcError;
944     }
945 
946     OSA_ENTER_CRITICAL();
947     if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_MULTI_TX_DATA, 0U, NULL, 0U))
948     {
949         seq_num++;
950         imuHandle->imuMsgBufIdx = 0;
951     }
952     else
953     {
954         imumcStatus = kStatus_HAL_ImumcError;
955     }
956     OSA_EXIT_CRITICAL();
957 
958     return imumcStatus;
959 }
960 
HAL_ImuSendSyncAck(hal_imu_handle_t * imuHandle)961 static hal_imumc_status_t HAL_ImuSendSyncAck(hal_imu_handle_t *imuHandle)
962 {
963     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
964     OSA_SR_ALLOC();
965     assert(NULL != imuHandle);
966 
967     OSA_ENTER_CRITICAL();
968     if (kStatus_HAL_ImumcSuccess ==
969         HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_SYNC_ACK, NULL, 0U))
970     {
971         seq_num++;
972     }
973     else
974     {
975         imumcStatus = kStatus_HAL_ImumcError;
976     }
977     OSA_EXIT_CRITICAL();
978 
979     return imumcStatus;
980 }
981 
HAL_ImuSendUnlock(hal_imu_handle_t * imuHandle)982 static hal_imumc_status_t HAL_ImuSendUnlock(hal_imu_handle_t *imuHandle)
983 {
984     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
985     OSA_SR_ALLOC();
986     assert(NULL != imuHandle);
987 
988     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
989     {
990         return kStatus_HAL_ImumcError;
991     }
992 
993     OSA_ENTER_CRITICAL();
994     if (kStatus_HAL_ImumcSuccess ==
995         HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_ACK_FOR_UNLOCK, NULL, 0U))
996     {
997         seq_num++;
998     }
999     else
1000     {
1001         imumcStatus = kStatus_HAL_ImumcError;
1002     }
1003     OSA_EXIT_CRITICAL();
1004 
1005     return imumcStatus;
1006 }
1007 
HAL_ImuReturnAllTxBuf(imu_link_t link)1008 hal_imumc_status_t HAL_ImuReturnAllTxBuf(imu_link_t link)
1009 {
1010     hal_imu_handle_t *imuHandle;
1011     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
1012     uint8_t txBufCnt;
1013     uint8_t *wlan_tx_buf;
1014     OSA_SR_ALLOC();
1015 
1016     assert(kIMU_LinkMax > link);
1017     imuHandle = &imuHandleCh[link];
1018 
1019     txBufCnt = 0;
1020     while (TRUE)
1021     {
1022         wlan_tx_buf = HAL_ImuGetWlanTxBuf(imuHandle);
1023         if (NULL == wlan_tx_buf) /*! all Tx buffers are consumed */
1024         {
1025             break;
1026         }
1027 
1028         imuHandle->imuMsgBuf[txBufCnt] = (uint32_t)wlan_tx_buf;
1029         txBufCnt++;
1030 
1031         if (IMU_PAYLOAD_SIZE == txBufCnt)
1032         {
1033             OSA_ENTER_CRITICAL();
1034             if (kStatus_HAL_ImumcSuccess !=
1035                 HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_TX_BUF_ADDR,
1036                                        (uint8_t *)&imuHandle->imuMsgBuf[0], (uint32_t)IMU_PAYLOAD_SIZE))
1037             {
1038                 OSA_EXIT_CRITICAL();
1039                 return kStatus_HAL_ImumcError;
1040             }
1041             else
1042             {
1043                 seq_num++;
1044             }
1045             txBufCnt = 0;
1046             OSA_EXIT_CRITICAL();
1047         }
1048     }
1049 
1050     if (txBufCnt != 0U)
1051     {
1052         OSA_ENTER_CRITICAL();
1053         if (kStatus_HAL_ImumcSuccess != HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,
1054                                                                (uint8_t)IMU_MSG_CONTROL_TX_BUF_ADDR,
1055                                                                (uint8_t *)&imuHandle->imuMsgBuf[0], txBufCnt))
1056         {
1057             OSA_EXIT_CRITICAL();
1058             return kStatus_HAL_ImumcError;
1059         }
1060         else
1061         {
1062             seq_num++;
1063         }
1064         OSA_EXIT_CRITICAL();
1065     }
1066 
1067     return imumcStatus;
1068 }
1069 
HAL_ImuSendShutdown(hal_imu_handle_t * imuHandle)1070 static hal_imumc_status_t HAL_ImuSendShutdown(hal_imu_handle_t *imuHandle)
1071 {
1072     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
1073     OSA_SR_ALLOC();
1074     assert(NULL != imuHandle);
1075 
1076     if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
1077     {
1078         return kStatus_HAL_ImumcError;
1079     }
1080 
1081     OSA_ENTER_CRITICAL();
1082     if (kStatus_HAL_ImumcSuccess ==
1083         HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_SHUTDOWN, NULL, 0U))
1084     {
1085         seq_num++;
1086     }
1087     else
1088     {
1089         imumcStatus = kStatus_HAL_ImumcError;
1090     }
1091     OSA_EXIT_CRITICAL();
1092 
1093     return imumcStatus;
1094 }
1095 
HAL_ImuCtrlHandler(hal_imu_handle_t * imuHandle,IMU_Msg_t * data,uint32_t len)1096 static hal_imumc_status_t HAL_ImuCtrlHandler(hal_imu_handle_t *imuHandle, IMU_Msg_t *data, uint32_t len)
1097 {
1098     imu_ctrl_msg_subtype_t imuControlType;
1099     IMU_Msg_t *pImuMsg             = data;
1100     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
1101     hal_imumc_state_t *imumcHandle;
1102     OSA_SR_ALLOC();
1103     LIST_ELEM_st *cur;
1104     uint8_t eptQuiryRspAck;
1105 
1106     assert(NULL != imuHandle);
1107     imuControlType = (imu_ctrl_msg_subtype_t)pImuMsg->Hdr.sub_type;
1108     OSA_ENTER_CRITICAL();
1109 
1110     switch (imuControlType)
1111     {
1112         case IMU_MSG_CONTROL_ACK_FOR_UNLOCK:
1113             IMU_UNLOCK_TX_FIFO(imuHandle->imuLink);
1114             break;
1115         case IMU_MSG_CONTROL_SYNC:
1116             (void)HAL_ImuSendSyncAck(imuHandle);
1117             if ((uint8_t)kIMU_LinkCpu2Cpu3 == imuHandle->imuLink)
1118             {
1119                 imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZED;
1120             }
1121             (void)HAL_ImuSendSyncAck(imuHandle);
1122             imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZED;
1123             break;
1124         case IMU_MSG_CONTROL_SYNC_ACK:
1125             imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZED;
1126             break;
1127         case IMU_MSG_CONTROL_CMD_BUF_ADDR:
1128             imuHandle->cmd_buffer           = (uint32_t *)pImuMsg->PayloadPtr[0];
1129             imuHandle->cmd_buffer_available = TRUE;
1130             if ((uint8_t)IMU_INITIALIZED != imuHandle->imuSyncState)
1131             {
1132                 imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZED;
1133             }
1134             break;
1135         case IMU_MSG_CONTROL_TX_BUF_ADDR:
1136             for (uint8_t i = 0; i < pImuMsg->Hdr.length; i++)
1137             {
1138                 (void)HAL_ImuPutWlanTxBuf(imuHandle, (uint8_t *)pImuMsg->PayloadPtr[i]);
1139             }
1140             break;
1141         case IMU_MSG_CONTROL_ERROR:
1142             break;
1143         case IMU_MSG_CONTROL_SHUTDOWN:
1144             imuHandle->imuSyncState = (uint8_t)IMU_UNINITIALIZED;
1145             IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);
1146             IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_SP_AV_INT_CLR_MASK);
1147             (void)os_InterruptMaskClear(IMULINKID_TO_IRQID((imu_link_t)imuHandle->imuLink));
1148             IMU_Deinit((imu_link_t)imuHandle->imuLink);
1149             *IMU_MSG_CUR_MAGIC_P(imuHandle->imuLink) = 0;
1150             imuHandle->wlanTxqCtl.writeIndex         = 0;
1151             imuHandle->wlanTxqCtl.readIndex          = 0;
1152             break;
1153         case IMU_MSG_CONTROL_IMUMC_EPT_QUIRY:
1154         {
1155             hal_imumc_state_t *imumcHandle = HAL_ImumcGetEndpointFromAddr(imuHandle, pImuMsg->PayloadPtr[0]);
1156             if (imumcHandle != NULL)
1157             {
1158                 /* The remote CPU is sending an endpoint query so it implies the imumc link is ready */
1159                 imumcHandle->eptLinkIsReady = TRUE;
1160                 /* Confirm the local endpoint is ready too */
1161                 imumcStatus = HAL_ImuSendImumcEptQuiryRsp(imuHandle, pImuMsg->PayloadPtr[0], TRUE);
1162                 /* Make sure to unblock the task calling HAL_ImumcInit */
1163 #ifdef __ZEPHYR__
1164                 k_event_set(&imumcQFlagsRef, IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink);
1165 #else
1166                 (void)OSA_EventSet((osa_event_handle_t)imumcQFlagsRef,
1167                                    IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink);
1168 #endif
1169             }
1170             else
1171             {
1172                 /* Local endpoint doesn't exist yet, the remote CPU needs to wait until the local CPU initializes
1173                  * the targeted endpoint, a new query will be sent then to update the link status on both sides */
1174                 imumcStatus = HAL_ImuSendImumcEptQuiryRsp(imuHandle, pImuMsg->PayloadPtr[0], FALSE);
1175             }
1176         }
1177         break;
1178         case IMU_MSG_CONTROL_IMUMC_EPT_QUIRY_RSP:
1179             eptQuiryRspAck = 0;
1180             list_for_each(cur, &imuHandle->eptList)
1181             {
1182                 imumcHandle = (hal_imumc_state_t *)cur;
1183                 if (imumcHandle->remote_addr == pImuMsg->PayloadPtr[0])
1184                 {
1185                     if (pImuMsg->PayloadPtr[1] != 0U)
1186                     {
1187                         eptQuiryRspAck              = 1;
1188                         imumcHandle->eptLinkIsReady = TRUE;
1189                     }
1190                     else
1191                     {
1192                         imumcHandle->eptLinkIsReady = FALSE;
1193                     }
1194                 }
1195             }
1196 
1197             if (eptQuiryRspAck != 0U)
1198             {
1199                 /* Make sure to unblock the task calling HAL_ImumcInit */
1200 #ifdef __ZEPHYR__
1201                 k_event_set(&imumcQFlagsRef, IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink);
1202 #else
1203                 (void)OSA_EventSet((osa_event_handle_t)imumcQFlagsRef,
1204                                    IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink);
1205 #endif
1206             }
1207             break;
1208         case IMU_MSG_CONTROL_IMUMC_BUF_FREE:
1209             (void)HAL_ImumcPutTxBuf(imuHandle, (uint8_t *)pImuMsg->PayloadPtr[0]);
1210             break;
1211         default:
1212             // Do nothing for the commands without header expansion.
1213             break;
1214     }
1215 
1216     OSA_EXIT_CRITICAL();
1217     return imumcStatus;
1218 }
1219 
HAL_ImuReceive(uint8_t imuLink)1220 hal_imumc_status_t HAL_ImuReceive(uint8_t imuLink)
1221 {
1222     IMU_Msg_t *pMsg = NULL, localImuMsg;
1223     IMU_Msg_t localImuMsgRx;
1224 
1225     hal_imu_handle_t *imuHandle = NULL;
1226     imu_msg_type_t msg_type     = IMU_MSG_MAX;
1227     bool isUnlockMsgReqd        = FALSE;
1228     hal_imumc_state_t *ept;
1229     struct imumc_std_msg *imumc_msg;
1230     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
1231 
1232     assert((uint8_t)kIMU_LinkMax > imuLink);
1233     imuHandle = &imuHandleCh[imuLink];
1234 
1235     while (TRUE)
1236     {
1237         if (IMU_RX_FIFO_EMPTY((imu_link_t)imuHandle->imuLink))
1238         {
1239             IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);
1240             os_ClearPendingISR(IMULINKID_TO_IRQID((imu_link_t)imuHandle->imuLink));
1241 #ifndef CPU2
1242             *IMU_SLEEP_FLAG_ADDR(imuHandle->imuLink) |= (uint32_t)(1 << 0U);
1243 #endif
1244             break;
1245         }
1246         else
1247         {
1248 #ifndef CPU2
1249             *IMU_SLEEP_FLAG_ADDR(imuHandle->imuLink) &= (uint32_t)(~(1 << 0U));
1250 #endif
1251 
1252             /* Message buffer pMsg should be consumed (or copied for later
1253              * processing) in handler before call for next READ_ICC_MESSAGE
1254              * comes here again.
1255              * Otherwise other CPU may use same pMsg for next write,
1256              * when FIFO is almost full
1257              */
1258             pMsg = (IMU_Msg_t *)IMU_RD_MSG(imuHandle->imuLink);
1259             if ((pMsg != NULL) && (IMU_RX_FIFO_LOCKED(imuHandle->imuLink)))
1260             {
1261                 isUnlockMsgReqd = TRUE;
1262             }
1263         }
1264 
1265         /* release CPU access here because message processing may take time */
1266         if (pMsg != NULL)
1267         {
1268             (void)memcpy((uint8_t *)&localImuMsg, (uint8_t *)pMsg, sizeof(IMU_Msg_t));
1269             pMsg     = &localImuMsg;
1270             msg_type = (imu_msg_type_t)pMsg->Hdr.type;
1271 
1272             switch (msg_type)
1273             {
1274                 case IMU_MSG_CONTROL:
1275                     imumcStatus = HAL_ImuCtrlHandler(imuHandle, pMsg, pMsg->Hdr.length);
1276                     if (imuHandle->imuHandler[IMU_MSG_CONTROL] != NULL)
1277                     {
1278                         imumcStatus = imuHandle->imuHandler[IMU_MSG_CONTROL]((IMU_Msg_t *)pMsg, pMsg->Hdr.length);
1279                     }
1280                     break;
1281                 case IMU_MSG_COMMAND_RESPONSE:
1282                     if (imuHandle->imuHandler[IMU_MSG_COMMAND_RESPONSE] != NULL)
1283                     {
1284                         imumcStatus =
1285                             imuHandle->imuHandler[IMU_MSG_COMMAND_RESPONSE]((IMU_Msg_t *)pMsg, pMsg->Hdr.length);
1286                     }
1287                     assert(kStatus_HAL_ImumcSuccess == imumcStatus);
1288                     imumcStatus = HAL_ImuSendCommandRspAck(imuHandle, (uint8_t *)&pMsg->PayloadPtr[0], 1);
1289                     imuHandle->cmd_buffer_available = TRUE;
1290                     break;
1291 
1292                 case IMU_MSG_EVENT:
1293                     if (imuHandle->imuHandler[IMU_MSG_EVENT] != NULL)
1294                     {
1295                         imumcStatus = imuHandle->imuHandler[IMU_MSG_EVENT]((IMU_Msg_t *)pMsg, pMsg->Hdr.length);
1296                     }
1297                     assert(kStatus_HAL_ImumcSuccess == imumcStatus);
1298                     imumcStatus = HAL_ImuSendEventAck(imuHandle, (uint8_t *)&pMsg->PayloadPtr[0], 1);
1299                     break;
1300 
1301                 case IMU_MSG_RX_DATA:
1302                 case IMU_MSG_MULTI_RX_DATA:
1303                     (void)memcpy((uint8_t *)&localImuMsgRx, (uint8_t *)pMsg, sizeof(IMU_Msg_t));
1304                     if (imuHandle->imuHandler[IMU_MSG_RX_DATA] != NULL)
1305                     {
1306                         imumcStatus = imuHandle->imuHandler[IMU_MSG_RX_DATA]((IMU_Msg_t *)pMsg, pMsg->Hdr.length);
1307                     }
1308                     pMsg        = &localImuMsgRx;
1309                     imumcStatus = HAL_ImuFreeRxBuf(imuHandle, (uint8_t *)&pMsg->PayloadPtr[0], pMsg->Hdr.length);
1310                     break;
1311                 case IMU_MSG_IMUMC:
1312                     imumc_msg = (struct imumc_std_msg *)&pMsg->PayloadPtr[0];
1313                     ept       = (hal_imumc_state_t *)HAL_ImumcGetEndpointFromAddr(imuHandle, imumc_msg->hdr.dst);
1314                     if (NULL != ept)
1315                     {
1316                         if (ept->rx.callback != NULL)
1317                         {
1318                             imumcStatus = (hal_imumc_status_t)ept->rx.callback(
1319                                 ept->rx.param, (uint8_t *)imumc_msg->data, imumc_msg->hdr.len);
1320                         }
1321                     }
1322                     if ((hal_imumc_return_status_t)imumcStatus == kStatus_HAL_RL_RELEASE)
1323                     {
1324                         imumcStatus = HAL_ImuSendImumcFreeBuf(imuHandle, (uint8_t *)&imumc_msg->data);
1325                     }
1326                     break;
1327 
1328                 default:
1329                     // Do nothing for the commands without expansion.
1330                     break;
1331             }
1332 
1333             assert(kStatus_HAL_ImumcSuccess == imumcStatus);
1334         }
1335     }
1336 
1337     if (isUnlockMsgReqd)
1338     {
1339         (void)HAL_ImuSendUnlock(imuHandle);
1340     }
1341 
1342     (void)os_InterruptMaskSet(IMULINKID_TO_IRQID((imu_link_t)imuHandle->imuLink));
1343     return (hal_imumc_status_t)imumcStatus;
1344 }
1345 
1346 #if defined(CPU2)
HAL_ImuMain(void * argv)1347 static void HAL_ImuMain(void *argv)
1348 {
1349     uint32_t Events = 0;
1350     uint32_t imuLinkId;
1351 
1352     while (TRUE)
1353     {
1354 #if (defined(USE_RTOS) && (USE_RTOS > 0U))
1355         (void)HAL_ImuPutTaskLock();
1356 #endif
1357         (void)OSA_EventWait((osa_event_handle_t)ImuQFlagsRef, IMU_EVENT_TRIGGERS, 0, osaWaitForever_c, &Events);
1358         if (Events == 0U)
1359         {
1360             if (gUseRtos_c == 0U)
1361             {
1362                 break;
1363             }
1364             else
1365             {
1366                 continue;
1367             }
1368         }
1369 #if (defined(USE_RTOS) && (USE_RTOS > 0U))
1370         (void)HAL_ImuGetTaskLock();
1371 #endif
1372         /*! Check for all IMU links event/ISR has occured
1373          *  Only MSG ready events considered
1374          */
1375         for (imuLinkId = 0; imuLinkId < (uint32_t)kIMU_LinkMax; imuLinkId++)
1376         {
1377             if ((Events & (1U << imuLinkId)) != 0U)
1378             {
1379                 (void)HAL_ImuReceive((uint8_t)imuLinkId);
1380             }
1381         }
1382         if (gUseRtos_c == 0U)
1383         {
1384             break;
1385         }
1386     }
1387 }
1388 #else
1389 
HAL_ImuMainCpu13(void * argv,void * argv2,void * argv3)1390 static void HAL_ImuMainCpu13(void *argv
1391 #ifdef __ZEPHYR__
1392                              ,
1393                              void *argv2,
1394                              void *argv3
1395 #endif
1396 )
1397 {
1398     uint32_t Events = 0;
1399 
1400     while (TRUE)
1401     {
1402 #if (defined(USE_RTOS) && (USE_RTOS > 0U))
1403         (void)HAL_ImuPutTaskLock();
1404 #endif
1405 
1406 #ifdef __ZEPHYR__
1407         Events = k_event_wait(&ImuQ13FlagsRef, IMU_EVENT_TRIGGERS, 0, K_FOREVER);
1408         k_event_clear(&ImuQ13FlagsRef, (1U << kIMU_LinkCpu1Cpu3));
1409 #else
1410         (void)OSA_EventWait((osa_event_handle_t)ImuQ13FlagsRef, IMU_EVENT_TRIGGERS, 0, osaWaitForever_c, &Events);
1411 #endif
1412 
1413         if (Events == 0U)
1414         {
1415             if (gUseRtos_c == 0U)
1416             {
1417                 break;
1418             }
1419             else
1420             {
1421                 continue;
1422             }
1423         }
1424 #if (defined(USE_RTOS) && (USE_RTOS > 0U))
1425         (void)HAL_ImuGetTaskLock();
1426 #endif
1427         /*! Check for CPU1 to CPU3 IMU links event/ISR has occured
1428          *  Only MSG ready events considered
1429          */
1430         (void)HAL_ImuReceive(kIMU_LinkCpu1Cpu3);
1431 
1432         if (gUseRtos_c == 0U)
1433         {
1434             break;
1435         }
1436     }
1437 }
1438 
HAL_ImuMainCpu23(void * argv,void * argv2,void * argv3)1439 static void HAL_ImuMainCpu23(void *argv
1440 #ifdef __ZEPHYR__
1441                              ,
1442                              void *argv2,
1443                              void *argv3
1444 #endif
1445 )
1446 {
1447     uint32_t Events = 0;
1448 
1449     while (TRUE)
1450     {
1451 #if 0
1452         HAL_ImuPutTaskLock();
1453 #endif
1454 
1455 #ifdef __ZEPHYR__
1456         Events = k_event_wait(&ImuQ23FlagsRef, IMU_EVENT_TRIGGERS, 0, K_FOREVER);
1457         k_event_clear(&ImuQ23FlagsRef, (1U << kIMU_LinkCpu2Cpu3));
1458 #else
1459         (void)OSA_EventWait((osa_event_handle_t)ImuQ23FlagsRef, IMU_EVENT_TRIGGERS, 0, osaWaitForever_c, &Events);
1460 #endif
1461 
1462         if (Events == 0U)
1463         {
1464             if (gUseRtos_c == 0U)
1465             {
1466                 break;
1467             }
1468             else
1469             {
1470                 continue;
1471             }
1472         }
1473 #if 0
1474         HAL_ImuGetTaskLock();
1475 #endif
1476         /*! Check for CPU2 to CPU3 IMU links event/ISR has occured
1477          *  Only MSG ready events considered
1478          */
1479 
1480         (void)HAL_ImuReceive(kIMU_LinkCpu2Cpu3);
1481 
1482         if (gUseRtos_c == 0U)
1483         {
1484             break;
1485         }
1486     }
1487 }
1488 #endif
1489 
HAL_ImuTaskInit(uint8_t link)1490 static void HAL_ImuTaskInit(uint8_t link)
1491 {
1492 #if defined(CPU2)
1493     (void)link;
1494 
1495     if (((imu_init_flag & ((1U << (uint8_t)kIMU_LinkMax) - 1U)) == 0U) && imu_task_flag == 0U)
1496     {
1497         (void)OSA_TaskCreate((osa_task_handle_t)ImuTaskHandle, OSA_TASK(HAL_ImuMain), NULL);
1498         (void)OSA_EventCreate((osa_event_handle_t)ImuQFlagsRef, 1U);
1499         imu_task_flag = 1;
1500     }
1501 #else
1502     if (link == kIMU_LinkCpu1Cpu3 && (imu_task_flag & (1U << link)) == 0)
1503     {
1504 #ifdef __ZEPHYR__
1505         ImuTaskCpu13 = k_thread_create(&ImuTaskHandleCpu13, ImuTaskStackCpu13, K_THREAD_STACK_SIZEOF(ImuTaskStackCpu13),
1506                                        HAL_ImuMainCpu13, NULL, NULL, NULL, IMU_TASK_PRIORITY, 0, K_NO_WAIT);
1507         k_thread_name_set(ImuTaskCpu13, "HAL_ImuMainCpu13");
1508 #else
1509         (void)OSA_TaskCreate((osa_task_handle_t)ImuTaskHandleCpu13, OSA_TASK(HAL_ImuMainCpu13), NULL);
1510         (void)OSA_EventCreate((osa_event_handle_t)ImuQ13FlagsRef, 1U);
1511 #endif
1512         imu_task_flag |= (1U << link);
1513     }
1514     else if (link == kIMU_LinkCpu2Cpu3 && (imu_task_flag & (1U << link)) == 0)
1515     {
1516 #ifdef __ZEPHYR__
1517         ImuTaskCpu23 = k_thread_create(&ImuTaskHandleCpu23, ImuTaskStackCpu23, K_THREAD_STACK_SIZEOF(ImuTaskStackCpu23),
1518                                        HAL_ImuMainCpu23, NULL, NULL, NULL, IMU_TASK_PRIORITY, 0, K_NO_WAIT);
1519         k_thread_name_set(ImuTaskCpu23, "HAL_ImuMainCpu23");
1520 #else
1521         (void)OSA_TaskCreate((osa_task_handle_t)ImuTaskHandleCpu23, OSA_TASK(HAL_ImuMainCpu23), NULL);
1522         (void)OSA_EventCreate((osa_event_handle_t)ImuQ23FlagsRef, 1U);
1523 #endif
1524         imu_task_flag |= (1U << link);
1525     }
1526     else
1527     {
1528         ; /* No necessary actions. */
1529     }
1530 #endif
1531 }
1532 
HAL_ImuTaskDeinit(uint8_t link)1533 static void HAL_ImuTaskDeinit(uint8_t link)
1534 {
1535 #if defined(CPU2)
1536     (void)link;
1537 
1538     if (imu_init_flag == 0U && imu_task_flag != 0U)
1539     {
1540         (void)OSA_EventDestroy((osa_event_handle_t)ImuQFlagsRef);
1541         (void)OSA_TaskDestroy(ImuTaskHandle);
1542         imu_task_flag = 0;
1543     }
1544 #else
1545     if (link == kIMU_LinkCpu1Cpu3 && (imu_task_flag & (1U << link)) != 0)
1546     {
1547 #ifndef __ZEPHYR__
1548         (void)OSA_EventDestroy((osa_event_handle_t)ImuQ13FlagsRef);
1549         (void)OSA_TaskDestroy(ImuTaskHandleCpu13);
1550         imu_task_flag &= ~(1U << link);
1551 #endif
1552     }
1553     else if (link == kIMU_LinkCpu2Cpu3 && (imu_task_flag & (1U << link)) != 0)
1554     {
1555 #ifndef __ZEPHYR__
1556         (void)OSA_EventDestroy((osa_event_handle_t)ImuQ23FlagsRef);
1557         (void)OSA_TaskDestroy(ImuTaskHandleCpu23);
1558         imu_task_flag &= ~(1U << link);
1559 #endif
1560     }
1561     else
1562     {
1563         ; /* No necessary actions. */
1564     }
1565 #endif
1566 }
1567 
HAL_ImuInit(imu_link_t link)1568 hal_imumc_status_t HAL_ImuInit(imu_link_t link)
1569 {
1570     hal_imu_handle_t *imuHandle;
1571     hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;
1572     uint8_t i;
1573     OSA_SR_ALLOC();
1574 
1575     assert(kIMU_LinkMax > link);
1576     imuHandle          = &imuHandleCh[link];
1577     imuHandle->imuLink = (uint8_t)link;
1578     OSA_ENTER_CRITICAL();
1579 
1580 #if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)
1581     if (0U == imu_init_flag)
1582     {
1583         HAL_InitGdma();
1584     }
1585 #endif
1586 
1587     /*! IMU and its interrupt are initialized once for each IMU link */
1588     if ((imu_init_flag & (1U << imuHandle->imuLink)) == 0U)
1589     {
1590         HAL_ImuTaskInit(imuHandle->imuLink);
1591 
1592         if (IMU_Init(link) != (int)kStatus_HAL_ImumcSuccess)
1593         {
1594             return kStatus_HAL_ImumcError;
1595         }
1596         IMU_ClearPendingInterrupts(link, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);
1597         os_ClearPendingISR(IMULINKID_TO_IRQID(link));
1598         /* Interrupt must be maskable by FreeRTOS critical section */
1599         NVIC_SetPriority(IMULINKID_TO_IRQID(link), IMU_ISR_PRIORITY);
1600         (void)os_InterruptMaskSet(IMULINKID_TO_IRQID(link));
1601 #if defined(CPU2)
1602         if (kIMU_LinkCpu2Cpu3 == link)
1603         {
1604             for (i = 0; i < IMUMC_TXQ23_BUFSIZE; i++)
1605             {
1606                 (void)HAL_ImumcPutTxBuf(imuHandle, (uint8_t *)imumcTxBuf23[i]);
1607             }
1608         }
1609 #else
1610         imuHandle->wlanTxqCtl.writeIndex  = 0;
1611         imuHandle->wlanTxqCtl.readIndex   = 0;
1612         imuHandle->imuMsgBufIdx           = 0;
1613         imuHandle->imumcTxqCtl.writeIndex = 0;
1614         imuHandle->imumcTxqCtl.readIndex  = 0;
1615         if (kIMU_LinkCpu1Cpu3 == link)
1616         {
1617             for (i = 0; i < IMUMC_TXQ13_BUFSIZE; i++)
1618             {
1619                 (void)HAL_ImumcPutTxBuf(imuHandle, (uint8_t *)imumcTxBuf13[i]);
1620             }
1621         }
1622         else if (kIMU_LinkCpu2Cpu3 == link)
1623         {
1624             for (i = 0; i < IMUMC_TXQ23_BUFSIZE; i++)
1625             {
1626                 (void)HAL_ImumcPutTxBuf(imuHandle, (uint8_t *)imumcTxBuf23[i]);
1627             }
1628         }
1629         else
1630         {
1631             ; /* No necessary actions. */
1632         }
1633 #endif
1634         LIST_init(&imuHandle->eptList);
1635         imu_init_flag |= (1U << imuHandle->imuLink);
1636     }
1637 
1638     /*! Could be moved out from imumc_init() */
1639     if (imu_init_flag == ((1U << kIMU_LinkMax) - 1U)) /*! All IMU links are initalized */
1640     {
1641         HAL_ImuSetCpuReadyFlag(1U /*! Set CPU1 state */);
1642     }
1643 
1644     if ((uint8_t)IMU_UNINITIALIZED == imuHandle->imuSyncState)
1645     {
1646         state = HAL_ImuSendSync(imuHandle);
1647     }
1648 
1649     OSA_EXIT_CRITICAL();
1650     (void)state;
1651     return kStatus_HAL_ImumcSuccess;
1652 }
1653 
HAL_ImuDeinit(imu_link_t link,uint32_t flag)1654 hal_imumc_status_t HAL_ImuDeinit(imu_link_t link, uint32_t flag)
1655 {
1656     hal_imu_handle_t *imuHandle;
1657     hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;
1658     OSA_SR_ALLOC();
1659 
1660     assert(kIMU_LinkMax > link);
1661     imuHandle = &imuHandleCh[link];
1662     OSA_ENTER_CRITICAL();
1663 
1664     if ((flag & (1U << 0U)) == 0U)
1665     {
1666         (void)HAL_ImuReturnAllTxBuf(link);
1667         state = HAL_ImuSendShutdown(imuHandle);
1668         if (kStatus_HAL_ImumcError == state)
1669         {
1670             OSA_EXIT_CRITICAL();
1671             return kStatus_HAL_ImumcError;
1672         }
1673     }
1674 
1675     IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);
1676     IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_SP_AV_INT_CLR_MASK);
1677     (void)os_InterruptMaskClear(IMULINKID_TO_IRQID((imu_link_t)imuHandle->imuLink));
1678     IMU_Deinit((imu_link_t)imuHandle->imuLink);
1679     imuHandle->imuSyncState                  = (uint8_t)IMU_UNINITIALIZED;
1680     *IMU_MSG_CUR_MAGIC_P(imuHandle->imuLink) = 0;
1681     imu_init_flag &= ~(1U << imuHandle->imuLink);
1682     imuHandle->wlanTxqCtl.writeIndex         = 0;
1683     imuHandle->wlanTxqCtl.readIndex          = 0;
1684     imuHandle->imuMsgBufIdx                  = 0;
1685     imuHandle->cmd_buffer                    = NULL;
1686     imuHandle->cmd_buffer_available          = 0;
1687     imuHandle->cmd_response_buffer_available = 0;
1688 
1689     if ((flag & (1U << 0U)) == 0U)
1690     {
1691         while (*IMU_MSG_PEER_MAGIC_P((imu_link_t)imuHandle->imuLink) != 0)
1692         {
1693         }
1694     }
1695 
1696     if ((flag & (1U << 1U)) == 0U)
1697     {
1698         HAL_ImuTaskDeinit(imuHandle->imuLink);
1699     }
1700 
1701     OSA_EXIT_CRITICAL();
1702     return kStatus_HAL_ImumcSuccess;
1703 }
1704 
HAL_ImumcInit(hal_imumc_handle_t handle,hal_imumc_config_t * config)1705 hal_imumc_status_t HAL_ImumcInit(hal_imumc_handle_t handle, hal_imumc_config_t *config)
1706 {
1707     hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;
1708     hal_imumc_state_t *imumcHandle;
1709     hal_imu_handle_t *imuHandle;
1710     uint32_t Events;
1711     OSA_SR_ALLOC();
1712 
1713     assert(HAL_IMUMC_HANDLE_SIZE >= sizeof(hal_imumc_state_t));
1714     assert(NULL != handle);
1715     assert(NULL != config);
1716     assert((uint8_t)kIMU_LinkMax > config->imuLink);
1717     imumcHandle = (hal_imumc_state_t *)handle;
1718 
1719     OSA_ENTER_CRITICAL();
1720 
1721     if (imumc_init_flag == 0U)
1722     {
1723 #ifdef __ZEPHYR__
1724         k_event_init(&imumcQFlagsRef);
1725 #else
1726         (void)OSA_EventCreate((osa_event_handle_t)imumcQFlagsRef, 1U);
1727 #endif
1728         imumc_init_flag = 1U;
1729     }
1730 
1731     state = HAL_ImuInit((imu_link_t)config->imuLink);
1732     if (kStatus_HAL_ImumcError == state)
1733     {
1734         OSA_EXIT_CRITICAL();
1735         return kStatus_HAL_ImumcError;
1736     }
1737 
1738     imumcHandle->imuLink        = config->imuLink;
1739     imumcHandle->local_addr     = config->local_addr;
1740     imumcHandle->remote_addr    = config->remote_addr;
1741     imumcHandle->rx.callback    = config->callback;
1742     imumcHandle->rx.param       = config->param;
1743     imumcHandle->eptLinkIsReady = FALSE;
1744     LIST_elemInit(&imumcHandle->eptLink);
1745 
1746     if (NULL == HAL_ImumcCreateEndpoint(imumcHandle))
1747     {
1748         OSA_EXIT_CRITICAL();
1749         return kStatus_HAL_ImumcError;
1750     }
1751 
1752     imuHandle = &imuHandleCh[imumcHandle->imuLink];
1753 
1754     OSA_EXIT_CRITICAL();
1755 
1756     while (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))
1757     {
1758 #if defined(USE_RTOS) && (USE_RTOS == 1)
1759         OSA_TimeDelay(IMU_LINK_WAIT_DELAY_MS);
1760 #else
1761         (void)HAL_ImuReceive(imumcHandle->imuLink);
1762 #endif
1763     }
1764 
1765     while (FALSE == imumcHandle->eptLinkIsReady)
1766     {
1767         OSA_ENTER_CRITICAL();
1768 
1769         state = HAL_ImuSendImumcEptQuiry(imuHandle, imumcHandle->remote_addr);
1770 
1771         OSA_EXIT_CRITICAL();
1772 
1773 #if defined(USE_RTOS) && (USE_RTOS == 1U)
1774 #ifdef __ZEPHYR__
1775         Events = k_event_wait(&imumcQFlagsRef, IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink, 0, K_FOREVER);
1776         k_event_clear(&imumcQFlagsRef, IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink);
1777 #else
1778         (void)OSA_EventWait((osa_event_handle_t)imumcQFlagsRef, IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink, 0,
1779                             osaWaitForever_c, &Events);
1780 #endif
1781 #else
1782         while (TRUE) /* Wait for IMUMC_EVENT_ENDPOINT_QUERY_RSP */
1783         {
1784             (void)HAL_ImuReceive(imumcHandle->imuLink);
1785             (void)OSA_EventWait((osa_event_handle_t)imumcQFlagsRef,
1786                                 IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink, 0, osaWaitForever_c, &Events);
1787             if (Events != 0U)
1788             {
1789                 break;
1790             }
1791         }
1792 #endif
1793     }
1794 
1795     return state;
1796 }
1797 
HAL_ImumcDeinit(hal_imumc_handle_t handle)1798 hal_imumc_status_t HAL_ImumcDeinit(hal_imumc_handle_t handle)
1799 {
1800     hal_imumc_state_t *imumcHandle;
1801     hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;
1802     OSA_SR_ALLOC();
1803 
1804     assert(NULL != handle);
1805     imumcHandle = (hal_imumc_state_t *)handle;
1806     OSA_ENTER_CRITICAL();
1807     state = HAL_ImumcDestroyEndpoint(imumcHandle);
1808 
1809     OSA_EXIT_CRITICAL();
1810 
1811     return state;
1812 }
1813 
HAL_ImumcSend(hal_imumc_handle_t handle,uint8_t * data,uint32_t length)1814 hal_imumc_status_t HAL_ImumcSend(hal_imumc_handle_t handle, uint8_t *data, uint32_t length)
1815 {
1816     hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;
1817     hal_imumc_state_t *imumcHandle;
1818     hal_imu_handle_t *imuHandle;
1819     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
1820     OSA_SR_ALLOC();
1821     uint8_t *imumc_tx_buf;
1822     struct imumc_std_msg localImumc;
1823 
1824     assert(HAL_IMUMC_HANDLE_SIZE >= sizeof(hal_imumc_state_t));
1825     assert(NULL != handle);
1826     assert(NULL != data);
1827 
1828     imumcHandle = (hal_imumc_state_t *)handle;
1829     imuHandle   = &imuHandleCh[imumcHandle->imuLink];
1830 
1831     assert(kStatus_HAL_ImumcSuccess == HAL_ImuLinkIsUp(imuHandle->imuLink));
1832     assert(imumcHandle->eptLinkIsReady == TRUE);
1833 
1834     if (imumcHandle->imuLink == (uint8_t)kIMU_LinkCpu2Cpu3)
1835     {
1836         assert(IMUMC_TXQ23_BUFLENGTH >= length);
1837     }
1838     else
1839     {
1840         assert(IMUMC_TXQ13_BUFLENGTH >= length);
1841     }
1842 
1843     imumc_tx_buf = HAL_ImumcAllocTxBuffer(handle, length);
1844 
1845     if (NULL == imumc_tx_buf)
1846     {
1847         return kStatus_HAL_ImumcError;
1848     }
1849     else
1850     {
1851         OSA_ENTER_CRITICAL();
1852 
1853         // To be DMAed
1854         (void)HAL_IMU_MEMCPY(imumc_tx_buf, data, length);
1855         localImumc.hdr.src   = imumcHandle->local_addr;
1856         localImumc.hdr.dst   = imumcHandle->remote_addr;
1857         localImumc.hdr.len   = (uint16_t)length;
1858         localImumc.hdr.flags = 0;
1859         localImumc.data      = (uint32_t)imumc_tx_buf;
1860 
1861         if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_IMUMC, 0U,
1862                                                                (uint8_t *)&localImumc,
1863                                                                (3U + sizeof(struct imumc_std_msg)) >> 2U))
1864         {
1865             seq_num++;
1866         }
1867         else
1868         {
1869             (void)HAL_ImumcPutTxBuf(imuHandle, imumc_tx_buf);
1870             imumcStatus = kStatus_HAL_ImumcError;
1871         }
1872 
1873         OSA_EXIT_CRITICAL();
1874     }
1875 
1876     (void)state;
1877     return imumcStatus;
1878 }
1879 
HAL_ImumcNoCopySend(hal_imumc_handle_t handle,uint8_t * data,uint32_t length)1880 hal_imumc_status_t HAL_ImumcNoCopySend(hal_imumc_handle_t handle, uint8_t *data, uint32_t length)
1881 {
1882     hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;
1883     hal_imumc_state_t *imumcHandle;
1884     hal_imu_handle_t *imuHandle;
1885     hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;
1886     OSA_SR_ALLOC();
1887 
1888     struct imumc_std_msg localImumc;
1889 
1890     assert(HAL_IMUMC_HANDLE_SIZE >= sizeof(hal_imumc_state_t));
1891     assert(NULL != handle);
1892     assert(NULL != data);
1893 
1894     imumcHandle = (hal_imumc_state_t *)handle;
1895     imuHandle   = &imuHandleCh[imumcHandle->imuLink];
1896 
1897     assert(kStatus_HAL_ImumcSuccess == HAL_ImuLinkIsUp(imuHandle->imuLink));
1898     assert(imumcHandle->eptLinkIsReady == TRUE);
1899 
1900     OSA_ENTER_CRITICAL();
1901 
1902     localImumc.hdr.src   = imumcHandle->local_addr;
1903     localImumc.hdr.dst   = imumcHandle->remote_addr;
1904     localImumc.hdr.len   = (uint16_t)length;
1905     localImumc.hdr.flags = 0;
1906     localImumc.data      = (uint32_t)data;
1907 
1908     if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_IMUMC, 0U,
1909                                                            (uint8_t *)&localImumc,
1910                                                            (3U + sizeof(struct imumc_std_msg)) >> 2U))
1911     {
1912         seq_num++;
1913     }
1914     else
1915     {
1916         imumcStatus = kStatus_HAL_ImumcError;
1917     }
1918 
1919     OSA_EXIT_CRITICAL();
1920     (void)state;
1921     return imumcStatus;
1922 }
1923 
HAL_ImuInstallCallback(uint8_t imuLink,imu_callback_t callback,uint8_t type)1924 hal_imumc_status_t HAL_ImuInstallCallback(uint8_t imuLink, imu_callback_t callback, uint8_t type)
1925 {
1926     hal_imu_handle_t *imuHandle;
1927 
1928     assert((uint8_t)kIMU_LinkMax > imuLink);
1929     assert((uint8_t)IMU_MSG_MAX > type);
1930     imuHandle                   = &imuHandleCh[imuLink];
1931     imuHandle->imuHandler[type] = callback;
1932 
1933     return kStatus_HAL_ImumcSuccess;
1934 }
1935 
HAL_ImuInstallIrqCallback(uint8_t imuLink,imu_irq_callback_t callback)1936 hal_imumc_status_t HAL_ImuInstallIrqCallback(uint8_t imuLink, imu_irq_callback_t callback)
1937 {
1938     assert((uint8_t)kIMU_LinkMax > imuLink);
1939 
1940     imuIrqCallback[imuLink] = callback;
1941 
1942     return kStatus_HAL_ImumcSuccess;
1943 }
1944 
HAL_ImumcInstallRxCallback(hal_imumc_handle_t handle,imumc_rx_callback_t callback,void * param)1945 hal_imumc_status_t HAL_ImumcInstallRxCallback(hal_imumc_handle_t handle, imumc_rx_callback_t callback, void *param)
1946 {
1947     hal_imumc_state_t *imumcHandle;
1948 
1949     imumcHandle = (hal_imumc_state_t *)handle;
1950 
1951     imumcHandle->rx.callback = callback;
1952     imumcHandle->rx.param    = param;
1953 
1954     return kStatus_HAL_ImumcSuccess;
1955 }
1956 
HAL_ImumcEnterLowpower(hal_imumc_handle_t handle)1957 hal_imumc_status_t HAL_ImumcEnterLowpower(hal_imumc_handle_t handle)
1958 {
1959     return kStatus_HAL_ImumcError;
1960 }
1961 
HAL_ImumcExitLowpower(hal_imumc_handle_t handle)1962 hal_imumc_status_t HAL_ImumcExitLowpower(hal_imumc_handle_t handle)
1963 {
1964     return kStatus_HAL_ImumcError;
1965 }
1966 
HAL_ImumcSetEvent(uint32_t Event)1967 void HAL_ImumcSetEvent(uint32_t Event)
1968 {
1969 #if defined(CPU2)
1970     (void)OSA_EventSet((osa_event_handle_t)ImuQFlagsRef, Event);
1971 #else
1972     if ((Event & (1U << kIMU_LinkCpu1Cpu3)) != 0U)
1973     {
1974 #ifdef __ZEPHYR__
1975         k_event_post(&ImuQ13FlagsRef, Event);
1976 #else
1977         (void)OSA_EventSet((osa_event_handle_t)ImuQ13FlagsRef, Event);
1978 #endif
1979     }
1980     else
1981     {
1982 #ifdef __ZEPHYR__
1983         k_event_post(&ImuQ23FlagsRef, Event);
1984 #else
1985         (void)OSA_EventSet((osa_event_handle_t)ImuQ23FlagsRef, Event);
1986 #endif
1987     }
1988 #endif
1989 }
1990 
1991 #if defined(CPU2)
CPU1_TO_CPU2_MSG_RDY_IMU_INT_IRQHandler(void)1992 void CPU1_TO_CPU2_MSG_RDY_IMU_INT_IRQHandler(void)
1993 {
1994     uint32_t irq_num = IMULINKID_TO_IRQID(kIMU_LinkCpu1Cpu2);
1995 
1996     /* Mask IMU ICU interrupt */
1997     (void)os_InterruptMaskClear(irq_num);
1998 
1999     if (!IMU_RX_FIFO_EMPTY(kIMU_LinkCpu1Cpu2))
2000     {
2001         HAL_ImumcSetEvent(1U << (uint8_t)kIMU_LinkCpu1Cpu2);
2002     }
2003     else
2004     {
2005         IMU_ClearPendingInterrupts(kIMU_LinkCpu1Cpu2, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);
2006         (void)os_InterruptMaskSet(irq_num);
2007     }
2008 }
2009 
CPU3_TO_CPU2_MSG_RDY_IMU_INT_IRQHandler(void)2010 void CPU3_TO_CPU2_MSG_RDY_IMU_INT_IRQHandler(void)
2011 {
2012     uint32_t irq_num = IMULINKID_TO_IRQID(kIMU_LinkCpu2Cpu3);
2013 
2014     /* Mask IMU ICU interrupt */
2015     (void)os_InterruptMaskClear(irq_num);
2016 
2017     if (!IMU_RX_FIFO_EMPTY(kIMU_LinkCpu2Cpu3))
2018     {
2019         HAL_ImumcSetEvent(1U << (uint8_t)kIMU_LinkCpu2Cpu3);
2020     }
2021     else
2022     {
2023         IMU_ClearPendingInterrupts(kIMU_LinkCpu2Cpu3, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);
2024         (void)os_InterruptMaskSet(irq_num);
2025     }
2026 }
2027 #else
2028 
WL_MCI_WAKEUP0_DriverIRQHandler(void)2029 void WL_MCI_WAKEUP0_DriverIRQHandler(void)
2030 {
2031     IRQn_Type irq_num;
2032 #if defined(CPU2)
2033     irq_num = IRQ_IMU_CPU32;
2034 #else
2035     irq_num = IRQ_IMU_CPU13;
2036 #endif
2037 
2038     /* Mask IMU ICU interrupt */
2039     (void)os_InterruptMaskClear(irq_num);
2040 
2041     if (!IMU_RX_FIFO_EMPTY(kIMU_LinkCpu1Cpu3))
2042     {
2043         HAL_ImumcSetEvent(1U << (uint8_t)kIMU_LinkCpu1Cpu3);
2044     }
2045     else
2046     {
2047         IMU_ClearPendingInterrupts(kIMU_LinkCpu1Cpu3, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);
2048         (void)os_InterruptMaskSet(irq_num);
2049     }
2050 }
2051 
BLE_MCI_WAKEUP0_DriverIRQHandler(void)2052 void BLE_MCI_WAKEUP0_DriverIRQHandler(void)
2053 {
2054     IRQn_Type irq_num;
2055 #if defined(CPU2)
2056     irq_num = IRQ_IMU_CPU12;
2057 #else
2058     irq_num = IRQ_IMU_CPU23;
2059 #endif
2060 
2061     /* Mask IMU ICU interrupt */
2062     (void)os_InterruptMaskClear(irq_num);
2063 
2064     if (!IMU_RX_FIFO_EMPTY(kIMU_LinkCpu2Cpu3))
2065     {
2066         HAL_ImumcSetEvent(1U << (uint8_t)kIMU_LinkCpu2Cpu3);
2067     }
2068     else
2069     {
2070         if (imuIrqCallback[kIMU_LinkCpu2Cpu3] != NULL)
2071         {
2072             imuIrqCallback[kIMU_LinkCpu2Cpu3]();
2073         }
2074 
2075         IMU_ClearPendingInterrupts(kIMU_LinkCpu2Cpu3, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);
2076         (void)os_InterruptMaskSet(irq_num);
2077     }
2078 }
2079 #endif
2080 
HAL_ImumcAllocTxBuffer(hal_imumc_handle_t handle,uint32_t size)2081 void *HAL_ImumcAllocTxBuffer(hal_imumc_handle_t handle, uint32_t size)
2082 {
2083     hal_imumc_state_t *imumcHandle;
2084     hal_imu_handle_t *imuHandle;
2085     uint32_t retry = IMUMC_ALLOC_RETRY_COUNT;
2086     void *buf      = NULL;
2087 
2088     imumcHandle = (hal_imumc_state_t *)handle;
2089 
2090     if (imumcHandle->imuLink == (uint8_t)kIMU_LinkCpu2Cpu3)
2091     {
2092         assert(IMUMC_TXQ23_BUFLENGTH >= size);
2093     }
2094     else
2095     {
2096         assert(IMUMC_TXQ13_BUFLENGTH >= size);
2097     }
2098 
2099     assert(NULL != handle);
2100 
2101     imuHandle = &imuHandleCh[imumcHandle->imuLink];
2102 
2103     buf = HAL_ImumcGetTxBuf(imuHandle);
2104 
2105     while ((buf == NULL) && (retry != 0U))
2106     {
2107         /* Sleep current thread, then try to allocate again */
2108         OSA_TimeDelay(IMUMC_ALLOC_FAILED_DELAY_MS);
2109         buf = HAL_ImumcGetTxBuf(imuHandle);
2110         retry--;
2111     }
2112 
2113     return buf;
2114 }
2115 
HAL_ImumcFreeRxBuffer(hal_imumc_handle_t handle,uint8_t * data)2116 hal_imumc_status_t HAL_ImumcFreeRxBuffer(hal_imumc_handle_t handle, uint8_t *data)
2117 {
2118     hal_imumc_state_t *imumcHandle;
2119     hal_imu_handle_t *imuHandle;
2120 
2121     assert(NULL != handle);
2122 
2123     imumcHandle = (hal_imumc_state_t *)handle;
2124     imuHandle   = &imuHandleCh[imumcHandle->imuLink];
2125 
2126     return HAL_ImuSendImumcFreeBuf(imuHandle, data);
2127 }
2128 
HAL_ImuIsTxBufQueueEmpty(uint8_t imuLink)2129 bool HAL_ImuIsTxBufQueueEmpty(uint8_t imuLink)
2130 {
2131     hal_imu_handle_t *imuHandle;
2132     IMU_WLAN_TXQ_CTRL_st *wlanTxqCtl;
2133 
2134     assert((uint8_t)kIMU_LinkMax > imuLink);
2135 
2136     imuHandle  = &imuHandleCh[imuLink];
2137     wlanTxqCtl = &imuHandle->wlanTxqCtl;
2138 
2139     return (IS_WLAN_TXBQ_EMPTY(wlanTxqCtl));
2140 }
2141 
2142 #if (defined(USE_RTOS) && (USE_RTOS > 0U))
HAL_ImuCreateTaskLock(void)2143 hal_imumc_status_t HAL_ImuCreateTaskLock(void)
2144 {
2145 #ifdef __ZEPHYR__
2146     k_mutex_init(&imu_task_lock);
2147 #else
2148     osa_status_t status;
2149 
2150     if ((*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) == 0)
2151     {
2152         status = OSA_MutexCreate((osa_mutex_handle_t)imu_task_lock);
2153         if (status == KOSA_StatusError)
2154         {
2155             return kStatus_HAL_ImumcError;
2156         }
2157     }
2158 #endif
2159     return kStatus_HAL_ImumcSuccess;
2160 }
2161 
HAL_ImuDeleteTaskLock(void)2162 void HAL_ImuDeleteTaskLock(void)
2163 {
2164 #ifndef __ZEPHYR__
2165     if ((*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) != 0)
2166     {
2167         (void)OSA_MutexDestroy((osa_mutex_handle_t)imu_task_lock);
2168         (*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) = 0;
2169     }
2170 #endif
2171 }
2172 
HAL_ImuGetTaskLock(void)2173 hal_imumc_status_t HAL_ImuGetTaskLock(void)
2174 {
2175 #ifdef __ZEPHYR__
2176     int ret = k_mutex_lock(&imu_task_lock, K_FOREVER);
2177 
2178     return (ret == 0) ? kStatus_HAL_ImumcSuccess : kStatus_HAL_ImumcError;
2179 #else
2180     osa_status_t status;
2181 
2182     if ((*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) == 0)
2183     {
2184         return kStatus_HAL_ImumcSuccess;
2185     }
2186 
2187     status = OSA_MutexLock((osa_mutex_handle_t)imu_task_lock, osaWaitForever_c);
2188     return status == KOSA_StatusSuccess ? kStatus_HAL_ImumcSuccess : kStatus_HAL_ImumcError;
2189 #endif
2190 }
2191 
HAL_ImuPutTaskLock(void)2192 hal_imumc_status_t HAL_ImuPutTaskLock(void)
2193 {
2194 #ifdef __ZEPHYR__
2195     int ret = k_mutex_unlock(&imu_task_lock);
2196 
2197     return (ret == 0) ? kStatus_HAL_ImumcSuccess : kStatus_HAL_ImumcError;
2198 #else
2199 
2200     osa_status_t status;
2201 
2202     if ((*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) == 0)
2203     {
2204         return kStatus_HAL_ImumcSuccess;
2205     }
2206 
2207     status = OSA_MutexUnlock((osa_mutex_handle_t)imu_task_lock);
2208     return status == KOSA_StatusSuccess ? kStatus_HAL_ImumcSuccess : kStatus_HAL_ImumcError;
2209 #endif
2210 }
2211 #endif
2212