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