diff gsm-fw/g23m-aci/aci/psa_uartp.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 d988f0f6aeb9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/g23m-aci/aci/psa_uartp.c	Sun Oct 12 01:45:14 2014 +0000
@@ -0,0 +1,621 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-PS (6147)
+|  Modul   :  PSA_UARTP
++----------------------------------------------------------------------------- 
+|  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 processing functions for the
+|             primitives sent to the protocol stack adapter by the DTI
+|             interface.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifdef UART
+
+#ifndef PSA_UARTP_C
+#define PSA_UARTP_C
+#endif
+
+#include "aci_all.h"
+
+/*==== INCLUDES ===================================================*/
+#include "aci_cmh.h"
+#include "ati_cmd.h"
+#include "aci_cmd.h"
+#include "dti.h"      /* functionality of the dti library */
+
+#include "aci.h"
+#include "aci_lst.h"
+
+#include "dti_conn_mng.h"
+#include "dti_cntrl_mng.h"
+#include "psa_uart.h"
+#include "ati_io.h"
+#include "cmh_uart.h"
+
+#include "aci_mem.h"
+
+#include "ati_src_uart.h"
+
+#include "sap_dti.h"
+
+/*==== CONSTANTS ==================================================*/
+
+
+/*==== TYPES ======================================================*/
+
+
+/*==== EXPORT =====================================================*/
+
+EXTERN void cmhUART_erase_elem_received_cmd (UBYTE srcId);
+
+/*==== VARIABLES ==================================================*/
+
+/*==== FUNCTIONS ==================================================*/
+
+/* for tracing of establishing of CMD channels for dual port version */
+#ifdef RMV_15_04_03
+CHAR gob_tst_buf[80];
+#endif
+
+/********** UART related primitives *************************/
+
+/*
++-------------------------------------------------------------------+       
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                     |
+|                            ROUTINE : psa_uart_parameters_cnf      |
++-------------------------------------------------------------------+
+
+  PURPOSE : .
+
+*/
+
+GLOBAL void psa_uart_parameters_cnf( T_UART_PARAMETERS_CNF *uart_parameters_cnf )
+{
+  TRACE_FUNCTION("psa_uart_parameters_cnf");
+
+  cmhUART_ParmsUpdated( uart_parameters_cnf->device );
+  
+  PFREE(uart_parameters_cnf);
+}
+
+
+/*
++-------------------------------------------------------------------+       
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                     |
+|                            ROUTINE : psa_uart_parameters_ind      |
++-------------------------------------------------------------------+
+
+  PURPOSE : .
+
+TODO: set uart_instances parameter for aci here..
+
+*/
+
+GLOBAL void psa_uart_parameters_ind( T_UART_PARAMETERS_IND *uart_parameters_ind )
+{
+  UBYTE i;
+  UBYTE srcId;
+
+  TRACE_FUNCTION("psa_uart_parameters_ind");
+
+  /* for tracing of establishing of CMD channels for dual port version */
+#ifdef RMV_15_04_03
+  memset (gob_tst_buf, 0, 80);
+  sprintf(gob_tst_buf+strlen(gob_tst_buf), "pi:%d ", uart_parameters_ind->uart_instances);
+#endif
+
+  /*FF_ATI*/
+  for (i=0;i<uart_parameters_ind->uart_instances;i++)
+  {
+    srcId = uart_new_source (i, UART_DLCI_NOT_MULTIPLEXED);
+    cmhUART_startConnection (srcId, DEVICE_TYPE_URT);
+  }
+
+  PFREE(uart_parameters_ind);
+
+#if defined (RMV_01_04_03) AND defined (DTI)
+  {
+    /* this is the same as AT%DATA=2,"UART",1,,"SER","UART",0, which is issued by RIL */
+    BOOL rv = dti_cntrl_set_redirect_from_device ((UBYTE)DTI_MODE_PERM,
+                                           DTI_ENTITY_UART,
+                                           1,
+                                           0,
+                                           DTI_ENTITY_UART,
+                                           0,
+                                           0,
+                                           DTI_CPBLTY_SER,
+                                           0);
+
+    if (rv EQ TRUE)
+    {
+      TRACE_EVENT("dti_cntrl_set_redirect_from_device returned TRUE");
+    }
+    else
+    {
+      TRACE_EVENT("dti_cntrl_set_redirect_from_device returned FALSE");
+    }
+  }
+#endif
+}
+
+
+
+
+/*
++-------------------------------------------------------------------+       
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                     |
+|                            ROUTINE : psa_uart_dti_cnf         |
++-------------------------------------------------------------------+
+
+  PURPOSE : .
+
+*/
+GLOBAL void psa_uart_dti_cnf( T_UART_DTI_CNF *uart_dti_cnf )
+{
+  T_ACI_DTI_PRC  *src_infos = NULL;
+  T_DTI_CONN_LINK_ID link_id;
+
+  TRACE_FUNCTION("psa_uart_dti_cnf");
+
+  src_infos = cmhUART_find_dlci (uart_src_params, 
+                                 uart_dti_cnf->device, 
+                                 uart_dti_cnf->dlci);
+
+  /* for tracing of establishing of CMD channels for dual port version */
+#ifdef RMV_15_04_03
+  sprintf(gob_tst_buf+strlen(gob_tst_buf), "utc:%d ", uart_dti_cnf->device);
+#endif
+  
+  if (src_infos == NULL)
+  {
+    TRACE_EVENT ("psa_uart_dti_cnf: src_infos EQ NULL");
+    PFREE(uart_dti_cnf);
+    return;
+  }
+#ifdef DTI
+  link_id = dti_cntrl_get_link_id( DTI_ENTITY_UART, uart_dti_cnf->device, uart_dti_cnf->dlci );
+
+  if (uart_dti_cnf->dti_conn EQ UART_DISCONNECT_DTI)
+  {
+    /* tell DTI MNG that connection is closed */
+    dti_cntrl_entity_disconnected( link_id, DTI_ENTITY_UART );
+  }
+  else if (uart_dti_cnf->dti_conn EQ UART_CONNECT_DTI)
+  {
+    /* tell DTI MNG that connection is completed */
+    dti_cntrl_entity_connected( link_id, DTI_ENTITY_UART, DTI_OK );
+  }
+#endif
+  PFREE(uart_dti_cnf);
+}
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                       |
+|                            ROUTINE : psa_UART_error_IND             |
++---------------------------------------------------------------------+
+
+  PURPOSE : 
+
+*/
+EXTERN void uart_erase_source( UBYTE srcId );
+
+GLOBAL void psa_uart_error_ind( T_UART_ERROR_IND *uart_error_ind )
+{
+  T_ACI_DTI_PRC *cmd;
+  T_DTI_CONN_LINK_ID link_id;
+  CHAR buf[40];
+
+  TRACE_FUNCTION("psa_uart_error_ind");
+
+  /* for tracing of establishing of CMD channels for dual port version */
+#ifdef RMV_15_04_03
+  sprintf(gob_tst_buf+strlen(gob_tst_buf), "uei ");
+#endif 
+  
+  cmd = cmhUART_find_dlci( uart_src_params, 
+                            uart_error_ind->device,
+                            uart_error_ind->dlci);
+#ifdef DTI
+  switch( uart_error_ind->error )
+  {
+  case( UART_ERROR_NO_CHANNEL ):
+    sprintf(buf, "Channel number %d cannot be created", cmd->srcId);
+    TRACE_EVENT(buf);
+    link_id = dti_cntrl_get_link_id( DTI_ENTITY_UART, uart_error_ind->device, uart_error_ind->dlci );
+
+    /* tell DTI manager that establishment has failed */
+    dti_cntrl_entity_connected( link_id, DTI_ENTITY_UART, DTI_ERROR);
+    break;
+
+    case( UART_ERROR_MUX_ESTABLISH_FAIL ):
+    case( UART_ERROR_MUX_NO_RESPONSE ):
+    default:
+      TRACE_EVENT("UART_ERROR_IND received with cause other than UART_ERROR_NO_CHANNEL");
+    break;
+  }
+#endif
+  PFREE(uart_error_ind);
+}
+
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  :PSA_UART                        |
+|                            ROUTINE : psa_uart_disable_cnf           |
++---------------------------------------------------------------------+
+
+  PURPOSE : 
+
+*/
+
+GLOBAL void psa_uart_disable_cnf(T_UART_DISABLE_CNF *uart_disable_cnf)
+{
+  TRACE_FUNCTION("psa_uart_disable_cnf");
+
+  PFREE(uart_disable_cnf);
+}
+
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  :PSA_UART                        |
+|                            ROUTINE : psa_uart_ring_cnf              |
++---------------------------------------------------------------------+
+
+  PURPOSE : 
+
+*/
+
+GLOBAL void psa_uart_ring_cnf(T_UART_RING_CNF *uart_ring_cnf)
+{
+  T_ACI_DTI_PRC  *src_infos = NULL;
+
+  TRACE_FUNCTION("psa_uart_ring_cnf");
+  
+  src_infos = cmhUART_find_dlci (uart_src_params, 
+                                 uart_ring_cnf->device, 
+                                 uart_ring_cnf->dlci);
+    
+  if (src_infos EQ NULL)      
+  {
+    TRACE_EVENT_P2 ("[ERR] psa_uart_ring_cnf: not found: device=%d; dlci=%d",
+                    uart_ring_cnf->device, uart_ring_cnf->dlci);
+  }
+  else
+  {
+    BITFIELD_CLEAR (src_infos->data_cntr, UART_RING_RUNNING);
+  }
+  PFREE(uart_ring_cnf);
+}
+
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  :PSA_UART                        |
+|                            ROUTINE : psa_uart_dcd_cnf               |
++---------------------------------------------------------------------+
+
+  PURPOSE : 
+
+*/
+
+GLOBAL void psa_uart_dcd_cnf(T_UART_DCD_CNF *uart_dcd_cnf )
+{
+  TRACE_FUNCTION("psa_uart_dcd_cnf");
+
+  PFREE(uart_dcd_cnf);
+}
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                       |
+|                            ROUTINE : psa_uart_escape_cnf            |
++---------------------------------------------------------------------+
+
+  PURPOSE :
+
+*/
+
+GLOBAL void psa_uart_escape_cnf(T_UART_ESCAPE_CNF *uart_escape_cnf )
+{
+  TRACE_FUNCTION("psa_uart_escape_cnf");
+
+  PFREE(uart_escape_cnf);
+}
+
+
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                       |
+|                            ROUTINE : psa_uart_dti_ind               |
++---------------------------------------------------------------------+
+
+  PURPOSE : 
+
+this primitive is sent by UART to indicate that a dti-channel has been
+closed (or opened, theoretically) without previous request from ACI.
+
+*/
+GLOBAL void psa_uart_dti_ind( T_UART_DTI_IND 
+                                                 *uart_dti_ind )
+{
+  T_DTI_CONN_LINK_ID link_id = DTI_LINK_ID_NOTPRESENT;
+  T_ACI_DTI_PRC  *src_infos = NULL;
+
+  TRACE_FUNCTION("psa_uart_dti_ind");
+
+  src_infos = cmhUART_find_dlci (uart_src_params, 
+                                 uart_dti_ind->device, 
+                                 uart_dti_ind->dlci);
+#ifdef DTI    
+  if (src_infos EQ NULL)      
+  {
+    TRACE_EVENT_P2 ("[ERR] psa_uart_dti_ind: not found: device=%d; dlci=%d",
+                    uart_dti_ind->device, uart_dti_ind->dlci);
+  }
+  else
+  {
+    link_id = dti_cntrl_get_link_id( DTI_ENTITY_UART, uart_dti_ind->device, uart_dti_ind->dlci );
+
+    if (uart_dti_ind->dti_conn EQ UART_DISCONNECT_DTI)
+    {
+      /* tell DTI MNG that connection is closed */
+      dti_cntrl_entity_disconnected( link_id, DTI_ENTITY_UART );
+
+    }    
+    else if (uart_dti_ind->dti_conn EQ UART_CONNECT_DTI)
+    {
+      dti_cntrl_entity_connected( link_id, DTI_ENTITY_UART, DTI_OK );
+    }
+  }
+#endif
+  PFREE(uart_dti_ind);
+}
+
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                       |
+|                            ROUTINE : psa_uart_detected_ind          |
++---------------------------------------------------------------------+
+
+  PURPOSE : 
+
+TODO!!! 
+
+*/
+
+GLOBAL void psa_uart_detected_ind(T_UART_DETECTED_IND *uart_detected_ind )
+{
+  TRACE_FUNCTION("psa_uart_detected_ind()");
+
+  cmhUART_DetectedESC_DTR ( uart_detected_ind->device,
+                            uart_detected_ind->dlci,
+                            uart_detected_ind->cause );
+
+  PFREE(uart_detected_ind);
+}
+
+
+/********* DTI related prims ****************************/
+
+
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                     |
+|                            ROUTINE : trace_buffer                 |
++-------------------------------------------------------------------+
+
+  PURPOSE : 
+
+*/
+/*
+LOCAL void trace_buffer (UBYTE *buffer, int len)
+{
+  char trcBuf[80];
+  char *writeP;
+  int i;
+
+  sprintf (trcBuf, "Buffer Len.: %d", len);
+  TRACE_EVENT (trcBuf);
+  
+  writeP = trcBuf;
+  for (i = 0; i < len; i++)
+  {
+    writeP += sprintf (writeP, "%02X ", buffer[i]);
+  }
+  *writeP = '\0';
+  TRACE_EVENT ("===================================================");
+  TRACE_EVENT (trcBuf);
+  TRACE_EVENT ("===================================================");
+}
+*/
+/************ MUX related primitives ******************************/
+
+/*
++---------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  :PSA_UART                        |
+|                            ROUTINE : psa_uart_mux_start_cnf         |
++---------------------------------------------------------------------+
+
+  PURPOSE : 
+
+*/
+
+GLOBAL void psa_uart_mux_start_cnf(T_UART_MUX_START_CNF  *uart_mux_start_cnf)
+{
+  TRACE_FUNCTION("psa_uart_mux_start_cnf");
+
+  PFREE(uart_mux_start_cnf);
+}
+
+/*
++---------------------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                                   |
+|                            ROUTINE : psa_uart_mux_dlc_establish_ind             |
++---------------------------------------------------------------------------------+
+
+  PURPOSE : New dlci channel created... Device multiplexed.
+
+*/
+
+GLOBAL void psa_uart_mux_dlc_establish_ind
+                         ( T_UART_MUX_DLC_ESTABLISH_IND *uart_mux_dlc_establish_ind )
+{
+  UBYTE srcId;
+  T_ACI_DTI_PRC *cmd;
+  BOOL Need_New_Source;
+
+  TRACE_FUNCTION("psa_uart_mux_dlc_establish_ind");
+
+  /* send response to UART */
+  psaUART_MuxRes(uart_mux_dlc_establish_ind->device,
+                 uart_mux_dlc_establish_ind->dlci,
+                 uart_mux_dlc_establish_ind->n1);
+  
+  /* search if it is the first multiplexed channel to be established for this 
+           particular device */
+  cmd = cmhUART_find_dlci (uart_src_params, 
+                           uart_mux_dlc_establish_ind->device,
+                           UART_DLCI_NOT_MULTIPLEXED);
+
+  if (cmd EQ NULL)
+    /* means device has not been found: may (possibly ??) happen if some errors_ind
+    from UART have lead to erasing all previous sources of the device */
+    Need_New_Source = TRUE;
+  else if (cmd->dlci NEQ UART_DLCI_NOT_MULTIPLEXED)
+    /* then a new source is needed
+      (device aready has multiplexed channels) */
+    Need_New_Source = TRUE;
+  else
+    Need_New_Source = FALSE;
+
+#ifdef DTI
+  /* create new source */
+  if( Need_New_Source )  
+  {
+    srcId = uart_new_source( uart_mux_dlc_establish_ind->device, 
+                             uart_mux_dlc_establish_ind->dlci );
+  
+    cmd = find_element (uart_src_params, srcId, cmhUARTtest_srcId);
+    if (cmd EQ NULL)
+    {
+      TRACE_EVENT_P1("[ERR] psa_uart_mux_dlc_establish_ind: "
+                     "srcId=%d not found", srcId) ;
+      return ;
+    }    
+    /* start new uart dti channel */
+    cmhUART_startConnection (srcId, DEVICE_TYPE_MUX);
+  }
+  else /* use previous one */
+  { 
+    T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_ACI};
+
+    /*lint -e613 (Warning --Possible use of null pointer) */
+    srcId = cmd->srcId;
+    uart_InitCmdStruct( cmd );
+    cmd->dlci = uart_mux_dlc_establish_ind->dlci;
+    cmd->LineState = LINE_CONNECTING;
+    /*lint +e613 (Warning --Possible use of null pointer) */
+
+    cmhUART_ChangeDeviceType  (srcId, DEVICE_TYPE_MUX);
+
+    dti_cntrl_est_dpath_indirect ( srcId,
+                                   entity_list,
+                                   1,
+                                   SPLIT,
+                                   atiUART_dti_cb,
+                                   DTI_CPBLTY_CMD,
+                                   DTI_CID_NOTPRESENT);
+
+    dti_cntrl_change_sub_no(srcId, uart_mux_dlc_establish_ind->dlci);
+  }
+
+#endif
+
+  PFREE(uart_mux_dlc_establish_ind);
+}
+
+
+/*
++---------------------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                                   |
+|                            ROUTINE : psa_uart_mux_dlc_release_ind               |
++---------------------------------------------------------------------------------+
+
+  PURPOSE : 
+
+*/
+GLOBAL void psa_uart_mux_dlc_release_ind( T_UART_MUX_DLC_RELEASE_IND *uart_mux_dlc_release_ind )
+{
+  T_ACI_DTI_PRC *cmd;
+  CHAR buf[40];
+
+  TRACE_FUNCTION("psa_uart_mux_dlc_release_ind");
+
+  cmd = cmhUART_find_dlci (uart_src_params, 
+                           uart_mux_dlc_release_ind->device,
+                           uart_mux_dlc_release_ind->dlci);
+
+  sprintf(buf,"Channel number %d cannot be created",cmd->srcId);
+  TRACE_EVENT(buf);
+
+  uart_erase_source (cmd->srcId);
+  cmhUART_erase_elem_received_cmd (cmd->srcId);
+  PFREE(uart_mux_dlc_release_ind);
+}
+
+/*
++---------------------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : PSA_UART                                   |
+|                            ROUTINE : psa_uart_mux_close_ind                     |
++---------------------------------------------------------------------------------+
+
+  PURPOSE : 
+
+*/
+GLOBAL void psa_uart_mux_close_ind( T_UART_MUX_CLOSE_IND *uart_mux_close_ind )
+{
+  T_ACI_DTI_PRC *cmd;
+  UBYTE srcId;
+
+  TRACE_FUNCTION("psa_uart_mux_close_ind");
+
+  TRACE_EVENT_P1("MUX closed on device number: %d", uart_mux_close_ind->device);
+
+  do
+  {
+    cmd = cmhUART_find_dlci (uart_src_params, 
+                             uart_mux_close_ind->device,
+                             UART_DLCI_NOT_MULTIPLEXED);
+
+    if( cmd EQ NULL )
+      break;
+    
+    TRACE_EVENT_P1("Mux Channel with src id %d was released", cmd->srcId);
+
+    uart_erase_source( cmd->srcId );
+    cmhUART_erase_elem_received_cmd( cmd->srcId );
+
+  } while( TRUE );
+
+
+  
+  /* reconnect device to uart in non-MUX mode */
+  srcId = uart_new_source( uart_mux_close_ind->device, UART_DLCI_NOT_MULTIPLEXED );
+  
+  /* start uart dti channel */
+  cmhUART_startConnection (srcId, DEVICE_TYPE_URT);
+
+  PFREE(uart_mux_close_ind);
+}
+
+#endif /* UART */