diff gsm-fw/g23m-aci/uart/uart_rxs.c @ 775:eedbf248bac0

gsm-fw/g23m-aci subtree: initial import from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 12 Oct 2014 01:45:14 +0000
parents
children f54080301c98
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/g23m-aci/uart/uart_rxs.c	Sun Oct 12 01:45:14 2014 +0000
@@ -0,0 +1,531 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  
+|  Modul   :  
++----------------------------------------------------------------------------- 
+|  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 is part of the entity UART and implements all 
+|             functions to handles the incoming process internal signals as  
+|             described in the SDL-documentation (RX-statemachine)
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef UART_RXS_C
+#define UART_RXS_C
+#endif /* !UART_RXS_C */
+
+#define ENTITY_UART
+
+#ifndef FF_MULTI_PORT
+/*==== INCLUDES =============================================================*/
+
+#ifdef WIN32
+#include "nucleus.h"
+#endif /* WIN32 */
+#include "typedefs.h"   /* to get Condat data types */
+#include "vsi.h"        /* to get a lot of macros */
+#include "macdef.h"     /* to get a lot of macros */
+#include "custom.h"
+#include "gsm.h"        /* to get a lot of macros */
+#include "cnf_uart.h"   /* to get cnf-definitions */
+#include "mon_uart.h"   /* to get mon-definitions */
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+#ifdef DTILIB
+#include "dti.h"        /* to get dti lib */
+#endif /* DTILIB */
+#include "pei.h"        /* to get PEI interface */
+#ifdef _TARGET_
+#include "uart/serialswitch.h"
+#include "uart/traceswitch.h"
+#else /* _TARGET_ */
+#include "serial_dat.h" /* to get definitions of serial driver */
+#endif /* _TARGET_ */
+#include "uart.h"       /* to get the global entity definitions */
+
+#include "uart_rxf.h"   /* to get rx functions */
+
+#include "uart_kers.h"   /* to get ker signals */
+#include "uart_dtxs.h"   /* to get dtx signals */
+
+#ifdef _SIMULATION_
+#include "uart_rxp.h"   /* to get rx_readdata */
+#endif /* _SIMULATION_ */
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_rx_dead_mode_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_RX_DEAD_MODE_REQ. If this
+|               signal is called the service expectes an disabled UART to work
+|               correctly.
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_rx_dead_mode_req () 
+{
+  TRACE_ISIG( "sig_ker_rx_dead_mode_req" );
+
+  uart_data->rx.read_permission = FALSE;
+  uart_data->rx.prev_lines      = 0;
+  uart_data->rx.dlc_instance    = UART_EMPTY_INSTANCE;
+  uart_data->rx.escape          = FALSE;
+  uart_data->rx.receive_state   = UART_RX_NOT_RECEIVING;
+  uart_data->rx.analyze_state   = UART_RX_ERROR;
+  uart_data->rx.fcs             = UART_INITFCS;
+  uart_data->rx.address_field   = 0;
+  uart_data->rx.stored_len      = 0;
+
+  switch( GET_STATE( UART_SERVICE_RX ) )
+  {
+    case RX_READY:
+    case RX_MUX:
+      SET_STATE( UART_SERVICE_RX, RX_DEAD );
+      break;
+
+    case RX_DEAD:
+      break;
+    default:
+      TRACE_ERROR( "SIG_KER_RX_DEAD_MODE_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_rx_dead_mode_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_rx_ready_mode_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_RX_READY_MODE_REQ.
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_rx_ready_mode_req () 
+{
+  TRACE_ISIG( "sig_ker_rx_ready_mode_req" );
+
+  switch( GET_STATE( UART_SERVICE_RX ) )
+  {
+    case RX_DEAD:
+      SET_STATE( UART_SERVICE_RX, RX_READY );
+      uart_data->rx.read_permission = FALSE;
+      uart_data->rx.dlc_instance    = UART_EMPTY_INSTANCE;
+      uart_data->rx.receive_state   = UART_RX_NOT_RECEIVING;
+      uart_data->rx.analyze_state   = UART_RX_ERROR;
+      break;
+
+    case RX_MUX:
+      SET_STATE( UART_SERVICE_RX, RX_READY );
+      if(uart_data->rx.read_permission EQ FALSE)
+      {
+        uart_data->rx.dlc_instance  = UART_EMPTY_INSTANCE;
+        uart_data->rx.analyze_state = UART_RX_ERROR;
+      }
+      break;
+
+    case RX_READY:
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_RX_READY_MODE_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_rx_ready_mode_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_rx_mux_mode_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_RX_MUX_MODE_REQ.
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_rx_mux_mode_req () 
+{
+  TRACE_ISIG( "sig_ker_rx_mux_mode_req" );
+
+  switch( GET_STATE( UART_SERVICE_RX ) )
+  {
+    case RX_DEAD:
+      SET_STATE( UART_SERVICE_RX, RX_MUX );
+      uart_data->rx.read_permission = FALSE;
+      uart_data->rx.dlc_instance    = UART_CONTROL_INSTANCE;
+      uart_data->rx.receive_state   = UART_RX_NOT_RECEIVING;
+      uart_data->rx.analyze_state   = UART_RX_ERROR;
+      break;
+
+    case RX_READY:
+      SET_STATE( UART_SERVICE_RX, RX_MUX );
+      if(uart_data->rx.read_permission EQ FALSE)
+      {
+        uart_data->rx.dlc_instance  = UART_CONTROL_INSTANCE;
+        uart_data->rx.analyze_state = UART_RX_ERROR;
+      }
+      break;
+
+    case RX_MUX:
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_RX_MUX_MODE_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_rx_mux_mode_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_dtx_rx_ready_to_receive_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_DTX_RX_READY_TO_RECEIVE_REQ.
+|
+| Parameters  : dlc_instance - dlc instance wich belongs to calling DTX
+|               receive_data - descriptor to write
+|               receive_pos  - position to start write
+|               receive_size - size of descriptor to write
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_dtx_rx_ready_to_receive_req (UBYTE   dlc_instance,
+                                             T_desc2* receive_data, 
+                                             USHORT  receive_pos,
+                                             USHORT  receive_size) 
+{
+  T_DLC*  dlc;
+
+  TRACE_ISIG( "sig_dtx_rx_ready_to_receive_req" );
+
+  dlc = &uart_data->dlc_table[dlc_instance];
+  dlc->receive_pos  = receive_pos;
+  dlc->receive_size = receive_size;
+  dlc->receive_data = receive_data;
+
+  /*
+   * start receiving
+   */
+  if(uart_data->rx.receive_state EQ UART_RX_RECEIVING)
+  {
+    if(uart_data->rx.read_permission EQ FALSE)
+      dlc->receive_process = UART_RX_PROCESS_READY;
+  }
+  else
+  {
+    dlc->receive_process = UART_RX_PROCESS_READY;
+    uart_data->rx.receive_state = UART_RX_RECEIVING;
+    switch( GET_STATE( UART_SERVICE_RX ) )
+    {
+      case RX_READY:
+        uart_data->rx.dlc_instance  = UART_EMPTY_INSTANCE;
+        uart_data->rx.analyze_state = UART_RX_ERROR;
+        break;
+
+      case RX_MUX:
+        if(uart_data->rx.dlc_instance EQ UART_EMPTY_INSTANCE)
+        {
+          uart_data->rx.dlc_instance  = UART_CONTROL_INSTANCE;
+          uart_data->rx.analyze_state = UART_RX_ERROR;
+        }
+        break;
+
+      default:
+        TRACE_ERROR( "SIG_DTX_RX_READY_TO_RECEIVE_REQ unexpected" );
+        break;
+    }
+#ifdef _SIMULATION_
+    if(rx_inpavail(uart_data->device) > 0)
+#else /* _SIMULATION_ */
+    if(UF_InpAvail (uart_data->device) > 0)
+#endif /* _SIMULATION_ */
+    {
+      /*
+       * inform channel about reading
+       * because previous receive_state was NOT_READING
+       * there is only one channel which must be informed
+       */
+      uart_data->rx.read_permission = TRUE;
+      uart_data->dtx                = dlc->dtx;
+      sig_rx_dtx_receiving_ind();
+    }
+    else
+      uart_data->rx.read_permission = FALSE;
+
+    if(uart_data EQ (&(uart_data_base[0])))
+    {
+      TRACE_EVENT("UF_ReadData()");
+#ifdef _SIMULATION_
+      rx_readdata(0);
+#else /* _SIMULATION_ */
+      UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_0);
+#endif /* else _SIMULATION_ */
+    }
+#ifdef FF_TWO_UART_PORTS
+    else if(uart_data EQ (&(uart_data_base[1])))
+    {
+      TRACE_EVENT("UF_ReadData()");
+#ifdef _SIMULATION_
+      rx_readdata(1);
+#else /* _SIMULATION_ */
+      UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_1);
+#endif /* else _SIMULATION_ */
+    }
+#endif /* FF_TWO_UART_PORTS */
+    else
+    {
+      TRACE_ERROR("wrong value of uart_data");
+    }
+  }
+} /* sig_dtx_rx_ready_to_receive_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_rx_ready_to_receive_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_RX_READY_TO_RECEIVE_REQ.
+|
+| Parameters  : receive_data - descriptor to write
+|               receive_pos  - position to start write
+|               receive_size - size of descriptor to write
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_rx_ready_to_receive_req (T_desc2* receive_data, 
+                                             USHORT  receive_pos,
+                                             USHORT  receive_size) 
+{
+  T_DLC*  dlc;
+
+  TRACE_ISIG( "sig_ker_rx_ready_to_receive_req" );
+
+  dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE];
+  switch( GET_STATE( UART_SERVICE_RX ) )
+  {
+    case RX_MUX:
+      /*
+       * store data in control instance
+       */
+      dlc->receive_pos  = receive_pos;
+      dlc->receive_size = receive_size;
+      dlc->receive_data = receive_data;
+      /*
+       * start receiving
+       */
+      if(uart_data->rx.receive_state EQ UART_RX_RECEIVING)
+      {
+        if(uart_data->rx.read_permission EQ FALSE)
+          dlc->receive_process = UART_RX_PROCESS_READY;
+      }
+      else
+      {
+        dlc->receive_process = UART_RX_PROCESS_READY;
+        /*
+         * start receiving
+         */
+        uart_data->rx.receive_state = UART_RX_RECEIVING;
+        if(uart_data->rx.dlc_instance EQ UART_EMPTY_INSTANCE)
+        {
+          uart_data->rx.dlc_instance  = UART_CONTROL_INSTANCE;
+          uart_data->rx.analyze_state = UART_RX_ERROR;
+        }
+#ifdef _SIMULATION_
+        if(rx_inpavail(uart_data->device) > 0)
+#else /* _SIMULATION_ */
+        if(UF_InpAvail (uart_data->device) > 0)
+#endif /* _SIMULATION_ */
+        {
+          /*
+           * inform channel about reading
+           */
+          uart_data->rx.read_permission = TRUE;
+          sig_rx_ker_receiving_ind();
+        }
+        else
+          uart_data->rx.read_permission = FALSE;
+
+        if(uart_data EQ (&(uart_data_base[0])))
+        {
+          TRACE_EVENT("UF_ReadData()");
+#ifdef _SIMULATION_
+          rx_readdata(0);
+#else /* _SIMULATION_ */
+          UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_0);
+#endif /* else _SIMULATION_ */
+        }
+#ifdef FF_TWO_UART_PORTS
+        else if(uart_data EQ (&(uart_data_base[1])))
+        {
+          TRACE_EVENT("UF_ReadData()");
+#ifdef _SIMULATION_
+          rx_readdata(1);
+#else /* _SIMULATION_ */
+          UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_1);
+#endif /* else _SIMULATION_ */
+        }
+#endif /* FF_TWO_UART_PORTS */
+        else
+        {
+          TRACE_ERROR("wrong value of uart_data");
+        }
+      }
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_RX_READY_TO_RECEIVE_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_rx_ready_to_receive_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_dtx_rx_not_ready_to_receive_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal 
+|               SIG_DTX_RX_NOT_READY_TO_RECEIVE_REQ.
+|
+| Parameters  : dlc_instance - dlc instance wich belongs to calling DTX
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_dtx_rx_not_ready_to_receive_req (UBYTE dlc_instance)
+{
+  T_DLC*  dlc;
+
+  TRACE_ISIG( "sig_dtx_rx_not_ready_to_receive_req" );
+
+  dlc = &uart_data->dlc_table[dlc_instance];
+  switch( GET_STATE( UART_SERVICE_RX ) )
+  {
+    case RX_READY:
+    case RX_MUX:
+      dlc->receive_data    = NULL;
+      dlc->receive_process = UART_RX_PROCESS_STOP;
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_DTX_RX_NOT_READY_TO_RECEIVE_REQ unexpected" );
+      break;
+  }
+} /* sig_dtx_rx_not_ready_to_receive_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_rx_not_ready_to_receive_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal 
+|               SIG_KER_RX_NOT_READY_TO_RECEIVE_REQ.
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_rx_not_ready_to_receive_req () 
+{
+  T_DLC*  dlc;
+
+  TRACE_ISIG( "sig_ker_rx_not_ready_to_receive_req" );
+
+  dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE];
+  switch( GET_STATE( UART_SERVICE_RX ) )
+  {
+    case RX_MUX:
+      dlc->receive_data    = NULL;
+      dlc->receive_process = UART_RX_PROCESS_STOP;
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_RX_NOT_READY_TO_RECEIVE_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_rx_not_ready_to_receive_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ker_rx_restart_read_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KER_RX_RESTART_READ_REQ
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ker_rx_restart_read_req () 
+{
+  TRACE_ISIG( "sig_ker_rx_restart_read_req" );
+
+  switch( GET_STATE( UART_SERVICE_RX ) )
+  {
+    case RX_READY:
+    case RX_MUX:
+      if(uart_data->rx.receive_state EQ UART_RX_RECEIVING)
+      {
+        /*
+         * restart readOutFunc
+         */
+        if(uart_data EQ (&(uart_data_base[0])))
+        {
+          TRACE_EVENT("UF_ReadData()");
+#ifdef _SIMULATION_
+          rx_readdata(0);
+#else /* _SIMULATION_ */
+          UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_0);
+#endif /* else _SIMULATION_ */
+        }
+#ifdef FF_TWO_UART_PORTS
+        else if(uart_data EQ (&(uart_data_base[1])))
+        {
+          TRACE_EVENT("UF_ReadData()");
+#ifdef _SIMULATION_
+          rx_readdata(1);
+#else /* _SIMULATION_ */
+          UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_1);
+#endif /* else _SIMULATION_ */
+        }
+#endif /* FF_TWO_UART_PORTS */
+        else
+        {
+          TRACE_ERROR("wrong value of uart_data");
+        }
+      }
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_KER_RX_RESTART_READ_REQ unexpected" );
+      break;
+  }
+} /* sig_ker_rx_restart_read_req() */
+#endif /* !FF_MULTI_PORT */