FreeCalypso > hg > freecalypso-sw
diff gsm-fw/g23m-aci/uart/uart_rxp.c @ 775:eedbf248bac0
gsm-fw/g23m-aci subtree: initial import from LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 12 Oct 2014 01:45:14 +0000 |
parents | |
children | f54080301c98 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/g23m-aci/uart/uart_rxp.c Sun Oct 12 01:45:14 2014 +0000 @@ -0,0 +1,649 @@ +/* ++----------------------------------------------------------------------------- +| 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 +| functions to handles the incoming primitives as described in +| the SDL-documentation (RX-statemachine) ++----------------------------------------------------------------------------- +*/ + +#ifndef UART_RXP_C +#define UART_RXP_C +#endif /* !UART_RXP_C */ + +#define ENTITY_UART + +#ifndef FF_MULTI_PORT +/*==== 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 interfac */ +#ifdef _TARGET_ +#include "uart/serialswitch.h" +#include "uart/traceswitch.h" +#else /* _TARGET_ */ +#include "serial_dat.h" /* to get definitions of serial driver */ +#endif /* _TARGET_ */ +#include "uart.h" /* to get the global entity definitions */ + +#include "uart_rxf.h" /* to get rx functions */ + +#include "uart_kers.h" /* to get ker signals */ +#include "uart_dtxs.h" /* to get dtx signals */ + +#ifdef _SIMULATION_ +#include <stdio.h> /* to get sprintf */ +#include "uart_rxp.h" /* to get rx_readdata */ +#endif /* _SIMULATION_ */ +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : rx_uart_driver_received_ind ++------------------------------------------------------------------------------ +| Description : Handles the primitive UART_DRIVER_RECEIVED_IND +| +| Parameters : *uart_device - affected device database +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void rx_uart_driver_received_ind ( T_UART_DATA* uart_device ) +{ + USHORT i; + BOOL continuous; + T_DLC* dlc; + T_desc2* temp_desc = NULL; + ULONG line_states; + + TRACE_EVENT( "rx_uart_driver_received_ind()" ); + + /* + * set affected instance + */ + uart_data = uart_device; + + /* + * inform about new line states + */ + if(uart_data->rx.lines NEQ uart_data->rx.prev_lines) + { + /* + * convert line states and send it + */ + line_states = 0; + if(uart_data->rx.lines & X_MASK) + { + line_states|= UART_X_RX_MASK; + if(!(uart_data->rx.prev_lines & X_MASK)) + { + TRACE_EVENT("RX Flow Control: stop"); + } + } + else if(uart_data->rx.prev_lines & X_MASK) + { + TRACE_EVENT("RX Flow Control: start"); + } + + if(uart_data->rx.lines & SA_MASK) + { + line_states|= UART_SA_RX_MASK; + if(!(uart_data->rx.prev_lines & SA_MASK)) + { + TRACE_EVENT("DTR: drop"); + } + } + else if(uart_data->rx.prev_lines & SA_MASK) + { + TRACE_EVENT("DTR: on"); + } + + if(uart_data->rx.lines & SB_MASK) + { + line_states|= UART_SB_RX_MASK; + if(!(uart_data->rx.prev_lines & SB_MASK)) + { + TRACE_EVENT("RTS: off"); + } + } + else if(uart_data->rx.prev_lines & SB_MASK) + { + TRACE_EVENT("RTS: on"); + } + + if(uart_data->rx.lines & ESC_MASK) + { + line_states|= UART_ESC_RX_MASK; + TRACE_EVENT("Escape Sequence detected"); + } + + if(uart_data->rx.lines & BRK_MASK) + { + line_states|= UART_BRK_RX_MASK; + line_states|= (((uart_data->rx.lines & BRK_LEN_MASK) + >> BRKLEN) << UART_BRKLEN_RX_POS); + TRACE_EVENT("Break detected"); + } + /* + * store new line states + */ + uart_data->rx.lines&= ~(ESC_MASK | + BRK_MASK | + BRK_LEN_MASK); + uart_data->rx.prev_lines = uart_data->rx.lines; + /* + * inform MMI + */ + sig_rx_ker_line_states_ind(line_states); + } + + switch( GET_STATE( UART_SERVICE_RX ) ) + { + case RX_READY: + dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; + if(uart_data->rx.dlc_instance NEQ UART_EMPTY_INSTANCE) + { + uart_data->rx.dlc_instance = UART_EMPTY_INSTANCE; + uart_data->rx.analyze_state = UART_RX_ERROR; + /* + * if ISR has read out some data + * inform all channels about data reception + */ + if(uart_data->rx.read_permission) + { + for(i = 0; i <= UART_MAX_NUMBER_OF_CHANNELS; i++) + { + switch(uart_data->dlc_table[i].receive_process) + { + case UART_RX_PROCESS_READY: + case UART_RX_PROCESS_COMPLETE: + /* + * inform all channels about data reception + */ + uart_data->dlc_table[i].receive_process = UART_RX_PROCESS_STOP; + temp_desc = uart_data->dlc_table[i].receive_data; + uart_data->dlc_table[i].receive_data = NULL; + if(i EQ UART_CONTROL_INSTANCE) + { + /* + * Control channel + */ + sig_rx_ker_data_received_ind( + temp_desc, + uart_data->dlc_table[i].receive_pos); + } + else + { + /* + * Data channel + */ + uart_data->dtx = uart_data->dlc_table[i].dtx; + sig_rx_dtx_data_received_ind( + temp_desc, + uart_data->dlc_table[i].receive_pos); + } + /* fall through */ + case UART_RX_PROCESS_STOP: + /* + * add new channels which want to receive + */ + if(uart_data->dlc_table[i].receive_data) + uart_data->dlc_table[i].receive_process = UART_RX_PROCESS_READY; + break; + + default: + TRACE_EVENT_P2("Unexpected DLC process state: %d | uart_rxp.c(%d)", + dlc->receive_process, __LINE__); + break; + } + } + } + } + else + { + switch(dlc->receive_process) + { + case UART_RX_PROCESS_READY: + case UART_RX_PROCESS_COMPLETE: + /* + * if ISR has read out some data + * inform channel about data reception + */ + if(uart_data->rx.read_permission) + { + /* + * inform channel about data reception + */ + dlc->receive_process = UART_RX_PROCESS_STOP; + temp_desc = dlc->receive_data; + dlc->receive_data = NULL; + uart_data->dtx = dlc->dtx; + sig_rx_dtx_data_received_ind(temp_desc, dlc->receive_pos); + } + /* fall through */ + case UART_RX_PROCESS_STOP: + /* + * add new channel which want to receive + */ + if(dlc->receive_data) + dlc->receive_process = UART_RX_PROCESS_READY; + break; + + default: + TRACE_EVENT_P2("Unexpected DLC process state: %d | uart_rxp.c(%d)", + dlc->receive_process, __LINE__); + break; + } + } + if(dlc->receive_process EQ UART_RX_PROCESS_STOP) + { + uart_data->rx.receive_state = UART_RX_NOT_RECEIVING; + break; + } + +#ifdef _SIMULATION_ + if(rx_inpavail(uart_data->device) > 0) +#else /* _SIMULATION_ */ + if(UF_InpAvail (uart_data->device) > 0) +#endif /* _SIMULATION_ */ + { + /* + * inform channel about reading + */ + uart_data->rx.read_permission = TRUE; + uart_data->dtx = dlc->dtx; + sig_rx_dtx_receiving_ind(); + } + else + uart_data->rx.read_permission = FALSE; + + if(uart_data EQ (&(uart_data_base[0]))) + { + TRACE_EVENT("UF_ReadData()"); +#ifdef _SIMULATION_ + rx_readdata(0); +#else /* _SIMULATION_ */ + UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_0); +#endif /* else _SIMULATION_ */ + } +#ifdef FF_TWO_UART_PORTS + else if(uart_data EQ (&(uart_data_base[1]))) + { + TRACE_EVENT("UF_ReadData()"); +#ifdef _SIMULATION_ + rx_readdata(1); +#else /* _SIMULATION_ */ + UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_1); +#endif /* else _SIMULATION_ */ + } +#endif /* FF_TWO_UART_PORTS */ + else + { + TRACE_ERROR("wrong value of uart_data"); + } + break; + + case RX_MUX: + if(uart_data->rx.dlc_instance EQ UART_EMPTY_INSTANCE) + { + uart_data->rx.dlc_instance = UART_CONTROL_INSTANCE; + uart_data->rx.analyze_state = UART_RX_ERROR; + } + continuous = FALSE; + for(i = 0; i <= UART_MAX_NUMBER_OF_CHANNELS; i++) + { + dlc = &uart_data->dlc_table[i]; + switch(dlc->receive_process) + { + case UART_RX_PROCESS_READY: + case UART_RX_PROCESS_COMPLETE: + /* + * if ISR has read out some data + * inform all channels about data reception + */ + if(uart_data->rx.read_permission) + { + dlc->receive_process = UART_RX_PROCESS_STOP; + temp_desc = dlc->receive_data; + dlc->receive_data = NULL; + if(i EQ UART_CONTROL_INSTANCE) + { + /* + * Control channel + */ + sig_rx_ker_data_received_ind(temp_desc, dlc->receive_pos); + } + else + { + /* + * Data channel + */ + uart_data->dtx = dlc->dtx; + sig_rx_dtx_data_received_ind(temp_desc, dlc->receive_pos); + } + } + /* fall through */ + case UART_RX_PROCESS_STOP: + /* + * add new channels which want to receive + */ + if(dlc->receive_data) + dlc->receive_process = UART_RX_PROCESS_READY; + break; + + default: + TRACE_EVENT_P2("Unexpected DLC process state: %d, uart_rxp.c(%d)", + dlc->receive_process, __LINE__); + break; +} + if(dlc->receive_process NEQ UART_RX_PROCESS_STOP) + continuous = TRUE; + } + /* + * check whether there is a channel to receive + */ + if(continuous NEQ TRUE) + { + uart_data->rx.receive_state = UART_RX_NOT_RECEIVING; + break; + } +#ifdef _SIMULATION_ + if(rx_inpavail(uart_data->device) > 0) +#else /* _SIMULATION_ */ + if(UF_InpAvail (uart_data->device) > 0) +#endif /* _SIMULATION_ */ + { + /* + * inform each channel about reading + */ + uart_data->rx.read_permission = TRUE; + for(i = 0; i <= UART_MAX_NUMBER_OF_CHANNELS; i++) + { + if(uart_data->dlc_table[i].receive_process EQ UART_RX_PROCESS_READY) + { + if(i EQ UART_CONTROL_INSTANCE) + { + /* + * Control channel + */ + sig_rx_ker_receiving_ind(); + } + else + { + /* + * Data channel + */ + uart_data->dtx = uart_data->dlc_table[i].dtx; + sig_rx_dtx_receiving_ind(); + } + } + } + } + else + uart_data->rx.read_permission = FALSE; + + if(uart_data EQ (&(uart_data_base[0]))) + { + TRACE_EVENT("UF_ReadData()"); +#ifdef _SIMULATION_ + rx_readdata(0); +#else /* _SIMULATION_ */ + UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_0); +#endif /* else _SIMULATION_ */ + } +#ifdef FF_TWO_UART_PORTS + else if(uart_data EQ (&(uart_data_base[1]))) + { + TRACE_EVENT("UF_ReadData()"); +#ifdef _SIMULATION_ + rx_readdata(1); +#else /* _SIMULATION_ */ + UF_ReadData (uart_data->device, sm_suspend, rx_readOutFunc_1); +#endif /* else _SIMULATION_ */ + } +#endif /* FF_TWO_UART_PORTS */ + else + { + TRACE_ERROR("wrong value of uart_data"); + } + break; + + default: + TRACE_ERROR( "UART_DRIVER_RECEIVED_IND unexpected" ); + break; + } +} /* rx_uart_driver_received_ind() */ + + + +#ifdef _SIMULATION_ +/* ++------------------------------------------------------------------------------ +| Function : rx_dti_data_test_ind ++------------------------------------------------------------------------------ +| Description : Handles the primitive DTI_DATA_TEST_IND +| +| Parameters : *dti_data_test_ind - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void rx_dti_data_test_ind ( T_DTI2_DATA_TEST_IND *dti_data_test_ind ) +{ + char buf[100]; + T_reInstMode reInstall; + USHORT size[2]; + USHORT pos; + USHORT i; + T_UART_DATA* uart_device; + + TRACE_FUNCTION( "rx_dti_data_test_ind" ); + + /* + * set UART instance + */ + uart_device = &(uart_data_base[UART_TEST_C_ID_1]); + /* + * copy data to simulation buffer + */ + MFREE_DESC2(uart_device->rx.sim_buffer); + MALLOC(uart_device->rx.sim_buffer, (USHORT)(sizeof(T_desc2) - 1 + + (dti_data_test_ind->sdu.l_buf >> 3))); + memcpy(uart_device->rx.sim_buffer->buffer, + &dti_data_test_ind->sdu.buf[dti_data_test_ind->sdu.o_buf >> 3], + dti_data_test_ind->sdu.l_buf >> 3); + uart_device->rx.sim_buffer->len = dti_data_test_ind->sdu.l_buf >> 3; + uart_device->rx.sim_buffer->next = (ULONG)NULL; + uart_device->rx.sim_pos = 0; + /* + * trace output + */ + sprintf(buf, "UART device %d:", dti_data_test_ind->link_id); + TRACE_FUNCTION( buf ); + i = 0; + pos = uart_device->rx.sim_pos; + while(pos < uart_device->rx.sim_buffer->len) + { + i+= sprintf(&buf[i], "0x%02x, ", uart_device->rx.sim_buffer->buffer[pos]); + pos++; + if(i > 80) + { + TRACE_FUNCTION( buf ); + i = 0; + } + else if(pos >= uart_device->rx.sim_buffer->len) + { + TRACE_FUNCTION( buf ); + } + } + /* + * set values for ISR + */ + uart_device->rx.source[0] = &uart_device->rx.sim_buffer->buffer[ + uart_device->rx.sim_pos]; + uart_device->rx.source[1] = NULL; + size[0] = uart_device->rx.sim_buffer->len - + uart_device->rx.sim_pos; + size[1] = 0; + + /* + * call actual function + */ + rx_readOutFunc_0 (FALSE, &reInstall, 1, uart_device->rx.source, size, 0); + + /* + * store return values + */ + if(size[0] EQ 0) + { + MFREE_DESC2(uart_device->rx.sim_buffer); + uart_device->rx.sim_buffer = NULL; + } + else + uart_device->rx.sim_pos = uart_device->rx.sim_buffer->len - size[0]; + + /* + * free the primitive + */ + PFREE(dti_data_test_ind); +} /* rx_dti_data_test_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : rx_readdata ++------------------------------------------------------------------------------ +| Description : Simulates a UF_ReadData() call. +| +| Parameters : caller - calling UART instance +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void rx_readdata (UBYTE caller) +{ + T_reInstMode reInstall; + USHORT size[2]; + T_UART_DATA* uart_device; + + TRACE_FUNCTION( "rx_readdata" ); + + /* + * set UART instance + */ + uart_device = &(uart_data_base[caller]); + + if(uart_device->rx.sim_buffer EQ NULL) + { + /* + * send DTI_GETDATA_REQ + */ + PALLOC (dti_getdata_req, DTI2_GETDATA_REQ); + dti_getdata_req->link_id = LINK_READDATA_PORT_1; /* for usual read_data */ + PSEND (hCommMMI, dti_getdata_req); + } + else + { + /* + * set values for ISR + */ + uart_device->rx.source[0] = NULL; + uart_device->rx.source[1] = &uart_device->rx.sim_buffer->buffer[ + uart_device->rx.sim_pos]; + size[0] = 0; + size[1] = uart_device->rx.sim_buffer->len - + uart_device->rx.sim_pos; + + /* + * call actual function + */ + if(caller EQ 0) + { + rx_readOutFunc_0 (FALSE, &reInstall, 2, uart_device->rx.source, size, 0); + } +#ifdef FF_TWO_UART_PORTS + else if(caller EQ 1) + { + rx_readOutFunc_1 (FALSE, &reInstall, 2, uart_device->rx.source, size, 0); + } +#endif /* FF_TWO_UART_PORTS */ + else + { + TRACE_ERROR("wrong caller value"); + } + + /* + * store return values + */ + if(size[1] EQ 0) + { + MFREE_DESC2(uart_device->rx.sim_buffer); + uart_device->rx.sim_buffer = NULL; + } + else + uart_device->rx.sim_pos = uart_device->rx.sim_buffer->len - size[1]; + } +} /* rx_readdata() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : rx_inpavail ++------------------------------------------------------------------------------ +| Description : Simulates a UF_InpAvail() call. +| +| Parameters : caller - calling UART instance +| +| Return : number of octets in Input Queue +| ++------------------------------------------------------------------------------ +*/ +GLOBAL USHORT rx_inpavail (UBYTE caller) +{ + T_UART_DATA* uart_device; + + TRACE_FUNCTION( "rx_inpavail" ); + + /* + * set UART instance + */ + uart_device = &(uart_data_base[caller]); + + if(uart_device->rx.sim_buffer) + return uart_device->rx.sim_buffer->len - uart_device->rx.sim_pos; + else + return 0; +} /* rx_inpavail() */ +#endif /* _SIMULATION_ */ +#endif /* !FF_MULTI_PORT */