FreeCalypso > hg > fc-magnetite
view src/aci2/aci/cmh_uartf.c @ 680:ee3ac8c617cb
armio.c: set GPIO2 output high initially
On TI-canonical platforms GPIO2 is DCD modem control output. In TI's
original code the AI_InitIOConfig() function called from Init_Target()
would configure GPIO2 as an output and set the initial output value to
low, but then the init code in uartfax.c called from Init_Serial_Flows()
would immediately change it to high, corresponding to DCD not asserted.
The result is a momentary asserted-state glitch on the DCD output.
The present change eliminates this glitch, setting DCD output to
not-asserted initially like it should be.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 25 Jun 2020 03:17:43 +0000 |
parents | 93999a60b835 |
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 */