FreeCalypso > hg > fc-tourmaline
comparison src/cs/riviera/rvt/rvt_task.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4e78acac3d88 |
---|---|
1 /************************************************************************** | |
2 * | |
3 * rvt_task.c | |
4 * | |
5 * This contains the core of the Trace task. | |
6 * | |
7 * (C) Texas Instruments, all rights reserved | |
8 * | |
9 * Version number : 0.1 | |
10 * | |
11 * History : 0.1 (7/5/2000) - Created | |
12 * | |
13 * Date : 7/5/2000 | |
14 * | |
15 * Author : Guido Pagana | |
16 * | |
17 * Update : Pascal Puel | |
18 * : David Lamy-Charrier (changes for Riviera 1.6) | |
19 * | |
20 ***************************************************************************/ | |
21 | |
22 | |
23 #include "nucleus.h" | |
24 | |
25 #include "rv/general.h" | |
26 #include "rv/rv_general.h" | |
27 #include "rvf/rvf_api.h" | |
28 #include "rvt/rvt_gen.h" | |
29 #include "rvt/rvt_def_i.h" | |
30 #include "rvt/rvt_env.h" | |
31 #include "rvt/rvt_env_i.h" | |
32 #include "rvm/rvm_use_id_list.h" | |
33 | |
34 #include "uart/serialswitch.h" | |
35 | |
36 #ifndef _WINDOWS | |
37 #include "config/swconfig.cfg" | |
38 #endif | |
39 | |
40 #include <string.h> | |
41 | |
42 extern NU_HISR TI_rcv_HISR; | |
43 | |
44 /* Time (in milliseconds) between two consecutive 'System Time' messages */ | |
45 #ifdef PSEUDO_MODEM_USB | |
46 #define RVT_ALIVE_POLLING_TIME (RVF_MS_TO_TICKS (10000)) | |
47 #elif defined(PSEUDO_MODEM_KEEPALIVE) | |
48 #define RVT_ALIVE_POLLING_TIME (RVF_MS_TO_TICKS (5000)) | |
49 #else | |
50 #define RVT_ALIVE_POLLING_TIME (RVF_MS_TO_TICKS (20000)) | |
51 #endif | |
52 | |
53 #define RVT_WAIT_FOR_HEADER (1) | |
54 #define RVT_WAIT_FOR_DATA (2) | |
55 | |
56 #ifdef PSEUDO_MODEM_KEEPALIVE | |
57 extern void rvt_keepalive_register(void); | |
58 extern void rvt_keepalive_process(void); | |
59 #endif | |
60 | |
61 /********************************************************************************/ | |
62 /* */ | |
63 /* Function Name: rvt_task_core */ | |
64 /* */ | |
65 /* Purpose: Core of Trace task. */ | |
66 /* */ | |
67 /* Input Parameters: */ | |
68 /* None. */ | |
69 /* */ | |
70 /* Output Parameters: */ | |
71 /* None. */ | |
72 /* */ | |
73 /* Global Parameters: */ | |
74 /* None. */ | |
75 /* */ | |
76 /* Note: */ | |
77 /* None. */ | |
78 /* */ | |
79 /********************************************************************************/ | |
80 T_RVM_RETURN rvt_task_core (void) | |
81 { | |
82 UINT16 event = 0; | |
83 UINT32 nb_bytes_sent = 0; | |
84 | |
85 #ifdef PSEUDO_MODEM_KEEPALIVE | |
86 rvt_keepalive_register(); | |
87 #endif | |
88 | |
89 #ifdef FRAMING_PROTOCOL | |
90 | |
91 // Request for the level of filtering, as well as the 32-bit | |
92 // mask related to the software entities to be monitored. | |
93 { | |
94 UINT8 trace_level_request[] = {RVM_INVALID_USE_ID, 0, 0, 0, 0, (RV_TRACE_LEVEL_ERROR - 1), 0, 0, 0, 0}; | |
95 | |
96 // Note that the level is defined as invalid | |
97 trace_level_request[0] = (char) rv_trace_user_id; | |
98 | |
99 // Transmit an 'empty' message | |
100 nb_bytes_sent = 0; | |
101 while (nb_bytes_sent < sizeof (trace_level_request)) | |
102 { | |
103 nb_bytes_sent += SER_tr_WriteNBytes (SER_LAYER_1, | |
104 trace_level_request + nb_bytes_sent, | |
105 sizeof (trace_level_request) - nb_bytes_sent); | |
106 } | |
107 } | |
108 | |
109 // Start the 'Alive Polling Timer' | |
110 #if (OP_WCP == 0) | |
111 rvf_start_timer (RVF_TIMER_0, | |
112 RVT_ALIVE_POLLING_TIME, | |
113 TRUE); | |
114 #endif | |
115 | |
116 for (; | |
117 ; | |
118 ) | |
119 { | |
120 // Infinite wait on 'Trace Task' mailbox or timer events | |
121 event = rvf_wait ((1 << RVT_TRACE_MAILBOX) | (RVF_TIMER_0_EVT_MASK), | |
122 0); | |
123 | |
124 // Check for some messages lost | |
125 if (((rvt_lost_msg_cpt.bit_mask).count >= RVT_MAX_LOST_TRACE_MSG) && (p_rvt_lost_msg)) | |
126 { | |
127 INT8 count = 0; | |
128 UINT8 lost_msg_length = RVT_HDR_LENGTH + RVT_LOST_MSG_LENGTH; | |
129 UINT32 lost_msg_cpt = rvt_lost_msg_cpt.overall_value; | |
130 | |
131 // Append with the number of messages lost | |
132 rvt_lost_msg_cpt.overall_value = 0; | |
133 for (count = 0; | |
134 count < RVT_HEX_VALUE_LENGTH; | |
135 count++) | |
136 { | |
137 p_rvt_lost_msg[lost_msg_length + count] = Num2Char[(UINT8) ((lost_msg_cpt << (count << 2)) >> 28)]; | |
138 } | |
139 lost_msg_length += RVT_HEX_VALUE_LENGTH; | |
140 | |
141 // Send message to the UART with byte stuffing | |
142 nb_bytes_sent = 0; | |
143 while (nb_bytes_sent < lost_msg_length) | |
144 { | |
145 nb_bytes_sent += SER_tr_WriteNBytes (SER_LAYER_1, | |
146 (UINT8 *) p_rvt_lost_msg + nb_bytes_sent, | |
147 lost_msg_length - nb_bytes_sent); | |
148 } | |
149 | |
150 } // End of if ((rvt_lost_msg_cpt.bit_mask).count >= RVT_MAX_LOST_TRACE_MSG) | |
151 | |
152 if (event & EVENT_MASK (RVT_TRACE_MAILBOX)) | |
153 { | |
154 T_RV_HDR *msg = NULL; | |
155 | |
156 // Read the message from the mailbox | |
157 if ((msg = (T_RV_HDR *) rvf_read_mbox (RVT_TRACE_MAILBOX)) != NULL) | |
158 { | |
159 if (msg->msg_id == RVT_TRACE_RQST_ID) | |
160 { | |
161 UINT8 msg_format = 0; | |
162 UINT32 msg_length = 0; | |
163 | |
164 // Get the length | |
165 msg_length = ((T_RVT_TRACE_RQST *) msg)->msg_length; | |
166 | |
167 // Get the format | |
168 msg_format = ((T_RVT_TRACE_RQST *) msg)->format; | |
169 | |
170 // Copy the 'User ID' | |
171 ((UINT8 *) msg + RVT_HEADER_SIZE - 1)[0] = ((T_RVT_TRACE_RQST *) msg)->user_id; | |
172 msg_length++; | |
173 | |
174 switch (msg_format) | |
175 { | |
176 case RVT_ASCII_FORMAT: | |
177 { | |
178 // Send message to the UART without byte stuffing | |
179 nb_bytes_sent = 0; | |
180 while (nb_bytes_sent < msg_length) | |
181 { | |
182 nb_bytes_sent += SER_tr_EncapsulateNChars (SER_LAYER_1, | |
183 (char *) msg + RVT_HEADER_SIZE - 1 + nb_bytes_sent, | |
184 msg_length - nb_bytes_sent); | |
185 } | |
186 break; | |
187 } | |
188 case RVT_BINARY_FORMAT: | |
189 { | |
190 // Send message to the UART with byte stuffing | |
191 nb_bytes_sent = 0; | |
192 while (nb_bytes_sent < msg_length) | |
193 { | |
194 nb_bytes_sent += SER_tr_WriteNBytes (SER_LAYER_1, | |
195 (UINT8 *) msg + RVT_HEADER_SIZE - 1 + nb_bytes_sent, | |
196 msg_length - nb_bytes_sent); | |
197 } | |
198 break; | |
199 } | |
200 default: | |
201 { | |
202 // Increment the number of messages lost. | |
203 // Is the buffer corrupted? | |
204 (rvt_lost_msg_cpt.bit_mask).count++; | |
205 (rvt_lost_msg_cpt.bit_mask).unknown_format = 1; | |
206 break; | |
207 } | |
208 } | |
209 | |
210 // Deallocate the buffer | |
211 rvf_free_buf (msg); | |
212 | |
213 } // End of if (msg->msg_id == RVT_TRACE_RQST_ID) | |
214 | |
215 else | |
216 { | |
217 // Increment the number of messages lost. Is the buffer | |
218 // corrupted? | |
219 (rvt_lost_msg_cpt.bit_mask).count++; | |
220 (rvt_lost_msg_cpt.bit_mask).unknown_request = 1; | |
221 } | |
222 | |
223 } // End of if (msg != NULL) | |
224 | |
225 else | |
226 { | |
227 // Increment the number of messages lost. Is the buffer | |
228 // corrupted? | |
229 (rvt_lost_msg_cpt.bit_mask).count++; | |
230 (rvt_lost_msg_cpt.bit_mask).message_empty = 1; | |
231 } | |
232 | |
233 } // End of if (event & EVENT_MASK (RVT_TRACE_MAILBOX)) | |
234 | |
235 if ((event & (RVF_TIMER_0_EVT_MASK)) && (p_rvt_sys_time)) | |
236 { | |
237 UINT8 count = 0; | |
238 UINT8 sys_time_length = RVT_HDR_LENGTH + RVT_SYS_TIME_LENGTH; | |
239 UINT32 current_time = rvf_get_tick_count (); | |
240 | |
241 // Append with the system time | |
242 for (count = 0; | |
243 count < RVT_HEX_VALUE_LENGTH; | |
244 count++) | |
245 { | |
246 p_rvt_sys_time[sys_time_length + count] = Num2Char[(UINT8) ((current_time << (count << 2)) >> 28)]; | |
247 } | |
248 sys_time_length += RVT_HEX_VALUE_LENGTH; | |
249 | |
250 // Send message to the UART with byte stuffing | |
251 nb_bytes_sent = 0; | |
252 while (nb_bytes_sent < sys_time_length) | |
253 { | |
254 nb_bytes_sent += SER_tr_WriteNBytes (SER_LAYER_1, | |
255 (UINT8 *) p_rvt_sys_time + nb_bytes_sent, | |
256 sys_time_length - nb_bytes_sent); | |
257 } | |
258 | |
259 #ifdef PSEUDO_MODEM_KEEPALIVE | |
260 rvt_keepalive_process(); | |
261 #endif | |
262 | |
263 } // End of if (event & (RVF_TIMER_0_EVT_MASK)) | |
264 } | |
265 #else | |
266 | |
267 // Start the 'Alive Polling Timer' | |
268 #if (OP_WCP == 0) | |
269 rvf_start_timer (RVF_TIMER_0, | |
270 RVT_ALIVE_POLLING_TIME, | |
271 TRUE); | |
272 #endif | |
273 | |
274 for (; | |
275 ; | |
276 ) | |
277 { | |
278 // Infinite wait on 'Trace Task' mailbox or timer events | |
279 event = rvf_wait ((1 << RVT_TRACE_MAILBOX) | (RVF_TIMER_0_EVT_MASK), | |
280 0); | |
281 | |
282 // Check for some messages lost | |
283 if (((rvt_lost_msg_cpt.bit_mask).count >= RVT_MAX_LOST_TRACE_MSG) && (p_rvt_lost_msg)) | |
284 { | |
285 INT8 count = 0; | |
286 UINT8 lost_msg_length = RVT_LOST_MSG_LENGTH; | |
287 UINT32 lost_msg_cpt = rvt_lost_msg_cpt.overall_value; | |
288 | |
289 // Append with the number of messages lost | |
290 rvt_lost_msg_cpt.overall_value = 0; | |
291 for (count = 0; | |
292 count < RVT_HEX_VALUE_LENGTH; | |
293 count ++) | |
294 { | |
295 p_rvt_lost_msg[lost_msg_length + count] = Num2Char[(UINT8) ((lost_msg_cpt << (count << 2)) >> 28)]; | |
296 } | |
297 rvt_lost_msg_length += RVT_HEX_VALUE_LENGTH; | |
298 | |
299 // Append with the '\n' and '\r' characters for the hyper terminal | |
300 p_rvt_lost_msg[lost_msg_length++] = '\n'; | |
301 p_rvt_lost_msg[lost_msg_length++] = '\r'; | |
302 | |
303 // Send the message to the UART without byte stuffing | |
304 nb_bytes_sent = 0; | |
305 while (nb_bytes_sent < lost_msg_length) | |
306 { | |
307 nb_bytes_sent += SER_tr_WriteNChars (SER_LAYER_1, | |
308 (UINT8 *) p_rvt_lost_msg + nb_bytes_sent, | |
309 lost_msg_length - nb_bytes_sent); | |
310 } | |
311 | |
312 } // End of if ((rvt_lost_msg_cpt.bit_mask).count >= RVT_MAX_LOST_TRACE_MSG) | |
313 | |
314 if (event & EVENT_MASK (RVT_TRACE_MAILBOX)) | |
315 { | |
316 T_RV_HDR *msg = NULL; | |
317 | |
318 // Read the message from the mailbox | |
319 if ((msg = (T_RV_HDR *) rvf_read_mbox (RVT_TRACE_MAILBOX)) != NULL) | |
320 { | |
321 if (msg->msg_id == RVT_TRACE_RQST_ID) | |
322 { | |
323 UINT32 msg_length = 0; | |
324 | |
325 // Get the length | |
326 msg_length = ((T_RVT_TRACE_RQST *) msg)->msg_length; | |
327 | |
328 // Send message to the UART without byte stuffing | |
329 nb_bytes_sent = 0; | |
330 while (nb_bytes_sent < msg_length) | |
331 { | |
332 nb_bytes_sent += SER_tr_WriteNChars (SER_LAYER_1, | |
333 msg + RVT_HEADER_SIZE + nb_bytes_sent, | |
334 msg_length - nb_bytes_sent); | |
335 } | |
336 | |
337 // Append with the '\n' and '\r' characters for the hyper terminal | |
338 msg_length = 0; | |
339 msg[msg_length++] = '\n'; | |
340 msg[msg_length++] = '\r'; | |
341 | |
342 // Send message to the UART without byte stuffing | |
343 nb_bytes_sent = 0; | |
344 while (nb_bytes_sent < msg_length) | |
345 { | |
346 nb_bytes_sent += SER_tr_WriteNChars (SER_LAYER_1, | |
347 msg + nb_bytes_sent, | |
348 msg_length - nb_bytes_sent); | |
349 } | |
350 | |
351 // Deallocate the buffer | |
352 rvf_free_buf (msg); | |
353 | |
354 } // End of if (msg->msg_id == RVT_TRACE_RQST_ID) | |
355 | |
356 else | |
357 { | |
358 // Increment the number of messages lost. Is the buffer | |
359 // corrupted? | |
360 (rvt_lost_msg_cpt.bit_mask).count++; | |
361 (rvt_lost_msg_cpt.bit_mask).unknown_request = 1; | |
362 } | |
363 | |
364 } // End of if (msg != NULL) | |
365 | |
366 else | |
367 { | |
368 // Increment the number of messages lost. Is the buffer | |
369 // corrupted? | |
370 (rvt_lost_msg_cpt.bit_mask).count++; | |
371 (rvt_lost_msg_cpt.bit_mask).message_empty = 1; | |
372 } | |
373 | |
374 } // End of if (event & EVENT_MASK (RVT_TRACE_MAILBOX)) | |
375 | |
376 if ((event & (RVF_TIMER_0_EVT_MASK)) && (p_rvt_sys_time)) | |
377 { | |
378 UINT8 count = 0; | |
379 UINT8 sys_time_length = RVT_SYS_TIME_LENGTH; | |
380 UINT32 current_time = rvf_get_tick_count (); | |
381 | |
382 // Append with the system time | |
383 for (count = 0; | |
384 count < RVT_HEX_VALUE_LENGTH; | |
385 count++) | |
386 { | |
387 p_rvt_sys_time[sys_time_length + count] = Num2Char[(UINT8) ((current_time << (count << 2)) >> 28)]; | |
388 } | |
389 sys_time_length += RVT_HEX_VALUE_LENGTH; | |
390 | |
391 // Append with the '\n' and '\r' characters for the hyper terminal | |
392 p_rvt_sys_time[sys_time_length++] = '\n'; | |
393 p_rvt_sys_time[sys_time_length++] = '\r'; | |
394 | |
395 // Send message to the UART without byte stuffing | |
396 nb_bytes_sent = 0; | |
397 while (nb_bytes_sent < sys_time_length) | |
398 { | |
399 nb_bytes_sent += SER_tr_WriteNChars (SER_LAYER_1, | |
400 (UINT8 *) p_rvt_sys_time + nb_bytes_sent, | |
401 sys_time_length - nb_bytes_sent); | |
402 } | |
403 | |
404 } // End of if (event & (RVF_TIMER_0_EVT_MASK)) | |
405 } | |
406 #endif | |
407 } | |
408 | |
409 | |
410 /********************************************************************************/ | |
411 /* */ | |
412 /* Function Name: rvt_RX_process */ | |
413 /* */ | |
414 /* Purpose: This function is called when characters are received */ | |
415 /* on the serial port on receive HISR. */ | |
416 /* */ | |
417 /* Input Parameters: */ | |
418 /* None. */ | |
419 /* */ | |
420 /* Output Parameters: */ | |
421 /* None. */ | |
422 /* */ | |
423 /* Global Parameters: */ | |
424 /* None. */ | |
425 /* */ | |
426 /* Note: */ | |
427 /* None. */ | |
428 /* */ | |
429 /********************************************************************************/ | |
430 void rvt_RX_process (void) | |
431 { | |
432 UINT32 bytesRead; | |
433 static UINT8 inBuffer[255]; | |
434 | |
435 #ifdef FRAMING_PROTOCOL | |
436 BOOL eof = 0; | |
437 static UINT8 rcv_state = RVT_WAIT_FOR_HEADER; | |
438 static UINT32 total_bytesRead = 0; | |
439 static RVT_CALLBACK_FUNC rx_callback_func = NULL; | |
440 | |
441 // Get all bytes from the UART RX FIFO | |
442 for (; | |
443 ; | |
444 ) | |
445 { | |
446 // Read and destuff the UART RX FIFO and fill inBuffer with received | |
447 // bytes | |
448 bytesRead = SER_tr_ReadNBytes (SER_LAYER_1, | |
449 (char *) (inBuffer + total_bytesRead), | |
450 sizeof (inBuffer) - total_bytesRead, | |
451 &eof); | |
452 | |
453 // Check for the header. Hence, get the sendee | |
454 if ((rcv_state == RVT_WAIT_FOR_HEADER) && \ | |
455 (bytesRead) && \ | |
456 !(total_bytesRead)) | |
457 { | |
458 if ((inBuffer[0] >= RVT_RV_HEADER) && | |
459 (inBuffer[0] <= RVT_KEEPALIVE_HEADER)) | |
460 { | |
461 UINT8 idtab = 0; | |
462 | |
463 // Search for the ID in the table | |
464 for (idtab = 0; | |
465 rvt_user_db[idtab].user_id != RVT_INVALID_HEADER; | |
466 idtab++) | |
467 { | |
468 if (rvt_user_db[idtab].user_id == inBuffer[0]) | |
469 { | |
470 rx_callback_func = rvt_user_db[idtab].rx_callback_func; | |
471 break; | |
472 } | |
473 } | |
474 rcv_state = RVT_WAIT_FOR_DATA; | |
475 } | |
476 } | |
477 | |
478 // Update the total number of bytes read, regarding the current frame | |
479 total_bytesRead += bytesRead; | |
480 | |
481 // Call the corresponding callback function when a complete message is | |
482 // received (eof odd) | |
483 if (eof & 0x01) | |
484 { | |
485 // Invoke the callback function | |
486 if (rx_callback_func != NULL) | |
487 { | |
488 rx_callback_func ((T_RVT_BUFFER) (inBuffer + 1), | |
489 total_bytesRead - 1); | |
490 rx_callback_func = NULL; | |
491 } | |
492 | |
493 // Wait for the next frame to come | |
494 rcv_state = RVT_WAIT_FOR_HEADER; | |
495 total_bytesRead = 0; | |
496 } | |
497 | |
498 // inBuffer may be full due to some synchro lost problems | |
499 else if (total_bytesRead == sizeof (inBuffer)) | |
500 { | |
501 // If still waiting for the header, discard received characters and | |
502 // reset static variables for the next frame to come | |
503 if (rcv_state == RVT_WAIT_FOR_HEADER) | |
504 { | |
505 total_bytesRead = 0; | |
506 break; | |
507 } | |
508 | |
509 // Just discard characters received as payload | |
510 total_bytesRead = sizeof (inBuffer[0]); | |
511 } | |
512 | |
513 // Proceed with the next concatenated frame whether more bytes left | |
514 if (eof > 1) | |
515 { | |
516 continue; | |
517 } | |
518 break; | |
519 } | |
520 #else | |
521 | |
522 // Read the UART RX FIFO and fill inBuffer with received bytes | |
523 bytesRead = SER_tr_ReadNChars (SER_LAYER_1, | |
524 (char *) inBuffer, | |
525 sizeof (inBuffer)); | |
526 | |
527 // Invoke the Testmode callback function : this is the only one able, | |
528 // for the moment, to send an external command !! WARNING : This | |
529 // should be the same name than the one already registered in | |
530 // create_RVtasks.c. | |
531 tm_receive ((T_RVT_BUFFER) inBuffer, | |
532 bytesRead); | |
533 #endif | |
534 } | |
535 | |
536 | |
537 | |
538 /********************************************************************************/ | |
539 /* */ | |
540 /* Function Name: rvt_activate_RX_HISR */ | |
541 /* */ | |
542 /* Purpose: This function is called when an RX interrupt occurs. */ | |
543 /* */ | |
544 /* Input Parameters: */ | |
545 /* None. */ | |
546 /* */ | |
547 /* Output Parameters: */ | |
548 /* None. */ | |
549 /* */ | |
550 /* Global Parameters: */ | |
551 /* None. */ | |
552 /* */ | |
553 /* Note: */ | |
554 /* None. */ | |
555 /* */ | |
556 /********************************************************************************/ | |
557 void rvt_activate_RX_HISR (void) | |
558 { | |
559 NU_Activate_HISR (&TI_rcv_HISR); | |
560 } |