FreeCalypso > hg > fc-tourmaline
view src/g23m-aci/uart/uart_rxs.c @ 234:0faa72eaedcb
give FCBM task a more carefully chosen priority
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 01 May 2021 10:19:15 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | 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 process internal signals as | described in the SDL-documentation (RX-statemachine) +----------------------------------------------------------------------------- */ #ifndef UART_RXS_C #define UART_RXS_C #endif /* !UART_RXS_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 */ #ifdef DTILIB #include "dti.h" /* to get dti lib */ #endif /* DTILIB */ #include "pei.h" /* to get PEI interface */ #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 "uart_rxp.h" /* to get rx_readdata */ #endif /* _SIMULATION_ */ /*==== CONST ================================================================*/ /*==== LOCAL VARS ===========================================================*/ /*==== PRIVATE FUNCTIONS ====================================================*/ /*==== PUBLIC FUNCTIONS =====================================================*/ /* +------------------------------------------------------------------------------ | Function : sig_ker_rx_dead_mode_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_KER_RX_DEAD_MODE_REQ. If this | signal is called the service expectes an disabled UART to work | correctly. | | Parameters : no parameters | +------------------------------------------------------------------------------ */ GLOBAL void sig_ker_rx_dead_mode_req () { TRACE_ISIG( "sig_ker_rx_dead_mode_req" ); uart_data->rx.read_permission = FALSE; uart_data->rx.prev_lines = 0; uart_data->rx.dlc_instance = UART_EMPTY_INSTANCE; uart_data->rx.escape = FALSE; uart_data->rx.receive_state = UART_RX_NOT_RECEIVING; uart_data->rx.analyze_state = UART_RX_ERROR; uart_data->rx.fcs = UART_INITFCS; uart_data->rx.address_field = 0; uart_data->rx.stored_len = 0; switch( GET_STATE( UART_SERVICE_RX ) ) { case RX_READY: case RX_MUX: SET_STATE( UART_SERVICE_RX, RX_DEAD ); break; case RX_DEAD: break; default: TRACE_ERROR( "SIG_KER_RX_DEAD_MODE_REQ unexpected" ); break; } } /* sig_ker_rx_dead_mode_req() */ /* +------------------------------------------------------------------------------ | Function : sig_ker_rx_ready_mode_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_KER_RX_READY_MODE_REQ. | | Parameters : no parameters | +------------------------------------------------------------------------------ */ GLOBAL void sig_ker_rx_ready_mode_req () { TRACE_ISIG( "sig_ker_rx_ready_mode_req" ); switch( GET_STATE( UART_SERVICE_RX ) ) { case RX_DEAD: SET_STATE( UART_SERVICE_RX, RX_READY ); uart_data->rx.read_permission = FALSE; uart_data->rx.dlc_instance = UART_EMPTY_INSTANCE; uart_data->rx.receive_state = UART_RX_NOT_RECEIVING; uart_data->rx.analyze_state = UART_RX_ERROR; break; case RX_MUX: SET_STATE( UART_SERVICE_RX, RX_READY ); if(uart_data->rx.read_permission EQ FALSE) { uart_data->rx.dlc_instance = UART_EMPTY_INSTANCE; uart_data->rx.analyze_state = UART_RX_ERROR; } break; case RX_READY: break; default: TRACE_ERROR( "SIG_KER_RX_READY_MODE_REQ unexpected" ); break; } } /* sig_ker_rx_ready_mode_req() */ /* +------------------------------------------------------------------------------ | Function : sig_ker_rx_mux_mode_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_KER_RX_MUX_MODE_REQ. | | Parameters : no parameters | +------------------------------------------------------------------------------ */ GLOBAL void sig_ker_rx_mux_mode_req () { TRACE_ISIG( "sig_ker_rx_mux_mode_req" ); switch( GET_STATE( UART_SERVICE_RX ) ) { case RX_DEAD: SET_STATE( UART_SERVICE_RX, RX_MUX ); uart_data->rx.read_permission = FALSE; uart_data->rx.dlc_instance = UART_CONTROL_INSTANCE; uart_data->rx.receive_state = UART_RX_NOT_RECEIVING; uart_data->rx.analyze_state = UART_RX_ERROR; break; case RX_READY: SET_STATE( UART_SERVICE_RX, RX_MUX ); if(uart_data->rx.read_permission EQ FALSE) { uart_data->rx.dlc_instance = UART_CONTROL_INSTANCE; uart_data->rx.analyze_state = UART_RX_ERROR; } break; case RX_MUX: break; default: TRACE_ERROR( "SIG_KER_RX_MUX_MODE_REQ unexpected" ); break; } } /* sig_ker_rx_mux_mode_req() */ /* +------------------------------------------------------------------------------ | Function : sig_dtx_rx_ready_to_receive_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_DTX_RX_READY_TO_RECEIVE_REQ. | | Parameters : dlc_instance - dlc instance wich belongs to calling DTX | receive_data - descriptor to write | receive_pos - position to start write | receive_size - size of descriptor to write | +------------------------------------------------------------------------------ */ GLOBAL void sig_dtx_rx_ready_to_receive_req (UBYTE dlc_instance, T_desc2* receive_data, USHORT receive_pos, USHORT receive_size) { T_DLC* dlc; TRACE_ISIG( "sig_dtx_rx_ready_to_receive_req" ); dlc = &uart_data->dlc_table[dlc_instance]; dlc->receive_pos = receive_pos; dlc->receive_size = receive_size; dlc->receive_data = receive_data; /* * start receiving */ if(uart_data->rx.receive_state EQ UART_RX_RECEIVING) { if(uart_data->rx.read_permission EQ FALSE) dlc->receive_process = UART_RX_PROCESS_READY; } else { dlc->receive_process = UART_RX_PROCESS_READY; uart_data->rx.receive_state = UART_RX_RECEIVING; switch( GET_STATE( UART_SERVICE_RX ) ) { case RX_READY: uart_data->rx.dlc_instance = UART_EMPTY_INSTANCE; uart_data->rx.analyze_state = UART_RX_ERROR; 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; } break; default: TRACE_ERROR( "SIG_DTX_RX_READY_TO_RECEIVE_REQ unexpected" ); 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 * because previous receive_state was NOT_READING * there is only one channel which must be informed */ 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"); } } } /* sig_dtx_rx_ready_to_receive_req() */ /* +------------------------------------------------------------------------------ | Function : sig_ker_rx_ready_to_receive_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_KER_RX_READY_TO_RECEIVE_REQ. | | Parameters : receive_data - descriptor to write | receive_pos - position to start write | receive_size - size of descriptor to write | +------------------------------------------------------------------------------ */ GLOBAL void sig_ker_rx_ready_to_receive_req (T_desc2* receive_data, USHORT receive_pos, USHORT receive_size) { T_DLC* dlc; TRACE_ISIG( "sig_ker_rx_ready_to_receive_req" ); dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; switch( GET_STATE( UART_SERVICE_RX ) ) { case RX_MUX: /* * store data in control instance */ dlc->receive_pos = receive_pos; dlc->receive_size = receive_size; dlc->receive_data = receive_data; /* * start receiving */ if(uart_data->rx.receive_state EQ UART_RX_RECEIVING) { if(uart_data->rx.read_permission EQ FALSE) dlc->receive_process = UART_RX_PROCESS_READY; } else { dlc->receive_process = UART_RX_PROCESS_READY; /* * start receiving */ uart_data->rx.receive_state = UART_RX_RECEIVING; 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; } #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; sig_rx_ker_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( "SIG_KER_RX_READY_TO_RECEIVE_REQ unexpected" ); break; } } /* sig_ker_rx_ready_to_receive_req() */ /* +------------------------------------------------------------------------------ | Function : sig_dtx_rx_not_ready_to_receive_req +------------------------------------------------------------------------------ | Description : Handles the internal signal | SIG_DTX_RX_NOT_READY_TO_RECEIVE_REQ. | | Parameters : dlc_instance - dlc instance wich belongs to calling DTX | +------------------------------------------------------------------------------ */ GLOBAL void sig_dtx_rx_not_ready_to_receive_req (UBYTE dlc_instance) { T_DLC* dlc; TRACE_ISIG( "sig_dtx_rx_not_ready_to_receive_req" ); dlc = &uart_data->dlc_table[dlc_instance]; switch( GET_STATE( UART_SERVICE_RX ) ) { case RX_READY: case RX_MUX: dlc->receive_data = NULL; dlc->receive_process = UART_RX_PROCESS_STOP; break; default: TRACE_ERROR( "SIG_DTX_RX_NOT_READY_TO_RECEIVE_REQ unexpected" ); break; } } /* sig_dtx_rx_not_ready_to_receive_req() */ /* +------------------------------------------------------------------------------ | Function : sig_ker_rx_not_ready_to_receive_req +------------------------------------------------------------------------------ | Description : Handles the internal signal | SIG_KER_RX_NOT_READY_TO_RECEIVE_REQ. | | Parameters : no parameters | +------------------------------------------------------------------------------ */ GLOBAL void sig_ker_rx_not_ready_to_receive_req () { T_DLC* dlc; TRACE_ISIG( "sig_ker_rx_not_ready_to_receive_req" ); dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; switch( GET_STATE( UART_SERVICE_RX ) ) { case RX_MUX: dlc->receive_data = NULL; dlc->receive_process = UART_RX_PROCESS_STOP; break; default: TRACE_ERROR( "SIG_KER_RX_NOT_READY_TO_RECEIVE_REQ unexpected" ); break; } } /* sig_ker_rx_not_ready_to_receive_req() */ /* +------------------------------------------------------------------------------ | Function : sig_ker_rx_restart_read_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_KER_RX_RESTART_READ_REQ | | Parameters : no parameters | +------------------------------------------------------------------------------ */ GLOBAL void sig_ker_rx_restart_read_req () { TRACE_ISIG( "sig_ker_rx_restart_read_req" ); switch( GET_STATE( UART_SERVICE_RX ) ) { case RX_READY: case RX_MUX: if(uart_data->rx.receive_state EQ UART_RX_RECEIVING) { /* * restart readOutFunc */ 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( "SIG_KER_RX_RESTART_READ_REQ unexpected" ); break; } } /* sig_ker_rx_restart_read_req() */ #endif /* !FF_MULTI_PORT */