FreeCalypso > hg > freecalypso-citrine
comparison g23m-aci/uart/uart_dtxf.c @ 0:75a11d740a02
initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 09 Jun 2016 00:02:41 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:75a11d740a02 |
|---|---|
| 1 /* | |
| 2 +----------------------------------------------------------------------------- | |
| 3 | Project : | |
| 4 | Modul : | |
| 5 +----------------------------------------------------------------------------- | |
| 6 | Copyright 2002 Texas Instruments Berlin, AG | |
| 7 | All rights reserved. | |
| 8 | | |
| 9 | This file is confidential and a trade secret of Texas | |
| 10 | Instruments Berlin, AG | |
| 11 | The receipt of or possession of this file does not convey | |
| 12 | any rights to reproduce or disclose its contents or to | |
| 13 | manufacture, use, or sell anything it may describe, in | |
| 14 | whole, or in part, without the specific written consent of | |
| 15 | Texas Instruments Berlin, AG. | |
| 16 +----------------------------------------------------------------------------- | |
| 17 | Purpose : This modul is part of the entity UART and implements all | |
| 18 | procedures and functions as described in the | |
| 19 | SDL-documentation (DTX-statemachine) | |
| 20 +----------------------------------------------------------------------------- | |
| 21 */ | |
| 22 | |
| 23 #ifndef UART_DTXF_C | |
| 24 #define UART_DTXF_C | |
| 25 #endif /* !UART_DTXF_C */ | |
| 26 | |
| 27 #include "config.h" | |
| 28 #include "fixedconf.h" | |
| 29 #include "condat-features.h" | |
| 30 | |
| 31 #define ENTITY_UART | |
| 32 | |
| 33 /*==== INCLUDES =============================================================*/ | |
| 34 | |
| 35 #ifdef WIN32 | |
| 36 #include "nucleus.h" | |
| 37 #endif /* WIN32 */ | |
| 38 #include "typedefs.h" /* to get Condat data types */ | |
| 39 #include "vsi.h" /* to get a lot of macros */ | |
| 40 #include "macdef.h" /* to get a lot of macros */ | |
| 41 #include "custom.h" | |
| 42 #include "gsm.h" /* to get a lot of macros */ | |
| 43 #include "cnf_uart.h" /* to get cnf-definitions */ | |
| 44 #include "mon_uart.h" /* to get mon-definitions */ | |
| 45 #include "prim.h" /* to get the definitions of used SAP and directions */ | |
| 46 #include "dti.h" /* to get dti lib */ | |
| 47 #include "pei.h" /* to get PEI interface */ | |
| 48 #ifdef FF_MULTI_PORT | |
| 49 #include "gsi.h" /* to get definitions of serial driver */ | |
| 50 #else /* FF_MULTI_PORT */ | |
| 51 #ifdef _TARGET_ | |
| 52 #include "../../serial/serialswitch.h" | |
| 53 #include "../../serial/traceswitch.h" | |
| 54 #else /* _TARGET_ */ | |
| 55 #include "serial_dat.h" /* to get definitions of serial driver */ | |
| 56 #endif /* _TARGET_ */ | |
| 57 #endif /* FF_MULTI_PORT */ | |
| 58 #include "uart.h" /* to get the global entity definitions */ | |
| 59 | |
| 60 /*==== CONST ================================================================*/ | |
| 61 | |
| 62 /* | |
| 63 * names of escape sequence detection state machine | |
| 64 */ | |
| 65 #ifdef _SIMULATION_ | |
| 66 char * uart_esd_state_names[] = | |
| 67 { | |
| 68 "UART_ESD_NULL", | |
| 69 "UART_ESD_CHAR_1", | |
| 70 "UART_ESD_CHAR_2", | |
| 71 "UART_ESD_CHAR_3", | |
| 72 "UART_ESD_DETECTED" | |
| 73 }; | |
| 74 #endif /* _SIMULATION_ */ | |
| 75 | |
| 76 /*==== LOCAL VARS ===========================================================*/ | |
| 77 | |
| 78 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
| 79 | |
| 80 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
| 81 | |
| 82 | |
| 83 | |
| 84 /* | |
| 85 +------------------------------------------------------------------------------ | |
| 86 | Function : dtx_get_esd_state | |
| 87 +------------------------------------------------------------------------------ | |
| 88 | Description : This function returns the current state of the Escape Sequence | |
| 89 | Detection. | |
| 90 | | |
| 91 | Parameters : none | |
| 92 | | |
| 93 | Return : ESD State | |
| 94 | | |
| 95 +------------------------------------------------------------------------------ | |
| 96 */ | |
| 97 GLOBAL T_ESD_STATE dtx_get_esd_state() | |
| 98 { | |
| 99 TRACE_FUNCTION ("dtx_get_esd_state"); | |
| 100 | |
| 101 #ifdef _SIMULATION_ | |
| 102 TRACE_EVENT_P1 ("esd_state is [%s]", | |
| 103 uart_esd_state_names[uart_data->dtx->esd_state]); | |
| 104 #endif /* _SIMULATION_ */ | |
| 105 | |
| 106 return uart_data->dtx->esd_state; | |
| 107 } /* dtx_get_esd_state() */ | |
| 108 | |
| 109 | |
| 110 | |
| 111 /* | |
| 112 +------------------------------------------------------------------------------ | |
| 113 | Function : dtx_set_esd_state | |
| 114 +------------------------------------------------------------------------------ | |
| 115 | Description : This function sets the state of the Escape Sequence Detection. | |
| 116 | | |
| 117 | Parameters : new ESD State | |
| 118 | | |
| 119 | Return : none | |
| 120 | | |
| 121 +------------------------------------------------------------------------------ | |
| 122 */ | |
| 123 GLOBAL void dtx_set_esd_state( T_ESD_STATE new_esd_state ) | |
| 124 { | |
| 125 TRACE_FUNCTION ("dtx_set_esd_state"); | |
| 126 | |
| 127 #ifdef _SIMULATION_ | |
| 128 if(uart_data->dtx->esd_state != new_esd_state) | |
| 129 { | |
| 130 TRACE_EVENT_P2 ("esd_state [%s] -> [%s]", | |
| 131 uart_esd_state_names[uart_data->dtx->esd_state], | |
| 132 uart_esd_state_names[new_esd_state]); | |
| 133 uart_data->dtx->esd_state = new_esd_state; | |
| 134 uart_data->dtx->esd_state_name = uart_esd_state_names[new_esd_state]; | |
| 135 } | |
| 136 else | |
| 137 { | |
| 138 TRACE_EVENT_P1 ("esd_state remains [%s]", | |
| 139 uart_esd_state_names[uart_data->dtx->esd_state]); | |
| 140 } | |
| 141 #else /* _SIMULATION_ */ | |
| 142 if(uart_data->dtx->esd_state != new_esd_state) | |
| 143 uart_data->dtx->esd_state = new_esd_state; | |
| 144 #endif /* _SIMULATION_ */ | |
| 145 } /* dtx_set_esd_state() */ | |
| 146 | |
| 147 | |
| 148 | |
| 149 /* | |
| 150 +------------------------------------------------------------------------------ | |
| 151 | Function : dtx_init | |
| 152 +------------------------------------------------------------------------------ | |
| 153 | Description : The function dtx_init() initializes the service DTX | |
| 154 | | |
| 155 | Parameters : none | |
| 156 | | |
| 157 +------------------------------------------------------------------------------ | |
| 158 */ | |
| 159 GLOBAL void dtx_init () | |
| 160 { | |
| 161 USHORT i; | |
| 162 | |
| 163 TRACE_FUNCTION( "dtx_init" ); | |
| 164 | |
| 165 for( i = 0; i < UART_MAX_NUMBER_OF_CHANNELS; i++ ) | |
| 166 { | |
| 167 /* | |
| 168 * select next instance of service DTX | |
| 169 */ | |
| 170 uart_data->dtx = &( uart_data->dtx_base[i] ); | |
| 171 | |
| 172 /* | |
| 173 * initialize service specific variables | |
| 174 */ | |
| 175 uart_data->dtx->to_send_data = NULL; | |
| 176 uart_data->dtx->cur_desc_size = 0; | |
| 177 uart_data->dtx->write_pos = 0; | |
| 178 uart_data->dtx->size_multiplier = 3; | |
| 179 uart_data->dtx->st_flow = DTI_FLOW_ON; | |
| 180 uart_data->dtx->st_line_sa = DTI_SA_ON; | |
| 181 uart_data->dtx->st_line_sb = DTI_SB_ON; | |
| 182 uart_data->dtx->st_break_len = DTI_BREAK_OFF; | |
| 183 uart_data->dtx->detect_escape = TRUE; | |
| 184 uart_data->dtx->lines_changed = FALSE; | |
| 185 uart_data->dtx->receiving_state = UART_DTX_NOT_RECEIVING; | |
| 186 uart_data->dtx->data_flow = UART_FLOW_DISABLED; | |
| 187 dtx_set_esd_state( UART_ESD_NULL ); | |
| 188 uart_data->dtx->esd_guard_time = 0; | |
| 189 uart_data->dtx->esd_pos = 0; | |
| 190 uart_data->dtx->dti_dtx_state = DTI_CLOSED; | |
| 191 | |
| 192 INIT_STATE( UART_SERVICE_DTX , DTX_DEAD ); | |
| 193 } | |
| 194 } /* dtx_init() */ | |
| 195 | |
| 196 | |
| 197 | |
| 198 /* | |
| 199 +------------------------------------------------------------------------------ | |
| 200 | Function : dtx_free_resources | |
| 201 +------------------------------------------------------------------------------ | |
| 202 | Description : The function dtx_free_resources() frees the currently allocated | |
| 203 | resources of the service DTX. | |
| 204 | | |
| 205 | Parameters : none | |
| 206 | | |
| 207 +------------------------------------------------------------------------------ | |
| 208 */ | |
| 209 GLOBAL void dtx_free_resources () | |
| 210 { | |
| 211 TRACE_FUNCTION( "dtx_free_resources()" ); | |
| 212 | |
| 213 /* | |
| 214 * free all resources | |
| 215 */ | |
| 216 if(uart_data->dtx->to_send_data) | |
| 217 { | |
| 218 MFREE_DESC2( uart_data->dtx->to_send_data ); | |
| 219 uart_data->dtx->to_send_data = NULL; | |
| 220 } | |
| 221 uart_data->dtx->cur_desc_size = 0; | |
| 222 uart_data->dtx->write_pos = 0; | |
| 223 | |
| 224 } /* dtx_free_resources() */ | |
| 225 | |
| 226 /* | |
| 227 +------------------------------------------------------------------------------ | |
| 228 | Function : dtx_exit | |
| 229 +------------------------------------------------------------------------------ | |
| 230 | Description : The function dtx_exit() frees the currently allocated | |
| 231 | resources of the service DTX. | |
| 232 | | |
| 233 | Parameters : none | |
| 234 | | |
| 235 +------------------------------------------------------------------------------ | |
| 236 */ | |
| 237 GLOBAL void dtx_exit () | |
| 238 { | |
| 239 ULONG i; | |
| 240 | |
| 241 TRACE_FUNCTION( "dtx_exit()" ); | |
| 242 | |
| 243 /* | |
| 244 * free all resources | |
| 245 */ | |
| 246 if(uart_data->dtx->to_send_data) | |
| 247 { | |
| 248 MFREE_DESC2( uart_data->dtx->to_send_data ); | |
| 249 uart_data->dtx->to_send_data = NULL; | |
| 250 } | |
| 251 uart_data->dtx->cur_desc_size = 0; | |
| 252 uart_data->dtx->write_pos = 0; | |
| 253 | |
| 254 if(uart_data->ker.tx_data_waiting) | |
| 255 { | |
| 256 MFREE_DESC2(uart_data->ker.tx_data_waiting); | |
| 257 uart_data->ker.tx_data_waiting = NULL; | |
| 258 } | |
| 259 for(i = 0; i < UART_MAX_NUMBER_OF_CHANNELS; i++) | |
| 260 { | |
| 261 if(uart_data->dlc_table[i].transmit_data) | |
| 262 { | |
| 263 MFREE_DESC2(uart_data->dlc_table[i].transmit_data); | |
| 264 uart_data->dlc_table[i].transmit_data = NULL; | |
| 265 } | |
| 266 | |
| 267 if(uart_data->dlc_table[i].receive_data) | |
| 268 { | |
| 269 MFREE_DESC2(uart_data->dlc_table[i].receive_data); | |
| 270 uart_data->dlc_table[i].receive_data = NULL; | |
| 271 } | |
| 272 } | |
| 273 | |
| 274 } /* dtx_exit() */ | |
| 275 | |
| 276 | |
| 277 /* | |
| 278 +------------------------------------------------------------------------------ | |
| 279 | Function : dtx_allocate_resources | |
| 280 +------------------------------------------------------------------------------ | |
| 281 | Description : The function dtx_allocate_resources() allocates a new set of | |
| 282 | resources for the service DTX. | |
| 283 | | |
| 284 | Parameters : none | |
| 285 | | |
| 286 +------------------------------------------------------------------------------ | |
| 287 */ | |
| 288 GLOBAL void dtx_allocate_resources () | |
| 289 { | |
| 290 TRACE_FUNCTION( "dtx_allocate_resources()" ); | |
| 291 | |
| 292 /* | |
| 293 * allocate a new descriptor | |
| 294 * with a size of: size_multiplier * N1 (frame size) | |
| 295 */ | |
| 296 uart_data->dtx->cur_desc_size = uart_data->n1 * | |
| 297 uart_data->dtx->size_multiplier; | |
| 298 MALLOC(uart_data->dtx->to_send_data, | |
| 299 (USHORT)(sizeof(T_desc2) - 1 + uart_data->dtx->cur_desc_size)); | |
| 300 uart_data->dtx->to_send_data->len = 0; | |
| 301 uart_data->dtx->to_send_data->size = 0; | |
| 302 uart_data->dtx->to_send_data->offset = 0; | |
| 303 uart_data->dtx->to_send_data->next = (ULONG) NULL; | |
| 304 uart_data->dtx->write_pos = 0; | |
| 305 } /* dtx_allocate_resources() */ | |
| 306 | |
| 307 | |
| 308 | |
| 309 /* | |
| 310 +------------------------------------------------------------------------------ | |
| 311 | Function : dtx_calculate_size_multiplier | |
| 312 +------------------------------------------------------------------------------ | |
| 313 | Description : The function dtx_calculate_size_multiplier() calculates the new | |
| 314 | size_multiplier value. | |
| 315 | | |
| 316 | Parameters : desc_to_send - data descriptor that should be sent | |
| 317 | data_flow - state of data flow befor we want to sent | |
| 318 | | |
| 319 +------------------------------------------------------------------------------ | |
| 320 */ | |
| 321 GLOBAL void dtx_calculate_size_multiplier (T_desc2* desc_to_send, | |
| 322 T_DATA_FLOW_STATE data_flow) | |
| 323 { | |
| 324 TRACE_FUNCTION( "dtx_calculate_size_multiplier()" ); | |
| 325 | |
| 326 /* | |
| 327 * calculate new size multiplier according to fillrate of buffer | |
| 328 */ | |
| 329 if((uart_data->dtx->size_multiplier < UART_DTX_MAX_SIZE_MULTIPLIER ) && | |
| 330 (data_flow EQ UART_FLOW_DISABLED)) | |
| 331 { | |
| 332 /* | |
| 333 * buffer is rather full, so increase the multiplier | |
| 334 */ | |
| 335 #ifdef _SIMULATION_ | |
| 336 TRACE_EVENT( " sig_rx_dtx_data_received_ind(): buffer size_multiplier increased " ); | |
| 337 #endif /* _SIMULATION_ */ | |
| 338 uart_data->dtx->size_multiplier++; | |
| 339 } | |
| 340 else if((uart_data->dtx->size_multiplier > 3) && | |
| 341 (data_flow EQ UART_FLOW_ENABLED) && | |
| 342 ((uart_data->dtx->cur_desc_size - desc_to_send->len) > | |
| 343 ((USHORT)uart_data->n1 << 1))) | |
| 344 { | |
| 345 /* | |
| 346 * buffer is rather empty, so decrease the multiplier | |
| 347 */ | |
| 348 #ifdef _SIMULATION_ | |
| 349 TRACE_EVENT( " sig_rx_dtx_data_received_ind(): buffer size_multiplier decreased " ); | |
| 350 #endif /* _SIMULATION_ */ | |
| 351 uart_data->dtx->size_multiplier--; | |
| 352 } | |
| 353 } /* dtx_calculate_size_multiplier() */ |
