diff gsm-fw/gpf/tst_drv/mux.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/gpf/tst_drv/mux.c	Sun Apr 13 07:21:57 2014 +0000
@@ -0,0 +1,394 @@
+/* 
++------------------------------------------------------------------------------
+|  File:       mux.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 Module defines the adaptation of the MUX_tr driver
+|             to the GDI.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifdef __MUX_C__
+#define __MUX_C__
+#endif
+
+#include "stdlib.h"
+#include <stdio.h>
+#include "string.h"
+#include "typedefs.h"
+
+#include "tools.h"
+#include "os.h"
+#include "gdi.h"
+#include "vsi.h"
+#include "glob_defs.h"
+#undef VSI_CALLER
+#include "frame.h"
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+#include "gsm.h"
+#include "pei.h"
+#include "route.h"
+#include "dti.h"        /* functionality of the dti library */
+#include "mux.h"        /* to get the global entity definitions */
+#include "frame.h"
+
+/*==== TYPES ======================================================*/
+
+/*==== CONSTANTS ==================================================*/
+
+#define VSI_CALLER        m_tst_handle,
+#define VSI_CALLER_SINGLE m_tst_handle
+
+#define ALLOWED_MUX_SIGNALS   (DRV_SIGTYPE_READ|DRV_SIGTYPE_CONNECT) 
+
+#define TST_NAME  "TST"
+/*==== EXTERNALS ==================================================*/
+
+extern T_HANDLE ext_data_pool_handle;
+extern T_QMSG QueueMsg;
+
+/*==== GLOBAL VARIABLES ==================================================*/
+
+/*==== LOCAL VARIABLES ==================================================*/
+static T_DRV_SIGNAL Signal;
+
+T_HANDLE  m_tst_handle;
+
+/*==== FUNCTIONS ==================================================*/
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : MUX                 |
+| STATE   : code                       ROUTINE : mux_Exit            |
++--------------------------------------------------------------------+
+
+  PURPOSE : exit a driver
+
+*/
+void mux_Exit ( void )
+{
+//vsi_p_delete (0, vsi_p_handle (0,"MTST"));
+  mux_data.Connected = FALSE;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : MUX                 |
+| STATE   : code                       ROUTINE : mux_Read            |
++--------------------------------------------------------------------+
+
+  PURPOSE : read data from driver
+
+*/
+USHORT mux_Read ( void *Buffer, ULONG *BytesToRead )
+{
+  T_desc2 *d;
+  T_desc2 *d_new;
+
+  /* copy data into buffer */
+  *BytesToRead=0;
+  d=mux_data.recv_data;
+  while (d)
+  {
+    d_new=(T_desc2 *)d->next;
+    *BytesToRead += d->len;
+    memcpy(Buffer, d->buffer, d->len);
+    /* free memory */
+    MFREE(d);
+
+    d=d_new;
+  }
+
+  if (mux_data.dti_state NEQ IDLE) /* not yet configured */
+  {
+    return DRV_NOTCONFIGURED;
+  } 
+  else
+  {
+    /* inform UART that we are ready to receive next data package */
+    dti_start
+    (
+      mtst_hDTI,
+      MTST_DTI_DN_INSTANCE,
+      MTST_DTI_DN_INTERFACE,
+      MTST_DTI_DN_CHANNEL
+    );
+  }
+
+  return DRV_OK;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : MUX                 |
+| STATE   : code                       ROUTINE : mux_Write           |
++--------------------------------------------------------------------+
+
+  PURPOSE : write data to driver
+
+*/
+USHORT mux_Write ( void *Buffer, ULONG *BytesToWrite )
+{
+  USHORT ret = DRV_OK;
+
+  if (mux_data.h_comm_mtst==VSI_ERROR) /* not yet configured */
+  {
+    ret=DRV_NOTCONFIGURED;
+  }
+  else 
+  {
+    T_desc2 *d;
+    T_QMSG *pMsg = &QueueMsg;
+
+    PALLOC(localPrimPtr, DTI2_DATA_IND);
+
+    /* fill in parameters */
+    localPrimPtr->parameters.p_id=DTI_PID_UOS;  /* protocol identifier  */
+       /* flow control state */
+    localPrimPtr->parameters.st_lines.st_flow=DTI_FLOW_ON;   
+       /* line state sa      */
+    localPrimPtr->parameters.st_lines.st_line_sa=DTI_SA_ON;  
+       /* line state sb      */       
+    localPrimPtr->parameters.st_lines.st_line_sb=DTI_SB_ON;
+       /* break length       */       
+    localPrimPtr->parameters.st_lines.st_break_len=DTI_BREAK_OFF;
+
+      /* list of generic data descriptors */
+    MALLOC(d,(ULONG)(sizeof(T_desc2)+*BytesToWrite-1));
+    localPrimPtr->desc_list2.first=(ULONG)d;
+    localPrimPtr->desc_list2.list_len= (USHORT)*BytesToWrite;
+    d->next   = 0;
+    d->len    = (USHORT)*BytesToWrite;
+    d->size   = *BytesToWrite;
+    d->offset =  0;
+    memcpy(d->buffer,Buffer,*BytesToWrite);
+
+    /* PSEND without tracing */
+    pMsg->Msg.Primitive.Prim = (T_VOID_STRUCT*)(D2P(localPrimPtr));
+    pMsg->Msg.Primitive.PrimLen = PSIZE(localPrimPtr);
+    pMsg->MsgType = MSG_PRIMITIVE;
+#ifdef MEMORY_SUPERVISION
+    vsi_c_send (VSI_CALLER mux_data.h_comm_mtst,pMsg,__FILE__,__LINE__);
+#else
+    vsi_c_send (VSI_CALLER mux_data.h_comm_mtst,pMsg);
+#endif
+  }
+
+  return ( ret );
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : MUX                 |
+| STATE   : code                       ROUTINE : mux_SetSignal       |
++--------------------------------------------------------------------+
+
+  PURPOSE : enable signal for the driver
+
+*/
+USHORT mux_SetSignal ( USHORT SignalType )
+{
+	if ( !(SignalType & ALLOWED_MUX_SIGNALS) )
+    return DRV_INVALID_PARAMS;
+  else
+    mux_data.EnabledSignalType |= SignalType;
+  
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : MUX                 |
+| STATE   : code                       ROUTINE : mux_ResetSignal     |
++--------------------------------------------------------------------+
+
+  PURPOSE : disable signal for the driver
+
+*/
+USHORT mux_ResetSignal ( USHORT SignalType )
+{
+	if ( !(SignalType & ALLOWED_MUX_SIGNALS) )
+    return DRV_INVALID_PARAMS;
+  else
+    mux_data.EnabledSignalType &= ~SignalType;
+  
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : MUX                 |
+| STATE   : code                       ROUTINE : mux_SetConfig       |
++--------------------------------------------------------------------+
+
+  PURPOSE : set configuration for the driver
+
+  PARAMS:   Buffer - configuration string ("<DTI-partner> <tui> <c_id>")
+           
+
+*/
+USHORT mux_SetConfig ( char *Buffer )
+{
+  char token [10];
+  char peer_name [10];
+  USHORT len;
+  ULONG link_id;
+
+  if ( !mux_data.Connected )
+  {
+    Signal.SignalType = DRV_SIGTYPE_CONNECT;
+	  Signal.DrvHandle = mux_data.Handle;
+    (mux_data.Callback)( &Signal );
+    mux_data.Connected = TRUE;
+
+    return DRV_OK;
+  }
+
+  /* interprete configuration string */
+  if (!(len = GetNextToken (Buffer, token, " #")))
+  {
+    return DRV_INVALID_PARAMS;
+  }
+  else
+  {
+    Buffer += (len+1);
+  }
+  if (strcmp(token,"STOP")==0) 
+  {
+    dti_close
+    (
+      mtst_hDTI,
+      MTST_DTI_DN_INSTANCE,
+      MTST_DTI_DN_INTERFACE,
+      MTST_DTI_DN_CHANNEL,
+      FALSE
+    );
+
+    mux_data.dti_state=CLOSED;
+    mux_data.h_comm_mtst=VSI_ERROR;
+    /* xxxxx set m_uart_ready = 0 ?! */
+    if (mux_data.send_data_buf_count>0) {
+      /* xxxxx clear send_buffer ?! */
+      mux_data.send_data_buf_count=0;
+    }
+
+    return DRV_OK;
+  }
+  strcpy(peer_name, token);
+  
+  if (!(len = GetNextToken (Buffer, token, " #")))
+  {
+    return DRV_INVALID_PARAMS;
+  }
+  else
+  {
+    Buffer += (len+1);
+  }
+  link_id=atoi(token);
+
+  if(
+    dti_open
+    (
+      mtst_hDTI,
+      MTST_DTI_DN_INSTANCE,
+      MTST_DTI_DN_INTERFACE,
+      MTST_DTI_DN_CHANNEL,
+      DTI_QUEUE_DISABLED, /* DTI_QUEUE_UNLIMITED in order to queue data */
+      DTI_CHANNEL_TO_LOWER_LAYER,
+      FLOW_CNTRL_ENABLED,
+      DTI_VERSION_10,
+      (U8*)peer_name,
+      link_id
+    ) EQ FALSE)
+    return DRV_INVALID_PARAMS;
+
+  /* reset send_data_buf counter */
+  mux_data.send_data_buf_count=0;
+
+  /* set internal communication handle */
+  while ( (mux_data.h_comm_mtst=vsi_c_open (0, "MTST")) == VSI_ERROR)
+  {
+    vsi_t_sleep(0,100);
+  };
+
+  /* inform UART that we are ready to receive next data package */
+  {
+    dti_start
+    (
+      mtst_hDTI,
+      MTST_DTI_DN_INSTANCE,
+      MTST_DTI_DN_INTERFACE,
+      MTST_DTI_DN_CHANNEL
+    );
+  }
+
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : MUX                 |
+| STATE   : code                       ROUTINE : mux_Init            |
++--------------------------------------------------------------------+
+
+  PURPOSE : initialize driver
+
+*/
+USHORT mux_Init ( USHORT DrvHandle, T_DRV_CB_FUNC CallbackFunc, T_DRV_EXPORT const **DrvInfo )
+{ 
+  T_HANDLE mux_handle;
+
+static const T_DRV_EXPORT mux_Info =
+{
+  "MUX",
+  CALLED_FROM_ISR,
+  {
+    /*mux_Init,*/
+    mux_Exit,
+    mux_Read,
+    mux_Write,
+    NULL,
+    NULL,
+    NULL,
+    mux_SetSignal,
+    mux_ResetSignal,
+    mux_SetConfig,
+    NULL,
+    NULL,
+  }
+};
+
+  mux_data.Handle = DrvHandle;
+
+  mux_data.EnabledSignalType = 0;
+
+  mux_data.Callback = CallbackFunc;
+
+  mux_data.Connected = FALSE;
+
+  mux_data.dti_state = CLOSED;
+  mux_data.h_comm_mtst = VSI_ERROR;
+
+  mux_handle = vsi_p_create (0, mux_pei_create, NULL, ext_data_pool_handle);
+  if (vsi_p_start (0, mux_handle) != VSI_OK)
+  {
+    return DRV_INITFAILURE;
+  };
+
+  *DrvInfo = &mux_Info;
+
+  m_tst_handle=vsi_c_open (0,TST_NAME);
+
+  return DRV_OK;           
+}
+