1 /*
2 * Copyright 2020 NXP
3 * All rights reserved.
4 *
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #include "fsl_common.h"
10 #include "fsl_component_serial_manager.h"
11 #include "fsl_component_serial_port_internal.h"
12
13 #if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
14 #include "fsl_adapter_rpmsg.h"
15
16 #include "fsl_component_serial_port_rpmsg.h"
17
18 /*******************************************************************************
19 * Definitions
20 ******************************************************************************/
21 #ifndef NDEBUG
22 #if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))
23 #undef assert
24 #define assert(n)
25 #else
26 /* MISRA C-2012 Rule 17.2 */
27 #undef assert
28 #define assert(n) \
29 while (!(n)) \
30 { \
31 ; \
32 }
33 #endif
34 #endif
35
36 typedef struct _serial_rpmsg_send_state
37 {
38 serial_manager_callback_t callback;
39 void *param;
40 } serial_rpmsg_send_state_t;
41
42 typedef struct _serial_rpmsg_recv_state
43 {
44 serial_manager_callback_t callback;
45 void *param;
46 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
47 #else /* !SERIAL_MANAGER_NON_BLOCKING_MODE */
48 volatile uint8_t *data;
49 volatile uint32_t len;
50 volatile uint32_t sofar;
51 volatile uint32_t remain;
52 #endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */
53 } serial_rpmsg_recv_state_t;
54
55 typedef struct _serial_rpmsg_state
56 {
57 RPMSG_HANDLE_DEFINE(rpmsgHandleBuffer);
58 serial_rpmsg_recv_state_t rx;
59 serial_rpmsg_send_state_t tx;
60 } serial_rpmsg_state_t;
61
62 /*******************************************************************************
63 * Prototypes
64 ******************************************************************************/
65
66 /*******************************************************************************
67 * Code
68 ******************************************************************************/
69
Serial_RpmsgRxCallback(void * param,uint8_t * data,uint32_t len)70 static hal_rpmsg_return_status_t Serial_RpmsgRxCallback(void *param, uint8_t *data, uint32_t len)
71 {
72 serial_rpmsg_state_t *serialRpmsgHandle;
73 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
74 serial_manager_callback_message_t msg;
75 #else /* !SERIAL_MANAGER_NON_BLOCKING_MODE */
76 uint32_t bytes;
77 #endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */
78
79 if (NULL == param)
80 {
81 return kStatus_HAL_RL_RELEASE;
82 }
83
84 serialRpmsgHandle = (serial_rpmsg_state_t *)param;
85
86 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
87 /* Rx Idle */
88 if ((NULL != serialRpmsgHandle->rx.callback))
89 {
90 msg.buffer = data;
91 msg.length = len;
92 serialRpmsgHandle->rx.callback(serialRpmsgHandle->rx.param, &msg, kStatus_SerialManager_Success);
93 }
94 #else /* !SERIAL_MANAGER_NON_BLOCKING_MODE */
95 /* Receive buffer is ready */
96 if (NULL != serialRpmsgHandle->rx.data)
97 {
98 bytes = (len <= (serialRpmsgHandle->rx.len - serialRpmsgHandle->rx.sofar)) ?
99 (len) :
100 (serialRpmsgHandle->rx.len - serialRpmsgHandle->rx.sofar);
101 /* read out the last bytes */
102 (void)memcpy((uint8_t *)&serialRpmsgHandle->rx.data[serialRpmsgHandle->rx.sofar], data, bytes);
103 serialRpmsgHandle->rx.sofar += bytes;
104 if (serialRpmsgHandle->rx.len == serialRpmsgHandle->rx.sofar)
105 {
106 serialRpmsgHandle->rx.data = NULL;
107 serialRpmsgHandle->rx.remain = len - bytes;
108 }
109 }
110 #endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */
111 return kStatus_HAL_RL_RELEASE;
112 }
113
Serial_RpmsgInit(serial_handle_t serialHandle,void * serialConfig)114 serial_manager_status_t Serial_RpmsgInit(serial_handle_t serialHandle, void *serialConfig)
115 {
116 serial_rpmsg_state_t *serialRpmsgHandle;
117 serial_manager_config_t *serialRpmsgConfig;
118
119 assert(serialConfig);
120 assert(serialHandle);
121
122 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
123 serialRpmsgConfig = (serial_manager_config_t *)serialConfig;
124
125 if (kStatus_HAL_RpmsgSuccess != HAL_RpmsgInit((hal_rpmsg_handle_t)serialRpmsgHandle->rpmsgHandleBuffer,
126 (hal_rpmsg_config_t *)serialRpmsgConfig->portConfig))
127 {
128 return kStatus_SerialManager_Error;
129 }
130
131 if (kStatus_HAL_RpmsgSuccess != HAL_RpmsgInstallRxCallback((hal_rpmsg_handle_t)serialRpmsgHandle->rpmsgHandleBuffer,
132 Serial_RpmsgRxCallback, serialHandle))
133 {
134 return kStatus_SerialManager_Error;
135 }
136
137 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
138 #endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */
139
140 return kStatus_SerialManager_Success;
141 }
142
Serial_RpmsgDeinit(serial_handle_t serialHandle)143 serial_manager_status_t Serial_RpmsgDeinit(serial_handle_t serialHandle)
144 {
145 serial_rpmsg_state_t *serialRpmsgHandle;
146
147 assert(serialHandle);
148
149 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
150
151 (void)HAL_RpmsgDeinit((hal_rpmsg_handle_t)serialRpmsgHandle->rpmsgHandleBuffer);
152
153 return kStatus_SerialManager_Success;
154 }
155
156 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
157
Serial_RpmsgWrite(serial_handle_t serialHandle,uint8_t * buffer,uint32_t length)158 serial_manager_status_t Serial_RpmsgWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
159 {
160 serial_manager_callback_message_t msg;
161 serial_rpmsg_state_t *serialRpmsgHandle;
162
163 assert(serialHandle);
164 assert(buffer);
165 assert(length);
166
167 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
168
169 if (kStatus_HAL_RpmsgSuccess !=
170 HAL_RpmsgSend((hal_rpmsg_handle_t)serialRpmsgHandle->rpmsgHandleBuffer, buffer, length))
171 {
172 return kStatus_SerialManager_Error;
173 }
174
175 if (NULL != serialRpmsgHandle->tx.callback)
176 {
177 msg.buffer = buffer;
178 msg.length = length;
179 serialRpmsgHandle->tx.callback(serialRpmsgHandle->tx.param, &msg, kStatus_SerialManager_Success);
180 }
181
182 return kStatus_SerialManager_Success;
183 }
184
Serial_RpmsgWriteBlocking(serial_handle_t serialHandle,uint8_t * buffer,uint32_t length)185 serial_manager_status_t Serial_RpmsgWriteBlocking(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
186 {
187 serial_rpmsg_state_t *serialRpmsgHandle;
188
189 assert(serialHandle);
190 assert(buffer);
191 assert(length);
192
193 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
194
195 if (kStatus_HAL_RpmsgSuccess !=
196 HAL_RpmsgSend((hal_rpmsg_handle_t)serialRpmsgHandle->rpmsgHandleBuffer, buffer, length))
197 {
198 return kStatus_SerialManager_Error;
199 }
200
201 return kStatus_SerialManager_Success;
202 }
203
204 #else /* !SERIAL_MANAGER_NON_BLOCKING_MODE */
205
Serial_RpmsgWrite(serial_handle_t serialHandle,uint8_t * buffer,uint32_t length)206 serial_manager_status_t Serial_RpmsgWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
207 {
208 serial_rpmsg_state_t *serialRpmsgHandle;
209
210 assert(serialHandle);
211 assert(buffer);
212 assert(length);
213
214 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
215
216 if (kStatus_HAL_RpmsgSuccess !=
217 HAL_RpmsgSend((hal_rpmsg_handle_t)serialRpmsgHandle->rpmsgHandleBuffer, buffer, length))
218 {
219 return kStatus_SerialManager_Error;
220 }
221
222 return kStatus_SerialManager_Success;
223 }
224
Serial_RpmsgRead(serial_handle_t serialHandle,uint8_t * buffer,uint32_t length)225 serial_manager_status_t Serial_RpmsgRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
226 {
227 serial_rpmsg_state_t *serialRpmsgHandle;
228
229 assert(serialHandle);
230 assert(buffer);
231 assert(length);
232
233 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
234
235 serialRpmsgHandle->rx.data = buffer;
236 serialRpmsgHandle->rx.len = length;
237 serialRpmsgHandle->rx.sofar = 0;
238
239 while (serialRpmsgHandle->rx.sofar < serialRpmsgHandle->rx.len)
240 ;
241
242 if (0U < serialRpmsgHandle->rx.remain)
243 {
244 /* The received bytes not equal to request. */
245 return kStatus_SerialManager_Error;
246 }
247
248 return kStatus_SerialManager_Success;
249 }
250 #endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */
251
252 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
Serial_RpmsgCancelWrite(serial_handle_t serialHandle)253 serial_manager_status_t Serial_RpmsgCancelWrite(serial_handle_t serialHandle)
254 {
255 assert(serialHandle);
256
257 return kStatus_SerialManager_Success;
258 }
259
Serial_RpmsgInstallTxCallback(serial_handle_t serialHandle,serial_manager_callback_t callback,void * callbackParam)260 serial_manager_status_t Serial_RpmsgInstallTxCallback(serial_handle_t serialHandle,
261 serial_manager_callback_t callback,
262 void *callbackParam)
263 {
264 serial_rpmsg_state_t *serialRpmsgHandle;
265
266 assert(serialHandle);
267
268 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
269
270 serialRpmsgHandle->tx.callback = callback;
271 serialRpmsgHandle->tx.param = callbackParam;
272
273 return kStatus_SerialManager_Success;
274 }
275
Serial_RpmsgInstallRxCallback(serial_handle_t serialHandle,serial_manager_callback_t callback,void * callbackParam)276 serial_manager_status_t Serial_RpmsgInstallRxCallback(serial_handle_t serialHandle,
277 serial_manager_callback_t callback,
278 void *callbackParam)
279 {
280 serial_rpmsg_state_t *serialRpmsgHandle;
281
282 assert(serialHandle);
283
284 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
285
286 serialRpmsgHandle->rx.callback = callback;
287 serialRpmsgHandle->rx.param = callbackParam;
288
289 return kStatus_SerialManager_Success;
290 }
291 #endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */
292
Serial_RpmsgEnterLowpower(serial_handle_t serialHandle)293 serial_manager_status_t Serial_RpmsgEnterLowpower(serial_handle_t serialHandle)
294 {
295 serial_rpmsg_state_t *serialRpmsgHandle;
296
297 assert(serialHandle);
298
299 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
300
301 if (kStatus_HAL_RpmsgSuccess != HAL_RpmsgEnterLowpower((hal_rpmsg_handle_t)serialRpmsgHandle->rpmsgHandleBuffer))
302 {
303 return kStatus_SerialManager_Error;
304 }
305
306 return kStatus_SerialManager_Success;
307 }
308
Serial_RpmsgExitLowpower(serial_handle_t serialHandle)309 serial_manager_status_t Serial_RpmsgExitLowpower(serial_handle_t serialHandle)
310 {
311 serial_rpmsg_state_t *serialRpmsgHandle;
312 assert(serialHandle);
313
314 serialRpmsgHandle = (serial_rpmsg_state_t *)serialHandle;
315
316 if (kStatus_HAL_RpmsgSuccess != HAL_RpmsgExitLowpower((hal_rpmsg_handle_t)serialRpmsgHandle->rpmsgHandleBuffer))
317 {
318 return kStatus_SerialManager_Error;
319 }
320
321 return kStatus_SerialManager_Success;
322 }
323
324 #endif
325