comparison gpf/tst/DRV/tr2.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
comparison
equal deleted inserted replaced
-1:000000000000 0:509db1a7b7b8
1 /*
2 +------------------------------------------------------------------------------
3 | File: tr.c
4 +------------------------------------------------------------------------------
5 | Copyright 2004 Texas Instruments Deutschland, AG
6 | All rights reserved.
7 |
8 | This file is confidential and a trade secret of Texas
9 | Instruments Berlin, AG
10 | The receipt of or possession of this file does not convey
11 | any rights to reproduce or disclose its contents or to
12 | manufacture, use, or sell anything it may describe, in
13 | whole, or in part, without the specific written consent of
14 | Texas Instruments Deutschland, AG.
15 +-----------------------------------------------------------------------------
16 | Purpose : This Modul contains the TR driver
17 +-----------------------------------------------------------------------------
18 */
19
20 #ifndef __TR_C__
21 #define __TR_C__
22 #endif
23
24 #include "string.h"
25 #include "typedefs.h"
26 #include "gdi.h"
27 #include "vsi.h"
28 #include "os.h"
29 #ifdef _TOOLS_
30 #include <stdio.h>
31 #include "glob_defs.h"
32 #include "tstdriver.h"
33 #include "frame.h"
34 #include "frame_const.h"
35 #include "printtofile.h"
36 #endif /* _TOOLS_ */
37 #include "tstheader.h"
38 #include "tst_mux.h"
39
40
41 /*==== TYPES ======================================================*/
42
43 typedef struct
44 {
45 T_VOID_STRUCT *RcvBuffer;
46 USHORT Handle;
47 USHORT EnabledSignalType;
48 T_DRV_CB_FUNC Callback;
49 USHORT config;
50 UBYTE rcv_state;
51 UBYTE idle_state;
52 } T_TR_DATA;
53
54
55 /*==== CONSTANTS ==================================================*/
56
57 #define ALLOWED_TR_SIGNALS (DRV_SIGTYPE_READ|DRV_SIGTYPE_CONNECT|DRV_SIGTYPE_DISCONNECT)
58
59 #define STX 0x02
60 #define TI_RIV_ID 0x11
61 #define TI_L1_ID 0x12
62 #define TI_L23_ID 0x13
63 #define TI_STX 0x02
64 #define TI_ESC 0x10
65 #define CHAR_ABORT 'A'
66
67 #define DATA_SEGMENT_SIZE 223
68
69 #define WAIT_FOR_STX 0
70 #define WAIT_FOR_IDENT 1
71 #define WAIT_FOR_TIMESTAMP 2
72 #define WAIT_FOR_LENGTH 3
73 #define WAIT_FOR_SND 4
74 #define WAIT_FOR_RCV 5
75 #define WAIT_FOR_DATA 6
76 #define WAIT_FOR_CR 7
77 #define WAIT_FOR_TI_ID 8
78 #define WAIT_FOR_TI_LEN_0 9
79 #define WAIT_FOR_TI_LEN_1 10
80 #define WAIT_FOR_TI_LEN_2 11
81 #define WAIT_FOR_LENGTH1 12
82 #define WAIT_FOR_LENGTH2 13
83 #define WAIT_FOR_RAW_TI_S 14
84 #define WAIT_FOR_RAW_TI_ID 15
85 #define WAIT_FOR_RAW_TI_E 16
86
87 #define WAIT_FOR_MUX_START_STX 1
88 #define WAIT_FOR_MUX_CHAN_ID 2
89 #define WAIT_FOR_MUX_END_STX 3
90
91 #define STX_LF_MODE 0x0001
92 #define TI_TRC_MODE 0x0002
93 #define TI_RAW_TRC_MODE 0x0004
94
95 /*==== EXTERNALS ==================================================*/
96
97 extern ULONG TR_RcvBufferSize;
98 extern ULONG TR_MaxInd;
99 extern USHORT ext_data_pool_handle;
100 extern T_TST_MUX_CHANNEL tst_mux_chan_struct[];
101
102 /*==== VARIABLES ==================================================*/
103
104 #ifndef RUN_INT_RAM
105 #ifndef _TARGET_
106 long int accessNum = 0;
107 #endif
108 T_TR_DATA TR_Data;
109 static char *TR_RcvBuffer;
110 static ULONG TR_EndInd;
111 static ULONG TR_WrInd;
112 static ULONG TR_RdInd;
113 static ULONG MessageLength;
114 static union {
115 unsigned short int val;
116 char part[2];
117 }tst_trailer_size;
118 #else
119 extern T_TR_DATA TR_Data;
120 #endif
121
122 #ifdef _TOOLS_
123 static int ti_id_not_found;
124 static int ti_esc_skipped;
125 extern int tst_message_received;
126 #else
127 extern ULONG MaxPrimPartSize;
128 #endif
129
130 /*==== FUNCTIONS ==================================================*/
131
132 #ifndef RUN_INT_RAM
133 USHORT TR_Write ( void *Buffer, ULONG *BytesToWrite );
134 #endif
135
136 #ifndef RUN_INT_RAM
137 /*
138 +--------------------------------------------------------------------+
139 | PROJECT : GSM-Frame (8415) MODULE : TR |
140 | STATE : code ROUTINE : TR_Exit |
141 +--------------------------------------------------------------------+
142
143 PURPOSE : exit a driver
144
145 */
146 LOCAL void TR_Exit ( void )
147 {
148 os_DeallocateMemory ( 0, TR_Data.RcvBuffer );
149 }
150 #endif
151
152 #ifndef RUN_INT_RAM
153 /*
154 +--------------------------------------------------------------------+
155 | PROJECT : GSM-Frame (8415) MODULE : TR |
156 | STATE : code ROUTINE : TR_Read |
157 +--------------------------------------------------------------------+
158
159 PURPOSE : read data from driver
160
161 */
162 LOCAL USHORT TR_Read ( void *Buffer, ULONG *BytesToRead )
163 {
164 ULONG Space = TR_EndInd - (TR_RdInd & TR_MaxInd);
165 static ULONG bytes_read;
166
167 if ( *BytesToRead == 0 )
168 {
169 *BytesToRead = MessageLength;
170 bytes_read = 0;
171 }
172 else
173 {
174 if ( Space > *BytesToRead )
175 {
176 memcpy ( Buffer, &TR_RcvBuffer[TR_RdInd&TR_MaxInd], *BytesToRead );
177 bytes_read += *BytesToRead;
178 }
179 else
180 {
181 memcpy ( Buffer, &TR_RcvBuffer[TR_RdInd&TR_MaxInd], (unsigned int)Space );
182 *BytesToRead = Space;
183 bytes_read += Space;
184 }
185 TR_RdInd += *BytesToRead;
186 if ( TR_Data.config & STX_LF_MODE )
187 if ( bytes_read == MessageLength )
188 TR_RdInd++; /* skip th LF, its not read by the TIF driver */
189 }
190 return DRV_OK;
191 }
192 #endif
193
194 #ifndef RUN_INT_RAM
195 /*
196 +--------------------------------------------------------------------+
197 | PROJECT : GSM-Frame (8415) MODULE : TR |
198 | STATE : code ROUTINE : TR_Write |
199 +--------------------------------------------------------------------+
200
201 PURPOSE : write data to driver
202
203 */
204 USHORT TR_Write ( void *Buffer, ULONG *BytesToWrite )
205 {
206 char *snd_ptr = (char*)Buffer;
207 ULONG btw;
208 char ti_mode_header[2];
209
210 ti_mode_header[0] = TI_STX;
211 ti_mode_header[1] = TI_L23_ID;
212
213 #ifdef _TOOLS_
214 btw=(*BytesToWrite) & ~PRIM_FLAG_MASK;
215 #else
216 btw=(*BytesToWrite);
217 #endif
218
219 #ifdef _TOOLS_
220 if (TR_Data.config & TI_RAW_TRC_MODE)
221 {
222 ULONG full_btw, segment_size;
223 /*lint -e813, suppress Info 813: auto variable 'osver' has size '148' */
224 char segment[DATA_SEGMENT_SIZE*2+3];
225 /*lint +e813 */
226 ULONG q;
227
228 full_btw=btw;
229 while (full_btw)
230 {
231 btw= (full_btw>DATA_SEGMENT_SIZE) ? DATA_SEGMENT_SIZE : full_btw;
232
233 /* fill in leading bytes */
234 segment_size=0;
235 segment[segment_size++]=TI_STX;
236 segment[segment_size++]=TI_L23_ID;
237
238 /* fill in payload bytes */
239 for (q=0; q<btw; q++)
240 {
241 /* evtl insert TI_ESC characters */
242 if (snd_ptr[q]==TI_STX || snd_ptr[q]==TI_ESC)
243 {
244 segment[segment_size++]=TI_ESC;
245 }
246 segment[segment_size++]=snd_ptr[q];
247 }
248
249 /* fill in trailing bytes */
250 segment[segment_size++]=TI_STX;
251
252 /* write segment */
253 if ( vsi_d_write ( TR_Data.Handle, 0, (void*)segment, segment_size) != VSI_OK )
254 {
255 return DRV_INTERNAL_ERROR;
256 }
257
258 full_btw=full_btw-btw;
259 if (full_btw)
260 {
261 snd_ptr=snd_ptr+btw;
262
263 /* let the ti driver on target handle the byte-block */
264 vsi_t_sleep ( 0, 100 );
265 }
266 }
267
268 return DRV_OK;
269 }
270 #endif /* _TOOLS_ */
271
272 /*
273 * To avoid reallocation and memcpy() the STX is written in front of the passed
274 * data. This works as long as the sizeof(T_SYST_HEADER) is bigger than the header
275 * sent via the test interface.
276 */
277 if ( TR_Data.config & STX_LF_MODE )
278 {
279 btw=(*BytesToWrite) & ~PRIM_FLAG_MASK; /* not really generic, but we need to mask here */
280 /* we assume that the TITRC driver is not below */
281 if ( *BytesToWrite & PRIM_DATA_FLAG ) /* primitive data -> LF at the end */
282 {
283 *(snd_ptr+btw) = '\n';
284 btw = btw + 1;
285 }
286 else if ( *BytesToWrite & PRIM_HEADER_FLAG ) /* primitive header -> add STX in front */
287 {
288 snd_ptr--; /* it is posible to add STX because the first */
289 *snd_ptr = STX; /* byte of TST_SMALL_HEADER/TST_BIG_HEADER in unused */
290 btw = btw + 1;
291 }
292 else /* trace -> STX in front, LF at the end */
293 {
294 *(snd_ptr+btw) = '\n';
295 snd_ptr--;
296 *snd_ptr = STX;
297 btw = btw + 2;
298 }
299 }
300
301 /* Add mux STX and channel id if not already in */
302 if (TR_Data.config & TI_RAW_TRC_MODE && *snd_ptr != TI_STX )
303 {
304 if ( vsi_d_write ( TR_Data.Handle, 0, (void*)ti_mode_header, 2) != VSI_OK )
305 {
306 return DRV_INTERNAL_ERROR;
307 }
308 }
309
310 if ( vsi_d_write ( TR_Data.Handle, 0, (void*)snd_ptr, btw) != VSI_OK )
311 {
312 return DRV_INTERNAL_ERROR;
313 }
314
315 return DRV_OK;
316 }
317 #endif
318
319 #ifndef RUN_INT_RAM
320 /*
321 +--------------------------------------------------------------------+
322 | PROJECT : GSM-Frame (8415) MODULE : TR |
323 | STATE : code ROUTINE : TR_SetSignal |
324 +--------------------------------------------------------------------+
325
326 PURPOSE : enable signal for the driver
327
328 */
329 LOCAL USHORT TR_SetSignal ( USHORT SignalType )
330 {
331 if ( !(SignalType & ALLOWED_TR_SIGNALS) )
332 return DRV_INVALID_PARAMS;
333 else
334 TR_Data.EnabledSignalType |= SignalType;
335
336 return DRV_OK;
337 }
338 #endif
339
340 #ifndef RUN_INT_RAM
341 /*
342 +--------------------------------------------------------------------+
343 | PROJECT : GSM-Frame (8415) MODULE : TR |
344 | STATE : code ROUTINE : TR_ResetSignal |
345 +--------------------------------------------------------------------+
346
347 PURPOSE : disable signal for the driver
348
349 */
350 LOCAL USHORT TR_ResetSignal ( USHORT SignalType )
351 {
352 if ( !(SignalType & ALLOWED_TR_SIGNALS) )
353 return DRV_INVALID_PARAMS;
354 else
355 TR_Data.EnabledSignalType &= ~SignalType;
356
357 return DRV_OK;
358 }
359 #endif
360
361 #ifndef RUN_INT_RAM
362 /*
363 +--------------------------------------------------------------------+
364 | PROJECT : GSM-Frame (8415) MODULE : TR |
365 | STATE : code ROUTINE : TR_SetConfig |
366 +--------------------------------------------------------------------+
367
368 PURPOSE : set configuration for the driver
369
370 */
371 LOCAL USHORT TR_SetConfig ( char *Buffer )
372 {
373 if ( !strcmp ( TR_STX_LF, Buffer ) )
374 {
375 TR_Data.config = STX_LF_MODE;
376 TR_Data.rcv_state = WAIT_FOR_STX;
377 TR_Data.idle_state = WAIT_FOR_STX;
378 #ifdef _TOOLS_
379 printf ("TR: STX mode enabled\n");
380 #endif /* _TOOLS_ */
381 return DRV_OK;
382 }
383 #ifdef _TOOLS_
384 else if ( !strcmp ( DRV_TI_MODE, Buffer ) )
385 {
386 TR_Data.config = TI_TRC_MODE;
387 TR_Data.rcv_state = WAIT_FOR_TI_ID;
388 TR_Data.idle_state = WAIT_FOR_TI_ID;
389 printf ("TR: TI mode enabled\n");
390 return DRV_OK;
391 }
392 #endif /* _TOOLS_ */
393 else if ( !strcmp ( DRV_RAW_TI_MODE, Buffer ) )
394 {
395 TR_Data.config = TI_RAW_TRC_MODE;
396 TR_Data.rcv_state = WAIT_FOR_RAW_TI_S;
397 TR_Data.idle_state = WAIT_FOR_RAW_TI_S;
398 #ifdef _TOOLS_
399 printf ("TR: raw TI mode enabled\n");
400 #endif
401 return DRV_OK;
402 }
403 else if ( !strcmp ( DRV_DEFAULT, Buffer ) )
404 {
405 TR_Data.config = 0;
406 TR_Data.rcv_state = WAIT_FOR_IDENT;
407 TR_Data.idle_state = WAIT_FOR_IDENT;
408 #ifdef _TOOLS_
409 accessNum++;
410 PrintToFile("TR: default mode selected __________________________ (%d)\n", accessNum);
411 #endif /* _TOOLS_ */
412 return DRV_OK;
413 }
414 else
415 return DRV_INVALID_PARAMS;
416 }
417 #endif
418
419 #ifndef RUN_INT_RAM
420 /*
421 +--------------------------------------------------------------------+
422 | PROJECT : GSM-Frame (8415) MODULE : TR |
423 | STATE : code ROUTINE : Callback |
424 +--------------------------------------------------------------------+
425
426 PURPOSE : callback function of the driver
427
428 */
429 /*lint -esym(644,infoByteAddr) suppress warning -- Symbol 'infoByteAddr' may not have been initialized */
430 LOCAL void TR_Callback ( T_DRV_SIGNAL *Signal )
431 {
432 static T_DRV_SIGNAL TR_Signal;
433 static USHORT counter = 0;
434 static char* infoByteAddr;
435 int tr_abort_discard;
436 int tr_abort;
437 unsigned char c;
438 ULONG i;
439 ULONG BytesToRead;
440 ULONG BytesRead = 0;
441 ULONG TR_WorkInd;
442 ULONG Bytes = 0;
443 USHORT continue_read;
444 //#ifdef _TOOLS_
445 static unsigned int ti_len = 0;
446 static char ti_id = 0;
447 static int sigtype = 0;
448 static int lf_found;
449 static int crlf_found;
450 static U8 mux_chan_id;
451 static U8 mux_chan = 0;
452 static U8 mux_status = WAIT_FOR_MUX_CHAN_ID;
453 static int stuffed_byte;
454 //#endif
455
456 tr_abort_discard = 0;
457 tr_abort = 0;
458 TR_Signal.SignalType = 0;
459 switch ( Signal->SignalType )
460 {
461 case DRV_SIGTYPE_READ:
462 BytesToRead = TR_EndInd - TR_WrInd;
463 TR_WorkInd = TR_WrInd;
464
465 do
466 {
467 Bytes = 0;
468 do
469 {
470 continue_read = 0;
471 /*
472 * write counter must not overtake the read counter. If more bytes to be read
473 * than space available, then process the bytes in the buffer first and then
474 * continue to store new data in the TR_RcvBuffer.
475 */
476 if ( TR_WrInd >= (TR_RdInd&TR_MaxInd) )
477 BytesToRead = TR_EndInd - TR_WrInd;
478 else
479 BytesToRead = (TR_RdInd&TR_MaxInd) - TR_WrInd;
480 BytesRead = BytesToRead;
481 vsi_d_read ( TR_Data.Handle, 0, (void*)&TR_RcvBuffer[TR_WrInd], &BytesRead );
482 Bytes += BytesRead;
483 if ( BytesRead < BytesToRead )
484 {
485 TR_WrInd += BytesRead;
486 }
487 else
488 {
489 if ( TR_WrInd >= (TR_RdInd&TR_MaxInd) )
490 TR_WrInd = 0;
491 else
492 {
493 TR_WrInd += BytesRead;
494 continue_read = 1;
495 break;
496 }
497 }
498 } while ( BytesRead != TR_RcvBufferSize && BytesRead == BytesToRead );
499
500 if ( Bytes )
501 {
502 UBYTE cMasked;
503
504 i=0;
505
506 while (i++ < Bytes)
507 {
508 c = TR_RcvBuffer[(TR_WorkInd++) & TR_MaxInd];
509
510 #ifdef _TOOLS_
511 if (TR_Data.config & TI_RAW_TRC_MODE) /* we are receiving rawly in TI mode */
512 {
513 if (!ti_esc_skipped && c==TI_ESC)
514 {
515 /* the TI driver has inserted an TI_ESC -> skip it */
516 ULONG q;
517 for (q=TR_WorkInd-1; q>TR_RdInd; q--)
518 {
519 TR_RcvBuffer[q & TR_MaxInd]=TR_RcvBuffer[(q-1) & TR_MaxInd];
520 }
521 TR_RdInd++;
522 ti_esc_skipped=1;
523 continue;
524 }
525 ti_esc_skipped=0;
526 }
527 #endif /* _TOOLS_ */
528
529 if ( tr_abort_discard == 1 )
530 {
531 TR_RdInd++;
532 continue;
533 }
534 switch (TR_Data.rcv_state)
535 {
536 case WAIT_FOR_STX:
537 if (c == STX)
538 {
539 #ifdef _TOOLS_
540 ti_len=0;
541 #endif
542 TR_Data.rcv_state = WAIT_FOR_IDENT;
543 TR_RdInd = TR_WorkInd; /* do not pass the STX to TIF */
544 }
545 else
546 TR_RdInd++;
547 break;
548 //#ifdef _TOOLS_
549 case WAIT_FOR_RAW_TI_S:
550 if (c==TI_STX)
551 {
552 TR_Data.rcv_state=WAIT_FOR_RAW_TI_ID;
553 TR_RdInd = TR_WorkInd; /* do not read TI_STX */
554 }
555 break;
556 case WAIT_FOR_RAW_TI_ID:
557 if (c==TI_STX)
558 {
559 // last TI_STX was end ID -> ignore this start ID
560 }
561 else if (c==TI_L23_ID)
562 {
563 ti_len = 0;
564 ti_id = c;
565 TR_Data.rcv_state=WAIT_FOR_IDENT;
566 }
567 else if (c == TI_L1_ID || c == TI_RIV_ID)
568 {
569 ti_len = 0;
570 ti_id = c;
571
572 if (ti_id == TI_L1_ID)
573 sigtype = DRV_SIGTYPE_READ_L1;
574 if (ti_id == TI_RIV_ID)
575 sigtype = DRV_SIGTYPE_READ_RIV;
576
577 counter = 0;
578 TR_RdInd = TR_WorkInd; /* do not read ti_id */
579 crlf_found = 0;
580 lf_found = 0;
581 TR_Data.rcv_state=WAIT_FOR_RAW_TI_E;
582 }
583 else
584 {
585 mux_chan_id = c;
586 if ( mux_status == WAIT_FOR_MUX_CHAN_ID )
587 {
588 for ( mux_chan = 0; mux_chan < MAX_TST_CHANNEL; mux_chan++ )
589 {
590 if ( tst_mux_chan_struct[mux_chan].channel_id == c )
591 {
592 mux_status = WAIT_FOR_MUX_END_STX;
593 tst_mux_chan_struct[mux_chan].rcv_data_ptr = &TR_RcvBuffer[(TR_WorkInd) & TR_MaxInd];
594 tst_mux_chan_struct[mux_chan].rcv_data_size = 0;
595 stuffed_byte = 0;
596 TR_RdInd = TR_WorkInd; /* do not read id */
597 TR_Data.rcv_state=WAIT_FOR_RAW_TI_E;
598 break;
599 }
600 }
601 }
602 }
603 break;
604 #ifdef _TOOLS_
605 case WAIT_FOR_TI_ID:
606 /* skip TI ID byte */
607 if (c == TI_L23_ID || c == TI_L1_ID || c == TI_RIV_ID)
608 {
609 ti_len = 0;
610 ti_id = c;
611 TR_Data.rcv_state = WAIT_FOR_TI_LEN_0;
612 }
613 else
614 {
615 ti_id_not_found = 1;
616 }
617 break;
618 case WAIT_FOR_TI_LEN_0:
619 /*
620 * skip length
621 * if length byte == 0 then the next 2 bytes are the length
622 * (patch to handle messages longer than 255 bytes)
623 */
624 if ( c != 0 )
625 {
626 if (ti_id == TI_L23_ID)
627 TR_Data.rcv_state = WAIT_FOR_IDENT;
628
629 if (ti_id == TI_L1_ID || ti_id == TI_RIV_ID)
630 {
631 if (ti_id == TI_L1_ID)
632 sigtype = DRV_SIGTYPE_READ_L1;
633 if (ti_id == TI_RIV_ID)
634 sigtype = DRV_SIGTYPE_READ_RIV;
635
636 TR_Data.rcv_state = WAIT_FOR_DATA;
637 counter = 0;
638 TR_RdInd += 2; /* do not read ti_id and length */
639 crlf_found = 0;
640 lf_found = 0;
641 }
642 ti_len = c & 0xff;
643 }
644 else
645 TR_Data.rcv_state = WAIT_FOR_TI_LEN_1;
646
647 break;
648 case WAIT_FOR_TI_LEN_1:
649 ti_len = c ;
650 TR_Data.rcv_state = WAIT_FOR_TI_LEN_2;
651 break;
652 case WAIT_FOR_TI_LEN_2:
653 ti_len |= c << 8;
654 TR_Data.rcv_state = WAIT_FOR_IDENT;
655 break;
656 #endif /* ifdef _TOOLS_ */
657
658 case WAIT_FOR_IDENT:
659 infoByteAddr = &TR_RcvBuffer[(TR_WorkInd - 1) & TR_MaxInd];
660 /* analyze INFO Byte */
661 cMasked = (c & HDR_VERSION_MASK);
662 #ifdef _TOOLS_
663 if (cMasked == HDR_VALID_VERSION_0)
664 {
665 i--; TR_WorkInd--;
666 printf ("TR: changed to OLD header format automatically\n");
667 // tst_drv_write ( NO_TASK, SYS_MASK, FRM_TST_NAME, (char*)SYSPRIM_GET_STACK_TIME );
668 break;
669 }
670 /* check for lost bytes on interface */
671 if (TR_Data.config & TI_TRC_MODE ||
672 TR_Data.config & TI_RAW_TRC_MODE) /* we are receiving from a arm 7 TARGET */
673 { /* TR_WorkInd refs position of first size byte now */
674 if (ti_id_not_found)
675 {
676 *infoByteAddr = (( *infoByteAddr & ~HDR_IDENT_MASK) | IDENT_ABORT); /* mark as bad */
677 }
678 }
679 #endif /* ifdef _TOOLS_ */
680 cMasked = (c & HDR_IDENT_MASK);
681 if (((cMasked == IDENT_PS_PRIM) || (cMasked == IDENT_SYS_PRIM) ||
682 (cMasked == IDENT_ABORT) || (cMasked == IDENT_TRACE))
683 &&
684 ((c != PROT_PRIM_ID) && (c != PROT_PRIM_ID_32BIT) &&
685 (c != SYS_PRIM_ID) && (c != TRACE_ID))
686 )
687 {
688 /* Hey fine, everything went OK! */
689 TR_Data.rcv_state = WAIT_FOR_LENGTH1;
690 }
691 else
692 { /* we have to fake a length for abort trace */
693 tst_trailer_size.part[0] = TST_HEADER_LEADING_FIELDS;
694 tst_trailer_size.part[1] = 0;
695 MessageLength = tst_trailer_size.val + TST_HEADER_TRAILING_FIELDS;
696
697 *infoByteAddr = (( *infoByteAddr & ~HDR_IDENT_MASK) | IDENT_ABORT); /* mark as bad */
698 counter = tst_trailer_size.val; /* don't let us read all the following bytes before let TIF tracing ABORT */
699 TR_Data.rcv_state = WAIT_FOR_DATA;
700 tr_abort = 1;
701 }
702 TR_RdInd = TR_WorkInd - 1; /* skip all preceeding interface sync bytes before triggering TIF */
703 break;
704 case WAIT_FOR_LENGTH1:
705 /* the use of the union does rely on identical byte sex! */
706 #ifdef _SOLARIS_
707 /* temporary hack */
708 tst_trailer_size.part[1] = c;
709 #else
710 tst_trailer_size.part[0] = c;
711 #endif
712 TR_Data.rcv_state = WAIT_FOR_LENGTH2;
713 break;
714 case WAIT_FOR_LENGTH2:
715 #ifdef _SOLARIS_
716 /* temporary hack */
717 tst_trailer_size.part[0] = c;
718 #else
719 tst_trailer_size.part[1] = c;
720 #endif
721 /* Bytes after size + bytes till size (inclusive) */
722 MessageLength = tst_trailer_size.val + TST_HEADER_LEADING_FIELDS;
723 #ifdef _TOOLS_
724 /* In case of a lost character the two length information elements mismatch. */
725 if ( (ti_len != 0) && (tst_trailer_size.val != (ti_len - 3)) )
726 {
727 tst_trailer_size.val = ti_len - 3;
728 }
729 ti_len = 0;
730 if ((tst_trailer_size.val - TST_HEADER_TRAILING_FIELDS) > (unsigned short int)(MAX_PRIM_PARTITION_SIZE - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER)))
731 {
732 *infoByteAddr = (( *infoByteAddr & ~HDR_IDENT_MASK) | IDENT_ABORT); /* mark as bad */
733 tst_trailer_size.val = (MAX_PRIM_PARTITION_SIZE - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER) -TST_HEADER_TRAILING_FIELDS);
734 counter = tst_trailer_size.val; /* don't let us read all the following bytes before let TIF tracing ABORT */
735 tr_abort = 1;
736 }
737 #else
738 if ((tst_trailer_size.val - TST_HEADER_TRAILING_FIELDS) > (unsigned short int)(MaxPrimPartSize - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER)))
739 {
740 *infoByteAddr = (( *infoByteAddr & ~HDR_IDENT_MASK) | IDENT_ABORT); /* mark as bad */
741 tst_trailer_size.val = (USHORT)(MaxPrimPartSize - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER) -TST_HEADER_TRAILING_FIELDS);
742 counter = tst_trailer_size.val; /* don't let us read all the following bytes before let TIF tracing ABORT */
743 tr_abort = 1;
744 }
745 #endif
746 TR_Data.rcv_state = WAIT_FOR_DATA;
747 counter = 0;
748 break;
749 case WAIT_FOR_RAW_TI_E:
750 if ( mux_status == WAIT_FOR_MUX_END_STX )
751 {
752 if ( stuffed_byte )
753 {
754 stuffed_byte = 0;
755 tst_mux_chan_struct[mux_chan].rcv_data_size++;
756 }
757 else
758 {
759 if ( c != TI_STX )
760 {
761 if ( c == 0x10 )
762 {
763 stuffed_byte = 1;
764 }
765 tst_mux_chan_struct[mux_chan].rcv_data_size++;
766 }
767 else
768 {
769 tst_mux_callback (mux_chan,tst_mux_chan_struct[mux_chan].rcv_data_ptr, tst_mux_chan_struct[mux_chan].rcv_data_size);
770 mux_status = WAIT_FOR_MUX_CHAN_ID;
771 MessageLength = tst_mux_chan_struct[mux_chan].rcv_data_size;
772 TR_Data.rcv_state = WAIT_FOR_RAW_TI_S;
773 }
774 }
775 }
776 #ifdef _TOOLS_
777 if (c!=TI_STX)
778 {
779 if ( counter == 0 && c == 0x0a )
780 {
781 lf_found = 1;
782 }
783 if ( lf_found && counter == 1 && c == 0x0d)
784 {
785 crlf_found = 1;
786 }
787 counter++;
788 }
789 else
790 {
791 if ( TR_Data.EnabledSignalType & DRV_SIGTYPE_READ )
792 {
793 ti_len=counter;
794 if ( crlf_found == 1 )
795 {
796 ti_len -= 2;
797 TR_RdInd += 2; /* do not read CR and LF at the beginning */
798 }
799 MessageLength = ti_len;
800 TR_Signal.SignalType = sigtype;
801 TR_Signal.DrvHandle = TR_Data.Handle;
802 (TR_Data.Callback)( &TR_Signal );
803 }
804 TR_Data.rcv_state = TR_Data.idle_state;
805 }
806 #endif
807 break;
808 case WAIT_FOR_DATA:
809 #ifdef _TOOLS_
810 if ( ti_len )
811 {
812 if ( counter == 0 && c == 0x0a )
813 {
814 lf_found = 1;
815 }
816 if ( lf_found && counter == 1 && c == 0x0d)
817 {
818 crlf_found = 1;
819 }
820 if ( ++counter >= ti_len )
821 {
822 if ( TR_Data.EnabledSignalType & DRV_SIGTYPE_READ )
823 {
824 if ( crlf_found == 1 )
825 {
826 ti_len -= 2;
827 TR_RdInd += 2; /* do not read CR and LF at the beginning */
828 }
829 MessageLength = ti_len;
830 TR_Signal.SignalType = sigtype;
831 TR_Signal.DrvHandle = TR_Data.Handle;
832 (TR_Data.Callback)( &TR_Signal );
833 }
834 TR_Data.rcv_state = TR_Data.idle_state;
835 }
836 break;
837 }
838 #endif
839 if (++counter >= tst_trailer_size.val) /* If all went OK up to now we have to read all remaining bytes from the buffer each for each */
840 {
841 if (TR_Data.config & STX_LF_MODE )
842 {
843 TR_Data.rcv_state = WAIT_FOR_CR;
844 break;
845 }
846 else
847 {
848 if ( TR_Data.EnabledSignalType & DRV_SIGTYPE_READ )
849 {
850 #ifdef _TOOLS_
851 tst_message_received = 1;
852 #endif
853 TR_Signal.SignalType = DRV_SIGTYPE_READ;
854 TR_Signal.DrvHandle = TR_Data.Handle;
855 (TR_Data.Callback)( &TR_Signal );
856 }
857 TR_Data.rcv_state = TR_Data.idle_state;
858 tst_trailer_size.val = 0;
859 if ( tr_abort == 1 ) /* marked as bad */
860 tr_abort_discard = 1;
861 #ifdef _TOOLS_
862 ti_id_not_found = 0;
863 #endif
864 }
865 }
866 break;
867 case WAIT_FOR_CR:
868 #ifdef _TOOLS_ /* check for lost bytes on interface */
869 if (TR_Data.config & STX_LF_MODE ) /* we are receiving from a arm 9 TARGET or Windows stack configured stx */
870 {
871 if (c != '\n')
872 {
873 *infoByteAddr = (( *infoByteAddr & ~HDR_IDENT_MASK) | IDENT_ABORT); /* mark as bad */
874 }
875 }
876 #endif /* _TOOLS_ check for lost bytes on interface */
877 if ( TR_Data.EnabledSignalType & DRV_SIGTYPE_READ )
878 {
879 #ifdef _TOOLS_
880 tst_message_received = 1;
881 #endif
882 TR_Signal.SignalType = DRV_SIGTYPE_READ;
883 TR_Signal.DrvHandle = TR_Data.Handle;
884 (TR_Data.Callback)( &TR_Signal );
885 }
886 TR_Data.rcv_state = TR_Data.idle_state;
887 tst_trailer_size.val = 0;
888 if ( tr_abort == 1 ) /* marked as bad */
889 tr_abort_discard = 1;
890 break;
891 default:
892 break;
893 }
894 } /* while (i++ < Bytes) */
895 } /* if Bytes loop */
896 } while ( continue_read == 1 );
897 break;
898 case DRV_SIGTYPE_CONNECT:
899 case DRV_SIGTYPE_DISCONNECT:
900 if ( TR_Data.EnabledSignalType & Signal->SignalType )
901 {
902 TR_Signal.SignalType = Signal->SignalType;
903 TR_Signal.DrvHandle = TR_Data.Handle;
904 (TR_Data.Callback)( &TR_Signal );
905 }
906 break;
907 default:
908 break;
909 }
910 }
911 #endif
912
913 #ifndef RUN_INT_RAM
914 /*
915 +--------------------------------------------------------------------+
916 | PROJECT : GSM-Frame (8415) MODULE : TR |
917 | STATE : code ROUTINE : TR_Init |
918 +--------------------------------------------------------------------+
919
920 PURPOSE : initialize driver
921
922 */
923 USHORT TR_Init ( USHORT DrvHandle, T_DRV_CB_FUNC CallbackFunc, T_DRV_EXPORT const **DrvInfo )
924 {
925 USHORT j;
926 ULONG size = 0;
927 static const T_DRV_EXPORT TR_Info =
928 {
929 "TR",
930 0,
931 {
932 #ifdef _TOOLS_
933 TR_Init,
934 #endif
935 TR_Exit,
936 TR_Read,
937 TR_Write,
938 NULL,
939 NULL,
940 NULL,
941 TR_SetSignal,
942 TR_ResetSignal,
943 TR_SetConfig,
944 NULL,
945 TR_Callback,
946 }
947 };
948
949 TR_Data.Handle = DrvHandle;
950
951 TR_Data.EnabledSignalType = 0;
952
953 TR_Data.config = 0;
954
955 TR_Data.rcv_state = WAIT_FOR_IDENT;
956
957 TR_Data.idle_state = WAIT_FOR_IDENT;
958
959 TR_Data.Callback = CallbackFunc;
960
961 *DrvInfo = &TR_Info;
962
963 /*
964 * TR_RcvBufferSize must be a power of 2 for proper wrap-around
965 */
966 #ifndef _TOOLS_
967 TR_RcvBufferSize = MaxPrimPartSize;
968 #endif
969 j = 0;
970 do
971 {
972 if ( (ULONG)(1 << j) >= TR_RcvBufferSize ) /* Size must be a power of 2 */
973 {
974 size = 1 << j;
975 break;
976 }
977 else
978 j++;
979 } while ( size < 0xffff );
980
981 TR_RcvBufferSize = size;
982 TR_MaxInd = TR_RcvBufferSize - 1;
983
984 if ( os_AllocateMemory ( NO_TASK, &TR_Data.RcvBuffer, (ULONG)TR_RcvBufferSize,
985 OS_NO_SUSPEND, ext_data_pool_handle ) != OS_OK )
986 {
987 vsi_o_assert ( NO_TASK, OS_SYST_ERR_NO_MEMORY, __FILE__, __LINE__,
988 "No memory available in TR driver, TR_RcvBufferSize = %d",
989 TR_RcvBufferSize );
990 return DRV_INITFAILURE;
991 }
992
993 TR_RcvBuffer = (char*)TR_Data.RcvBuffer;
994 TR_EndInd = TR_RcvBufferSize;
995 TR_WrInd = 0;
996 TR_RdInd = 0;
997 tst_trailer_size.val = 0;
998 #ifdef _TOOLS_
999 ti_id_not_found = 0;
1000 ti_esc_skipped = 0;
1001 #endif
1002
1003 return DRV_OK;
1004 }
1005 #endif