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