diff g23m/condat/ms/src/aci/ati_src_bt.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/aci/ati_src_bt.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,544 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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;
+}
+