FreeCalypso > hg > fc-magnetite
view src/gpf2/tst/drv/tif2.c @ 695:530f71d65c20
uartfax.c: pull from Tourmaline (GTM900 RI output)
In addition to the primary intent of bringing in GTM900 RI output support,
pulling uartfax.c wholesale from Tourmaline also changes the initial_time
argument in the two NU_Create_Timer() calls from 0 to 1. This change
is required for the new version of Nucleus used in Tourmaline and Selenite
(and apparently also used by TI in LoCosto), and it is harmless (no effect)
for the original TCS211 version of Nucleus used in Magnetite.
The new philosophical model being adopted is that Tourmaline is our new
development head firmware, whereas Magnetite will now be maintained
similarly to how Linux maintainers treat stable kernels: changes will be
backported from Tourmaline if they are deemed appropriate for stable
modem firmware.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 24 Oct 2020 17:33:10 +0000 |
parents | cd37d228dae0 |
children |
line wrap: on
line source
/* +------------------------------------------------------------------------------ | File: tif.c +------------------------------------------------------------------------------ | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : This Modul contains the TIF driver +----------------------------------------------------------------------------- */ #ifndef __TIF_C__ #define __TIF_C__ #endif #include "typedefs.h" #include "string.h" #include "gdi.h" #include "vsi.h" #include "tools.h" #include "glob_defs.h" #include "ccdtable.h" #include "ccddata.h" #include "pcon.h" #include "p_mem.h" #include "drvconf.h" #include "tstheader.h" #ifdef _TOOLS_ #include "frame_const.h" #include <stdio.h> #endif /* _TOOLS_ */ #include "printtofile.h" #ifndef _TOOLS_ #if !defined (_SOLARIS_) && !defined (_LINUX_) #pragma pack(4) #endif #endif /*lint -e545 */ /*==== TYPES ======================================================*/ typedef struct { USHORT Handle; USHORT EnabledSignalType; T_DRV_CB_FUNC Callback; USHORT Config; } T_TIF_DATA; #ifdef _TOOLS_ typedef struct { unsigned int use_id; char *name; } T_RIV_USEID_TO_NAME; #endif /*==== CONSTANTS ==================================================*/ #define ALLOWED_TIF_SIGNALS (DRV_SIGTYPE_READ|DRV_SIGTYPE_CONNECT|DRV_SIGTYPE_DISCONNECT) #define NAME_LENGTH 4 #define TIF_RCV_CMD_SIZE 32 #define TIF_MAX_CMD (TIF_RCV_CMD_SIZE-1) #define STX 0x02 #define LF 0x0a #define PCON_ENABLED 0x0001 #define SYNC_MODE 0x0002 #undef VSI_CALLER #define VSI_CALLER TST_Handle, #ifdef _TOOLS_ const T_RIV_USEID_TO_NAME riv_use_id_to_name[] = { { 0x00010001, "RVM" }, { 0x00010002, "RVT" }, { 0x000A0001, "R2D" }, { 0x000A0002, "RTC" }, { 0x000A0004, "FFS" }, { 0x000A0008, "KPD" }, { 0x000A0010, "SPI" }, { 0x000A0020, "PWR" }, { 0x000A0040, "RGUI" }, { 0x00140001, "HCI" }, { 0x00140002, "L2CA" }, { 0x00140004, "BTCT" }, { 0x00140008, "RFC" }, { 0x00140010, "SPP" }, { 0x00140020, "HS" }, { 0x00140040, "HSG" }, { 0x00140080, "SDP" }, { 0x00140100, "DUN" }, { 0x00140200, "FAX" }, { 0x00140400, "OBX" }, { 0x00140800, "OPP" }, { 0x00141000, "FTP" }, { 0x00142000, "SYN" }, { 0x001E0001, "EXPL" }, { 0x001E0010, "AUDIO" }, { 0x001E0020, "ETM" }, { 0x001E0040, "DAR" }, { 0x001E0080, "MKS" }, { 0x001E0100, "MPM" }, { 0x001E0200, "LLS" }, { 0x001E0400, "ATP" }, { 0x001E0800, "ATPUART" }, { 0x001E2000, "MDC" }, { 0x001E4000, "TTY" }, { 0x001E8000, "DCM" }, { 0x00280001, "TEST" }, { 0x00280002, "TUT" }, { 0x00320001, "KIL" }, { 0x00320002, "KGC" }, { 0x00320004, "KCL" }, { 0x00320008, "KMM" }, { 0x00320010, "KNM" }, { 0x00320020, "UVM" }, { 0x00320040, "KZP" }, { 0x00320080, "KPG" }, { 0x00320100, "JTM" }, { 0x003C0001, "DEV1" }, { 0x003C0002, "DEV2" }, { 0x003C0003, "DEV3" }, { 0x00460001, "RNET" }, { 0x00460002, "RNET_WS" }, { 0x00460004, "RNET_RT" }, { 0x00460008, "RNET_BR" }, { 0x00640001, "MSME" }, { 0x00640002, "MSFE" }, { 0x00640004, "STKE" }, { 0x00640008, "BRSE" }, { 0x00640010, "BRAE" }, { 0x00640020, "PHSE" }, { 0x00640040, "IBSE" }, { 0x00640080, "MMSE" }, { 0x00640100, "SLSE" }, { 0x00640200, "SMAE" }, { 0x00640400, "MEAE" }, { 0x00640800, "SECE" }, { 0x00641000, "SELE" }, { 0x00642000, "PRSE" }, { 0x00644000, "JAAE" }, { 0x00648000, "JASE" }, { 0x006E0001, "IT1E" }, { 0x006E0002, "IT2E" }, { 0x006E0004, "IT0E" }, { 0x0, NULL} }; #endif /*==== EXTERNALS ==================================================*/ extern T_HANDLE TST_Handle; #ifndef _TOOLS_ extern const T_PCON_PROPERTIES *pcon; extern ULONG MaxPrimPartSize; extern const T_MEM_PROPERTIES *mem; #endif #ifdef CTB extern BOOL ctb_sent_to_tap; extern BOOL ctb_tick_enabled; #endif /*==== VARIABLES ==================================================*/ #ifndef RUN_INT_RAM char corruptWarning[] = "corrupt prim received: "; char wrongTSTWarning[] = "wrong (old) TST header used on toolside! "; T_TIF_DATA TIF_Data; static ULONG TIF_WrInd = 0; BOOL socket_flush = TRUE; #else extern T_TIF_DATA TIF_Data; extern BOOL socket_flush; #endif /* RUN_INT_RAM */ #ifdef _TOOLS_ char buffer[80]; const T_PCON_PROPERTIES pcon_export = { pcon_init_prim_coding, pcon_decodePrim, pcon_codePrim, pcon_make_filter, PCON_STACK_OFFSET }; T_PCON_PROPERTIES const *pcon = &pcon_export; #endif /*==== FUNCTIONS ==================================================*/ #ifndef RUN_INT_RAM USHORT TIF_Write ( void *Buffer, ULONG *BytesToWrite ); #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : TIF | | STATE : code ROUTINE : TIF_Exit | +--------------------------------------------------------------------+ PURPOSE : exit a driver */ LOCAL void TIF_Exit ( void ) { #ifdef _TOOLS_ ccddata_exit(); #endif /* _TOOLS_ */ } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : TIF | | STATE : code ROUTINE : TIF_Write | +--------------------------------------------------------------------+ PURPOSE : write data to driver */ /* Lint is not able to analyze the program flow through if...else constructions and therefor bring a bunch of warnings.*/ /*lint -e645 suppress warning -- Symbol '...' may not have been initialized */ /*lint -e644 suppress warning -- Symbol '...' may not have been initialized */ /*lint -e613 suppress warning -- possibly use of NULL pointer '...' */ USHORT TIF_Write ( void *Buffer, ULONG *BytesToWrite ) { T_PRIM_HEADER *prim = (T_PRIM_HEADER*)Buffer; T_PRIM_HEADER *prim_ptr = NULL; TST_SMALL_HEADER *tst_header_ptr; T_S_HEADER *s_hdr; unsigned int bytes_to_write; unsigned int size; unsigned int name_len; unsigned int length; unsigned int org_rcv_len = 0; unsigned int opc_len = 0; unsigned int bytes_written = 0; unsigned int write_flag = 0; char *write_ptr; char *tst_data_ptr; char trace_opc=0; char Sender[RESOURCE_NAMELEN] = {0}; void *coded_prim; void *decoded_prim; int pcon_called = 0; int is_primitive = TRUE; int ret = DRV_OK; int sts; #ifdef _TOOLS_ int is_generated_primitive = FALSE; #endif /* _TOOLS_ */ s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset); if ( prim->opc & SYS_MASK ) { size = prim->len - sizeof(T_PRIM_HEADER); tst_data_ptr = (char*)P2D(prim); tst_header_ptr = (TST_SMALL_HEADER*) tst_data_ptr - 1; tst_header_ptr->combined[INFO_BYTE] = (~HDR_IDENT_MASK | IDENT_SYS_PRIM); InsertString(s_hdr->rcv, (char*)&tst_header_ptr->receiver, 4); is_primitive = FALSE; #ifdef _TOOLS_ if ( (length = GetNextToken (tst_data_ptr, buffer, " #")) > 0) { if ( !strcmp (buffer, FILTER) ) { void *filter_prim; if ( (pcon != NULL) && pcon->make_filter(tst_data_ptr+length+1, &filter_prim) == PCON_OK ) { prim = D2P(filter_prim); s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset); is_primitive = TRUE; is_generated_primitive = TRUE; } } } #endif } else if ( (SAP_NR(prim->opc)==TRACE_SAP) || (prim->opc==TRACE_OPC) ) { is_primitive = FALSE; size = prim->len - sizeof(T_PRIM_HEADER); tst_data_ptr = (char*)P2D(prim); if (prim->opc!=TRACE_OPC) { /* we have a traceclass id */ trace_opc=(char)PRIM_NR(prim->opc); } tst_header_ptr = (TST_SMALL_HEADER*) tst_data_ptr - 1; tst_header_ptr->combined[INFO_BYTE] = (~HDR_IDENT_MASK | IDENT_TRACE); InsertString(FRM_PCO_NAME, (char*)&tst_header_ptr->receiver, 4); } if ( is_primitive == TRUE ) { TST_BIG_HEADER tst_big_header; TST_BIG_HEADER *tst_big_header_ptr; #ifdef _TOOLS_ /* on the tool side the primitive to be duplicated is copied when sent to TST */ prim_ptr = prim; #else /* in the target a pointer to the primitive to be duplicated is transported in a carrier of type T_PRIM_X */ prim_ptr = (T_PRIM_HEADER*)((T_PRIM_X*)(prim))->prim_ptr; #endif size = prim_ptr->len - sizeof(T_PRIM_HEADER); tst_data_ptr = (char*)P2D(prim_ptr); tst_big_header_ptr = &tst_big_header; opc_len = 4; org_rcv_len = 4; if ( (pcon != NULL) && (TIF_Data.Config & PCON_ENABLED) && !(prim_ptr->opc & VIRTUAL_OPC) ) { decoded_prim = P2D(prim_ptr); if ( (sts = (int)(pcon->code_prim( prim_ptr->opc, decoded_prim, &coded_prim, (ULONG*)&size, 0, s_hdr->rcv ))) != PCON_OK ) { vsi_o_ttrace (NO_TASK, TC_SYSTEM,"PCON Code Error %d, TIF_Write() aborted", sts ); return DRV_INTERNAL_ERROR; } else { prim_ptr = D2P(coded_prim); tst_data_ptr = coded_prim; pcon_called = 1; } } EXCHANGE_4BYTES_ENDIANESS(&prim_ptr->opc); tst_big_header_ptr->opc = prim_ptr->opc; tst_big_header_ptr->combined[INFO_BYTE] = (~HDR_IDENT_MASK | IDENT_PS_PRIM); InsertString(s_hdr->rcv, (char*) &tst_big_header_ptr->receiver, 4); InsertString(s_hdr->org_rcv, (char*) &tst_big_header_ptr->orgreceiver, 4); socket_flush = TRUE; tst_header_ptr = (TST_SMALL_HEADER*) tst_big_header_ptr; } tst_header_ptr->combined[INFO_BYTE] = ((tst_header_ptr->combined[INFO_BYTE] & (~HDR_VERSION_MASK)) | HDR_VALID_VERSION_1); tst_header_ptr->combined[INFO_BYTE] = ((tst_header_ptr->combined[INFO_BYTE] & (~HDR_TIME_MASK)) | HDR_TIME_MS); tst_header_ptr->time = s_hdr->time; EXCHANGE_4BYTES_ENDIANESS(&tst_header_ptr->time); tst_header_ptr->sender[0] = 0; if ( s_hdr->snd[0] == 0 ) { if ( *tst_data_ptr == '~') { name_len = GetNextToken ((char*)(tst_data_ptr), Sender, "~"); InsertString(Sender, (char*) &tst_header_ptr->sender, 4); size -= 2+name_len; /* rub out a leading ~NAM~ in data field: */ memcpy ( tst_data_ptr, tst_data_ptr + 2 + name_len, size ); } else { InsertString(FRM_SYST_NAME, (char*)&tst_header_ptr->sender, 4); } } else { T_HANDLE TaskHandle; if ( s_hdr->snd[0] & ~HANDLE_MASK ) { TaskHandle = (T_HANDLE)(s_hdr->snd[0]&HANDLE_MASK); vsi_e_name ( TST_Handle, TaskHandle, Sender ); InsertString(Sender, (char*)&tst_header_ptr->sender, 4); } else { InsertString(s_hdr->snd, (char*)&tst_header_ptr->sender, 4); } } length = size + TST_HEADER_TRAILING_FIELDS + org_rcv_len + opc_len + (trace_opc ? 1 : 0); tst_header_ptr->combined[FIRST_BYTE] = (UBYTE) (LOW_MASK & length); tst_header_ptr->combined[SECOND_BYTE] = (UBYTE) (LOW_MASK & (length >> 8)); bytes_to_write = length + TST_HEADER_LEADING_FIELDS; write_ptr = (char*)&tst_header_ptr->combined[INFO_BYTE]; if (trace_opc) { /* move small header 1 byte to the left and insert trace class id */ char *trace_opc_ptr=tst_data_ptr-1; write_ptr = (char*)tst_header_ptr; memcpy(write_ptr,(char*)tst_header_ptr+1,sizeof(TST_SMALL_HEADER)-1); *trace_opc_ptr=trace_opc; length++; } else if ( prim_ptr != NULL ) { bytes_written = TST_BIG_HEADER_SIZE; if ( vsi_d_write ( TIF_Data.Handle, 0, write_ptr, bytes_written | PRIM_HEADER_FLAG ) != VSI_OK ) { ret = DRV_INTERNAL_ERROR; *BytesToWrite = 0; } write_ptr = tst_data_ptr; write_flag = PRIM_DATA_FLAG; } if (ret==DRV_OK) { #if defined (_TOOLS_) || defined (_LINUX_) || defined (_SOLARIS_) socket_flush = TRUE; /* flush socket always on tool side */ #endif if ( vsi_d_write ( TIF_Data.Handle, 0, write_ptr, (bytes_to_write - bytes_written) | write_flag ) != VSI_OK ) { ret = DRV_INTERNAL_ERROR; *BytesToWrite = 0; } } if ( pcon_called ) { PFREE(P2D((T_VOID_STRUCT*)prim_ptr)); } #ifdef _TOOLS_ if ( is_generated_primitive == TRUE ) { vsi_c_free ( TST_Handle, (T_VOID_STRUCT**)&prim ); } #else /* _TOOLS_ */ if (prim->opc & MEMHANDLE_OPC) { M_FREE(P_MEMHANDLE_SDU(((T_PRIM_X*)(prim))->prim_ptr)); } #endif /* _TOOLS_ */ #if defined _NUCLEUS_ && !defined _TARGET_ #ifdef CTB if(ctb_tick_enabled && !ctb_sent_to_tap && !strncmp(tst_header_ptr->receiver,"TAP",3)) { ctb_sent_to_tap = TRUE; } #endif #endif return ( (USHORT)ret ); } /*lint +e645 */ /*lint +e613 */ #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : TIF | | STATE : code ROUTINE : TIF_SetSignal | +--------------------------------------------------------------------+ PURPOSE : enable signal for the driver */ LOCAL USHORT TIF_SetSignal ( USHORT SignalType ) { if ( !(SignalType & ALLOWED_TIF_SIGNALS) ) return DRV_INVALID_PARAMS; else TIF_Data.EnabledSignalType |= SignalType; return DRV_OK; } #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : TIF | | STATE : code ROUTINE : TIF_ResetSignal | +--------------------------------------------------------------------+ PURPOSE : disable signal for the driver */ LOCAL USHORT TIF_ResetSignal ( USHORT SignalType ) { if ( !(SignalType & ALLOWED_TIF_SIGNALS) ) return DRV_INVALID_PARAMS; else TIF_Data.EnabledSignalType &= ~SignalType; return DRV_OK; } #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : TIF | | STATE : code ROUTINE : TIF_SetConfig | +--------------------------------------------------------------------+ PURPOSE : set configuration for the driver */ /*lint -esym(715,Buffer), suppress Info -- Symbol 'Buffer' not referenced) */ LOCAL USHORT TIF_SetConfig ( char *Buffer ) { if ( !strcmp ( TIF_PCON_ENABLE, Buffer ) ) { if ( TIF_Data.Config & PCON_ENABLED) { /* already in PCON mode */ return DRV_OK; } #ifdef _TOOLS_ switch (ccddata_init(NULL,0,NULL,NULL)) { case CCDDATA_DLL_OK: case CCDDATA_DLL_ALREADY: break; default: return DRV_INTERNAL_ERROR; } #endif TIF_Data.Config |= PCON_ENABLED; #ifdef _TOOLS_ printf("TIF: PCON mode selected\n"); #endif return DRV_OK; } else if ( !strcmp ( DRV_DEFAULT, Buffer ) ) { if ( !(TIF_Data.Config & PCON_ENABLED)) { /* already in default mode */ return DRV_OK; } #ifdef _TOOLS_ ccddata_exit(); #endif TIF_Data.Config &= ~PCON_ENABLED; #ifdef _TOOLS_ printf("TIF: default mode selected\n"); #endif return DRV_OK; } #ifdef _TOOLS_ else if ( !strcmp ( ENABLE_SYNC_MODE, Buffer ) ) { TIF_Data.Config |= SYNC_MODE; PrintToFile("TIF: sync mode enabled\n"); return DRV_OK; } else if ( !strcmp ( DISABLE_SYNC_MODE, Buffer ) ) { TIF_Data.Config &= ~SYNC_MODE; PrintToFile("TIF: sync mode disabled\n"); return DRV_OK; } return DRV_INVALID_PARAMS; #else return DRV_OK; #endif } #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : TIF | | STATE : code ROUTINE : Callback | +--------------------------------------------------------------------+ PURPOSE : callback function of the driver */ /* Lint is not able to analyze the program flow through if...else constructions and therefor bring a bunch of warnings.*/ /*lint -esym(645,opc_str) suppress warning -- Symbol 'opc_str' may not have been initialized */ LOCAL void TIF_Callback ( T_DRV_SIGNAL *Signal ) { T_PRIM_HEADER *prim; T_S_HEADER *s_hdr; T_PRIM_X *sys_prim; T_DRV_SIGNAL TIF_Signal; TST_BIG_HEADER tst_header; unsigned int CorruptByteOffset = 0; unsigned int length; unsigned int BytesToRead = 0; unsigned int BytesRead; unsigned int Bytes = 0; unsigned int i; unsigned int opc_len = 0; unsigned int org_rcv_len = 0; unsigned int alloc_size; int sts; int WrongTSTHeader = FALSE; char *target; void *decoded_prim; char opc_str[4]; #ifdef _TOOLS_ int l1_sigtype = 0; #endif switch ( Signal->SignalType ) { #ifdef _TOOLS_ case DRV_SIGTYPE_READ_L1: l1_sigtype = 1; /*lint -fallthrough*/ case DRV_SIGTYPE_READ_RIV: if ( vsi_d_read ( TIF_Data.Handle, 0, NULL, &BytesToRead ) != DRV_OK ) return; alloc_size = S_ALLOC_SIZE(BytesToRead + 1); if ( ( prim = (T_PRIM_HEADER*)vsi_c_new ( TST_Handle, alloc_size, 0 FILE_LINE_MACRO )) != NULL ) { TIF_WrInd = 0; Bytes = 0; BytesRead = BytesToRead; do { vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)P2D(prim)+TIF_WrInd), &BytesRead ); Bytes += BytesRead; if ( Bytes < BytesToRead ) { TIF_WrInd += BytesRead; BytesRead = BytesToRead - BytesRead; } } while ( Bytes < BytesToRead ); prim->sh_offset = S_HDR_OFFSET(alloc_size - sizeof(T_S_HEADER)); s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset); s_hdr->time = 0; s_hdr->org_rcv[0] = 0; if ( l1_sigtype == 1 ) { strcpy ( s_hdr->snd, "L1" ); } else { int i = 0; unsigned int use_id = 0; unsigned char *p = (unsigned char*)P2D(prim); use_id = use_id | *p++ << 24; use_id = use_id | *p++ << 16; use_id = use_id | *p++ << 8; use_id = use_id | *p; do { if ( riv_use_id_to_name[i].use_id == use_id ) { strcpy ( s_hdr->snd, riv_use_id_to_name[i].name ); break; } if ( riv_use_id_to_name[i+1].use_id == 0 ) strcpy ( s_hdr->snd, "RIV" ); } while ( riv_use_id_to_name[++i].use_id != 0 ); memcpy ( (char*)P2D(prim), (char*)P2D(prim)+5, BytesToRead); } strcpy ( s_hdr->rcv, FRM_PCO_NAME ); sys_prim = (T_PRIM_X*) vsi_c_new ( TST_Handle, alloc_size, 0 FILE_LINE_MACRO ); sys_prim->prim_ptr = prim; prim->opc = 0; prim->len = BytesToRead + sizeof(T_PRIM_HEADER); if ( TIF_Data.EnabledSignalType & DRV_SIGTYPE_READ ) { VSI_PPM_SEND ( (T_PRIM_HEADER*)sys_prim, TST_Handle ); VSI_PPM_SEND ( (T_PRIM_HEADER*)sys_prim->prim_ptr, TST_Handle ); TIF_Signal.SignalType = DRV_SIGTYPE_READ; TIF_Signal.DrvHandle = TIF_Data.Handle; TIF_Signal.UserData = (T_VOID_STRUCT*)sys_prim; (TIF_Data.Callback)( &TIF_Signal ); } } break; #endif case DRV_SIGTYPE_READ: /* * Get the size of the needed buffer to store the data */ if ( vsi_d_read ( TIF_Data.Handle, 0, NULL, (ULONG*)&BytesToRead ) != DRV_OK ) return; if ( BytesToRead ) { if ( BytesToRead >= TST_SMALL_HEADER_SIZE ) BytesToRead -= TST_SMALL_HEADER_SIZE; Bytes = 0; TIF_WrInd = 0; BytesRead = TST_SMALL_HEADER_SIZE; do { vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)&tst_header.combined[INFO_BYTE]+TIF_WrInd), (ULONG*)&BytesRead ); Bytes += BytesRead; if ( Bytes < TST_SMALL_HEADER_SIZE ) { TIF_WrInd += BytesRead; BytesRead = TST_SMALL_HEADER_SIZE - BytesRead; } } while ( Bytes < TST_SMALL_HEADER_SIZE ); alloc_size = ALIGN(sizeof(T_PRIM_X)); sys_prim = (T_PRIM_X*) vsi_c_new ( TST_Handle, alloc_size, 0 FILE_LINE_MACRO ); switch (tst_header.combined[INFO_BYTE] & HDR_IDENT_MASK) { case IDENT_ABORT: tst_header.combined[INFO_BYTE] = ((tst_header.combined[INFO_BYTE] & ~HDR_IDENT_MASK) | IDENT_TRACE); #ifdef _TOOLS_ /* TR did loose byte(s)! Primitive is corrupt, no header val can be guaranteed to be valid. Create a HUGE trace prim with zero time, sender tst, receiver pco, org_receiver tst TRACE DATA will contain: a "corrupt prim received: " string, the already received part of the prim and all the rest */ CorruptByteOffset = TST_SMALL_HEADER_SIZE + strlen(corruptWarning) + 1; #else /* TR did receive a prim from tool side old TST header format and swiched to new. Now we have to TRACE the wrong tool side format, because the prim is lost. */ WrongTSTHeader = TRUE; BytesToRead = 0; CorruptByteOffset = strlen(wrongTSTWarning) + 1; #endif break; case IDENT_PS_PRIM: opc_len = 4; org_rcv_len = 4; break; default: break; } if ( (BytesRead = org_rcv_len) > 0 ) { if ( BytesToRead >= org_rcv_len ) BytesToRead -= org_rcv_len; Bytes = 0; TIF_WrInd = 0; do { vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)&tst_header.orgreceiver+TIF_WrInd), (ULONG*)&BytesRead ); Bytes += BytesRead; if ( Bytes < org_rcv_len ) { TIF_WrInd += BytesRead; BytesRead = org_rcv_len - BytesRead; } } while ( Bytes < org_rcv_len ); } if ( (BytesRead = opc_len) > 0 ) { if ( BytesToRead >= opc_len ) BytesToRead -= opc_len; Bytes = 0; TIF_WrInd = 0; do { vsi_d_read ( TIF_Data.Handle, 0, (void*)(opc_str+TIF_WrInd), (ULONG*)&BytesRead ); Bytes += BytesRead; if ( Bytes < opc_len ) { TIF_WrInd += BytesRead; BytesRead = opc_len - BytesRead; } } while ( Bytes < opc_len ); } alloc_size = S_ALLOC_SIZE(CorruptByteOffset + BytesToRead + 1); #ifdef _TOOLS_ if ( alloc_size > MAX_PRIM_PARTITION_SIZE - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER)) alloc_size = MAX_PRIM_PARTITION_SIZE - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER); #else if ( alloc_size > MaxPrimPartSize - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER) ) alloc_size = MaxPrimPartSize - sizeof(T_PRIM_HEADER) - sizeof(T_S_HEADER); #endif if ( ( prim = (T_PRIM_HEADER*)vsi_c_new ( TST_Handle, alloc_size, 0 FILE_LINE_MACRO )) != NULL ) { TIF_WrInd = 0; Bytes = 0; if ((BytesToRead + CorruptByteOffset) > alloc_size) { #ifdef _TOOLS_ PrintToFile("TIF: Reduced a new Prim's size\n"); #endif BytesToRead = alloc_size - CorruptByteOffset; } BytesRead = BytesToRead; target = (char*) P2D(prim); if (WrongTSTHeader) { memcpy(target, wrongTSTWarning, strlen(wrongTSTWarning)); target += strlen(wrongTSTWarning); } else if (CorruptByteOffset) { #ifdef _TOOLS_ PrintToFile("TIF: Byte(s) lost\n"); #endif memcpy(target, corruptWarning, strlen(corruptWarning)); target += strlen(corruptWarning); /*lint -e420, suppress Warning -- Apparent access beyond array for function 'memcpy(...*/ memcpy(target,&tst_header.combined[INFO_BYTE], TST_SMALL_HEADER_SIZE-1); /*lint +e420 */ target += TST_SMALL_HEADER_SIZE - 1; } if (WrongTSTHeader == FALSE && BytesToRead) { if ( (tst_header.combined[INFO_BYTE] & HDR_IDENT_MASK)==IDENT_TRACE ) { /* we read the first bytes in advance in case the trace class is carried */ ULONG bread=1; vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)target+TIF_WrInd), &bread ); if (bread==1 && *((char*)target)<0x20) /* no character -> assume traceclass id */ { opc_str[0]=*((char*)target); opc_len=1; BytesToRead -= bread; } else { /* ok, we have no traceclass info :-( */ TIF_WrInd += bread; Bytes += bread; } BytesRead = BytesToRead - Bytes; } do { vsi_d_read ( TIF_Data.Handle, 0, (void*)((char*)target+TIF_WrInd), (ULONG*)&BytesRead ); Bytes += BytesRead; if ( Bytes < BytesToRead ) { TIF_WrInd += BytesRead; BytesRead = BytesToRead - Bytes; } } while ( Bytes < BytesToRead ); } *((char*)target + Bytes) = 0; prim->sh_offset = S_HDR_OFFSET(alloc_size - sizeof(T_S_HEADER)); s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset); switch (tst_header.combined[INFO_BYTE] & HDR_IDENT_MASK) { case IDENT_PS_PRIM: EXCHANGE_4BYTES_ENDIANESS(opc_str); memcpy((char*)&prim->opc, opc_str, 4); if ( (pcon != NULL) && (TIF_Data.Config & PCON_ENABLED) ) { if ( (sts = (int)pcon->decode_prim ( prim->opc, &decoded_prim, (void*)((char*)prim+sizeof(T_PRIM_HEADER)), (ULONG*)&length, 0 )) != PCON_OK ) { if ( sts != PCON_CONFIG_PRIM ) { vsi_o_ttrace (NO_TASK, TC_SYSTEM,"PCON Deode Error %d, TIF_Callback() aborted", sts ); } PFREE(P2D(sys_prim)); PFREE(P2D(prim)); return; } PFREE(P2D((T_VOID_STRUCT*)prim)); sys_prim->prim_ptr = D2P(decoded_prim); } else { sys_prim->prim_ptr = prim; length = BytesToRead; } sys_prim->prim_ptr->sh_offset = S_HDR_OFFSET(length+sizeof(T_PRIM_HEADER)); sys_prim->prim_ptr->len = length + sizeof(T_PRIM_HEADER); s_hdr = (T_S_HEADER*)((ULONG*)sys_prim->prim_ptr + sys_prim->prim_ptr->sh_offset); #ifndef _TOOLS_ /* evtl. convert aux sdu to mem handle */ if (sys_prim->prim_ptr->opc & MEMHANDLE_OPC && mem!=NULL) { if (P_MEMHANDLE_SDU(sys_prim->prim_ptr)) { U32 mem_handle; U8 buffer_handle; U8 user_handle; U8 *user_data; T_sdu *sdu; U16 len; sdu=(T_sdu *)P_MEMHANDLE_SDU(sys_prim->prim_ptr); len=(sdu->l_buf + 7)/8; buffer_handle=mem->create_buffer(MEM_UNORDERED_BUFFER, len); user_handle = mem->create_user(buffer_handle, 23, "TST"); user_data=mem->alloc(user_handle,len,&mem_handle); memcpy(user_data,sdu->buf+(sdu->o_buf+7)/8,len); P_MEMHANDLE(sys_prim->prim_ptr)=mem_handle; mem->delete_user(user_handle); mem->delete_buffer(buffer_handle); } } #endif break; case IDENT_SYS_PRIM: sys_prim->prim_ptr = prim; prim->opc = SYS_MASK; prim->len = BytesToRead + sizeof(T_PRIM_HEADER); break; case IDENT_TRACE: sys_prim->prim_ptr = prim; if (opc_len) { /* nice, we found a traceclass info */ prim->opc = opc_str[0]; prim->opc = prim->opc << 16; prim->opc |= EXTENDED_OPC | VIRTUAL_OPC | TRACE_SAP; } else { prim->opc = TRACE_OPC; } prim->len = CorruptByteOffset + BytesToRead + sizeof(T_PRIM_HEADER); break; default: break; } /* * Extract Sender and Receiverfrom header */ if (CorruptByteOffset) { s_hdr->time = NULL; #ifndef _TOOLS_ memcpy ( s_hdr->snd, "~TST", 4 ); memcpy ( s_hdr->rcv, FRM_TST_NAME, 4 ); #else memcpy ( s_hdr->snd, FRM_TST_NAME, 4 ); memcpy ( s_hdr->rcv, FRM_PCO_NAME, 4 ); #endif memcpy ( s_hdr->org_rcv, "TST", 4 ); } else { s_hdr->time = tst_header.time; i = 0; do { s_hdr->snd[i] = tst_header.sender[i]; i++; } while ( tst_header.sender[i] != 0x20 && i < 4 ); s_hdr->snd[i] = 0; i = 0; do { s_hdr->rcv[i] = tst_header.receiver[i]; i++; } while ( tst_header.receiver[i] != 0x20 && i < 4 ); s_hdr->rcv[i] = 0; if (org_rcv_len) { i = 0; do { s_hdr->org_rcv[i] = tst_header.orgreceiver[i]; i++; } while ( tst_header.orgreceiver[i] != 0x20 && i < 4 ); s_hdr->org_rcv[i] = 0; } } if ( TIF_Data.EnabledSignalType & DRV_SIGTYPE_READ ) { VSI_PPM_SEND ( (T_PRIM_HEADER*)sys_prim, TST_Handle ); VSI_PPM_SEND ( (T_PRIM_HEADER*)sys_prim->prim_ptr, TST_Handle ); TIF_Signal.SignalType = DRV_SIGTYPE_READ; TIF_Signal.DrvHandle = TIF_Data.Handle; TIF_Signal.UserData = (T_VOID_STRUCT*)sys_prim; (TIF_Data.Callback)( &TIF_Signal ); } } } /* if ( BytesToRead ) */ break; case DRV_SIGTYPE_CONNECT: case DRV_SIGTYPE_DISCONNECT: if ( TIF_Data.EnabledSignalType & Signal->SignalType ) { TIF_Signal.SignalType = Signal->SignalType; TIF_Signal.DrvHandle = TIF_Data.Handle; TIF_Signal.UserData = NULL; (TIF_Data.Callback)( &TIF_Signal ); } break; default: break; } } #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : TIF | | STATE : code ROUTINE : TIF_Init | +--------------------------------------------------------------------+ PURPOSE : initialize driver */ GLOBAL USHORT TIF_Init ( USHORT DrvHandle, T_DRV_CB_FUNC CallbackFunc, T_DRV_EXPORT const **DrvInfo ) { static const T_DRV_EXPORT TIF_Info = { TIF_NAME, 0, { #ifdef _TOOLS_ TIF_Init, #endif TIF_Exit, NULL, TIF_Write, NULL, NULL, NULL, TIF_SetSignal, TIF_ResetSignal, TIF_SetConfig, NULL, TIF_Callback, } }; #ifndef _TOOLS_ union { USHORT s; UBYTE b[2]; } test; #endif /* !_TOOLS_ */ TIF_Data.Handle = DrvHandle; TIF_Data.EnabledSignalType = 0; TIF_Data.Config = 0; TIF_Data.Callback = CallbackFunc; #ifdef _TOOLS_ switch (ccddata_init(NULL,0,NULL,NULL)) { case CCDDATA_DLL_OK: case CCDDATA_DLL_ALREADY: break; default: return DRV_INITFAILURE; } #else /* _TOOLS_ */ test.s = 1; if ( pcon != NULL ) { ULONG sts = pcon->init_prim_coding ( TST_Handle,(UBYTE)((test.b[0]==1) ? PCON_LITTLE : PCON_BIG)); #ifndef _TARGET_ vsi_pcheck_register (pcon->pcheck, PCON_OK); #endif /* !_TARGET_ */ } #endif /* !_TOOLS_ */ *DrvInfo = &TIF_Info; return DRV_OK; } #endif