comparison gsm-fw/gpf/tst_drv/tif2.c @ 322:5d1e22505446

GPF: tif library sources imported from Leonardo version
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 13 Apr 2014 07:21:57 +0000
parents
children 7e878e6b9cf7
comparison
equal deleted inserted replaced
321:439afc1139b2 322:5d1e22505446
1 /*
2 +------------------------------------------------------------------------------
3 | File: tif.c
4 +------------------------------------------------------------------------------
5 | Copyright 2002 Texas Instruments Berlin, 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 Berlin, AG.
15 +-----------------------------------------------------------------------------
16 | Purpose : This Modul contains the TIF driver
17 +-----------------------------------------------------------------------------
18 */
19
20 #ifndef __TIF_C__
21 #define __TIF_C__
22 #endif
23
24 #include "typedefs.h"
25 #include "string.h"
26 #include "gdi.h"
27 #include "vsi.h"
28 #include "tools.h"
29 #include "glob_defs.h"
30 #include "ccdtable.h"
31 #include "ccddata.h"
32 #include "pcon.h"
33 #include "p_mem.h"
34 #include "drvconf.h"
35 #include "tstheader.h"
36
37 #ifdef _TOOLS_
38 #include "frame_const.h"
39 #include <stdio.h>
40 #endif /* _TOOLS_ */
41 #include "printtofile.h"
42
43 #ifndef _TOOLS_
44 #if !defined (_SOLARIS_) && !defined (_LINUX_)
45 #pragma pack(4)
46 #endif
47 #endif
48
49 /*lint -e545 */
50 /*==== TYPES ======================================================*/
51
52 typedef struct
53 {
54 USHORT Handle;
55 USHORT EnabledSignalType;
56 T_DRV_CB_FUNC Callback;
57 USHORT Config;
58 } T_TIF_DATA;
59
60 #ifdef _TOOLS_
61 typedef struct
62 {
63 unsigned int use_id;
64 char *name;
65 } T_RIV_USEID_TO_NAME;
66 #endif
67
68 /*==== CONSTANTS ==================================================*/
69
70 #define ALLOWED_TIF_SIGNALS (DRV_SIGTYPE_READ|DRV_SIGTYPE_CONNECT|DRV_SIGTYPE_DISCONNECT)
71
72 #define NAME_LENGTH 4
73
74 #define TIF_RCV_CMD_SIZE 32
75 #define TIF_MAX_CMD (TIF_RCV_CMD_SIZE-1)
76
77 #define STX 0x02
78 #define LF 0x0a
79
80 #define PCON_ENABLED 0x0001
81 #define SYNC_MODE 0x0002
82
83 #undef VSI_CALLER
84 #define VSI_CALLER TST_Handle,
85
86 #ifdef _TOOLS_
87 const T_RIV_USEID_TO_NAME riv_use_id_to_name[] =
88 {
89 { 0x00010001, "RVM" },
90 { 0x00010002, "RVT" },
91 { 0x000A0001, "R2D" },
92 { 0x000A0002, "RTC" },
93 { 0x000A0004, "FFS" },
94 { 0x000A0008, "KPD" },
95 { 0x000A0010, "SPI" },
96 { 0x000A0020, "PWR" },
97 { 0x000A0040, "RGUI" },
98 { 0x00140001, "HCI" },
99 { 0x00140002, "L2CA" },
100 { 0x00140004, "BTCT" },
101 { 0x00140008, "RFC" },
102 { 0x00140010, "SPP" },
103 { 0x00140020, "HS" },
104 { 0x00140040, "HSG" },
105 { 0x00140080, "SDP" },
106 { 0x00140100, "DUN" },
107 { 0x00140200, "FAX" },
108 { 0x00140400, "OBX" },
109 { 0x00140800, "OPP" },
110 { 0x00141000, "FTP" },
111 { 0x00142000, "SYN" },
112 { 0x001E0001, "EXPL" },
113 { 0x001E0010, "AUDIO" },
114 { 0x001E0020, "ETM" },
115 { 0x001E0040, "DAR" },
116 { 0x001E0080, "MKS" },
117 { 0x001E0100, "MPM" },
118 { 0x001E0200, "LLS" },
119 { 0x001E0400, "ATP" },
120 { 0x001E0800, "ATPUART" },
121 { 0x001E2000, "MDC" },
122 { 0x001E4000, "TTY" },
123 { 0x001E8000, "DCM" },
124 { 0x00280001, "TEST" },
125 { 0x00280002, "TUT" },
126 { 0x00320001, "KIL" },
127 { 0x00320002, "KGC" },
128 { 0x00320004, "KCL" },
129 { 0x00320008, "KMM" },
130 { 0x00320010, "KNM" },
131 { 0x00320020, "UVM" },
132 { 0x00320040, "KZP" },
133 { 0x00320080, "KPG" },
134 { 0x00320100, "JTM" },
135 { 0x003C0001, "DEV1" },
136 { 0x003C0002, "DEV2" },
137 { 0x003C0003, "DEV3" },
138 { 0x00460001, "RNET" },
139 { 0x00460002, "RNET_WS" },
140 { 0x00460004, "RNET_RT" },
141 { 0x00460008, "RNET_BR" },
142 { 0x00640001, "MSME" },
143 { 0x00640002, "MSFE" },
144 { 0x00640004, "STKE" },
145 { 0x00640008, "BRSE" },
146 { 0x00640010, "BRAE" },
147 { 0x00640020, "PHSE" },
148 { 0x00640040, "IBSE" },
149 { 0x00640080, "MMSE" },
150 { 0x00640100, "SLSE" },
151 { 0x00640200, "SMAE" },
152 { 0x00640400, "MEAE" },
153 { 0x00640800, "SECE" },
154 { 0x00641000, "SELE" },
155 { 0x00642000, "PRSE" },
156 { 0x00644000, "JAAE" },
157 { 0x00648000, "JASE" },
158 { 0x006E0001, "IT1E" },
159 { 0x006E0002, "IT2E" },
160 { 0x006E0004, "IT0E" },
161 { 0x0, NULL}
162 };
163 #endif
164
165 /*==== EXTERNALS ==================================================*/
166
167 extern T_HANDLE TST_Handle;
168
169 #ifndef _TOOLS_
170 extern const T_PCON_PROPERTIES *pcon;
171 extern ULONG MaxPrimPartSize;
172 extern const T_MEM_PROPERTIES *mem;
173 #endif
174
175 #ifdef CTB
176 extern BOOL ctb_sent_to_tap;
177 extern BOOL ctb_tick_enabled;
178 #endif
179
180 /*==== VARIABLES ==================================================*/
181
182 #ifndef RUN_INT_RAM
183 char corruptWarning[] = "corrupt prim received: ";
184 char wrongTSTWarning[] = "wrong (old) TST header used on toolside! ";
185 T_TIF_DATA TIF_Data;
186 static ULONG TIF_WrInd = 0;
187 BOOL socket_flush = TRUE;
188 #else
189 extern T_TIF_DATA TIF_Data;
190 extern BOOL socket_flush;
191 #endif /* RUN_INT_RAM */
192
193 #ifdef _TOOLS_
194 char buffer[80];
195
196 const T_PCON_PROPERTIES pcon_export =
197 {
198 pcon_init_prim_coding,
199 pcon_decodePrim,
200 pcon_codePrim,
201 pcon_make_filter,
202 PCON_STACK_OFFSET
203 };
204
205 T_PCON_PROPERTIES const *pcon = &pcon_export;
206 #endif
207
208 /*==== FUNCTIONS ==================================================*/
209
210 #ifndef RUN_INT_RAM
211 USHORT TIF_Write ( void *Buffer, ULONG *BytesToWrite );
212 #endif
213
214 #ifndef RUN_INT_RAM
215 /*
216 +--------------------------------------------------------------------+
217 | PROJECT : GSM-Frame (8415) MODULE : TIF |
218 | STATE : code ROUTINE : TIF_Exit |
219 +--------------------------------------------------------------------+
220
221 PURPOSE : exit a driver
222
223 */
224 LOCAL void TIF_Exit ( void )
225 {
226 #ifdef _TOOLS_
227 ccddata_exit();
228 #endif /* _TOOLS_ */
229 }
230 #endif
231
232 #ifndef RUN_FLASH
233 /*
234 +--------------------------------------------------------------------+
235 | PROJECT : GSM-Frame (8415) MODULE : TIF |
236 | STATE : code ROUTINE : TIF_Write |
237 +--------------------------------------------------------------------+
238
239 PURPOSE : write data to driver
240
241 */
242 /* Lint is not able to analyze the program flow through if...else constructions
243 and therefor bring a bunch of warnings.*/
244 /*lint -e645 suppress warning -- Symbol '...' may not have been initialized */
245 /*lint -e644 suppress warning -- Symbol '...' may not have been initialized */
246 /*lint -e613 suppress warning -- possibly use of NULL pointer '...' */
247 USHORT TIF_Write ( void *Buffer, ULONG *BytesToWrite )
248 {
249 T_PRIM_HEADER *prim = (T_PRIM_HEADER*)Buffer;
250 T_PRIM_HEADER *prim_ptr = NULL;
251 TST_SMALL_HEADER *tst_header_ptr;
252 T_S_HEADER *s_hdr;
253 unsigned int bytes_to_write;
254 unsigned int size;
255 unsigned int name_len;
256 unsigned int length;
257 unsigned int org_rcv_len = 0;
258 unsigned int opc_len = 0;
259 unsigned int bytes_written = 0;
260 unsigned int write_flag = 0;
261 char *write_ptr;
262 char *tst_data_ptr;
263 char trace_opc=0;
264 char Sender[RESOURCE_NAMELEN] = {0};
265 void *coded_prim;
266 void *decoded_prim;
267 int pcon_called = 0;
268 int is_primitive = TRUE;
269 int ret = DRV_OK;
270 int sts;
271 #ifdef _TOOLS_
272 int is_generated_primitive = FALSE;
273 #endif /* _TOOLS_ */
274
275
276 s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset);
277 if ( prim->opc & SYS_MASK )
278 {
279 size = prim->len - sizeof(T_PRIM_HEADER);
280 tst_data_ptr = (char*)P2D(prim);
281 tst_header_ptr = (TST_SMALL_HEADER*) tst_data_ptr - 1;
282 tst_header_ptr->combined[INFO_BYTE] = (~HDR_IDENT_MASK | IDENT_SYS_PRIM);
283 InsertString(s_hdr->rcv, (char*)&tst_header_ptr->receiver, 4);
284 is_primitive = FALSE;
285 #ifdef _TOOLS_
286 if ( (length = GetNextToken (tst_data_ptr, buffer, " #")) > 0)
287 {
288 if ( !strcmp (buffer, FILTER) )
289 {
290 void *filter_prim;
291 if ( (pcon != NULL) && pcon->make_filter(tst_data_ptr+length+1, &filter_prim) == PCON_OK )
292 {
293 prim = D2P(filter_prim);
294 s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset);
295 is_primitive = TRUE;
296 is_generated_primitive = TRUE;
297 }
298 }
299 }
300 #endif
301 }
302 else if ( (SAP_NR(prim->opc)==TRACE_SAP) || (prim->opc==TRACE_OPC) )
303 {
304 is_primitive = FALSE;
305 size = prim->len - sizeof(T_PRIM_HEADER);
306 tst_data_ptr = (char*)P2D(prim);
307 if (prim->opc!=TRACE_OPC)
308 {
309 /* we have a traceclass id */
310 trace_opc=(char)PRIM_NR(prim->opc);
311 }
312 tst_header_ptr = (TST_SMALL_HEADER*) tst_data_ptr - 1;
313 tst_header_ptr->combined[INFO_BYTE] = (~HDR_IDENT_MASK | IDENT_TRACE);
314 InsertString(FRM_PCO_NAME, (char*)&tst_header_ptr->receiver, 4);
315 }
316 if ( is_primitive == TRUE )
317 {
318 TST_BIG_HEADER tst_big_header;
319 TST_BIG_HEADER *tst_big_header_ptr;
320 #ifdef _TOOLS_
321 /* on the tool side the primitive to be duplicated is copied when sent to TST */
322 prim_ptr = prim;
323 #else
324 /* in the target a pointer to the primitive to be duplicated is transported in a carrier of type T_PRIM_X */
325 prim_ptr = (T_PRIM_HEADER*)((T_PRIM_X*)(prim))->prim_ptr;
326 #endif
327
328 size = prim_ptr->len - sizeof(T_PRIM_HEADER);
329 tst_data_ptr = (char*)P2D(prim_ptr);
330 tst_big_header_ptr = &tst_big_header;
331 opc_len = 4;
332 org_rcv_len = 4;
333 if ( (pcon != NULL) && (TIF_Data.Config & PCON_ENABLED) && !(prim_ptr->opc & VIRTUAL_OPC) )
334 {
335 decoded_prim = P2D(prim_ptr);
336 if ( (sts = (int)(pcon->code_prim( prim_ptr->opc, decoded_prim, &coded_prim, (ULONG*)&size, 0, s_hdr->rcv ))) != PCON_OK )
337 {
338 vsi_o_ttrace (NO_TASK, TC_SYSTEM,"PCON Code Error %d, TIF_Write() aborted", sts );
339 return DRV_INTERNAL_ERROR;
340 }
341 else
342 {
343 prim_ptr = D2P(coded_prim);
344 tst_data_ptr = coded_prim;
345 pcon_called = 1;
346 }
347 }
348
349 EXCHANGE_4BYTES_ENDIANESS(&prim_ptr->opc);
350
351 tst_big_header_ptr->opc = prim_ptr->opc;
352 tst_big_header_ptr->combined[INFO_BYTE] = (~HDR_IDENT_MASK | IDENT_PS_PRIM);
353 InsertString(s_hdr->rcv, (char*) &tst_big_header_ptr->receiver, 4);
354 InsertString(s_hdr->org_rcv, (char*) &tst_big_header_ptr->orgreceiver, 4);
355 socket_flush = TRUE;
356 tst_header_ptr = (TST_SMALL_HEADER*) tst_big_header_ptr;
357 }
358
359 tst_header_ptr->combined[INFO_BYTE] = ((tst_header_ptr->combined[INFO_BYTE] & (~HDR_VERSION_MASK)) | HDR_VALID_VERSION_1);
360 tst_header_ptr->combined[INFO_BYTE] = ((tst_header_ptr->combined[INFO_BYTE] & (~HDR_TIME_MASK)) | HDR_TIME_MS);
361 tst_header_ptr->time = s_hdr->time;
362 EXCHANGE_4BYTES_ENDIANESS(&tst_header_ptr->time);
363 tst_header_ptr->sender[0] = 0;
364
365 if ( s_hdr->snd[0] == 0 )
366 {
367 if ( *tst_data_ptr == '~')
368 {
369 name_len = GetNextToken ((char*)(tst_data_ptr), Sender, "~");
370 InsertString(Sender, (char*) &tst_header_ptr->sender, 4);
371 size -= 2+name_len;
372 /* rub out a leading ~NAM~ in data field: */
373 memcpy ( tst_data_ptr, tst_data_ptr + 2 + name_len, size );
374 }
375 else
376 {
377 InsertString(FRM_SYST_NAME, (char*)&tst_header_ptr->sender, 4);
378 }
379 }
380 else
381 {
382 T_HANDLE TaskHandle;
383 if ( s_hdr->snd[0] & ~HANDLE_MASK )
384 {
385 TaskHandle = (T_HANDLE)(s_hdr->snd[0]&HANDLE_MASK);
386 vsi_e_name ( TST_Handle, TaskHandle, Sender );
387 InsertString(Sender, (char*)&tst_header_ptr->sender, 4);
388 }
389 else
390 {
391 InsertString(s_hdr->snd, (char*)&tst_header_ptr->sender, 4);
392 }
393 }
394
395 length = size + TST_HEADER_TRAILING_FIELDS + org_rcv_len + opc_len + (trace_opc ? 1 : 0);
396 tst_header_ptr->combined[FIRST_BYTE] = (UBYTE) (LOW_MASK & length);
397 tst_header_ptr->combined[SECOND_BYTE] = (UBYTE) (LOW_MASK & (length >> 8));
398 bytes_to_write = length + TST_HEADER_LEADING_FIELDS;
399 write_ptr = (char*)&tst_header_ptr->combined[INFO_BYTE];
400 if (trace_opc)
401 {
402 /* move small header 1 byte to the left and insert trace class id */
403 char *trace_opc_ptr=tst_data_ptr-1;
404 write_ptr = (char*)tst_header_ptr;
405 memcpy(write_ptr,(char*)tst_header_ptr+1,sizeof(TST_SMALL_HEADER)-1);
406 *trace_opc_ptr=trace_opc;
407 length++;
408 }
409 else if ( prim_ptr != NULL )
410 {
411 bytes_written = TST_BIG_HEADER_SIZE;
412 if ( vsi_d_write ( TIF_Data.Handle, 0, write_ptr, bytes_written | PRIM_HEADER_FLAG ) != VSI_OK )
413 {
414 ret = DRV_INTERNAL_ERROR;
415 *BytesToWrite = 0;
416 }
417 write_ptr = tst_data_ptr;
418 write_flag = PRIM_DATA_FLAG;
419 }
420
421 if (ret==DRV_OK)
422 {
423 #if defined (_TOOLS_) || defined (_LINUX_) || defined (_SOLARIS_)
424 socket_flush = TRUE; /* flush socket always on tool side */
425 #endif
426
427 if ( vsi_d_write ( TIF_Data.Handle, 0, write_ptr, (bytes_to_write - bytes_written) | write_flag ) != VSI_OK )
428 {
429 ret = DRV_INTERNAL_ERROR;
430 *BytesToWrite = 0;
431 }
432 }
433 if ( pcon_called )
434 {
435 PFREE(P2D((T_VOID_STRUCT*)prim_ptr));
436 }
437 #ifdef _TOOLS_
438 if ( is_generated_primitive == TRUE )
439 {
440 vsi_c_free ( TST_Handle, (T_VOID_STRUCT**)&prim );
441 }
442 #else /* _TOOLS_ */
443 if (prim->opc & MEMHANDLE_OPC)
444 {
445 M_FREE(P_MEMHANDLE_SDU(((T_PRIM_X*)(prim))->prim_ptr));
446 }
447 #endif /* _TOOLS_ */
448 #if defined _NUCLEUS_ && !defined _TARGET_
449 #ifdef CTB
450 if(ctb_tick_enabled && !ctb_sent_to_tap && !strncmp(tst_header_ptr->receiver,"TAP",3))
451 {
452 ctb_sent_to_tap = TRUE;
453 }
454 #endif
455 #endif
456
457 return ( (USHORT)ret );
458 }
459 /*lint +e645 */
460 /*lint +e613 */
461 #endif
462
463 #ifndef RUN_INT_RAM
464 /*
465 +--------------------------------------------------------------------+
466 | PROJECT : GSM-Frame (8415) MODULE : TIF |
467 | STATE : code ROUTINE : TIF_SetSignal |
468 +--------------------------------------------------------------------+
469
470 PURPOSE : enable signal for the driver
471
472 */
473 LOCAL USHORT TIF_SetSignal ( USHORT SignalType )
474 {
475 if ( !(SignalType & ALLOWED_TIF_SIGNALS) )
476 return DRV_INVALID_PARAMS;
477 else
478 TIF_Data.EnabledSignalType |= SignalType;
479
480 return DRV_OK;
481 }
482 #endif
483
484 #ifndef RUN_INT_RAM
485 /*
486 +--------------------------------------------------------------------+
487 | PROJECT : GSM-Frame (8415) MODULE : TIF |
488 | STATE : code ROUTINE : TIF_ResetSignal |
489 +--------------------------------------------------------------------+
490
491 PURPOSE : disable signal for the driver
492
493 */
494 LOCAL USHORT TIF_ResetSignal ( USHORT SignalType )
495 {
496 if ( !(SignalType & ALLOWED_TIF_SIGNALS) )
497 return DRV_INVALID_PARAMS;
498 else
499 TIF_Data.EnabledSignalType &= ~SignalType;
500
501 return DRV_OK;
502 }
503 #endif
504
505 #ifndef RUN_INT_RAM
506 /*
507 +--------------------------------------------------------------------+
508 | PROJECT : GSM-Frame (8415) MODULE : TIF |
509 | STATE : code ROUTINE : TIF_SetConfig |
510 +--------------------------------------------------------------------+
511
512 PURPOSE : set configuration for the driver
513
514 */
515 /*lint -esym(715,Buffer), suppress Info -- Symbol 'Buffer' not referenced) */
516 LOCAL USHORT TIF_SetConfig ( char *Buffer )
517 {
518 if ( !strcmp ( TIF_PCON_ENABLE, Buffer ) )
519 {
520 if ( TIF_Data.Config & PCON_ENABLED)
521 {
522 /* already in PCON mode */
523 return DRV_OK;
524 }
525
526 #ifdef _TOOLS_
527 switch (ccddata_init(NULL,0,NULL,NULL))
528 {
529 case CCDDATA_DLL_OK:
530 case CCDDATA_DLL_ALREADY:
531 break;
532 default:
533 return DRV_INTERNAL_ERROR;
534 }
535 #endif
536 TIF_Data.Config |= PCON_ENABLED;
537
538 #ifdef _TOOLS_
539 printf("TIF: PCON mode selected\n");
540 #endif
541 return DRV_OK;
542 }
543 else if ( !strcmp ( DRV_DEFAULT, Buffer ) )
544 {
545 if ( !(TIF_Data.Config & PCON_ENABLED))
546 {
547 /* already in default mode */
548 return DRV_OK;
549 }
550
551 #ifdef _TOOLS_
552 ccddata_exit();
553 #endif
554 TIF_Data.Config &= ~PCON_ENABLED;
555
556 #ifdef _TOOLS_
557 printf("TIF: default mode selected\n");
558 #endif
559 return DRV_OK;
560 }
561 #ifdef _TOOLS_
562 else if ( !strcmp ( ENABLE_SYNC_MODE, Buffer ) )
563 {
564 TIF_Data.Config |= SYNC_MODE;
565 PrintToFile("TIF: sync mode enabled\n");
566 return DRV_OK;
567 }
568 else if ( !strcmp ( DISABLE_SYNC_MODE, Buffer ) )
569 {
570 TIF_Data.Config &= ~SYNC_MODE;
571 PrintToFile("TIF: sync mode disabled\n");
572 return DRV_OK;
573 }
574 return DRV_INVALID_PARAMS;
575 #else
576 return DRV_OK;
577 #endif
578 }
579 #endif
580
581 #ifndef RUN_INT_RAM
582 /*
583 +--------------------------------------------------------------------+
584 | PROJECT : GSM-Frame (8415) MODULE : TIF |
585 | STATE : code ROUTINE : Callback |
586 +--------------------------------------------------------------------+
587
588 PURPOSE : callback function of the driver
589
590 */
591 /* Lint is not able to analyze the program flow through if...else constructions
592 and therefor bring a bunch of warnings.*/
593 /*lint -esym(645,opc_str) suppress warning -- Symbol 'opc_str' may not have been initialized */
594 LOCAL void TIF_Callback ( T_DRV_SIGNAL *Signal )
595 {
596 T_PRIM_HEADER *prim;
597 T_S_HEADER *s_hdr;
598 T_PRIM_X *sys_prim;
599 T_DRV_SIGNAL TIF_Signal;
600 TST_BIG_HEADER tst_header;
601 unsigned int CorruptByteOffset = 0;
602 unsigned int length;
603 unsigned int BytesToRead = 0;
604 unsigned int BytesRead;
605 unsigned int Bytes = 0;
606 unsigned int i;
607 unsigned int opc_len = 0;
608 unsigned int org_rcv_len = 0;
609 unsigned int alloc_size;
610 int sts;
611 int WrongTSTHeader = FALSE;
612 char *target;
613 void *decoded_prim;
614 char opc_str[4];
615 #ifdef _TOOLS_
616 int l1_sigtype = 0;
617 #endif
618
619 switch ( Signal->SignalType )
620 {
621 #ifdef _TOOLS_
622 case DRV_SIGTYPE_READ_L1:
623 l1_sigtype = 1;
624 /*lint -fallthrough*/
625 case DRV_SIGTYPE_READ_RIV:
626
627 if ( vsi_d_read ( TIF_Data.Handle, 0, NULL, &BytesToRead ) != DRV_OK )
628 return;
629
630 alloc_size = S_ALLOC_SIZE(BytesToRead + 1);
631 if ( ( prim = (T_PRIM_HEADER*)vsi_c_new ( TST_Handle, alloc_size, 0 FILE_LINE_MACRO )) != NULL )
632 {
633 TIF_WrInd = 0;
634 Bytes = 0;
635 BytesRead = BytesToRead;
636 do
637 {
638 vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)P2D(prim)+TIF_WrInd), &BytesRead );
639 Bytes += BytesRead;
640 if ( Bytes < BytesToRead )
641 {
642 TIF_WrInd += BytesRead;
643 BytesRead = BytesToRead - BytesRead;
644 }
645 } while ( Bytes < BytesToRead );
646 prim->sh_offset = S_HDR_OFFSET(alloc_size - sizeof(T_S_HEADER));
647 s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset);
648 s_hdr->time = 0;
649 s_hdr->org_rcv[0] = 0;
650 if ( l1_sigtype == 1 )
651 {
652 strcpy ( s_hdr->snd, "L1" );
653 }
654 else
655 {
656 int i = 0;
657 unsigned int use_id = 0;
658 unsigned char *p = (unsigned char*)P2D(prim);
659 use_id = use_id | *p++ << 24;
660 use_id = use_id | *p++ << 16;
661 use_id = use_id | *p++ << 8;
662 use_id = use_id | *p;
663 do
664 {
665 if ( riv_use_id_to_name[i].use_id == use_id )
666 {
667 strcpy ( s_hdr->snd, riv_use_id_to_name[i].name );
668 break;
669 }
670 if ( riv_use_id_to_name[i+1].use_id == 0 )
671 strcpy ( s_hdr->snd, "RIV" );
672 } while ( riv_use_id_to_name[++i].use_id != 0 );
673 memcpy ( (char*)P2D(prim), (char*)P2D(prim)+5, BytesToRead);
674 }
675 strcpy ( s_hdr->rcv, FRM_PCO_NAME );
676
677 sys_prim = (T_PRIM_X*) vsi_c_new ( TST_Handle, alloc_size, 0 FILE_LINE_MACRO );
678 sys_prim->prim_ptr = prim;
679 prim->opc = 0;
680 prim->len = BytesToRead + sizeof(T_PRIM_HEADER);
681
682 if ( TIF_Data.EnabledSignalType & DRV_SIGTYPE_READ )
683 {
684 VSI_PPM_SEND ( (T_PRIM_HEADER*)sys_prim, TST_Handle );
685 VSI_PPM_SEND ( (T_PRIM_HEADER*)sys_prim->prim_ptr, TST_Handle );
686 TIF_Signal.SignalType = DRV_SIGTYPE_READ;
687 TIF_Signal.DrvHandle = TIF_Data.Handle;
688 TIF_Signal.UserData = (T_VOID_STRUCT*)sys_prim;
689 (TIF_Data.Callback)( &TIF_Signal );
690 }
691 }
692 break;
693 #endif
694 case DRV_SIGTYPE_READ:
695 /*
696 * Get the size of the needed buffer to store the data
697 */
698
699 if ( vsi_d_read ( TIF_Data.Handle, 0, NULL, (ULONG*)&BytesToRead ) != DRV_OK )
700 return;
701
702 if ( BytesToRead )
703 {
704 if ( BytesToRead >= TST_SMALL_HEADER_SIZE )
705 BytesToRead -= TST_SMALL_HEADER_SIZE;
706 Bytes = 0;
707 TIF_WrInd = 0;
708 BytesRead = TST_SMALL_HEADER_SIZE;
709 do
710 {
711 vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)&tst_header.combined[INFO_BYTE]+TIF_WrInd), (ULONG*)&BytesRead );
712 Bytes += BytesRead;
713 if ( Bytes < TST_SMALL_HEADER_SIZE )
714 {
715 TIF_WrInd += BytesRead;
716 BytesRead = TST_SMALL_HEADER_SIZE - BytesRead;
717 }
718 } while ( Bytes < TST_SMALL_HEADER_SIZE );
719
720 alloc_size = ALIGN(sizeof(T_PRIM_X));
721 sys_prim = (T_PRIM_X*) vsi_c_new ( TST_Handle, alloc_size, 0 FILE_LINE_MACRO );
722
723 switch (tst_header.combined[INFO_BYTE] & HDR_IDENT_MASK)
724 {
725 case IDENT_ABORT:
726 tst_header.combined[INFO_BYTE] = ((tst_header.combined[INFO_BYTE] & ~HDR_IDENT_MASK) | IDENT_TRACE);
727 #ifdef _TOOLS_
728 /* TR did loose byte(s)! Primitive is corrupt, no header val can be
729 guaranteed to be valid.
730 Create a HUGE trace prim with zero time, sender tst, receiver pco,
731 org_receiver tst
732 TRACE DATA will contain: a "corrupt prim received: " string,
733 the already received part of the prim and all the rest */
734 CorruptByteOffset = TST_SMALL_HEADER_SIZE + strlen(corruptWarning) + 1;
735 #else
736 /* TR did receive a prim from tool side old TST header format and swiched to new.
737 Now we have to TRACE the wrong tool side format, because the prim is lost. */
738 WrongTSTHeader = TRUE;
739 BytesToRead = 0;
740 CorruptByteOffset = strlen(wrongTSTWarning) + 1;
741 #endif
742 break;
743 case IDENT_PS_PRIM:
744 opc_len = 4;
745 org_rcv_len = 4;
746 break;
747 default:
748 break;
749 }
750
751 if ( (BytesRead = org_rcv_len) > 0 )
752 {
753 if ( BytesToRead >= org_rcv_len )
754 BytesToRead -= org_rcv_len;
755 Bytes = 0;
756 TIF_WrInd = 0;
757 do
758 {
759 vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)&tst_header.orgreceiver+TIF_WrInd), (ULONG*)&BytesRead );
760 Bytes += BytesRead;
761 if ( Bytes < org_rcv_len )
762 {
763 TIF_WrInd += BytesRead;
764 BytesRead = org_rcv_len - BytesRead;
765 }
766 } while ( Bytes < org_rcv_len );
767 }
768
769 if ( (BytesRead = opc_len) > 0 )
770 {
771 if ( BytesToRead >= opc_len )
772 BytesToRead -= opc_len;
773 Bytes = 0;
774 TIF_WrInd = 0;
775 do
776 {
777 vsi_d_read ( TIF_Data.Handle, 0, (void*)(opc_str+TIF_WrInd), (ULONG*)&BytesRead );
778 Bytes += BytesRead;
779 if ( Bytes < opc_len )
780 {
781 TIF_WrInd += BytesRead;
782 BytesRead = opc_len - BytesRead;
783 }
784 } while ( Bytes < opc_len );
785 }
786
787 alloc_size = S_ALLOC_SIZE(CorruptByteOffset + BytesToRead + 1);
788 #ifdef _TOOLS_
789 if ( alloc_size > MAX_PRIM_PARTITION_SIZE - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER))
790 alloc_size = MAX_PRIM_PARTITION_SIZE - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER);
791 #else
792 if ( alloc_size > MaxPrimPartSize - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER) )
793 alloc_size = MaxPrimPartSize - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER);
794 #endif
795 if ( ( prim = (T_PRIM_HEADER*)vsi_c_new ( TST_Handle, alloc_size, 0 FILE_LINE_MACRO )) != NULL )
796 {
797 TIF_WrInd = 0;
798 Bytes = 0;
799 if ((BytesToRead + CorruptByteOffset) > alloc_size)
800 {
801 #ifdef _TOOLS_
802 PrintToFile("TIF: Reduced a new Prim's size\n");
803 #endif
804 BytesToRead = alloc_size - CorruptByteOffset;
805 }
806 BytesRead = BytesToRead;
807
808 target = (char*) P2D(prim);
809
810 if (WrongTSTHeader)
811 {
812 memcpy(target, wrongTSTWarning, strlen(wrongTSTWarning));
813 target += strlen(wrongTSTWarning);
814 }
815 else if (CorruptByteOffset)
816 {
817 #ifdef _TOOLS_
818 PrintToFile("TIF: Byte(s) lost\n");
819 #endif
820 memcpy(target, corruptWarning, strlen(corruptWarning));
821 target += strlen(corruptWarning);
822 /*lint -e420, suppress Warning -- Apparent access beyond array for function 'memcpy(...*/
823 memcpy(target,&tst_header.combined[INFO_BYTE], TST_SMALL_HEADER_SIZE-1);
824 /*lint +e420 */
825 target += TST_SMALL_HEADER_SIZE - 1;
826 }
827
828
829 if (WrongTSTHeader == FALSE && BytesToRead)
830 {
831 if ( (tst_header.combined[INFO_BYTE] & HDR_IDENT_MASK)==IDENT_TRACE )
832 {
833 /* we read the first bytes in advance in case the trace class is carried */
834 ULONG bread=1;
835 vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)target+TIF_WrInd), &bread );
836
837 if (bread==1 && *((char*)target)<0x20) /* no character -> assume traceclass id */
838 {
839 opc_str[0]=*((char*)target);
840 opc_len=1;
841
842 BytesToRead -= bread;
843 }
844 else
845 {
846 /* ok, we have no traceclass info :-( */
847 TIF_WrInd += bread;
848 Bytes += bread;
849 }
850 BytesRead = BytesToRead - Bytes;
851 }
852
853 do
854 {
855 vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)target+TIF_WrInd), (ULONG*)&BytesRead );
856 Bytes += BytesRead;
857 if ( Bytes < BytesToRead )
858 {
859 TIF_WrInd += BytesRead;
860 BytesRead = BytesToRead - Bytes;
861 }
862 } while ( Bytes < BytesToRead );
863 }
864
865 *((char*)target + Bytes) = 0;
866 prim->sh_offset = S_HDR_OFFSET(alloc_size - sizeof(T_S_HEADER));
867 s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset);
868 switch (tst_header.combined[INFO_BYTE] & HDR_IDENT_MASK)
869 {
870 case IDENT_PS_PRIM:
871
872 EXCHANGE_4BYTES_ENDIANESS(opc_str);
873
874 memcpy((char*)&prim->opc, opc_str, 4);
875 if ( (pcon != NULL) && (TIF_Data.Config & PCON_ENABLED) )
876 {
877 if ( (sts = (int)pcon->decode_prim ( prim->opc, &decoded_prim, (void*)((char*)prim+sizeof(T_PRIM_HEADER)), (ULONG*)&length, 0 )) != PCON_OK )
878 {
879 if ( sts != PCON_CONFIG_PRIM )
880 {
881 vsi_o_ttrace (NO_TASK, TC_SYSTEM,"PCON Deode Error %d, TIF_Callback() aborted", sts );
882 }
883 PFREE(P2D(sys_prim));
884 PFREE(P2D(prim));
885 return;
886 }
887 PFREE(P2D((T_VOID_STRUCT*)prim));
888 sys_prim->prim_ptr = D2P(decoded_prim);
889 }
890 else
891 {
892 sys_prim->prim_ptr = prim;
893 length = BytesToRead;
894 }
895 sys_prim->prim_ptr->sh_offset = S_HDR_OFFSET(length+sizeof(T_PRIM_HEADER));
896 sys_prim->prim_ptr->len = length + sizeof(T_PRIM_HEADER);
897 s_hdr = (T_S_HEADER*)((ULONG*)sys_prim->prim_ptr + sys_prim->prim_ptr->sh_offset);
898 #ifndef _TOOLS_
899 /* evtl. convert aux sdu to mem handle */
900 if (sys_prim->prim_ptr->opc & MEMHANDLE_OPC && mem!=NULL)
901 {
902 if (P_MEMHANDLE_SDU(sys_prim->prim_ptr))
903 {
904 U32 mem_handle;
905 U8 buffer_handle;
906 U8 user_handle;
907 U8 *user_data;
908 T_sdu *sdu;
909 U16 len;
910
911 sdu=(T_sdu *)P_MEMHANDLE_SDU(sys_prim->prim_ptr);
912 len=(sdu->l_buf + 7)/8;
913
914 buffer_handle=mem->create_buffer(MEM_UNORDERED_BUFFER, len);
915 user_handle = mem->create_user(buffer_handle, 23, "TST");
916
917 user_data=mem->alloc(user_handle,len,&mem_handle);
918 memcpy(user_data,sdu->buf+(sdu->o_buf+7)/8,len);
919 P_MEMHANDLE(sys_prim->prim_ptr)=mem_handle;
920
921 mem->delete_user(user_handle);
922 mem->delete_buffer(buffer_handle);
923 }
924 }
925 #endif
926 break;
927
928 case IDENT_SYS_PRIM:
929 sys_prim->prim_ptr = prim;
930 prim->opc = SYS_MASK;
931 prim->len = BytesToRead + sizeof(T_PRIM_HEADER);
932 break;
933
934 case IDENT_TRACE:
935 sys_prim->prim_ptr = prim;
936 if (opc_len)
937 {
938 /* nice, we found a traceclass info */
939 prim->opc = opc_str[0];
940 prim->opc = prim->opc << 16;
941 prim->opc |= EXTENDED_OPC | VIRTUAL_OPC | TRACE_SAP;
942 }
943 else
944 {
945 prim->opc = TRACE_OPC;
946 }
947 prim->len = CorruptByteOffset + BytesToRead + sizeof(T_PRIM_HEADER);
948 break;
949
950 default:
951 break;
952 }
953
954 /*
955 * Extract Sender and Receiverfrom header
956 */
957 if (CorruptByteOffset)
958 {
959 s_hdr->time = NULL;
960 #ifndef _TOOLS_
961 memcpy ( s_hdr->snd, "~TST", 4 );
962 memcpy ( s_hdr->rcv, FRM_TST_NAME, 4 );
963 #else
964 memcpy ( s_hdr->snd, FRM_TST_NAME, 4 );
965 memcpy ( s_hdr->rcv, FRM_PCO_NAME, 4 );
966 #endif
967 memcpy ( s_hdr->org_rcv, "TST", 4 );
968 }
969 else
970 {
971 s_hdr->time = tst_header.time;
972
973 i = 0;
974 do
975 {
976 s_hdr->snd[i] = tst_header.sender[i];
977 i++;
978 } while ( tst_header.sender[i] != 0x20 && i < 4 );
979 s_hdr->snd[i] = 0;
980
981 i = 0;
982 do
983 {
984 s_hdr->rcv[i] = tst_header.receiver[i];
985 i++;
986 } while ( tst_header.receiver[i] != 0x20 && i < 4 );
987 s_hdr->rcv[i] = 0;
988
989 if (org_rcv_len)
990 {
991 i = 0;
992 do
993 {
994 s_hdr->org_rcv[i] = tst_header.orgreceiver[i];
995 i++;
996 } while ( tst_header.orgreceiver[i] != 0x20 && i < 4 );
997 s_hdr->org_rcv[i] = 0;
998 }
999 }
1000
1001 if ( TIF_Data.EnabledSignalType & DRV_SIGTYPE_READ )
1002 {
1003 VSI_PPM_SEND ( (T_PRIM_HEADER*)sys_prim, TST_Handle );
1004 VSI_PPM_SEND ( (T_PRIM_HEADER*)sys_prim->prim_ptr, TST_Handle );
1005 TIF_Signal.SignalType = DRV_SIGTYPE_READ;
1006 TIF_Signal.DrvHandle = TIF_Data.Handle;
1007 TIF_Signal.UserData = (T_VOID_STRUCT*)sys_prim;
1008 (TIF_Data.Callback)( &TIF_Signal );
1009 }
1010 }
1011 } /* if ( BytesToRead ) */
1012 break;
1013 case DRV_SIGTYPE_CONNECT:
1014 case DRV_SIGTYPE_DISCONNECT:
1015 if ( TIF_Data.EnabledSignalType & Signal->SignalType )
1016 {
1017 TIF_Signal.SignalType = Signal->SignalType;
1018 TIF_Signal.DrvHandle = TIF_Data.Handle;
1019 TIF_Signal.UserData = NULL;
1020 (TIF_Data.Callback)( &TIF_Signal );
1021 }
1022 break;
1023 default:
1024 break;
1025 }
1026 }
1027 #endif
1028
1029 #ifndef RUN_INT_RAM
1030 /*
1031 +--------------------------------------------------------------------+
1032 | PROJECT : GSM-Frame (8415) MODULE : TIF |
1033 | STATE : code ROUTINE : TIF_Init |
1034 +--------------------------------------------------------------------+
1035
1036 PURPOSE : initialize driver
1037
1038 */
1039 GLOBAL USHORT TIF_Init ( USHORT DrvHandle, T_DRV_CB_FUNC CallbackFunc, T_DRV_EXPORT const **DrvInfo )
1040 {
1041 static const T_DRV_EXPORT TIF_Info =
1042 {
1043 TIF_NAME,
1044 0,
1045 {
1046 #ifdef _TOOLS_
1047 TIF_Init,
1048 #endif
1049 TIF_Exit,
1050 NULL,
1051 TIF_Write,
1052 NULL,
1053 NULL,
1054 NULL,
1055 TIF_SetSignal,
1056 TIF_ResetSignal,
1057 TIF_SetConfig,
1058 NULL,
1059 TIF_Callback,
1060 }
1061 };
1062
1063 #ifndef _TOOLS_
1064 union
1065 {
1066 USHORT s;
1067 UBYTE b[2];
1068 } test;
1069 #endif /* !_TOOLS_ */
1070
1071 TIF_Data.Handle = DrvHandle;
1072 TIF_Data.EnabledSignalType = 0;
1073 TIF_Data.Config = 0;
1074 TIF_Data.Callback = CallbackFunc;
1075
1076 #ifdef _TOOLS_
1077 switch (ccddata_init(NULL,0,NULL,NULL))
1078 {
1079 case CCDDATA_DLL_OK:
1080 case CCDDATA_DLL_ALREADY:
1081 break;
1082 default:
1083 return DRV_INITFAILURE;
1084 }
1085 #else /* _TOOLS_ */
1086 test.s = 1;
1087 if ( pcon != NULL )
1088 {
1089 ULONG sts = pcon->init_prim_coding ( TST_Handle,(UBYTE)((test.b[0]==1) ? PCON_LITTLE : PCON_BIG));
1090 #ifndef _TARGET_
1091 vsi_pcheck_register (pcon->pcheck, PCON_OK);
1092 #endif /* !_TARGET_ */
1093 }
1094 #endif /* !_TOOLS_ */
1095
1096 *DrvInfo = &TIF_Info;
1097
1098 return DRV_OK;
1099 }
1100 #endif
1101
1102