FreeCalypso > hg > fc-magnetite
view src/aci2/aci/ati_src_bt.c @ 395:11e279107681
Magnetite fw can now be compiled to target Calypso C05 (F741979B) silicon
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 18 Jan 2018 00:03:48 +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; }