view src/aci2/aci/ati_src_bt.c @ 662:8cd8fd15a095

SIM speed enhancement re-enabled and made configurable TI's original code supported SIM speed enhancement, but Openmoko had it disabled, and OM's disabling of speed enhancement somehow caused certain SIM cards to start working which didn't work before (OM's bug #666). Because our FC community is much smaller in year 2020 than OM's community was in their day, we are not able to find one of those #666-affected SIMs, thus the real issue they had encountered remains elusive. Thus our solution is to re-enable SIM speed enhancement and simply wait for if and when someone runs into a #666-affected SIM once again. We provide a SIM_allow_speed_enhancement global variable that allows SIM speed enhancement to be enabled or disabled per session, and an /etc/SIM_spenh file in FFS that allows it to enabled or disabled on a non-volatile basis. SIM speed enhancement is now enabled by default.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 24 May 2020 05:02:28 +0000
parents 93999a60b835
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  BLUETOOTH
|  Modul   :  ATI_SRC_BT_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 :  .
+----------------------------------------------------------------------------- 
*/ 

#ifndef ATI_SRC_BT_C
#define ATI_SRC_BT_C
#endif

#include "aci_all.h"

/*==== INCLUDES ===================================================*/
#include "aci_cmh.h"
#include "ati_cmd.h"
#include "aci_cmd.h"

#include "aci_lst.h"
#include "dti.h"
#include "dti_conn_mng.h"
#include "psa_uart.h"
#include "ati_io.h"
#include "cmh_uart.h"
#include "aci_io.h"
#include "aci_mem.h"

#if defined (BT_ADAPTER)
#include "bti_aci.h"
#include "bti_int.h"
#endif


#include "ati_src_bt.h"

/*==== CONSTANTS ==================================================*/
/*#ifdef GPRS
#define MAX_LARGE_BUFFER_LEN (600)
#define MAX_BUFFER_COUNT (15)
#else
#define MAX_LARGE_BUFFER_LEN (400)
#ifdef FAX_AND_DATA
#define MAX_BUFFER_COUNT (27)
#else
#define MAX_BUFFER_COUNT (7)
#endif
#endif
*/
/*==== TYPES ======================================================*/

/*==== EXPORT =====================================================*/

/*==== VARIABLES ==================================================*/

/*==== FUNCTIONS ==================================================*/

T_BTI_AT_RING_TYPE  get_bti_ring_type(T_ACI_CRING_TYP t);
T_BTI_AT_DCE_SIGNAL get_bti_ring_state(T_IO_DCD_STAT s);
T_BTI_AT_DCE_SIGNAL get_bti_dcd_state(T_IO_DCD_STAT s);

/*
+--------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445              MODULE  : ACI_URT            |
| STATE   : code                        ROUTINE : io_openPort        |
+--------------------------------------------------------------------+

  PURPOSE: opens an external port

*/
GLOBAL T_BTI_ACK io_openPort (T_BTI_PORT_NB port)
{
  TRACE_EVENT("io_openPort()");

  if ((port >= MAX_PORTS) || (port < 0)) /* if requested port number is higher than available ports (including 0) -> fail*/
    return BTI_NAK;

  if (bti_port_table[port].aci_src_id != 0) /* port already used */
    return BTI_NAK;

  bti_port_table[port].aci_src_id = ati_init(ATI_SRC_TYPE_BLUETOOTH, bt_src_result_cb, bt_src_line_state_cb);

  TRACE_EVENT_P2("port %d aci_src_id %d", port, bti_port_table[port].aci_src_id);

  if (bti_port_table[port].aci_src_id == 0) /* failed to get aci src id */
    return BTI_NAK;

  dti_mng_new (bti_port_table[port].aci_src_id, bti_port_table[port].aci_src_id,
                bt_src_dti_cb, TRUE, DTI_MNG_DEVICE_TYPE_BT, DTI_MNG_DATA_TYPE_CMD);

  bti_port_table[port].dti_data_ind_BTI = NULL;
  bti_port_table[port].data_offset = 0;
  bti_port_table[port].data_left = 0;
  bti_port_table[port].bti_gsm_port_info.optimal_gsm_max_packet_size = 0;
  bti_port_table[port].bti_bt_port_info.optimal_bt_max_packet_size = 0;
  bti_port_table[port].atqueue = NULL;
  bti_port_table[port].large_at_output = FALSE;
  bti_port_table[port].at_flow_on = TRUE;

  return BTI_ACK;
}

/*
+--------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445              MODULE  : ACI_URT            |
| STATE   : code                        ROUTINE : io_closePort       |
+--------------------------------------------------------------------+

  PURPOSE: closes an external port

*/
GLOBAL void io_closePort (T_BTI_PORT_NB port)
{
  TRACE_EVENT("io_closePort()");
  ati_finit(bti_port_table[port].aci_src_id);

  bti_port_table[port].aci_src_id = 0;
  bti_port_table[port].dti_data_ind_BTI = NULL;
  bti_port_table[port].data_offset = 0;
  bti_port_table[port].data_left = 0;
  bti_port_table[port].bti_gsm_port_info.optimal_gsm_max_packet_size = 0;
  bti_port_table[port].bti_bt_port_info.optimal_bt_max_packet_size = 0;
  bti_port_table[port].atqueue = NULL;
  bti_port_table[port].large_at_output = FALSE;
  bti_port_table[port].at_flow_on = TRUE;
}



/*
+--------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445              MODULE  : ACI_URT            |
| STATE   : code                        ROUTINE : get_bti_ring_type  |
+--------------------------------------------------------------------+

  PURPOSE: converting ACI type to BTI type
*/
T_BTI_AT_RING_TYPE get_bti_ring_type(T_ACI_CRING_TYP t)
{
  switch (t)
  {
    case CRING_TYP_NotPresent:
      return BTI_AT_RING_NotPresent;
    case CRING_TYP_Async:
      return BTI_AT_RING_Async;
    case CRING_TYP_Sync:
      return BTI_AT_RING_Sync;
    case CRING_TYP_RelAsync:
      return BTI_AT_RING_RelAsync;
    case CRING_TYP_RelSync:
      return BTI_AT_RING_RelSync;
    case CRING_TYP_Fax:
      return BTI_AT_RING_Fax;
    case CRING_TYP_Voice:
      return BTI_AT_RING_Voice;
    case CRING_TYP_AuxVoice:
      return BTI_AT_RING_AuxVoice;
#ifdef GPRS
    case CRING_TYP_GPRS:
      return BTI_AT_RING_GPRS;
#endif  /* GPRS */

 }
  return BTI_AT_RING_NotPresent;
}

/*
+--------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445              MODULE  : ACI_URT            |
| STATE   : code                        ROUTINE : get_bti_ring_state |
+--------------------------------------------------------------------+

  PURPOSE: converting ACI type to BTI type
*/
T_BTI_AT_DCE_SIGNAL get_bti_ring_state(T_IO_RING_STAT s)
{
   switch (s)
   {
     case IO_RING_OFF:
       TRACE_EVENT ("V.24 RING OFF");
       return BTI_AT_RING_OFF;

     case IO_RING_ON:
       TRACE_EVENT ("V.24 RING ON");
       return BTI_AT_RING_ON;
   }
}

/*
+--------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445              MODULE  : ACI_URT            |
| STATE   : code                        ROUTINE : get_bti_dcd_state  |
+--------------------------------------------------------------------+

  PURPOSE: converting ACI type to BTI type
*/
T_BTI_AT_DCE_SIGNAL get_bti_dcd_state(T_IO_DCD_STAT s)
{
   switch (s)
   {
     case IO_DCD_OFF:
       TRACE_EVENT ("V.24 DCD OFF");
       return BTI_AT_DCD_OFF;

     case IO_DCD_ON:
       TRACE_EVENT ("V.24 DCD ON");
       return BTI_AT_DCD_ON;
   }
}

/*
+--------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445              MODULE  : ACI_URT            |
| STATE   : code                        ROUTINE : ati_src_bt_proc_cmd|
+--------------------------------------------------------------------+

  PURPOSE:

*/

GLOBAL BOOL ati_src_bt_proc_cmd (T_ACI_CMD_REQ_BT *cmd)
{
  TRACE_FUNCTION ("ati_src_bt_proc_cmd ()");
  return (ati_execute (cmd->src_id, cmd->cmd_seq, cmd->cmd_len));
}

/*
+-------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445    MODULE  : PSA_UART                    |
|                            ROUTINE : bt_src_connect               |
+-------------------------------------------------------------------+

  PURPOSE :

*/
GLOBAL T_ACI_RETURN bt_src_connect (UBYTE srcId, T_DTI_ENTITY_ID unit) 
{
  T_BTI_PORT_NB port_nb;

  TRACE_EVENT("bt_src_connect()");

  port_nb = get_port_by_srcID(srcId);

  TRACE_EVENT_P3("port %d src_id %d unit %d", port_nb, bti_port_table[port_nb].aci_src_id, unit);

  dti_entity_connected(srcId, CONNECTED, UNIT_BLUETOOTH);

  return AT_CMPL;
}

/*
+-------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445    MODULE  : PSA_UART                    |
|                            ROUTINE : bt_src_disconnect            |
+-------------------------------------------------------------------+

  PURPOSE :

*/
GLOBAL T_ACI_RETURN bt_src_disconnect (UBYTE srcId)
{
  T_BTI_PORT_NB port_nb;

  port_nb = get_port_by_srcID(srcId);

  return AT_CMPL;
}

/*
+-------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445    MODULE  : PSA_UART                    |
|                            ROUTINE : bt_enqueue_command           |
+-------------------------------------------------------------------+

  PURPOSE :

*/
GLOBAL void bt_enqueue_command(T_BTI_PORT_NB port_nb, UBYTE *output, USHORT output_len, UBYTE type)
{
  T_ATI_BT_OUTPUT *cur_cmd;
  T_ATI_BT_OUTPUT *queue_end;
  int len;

  TRACE_EVENT_P2("bt_enqueue_command() %d %s",type, output);

  len = output_len + sizeof(T_ATI_BT_OUTPUT);
  ACI_MALLOC(cur_cmd, len);

  cur_cmd->output_len = output_len;
  cur_cmd->output_type = type;
  cur_cmd->next = NULL;
  memcpy (cur_cmd->output, output, output_len);
  cur_cmd->output[output_len] = 0;

  if (bti_port_table[port_nb].atqueue == NULL) /* Queue is empty */
  {
    bti_port_table[port_nb].atqueue = cur_cmd;
  }
  else /* There are already pending commands */
  {
    queue_end = bti_port_table[port_nb].atqueue;
    len = 1; /* just for debugging */

#ifdef _SIMULATION_
//    TRACE_EVENT_P1("content: %s", queue_end->output); /* just for debugging */
#endif

    while (queue_end->next != NULL) /* search end of queue */
    {
      queue_end = queue_end->next;
      len++; /* just for debugging */
#ifdef _SIMULATION_
//      TRACE_EVENT_P1("content: %s", queue_end->output); /* just for debugging */
#endif
    }
    TRACE_EVENT_P1("elements in queue: %d", len); /* just for debugging */
    queue_end->next = cur_cmd;
  }
  return;
}


/*
+-------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445    MODULE  : PSA_UART                    |
|                            ROUTINE : bt_set_output_type           |
+-------------------------------------------------------------------+

  PURPOSE :

*/
GLOBAL UBYTE bt_set_output_type(T_ATI_OUTPUT_TYPE t)
{
  if (IS_CONFIRM_OUTPUT(t))
    return ATI_BT_CONFIRM_COMMAND;
  if (IS_NORMAL_OUTPUT(t))
    return ATI_BT_NORMAL_COMMAND;
  if (IS_INDICATION_OUTPUT(t))
    return ATI_BT_INDICATION_COMMAND;

  TRACE_EVENT("ATI_BT unexpected output type");
}

/*==== CALLBACKS ==================================================*/

/*
+--------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445              MODULE  : ACI_URT            |
| STATE   : code                        ROUTINE : bt_src_result_cb   |
+--------------------------------------------------------------------+

  PURPOSE:

*/
GLOBAL void bt_src_result_cb (UBYTE             src_id,
                                T_ATI_OUTPUT_TYPE output_type,
                                UBYTE             *output,
                                USHORT            output_len)
{
  ULONG port_nb;

  port_nb = get_port_by_srcID(src_id);

  TRACE_EVENT_P1("bt_src_result_cb() pt: %d", port_nb);

/* just for test purposes */
  TRACE_EVENT((char*)output);

  /* first check, if we are allowed to send */
  if (bti_port_table[port_nb].at_flow_on == FALSE)
  {
    TRACE_EVENT("bt_src_result_cb() commands pending");
    bt_enqueue_command(port_nb, output, output_len, bt_set_output_type(output_type));
    return;
  }

  /* kk 010808
   * according to RIE NORMAL_OUTPUT and CONFIRM_OUTPUT is mutual exclusive
   * but this is not the case in the current implementation
   * addionally INDICATION_OUTPUT is never set
   * temporary solution is to check for CONFIRM first then exit if applicable
   * else check for NORMAL_OUTPUT and assume that this is also INDICATION
   * NEEDS FIX from RIE
   */
  if (IS_CONFIRM_OUTPUT(output_type))
  {
    TRACE_EVENT("bt_src_result_cb() confirm sent");
    btiaci_at_cmd_res(port_nb, (char *)output);
    return;
  }

  /* kk 010808
   * according to RIE NORMAL_OUTPUT and CONFIRM_OUTPUT is mutual exclusive
   * but this is not the case in the current implementation
   * addionally INDICATION_OUTPUT is never set
   * temporary solution is to check for CONFIRM first then exit if applicable
   * else check for NORMAL_OUTPUT and assume that this is also INDICATION
   * NEEDS FIX from RIE
   */
  if (IS_NORMAL_OUTPUT(output_type) OR IS_INDICATION_OUTPUT(output_type) OR IS_ECHO_OUTPUT(output_type))
  {
    TRACE_EVENT("bt_src_result_cb() indication/normal sent");
    bti_port_table[port_nb].at_flow_on = FALSE;
    btiaci_at_cmd_req(port_nb, (char *)output);
    return;
  }

  TRACE_EVENT("bt_src_result_cb() SOMETHING IS WRONG HERE");
}

/*
+--------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445              MODULE  : ACI_URT            |
| STATE   : code                        ROUTINE : bt_src_line_state_cb
+--------------------------------------------------------------------+

  PURPOSE:

*/
GLOBAL void bt_src_line_state_cb (UBYTE                 src_id,
                                    T_ATI_LINE_STATE_TYPE line_state_type,
                                    ULONG                  line_state_param)
{

  T_BTI_AT_RING_TYPE bt1, bt2;
  T_BTI_AT_DCE_SIGNAL signal;
  T_BTI_PORT_NB port_nb;

  T_IO_RING_PARAMS *ring;
  T_IO_DCD_STAT *dcd;

  port_nb = get_port_by_srcID(src_id);

  TRACE_EVENT_P1("bt_src_line_state_cb() pt: %d", port_nb);

  switch (line_state_type)
  {
    case ATI_LINE_STATE_RNG:
      TRACE_EVENT("line state RING");

      ring = (T_IO_RING_PARAMS *)line_state_param;

      bt1 = get_bti_ring_type(ring->b_cap_1);
      bt2 = get_bti_ring_type(ring->b_cap_2);
      signal = get_bti_ring_state(ring->ring_stat);

      btiaci_at_signal_change_req(port_nb, signal, bt1, bt2);
      break;

    case ATI_LINE_STATE_DCD:
      TRACE_EVENT("line state DCD");

      dcd = (T_IO_DCD_STAT *)line_state_param;
      signal = get_bti_dcd_state(*dcd);
      btiaci_at_signal_change_req(port_nb, signal, BTI_AT_RING_NotPresent, BTI_AT_RING_NotPresent);
      break;

    case ATI_LINE_STATE_OUTPUT_TYPE:
      /*src_infos->run_cmd = TRUE;*/
      /*src_infos->first_output = TRUE;*/

      if( line_state_param EQ ATI_OUTPUT_TYPE_LARGE )
      {
        TRACE_EVENT("large output following");
        bti_port_table[port_nb].large_at_output = TRUE;
      }
      else
      {
        TRACE_EVENT("normal output following");
        bti_port_table[port_nb].large_at_output = FALSE;
      }
      break;

    default:
      TRACE_EVENT("line state NO TYPE");
      break;
  }
}



/*
+-------------------------------------------------------------------+
| PROJECT : BLUETOOTH 8445    MODULE  : PSA_UART                    |
|                            ROUTINE : bt_src_dti_cb                |
+-------------------------------------------------------------------+

  PURPOSE : callback for dti manager.

*/

GLOBAL BOOL bt_src_dti_cb( UBYTE srcId, T_DTI_MNG_CB_TYPE result_type )
{
  TRACE_FUNCTION("bt_src_dti_cb()");

  switch(result_type)
  {
    case(CB_TYPE_CONNECTED):
      TRACE_EVENT_P1("srcID %d connected", srcId);
      break;

    case(CB_TYPE_TMP_RECONNECTED):
      TRACE_EVENT_P1("srcID %d reconnected", srcId);
      break;

    case(CB_TYPE_NEW_CONNECTED):
      TRACE_EVENT_P1("srcID %d new connected", srcId);
      break;

    case(CB_TYPE_TMP_DISCONNECTING):
      TRACE_EVENT_P1("srcID %d disconnecting", srcId);
      break;

    case(CB_TYPE_TMP_DISCONNECTED):
      TRACE_EVENT_P1("srcID %d disconnected", srcId);
      break;

    case(CB_TYPE_ERROR):
      TRACE_EVENT_P1("srcID %d ERROR", srcId);

    /* connection failed */
//kk        srcInfos->LineState = LINE_TMP_DISCONNECTED;
//k        dti_mng_owner_connect(srcId, UNIT_UART);
      break;

    default:
      break;
  }

  return TRUE;
}