FreeCalypso > hg > tcs211-fcmodem
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; +} +