FreeCalypso > hg > fc-magnetite
diff src/g23m-aci/uart/uart_dtxf.c @ 162:53929b40109c
src/g23m-aci: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 11 Oct 2016 02:02:43 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-aci/uart/uart_dtxf.c Tue Oct 11 02:02:43 2016 +0000 @@ -0,0 +1,349 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : ++----------------------------------------------------------------------------- +| 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 modul is part of the entity UART and implements all +| procedures and functions as described in the +| SDL-documentation (DTX-statemachine) ++----------------------------------------------------------------------------- +*/ + +#ifndef UART_DTXF_C +#define UART_DTXF_C +#endif /* !UART_DTXF_C */ + +#define ENTITY_UART + +/*==== INCLUDES =============================================================*/ + +#ifdef WIN32 +#include "nucleus.h" +#endif /* WIN32 */ +#include "typedefs.h" /* to get Condat data types */ +#include "vsi.h" /* to get a lot of macros */ +#include "macdef.h" /* to get a lot of macros */ +#include "custom.h" +#include "gsm.h" /* to get a lot of macros */ +#include "cnf_uart.h" /* to get cnf-definitions */ +#include "mon_uart.h" /* to get mon-definitions */ +#include "prim.h" /* to get the definitions of used SAP and directions */ +#include "dti.h" /* to get dti lib */ +#include "pei.h" /* to get PEI interface */ +#ifdef FF_MULTI_PORT +#include "gsi.h" /* to get definitions of serial driver */ +#else /* FF_MULTI_PORT */ +#ifdef _TARGET_ +#include "uart/serialswitch.h" +#include "uart/traceswitch.h" +#else /* _TARGET_ */ +#include "serial_dat.h" /* to get definitions of serial driver */ +#endif /* _TARGET_ */ +#endif /* FF_MULTI_PORT */ +#include "uart.h" /* to get the global entity definitions */ + +/*==== CONST ================================================================*/ + +/* + * names of escape sequence detection state machine + */ +#ifdef _SIMULATION_ +char * uart_esd_state_names[] = +{ + "UART_ESD_NULL", + "UART_ESD_CHAR_1", + "UART_ESD_CHAR_2", + "UART_ESD_CHAR_3", + "UART_ESD_DETECTED" +}; +#endif /* _SIMULATION_ */ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : dtx_get_esd_state ++------------------------------------------------------------------------------ +| Description : This function returns the current state of the Escape Sequence +| Detection. +| +| Parameters : none +| +| Return : ESD State +| ++------------------------------------------------------------------------------ +*/ +GLOBAL T_ESD_STATE dtx_get_esd_state() +{ + TRACE_FUNCTION ("dtx_get_esd_state"); + +#ifdef _SIMULATION_ + TRACE_EVENT_P1 ("esd_state is [%s]", + uart_esd_state_names[uart_data->dtx->esd_state]); +#endif /* _SIMULATION_ */ + + return uart_data->dtx->esd_state; +} /* dtx_get_esd_state() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : dtx_set_esd_state ++------------------------------------------------------------------------------ +| Description : This function sets the state of the Escape Sequence Detection. +| +| Parameters : new ESD State +| +| Return : none +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void dtx_set_esd_state( T_ESD_STATE new_esd_state ) +{ + TRACE_FUNCTION ("dtx_set_esd_state"); + +#ifdef _SIMULATION_ + if(uart_data->dtx->esd_state != new_esd_state) + { + TRACE_EVENT_P2 ("esd_state [%s] -> [%s]", + uart_esd_state_names[uart_data->dtx->esd_state], + uart_esd_state_names[new_esd_state]); + uart_data->dtx->esd_state = new_esd_state; + uart_data->dtx->esd_state_name = uart_esd_state_names[new_esd_state]; + } + else + { + TRACE_EVENT_P1 ("esd_state remains [%s]", + uart_esd_state_names[uart_data->dtx->esd_state]); + } +#else /* _SIMULATION_ */ + if(uart_data->dtx->esd_state != new_esd_state) + uart_data->dtx->esd_state = new_esd_state; +#endif /* _SIMULATION_ */ +} /* dtx_set_esd_state() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : dtx_init ++------------------------------------------------------------------------------ +| Description : The function dtx_init() initializes the service DTX +| +| Parameters : none +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void dtx_init () +{ + USHORT i; + + TRACE_FUNCTION( "dtx_init" ); + + for( i = 0; i < UART_MAX_NUMBER_OF_CHANNELS; i++ ) + { + /* + * select next instance of service DTX + */ + uart_data->dtx = &( uart_data->dtx_base[i] ); + + /* + * initialize service specific variables + */ + uart_data->dtx->to_send_data = NULL; + uart_data->dtx->cur_desc_size = 0; + uart_data->dtx->write_pos = 0; + uart_data->dtx->size_multiplier = 3; + uart_data->dtx->st_flow = DTI_FLOW_ON; + uart_data->dtx->st_line_sa = DTI_SA_ON; + uart_data->dtx->st_line_sb = DTI_SB_ON; + uart_data->dtx->st_break_len = DTI_BREAK_OFF; + uart_data->dtx->detect_escape = TRUE; + uart_data->dtx->lines_changed = FALSE; + uart_data->dtx->receiving_state = UART_DTX_NOT_RECEIVING; + uart_data->dtx->data_flow = UART_FLOW_DISABLED; + dtx_set_esd_state( UART_ESD_NULL ); + uart_data->dtx->esd_guard_time = 0; + uart_data->dtx->esd_pos = 0; + uart_data->dtx->dti_dtx_state = DTI_CLOSED; + + INIT_STATE( UART_SERVICE_DTX , DTX_DEAD ); + } +} /* dtx_init() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : dtx_free_resources ++------------------------------------------------------------------------------ +| Description : The function dtx_free_resources() frees the currently allocated +| resources of the service DTX. +| +| Parameters : none +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void dtx_free_resources () +{ + TRACE_FUNCTION( "dtx_free_resources()" ); + + /* + * free all resources + */ + if(uart_data->dtx->to_send_data) + { + MFREE_DESC2( uart_data->dtx->to_send_data ); + uart_data->dtx->to_send_data = NULL; + } + uart_data->dtx->cur_desc_size = 0; + uart_data->dtx->write_pos = 0; + +} /* dtx_free_resources() */ + +/* ++------------------------------------------------------------------------------ +| Function : dtx_exit ++------------------------------------------------------------------------------ +| Description : The function dtx_exit() frees the currently allocated +| resources of the service DTX. +| +| Parameters : none +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void dtx_exit () +{ + ULONG i; + + TRACE_FUNCTION( "dtx_exit()" ); + + /* + * free all resources + */ + if(uart_data->dtx->to_send_data) + { + MFREE_DESC2( uart_data->dtx->to_send_data ); + uart_data->dtx->to_send_data = NULL; + } + uart_data->dtx->cur_desc_size = 0; + uart_data->dtx->write_pos = 0; + + if(uart_data->ker.tx_data_waiting) + { + MFREE_DESC2(uart_data->ker.tx_data_waiting); + uart_data->ker.tx_data_waiting = NULL; + } + for(i = 0; i < UART_MAX_NUMBER_OF_CHANNELS; i++) + { + if(uart_data->dlc_table[i].transmit_data) + { + MFREE_DESC2(uart_data->dlc_table[i].transmit_data); + uart_data->dlc_table[i].transmit_data = NULL; + } + + if(uart_data->dlc_table[i].receive_data) + { + MFREE_DESC2(uart_data->dlc_table[i].receive_data); + uart_data->dlc_table[i].receive_data = NULL; + } + } + +} /* dtx_exit() */ + + +/* ++------------------------------------------------------------------------------ +| Function : dtx_allocate_resources ++------------------------------------------------------------------------------ +| Description : The function dtx_allocate_resources() allocates a new set of +| resources for the service DTX. +| +| Parameters : none +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void dtx_allocate_resources () +{ + TRACE_FUNCTION( "dtx_allocate_resources()" ); + + /* + * allocate a new descriptor + * with a size of: size_multiplier * N1 (frame size) + */ + uart_data->dtx->cur_desc_size = uart_data->n1 * + uart_data->dtx->size_multiplier; + MALLOC(uart_data->dtx->to_send_data, + (USHORT)(sizeof(T_desc2) - 1 + uart_data->dtx->cur_desc_size)); + uart_data->dtx->to_send_data->len = 0; + uart_data->dtx->to_send_data->size = 0; + uart_data->dtx->to_send_data->offset = 0; + uart_data->dtx->to_send_data->next = (ULONG) NULL; + uart_data->dtx->write_pos = 0; +} /* dtx_allocate_resources() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : dtx_calculate_size_multiplier ++------------------------------------------------------------------------------ +| Description : The function dtx_calculate_size_multiplier() calculates the new +| size_multiplier value. +| +| Parameters : desc_to_send - data descriptor that should be sent +| data_flow - state of data flow befor we want to sent +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void dtx_calculate_size_multiplier (T_desc2* desc_to_send, + T_DATA_FLOW_STATE data_flow) +{ + TRACE_FUNCTION( "dtx_calculate_size_multiplier()" ); + + /* + * calculate new size multiplier according to fillrate of buffer + */ + if((uart_data->dtx->size_multiplier < UART_DTX_MAX_SIZE_MULTIPLIER ) && + (data_flow EQ UART_FLOW_DISABLED)) + { + /* + * buffer is rather full, so increase the multiplier + */ +#ifdef _SIMULATION_ + TRACE_EVENT( " sig_rx_dtx_data_received_ind(): buffer size_multiplier increased " ); +#endif /* _SIMULATION_ */ + uart_data->dtx->size_multiplier++; + } + else if((uart_data->dtx->size_multiplier > 3) && + (data_flow EQ UART_FLOW_ENABLED) && + ((uart_data->dtx->cur_desc_size - desc_to_send->len) > + ((USHORT)uart_data->n1 << 1))) + { + /* + * buffer is rather empty, so decrease the multiplier + */ +#ifdef _SIMULATION_ + TRACE_EVENT( " sig_rx_dtx_data_received_ind(): buffer size_multiplier decreased " ); +#endif /* _SIMULATION_ */ + uart_data->dtx->size_multiplier--; + } +} /* dtx_calculate_size_multiplier() */