diff gpf/tst/DRV/thif_link.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpf/tst/DRV/thif_link.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,533 @@
+/* 
++------------------------------------------------------------------------------
+|  File:       thif_link.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 serial driver adaptation
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef __THIF_LINK_C__
+#define __THIF_LINK_C__
+#endif
+
+/* these types are used in thif_socket.h */
+#define Char char
+#define Bool8 char
+#define Int8 signed char
+#define Uint8 unsigned char
+#define UInt16 unsigned short int 
+#define Uint16 unsigned short int 
+#define Uint32 unsigned long int
+#define Int32  long int
+
+
+#ifdef _TARGET_ 
+  #include "thif_link.h"
+  #include "\global_af\thif\thif_socket.h" 
+  #include "string.h"
+#else
+ #include <windows.h>
+ #include <stdio.h>
+ #include "usart.h"
+ #include "stdlib.h"
+ #include "string.h"
+ #include "tools.h"
+#endif
+
+#include "vsi.h"
+#include "drvconf.h"
+#include "tstheader.h"
+#include "os.h"
+
+
+
+
+
+/*==== TYPES ======================================================*/
+
+typedef struct
+{
+  USHORT Handle;
+  USHORT EnabledSignalType;
+  T_DRV_CB_FUNC Callback;
+  char Connected;
+  Int8 thif_link;
+} T_THIF_LINK_DATA;
+
+
+typedef union {
+  USHORT scalar;
+  Uint8 array[2];
+} SWAPPER;
+
+/*==== CONSTANTS ==================================================*/
+
+#define ALLOWED_THIF_LINK_SIGNALS   (DRV_SIGTYPE_READ|DRV_SIGTYPE_CONNECT)
+#define MAX_CONFIGSTR_LEN 50
+#define NO_GOTDATA_CALLBACK 0
+#define rxBufSz 0x800
+#define txBufSz  0x800
+#define WAIT_FOR_RECONNECT 500
+
+/*==== EXTERNALS ==================================================*/
+
+
+/*==== VARIABLES ==================================================*/
+
+T_THIF_LINK_DATA THIF_LINK_Data;
+static T_DRV_SIGNAL Signal;
+
+
+Uint8 rxBuffer[rxBufSz];
+Uint8 txBuffer[txBufSz];
+Uint8 *prxBuffer = &rxBuffer[0];
+Uint8 *ptxBuffer = &txBuffer[0];
+
+GLOBAL OS_TIME WT;
+GLOBAL OS_TIME RT;
+
+/* static unsigned long int foolishSizeArgument = 0; */
+
+
+/*==== FUNCTIONS ==================================================*/
+
+#ifndef MIN
+#  define MIN(a,b)  (((a) < (b)) ? (a) : (b))
+#endif
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : swapUSHORT            |
++--------------------------------------------------------------------+
+
+  PURPOSE : byte sex handling
+
+*/
+void swapUSHORT(USHORT* candidate)
+{
+  SWAPPER source;
+  SWAPPER dest;
+  
+  source.scalar = *candidate;
+  dest.array[0] = source.array[1];
+  dest.array[1] = source.array[0];
+  *candidate = dest.scalar;
+  
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : beSureToBeConnected            |
++--------------------------------------------------------------------+
+
+  PURPOSE : callback function of the driver
+
+*/
+
+void beSureToBeConnected()
+{
+  if (THIF_LINK_Data.thif_link < 0)
+  {
+    thif_link_Open();
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_binding_Callback            |
++--------------------------------------------------------------------+
+
+  PURPOSE : callback function of the driver
+
+*/
+void thif_binding_Callback (Int8 sockId) /* this is a bridge to connect the THIF binding callback to the TR-defined callback (see thif_link_Open) */
+{
+  if ( THIF_LINK_Data.EnabledSignalType & DRV_SIGTYPE_READ )
+  {
+    Signal.SignalType = DRV_SIGTYPE_READ;
+    Signal.DrvHandle = THIF_LINK_Data.Handle;
+    (THIF_LINK_Data.Callback)( &Signal );
+  }
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_Exit            |
++--------------------------------------------------------------------+
+
+  PURPOSE : exit a driver
+
+*/
+void thif_link_Exit ( void )
+{
+  thif_link_Close();
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_Open            |
++--------------------------------------------------------------------+
+
+  PURPOSE : open connection to driver
+
+*/
+USHORT thif_link_Open(void)
+{
+  LONG result = -1;
+
+  while (result < 0)
+  {
+    result = thif_socket_open(THIF_LINK_NAME, thif_binding_Callback, prxBuffer, rxBufSz, ptxBuffer, txBufSz );
+    if (result < 0)
+    {
+      //os_SuspendTask ( 0, WAIT_FOR_RECONNECT);
+    }
+  }
+  THIF_LINK_Data.thif_link = result;
+  THIF_LINK_Data.EnabledSignalType = DRV_SIGTYPE_READ;
+
+  Signal.SignalType = DRV_SIGTYPE_CONNECT;
+  Signal.DrvHandle = THIF_LINK_Data.Handle;
+  Signal.UserData = NULL;
+  (THIF_LINK_Data.Callback)( &Signal );
+  
+  THIF_LINK_Data.Connected = TRUE;
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_Close            |
++--------------------------------------------------------------------+
+
+  PURPOSE : exit a driver
+
+*/
+USHORT thif_link_Close(void )
+{
+  if (thif_socket_close(THIF_LINK_Data.thif_link)  < 0)
+  {
+    return DRV_INTERNAL_ERROR;
+  }
+  THIF_LINK_Data.thif_link = -1;
+  THIF_LINK_Data.EnabledSignalType = DRV_SIGTYPE_DISCONNECT;
+
+  Signal.DrvHandle = THIF_LINK_Data.Handle;
+  Signal.UserData = NULL;
+  (THIF_LINK_Data.Callback)( &Signal );
+
+  THIF_LINK_Data.Connected = FALSE;
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_Read            |
++--------------------------------------------------------------------+
+
+  PURPOSE : read data from driver
+
+*/
+USHORT thif_link_Read ( void *Buffer, ULONG *SizeInBytes)
+{  
+
+  OS_TIME timeBefore;
+  OS_TIME timeAfter;
+  T_HANDLE caller;
+  USHORT retVal;
+
+/*  
+  ULONG to_read = *SizeInBytes;
+  Uint8* buff = (Uint8*) Buffer;
+  
+  beSureToBeConnected();
+  caller = os_MyHandle();
+
+  if (foolishSizeArgument == 0)
+  {
+    to_read = thif_socket_read(THIF_LINK_Data.thif_link, buff, 2);
+    foolishSizeArgument = buff[0]*0xff + buff[1];
+  }
+  to_read= foolishSizeArgument;
+
+  //os_GetTime (caller,  &timeBefore);
+  to_read = MIN(to_read, *SizeInBytes);
+  *SizeInBytes = thif_socket_read(THIF_LINK_Data.thif_link, buff, to_read);
+ 
+  if (*SizeInBytes <= foolishSizeArgument)
+  {
+    foolishSizeArgument -= *SizeInBytes;
+    retVal = DRV_OK;
+  }
+  else
+  {
+    foolishSizeArgument = 0;
+    retVal = DRV_INTERNAL_ERROR;
+  }
+  
+  //os_GetTime (caller,  &timeAfter);
+  //RT= timeAfter - timeBefore;
+  return retVal;
+*/
+  *SizeInBytes = thif_socket_read( THIF_LINK_Data.thif_link, Buffer, *SizeInBytes ); 
+  return DRV_OK;
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_Write_to_socket           |
++--------------------------------------------------------------------+
+
+  PURPOSE : write data to driver
+
+*/
+void thif_link_Write_to_socket (void *Buffer, ULONG sizeInBytes )
+{
+  T_HANDLE caller;
+  Uint8* buff;
+
+  OS_TIME timeBefore;
+  OS_TIME timeAfter;
+  ULONG to_write;
+    
+  LONG written = -1;
+
+
+  buff = (Uint8*) Buffer;
+  to_write = sizeInBytes;
+  caller = os_MyHandle();
+  while (to_write > 0)
+  {
+    //os_GetTime (caller,  &timeBefore);
+    written = thif_socket_write(THIF_LINK_Data.thif_link, buff, to_write);
+    //os_GetTime (caller,  &timeAfter);
+    //WT = timeAfter - timeBefore;
+    if (written < 0)
+    {
+      //os_SuspendTask (caller, WAIT_FOR_RECONNECT);
+    }
+    else if (written == 0)
+    {
+      os_SuspendTask (caller, 2000);
+      //break;
+    }
+    else
+    {
+      to_write -= written;
+      buff += written;
+    }
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_Write           |
++--------------------------------------------------------------------+
+
+  PURPOSE : relay 2 byte header & data to thif_link_Write_to_socket
+
+*/
+USHORT thif_link_Write ( void *Buffer, ULONG *SizeInBytes )
+{
+  USHORT TSTSocketMarker;
+  Uint8* buff;
+
+  beSureToBeConnected();
+
+  /* TST's socket interface expects a 2-byte header containing the length of the real message  to receive
+      in funtion socket_Read.  We just send that header, converting it to little endian in advance 
+  TSTSocketMarker = (USHORT) *SizeInBytes;
+  swapUSHORT(&TSTSocketMarker);
+
+  buff = (Uint8*) &TSTSocketMarker;
+  thif_link_Write_to_socket( buff, 2);
+  */
+  
+  buff = (Uint8*) Buffer;
+  thif_link_Write_to_socket(buff, *SizeInBytes);
+  
+  //thif_socket_flush(THIF_LINK_Data.thif_link);
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_Flush           |
++--------------------------------------------------------------------+
+
+  PURPOSE : flush  data to driver
+
+*/
+USHORT thif_link_Flush (void)
+{
+  beSureToBeConnected();
+  return thif_socket_flush(THIF_LINK_Data.thif_link);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_SetSignal       |
++--------------------------------------------------------------------+
+
+  PURPOSE : enable signal for the driver
+
+*/
+USHORT thif_link_SetSignal ( USHORT SignalType )
+{
+  if ( !(SignalType & ALLOWED_THIF_LINK_SIGNALS) )
+  {
+    return DRV_INVALID_PARAMS;
+  }
+  else
+  {
+    THIF_LINK_Data.EnabledSignalType |= SignalType;
+  }
+
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_ResetSignal     |
++--------------------------------------------------------------------+
+
+  PURPOSE : disable signal for the driver
+
+*/
+USHORT thif_link_ResetSignal ( USHORT SignalType )
+{
+  if ( !(SignalType & ALLOWED_THIF_LINK_SIGNALS) )
+  {
+    return DRV_INVALID_PARAMS;
+  }
+  else
+  {
+    THIF_LINK_Data.EnabledSignalType &= ~SignalType;
+  }
+
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_SetConfig       |
++--------------------------------------------------------------------+
+
+  PURPOSE : set configuration for the driver
+
+*/
+USHORT thif_link_SetConfig ( char *buffer )
+{
+  char token [64];
+  unsigned int len;
+  USHORT result;
+
+  result = DRV_OK;
+
+  if ( (len = GetNextToken (buffer, token, " #")) == 0) 
+  {
+    result = thif_link_Open();
+  }
+  else
+  {
+    buffer += (len+1);
+  }
+
+  if ( !strcmp ( "OPEN", token ) )
+  {
+    result = thif_link_Open();
+  }
+  else if ( !strcmp ( "CLOSE", token ) )
+  {
+    result = thif_link_Close();
+  }
+  else if ( !strcmp ( "EXIT", token ) )
+  {
+    thif_link_Exit();
+  }
+  else
+  {
+    result = DRV_INVALID_PARAMS;
+  }
+
+  if ((result != DRV_OK) && (result != DRV_INVALID_PARAMS))
+  {
+    result = DRV_NOTCONFIGURED;
+  }
+  
+  return  result;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : thif_link                 |
+| STATE   : code                       ROUTINE : thif_link_Init            |
++--------------------------------------------------------------------+
+
+  PURPOSE : initialize driver
+
+*/
+USHORT thif_link_Init ( USHORT DrvHandle, T_DRV_CB_FUNC CallbackFunc, T_DRV_EXPORT const **DrvInfo )
+{
+static const T_DRV_EXPORT thif_link_Info =
+{
+  THIF_LINK_NAME,
+  0,
+  {
+#ifdef _WIN32_
+    thif_link_Init,
+#endif
+    thif_link_Exit,
+    thif_link_Read,
+    thif_link_Write,
+    NULL, /* Look */
+    NULL, /* Clear */
+    thif_link_Flush,
+    thif_link_SetSignal,
+    thif_link_ResetSignal,
+    thif_link_SetConfig,
+    NULL,
+    NULL,
+  }
+};
+
+  THIF_LINK_Data.Handle = DrvHandle;
+
+  THIF_LINK_Data.EnabledSignalType = 0;
+
+  THIF_LINK_Data.Callback = CallbackFunc;
+
+  THIF_LINK_Data.Connected = FALSE;
+
+  *DrvInfo = &thif_link_Info;
+
+  return DRV_OK;
+}
+