1 /*
2  * Copyright 2020, 2022-2023 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include "fsl_common.h"
10 #include "rpmsg_lite.h"
11 #include "fsl_component_generic_list.h"
12 #include "fsl_adapter_rpmsg.h"
13 #include "mcmgr.h"
14 
15 /*******************************************************************************
16  * Definitions
17  ******************************************************************************/
18 /* Weak function. */
19 #if defined(__GNUC__)
20 #define __WEAK_FUNC __attribute__((weak))
21 #elif defined(__ICCARM__)
22 #define __WEAK_FUNC __weak
23 #elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
24 #define __WEAK_FUNC __attribute__((weak))
25 #elif defined(__DSC__) || defined(__CW__)
26 #define __WEAK_FUNC __attribute__((weak))
27 #endif
28 
29 typedef struct _hal_rpmsg_rx_state
30 {
31     rpmsg_rx_callback_t callback;
32     void *param;
33 } hal_rpmsg_rx_state_t;
34 
35 /*! @brief rpmsg state structure. */
36 typedef struct _hal_rpmsg_state
37 {
38     uint8_t local_addr;
39     uint8_t remote_addr;
40     volatile uint8_t rpmsg_lite_peer_ept_is_ready;
41 #if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
42     struct rpmsg_lite_ept_static_context endpoint;
43 #endif
44     struct rpmsg_lite_endpoint *pEndpoint;
45     hal_rpmsg_rx_state_t rx;
46 } hal_rpmsg_state_t;
47 
48 typedef struct _hal_rpmsg_peer_ept_state
49 {
50     list_element_t link;
51     hal_rpmsg_state_t *rpmsgHandle;
52 } hal_rpmsg_peer_ept_state;
53 
54 #ifndef RPMSG_GLOBAL_VARIABLE_ALLOC
55 #if (defined(HAL_RPMSG_SELECT_ROLE) && (HAL_RPMSG_SELECT_ROLE == 0U))
56 #define SH_MEM_TOTAL_SIZE (6144U)
57 #if defined(__ICCARM__) /* IAR Workbench */
58 #pragma location = "rpmsg_sh_mem_section"
59 static char rpmsg_lite_base[SH_MEM_TOTAL_SIZE];
60 #elif defined(__CC_ARM) || defined(__ARMCC_VERSION) /* Keil MDK */
61 static char rpmsg_lite_base[SH_MEM_TOTAL_SIZE] __attribute__((section("rpmsg_sh_mem_section")));
62 #elif defined(__GNUC__)
63 static char rpmsg_lite_base[SH_MEM_TOTAL_SIZE] __attribute__((section(".noinit.$rpmsg_sh_mem")));
64 #else
65 #error "RPMsg: Please provide your definition of rpmsg_lite_base[]!"
66 #endif
67 #endif /* HAL_RPMSG_SELECT_ROLE */
68 
69 extern uint32_t rpmsg_sh_mem_start[];
70 extern uint32_t rpmsg_sh_mem_end[];
71 #else
72 
73 #if (defined(HAL_RPMSG_SELECT_ROLE) && (HAL_RPMSG_SELECT_ROLE == 0U))
74 #define SH_MEM_TOTAL_SIZE (6144U)
75 extern char *rpmsg_lite_base;
76 #endif /* HAL_RPMSG_SELECT_ROLE */
77 
78 extern uint32_t rpmsg_sh_mem_start[];
79 extern uint32_t rpmsg_sh_mem_end[];
80 #endif /* RPMSG_GLOBAL_VARIABLE_ALLOC */
81 
82 #define RPMSG_LITE_LINK_ID (0U)
83 
84 #define APP_RPMSG_COREUP_EVENT_DATA   (0U)
85 #define APP_RPMSG_READY_EVENT_DATA    (1U)
86 #define APP_RPMSG_EP_READY_EVENT_DATA (2U)
87 
88 #ifndef RPMSG_REMOTE_READY_RETRY_COUNT
89 #define RPMSG_REMOTE_READY_RETRY_COUNT 10000000U
90 #endif
91 
92 static int32_t s_rpmsgEptCount                    = -1;
93 static uint8_t s_peerRpmsgEptCount                = 0U;
94 static struct rpmsg_lite_instance *s_rpmsgContext = NULL;
95 #if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
96 static struct rpmsg_lite_instance s_context = {0};
97 #endif
98 static uint8_t s_rpmsg_init_golbal                               = 0U;
99 static list_label_t s_rpmsgEpList                                = {0};
100 static volatile uint8_t s_rpmsgPeerEptData[MAX_EP_COUNT]         = {0};
101 static hal_rpmsg_peer_ept_state s_rpmsgPeerEptStat[MAX_EP_COUNT] = {0};
102 /*******************************************************************************
103  * Code
104  ******************************************************************************/
105 /*
106  * This function is used for periodic check if the rpmsg endpoint is ready, and will be called in rpmsg send..
107  * RPMsg_EpReadyTimeDelay is a weak function, so it could be re-implemented by
108  * upper layer.
109  */
110 __WEAK_FUNC void RPMsg_EpReadyTimeDelay(uint32_t ms);
RPMsg_EpReadyTimeDelay(uint32_t ms)111 __WEAK_FUNC void RPMsg_EpReadyTimeDelay(uint32_t ms)
112 {
113     /* Reserved*/
114 }
115 #if 0  /* Reserved API */
116 static uint16_t rpmsg_lite_recv_ack_flag;
117 
118 void rpmsg_ack_init(void)
119 {
120     rpmsg_lite_recv_ack_flag = 0U;
121     (void)MCMGR_RegisterEvent(kMCMGR_RemoteApplicationEvent, RPMsgPeerReadyEventHandler,
122                               (void *)&rpmsg_lite_recv_ack_flag);
123 }
124 
125 void rpmsg_recv_ack(void)
126 {
127     (void)MCMGR_TriggerEvent(kMCMGR_RemoteApplicationEvent, 1U);
128 }
129 
130 void rpmsg_wait_ack(void)
131 {
132     while (1U != rpmsg_lite_recv_ack_flag)
133         ;
134 }
135 #endif /* Reserved API */
136 
rpmsg_ept_read_cb(void * payload,uint32_t payload_len,uint32_t src,void * priv)137 static int32_t rpmsg_ept_read_cb(void *payload, uint32_t payload_len, uint32_t src, void *priv)
138 {
139     hal_rpmsg_state_t *rpmsgHandle;
140 
141     rpmsgHandle = (hal_rpmsg_state_t *)priv;
142     assert(NULL != rpmsgHandle->rx.callback);
143 
144     return rpmsgHandle->rx.callback(rpmsgHandle->rx.param, payload, payload_len);
145 }
146 
RPMsgPeerReadyEventHandler(uint16_t eventData,void * context)147 static void RPMsgPeerReadyEventHandler(uint16_t eventData, void *context)
148 {
149     uint16_t *data = (uint16_t *)context;
150     list_element_handle_t list_element;
151     hal_rpmsg_peer_ept_state *rpmsgPeerEptState;
152     uint8_t address = 0U;
153 
154     if ((eventData & 0xff00U) == APP_RPMSG_EP_READY_EVENT_DATA << 0x8U)
155     {
156         address                                   = eventData & 0xffU;
157         s_rpmsgPeerEptData[s_peerRpmsgEptCount++] = address;
158     }
159 
160     list_element = LIST_GetHead(&s_rpmsgEpList);
161     while (NULL != list_element)
162     {
163         rpmsgPeerEptState = (hal_rpmsg_peer_ept_state *)(void *)list_element;
164 
165         if (rpmsgPeerEptState->rpmsgHandle->remote_addr == address)
166         {
167             rpmsgPeerEptState->rpmsgHandle->rpmsg_lite_peer_ept_is_ready = 1U;
168         }
169         list_element = LIST_GetNext(list_element);
170     }
171 
172     *data = eventData;
173 }
174 
175 #if (defined(HAL_RPMSG_SELECT_ROLE) && (HAL_RPMSG_SELECT_ROLE == 0U))
HAL_RpmsgMcmgrMasterInit(void)176 static hal_rpmsg_status_t HAL_RpmsgMcmgrMasterInit(void)
177 {
178     static volatile uint16_t RPMsgRemoteReadyEventData = 0;
179     volatile uint32_t timeout                          = RPMSG_REMOTE_READY_RETRY_COUNT;
180 
181     if (0 > s_rpmsgEptCount)
182     {
183         if (0U == s_rpmsg_init_golbal)
184         {
185             s_rpmsg_init_golbal = 1U;
186             LIST_Init((&s_rpmsgEpList), 0);
187             (void)MCMGR_RegisterEvent(kMCMGR_RemoteApplicationEvent, RPMsgPeerReadyEventHandler,
188                                       (void *)&RPMsgRemoteReadyEventData);
189             (void)MCMGR_Init();
190             if (MCMGR_StartCore(kMCMGR_Core1, (void *)(char *)REMOTE_CORE_BOOT_ADDRESS, 2, kMCMGR_Start_Asynchronous) !=
191                 kStatus_MCMGR_Success)
192             {
193                 return kStatus_HAL_RpmsgError;
194             }
195         }
196 
197         while ((APP_RPMSG_READY_EVENT_DATA != RPMsgRemoteReadyEventData) && (--timeout != 0u))
198         {
199         };
200         RPMsgRemoteReadyEventData = 0;
201         if (timeout == 0u)
202         {
203             return kStatus_HAL_RpmsgTimeout;
204         }
205 
206         /* Master init */
207 #if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
208         s_rpmsgContext = rpmsg_lite_master_init((void *)rpmsg_lite_base, SH_MEM_TOTAL_SIZE, RPMSG_LITE_LINK_ID,
209                                                 RL_NO_FLAGS, &s_context);
210 #else
211         s_rpmsgContext =
212             rpmsg_lite_master_init((void *)rpmsg_lite_base, SH_MEM_TOTAL_SIZE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS);
213 #endif
214         if (RL_NULL == s_rpmsgContext)
215         {
216             return kStatus_HAL_RpmsgError;
217         }
218 
219         s_rpmsgEptCount = 0;
220     }
221 
222     return kStatus_HAL_RpmsgSuccess;
223 }
HAL_RpmsgMasterInit(hal_rpmsg_handle_t handle,hal_rpmsg_config_t * config)224 static hal_rpmsg_status_t HAL_RpmsgMasterInit(hal_rpmsg_handle_t handle, hal_rpmsg_config_t *config)
225 {
226     hal_rpmsg_state_t *rpmsgHandle;
227     rpmsgHandle = (hal_rpmsg_state_t *)handle;
228 
229     rpmsgHandle->local_addr  = config->local_addr;
230     rpmsgHandle->remote_addr = config->remote_addr;
231 
232     rpmsgHandle->rx.callback = NULL;
233     rpmsgHandle->rx.param    = NULL;
234 #if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
235     rpmsgHandle->pEndpoint = rpmsg_lite_create_ept(s_rpmsgContext, rpmsgHandle->local_addr, rpmsg_ept_read_cb,
236                                                    rpmsgHandle, &rpmsgHandle->endpoint);
237 #else
238     rpmsgHandle->pEndpoint =
239         rpmsg_lite_create_ept(s_rpmsgContext, rpmsgHandle->local_addr, rpmsg_ept_read_cb, rpmsgHandle);
240 #endif
241     if (RL_NULL == rpmsgHandle->pEndpoint)
242     {
243         return kStatus_HAL_RpmsgError;
244     }
245 
246     return kStatus_HAL_RpmsgSuccess;
247 }
248 #endif /* HAL_RPMSG_SELECT_ROLE */
249 
250 #if (defined(HAL_RPMSG_SELECT_ROLE) && (HAL_RPMSG_SELECT_ROLE == 1U))
HAL_RpmsgMcmgrRemoteInit()251 static hal_rpmsg_status_t HAL_RpmsgMcmgrRemoteInit()
252 {
253     uint32_t startupData;
254     mcmgr_status_t status;
255     volatile static uint16_t RPMsgRemoteReadyEventData = 0;
256 
257     if (0 > s_rpmsgEptCount)
258     {
259         if (0U == s_rpmsg_init_golbal)
260         {
261             LIST_Init((&s_rpmsgEpList), 0);
262             s_rpmsg_init_golbal = 1U;
263             (void)MCMGR_RegisterEvent(kMCMGR_RemoteApplicationEvent, RPMsgPeerReadyEventHandler,
264                                       (void *)&RPMsgRemoteReadyEventData);
265             (void)MCMGR_Init();
266             do
267             {
268                 status = MCMGR_GetStartupData(&startupData);
269             } while (status != kStatus_MCMGR_Success);
270         }
271 #if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
272         s_rpmsgContext =
273             rpmsg_lite_remote_init((void *)(char *)rpmsg_sh_mem_start, RPMSG_LITE_LINK_ID, RL_NO_FLAGS, &s_context);
274 #else
275         s_rpmsgContext = rpmsg_lite_remote_init((void *)(char *)rpmsg_sh_mem_start, RPMSG_LITE_LINK_ID, RL_NO_FLAGS);
276 
277 #endif
278         if (RL_NULL == s_rpmsgContext)
279         {
280             return kStatus_HAL_RpmsgError;
281         }
282 
283         /* Trigger event notify master */
284         (void)MCMGR_TriggerEvent(kMCMGR_RemoteApplicationEvent, APP_RPMSG_READY_EVENT_DATA);
285         do
286         {
287         } while (RL_TRUE != rpmsg_lite_is_link_up(s_rpmsgContext));
288 
289         /* rpmsg initialized */
290         s_rpmsgEptCount = 0;
291     }
292     return kStatus_HAL_RpmsgSuccess;
293 }
HAL_RpmsgRemoteInit(hal_rpmsg_handle_t handle,hal_rpmsg_config_t * config)294 static hal_rpmsg_status_t HAL_RpmsgRemoteInit(hal_rpmsg_handle_t handle, hal_rpmsg_config_t *config)
295 {
296     hal_rpmsg_state_t *rpmsgHandle;
297 
298     rpmsgHandle = (hal_rpmsg_state_t *)handle;
299 
300     /* Set local/remote addr */
301     rpmsgHandle->local_addr  = config->local_addr;
302     rpmsgHandle->remote_addr = config->remote_addr;
303 
304     rpmsgHandle->rx.callback = NULL;
305     rpmsgHandle->rx.param    = NULL;
306 #if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
307     rpmsgHandle->pEndpoint = rpmsg_lite_create_ept(s_rpmsgContext, rpmsgHandle->local_addr, rpmsg_ept_read_cb,
308                                                    rpmsgHandle, &rpmsgHandle->endpoint);
309 #else
310     rpmsgHandle->pEndpoint =
311         rpmsg_lite_create_ept(s_rpmsgContext, rpmsgHandle->local_addr, rpmsg_ept_read_cb, rpmsgHandle);
312 #endif
313 
314     if (RL_NULL == rpmsgHandle->pEndpoint)
315     {
316         return kStatus_HAL_RpmsgError;
317     }
318 
319     return kStatus_HAL_RpmsgSuccess;
320 }
321 #endif /* HAL_RPMSG_SELECT_ROLE */
322 
HAL_RpmsgMcmgrInit(void)323 hal_rpmsg_status_t HAL_RpmsgMcmgrInit(void)
324 {
325     hal_rpmsg_status_t state;
326     if (0U == s_rpmsg_init_golbal)
327     {
328         (void)MCMGR_EarlyInit();
329     }
330 
331 #if (defined(HAL_RPMSG_SELECT_ROLE) && (HAL_RPMSG_SELECT_ROLE == 0U))
332     state = HAL_RpmsgMcmgrMasterInit();
333 #elif (defined(HAL_RPMSG_SELECT_ROLE) && (HAL_RPMSG_SELECT_ROLE == 1U))
334     state = HAL_RpmsgMcmgrRemoteInit();
335 #endif /* HAL_RPMSG_SELECT_ROLE */
336 
337     return state;
338 }
HAL_RpmsgInit(hal_rpmsg_handle_t handle,hal_rpmsg_config_t * config)339 hal_rpmsg_status_t HAL_RpmsgInit(hal_rpmsg_handle_t handle, hal_rpmsg_config_t *config)
340 {
341     hal_rpmsg_status_t state;
342     hal_rpmsg_state_t *rpmsgHandle;
343     uint8_t count = 0;
344 
345     assert(HAL_RPMSG_HANDLE_SIZE >= sizeof(hal_rpmsg_state_t));
346     assert(NULL != handle);
347     rpmsgHandle = (hal_rpmsg_state_t *)handle;
348 
349 #if (defined(HAL_RPMSG_SELECT_ROLE) && (HAL_RPMSG_SELECT_ROLE == 0U))
350     state = HAL_RpmsgMasterInit(handle, config);
351 #elif (defined(HAL_RPMSG_SELECT_ROLE) && (HAL_RPMSG_SELECT_ROLE == 1U))
352     state = HAL_RpmsgRemoteInit(handle, config);
353 #endif /* HAL_RPMSG_SELECT_ROLE */
354     rpmsgHandle->rx.callback = config->callback;
355     rpmsgHandle->rx.param    = config->param;
356 
357     /* Send peer Edpt ready to peer device */
358     (void)MCMGR_TriggerEvent(kMCMGR_RemoteApplicationEvent, APP_RPMSG_EP_READY_EVENT_DATA << 0x8U | config->local_addr);
359     s_rpmsgPeerEptStat[s_rpmsgEptCount].rpmsgHandle = rpmsgHandle;
360     (void)LIST_AddTail(&s_rpmsgEpList, (list_element_handle_t)&s_rpmsgPeerEptStat[s_rpmsgEptCount]);
361     s_rpmsgEptCount++;
362 
363     while (count < s_peerRpmsgEptCount)
364     {
365         if (rpmsgHandle->remote_addr == s_rpmsgPeerEptData[count++])
366         {
367             rpmsgHandle->rpmsg_lite_peer_ept_is_ready = 1U;
368         }
369     }
370 
371     return state;
372 }
373 
HAL_RpmsgDeinit(hal_rpmsg_handle_t handle)374 hal_rpmsg_status_t HAL_RpmsgDeinit(hal_rpmsg_handle_t handle)
375 {
376     hal_rpmsg_state_t *rpmsgHandle;
377 
378     rpmsgHandle = (hal_rpmsg_state_t *)handle;
379 
380     if (s_rpmsgEptCount > 0)
381     {
382         (void)rpmsg_lite_destroy_ept(s_rpmsgContext, rpmsgHandle->pEndpoint);
383         s_rpmsgEptCount--;
384     }
385 
386     if (0 == s_rpmsgEptCount)
387     {
388         s_rpmsgEptCount = -1;
389         (void)rpmsg_lite_deinit(s_rpmsgContext);
390         for (int i = 0; i < MAX_EP_COUNT; i++)
391         {
392             s_rpmsgPeerEptData[i] = 0U;
393         }
394     }
395 
396     return kStatus_HAL_RpmsgSuccess;
397 }
398 
HAL_RpmsgSendTimeout(hal_rpmsg_handle_t handle,uint8_t * data,uint32_t length,uint32_t timeout)399 hal_rpmsg_status_t HAL_RpmsgSendTimeout(hal_rpmsg_handle_t handle, uint8_t *data, uint32_t length, uint32_t timeout)
400 {
401     hal_rpmsg_state_t *rpmsgHandle;
402     hal_rpmsg_status_t status = kStatus_HAL_RpmsgSuccess;
403 
404 #if defined(HDI_MODE) && (HDI_MODE == 1)
405     uint32_t primask;
406 #endif
407 
408     int32_t rpmsgStatus;
409     volatile uint32_t epTimeout = RPMSG_REMOTE_READY_RETRY_COUNT;
410     assert(NULL != data);
411 
412     rpmsgHandle = (hal_rpmsg_state_t *)handle;
413     /* loop check peer device rpmsg endpoint is ready */
414     while ((0 == rpmsgHandle->rpmsg_lite_peer_ept_is_ready) && (--epTimeout != 0u))
415     {
416     }
417     if (epTimeout == 0u)
418     {
419         return kStatus_HAL_RpmsgTimeout;
420     }
421 
422 #if defined(HDI_MODE) && (HDI_MODE == 1)
423     /* In HDI mode this function can be called from ISR therefore,
424      * we need to disable interrupt when this configuration is enabled */
425     primask = DisableGlobalIRQ();
426 #endif
427 
428     do
429     {
430         if (RL_TRUE != rpmsg_lite_is_link_up(s_rpmsgContext))
431         {
432             status = kStatus_HAL_RpmsgError;
433             break;
434         }
435         rpmsgStatus = rpmsg_lite_send(s_rpmsgContext, rpmsgHandle->pEndpoint, rpmsgHandle->remote_addr, (char *)data,
436                                       length, timeout);
437         if (RL_SUCCESS != rpmsgStatus)
438         {
439             if (RL_ERR_NO_MEM == rpmsgStatus)
440             {
441                 status = kStatus_HAL_RpmsgTimeout;
442             }
443             else
444             {
445                 status = kStatus_HAL_RpmsgError;
446             }
447             break;
448         }
449     } while (false);
450 
451 #if defined(HDI_MODE) && (HDI_MODE == 1)
452     EnableGlobalIRQ(primask);
453 #endif
454 
455     return status;
456 }
HAL_RpmsgSend(hal_rpmsg_handle_t handle,uint8_t * data,uint32_t length)457 hal_rpmsg_status_t HAL_RpmsgSend(hal_rpmsg_handle_t handle, uint8_t *data, uint32_t length)
458 {
459     return HAL_RpmsgSendTimeout(handle, data, length, RPMSG_WAITFOREVER);
460 }
461 
HAL_RpmsgAllocTxBuffer(hal_rpmsg_handle_t handle,uint32_t size)462 void *HAL_RpmsgAllocTxBuffer(hal_rpmsg_handle_t handle, uint32_t size)
463 {
464     return HAL_RpmsgAllocTxBufferTimeout(handle, size, RPMSG_WAITFOREVER);
465 }
466 
HAL_RpmsgAllocTxBufferTimeout(hal_rpmsg_handle_t handle,uint32_t size,uint32_t timeout)467 void *HAL_RpmsgAllocTxBufferTimeout(hal_rpmsg_handle_t handle, uint32_t size, uint32_t timeout)
468 {
469     void *buf = NULL;
470     uint32_t primask;
471     primask = DisableGlobalIRQ();
472     buf     = rpmsg_lite_alloc_tx_buffer(s_rpmsgContext, &size, timeout);
473     EnableGlobalIRQ(primask);
474     return buf;
475 }
476 
HAL_RpmsgFreeRxBuffer(hal_rpmsg_handle_t handle,uint8_t * data)477 hal_rpmsg_status_t HAL_RpmsgFreeRxBuffer(hal_rpmsg_handle_t handle, uint8_t *data)
478 {
479     hal_rpmsg_status_t status = kStatus_HAL_RpmsgSuccess;
480     uint32_t primask;
481     primask = DisableGlobalIRQ();
482     if (RL_SUCCESS != rpmsg_lite_release_rx_buffer(s_rpmsgContext, data))
483     {
484         status = kStatus_HAL_RpmsgError;
485     }
486     EnableGlobalIRQ(primask);
487     return status;
488 }
489 
HAL_RpmsgNoCopySend(hal_rpmsg_handle_t handle,uint8_t * data,uint32_t length)490 hal_rpmsg_status_t HAL_RpmsgNoCopySend(hal_rpmsg_handle_t handle, uint8_t *data, uint32_t length)
491 {
492     hal_rpmsg_state_t *rpmsgHandle;
493     hal_rpmsg_status_t status = kStatus_HAL_RpmsgSuccess;
494     uint32_t primask;
495     rpmsgHandle                 = (hal_rpmsg_state_t *)handle;
496     volatile uint32_t epTimeout = RPMSG_REMOTE_READY_RETRY_COUNT;
497 
498     /* loop check peer device rpmsg endpoint is ready */
499     while ((0 == rpmsgHandle->rpmsg_lite_peer_ept_is_ready) && (--epTimeout != 0u))
500     {
501     }
502 
503     if (epTimeout == 0u)
504     {
505         return kStatus_HAL_RpmsgTimeout;
506     }
507 
508     primask = DisableGlobalIRQ();
509     assert(NULL != data);
510 
511     do
512     {
513         if (RL_TRUE != rpmsg_lite_is_link_up(s_rpmsgContext))
514         {
515             status = kStatus_HAL_RpmsgError;
516             break;
517         }
518 
519         if (RL_SUCCESS != rpmsg_lite_send_nocopy(s_rpmsgContext, rpmsgHandle->pEndpoint, rpmsgHandle->remote_addr,
520                                                  (char *)data, length))
521         {
522             status = kStatus_HAL_RpmsgError;
523             break;
524         }
525     } while (false);
526 
527     EnableGlobalIRQ(primask);
528 
529     return status;
530 }
HAL_RpmsgInstallRxCallback(hal_rpmsg_handle_t handle,rpmsg_rx_callback_t callback,void * param)531 hal_rpmsg_status_t HAL_RpmsgInstallRxCallback(hal_rpmsg_handle_t handle, rpmsg_rx_callback_t callback, void *param)
532 {
533     hal_rpmsg_state_t *rpmsgHandle;
534 
535     rpmsgHandle = (hal_rpmsg_state_t *)handle;
536 
537     rpmsgHandle->rx.callback = callback;
538     rpmsgHandle->rx.param    = param;
539 
540     return kStatus_HAL_RpmsgSuccess;
541 }
542 
HAL_RpmsgEnterLowpower(hal_rpmsg_handle_t handle)543 hal_rpmsg_status_t HAL_RpmsgEnterLowpower(hal_rpmsg_handle_t handle)
544 {
545     return kStatus_HAL_RpmsgError;
546 }
547 
HAL_RpmsgExitLowpower(hal_rpmsg_handle_t handle)548 hal_rpmsg_status_t HAL_RpmsgExitLowpower(hal_rpmsg_handle_t handle)
549 {
550     return kStatus_HAL_RpmsgError;
551 }
552