FreeCalypso > hg > fc-magnetite
view src/g23m-aci/aci/cmh_uartf.c @ 597:f18b29e27be5
First attempt at MCSI voice path automatic switching
The function is implemented at the ACI level in both aci2 and aci3,
successfully avoids triggering the DSP bug on the first call,
but the shutdown of MCSI upon call completion is not working properly yet
in either version.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 27 Mar 2019 22:18:35 +0000 |
parents | 53929b40109c |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : CMH_UARTF +----------------------------------------------------------------------------- | 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 functions used by the command | handler for the UART module. +----------------------------------------------------------------------------- */ #ifdef UART #ifndef CMH_UARTF_C #define CMH_UARTF_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_lst.h" #include "dti_conn_mng.h" #include "psa_uart.h" #include "cmh_uart.h" #include "aci_mem.h" /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | STATE : code ROUTINE : cmhUARTtest_srcId | +--------------------------------------------------------------------+ PURPOSE : search function for source Id in the structure T_ACI_DTI_PRC. */ GLOBAL BOOL cmhUARTtest_srcId( UBYTE srcId, void *elem) { T_ACI_DTI_PRC *compared = (T_ACI_DTI_PRC *)elem; if (compared -> srcId EQ srcId ) return TRUE; else return FALSE; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | STATE : code ROUTINE : cmhUARTtest_device | +--------------------------------------------------------------------+ PURPOSE : search function for device number in the structure T_ACI_DTI_PRC. */ GLOBAL BOOL cmhUARTtest_device (UBYTE device, void *elem) { T_ACI_DTI_PRC *compared = (T_ACI_DTI_PRC *)elem; if (compared -> device EQ device ) return TRUE; else return FALSE; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | STATE : code ROUTINE : cmhUART_find_dlci | +--------------------------------------------------------------------+ PURPOSE : returns element with corresponding dlci and device. If called dlci=UART_DLCI_NOT_MULTIPLEXED (UART entity value for device not multiplexed) then function returns element with corresponding device... */ GLOBAL T_ACI_DTI_PRC *cmhUART_find_dlci (T_ACI_LIST *search_list, UBYTE device, UBYTE dlci) { T_ACI_DTI_PRC *content = NULL; if (search_list EQ NULL) return NULL; do { content = find_next_element (search_list, content, device, cmhUARTtest_device); if (content EQ NULL) return NULL; if( dlci EQ UART_DLCI_NOT_MULTIPLEXED OR content->dlci EQ UART_DLCI_NOT_MULTIPLEXED OR content->dlci EQ dlci) return content; } while (content NEQ NULL); return NULL; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | STATE : code ROUTINE : cmhUART_erase_elem_received_cmd | +--------------------------------------------------------------------+ PURPOSE : erase an entry element from the uart_src_params list. */ GLOBAL void cmhUART_erase_elem_received_cmd (UBYTE srcId) { T_ACI_DTI_PRC *content; /* find element to be erased */ content = remove_element (uart_src_params, (UBYTE)srcId, cmhUARTtest_srcId); ACI_MFREE (content); } /********************************************************* ////////////////////////////////////////////////////////// TEMP: rests from aci_urt.c ready for remove? */ GLOBAL BOOL atiViaTif = FALSE; /******************************************************** ///////////////////////////////////////////////////////// */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_URT | | STATE : code ROUTINE : urt_init | +--------------------------------------------------------------------+ PURPOSE : initialize the module and the UART */ GLOBAL void urt_init (void) { TRACE_FUNCTION ("urt_init()"); } /* +--------------------------------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_URT | | STATE : code ROUTINE : cmhUART_translateBD_RATE_to_UART_IO_SPEED | +--------------------------------------------------------------------------------------------+ PURPOSE: */ LOCAL UBYTE cmhUART_translateBD_RATE_to_UART_IO_SPEED ( T_ACI_BD_RATE rate ) { switch ( rate ) { case BD_RATE_AUTO: return UART_IO_SPEED_AUTO; case BD_RATE_75: return UART_IO_SPEED_75; case BD_RATE_150: return UART_IO_SPEED_150; case BD_RATE_300: return UART_IO_SPEED_300; case BD_RATE_600: return UART_IO_SPEED_600; case BD_RATE_1200: return UART_IO_SPEED_1200; case BD_RATE_2400: return UART_IO_SPEED_2400; case BD_RATE_4800: return UART_IO_SPEED_4800; case BD_RATE_7200: return UART_IO_SPEED_7200; case BD_RATE_9600: return UART_IO_SPEED_9600; case BD_RATE_14400: return UART_IO_SPEED_14400; case BD_RATE_19200: return UART_IO_SPEED_19200; case BD_RATE_28800: return UART_IO_SPEED_28800; case BD_RATE_33900: return UART_IO_SPEED_33900; case BD_RATE_38400: return UART_IO_SPEED_38400; case BD_RATE_57600: return UART_IO_SPEED_57600; case BD_RATE_115200: return UART_IO_SPEED_115200; case BD_RATE_203125: return UART_IO_SPEED_203125; case BD_RATE_406250: return UART_IO_SPEED_406250; case BD_RATE_812500: return UART_IO_SPEED_812500; default: return UART_IO_SPEED_UNDEF; } } /* +-----------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_comParFindDevice | +-----------------------------------------------------------------------------+ PURPOSE: Finding the device entry in the 'uart_com_par' table */ LOCAL BOOL cmhUART_comParFindDevice (UBYTE criterium, void *elem) { if ( criterium EQ ((T_ACI_DEVICE_ENTRY*)elem)->device ) return TRUE; return FALSE; } /* +-----------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_FindAll | +-----------------------------------------------------------------------------+ PURPOSE: Find every entry */ LOCAL BOOL cmhUART_FindAll (UBYTE criterium, void *elem) { return TRUE; } LOCAL T_ACI_UART_COM_PAR cmhUART_getDefaultUARTParameter(void) { T_ACI_UART_COM_PAR comPar = { UART_IO_SPEED_115200, UART_IO_BPC_8, UART_IO_SB_1, UART_IO_PA_NONE, UART_IO_FC_RX_RTS, UART_IO_FC_TX_RTS, UART_IO_XON_VALID, UART_IO_XON_DEFAULT, UART_IO_XOFF_VALID, UART_IO_XOFF_DEFAULT, }; return comPar; } /* +----------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_AddDeviceToComParameter | +----------------------------------------------------------------------------------+ PURPOSE: add COM parameter for a new device */ GLOBAL void cmhUART_AddDeviceToComParameter( UBYTE device ) { T_ACI_DEVICE_ENTRY *device_entry; TRACE_FUNCTION("cmhUART_AddDeviceToComParameter"); /* * try to find the device */ device_entry = find_element(uart_com_par, device, cmhUART_comParFindDevice); /* * if the device is new add it to the list */ if ( device_entry EQ NULL ) { ACI_MALLOC (device_entry, sizeof (T_ACI_DEVICE_ENTRY)); device_entry->device = device; /* * Default values by adding a new device */ device_entry->comPar = cmhUART_getDefaultUARTParameter(); insert_list (uart_com_par, device_entry); } } /* +---------------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_RemoveDeviceFromComParameter | +---------------------------------------------------------------------------------------+ PURPOSE: remove COM parameter for a device from 'uart_com_par' table */ GLOBAL void cmhUART_RemoveDeviceFromComParameter( UBYTE device ) { T_ACI_DEVICE_ENTRY *device_entry; TRACE_FUNCTION("cmhUART_RemoveDeviceFromComParameter"); /* * Find the device and remove it. */ device_entry = remove_element(uart_com_par, device, cmhUART_comParFindDevice); if ( device_entry NEQ NULL ) { ACI_MFREE ( device_entry ); } } /* +---------------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_RemoveDeviceFromComParameter | +---------------------------------------------------------------------------------------+ PURPOSE: clean the 'uart_com_par' table */ GLOBAL void cmhUART_CleanComParameterList( void ) { T_ACI_DEVICE_ENTRY *device_entry; TRACE_FUNCTION("cmhUART_CleanComParameterList"); /* * Find the device and remove it. */ while ( NULL NEQ (device_entry = remove_element(uart_com_par, 0, cmhUART_FindAll)) ) { ACI_MFREE ( device_entry ); } } /* +---------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_GetDeviceParOverDevice | +---------------------------------------------------------------------------------+ PURPOSE: returns the COM parameter for this device */ GLOBAL T_ACI_DEVICE_ENTRY* cmhUART_GetDeviceParOverDevice( UBYTE device ) { T_ACI_DEVICE_ENTRY *device_entry; TRACE_FUNCTION("cmhUART_GetDeviceParOverDevice"); /* * return COM parameter for device */ device_entry = find_element(uart_com_par, device, cmhUART_comParFindDevice); if ( device_entry EQ NULL ) { TRACE_EVENT_P1("[ERR] cmhUART_GetDeviceParOverDevice: device=%d not found", device) ; return NULL; } return device_entry; } /* +---------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_GetDeviceParOverDevice | +---------------------------------------------------------------------------------+ PURPOSE: */ GLOBAL T_ACI_DEVICE_TYPE cmhUART_GetDeviceType( UBYTE srcId ) { T_ACI_DTI_PRC *src_infos; TRACE_FUNCTION("cmhUART_GetDeviceType"); src_infos = find_element (uart_src_params, (UBYTE)srcId, cmhUARTtest_srcId); if (src_infos NEQ NULL) { return src_infos->device_type; } else { return DEVICE_TYPE_UNKNOWN; } } /* +---------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_ChangeDeviceParOverDevice | +---------------------------------------------------------------------------------+ PURPOSE: */ GLOBAL BOOL cmhUART_ChangeDeviceType( UBYTE srcId, T_ACI_DEVICE_TYPE device_type ) { T_ACI_DTI_PRC *src_infos; TRACE_FUNCTION("cmhUART_ChangeDeviceType"); src_infos = find_element (uart_src_params, (UBYTE)srcId, cmhUARTtest_srcId); if (src_infos NEQ NULL) { src_infos->device_type = device_type; switch (device_type) { case DEVICE_TYPE_UNKNOWN: TRACE_EVENT_P1("Device type of src %u is DEVICE_TYPE_UNKNOWN", srcId); break; case DEVICE_TYPE_URT: TRACE_EVENT_P1("Device type of src %u is DEVICE_TYPE_URT", srcId); break; case DEVICE_TYPE_MUX: TRACE_EVENT_P1("Device type of src %u is DEVICE_TYPE_MUX", srcId); break; default: TRACE_EVENT_P1("Device type of src %u has invalid value", srcId); break; } return TRUE; } else { return FALSE; } } /* +---------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_GetDeviceParOverSrcID | +---------------------------------------------------------------------------------+ PURPOSE: returns the COM parameter for this source ID */ GLOBAL T_ACI_DEVICE_ENTRY* cmhUART_GetDeviceParOverSrcID( UBYTE srcId ) { T_ACI_DEVICE_ENTRY *device_entry; T_ACI_DTI_PRC *cmd_struct; TRACE_FUNCTION("cmhUART_GetDeviceParOverSrcID()"); if( !ati_is_src_type(srcId, ATI_SRC_TYPE_UART) ) { /* not a UART source */ return(NULL); } /* * find the device connected to this source ID */ cmd_struct = find_element (uart_src_params, srcId, cmhUARTtest_srcId); if (cmd_struct EQ NULL) { TRACE_EVENT_P1("[ERR] cmhUART_GetDeviceParOverSrcID: srcId=%d not found", srcId) ; return NULL; } /* * return COM parameter for device */ device_entry = find_element(uart_com_par, cmd_struct->device, cmhUART_comParFindDevice); if ( device_entry EQ NULL ) { TRACE_EVENT_P1("[ERR] cmhUART_GetDeviceParOverSrcID: device=%d not found", cmd_struct->device) ; return NULL; } return device_entry; } GLOBAL UBYTE cmhUART_GetParityOverSrcID( UBYTE srcId ) { T_ACI_DEVICE_ENTRY *device_entry = cmhUART_GetDeviceParOverSrcID( (UBYTE) srcId ); if ( device_entry EQ NULL ) { return cmhUART_getDefaultUARTParameter().parity; } return device_entry->comPar.parity; } GLOBAL UBYTE cmhUART_GetDataBitOverSrcID( UBYTE srcId ) { T_ACI_DEVICE_ENTRY *device_entry = cmhUART_GetDeviceParOverSrcID( (UBYTE) srcId ); if ( device_entry EQ NULL ) { return cmhUART_getDefaultUARTParameter().bpc; } return device_entry->comPar.bpc; } GLOBAL UBYTE cmhUART_GetStopBitOverSrcID( UBYTE srcId ) { T_ACI_DEVICE_ENTRY *device_entry = cmhUART_GetDeviceParOverSrcID( (UBYTE) srcId ); if ( device_entry EQ NULL ) { return cmhUART_getDefaultUARTParameter().nsb; } return device_entry->comPar.nsb; } /* +------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_SetComParToUnchanged | +------------------------------------------------------------------------------+ PURPOSE: set the UART COM parameter to unchanged */ GLOBAL void cmhUART_SetComParToUnchanged( T_comPar *comPar ) { comPar->speed = UART_IO_SPEED_UNDEF; /* baud rate */ comPar->bpc = UART_IO_BPC_UNDEF; /* bits per character */ comPar->nsb = UART_IO_SB_UNDEF; /* stop bits */ comPar->parity = UART_IO_PA_UNDEF; /* parity of serial link */ comPar->flow_rx = UART_IO_FC_RX_UNDEF; /* flow control mode RX */ comPar->flow_tx = UART_IO_FC_TX_UNDEF; /* flow control mode TX */ comPar->xon_valid = UART_IO_XON_UNDEF; /* indicator whether xon is valid */ comPar->xoff_valid = UART_IO_XOFF_UNDEF; /* indicator whether xoff is valid */ comPar->xon = UART_IO_XON_DEFAULT; comPar->xoff = UART_IO_XOFF_DEFAULT; /* * Set escape parameters */ comPar->esc_valid = UART_IO_ESC_VALID; comPar->esc_char = UART_IO_ESC_CHAR_DEFAULT; comPar->esc_gp = UART_IO_ESC_GP_DEFAULT; } /* +------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_SetDataRate | +------------------------------------------------------------------------------+ PURPOSE: set the UART data rate */ GLOBAL T_ACI_RETURN cmhUART_SetDataRate ( UBYTE srcId, T_ACI_BD_RATE rate) { T_ACI_DEVICE_ENTRY *device_entry = cmhUART_GetDeviceParOverSrcID( srcId ); T_comPar newComPar; if ( device_entry EQ NULL ) { TRACE_EVENT_P1("[ERR] cmhUART_SetDataRate: device for source ID = %d not found", srcId); return AT_FAIL; } cmhUART_SetComParToUnchanged( &newComPar ); device_entry->comPar.speed = newComPar.speed = cmhUART_translateBD_RATE_to_UART_IO_SPEED( rate ); psaUART_SetParameters(device_entry->device, &newComPar); return AT_EXCT; } /* +------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_SetCharacterFraming | +------------------------------------------------------------------------------+ PURPOSE: set the UART character framing */ GLOBAL T_ACI_RETURN cmhUART_SetCharacterFraming ( UBYTE srcId, T_ACI_BS_FRM format, T_ACI_BS_PAR parity ) { T_ACI_DEVICE_ENTRY *device_entry = cmhUART_GetDeviceParOverSrcID( srcId ); T_comPar comPar; if ( device_entry EQ NULL ) { TRACE_EVENT_P1("[ERR] cmhUART_SetCharacterFraming: device for source ID = %d not found", srcId); return AT_FAIL; } cmhUART_SetComParToUnchanged( &comPar ); /* * translate AT command parameter to UART parameter */ if ( format NEQ BS_FRM_NotPresent ) { if ( format & 4 ) { device_entry->comPar.bpc = comPar.bpc = UART_IO_BPC_7; format++; } else { device_entry->comPar.bpc = comPar.bpc = UART_IO_BPC_8; } device_entry->comPar.nsb = comPar.nsb = format & 2 ? UART_IO_SB_1 : UART_IO_SB_2; if ( format & 1 ) { device_entry->comPar.parity = comPar.parity = UART_IO_PA_NONE; parity = BS_PAR_NotPresent; } else { if ( parity EQ BS_PAR_NotPresent ) { if ( device_entry->comPar.parity NEQ UART_IO_PA_NONE ) { if ( device_entry->comPar.parity EQ NOT_SUPPORTED_UART_IO_PA_MARK ) { comPar.parity = UART_IO_PA_NONE; comPar.nsb = UART_IO_SB_2; } else { comPar.parity = device_entry->comPar.parity; } } else { /* the type of parity is not defined */ return AT_FAIL; } } } } switch (parity) { case BS_PAR_NotPresent: /* this case is handled by format translation */ break; case BS_PAR_Odd: device_entry->comPar.parity = comPar.parity = UART_IO_PA_ODD; break; case BS_PAR_Even: device_entry->comPar.parity = comPar.parity = UART_IO_PA_EVEN; break; case BS_PAR_Mark: /* * parity mark is not supported by the UART SAP, * but it is the same as no parity and 2 stop bit */ device_entry->comPar.parity = NOT_SUPPORTED_UART_IO_PA_MARK; comPar.parity = UART_IO_PA_NONE; comPar.nsb = UART_IO_SB_2; break; case BS_PAR_Space: device_entry->comPar.parity = comPar.parity = UART_IO_PA_SPACE; break; } psaUART_SetParameters(device_entry->device, &comPar); return AT_EXCT; } /* +------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_SetFlowControl | +------------------------------------------------------------------------------+ PURPOSE: set the UART flow control */ GLOBAL T_ACI_RETURN cmhUART_SetFlowControl(UBYTE srcId, T_ACI_RX_FLOW_CTRL DCE_by_DTE) { T_ACI_DEVICE_ENTRY *device_entry = cmhUART_GetDeviceParOverSrcID( srcId ); T_comPar comPar; if ( device_entry EQ NULL ) { TRACE_EVENT_P1("[ERR] cmhUART_SetFlowControl: device for source ID = %d not found", srcId); return AT_FAIL; } cmhUART_SetComParToUnchanged( &comPar ); /* * translate AT command parameter to UART parameter */ switch ( DCE_by_DTE ) { case RX_FLOW_NONE: comPar.flow_rx = UART_IO_FC_RX_NONE; comPar.flow_tx = UART_IO_FC_TX_NONE; break; case RX_FLOW_SOFTWARE: comPar.flow_rx = UART_IO_FC_RX_XOFF; comPar.flow_tx = UART_IO_FC_TX_XOFF; break; case RX_FLOW_HARDWARE: comPar.flow_rx = UART_IO_FC_RX_RTS; comPar.flow_tx = UART_IO_FC_TX_RTS; break; case RX_FLOW_NotPresent: return AT_CMPL; } device_entry->comPar.flow_rx = comPar.flow_rx; device_entry->comPar.flow_tx = comPar.flow_tx; psaUART_SetParameters(device_entry->device, &comPar); return AT_EXCT; } /* +--------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_GetFktInterfaceFormat | +--------------------------------------------------------------------------------+ PURPOSE: translate the UART COM parameter to the AT command format parameter ATTENTION: internal function, COM paramter is is not checking of validity */ GLOBAL T_ACI_BS_FRM cmhUART_GetFktInterfaceFormat( T_ACI_UART_COM_PAR *comPar ) { UBYTE format = 1; /* 8 Data 2 Stop */ if ( comPar->bpc EQ UART_IO_BPC_7 ) format += 3; if ( comPar->nsb NEQ UART_IO_SB_2 ) format += 2; if ( comPar->parity NEQ UART_IO_PA_NONE ) format -= 1; return (T_ACI_BS_FRM) format; } /* +--------------------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_UART | | STATE : code ROUTINE : cmhUART_GetFktInterfaceParity | +--------------------------------------------------------------------------------+ PURPOSE: translate the UART COM parameter to the AT command parity parameter ATTENTION: internal function, COM paramter is is not checking of validity */ GLOBAL T_ACI_BS_PAR cmhUART_GetFktInterfaceParity( T_ACI_UART_COM_PAR *comPar ) { switch ( comPar->parity ) { case UART_IO_PA_ODD: return (T_ACI_BS_PAR) BS_PAR_Odd; case UART_IO_PA_EVEN: return (T_ACI_BS_PAR) BS_PAR_Even; case NOT_SUPPORTED_UART_IO_PA_MARK: return (T_ACI_BS_PAR) BS_PAR_Mark; case UART_IO_PA_SPACE: return (T_ACI_BS_PAR) BS_PAR_Space; } return BS_PAR_NotPresent; } #endif /* UART */