FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/g23m-aci/uart/uart_dtxp.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 |
comparison
equal
deleted
inserted
replaced
774:40a721fd9854 | 775:eedbf248bac0 |
---|---|
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 | functions to handles the incoming primitives as described in | |
19 | the SDL-documentation (DTX-statemachine) | |
20 +----------------------------------------------------------------------------- | |
21 */ | |
22 | |
23 #ifndef UART_DTXP_C | |
24 #define UART_DTXP_C | |
25 #endif /* !UART_DTXP_C */ | |
26 | |
27 #define ENTITY_UART | |
28 | |
29 /*==== INCLUDES =============================================================*/ | |
30 | |
31 #ifdef WIN32 | |
32 #include "nucleus.h" | |
33 #endif /* WIN32 */ | |
34 #include "typedefs.h" /* to get Condat data types */ | |
35 #include "vsi.h" /* to get a lot of macros */ | |
36 #include "macdef.h" /* to get a lot of macros */ | |
37 #include "custom.h" | |
38 #include "gsm.h" /* to get a lot of macros */ | |
39 #include "cnf_uart.h" /* to get cnf-definitions */ | |
40 #include "mon_uart.h" /* to get mon-definitions */ | |
41 #include "prim.h" /* to get the definitions of used SAP and directions */ | |
42 #ifdef DTILIB | |
43 #include "dti.h" /* to get dti lib */ | |
44 #endif /* DTILIB */ | |
45 #include "pei.h" /* to get PEI interface */ | |
46 #ifdef FF_MULTI_PORT | |
47 #include "gsi.h" /* to get definitions of serial driver */ | |
48 #else /* FF_MULTI_PORT */ | |
49 #ifdef _TARGET_ | |
50 #include "uart/serialswitch.h" | |
51 #include "uart/traceswitch.h" | |
52 #else /* _TARGET_ */ | |
53 #include "serial_dat.h" /* to get definitions of serial driver */ | |
54 #endif /* _TARGET_ */ | |
55 #endif /* FF_MULTI_PORT */ | |
56 #include "uart.h" /* to get the global entity definitions */ | |
57 | |
58 #include "uart_dtxf.h" /* to get DTX function definitions */ | |
59 #include "uart_dtxp.h" /* to get DTX primitive definitions */ | |
60 #include "uart_kers.h" /* to get signal definitions of service KER */ | |
61 #ifdef FF_MULTI_PORT | |
62 #include "uart_prxs.h" /* to get signal definitions for service TX */ | |
63 #else /* FF_MULTI_PORT */ | |
64 #include "uart_rxs.h" /* to get signal definitions of service RX */ | |
65 #endif /* FF_MULTI_PORT */ | |
66 | |
67 #ifdef _SIMULATION_ | |
68 #include <stdio.h> /* to get sprintf */ | |
69 #endif /* _SIMULATION_ */ | |
70 #include <string.h> /* JK, delete warnings: to get memcpy */ | |
71 | |
72 /*==== CONST ================================================================*/ | |
73 | |
74 /*==== LOCAL VARS ===========================================================*/ | |
75 | |
76 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
77 | |
78 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
79 | |
80 | |
81 #ifdef DTILIB | |
82 | |
83 /* | |
84 +------------------------------------------------------------------------------ | |
85 | Function : sig_dti_dtx_tx_buffer_ready_ind | |
86 +------------------------------------------------------------------------------ | |
87 | Description : Handles the DTILIB callback call DTI_REASON_TX_BUFFER_READY | |
88 | | |
89 | This signal means that data may be sent over a dti connection. | |
90 | | |
91 | Parameters : - | |
92 | | |
93 +------------------------------------------------------------------------------ | |
94 * | |
95 * when not using DTILIB, the functionality of sig_dti_dtx_tx_buffer_ready_ind() | |
96 * is to be found in dtx_dti_getdata_req(). When debugging, please have a look at | |
97 * both versions!! | |
98 */ | |
99 | |
100 GLOBAL void sig_dti_dtx_tx_buffer_ready_ind() | |
101 { | |
102 USHORT old_write_pos; | |
103 T_DATA_FLOW_STATE old_data_flow; | |
104 T_desc2* temp_desc; | |
105 | |
106 TRACE_FUNCTION( "sig_dti_dtx_tx_buffer_ready_ind" ); | |
107 | |
108 #ifdef FLOW_TRACE | |
109 sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_UP, FLOW_TRACE_TOP, TRUE); | |
110 #endif /* FLOW_TRACE */ | |
111 switch( GET_STATE( UART_SERVICE_DTX ) ) | |
112 { | |
113 case DTX_NOT_READY: | |
114 old_data_flow = uart_data->dtx->data_flow; | |
115 old_write_pos = uart_data->dtx->write_pos; | |
116 /* | |
117 * enable data flow if necessary | |
118 */ | |
119 if(uart_data->dtx->data_flow NEQ UART_FLOW_ENABLED) | |
120 { | |
121 uart_data->dtx->data_flow = UART_FLOW_ENABLED; | |
122 sig_dtx_ker_enable_ind(uart_data->dtx->dlc_instance); | |
123 } | |
124 | |
125 if(uart_data->dtx->receiving_state EQ UART_DTX_NOT_RECEIVING) | |
126 { | |
127 /* | |
128 * if data to send available or | |
129 * line states changed | |
130 */ | |
131 if((uart_data->dtx->to_send_data->len) || | |
132 (uart_data->dtx->lines_changed)) | |
133 { | |
134 PALLOC_DESC2 (dti_data_ind, DTI2_DATA_IND); | |
135 SET_STATE( UART_SERVICE_DTX, DTX_NOT_READY ); | |
136 | |
137 if(uart_data->dtx->to_send_data->len) | |
138 { | |
139 /* | |
140 * mark entity descriptor as invalid, since data will be forwarded | |
141 */ | |
142 temp_desc = uart_data->dtx->to_send_data; | |
143 uart_data->dtx->to_send_data = NULL; | |
144 | |
145 dti_data_ind->desc_list2.first = (ULONG)temp_desc; | |
146 dti_data_ind->desc_list2.list_len = temp_desc->len; | |
147 | |
148 /* | |
149 * calculate new size multiplier according to fillrate of buffer | |
150 */ | |
151 dtx_calculate_size_multiplier (temp_desc, old_data_flow); | |
152 /* | |
153 * allocate a new descriptor with size according to new size_multiplier | |
154 */ | |
155 dtx_allocate_resources(); | |
156 /* | |
157 * Check for data which has not yet been validated, i.e. because | |
158 * the frame containing the data has not yet been received completely. | |
159 * In this case, the not yet validated data is copied to the newly | |
160 * allocated descriptor. | |
161 */ | |
162 if(old_write_pos > temp_desc->len) | |
163 { | |
164 memcpy(uart_data->dtx->to_send_data->buffer, | |
165 &temp_desc->buffer[temp_desc->len], | |
166 old_write_pos - temp_desc->len); | |
167 uart_data->dtx->write_pos = old_write_pos - temp_desc->len; | |
168 } | |
169 uart_data->dtx->esd_pos-= temp_desc->len; | |
170 } | |
171 else | |
172 { | |
173 /* | |
174 * just line states has been changed | |
175 */ | |
176 dti_data_ind->desc_list2.first = (ULONG)NULL; | |
177 dti_data_ind->desc_list2.list_len = 0; | |
178 } | |
179 | |
180 /* | |
181 * set line states and | |
182 * mark line states as unchanged; | |
183 */ | |
184 #ifdef DTI2 | |
185 dti_data_ind->parameters.st_lines.st_flow = uart_data->dtx->st_flow; | |
186 dti_data_ind->parameters.st_lines.st_line_sa = uart_data->dtx->st_line_sa; | |
187 dti_data_ind->parameters.st_lines.st_line_sb = uart_data->dtx->st_line_sb; | |
188 dti_data_ind->parameters.st_lines.st_line_sb = uart_data->dtx->st_line_sb; | |
189 dti_data_ind->parameters.st_lines.st_break_len = uart_data->dtx->st_break_len; | |
190 #else /* DTI2 */ | |
191 dti_data_ind->st_flow = uart_data->dtx->st_flow; | |
192 dti_data_ind->st_line_sa = uart_data->dtx->st_line_sa; | |
193 dti_data_ind->st_line_sb = uart_data->dtx->st_line_sb; | |
194 dti_data_ind->st_line_sb = uart_data->dtx->st_line_sb; | |
195 dti_data_ind->st_escape = uart_data->dtx->st_escape; | |
196 dti_data_ind->tui = uart_data->tui_uart; | |
197 #endif /* DTI2 */ | |
198 uart_data->dtx->lines_changed = FALSE; | |
199 uart_data->dtx->st_break_len = DTI_BREAK_OFF; | |
200 | |
201 #ifdef _SIMULATION_ | |
202 #ifndef DTI2 | |
203 dti_data_ind->op_ack = OP_UNACK; | |
204 #endif /* !DTI2 */ | |
205 #else /* _SIMULATION_ */ | |
206 #ifdef FLOW_TRACE | |
207 sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_UP, FLOW_TRACE_TOP, FALSE); | |
208 #endif /* FLOW_TRACE */ | |
209 #endif /* _SIMULATION_ */ | |
210 dti_send_data( | |
211 uart_hDTI, | |
212 uart_data->device, | |
213 UART_DTI_UP_INTERFACE, | |
214 uart_data->dtx->dlc_instance, | |
215 dti_data_ind | |
216 ); | |
217 } | |
218 else | |
219 { | |
220 /* | |
221 * no data to send | |
222 */ | |
223 SET_STATE( UART_SERVICE_DTX, DTX_READY ); | |
224 } | |
225 sig_dtx_rx_ready_to_receive_req( uart_data->dtx->dlc_instance, | |
226 uart_data->dtx->to_send_data, | |
227 uart_data->dtx->write_pos, | |
228 uart_data->dtx->cur_desc_size ); | |
229 } | |
230 else | |
231 { | |
232 /* | |
233 * DTX service is currently receiving, | |
234 * data will be forwarded to upper layer when | |
235 * sig_rx_dtx_data_received_ind() is called | |
236 */ | |
237 SET_STATE( UART_SERVICE_DTX, DTX_READY ); | |
238 } | |
239 break; | |
240 | |
241 default: | |
242 TRACE_FUNCTION( "DTI_GETDATA_REQ unexpected" ); | |
243 break; | |
244 } | |
245 } /* sig_dti_dtx_tx_buffer_ready_ind() */ | |
246 | |
247 | |
248 /* | |
249 +------------------------------------------------------------------------------ | |
250 | Function : sig_dti_dtx_tx_buffer_full_ind | |
251 +------------------------------------------------------------------------------ | |
252 | Description : Handles the DTILIB callback call DTI_REASON_TX_BUFFER_FULL | |
253 | Since no send queue is used, this function does not have | |
254 | any functionality by now | |
255 | | |
256 | This signal means that data may not be sent over a dti connection. | |
257 | | |
258 | Parameters : - | |
259 | | |
260 +------------------------------------------------------------------------------ | |
261 */ | |
262 | |
263 GLOBAL void sig_dti_dtx_tx_buffer_full_ind() | |
264 { | |
265 TRACE_FUNCTION( "sig_dti_dtx_tx_buffer_full_ind" ); | |
266 } /* sig_dti_dtx_tx_buffer_full_ind() */ | |
267 | |
268 #else /* DTILIB */ | |
269 /* | |
270 +------------------------------------------------------------------------------ | |
271 | Function : dtx_dti_getdata_req | |
272 +------------------------------------------------------------------------------ | |
273 | Description : Handles the primitive DTI_GETDATA_REQ | |
274 | | |
275 | Parameters : *dti_getdata_req - Ptr to primitive payload | |
276 | | |
277 +------------------------------------------------------------------------------ | |
278 * | |
279 * when using DTILIB, the functionality of dtx_dti_getdata_req() is to be found | |
280 * in sig_dti_dtx_tx_buffer_ready_ind(). When debugging, please have a look at | |
281 * both versions!! | |
282 */ | |
283 GLOBAL void dtx_dti_getdata_req ( T_DTI_GETDATA_REQ *dti_getdata_req ) | |
284 { | |
285 USHORT old_write_pos; | |
286 T_DATA_FLOW_STATE old_data_flow; | |
287 T_desc2* temp_desc; | |
288 | |
289 TRACE_FUNCTION( "dtx_dti_getdata_req" ); | |
290 | |
291 #ifdef FLOW_TRACE | |
292 sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_UP, FLOW_TRACE_TOP, TRUE); | |
293 #endif /* FLOW_TRACE */ | |
294 | |
295 #ifdef UART_RANGE_CHECK | |
296 if(dti_getdata_req EQ NULL) | |
297 { | |
298 TRACE_EVENT("ERROR: dti_getdata_req is NULL"); | |
299 } | |
300 else if((*((ULONG*)((UBYTE*)dti_getdata_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
301 { | |
302 TRACE_EVENT_P1("ERROR: dti_getdata_req=%08x is not allocated", | |
303 dti_getdata_req); | |
304 } | |
305 #endif /* UART_RANGE_CHECK */ | |
306 | |
307 if( pei_select_instances( dti_getdata_req->c_id ) EQ TRUE ) | |
308 { | |
309 switch( GET_STATE( UART_SERVICE_DTX ) ) | |
310 { | |
311 case DTX_NOT_READY: | |
312 old_data_flow = uart_data->dtx->data_flow; | |
313 old_write_pos = uart_data->dtx->write_pos; | |
314 /* | |
315 * enable data flow if necessary | |
316 */ | |
317 if(uart_data->dtx->data_flow NEQ UART_FLOW_ENABLED) | |
318 { | |
319 uart_data->dtx->data_flow = UART_FLOW_ENABLED; | |
320 sig_dtx_ker_enable_ind(uart_data->dtx->dlc_instance); | |
321 } | |
322 | |
323 if(uart_data->dtx->receiving_state EQ UART_DTX_NOT_RECEIVING) | |
324 { | |
325 /* | |
326 * if data to send available or | |
327 * line states changed | |
328 */ | |
329 if((uart_data->dtx->to_send_data->len) || | |
330 (uart_data->dtx->lines_changed)) | |
331 { | |
332 PALLOC_DESC2 (dti_data_ind, DTI_DATA_IND); | |
333 SET_STATE( UART_SERVICE_DTX, DTX_NOT_READY ); | |
334 | |
335 if(uart_data->dtx->to_send_data->len) | |
336 { | |
337 /* | |
338 * mark entity descriptor as invalid, since data will be forwarded | |
339 */ | |
340 temp_desc = uart_data->dtx->to_send_data; | |
341 uart_data->dtx->to_send_data = NULL; | |
342 | |
343 dti_data_ind->desc_list2.first = (ULONG)temp_desc; | |
344 dti_data_ind->desc_list2.list_len = temp_desc->len; | |
345 | |
346 /* | |
347 * calculate new size multiplier according to fillrate of buffer | |
348 */ | |
349 dtx_calculate_size_multiplier (temp_desc, old_data_flow); | |
350 /* | |
351 * allocate a new descriptor with size according to new size_multiplier | |
352 */ | |
353 dtx_allocate_resources(); | |
354 /* | |
355 * Check for data which has not yet been validated, i.e. because | |
356 * the frame containing the data has not yet been received completely. | |
357 * In this case, the not yet validated data is copied to the newly | |
358 * allocated descriptor. | |
359 */ | |
360 if(old_write_pos > temp_desc->len) | |
361 { | |
362 memcpy(uart_data->dtx->to_send_data->buffer, | |
363 &temp_desc->buffer[temp_desc->len], | |
364 old_write_pos - temp_desc->len); | |
365 uart_data->dtx->write_pos = old_write_pos - temp_desc->len; | |
366 } | |
367 uart_data->dtx->esd_pos-= temp_desc->len; | |
368 } | |
369 else | |
370 { | |
371 /* | |
372 * just line states has been changed | |
373 */ | |
374 dti_data_ind->desc_list2.first = (ULONG)NULL; | |
375 dti_data_ind->desc_list2.list_len = 0; | |
376 } | |
377 | |
378 /* | |
379 * set line states and | |
380 * mark line states as unchanged; | |
381 */ | |
382 dti_data_ind->st_flow = uart_data->dtx->st_flow; | |
383 dti_data_ind->st_line_sa = uart_data->dtx->st_line_sa; | |
384 dti_data_ind->st_line_sb = uart_data->dtx->st_line_sb; | |
385 dti_data_ind->st_line_sb = uart_data->dtx->st_line_sb; | |
386 dti_data_ind->st_escape = uart_data->dtx->st_escape; | |
387 uart_data->dtx->lines_changed = FALSE; | |
388 uart_data->dtx->st_escape = DTI_ESC_OFF; | |
389 | |
390 dti_data_ind->tui = uart_data->tui_uart; | |
391 dti_data_ind->c_id = dtx_get_channel_id(); | |
392 #ifdef _SIMULATION_ | |
393 dti_data_ind->op_ack = OP_UNACK; | |
394 | |
395 dtx_psend_dti_data_test_ind(dti_data_ind); | |
396 #else /* _SIMULATION_ */ | |
397 #ifdef FLOW_TRACE | |
398 sndcp_trace_flow_control(FLOW_TRACE_UART, FLOW_TRACE_UP, FLOW_TRACE_TOP, FALSE); | |
399 #endif /* FLOW_TRACE */ | |
400 PSEND (uart_data->dtx->hComm_DTX_UPLINK, dti_data_ind); | |
401 #endif /* _SIMULATION_ */ | |
402 } | |
403 else | |
404 { | |
405 /* | |
406 * no data to send | |
407 */ | |
408 SET_STATE( UART_SERVICE_DTX, DTX_READY ); | |
409 } | |
410 sig_dtx_rx_ready_to_receive_req( uart_data->dtx->dlc_instance, | |
411 uart_data->dtx->to_send_data, | |
412 uart_data->dtx->write_pos, | |
413 uart_data->dtx->cur_desc_size ); | |
414 } | |
415 else | |
416 { | |
417 /* | |
418 * DTX service is currently receiving, | |
419 * data will be forwarded to upper layer when | |
420 * sig_rx_dtx_data_received_ind() is called | |
421 */ | |
422 SET_STATE( UART_SERVICE_DTX, DTX_READY ); | |
423 } | |
424 break; | |
425 | |
426 default: | |
427 TRACE_FUNCTION( "DTI_GETDATA_REQ unexpected" ); | |
428 break; | |
429 } | |
430 } | |
431 PFREE( dti_getdata_req ); | |
432 } /* dtx_dti_getdata_req() */ | |
433 #endif /* DTILIB */ | |
434 | |
435 | |
436 #if defined ( _SIMULATION_ ) | |
437 #ifndef DTILIB | |
438 /* | |
439 +------------------------------------------------------------------------------ | |
440 | Function : dtx_psend_dti_data_test_ind | |
441 +------------------------------------------------------------------------------ | |
442 | Description : Copies the content of the given DTI DATA IND primitive to a new | |
443 | DTI_DATA_TEST_IND primitive, sends the primitive | |
444 | DTI_DATA_TEST_IND to hCommUPLINK and frees the original | |
445 | DTI_DATA_IND primitive. | |
446 | Note: function is only needed in case of simulation target | |
447 | | |
448 | Parameters : *dti_data_ind - Ptr to primitive payload | |
449 | | |
450 +------------------------------------------------------------------------------ | |
451 */ | |
452 GLOBAL void dtx_psend_dti_data_test_ind ( T_DTI_DATA_IND *dti_data_ind ) | |
453 { | |
454 T_desc2* temp_desc; | |
455 USHORT packet_len; | |
456 USHORT pos; | |
457 char buf[100]; | |
458 USHORT i; | |
459 | |
460 TRACE_FUNCTION( "dtx_psend_dti_data_test_ind" ); | |
461 | |
462 /* | |
463 * create new primitive and copy all parameters into new primitive | |
464 */ | |
465 packet_len = dti_data_ind->desc_list2.list_len; | |
466 { | |
467 PALLOC_SDU (dti_data_test_ind, | |
468 DTI_DATA_TEST_IND, | |
469 (USHORT)(packet_len << 3)); | |
470 dti_data_test_ind->tui = dti_data_ind->tui; | |
471 dti_data_test_ind->c_id = dti_data_ind->c_id; | |
472 dti_data_test_ind->p_id = dti_data_ind->p_id; | |
473 dti_data_test_ind->op_ack = dti_data_ind->op_ack; | |
474 dti_data_test_ind->st_flow = dti_data_ind->st_flow; | |
475 dti_data_test_ind->st_line_sa = dti_data_ind->st_line_sa; | |
476 dti_data_test_ind->st_line_sb = dti_data_ind->st_line_sb; | |
477 dti_data_test_ind->st_escape = dti_data_ind->st_escape; | |
478 /* | |
479 * copy generic data descriptor in sdu | |
480 */ | |
481 temp_desc = (T_desc2*)dti_data_ind->desc_list2.first; | |
482 dti_data_test_ind->sdu.o_buf = 0; | |
483 dti_data_test_ind->sdu.l_buf = (packet_len << 3); | |
484 pos = 0; | |
485 while(temp_desc) | |
486 { | |
487 memcpy(&dti_data_test_ind->sdu.buf[pos], | |
488 temp_desc->buffer, | |
489 temp_desc->len); | |
490 pos += temp_desc->len; | |
491 temp_desc = (T_desc2*)temp_desc->next; | |
492 } | |
493 /* | |
494 * trace output | |
495 */ | |
496 i = 0; | |
497 pos = 0; | |
498 while(pos < packet_len) | |
499 { | |
500 i+= sprintf(&buf[i], "0x%02x, ", dti_data_test_ind->sdu.buf[pos]); | |
501 pos++; | |
502 if(i > 80) | |
503 { | |
504 TRACE_FUNCTION( buf ); | |
505 i = 0; | |
506 } | |
507 else if(pos >= packet_len) | |
508 { | |
509 TRACE_FUNCTION( buf ); | |
510 } | |
511 } | |
512 /* | |
513 * send primitive | |
514 */ | |
515 PSEND (uart_data->dtx->hComm_DTX_UPLINK, dti_data_test_ind); | |
516 } | |
517 /* | |
518 * free the primitive | |
519 */ | |
520 PFREE_DESC(dti_data_ind); | |
521 } /* dtx_psend_dti_data_test_ind() */ | |
522 #endif /* !DTILIB */ | |
523 #endif /* _SIMULATION_ */ | |
524 |