FreeCalypso > hg > tcs211-c139
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 |
