comparison src/g23m-aci/uart/uart_pei.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
comparison
equal deleted inserted replaced
161:4557e2a9c18e 162:53929b40109c
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 module implements the process body interface
18 | for the entity Universal Asynchronous Receiver Transmitter(UART)
19 |
20 | Exported functions:
21 |
22 | pei_create - Create the Protocol Stack Entity
23 | pei_init - Initialize Protocol Stack Entity
24 | pei_primitive - Process Primitive
25 | pei_timeout - Process Timeout
26 | pei_exit - Close resources and terminate
27 | pei_run - Process Primitive
28 | pei_config - Dynamic Configuration
29 | pei_monitor - Monitoring of physical Parameters
30 +-----------------------------------------------------------------------------
31 */
32
33 #define UART_PEI_C
34
35 #define ENTITY_UART
36
37 /*==== INCLUDES =============================================================*/
38
39 #ifdef _SIMULATION_
40 #include <stdio.h>
41 #endif /* _SIMULATION_ */
42 #ifdef WIN32
43 #include "nucleus.h"
44 #endif /* WIN32 */
45 #include "typedefs.h" /* to get Condat data types */
46 #include "vsi.h" /* to get a lot of macros */
47 #include "macdef.h" /* to get a lot of macros */
48 #include "custom.h"
49 #include "gsm.h" /* to get a lot of macros */
50 #include "cnf_uart.h" /* to get cnf-definitions */
51 #include "mon_uart.h" /* to get mon-definitions */
52 #include "prim.h" /* to get the definitions of used SAP and directions */
53 #ifdef DTILIB
54 #ifdef _SIMULATION_
55 /* #define UART_DTI_CONFIG -- presently not needed -- */
56 #include "tok.h" /* string management for pei_config() */
57 #endif /* _SIMULATION_ */
58 #include "dti.h" /* to get dti lib */
59 #endif /* DTILIB */
60 #include "pei.h" /* to get PEI interface */
61 #ifdef FF_MULTI_PORT
62 #include "gsi.h" /* to get definitions of serial driver */
63 #else /* FF_MULTI_PORT */
64 #ifdef _TARGET_
65 #include "uart/serialswitch.h"
66 #include "uart/traceswitch.h"
67 #else /* _TARGET_ */
68 #include "serial_dat.h" /* to get definitions of serial driver */
69 #endif /* _TARGET_ */
70 #endif /* FF_MULTI_PORT */
71 #include "uart.h" /* to get the global entity definitions */
72
73 #include "uart_kerf.h" /* to get ker functions */
74 #include "uart_kerp.h" /* to get ker primitives */
75 #include "uart_kers.h" /* to get ker signals */
76
77 #ifndef FF_MULTI_PORT
78 #include "uart_rxf.h" /* to get rx functions */
79 #include "uart_rxp.h" /* to get rx primitives */
80 #include "uart_rxs.h" /* to get rx signals */
81
82 #include "uart_txf.h" /* to get tx functions */
83 #include "uart_txp.h" /* to get tx primitives */
84 #include "uart_txs.h" /* to get tx signals */
85 #else
86 #include "uart_prxf.h" /* to get rx functions */
87 #include "uart_prxp.h" /* to get rx primitives */
88 #include "uart_prxs.h" /* to get rx signals */
89
90 #include "uart_ptxf.h" /* to get tx functions */
91 #include "uart_ptxp.h" /* to get tx primitives */
92 #include "uart_ptxs.h" /* to get tx signals */
93 #endif /* FF_MULTI_PORT */
94
95 #include "uart_drxf.h" /* to get drx functions */
96 #include "uart_drxp.h" /* to get drx primitives */
97 #include "uart_drxs.h" /* to get drx signals */
98
99 #include "uart_dtxf.h" /* to get dtx functions */
100 #include "uart_dtxp.h" /* to get dtx primitives */
101 #include "uart_dtxs.h" /* to get dtx signals */
102
103 #include "uart_rtf.h" /* to get dtx functions */
104 #include "uart_rtp.h" /* to get dtx primitives */
105 #include "uart_rts.h" /* to get dtx signals */
106
107
108 /*==== DEFINITIONS ==========================================================*/
109
110 /*
111 * Prototypes for DTILIB wrap functions
112 */
113 LOCAL void pei_dti_dti_connect_req (T_DTI2_CONNECT_REQ* dti_connect_req);
114 LOCAL void pei_dti_dti_connect_res (T_DTI2_CONNECT_RES* dti_connect_res);
115 LOCAL void pei_dti_dti_disconnect_req (T_DTI2_DISCONNECT_REQ*
116 dti_disconnect_req);
117 LOCAL void pei_dti_dti_getdata_req (T_DTI2_GETDATA_REQ* dti_getdata_req);
118 LOCAL void pei_dti_dti_data_req (T_DTI2_DATA_REQ* dti_data_req);
119 LOCAL void pei_dti_dti_connect_ind (T_DTI2_CONNECT_IND* dti_connect_ind);
120 LOCAL void pei_dti_dti_connect_cnf (T_DTI2_CONNECT_CNF* dti_connect_cnf);
121 LOCAL void pei_dti_dti_disconnect_ind (T_DTI2_DISCONNECT_IND*
122 dti_disconnect_ind);
123 LOCAL void pei_sig_callback(U8 instance,
124 U8 interfac,
125 U8 channel,
126 U8 reason,
127 T_DTI2_DATA_IND *dti_data2_ind);
128 #ifdef _SIMULATION_
129 LOCAL void pei_dti_dti_data_test_req (T_DTI2_DATA_TEST_REQ* dti_data_test_req);
130 LOCAL void pei_dti_dti_ready_ind (T_DTI2_READY_IND* dti_ready_ind);
131 LOCAL void pei_dti_dti_data_ind (T_DTI2_DATA_IND* dti_data_ind);
132 #endif /* _SIMULATION_ */
133
134 /*==== TYPES ================================================================*/
135
136 /*
137 * global table which maps a timer index to an UART instancen and timer number
138 */
139 typedef struct /* T_UART_TIMER_TABLE */
140 {
141 T_UART_DATA* uart_data; /* pointer to UART data of the instance */
142 UBYTE timer_number; /* number of timer within the instance */
143 } T_UART_TIMER_TABLE;
144
145 /*==== GLOBAL VARS ==========================================================*/
146
147 /*
148 * global table which maps a timer index to an UART instancen and timer number
149 */
150 T_UART_TIMER_TABLE uart_timer_table[ UART_TIMER_MAX ];
151
152 #ifdef DTILIB
153 DTI_HANDLE uart_hDTI = D_NO_DATA_BASE;
154 #endif /* DTILIB */
155 #ifdef UART_DTI_CONFIG
156 ULONG drv_link_id = -1;
157 #endif /* UART_DTI_CONFIG */
158 /*==== LOCAL VARS ===========================================================*/
159
160 static BOOL first_access = TRUE;
161 static T_MONITOR uart_mon;
162
163 /*
164 * Jumptables to primitive handler functions. One table per SAP.
165 *
166 * Use MAK_FUNC_0 for primitives which contains no SDU.
167 * Use MAK_FUNC_S for primitives which contains a SDU.
168 */
169
170 /*
171 * Function is needed for developing. This declaration can be removed
172 * as soon as this function is no more called (i.e. all primitives are
173 * handled).
174 */
175 LOCAL void primitive_not_supported (void *data);
176
177 /*qqq hier reinkommende, mit SAP vergleichen, S: mit sdu*/
178 static const T_FUNC uart_table[] =
179 {
180 MAK_FUNC_0(ker_uart_parameters_req, UART_PARAMETERS_REQ), /* 0x7400 */
181 MAK_FUNC_0(ker_uart_dti_req, UART_DTI_REQ), /* 0x7401 */
182 MAK_FUNC_0(ker_uart_disable_req, UART_DISABLE_REQ), /* 0x7402 */
183 MAK_FUNC_0(ker_uart_ring_req, UART_RING_REQ), /* 0x7403 */
184 MAK_FUNC_0(ker_uart_dcd_req, UART_DCD_REQ), /* 0x7404 */
185 MAK_FUNC_0(ker_uart_escape_req, UART_ESCAPE_REQ), /* 0x7405 */
186 MAK_FUNC_0(ker_uart_mux_start_req, UART_MUX_START_REQ), /* 0x7406 */
187 MAK_FUNC_0(ker_uart_mux_dlc_establish_res,
188 UART_MUX_DLC_ESTABLISH_RES), /* 0x7408 */
189 MAK_FUNC_0(ker_uart_mux_dlc_release_req,UART_MUX_DLC_RELEASE_REQ),/* 0x7409 */
190 MAK_FUNC_0(ker_uart_mux_sleep_req, UART_MUX_SLEEP_REQ), /* 0x740a */
191 MAK_FUNC_0(ker_uart_mux_wakeup_req, UART_MUX_WAKEUP_REQ), /* 0x740b */
192 MAK_FUNC_0(ker_uart_mux_close_req, UART_MUX_CLOSE_REQ), /* 0x740c */
193 /*
194 UART_DRIVER_SENT_IND 0x740d
195 UART_DRIVER_RECEIVED_IND 0x740e
196 UART_DRIVER_FLUSHED_IND 0x740f
197 */
198 };
199
200 /*
201 * Jumptable for the DTI service access point for uplink data transmission.
202 * Contains the processing-function addresses and opcodes of
203 * request and response primitives. Use of DTILIB can be selected.
204 *
205 */
206 static const T_FUNC dti_dti_ul_table[] = {
207 MAK_FUNC_0( pei_dti_dti_connect_req , DTI2_CONNECT_REQ ),
208 MAK_FUNC_0( pei_dti_dti_connect_res , DTI2_CONNECT_RES ),
209 MAK_FUNC_0( pei_dti_dti_disconnect_req, DTI2_DISCONNECT_REQ),
210 MAK_FUNC_0( pei_dti_dti_getdata_req , DTI2_GETDATA_REQ ),
211 MAK_FUNC_0( pei_dti_dti_data_req , DTI2_DATA_REQ ),
212 #if defined (_SIMULATION_)
213 MAK_FUNC_S( pei_dti_dti_data_test_req , DTI2_DATA_TEST_REQ )
214 #else /* _SIMULATION_ */
215 MAK_FUNC_S( primitive_not_supported , DTI2_DATA_TEST_REQ )
216 #endif /* _SIMULATION_ */
217 };
218 #if defined (DTILIB) && defined (_SIMULATION_)
219 static const T_FUNC dti_dti_dl_table[] = {
220 MAK_FUNC_0( pei_dti_dti_connect_ind , DTI2_CONNECT_IND ),
221 MAK_FUNC_0( pei_dti_dti_connect_cnf , DTI2_CONNECT_CNF ),
222 MAK_FUNC_0( pei_dti_dti_disconnect_ind , DTI2_DISCONNECT_IND),
223 MAK_FUNC_0( tx_dti_ready_ind , DTI2_READY_IND ),
224 MAK_FUNC_0( primitive_not_supported , DTI2_DATA_IND ),
225 MAK_FUNC_S( rx_dti_data_test_ind , DTI2_DATA_TEST_IND ),
226 MAK_FUNC_0( pei_dti_dti_ready_ind , DTI2_READY_IND ),
227 MAK_FUNC_0( pei_dti_dti_data_ind , DTI2_DATA_IND ),
228 MAK_FUNC_S( primitive_not_supported , DTI2_DATA_TEST_IND )
229 };
230 #endif /*defined (DTILIB) && defined (_SIMULATION_)*/
231
232 /*==== DIAGNOSTICS ==========================================================*/
233 #ifdef _DEBUG
234 #endif /* _DEBUG */
235
236 /*==== END DIAGNOSTICS ======================================================*/
237
238 /*==== PRIVATE FUNCTIONS ====================================================*/
239
240 /*
241 +------------------------------------------------------------------------------
242 | Function : primitive_not_supported
243 +------------------------------------------------------------------------------
244 | Description : This function handles unsupported primitives.
245 |
246 | Parameters : -
247 |
248 | Return : -
249 |
250 +------------------------------------------------------------------------------
251 */
252 LOCAL void primitive_not_supported (void *data)
253 {
254 TRACE_FUNCTION ("primitive_not_supported");
255
256 PFREE (data);
257 }
258
259
260 /*==== PUBLIC FUNCTIONS =====================================================*/
261
262 /* qqq hier malen
263 +------------------------------------------------------------------------------
264 | Function : pei_primitive
265 +------------------------------------------------------------------------------
266 | Description : This function is called by the frame when a primitive
267 | is received and needs to be processed.
268 |
269 | | |
270 | ACI DTI UPLINK
271 | | |
272 | +--------v--------v--------+
273 | | |
274 | | UART |
275 | | |
276 | +--------------------------+
277 |
278 |
279 | Parameters : prim - Pointer to the received primitive
280 |
281 | Return : PEI_OK - function succeeded
282 | PEI_ERROR - function failed
283 |
284 +------------------------------------------------------------------------------
285 */
286
287 /*qqq hier kucken*/
288 LOCAL SHORT pei_primitive (void * primptr)
289 {
290 TRACE_FUNCTION ("pei_primitive");
291
292 if (primptr NEQ NULL)
293 {
294 T_PRIM* prim = (T_PRIM*)primptr;
295 USHORT opc = (USHORT)prim->custom.opc;
296 USHORT n;
297 const T_FUNC *table;
298
299 /*
300 * This must be called for Partition Pool supervision. Will be replaced
301 * by another macro some time.
302 */
303 VSI_PPM_REC (&prim->custom, __FILE__, __LINE__);
304 PTRACE_IN (opc);
305
306 switch (opc & OPC_MASK)
307 {
308 case UART_DL:
309 table = uart_table;
310 n = TAB_SIZE (uart_table);
311 break;
312 case DTI2_UL:
313 #ifdef DTILIB
314 table = dti_dti_ul_table;
315 n = TAB_SIZE (dti_dti_ul_table);
316 #ifdef DTI2
317 /*
318 * to be able to distinguish DTI1/DTI2 opcodes,
319 * the ones for DTI2 start at 0x50
320 */
321 opc -= 0x50;
322 #endif /* DTI2*/
323 #else /* DTILIB */
324 table = dti_ul_table;
325 n = TAB_SIZE (dti_ul_table);
326 #endif /* DTILIB */
327 break;
328 #ifdef _SIMULATION_
329 case DTI2_DL:
330 #ifdef DTILIB
331 table = dti_dti_dl_table;
332 n = TAB_SIZE (dti_dti_dl_table);
333 #ifdef DTI2
334 /*
335 * to be able to distinguish DTI1/DTI2 opcodes,
336 * the ones for DTI2 start at 0x50
337 */
338 opc -= 0x50;
339 #endif /* DTI2*/
340 #else /* DTILIB */
341 table = dti_dl_table;
342 n = TAB_SIZE (dti_dl_table);
343 #endif /* DTILIB */
344 break;
345 #endif /* _SIMULATION_ */
346 default:
347 table = NULL;
348 n = 0;
349 break;
350 }
351
352 if (table != NULL)
353 {
354 if ((opc & PRM_MASK) < n)
355 {
356 table += opc & PRM_MASK;
357 #ifdef PALLOC_TRANSITION
358 P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data)
359 + table->soff) : 0;
360 #ifndef NO_COPY_ROUTING
361 P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER);
362 #endif /* NO_COPY_ROUTING */
363 #endif /* PALLOC_TRANSITION */
364 JUMP (table->func) (P2D(prim));
365 }
366 else
367 {
368 primitive_not_supported (P2D(prim));
369 }
370 return PEI_OK;
371 }
372
373 /*
374 * primitive is not a GSM primitive - forward it to the environment
375 */
376 if (opc & SYS_MASK)
377 {
378 if(vsi_c_primitive (VSI_CALLER prim) NEQ VSI_OK)
379 {
380 TRACE_ERROR_P1("VSI entity: Can't forward a primitive, uart_pei.c(%d)",
381 __LINE__);
382 }
383 }
384 else
385 {
386 PFREE (P2D(prim));
387 return PEI_ERROR;
388 }
389 }
390 return PEI_OK;
391 }
392
393
394
395 #ifdef FF_MULTI_PORT
396 /*
397 +------------------------------------------------------------------------------
398 | Function : pei_uart_driver_signal
399 +------------------------------------------------------------------------------
400 | Description : The function pei_uart_driver_signal() is the callback function
401 | of the UART driver to indicate events of the driver. This
402 | function is called in interrupt context. It converts the given
403 | opcode to a signal.
404 |
405 | Parameters : usartNo - affected UART port
406 | opcode - opcode of the event
407 |
408 +------------------------------------------------------------------------------
409 */
410 GLOBAL void pei_uart_driver_signal (T_DRV_SIGNAL *SigPtr)
411 {
412 T_UART_DATA* uart_device;
413
414 TRACE_FUNCTION( "pei_uart_driver_signal" );
415
416 /*
417 * set UART instance
418 */
419 uart_device = &uart_data_base[SigPtr->DrvHandle];
420 /*
421 * activate signal
422 */
423 switch (SigPtr->SignalType)
424 {
425 case DRV_SIGTYPE_READ:
426 PSIGNAL(hCommUART, UART_DRIVER_RECEIVED_IND, uart_device);
427 break;
428
429 case DRV_SIGTYPE_WRITE:
430 PSIGNAL(hCommUART, UART_DRIVER_SENT_IND, uart_device);
431 break;
432
433 case DRV_SIGTYPE_FLUSH:
434 PSIGNAL(hCommUART, UART_DRIVER_FLUSHED_IND, uart_device);
435 break;
436
437 default:
438 TRACE_ERROR( "pei_uart_driver_signal: unknown signal" );
439 break;
440 }
441 } /* pei_uart_driver_signal() */
442 #endif /* FF_MULTI_PORT */
443
444
445
446 /*
447 +------------------------------------------------------------------------------
448 | Function : pei_init
449 +------------------------------------------------------------------------------
450 | Description : This function is called by the frame. It is used to
451 | initialise the entitiy.
452 |
453 | Parameters : handle - task handle
454 |
455 | Return : PEI_OK - entity initialised
456 | PEI_ERROR - entity not (yet) initialised
457 |
458 +------------------------------------------------------------------------------
459 */
460
461 /*qqq hier Kommunikationskanaele eintragen*/
462 LOCAL SHORT pei_init (T_HANDLE handle)
463 {
464 USHORT i;
465 UBYTE instance;
466
467 /*
468 * Initialize task handle
469 */
470 UART_handle = handle;
471
472 TRACE_FUNCTION ("pei_init");
473 /*
474 * Open communication channel
475 */
476 if (hCommMMI < VSI_OK)
477 {
478 if ((hCommMMI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK)
479 return PEI_ERROR;
480 }
481
482 if (hCommUART < VSI_OK)
483 {
484 if ((hCommUART = vsi_c_open (VSI_CALLER UART_NAME)) < VSI_OK)
485 return PEI_ERROR;
486 }
487
488 #ifdef DTILIB
489 /*
490 * initialize dtilib for this entity
491 */
492 uart_hDTI = dti_init (UART_INSTANCES * UART_MAX_NUMBER_OF_CHANNELS,
493 handle,
494 DTI_DEFAULT_OPTIONS,
495 pei_sig_callback);
496 if(!uart_hDTI)
497 return PEI_ERROR;
498
499 #else /* DTILIB */
500 /*
501 * Initialize table with channel ids
502 */
503 for( i = 0; i < (UART_INSTANCES * UART_MAX_NUMBER_OF_CHANNELS); i++)
504 {
505 uart_cid_table[i].c_id = 0;
506 uart_cid_table[i].uart_data = NULL;
507 uart_cid_table[i].dtx = NULL;
508 uart_cid_table[i].drx = NULL;
509 }
510 #endif /* DTILIB */
511
512 /*
513 * send parameters primitive
514 */
515 {
516 PALLOC (uart_parameters_ind, UART_PARAMETERS_IND);
517 uart_parameters_ind->uart_instances = UART_INSTANCES;
518 PSEND (hCommMMI, uart_parameters_ind);
519 }
520
521 /*
522 * Initialize timer table
523 */
524 for( i = 0; i < UART_TIMER_MAX; i++)
525 {
526 uart_timer_table[i].uart_data = &(uart_data_base
527 [(UBYTE)(i /
528 UART_TIMER_PER_INSTANCE)]);
529 uart_timer_table[i].timer_number = (UBYTE)(i % UART_TIMER_PER_INSTANCE);
530 }
531
532 for( instance = 0; instance < UART_INSTANCES; instance++ )
533 {
534 /*
535 * Initialize global pointer uart_data. This is required to access all
536 * entity data.
537 */
538 uart_data = &(uart_data_base[instance]);
539
540 /*
541 * Initialize DLC table
542 */
543 for( i = 0; i <= UART_MAX_NUMBER_OF_CHANNELS; i++)
544 {
545 uart_data->dlc_table[i].dlci = UART_DLCI_INVALID;
546 uart_data->dlc_table[i].priority = 0;
547 #ifdef DTILIB
548 uart_data->dlc_table[i].dti_state = DTI_CLOSED;
549 #else /* DTILIB */
550 uart_data->dlc_table[i].hCommUPLINK = VSI_ERROR;
551 #endif /* DTILIB */
552 uart_data->dlc_table[i].connection_state = UART_CONNECTION_DEAD;
553 if(i EQ UART_CONTROL_INSTANCE)
554 {
555 uart_data->dlc_table[i].drx = &uart_data->drx_base[0];
556 uart_data->dlc_table[i].dtx = &uart_data->dtx_base[0];
557 }
558 else
559 {
560 uart_data->dlc_table[i].drx = &uart_data->drx_base[i];
561 uart_data->dlc_table[i].dtx = &uart_data->dtx_base[i];
562 }
563
564 uart_data->dlc_table[i].transmit_data = NULL;
565 uart_data->dlc_table[i].transmit_pos = 0;
566 uart_data->dlc_table[i].p_counter = 0;
567
568 uart_data->dlc_table[i].receive_data = NULL;
569 uart_data->dlc_table[i].receive_pos = 0;
570 uart_data->dlc_table[i].receive_size = 0;
571 uart_data->dlc_table[i].receive_process = UART_RX_PROCESS_STOP;
572
573 uart_data->dlc_table[i].last_command = NULL;
574 uart_data->dlc_table[i].next_command = NULL;
575 uart_data->dlc_table[i].retransmissions = 0;
576 uart_data->dlc_table[i].lines = 0;
577 uart_data->dlc_table[i].service = 0;
578 uart_data->dlc_table[i].codec = 0;
579 uart_data->dlc_table[i].received_prim = 0;
580 uart_data->dlc_table[i].flushed = TRUE;
581 }
582
583 /*
584 * Initialize DLCI instance table
585 */
586 for( i = 0; i < 64; i++ )
587 {
588 uart_data->dlc_instance[i] = UART_EMPTY_INSTANCE;
589 }
590
591 /*
592 * timer values for this instance
593 */
594 uart_data->timer_t1_index = (USHORT)(instance * UART_TIMER_PER_INSTANCE)
595 + UART_RT_INDEX_T1;
596 uart_data->timer_t2_index = (USHORT)(instance * UART_TIMER_PER_INSTANCE)
597 + UART_RT_INDEX_T2;
598 uart_data->timer_t3_index = (USHORT)(instance * UART_TIMER_PER_INSTANCE)
599 + UART_RT_INDEX_T3;
600 uart_data->timer_tesd_index = (USHORT)(instance * UART_TIMER_PER_INSTANCE)
601 + UART_RT_INDEX_TESD;
602 /*
603 * set device for this instance
604 */
605 uart_data->device = instance;
606 uart_data->fcstab = uart_fcstable_base;
607
608 /*
609 * set device specific values
610 */
611 uart_data->xon = UART_IO_XON_DEFAULT;
612 uart_data->xoff = UART_IO_XOFF_DEFAULT;
613 uart_data->n1 = UART_N1_READY_MODE;
614 /*
615 * set initial DTX/DRX services
616 */
617 uart_data->dtx = &(uart_data->dtx_base[0]);
618 uart_data->drx = &(uart_data->drx_base[0]);
619 /*
620 * escape sequence detection
621 */
622 uart_data->act_ec = 0x2b; /* Escape Character '+' */
623 uart_data->act_gp = 1000; /* Guard Period */
624 }
625
626 /*
627 * qqq Initialize entity data (call init function of every service)
628 * the order of function calls is important
629 */
630 for( i = 0; i < UART_INSTANCES; i++ )
631 {
632 uart_data = &(uart_data_base[i]);
633 rt_init();
634 ker_init();
635 rx_init();
636 tx_init();
637 drx_init();
638 dtx_init();
639 }
640 uart_data = &(uart_data_base[0]);
641
642 return (PEI_OK);
643 }
644
645
646
647 /*
648 +------------------------------------------------------------------------------
649 | Function : pei_timeout
650 +------------------------------------------------------------------------------
651 | Description : This function is called by the frame when a timer
652 | has expired.
653 |
654 | Parameters : index - timer index
655 |
656 | Return : PEI_OK - timeout processed
657 | PEI_ERROR - timeout not processed
658 |
659 +------------------------------------------------------------------------------
660 */
661 LOCAL SHORT pei_timeout (USHORT index)
662 {
663 TRACE_FUNCTION ("pei_timeout");
664
665 /*
666 * set UART instance
667 */
668 uart_data = uart_timer_table[index].uart_data;
669
670 /*
671 * Process timeout
672 */
673 switch (uart_timer_table[index].timer_number)
674 {
675 case UART_RT_INDEX_T1:
676 /*
677 * timer T1 expired.
678 */
679 rt_t1_expired();
680 break;
681 case UART_RT_INDEX_T2:
682 /*
683 * timer T2 expired.
684 */
685 rt_t2_expired();
686 break;
687 case UART_RT_INDEX_T3:
688 /*
689 * timer T3 expired.
690 */
691 rt_t3_expired();
692 break;
693 case UART_RT_INDEX_TESD:
694 /*
695 * Escape Sequence Detection timer expired.
696 */
697 rt_tesd_expired();
698 break;
699 default:
700 TRACE_ERROR("pei_timeout: Unknown Timeout");
701 break;
702 }
703
704 return PEI_OK;
705 }
706
707
708
709 /*
710 +------------------------------------------------------------------------------
711 | Function : pei_signal
712 +------------------------------------------------------------------------------
713 | Description : This function is called by the frame when a signal
714 | has been received.
715 |
716 | Parameters : opc - signal operation code
717 | *data - pointer to primitive
718 |
719 | Return : PEI_OK - signal processed
720 | PEI_ERROR - signal not processed
721 |
722 +------------------------------------------------------------------------------
723 */
724 LOCAL SHORT pei_signal (ULONG opc, void *data)
725 {
726 TRACE_FUNCTION ("pei_signal");
727
728 #ifdef FF_MULTI_PORT
729 /*
730 * Process signal
731 */
732 switch (opc)
733 {
734 case UART_DRIVER_SENT_IND:
735 tx_uart_driver_sent_ind(data);
736 break;
737
738 case UART_DRIVER_RECEIVED_IND:
739 rx_uart_driver_received_ind(data);
740 break;
741
742 case UART_DRIVER_FLUSHED_IND:
743 tx_uart_driver_flushed_ind(data);
744 break;
745
746 default:
747 TRACE_ERROR("Unknown Signal OPC");
748 return PEI_ERROR;
749 }
750 #else /* FF_MULTI_PORT */
751 /*
752 * Process signal
753 */
754 switch (opc)
755 {
756 case UART_DRIVER_SENT_IND:
757 tx_uart_driver_sent_ind(data);
758 break;
759
760 case UART_DRIVER_RECEIVED_IND:
761 rx_uart_driver_received_ind(data);
762 break;
763
764 default:
765 TRACE_ERROR("Unknown Signal OPC");
766 break;
767 }
768 #endif /* FF_MULTI_PORT */
769
770 return PEI_OK;
771 }
772
773
774
775 /*
776 +------------------------------------------------------------------------------
777 | Function : pei_exit
778 +------------------------------------------------------------------------------
779 | Description : This function is called by the frame when the entity
780 | is terminated. All open resources are freed.
781 |
782 | Parameters : -
783 |
784 | Return : PEI_OK - exit sucessful
785 | PEI_ERROR - exit not sueccessful
786 |
787 +------------------------------------------------------------------------------
788 */
789 LOCAL SHORT pei_exit (void)
790 {
791 TRACE_FUNCTION ("pei_exit");
792
793 #ifdef DTILIB
794 #ifdef _SIMULATION_
795
796 /*
797 * close test channel
798 */
799 #endif /* _SIMULATION_ */
800
801 /*
802 * Shut down dtilib communication
803 */
804 dti_deinit(uart_hDTI);
805 #endif /* DTILIB */
806 /*
807 * Close communication channel to MMI
808 */
809 if(vsi_c_close (VSI_CALLER hCommMMI) NEQ VSI_OK)
810 {
811 TRACE_ERROR_P1("VSI entity: CloseComChannel to MMI failed, uart_pei.c(%d)",
812 __LINE__);
813 return PEI_ERROR;
814 }
815 hCommMMI = VSI_ERROR;
816
817
818 /*
819 * Free all resources
820 */
821 drx_free_resources();
822 dtx_exit();
823
824 return PEI_OK;
825 }
826
827
828
829 /*
830 +------------------------------------------------------------------------------
831 | Function : pei_run
832 +------------------------------------------------------------------------------
833 | Description : This function is called by the frame when entering
834 | the main loop. This function is only required in the
835 | active variant.
836 |
837 | This function is not used.
838 |
839 | Parameters : handle - Communication handle
840 |
841 | Return : PEI_OK - sucessful
842 | PEI_ERROR - not successful
843 |
844 +------------------------------------------------------------------------------
845 */
846 LOCAL SHORT pei_run (T_HANDLE TaskHandle, T_HANDLE ComHandle )
847 {
848 return PEI_OK;
849 } /* pei_run() */
850
851
852
853 /*
854 +------------------------------------------------------------------------------
855 | Function : pei_monitor
856 +------------------------------------------------------------------------------
857 | Description : This function is called by the frame in case sudden
858 | entity specific data is requested
859 | (e.g. entity Version).
860 |
861 | Parameters : out_monitor - return the address of the data to be
862 | monitoredCommunication handle
863 |
864 | Return : PEI_OK - sucessful
865 | (address in out_monitor is valid)
866 | PEI_ERROR - not successful
867 |
868 +------------------------------------------------------------------------------
869 */
870 LOCAL SHORT pei_monitor (void ** out_monitor)
871 {
872 TRACE_FUNCTION ("pei_monitor");
873
874 /*
875 * Version = "0.S" (S = Step).
876 */
877 uart_mon.version = VERSION_UART;
878 *out_monitor = &uart_mon;
879
880 return PEI_OK;
881 }
882
883
884 /*
885 +------------------------------------------------------------------------------
886 | Function : pei_config
887 +------------------------------------------------------------------------------
888 | Description : This function is called by the frame when a primitive
889 | is received indicating dynamic configuration.
890 |
891 | This function is not used in this entity.
892 |
893 | Parameters : handle - Communication handle
894 |
895 | Return : PEI_OK - sucessful
896 | PEI_ERROR - not successful
897 |
898 +------------------------------------------------------------------------------
899 */
900 LOCAL SHORT pei_config (T_PEI_CONFIG inString)
901 {
902 TRACE_FUNCTION ("pei_config");
903 TRACE_FUNCTION (inString);
904
905 return PEI_OK;
906 }
907
908 /*
909 +------------------------------------------------------------------------------
910 | Function : pei_create
911 +------------------------------------------------------------------------------
912 | Description : This function is called by the frame when the process
913 | is created.
914 |
915 | Parameters : out_name - Pointer to the buffer in which to
916 | locate the name of this entity
917 |
918 | Return : PEI_OK - entity created successfuly
919 | PEI_ERROR - entity could not be created
920 |
921 +------------------------------------------------------------------------------
922 */
923 GLOBAL SHORT pei_create (T_PEI_INFO **info)
924 {
925 static T_PEI_INFO pei_info =
926 {
927 "UART", /* name */
928 { /* pei-table */
929 pei_init,
930 #ifdef _SIMULATION_
931 pei_exit,
932 #else
933 NULL,
934 #endif
935 pei_primitive,
936 pei_timeout,
937 pei_signal,
938 pei_run,
939 pei_config,
940 pei_monitor
941 },
942 1024, /* stack size */
943 10, /* queue entries */
944 200, /* priority (1->low, 255->high) */
945 UART_TIMER_MAX, /* number of timers */
946 0x03|PRIM_NO_SUSPEND /* flags: bit 0 active(0) body/passive(1) */
947 }; /* bit 1 com by copy(0)/reference(1) */
948
949
950 TRACE_FUNCTION ("pei_create");
951
952 /*
953 * Close Resources if open
954 */
955 #ifdef _SIMULATION_
956 if (first_access)
957 {
958 first_access = FALSE;
959 }
960 else
961 {
962 if(pei_exit() NEQ PEI_OK)
963 {
964 TRACE_ERROR_P1("UART PEI: Can't free open recources, uart_pei.c(%d)",
965 __LINE__);
966 }
967 }
968 #endif
969
970 /*
971 * Export startup configuration data
972 */
973 *info = &pei_info;
974
975 return PEI_OK;
976 }
977
978
979 #ifndef DTILIB
980 /*
981 +------------------------------------------------------------------------------
982 | Function : pei_select_instances
983 +------------------------------------------------------------------------------
984 | Description : This function selects the correct UART and DTX/DRX services
985 | for an incoming DTI interface primitive. This is done by a
986 | lookup in the UART channel id table in order to determine
987 | the correct UART, DTX and DRX data structures.
988 |
989 | Parameters : c_id - channel id of incoming primitive
990 |
991 | Return : TRUE - successful
992 | FALSE - not successful
993 |
994 +------------------------------------------------------------------------------
995 */
996 GLOBAL UBYTE pei_select_instances( UBYTE incoming_c_id )
997 {
998 USHORT i;
999 UBYTE found = FALSE;
1000
1001 TRACE_FUNCTION ("pei_select_instances");
1002
1003 /*
1004 * locate the channel id in the global cid table
1005 */
1006 for( i = 0; i < UART_INSTANCES * UART_MAX_NUMBER_OF_CHANNELS; i++ )
1007 if( uart_cid_table[i].c_id EQ incoming_c_id )
1008 if( ( uart_cid_table[i].dtx NEQ NULL ) &&
1009 ( uart_cid_table[i].drx NEQ NULL ) &&
1010 ( uart_cid_table[i].uart_data NEQ NULL ) )
1011 {
1012 /*
1013 * channel id found. select service structures
1014 */
1015 uart_data = uart_cid_table[i].uart_data;
1016 uart_data->dtx = uart_cid_table[i].dtx;
1017 uart_data->drx = uart_cid_table[i].drx;
1018
1019 found = TRUE;
1020 break;
1021 }
1022
1023 if( found EQ FALSE )
1024 {
1025 TRACE_EVENT(" pei_select_instances: unknown c_id ");
1026 }
1027 #ifdef _SIMULATION_
1028 {
1029 char buf[64];
1030 sprintf(buf,"found incoming_c_id: 0x%02X in uart_cid_table[%d]",incoming_c_id, i);
1031 TRACE_EVENT(buf);
1032 }
1033 #endif
1034 return( found );
1035 } /* pei_select_instances */
1036 #endif /* DTILIB */
1037
1038
1039 /*
1040 * maps for DTILIB functions
1041 */
1042
1043 #ifdef DTILIB
1044 /*
1045 +------------------------------------------------------------------------------
1046 | Function : pei_dti_dti_connect_req
1047 +------------------------------------------------------------------------------
1048 | PURPOSE : Call the process function dti_dti_connect_req
1049 +------------------------------------------------------------------------------
1050 */
1051 LOCAL void pei_dti_dti_connect_req (T_DTI2_CONNECT_REQ* dti_connect_req)
1052 {
1053 dti_dti_connect_req (uart_hDTI, dti_connect_req);
1054 } /* pei_dti_dti_connect_req() */
1055
1056
1057
1058 /*
1059 +------------------------------------------------------------------------------
1060 | Function : pei_dti_dti_connect_res
1061 +------------------------------------------------------------------------------
1062 | PURPOSE : Call the process function dti_dti_connect_res
1063 +------------------------------------------------------------------------------
1064 */
1065 LOCAL void pei_dti_dti_connect_res (T_DTI2_CONNECT_RES* dti_connect_res)
1066 {
1067 dti_dti_connect_res(uart_hDTI, dti_connect_res);
1068 } /* pei_dti_dti_connect_res() */
1069
1070
1071
1072 /*
1073 +------------------------------------------------------------------------------
1074 | Function : pei_dti_dti_disconnect_req
1075 +------------------------------------------------------------------------------
1076 | PURPOSE : Call the process function dti_dti_disconnect_req
1077 +------------------------------------------------------------------------------
1078 */
1079 LOCAL void pei_dti_dti_disconnect_req (T_DTI2_DISCONNECT_REQ*
1080 dti_disconnect_req)
1081 {
1082 dti_dti_disconnect_req (uart_hDTI, dti_disconnect_req);
1083 } /* pei_dti_dti_disconnect_req() */
1084
1085
1086 #ifdef _SIMULATION_
1087 /*
1088 +------------------------------------------------------------------------------
1089 | Function : pei_dti_dti_connect_ind
1090 +------------------------------------------------------------------------------
1091 | PURPOSE : Call the process function dti_dti_connect_ind
1092 +------------------------------------------------------------------------------
1093 */
1094 LOCAL void pei_dti_dti_connect_ind (T_DTI2_CONNECT_IND* dti_connect_ind)
1095 {
1096 dti_dti_connect_ind (uart_hDTI, dti_connect_ind);
1097 } /* pei_dti_dti_connect_ind() */
1098
1099
1100
1101 /*
1102 +------------------------------------------------------------------------------
1103 | Function : pei_dti_dti_connect_cnf
1104 +------------------------------------------------------------------------------
1105 | PURPOSE : Call the process function dti_dti_connect_cnf
1106 +------------------------------------------------------------------------------
1107 */
1108 LOCAL void pei_dti_dti_connect_cnf (T_DTI2_CONNECT_CNF* dti_connect_cnf)
1109 {
1110 dti_dti_connect_cnf(uart_hDTI, dti_connect_cnf);
1111 } /* pei_dti_dti_connect_cnf() */
1112
1113
1114
1115 /*
1116 +------------------------------------------------------------------------------
1117 | Function : pei_dti_dti_disconnect_ind
1118 +------------------------------------------------------------------------------
1119 | PURPOSE : Call the process function dti_dti_disconnect_ind
1120 +------------------------------------------------------------------------------
1121 */
1122 LOCAL void pei_dti_dti_disconnect_ind (T_DTI2_DISCONNECT_IND*
1123 dti_disconnect_ind)
1124 {
1125 dti_dti_disconnect_ind (uart_hDTI, dti_disconnect_ind);
1126 } /* pei_dti_dti_disconnect_ind() */
1127
1128 #endif /*_SIMULATION_*/
1129
1130 /*
1131 +------------------------------------------------------------------------------
1132 | Function : pei_dti_dti_data_req
1133 +------------------------------------------------------------------------------
1134 | PURPOSE : Call the process function dti_dti_data_req
1135 +------------------------------------------------------------------------------
1136 */
1137 LOCAL void pei_dti_dti_data_req (T_DTI2_DATA_REQ* dti_data_req)
1138 {
1139 dti_dti_data_req (uart_hDTI, dti_data_req);
1140 } /* pei_dti_dti_data_req() */
1141
1142
1143
1144 /*
1145 +------------------------------------------------------------------------------
1146 | Function : pei_dti_dti_getdata_req
1147 +------------------------------------------------------------------------------
1148 | PURPOSE : Call the process function dti_dti_getdata_req
1149 +------------------------------------------------------------------------------
1150 */
1151 LOCAL void pei_dti_dti_getdata_req (T_DTI2_GETDATA_REQ* dti_getdata_req)
1152 {
1153 dti_dti_getdata_req (uart_hDTI, dti_getdata_req);
1154 } /* pei_dti_dti_getdata_req() */
1155
1156
1157 /*==== Start functions only use with Windows ===============================*/
1158
1159 #ifdef _SIMULATION_
1160
1161 /*
1162 +------------------------------------------------------------------------------
1163 | Function : pei_dti_dti_data_test_req
1164 +------------------------------------------------------------------------------
1165 | PURPOSE : Call the process function dti_dti_data_test_req
1166 +------------------------------------------------------------------------------
1167 */
1168 LOCAL void pei_dti_dti_data_test_req (T_DTI2_DATA_TEST_REQ* dti_data_test_req)
1169 {
1170 dti_dti_data_test_req (uart_hDTI, dti_data_test_req);
1171 } /* pei_dti_dti_data_test_req() */
1172
1173 /*==== End functions only used with testing from WIN32 =====================*/
1174
1175
1176
1177 /*
1178 +------------------------------------------------------------------------------
1179 | Function : pei_dti_dti_ready_ind
1180 +------------------------------------------------------------------------------
1181 | PURPOSE : Call the process function dti_dti_ready_ind
1182 +------------------------------------------------------------------------------
1183 */
1184 LOCAL void pei_dti_dti_ready_ind (T_DTI2_READY_IND* dti_ready_ind)
1185 {
1186 dti_dti_ready_ind (uart_hDTI, dti_ready_ind);
1187 } /* pei_dti_dti_ready_ind() */
1188
1189
1190
1191 /*
1192 +------------------------------------------------------------------------------
1193 | Function : pei_dti_dti_data_ind
1194 +------------------------------------------------------------------------------
1195 | PURPOSE : Call the process function dti_dti_data_ind
1196 +------------------------------------------------------------------------------
1197 */
1198 LOCAL void pei_dti_dti_data_ind (T_DTI2_DATA_IND* dti_data_ind)
1199 {
1200 dti_dti_data_ind (uart_hDTI, dti_data_ind);
1201 } /* pei_dti_dti_data_ind() */
1202 #endif /* _SIMULATION_ */
1203
1204 /*
1205 +------------------------------------------------------------------------------
1206 | Function : pei_sig_callback
1207 +------------------------------------------------------------------------------
1208 | PURPOSE : Callback function for DTILIB
1209 +------------------------------------------------------------------------------
1210 */
1211
1212 LOCAL void pei_sig_callback(U8 instance,
1213 U8 interfac,
1214 U8 channel,
1215 U8 reason,
1216 T_DTI2_DATA_IND *dti_data2_ind)
1217 {
1218 T_DLC *dlc;
1219
1220 TRACE_FUNCTION("pei_sig_callback");
1221
1222 if(interfac NEQ UART_DTI_UP_INTERFACE)
1223 {
1224 TRACE_ERROR("[PEI_SIG_CALLBACK] interface not valid!");
1225 return; /* error, not found */
1226 }
1227
1228 uart_data = &uart_data_base[instance];
1229
1230 if (uart_hDTI NEQ D_NO_DATA_BASE)
1231 {
1232 switch (reason)
1233 {
1234 case DTI_REASON_CONNECTION_OPENED:
1235 dlc = &uart_data->dlc_table[channel]; /* channel is dlci */
1236 uart_data->drx = dlc->drx;
1237 uart_data->dtx = dlc->dtx;
1238
1239 sig_dti_ker_connection_opened_ind(channel);
1240 break;
1241
1242 case DTI_REASON_CONNECTION_CLOSED:
1243 dlc = &uart_data->dlc_table[channel]; /* channel is dlci */
1244 uart_data->drx = dlc->drx;
1245 uart_data->dtx = dlc->dtx;
1246
1247 sig_dti_ker_connection_closed_ind(channel);
1248 break;
1249
1250 case DTI_REASON_DATA_RECEIVED:
1251 if(!uart_data)
1252 {
1253 /*
1254 * instance not found, primitive was invalid, discard it
1255 */
1256 PFREE_DESC2( dti_data2_ind );
1257 }
1258 else
1259 {
1260 dlc = &uart_data->dlc_table[channel]; /* channel is dlci */
1261 uart_data->drx = dlc->drx;
1262 uart_data->dtx = dlc->dtx;
1263
1264 sig_dti_drx_data_received_ind(dti_data2_ind);
1265 }
1266 break;
1267
1268 case DTI_REASON_TX_BUFFER_FULL:
1269 if(!uart_data)
1270 {
1271 TRACE_ERROR("[PEI_SIG_CALLBACK] instance not valid!");
1272 return; /* error, not found */
1273 }
1274 dlc = &uart_data->dlc_table[channel]; /* channel is dlci */
1275 uart_data->drx = dlc->drx;
1276 uart_data->dtx = dlc->dtx;
1277
1278 sig_dti_dtx_tx_buffer_full_ind();
1279 break;
1280
1281 case DTI_REASON_TX_BUFFER_READY:
1282 if(!uart_data)
1283 {
1284 TRACE_ERROR("[PEI_SIG_CALLBACK] instance not valid!");
1285 return; /* error, not found */
1286 }
1287 dlc = &uart_data->dlc_table[channel]; /* channel is dlci */
1288 uart_data->drx = dlc->drx;
1289 uart_data->dtx = dlc->dtx;
1290
1291 sig_dti_dtx_tx_buffer_ready_ind();
1292 break;
1293 default:
1294 TRACE_ERROR("unknown DTILIB reason parameter");
1295 break;
1296 } /* end switch */
1297 } /* end if */
1298 else
1299 {
1300 TRACE_ERROR("Pointer to DTILIB database not existing");
1301 }
1302 } /* pei_sig_callback() */
1303
1304 /*==== End of functions only used with DTILIB =================================*/
1305
1306 #endif /* DTILIB */
1307
1308 /*==== END OF FILE ==========================================================*/