diff gsm-fw/gpf/tst_drv/mux_pei.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_pei.c	Sun Apr 13 07:21:57 2014 +0000
@@ -0,0 +1,1038 @@
+/* 
++------------------------------------------------------------------------------
+|  File:       mux_pei.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 implements the process body interface
+|             for the entity mux (used by tst for multiplexer driver).
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef MUX_PEI_C
+#define MUX_PEI_C
+#endif
+
+#ifndef ENTITY_MUX
+#define ENTITY_MUX
+#endif
+
+#define ENTITY_UART /* test only */
+
+/*==== INCLUDES =============================================================*/
+
+
+#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"
+#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 */
+
+/*==== CONSTS ================================================================*/
+
+#undef VSI_CALLER
+#define VSI_CALLER        m_handle,
+
+/* 
+ * Wait as long as possible. This is the time in ms that is waited for a 
+ * message in the input queue in the active variant. 
+ * It can be decreased by the customer.  
+ */   
+#define MUX_TIMEOUT     0xffffffff   
+
+/*==== TYPES =================================================================*/
+
+typedef struct
+{
+  char              *version;
+} T_MONITOR;
+
+/*==== GLOBAL VARIABLES ======================================================*/
+/*==== LOCALS ================================================================*/
+
+static  int           m_first = 1;
+static  T_MONITOR     m_mon;
+
+static  int           m_uart_ready = 0;
+
+static  T_desc2 *      m_send_data=NULL;
+static  USHORT        m_send_len=0;
+
+T_HANDLE              m_handle;
+T_DRV_SIGNAL          m_signal;
+
+GLOBAL DTI_HANDLE     mtst_hDTI;         /* handle for DTI library */
+T_QMSG QueueMsg;
+/*==== EXTERNAL DEFINED FUNCTIONS ==========================================*/
+
+/*==== PRIMITIVE HANDLER FUNCTIONS ==========================================*/
+
+static void primitive_not_supported (T_PRIM_HEADER *data);
+static void dti_data_req (T_DTI2_DATA_REQ *ptr);
+
+/*
+ * Jumptables to primitive handler functions. One table per SAP.
+ *
+ * Use MAK_FUNC_0 for primitives which contains no SDU.
+ * Use MAK_FUNC_S for primitives which contains a SDU.
+ */
+
+LOCAL const T_FUNC dti_ul_table[] = {
+  MAK_FUNC_0( primitive_not_supported     ,    DTI2_CONNECT_REQ    ),  /* 3700x */
+  MAK_FUNC_0( primitive_not_supported     ,    DTI2_CONNECT_RES    ),  /* 3701x */
+  MAK_FUNC_0( primitive_not_supported     ,    DTI2_DISCONNECT_REQ ),  /* 3702x */
+  MAK_FUNC_0( primitive_not_supported     ,    DTI2_GETDATA_REQ    ),  /* 3703x */
+  MAK_FUNC_0( dti_data_req                ,    DTI2_DATA_REQ       )   /* 3704x */
+#if defined (_SIMULATION_)
+  ,
+  MAK_FUNC_S( primitive_not_supported     ,   DTI2_DATA_TEST_REQ )
+#endif  /* _SIMULATION_ */
+};
+
+LOCAL const T_FUNC dti_dl_table[] = {
+  MAK_FUNC_0( pei_dti_dti_connect_ind     ,    DTI2_CONNECT_IND    ),  /* 7700x */
+  MAK_FUNC_0( pei_dti_dti_connect_cnf     ,    DTI2_CONNECT_CNF    ),  /* 7701x */
+  MAK_FUNC_0( pei_dti_dti_disconnect_ind  ,    DTI2_DISCONNECT_IND ),  /* 7702x */
+  MAK_FUNC_0( pei_dti_dti_ready_ind       ,    DTI2_READY_IND      ),  /* 7703x */
+  MAK_FUNC_0( pei_dti_dti_data_ind        ,    DTI2_DATA_IND       )   /* 7704x */
+#if defined (_SIMULATION_)
+  ,
+  MAK_FUNC_S( pei_dti_dti_data_test_ind   ,    DTI2_DATA_TEST_IND )
+#endif  /* _SIMULATION_ */
+};
+
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  primitive_not_supported
++------------------------------------------------------------------------------
+|  Description  :  This function handles unsupported primitives.
+|
+|  Parameters   :  data - not used
+|
+|  Return       :  void
++------------------------------------------------------------------------------
+*/
+static void primitive_not_supported (T_PRIM_HEADER *data)
+{
+  //TRACE_FUNCTION ("primitive_not_supported");
+
+  PFREE (data);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  pei_primitive
++------------------------------------------------------------------------------
+|  Description  :  Process protocol specific primitive.
+|
+|  Parameters   :  prim      - pointer to the received primitive
+|
+|  Return       :  PEI_OK    - function succeeded
+|                  PEI_ERROR - function failed
++------------------------------------------------------------------------------
+
+                          |           |
+                         TST         UART               UPLINK
+                          |           |
+                   +------v-----------v-------+
+                   |                          |
+                   |            MUX           |
+                   |                          |
+                   +-------------^------------+
+                                 |
+                                UART                    DOWNLINK
+                                 |
+
+*/
+static short pei_primitive (void *ptr)
+{
+  /*
+   * the following line of code causes a warning on tms470 compiler, that cannot be avoided
+   * without changing the PEI interface. Warning will not cause a problem 
+   */
+  T_PRIM * prim=(T_PRIM*)ptr;
+  
+  //TRACE_FUNCTION ("pei_primitive");
+
+  if (prim != NULL)
+  {
+    unsigned short     opc = (unsigned short)prim->custom.opc;
+    unsigned short     n;
+    const T_FUNC       *table;
+
+    /*
+     * This must be called for Partition Pool supervision. Will be replaced
+     * by another macro some time.
+     */
+    VSI_PPM_REC (&prim->custom, __FILE__, __LINE__);
+
+    //PTRACE_IN (opc);
+
+    switch (opc & OPC_MASK)
+    {
+      case DTI_DL:                     /* defined in prim.h */
+        table = dti_dl_table;
+        n = TAB_SIZE (dti_dl_table);
+        /* 
+         * to be able to distinguish DTI1/DTI2 opcodes,
+         * the ones for DTI2 start at 0x50
+         */
+        opc -= 0x50;
+        break;
+      case DTI_UL:                     /* defined in prim.h */
+        table = dti_ul_table;
+        n = TAB_SIZE (dti_ul_table);
+        /* 
+         * to be able to distinguish DTI1/DTI2 opcodes,
+         * the ones for DTI2 start at 0x50
+         */
+        opc -= 0x50;
+        break;
+      default:
+        table = NULL;
+        n = 0;
+        break;
+    }
+
+    if (table != NULL)
+    {
+      if ((opc & PRM_MASK) < n)
+      {
+        table += opc & PRM_MASK;
+        P_SDU(prim) = table->soff ? 
+          (T_sdu*) (((char*)&prim->data) + table->soff) : 0;
+        P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER);
+        JUMP (table->func) (P2D(prim));
+      }
+      else
+      {
+        primitive_not_supported (P2D(prim));
+      }
+      return PEI_OK;
+    }
+
+    /*
+     * primitive is not a GSM primitive - forward it to the environment
+     */
+    if (opc & SYS_MASK)
+      vsi_c_primitive (VSI_CALLER prim);
+    else
+    {
+      PFREE (P2D(prim));
+      return PEI_ERROR;
+    }
+  }
+  return PEI_OK;
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     : pei_init
++------------------------------------------------------------------------------
+|  Description  :  Initialize Protocol Stack Entity
+|
+|  Parameters   :  handle    - task handle
+|
+|  Return       :  PEI_OK    - entity initialised
+|                  PEI_ERROR - entity not (yet) initialised
++------------------------------------------------------------------------------
+*/
+static short pei_init (T_HANDLE handle)
+{
+  /* Initialize task handle */
+  m_handle = handle;
+  mux_data.dti_state = CLOSED;
+
+  /*
+   * initialize dtilib for this entity
+   */
+  mtst_hDTI = dti_init(
+    1, /* max simultaneous connections */
+    handle,
+    DTI_NO_TRACE,
+    pei_sig_callback
+    );
+  if(!mtst_hDTI)
+    return PEI_ERROR;
+
+  /* set no suspend for us and TST */
+  vsi_trcsuspend ( VSI_CALLER vsi_c_open (0,"MTST"), 0);
+  vsi_trcsuspend ( VSI_CALLER vsi_c_open (0,"TST"), 0);
+
+  return (PEI_OK);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  pei_timeout
++------------------------------------------------------------------------------
+|  Description  :  Process timeout.
+|
+|  Parameters   :  index     - timer index
+|
+|  Return       :  PEI_OK    - timeout processed
+|                  PEI_ERROR - timeout not processed
++------------------------------------------------------------------------------
+*/
+static short pei_timeout (unsigned short index)
+{
+  //TRACE_FUNCTION ("pei_timeout");
+
+  /* Process timeout */
+  switch (index)
+  {
+    case 0:
+      /* Call of timeout routine */
+      break;
+    default:
+      //TRACE_ERROR("Unknown Timeout");
+      return PEI_ERROR;
+  }
+
+  return PEI_OK;
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  pei_signal
++------------------------------------------------------------------------------
+|  Description  :  Process signal.
+|
+|  Parameters   :  opc       - signal operation code
+|                  data      - pointer to primitive
+|
+|  Return       :  PEI_OK    - signal processed
+|                  PEI_ERROR - signal not processed
++------------------------------------------------------------------------------
+*/
+static short pei_signal (unsigned long opc, void* data)
+{
+  //TRACE_FUNCTION ("pei_signal");
+
+  /* Process signal */
+  switch (opc)
+  {
+    default:
+      //TRACE_ERROR("Unknown Signal OPC");
+      return PEI_ERROR;
+  }
+
+  return PEI_OK;
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  pei_exit
++------------------------------------------------------------------------------
+|  Description  :  Close Resources and terminate.
+|
+|  Parameters   :            - 
+|
+|  Return       :  PEI_OK    - exit sucessful
++------------------------------------------------------------------------------
+*/
+static short pei_exit (void)
+{
+  //TRACE_FUNCTION ("pei_exit");
+
+  /*
+   * Close communication channels
+   */
+
+  if (mux_data.dti_state NEQ CLOSED)
+  {    
+    dti_close
+    (
+      mtst_hDTI,
+      MTST_DTI_DN_INSTANCE,
+      MTST_DTI_DN_INTERFACE,
+      MTST_DTI_DN_CHANNEL,
+      FALSE
+    );
+    mux_data.dti_state = CLOSED;
+  }
+
+  /*
+   * Shut down dtilib
+   */
+  dti_deinit(mtst_hDTI);
+
+  return PEI_OK;
+}
+
+
+/* for test only - begin */
+#define MTST_TRACE 0x4f20
+typedef struct {
+  char str[80];
+} T_MTST_TRACE;
+
+void trace_aci(const char* str) 
+{
+  PALLOC(ptr,MTST_TRACE);
+  strcpy(ptr->str,str);
+
+  PSEND(vsi_c_open(VSI_CALLER "MMI"), ptr);
+}
+/* for test only - end */
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  pei_config
++------------------------------------------------------------------------------
+|  Description  :  Dynamic Configuration.
+|
+|  Parameters   :  Buffer - configuration string (
+|                    to start: "<DTI-partner> <tui> <c_id>"
+|                    to stop:  "STOP")
+|
+|  Return       :  PEI_OK      - sucessful
+|                  PEI_ERROR   - not successful
++------------------------------------------------------------------------------
+*/
+static short pei_config (char *Buffer)
+{
+  char token [10];
+  char peer_name [10];
+
+  USHORT len;
+
+  ULONG link_id;
+
+  //TRACE_FUNCTION ("pei_config");
+  //TRACE_FUNCTION (Buffer);
+
+  if ( ConfigTimer ( VSI_CALLER Buffer, NULL ) == VSI_OK )
+    return PEI_OK;
+
+  /*
+  *  further dynamic configuration
+  */
+  
+  /* 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;
+    m_uart_ready=0;
+    if (mux_data.send_data_buf_count>0) {
+      /* clear send_buffer */
+      T_desc2 *d_new;
+      T_desc2 *d=m_send_data;
+      while (d)
+      {
+        d_new=(T_desc2 *)d->next;
+        MFREE(d);
+        d=d_new;
+      }
+
+      mux_data.send_data_buf_count=0;
+    }
+
+    return PEI_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,
+      0,
+      DTI_CHANNEL_TO_LOWER_LAYER,
+      DTI_QUEUE_UNUSED,
+      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 PEI_OK;
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  pei_monitor
++------------------------------------------------------------------------------
+|  Description  :  Monitoring of physical Parameters.
+|
+|  Parameters   :  out_monitor - return the address of the data to be monitored
+|
+|  Return       :  PEI_OK      - sucessful (address in out_monitor is valid)
+|                  PEI_ERROR   - not successful
++------------------------------------------------------------------------------
+*/
+static short pei_monitor (void ** out_monitor)
+{
+  //TRACE_FUNCTION ("pei_monitor");
+
+  /*
+   * Version = "0.S" (S = Step).
+   */
+  m_mon.version = "MTST 1.0";
+  *out_monitor = &m_mon;
+
+  return PEI_OK;
+}
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  pei_create
++------------------------------------------------------------------------------
+|  Description  :  Create the Protocol Stack Entity.
+|
+|  Parameters   :  info        - Pointer to the structure of entity parameters
+|
+|  Return       :  PEI_OK      - entity created successfully
+|                  
++------------------------------------------------------------------------------
+*/
+SHORT pei_create (T_PEI_INFO const **info)
+{
+  static T_PEI_INFO pei_info =
+  {
+    "MTST",         /* name */
+    {              /* pei-table */
+      pei_init,
+      pei_exit,
+      pei_primitive,
+      pei_timeout,
+      pei_signal,
+      0,
+      pei_config,
+      pei_monitor
+    },
+    1024,          /* stack size */
+    10,            /* queue entries */
+    100,           /* priority (1->low, 255->high) */
+    0,             /* number of timers */
+    PASSIVE_BODY|COPY_BY_REF|TRC_NO_SUSPEND
+                   /* flags: bit 0   active(0) body/passive(1) */
+  };               /*        bit 1   com by copy(0)/reference(1) */
+
+  //TRACE_FUNCTION ("pei_create");
+
+  /*
+   * Close Resources if open
+   */
+  if (!m_first) 
+  {
+    pei_exit();
+  }
+
+  m_first=0;
+
+  /*
+   * Export startup configuration data
+   */
+  *info = &pei_info;
+
+  return PEI_OK;
+}
+/***********+++++-----------------+++++++*******++----++**********/
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  sig_dti_pei_tx_buffer_ready_ind
++------------------------------------------------------------------------------
+|  Description  :  sent from UART to indicate that it is ready to
+|                  receive new data via DTI_DATA_REQ
+|
+|  Parameters   :
+|
+|  Return       :  
+|                  
++------------------------------------------------------------------------------
+*/
+GLOBAL const void sig_dti_pei_tx_buffer_ready_ind ()
+{
+  m_uart_ready++;
+}
+
+/***********+++++-----------------+++++++*******++----++**********/
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  dti_data_req
++------------------------------------------------------------------------------
+|  Description  :  sent from TST to deliver new data to MTST
+|
+|  Parameters   :  ptr         - Pointer to the structure of the primitive
+|
+|  Return       :  
+|                  
++------------------------------------------------------------------------------
+*/
+static void dti_data_req (T_DTI2_DATA_REQ *ptr)
+{
+  T_desc2 *d=0;
+
+  /* PPASS without traces */
+  T_DTI2_DATA_IND *prim = (T_DTI2_DATA_IND*)ptr;
+  D_OPC(prim) = (DTI2_DATA_IND);
+
+  if (!m_uart_ready)
+  {
+    if (mux_data.send_data_buf_count > MAX_SEND_BUF_COUNT-2) 
+    {
+      /* free data */
+      T_desc2 *d_new;
+      T_desc2 *d=(T_desc2 *)prim->desc_list2.first;
+      while (d)
+      {
+        d_new=(T_desc2 *)d->next;
+        MFREE(d);
+        d=d_new;
+      }
+
+      if (mux_data.send_data_buf_count == MAX_SEND_BUF_COUNT) 
+      {
+        /* buffer full -> free prim and exit */
+        PFREE(prim);
+        return; 
+      } 
+      else
+      {
+        /* buffer almost full -> send SYST information */
+        char infostr[]="\x02T0036001FMTSTPCO ERROR: SEND-BUFFER FULL\x0a"; 
+        USHORT len=sizeof(infostr)-1;
+        MALLOC(d,(USHORT)(sizeof(T_desc2)+len-1));
+        prim->desc_list2.first=(ULONG)d;
+        prim->desc_list2.list_len=len;
+        d->next = 0;
+        d->len = len;
+        d->size = len;
+        d->offset = 0;        
+        memcpy(d->buffer,infostr,len);
+      }
+    }
+
+    if (m_send_data)
+    {
+      /* find last send_data descriptor */
+      d=m_send_data;
+      while (d->next)
+      {
+        d=(T_desc2 *)d->next;
+      }
+      /* concat new data */
+      d->next=prim->desc_list2.first;
+      m_send_len+=prim->desc_list2.list_len;
+    } 
+    else 
+    {
+      m_send_data=(T_desc2 *)prim->desc_list2.first;
+      d=m_send_data;
+      while (d)
+      {
+        m_send_len+=d->len;
+        d=(T_desc2 *)d->next;
+      }
+    }
+    mux_data.send_data_buf_count++;
+
+    /* free prim */
+    PFREE(prim);
+    return;
+  }
+
+  m_uart_ready--;
+  mux_data.send_data_buf_count=0;
+
+  if (m_send_data)
+  {
+    /* find last data descriptor in stored data */
+    d=m_send_data;
+    while (d->next)
+    {
+      d=(T_desc2 *)d->next;
+    }
+    /* concat new data to stored data */
+    d->next=prim->desc_list2.first;
+    prim->desc_list2.first=(ULONG)m_send_data;
+    prim->desc_list2.list_len+=m_send_len;
+
+    /* clear send_data */
+    m_send_data=(T_desc2 *)0;
+    m_send_len=0;
+  }
+
+  /* send prim */
+  dti_send_data
+  (
+    mtst_hDTI,
+    MTST_DTI_DN_INSTANCE,
+    MTST_DTI_DN_INTERFACE,
+    MTST_DTI_DN_CHANNEL,
+    prim
+  );
+}
+
+/***********+++++-----------------+++++++*******++----++**********/
+
+/*
++------------------------------------------------------------------------------
+|  Function     :  sig_dti_pei_data_received_ind
++------------------------------------------------------------------------------
+|  Description  :  sent from UART to deliver new data
+|
+|  Parameters   :  ptr         - Pointer to the structure of the primitive
+|
+|  Return       :  
+|                  
++------------------------------------------------------------------------------
+*/
+GLOBAL const void sig_dti_pei_data_received_ind (T_DTI2_DATA_IND *ptr)
+{
+  T_DTI2_DATA_IND *prim = ptr;
+
+  /* prevent dtilib from automatically sending flow control primitives */
+  dti_stop
+  (
+    mtst_hDTI,
+    MTST_DTI_DN_INSTANCE,
+    MTST_DTI_DN_INTERFACE,
+    MTST_DTI_DN_CHANNEL
+  );
+
+  if ( mux_data.EnabledSignalType & DRV_SIGTYPE_READ )
+  {
+    m_signal.SignalType = DRV_SIGTYPE_READ;
+    m_signal.DrvHandle = mux_data.Handle;
+
+    mux_data.recv_data=(T_desc2 *)prim->desc_list2.first;
+
+    (mux_data.Callback)( &m_signal );
+  }
+  PFREE(prim);
+}
+
+/***********+++++-----------------+++++++*******++----++**********/
+
+/* 
+ * dtilib wrapping and support functions 
+ */
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_connect_req
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_connect_req
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_connect_req (
+                    T_DTI2_CONNECT_REQ   *dti_connect_req
+                  )
+{
+  dti_dti_connect_req (mtst_hDTI, dti_connect_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_connect_cnf
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_connect_cnf
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_connect_cnf (
+                    T_DTI2_CONNECT_CNF   *dti_connect_cnf
+                  )
+{
+    dti_dti_connect_cnf(mtst_hDTI, dti_connect_cnf);  
+}
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_connect_ind
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_connect_ind
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_connect_ind (
+                    T_DTI2_CONNECT_IND   *dti_connect_ind
+                  )
+{
+    dti_dti_connect_ind(mtst_hDTI, dti_connect_ind);  
+}
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_connect_res
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_connect_res
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_connect_res (
+                    T_DTI2_CONNECT_RES   *dti_connect_res
+                  )
+{
+    dti_dti_connect_res(mtst_hDTI, dti_connect_res);  
+}
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_disconnect_req
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_disconnect_req
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_disconnect_req (
+                    T_DTI2_DISCONNECT_REQ   *dti_disconnect_req
+                  )
+{
+    dti_dti_disconnect_req (mtst_hDTI, dti_disconnect_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_disconnect_ind
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_disconnect_ind
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_disconnect_ind (
+                    T_DTI2_DISCONNECT_IND   *dti_disconnect_ind
+                  )
+{
+    dti_dti_disconnect_ind (mtst_hDTI, dti_disconnect_ind);
+}
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_data_req
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_data_req
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_data_req (
+                    T_DTI2_DATA_REQ   *dti_data_req
+                  )
+{
+    dti_dti_data_req (mtst_hDTI, dti_data_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_getdata_req
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_data_req
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_getdata_req (
+                    T_DTI2_GETDATA_REQ   *dti_getdata_req
+                  )
+{
+  dti_dti_getdata_req (mtst_hDTI, dti_getdata_req);
+}
+ 
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_data_ind
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_data_ind
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_data_ind (
+                    T_DTI2_DATA_IND   *dti_data_ind
+                  )
+{
+    dti_dti_data_ind (mtst_hDTI, dti_data_ind);
+}
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_ready_ind
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_ready_ind
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_ready_ind (
+                    T_DTI2_READY_IND   *dti_ready_ind
+                  )
+{
+  dti_dti_ready_ind (mtst_hDTI, dti_ready_ind);
+}
+ 
+#ifdef _SIMULATION_
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_data_test_req
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_data_test_req
++------------------------------------------------------------------------------
+*/
+    
+GLOBAL const void pei_dti_dti_data_test_req (
+                    T_DTI2_DATA_TEST_REQ   *dti_data_test_req
+                  )
+{
+    dti_dti_data_test_req (mtst_hDTI, dti_data_test_req);
+}
+
+/*
++------------------------------------------------------------------------------
+|    Function    : pei_dti_dti_data_test_ind
++------------------------------------------------------------------------------
+|    PURPOSE : Call the process function dti_dti_data_test_ind
++------------------------------------------------------------------------------
+*/
+
+GLOBAL const void pei_dti_dti_data_test_ind (
+                    T_DTI2_DATA_TEST_IND   *dti_data_test_ind
+                  )
+{
+  dti_dti_data_test_ind (mtst_hDTI, dti_data_test_ind);   
+}
+
+#endif /* _SIMULATION_ */
+
+
+/*
++------------------------------------------------------------------------------
+|    Function: pei_sig_callback
++------------------------------------------------------------------------------
+|    PURPOSE : Callback function for DTILIB
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void pei_sig_callback(U8 instance, U8 interfac, U8 channel, 
+                               U8 reason, T_DTI2_DATA_IND *dti_data_ind)
+{
+  TRACE_FUNCTION("pei_sig_callback");
+
+#ifdef _SIMULATION_
+  if(instance NEQ MTST_DTI_UP_INSTANCE || 
+     interfac NEQ MTST_DTI_UP_INTERFACE || 
+     channel  NEQ MTST_DTI_UP_CHANNEL) 
+  {
+    TRACE_ERROR("[PEI_SIG_CALLBACK] invalid parameters!");
+    return; /* error, not found */
+  }
+#endif /* _SIMULATION_ */
+
+  if (mtst_hDTI NEQ D_NO_DATA_BASE)
+  {
+    switch (reason)
+    {
+      case DTI_REASON_CONNECTION_OPENED:
+        sig_dti_pei_connection_opened_ind();
+        break;
+
+      case DTI_REASON_CONNECTION_CLOSED:
+        sig_dti_pei_connection_closed_ind();
+        break;
+
+      case DTI_REASON_DATA_RECEIVED:
+
+        /*
+         * DTI2_DATA_IND is interpreted as DTI2_DATA_REQ
+         */
+        PACCESS (dti_data_ind);
+        sig_dti_pei_data_received_ind(dti_data_ind);
+        break;
+
+      case DTI_REASON_TX_BUFFER_FULL:
+        sig_dti_pei_tx_buffer_full_ind();
+        break;
+      
+      case DTI_REASON_TX_BUFFER_READY:
+        sig_dti_pei_tx_buffer_ready_ind();
+        break;
+
+      default:
+        TRACE_ERROR("unknown DTILIB reason parameter");
+        break;
+    } /* end switch */
+  } /* end if */
+  else 
+  {
+    TRACE_ERROR("Pointer to DTILIB database not existing");
+  }
+} /* pei_sig_callback() */
+
+/*==== END OF FILE ==========================================================*/
+