comparison g23m-aci/uart/uart_txp.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 | functions to handles the incoming primitives as described in
19 | the SDL-documentation (TX-statemachine)
20 +-----------------------------------------------------------------------------
21 */
22
23 #ifndef UART_TXP_C
24 #define UART_TXP_C
25 #endif /* !UART_TXP_C */
26
27 #include "config.h"
28 #include "fixedconf.h"
29 #include "condat-features.h"
30
31 #define ENTITY_UART
32
33 #ifndef FF_MULTI_PORT
34 /*==== INCLUDES =============================================================*/
35
36 #ifdef WIN32
37 #include "nucleus.h"
38 #endif /* WIN32 */
39 #include "typedefs.h" /* to get Condat data types */
40 #include "vsi.h" /* to get a lot of macros */
41 #include "macdef.h" /* to get a lot of macros */
42 #include "custom.h"
43 #include "gsm.h" /* to get a lot of macros */
44 #include "cnf_uart.h" /* to get cnf-definitions */
45 #include "mon_uart.h" /* to get mon-definitions */
46 #include "prim.h" /* to get the definitions of used SAP and directions */
47 #ifdef DTILIB
48 #include "dti.h" /* to get dti lib */
49 #endif /* DTILIB */
50 #include "pei.h" /* to get PEI interface */
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 #include "uart.h" /* to get the global entity definitions */
58
59 #include "uart_txf.h" /* to get tx functions */
60
61 #include "uart_kers.h" /* to get ker signals */
62 #include "uart_drxs.h" /* to get drx signals */
63
64 #ifdef _SIMULATION_
65 #include <stdio.h> /* to get sprintf */
66 #include "uart_txp.h" /* to get tx_writedata */
67 #endif /* _SIMULATION_ */
68 /*==== CONST ================================================================*/
69
70 /*==== LOCAL VARS ===========================================================*/
71
72 /*==== PRIVATE FUNCTIONS ====================================================*/
73
74 /*==== PUBLIC FUNCTIONS =====================================================*/
75
76
77
78 /*
79 +------------------------------------------------------------------------------
80 | Function : tx_uart_driver_sent_ind
81 +------------------------------------------------------------------------------
82 | Description : Handles the primitive UART_DRIVER_SENT_IND
83 |
84 | Parameters : *uart_device - affected device database
85 |
86 +------------------------------------------------------------------------------
87 */
88 GLOBAL void tx_uart_driver_sent_ind ( T_UART_DATA* uart_device )
89 {
90 T_desc2* temp_desc;
91 T_DLC* dlc;
92
93 TRACE_EVENT( "tx_uart_driver_sent_ind()" );
94
95 /*
96 * set affected instance
97 */
98 uart_data = uart_device;
99
100 switch( GET_STATE( UART_SERVICE_TX ) )
101 {
102 case TX_READY:
103 /*
104 * send DATA_SENT signal
105 */
106 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE];
107 uart_data->tx.dlc_instance = UART_EMPTY_INSTANCE;
108 temp_desc = dlc->transmit_data;
109 dlc->transmit_data = NULL;
110 uart_data->drx = dlc->drx;
111 sig_tx_drx_data_sent_req(temp_desc, dlc->transmit_pos);
112 /*
113 * determine whether there is still data to send
114 */
115 if(dlc->transmit_data EQ NULL)
116 {
117 /*
118 * no more data
119 */
120 uart_data->tx.send_state = UART_TX_NOT_SENDING;
121 break;
122 }
123 /*
124 * inform dlc about sending
125 */
126 uart_data->drx = dlc->drx;
127 sig_tx_drx_sending_req();
128 /*
129 * transmit data
130 */
131 if(uart_data EQ (&(uart_data_base[0])))
132 {
133 TRACE_EVENT("UF_WriteData()");
134 #ifdef _SIMULATION_
135 tx_writedata(0);
136 #else /* _SIMULATION_ */
137 UF_WriteData (uart_data->device, sm_suspend, tx_writeInFunc_0);
138 #endif /* else _SIMULATION_ */
139 }
140 #ifdef FF_TWO_UART_PORTS
141 else if(uart_data EQ (&(uart_data_base[1])))
142 {
143 TRACE_EVENT("UF_WriteData()");
144 #ifdef _SIMULATION_
145 tx_writedata(1);
146 #else /* _SIMULATION_ */
147 UF_WriteData (uart_data->device, sm_suspend, tx_writeInFunc_1);
148 #endif /* else _SIMULATION_ */
149 }
150 #endif /* FF_TWO_UART_PORTS */
151 else
152 {
153 TRACE_ERROR("wrong value of uart_data");
154 }
155 break;
156
157 case TX_MUX:
158 /*
159 * send DATA_SENT signal
160 */
161 if(uart_data->tx.dlc_instance EQ UART_EMPTY_INSTANCE)
162 {
163 /*
164 * use entry 0 for raw data
165 */
166 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE];
167 }
168 else
169 {
170 dlc = &uart_data->dlc_table[uart_data->tx.dlc_instance];
171 }
172 temp_desc = dlc->transmit_data;
173 dlc->transmit_data = NULL;
174 if(uart_data->tx.dlc_instance EQ UART_CONTROL_INSTANCE)
175 sig_tx_ker_data_sent_ind(temp_desc, dlc->transmit_pos);
176 else
177 {
178 uart_data->drx = dlc->drx;
179 sig_tx_drx_data_sent_req(temp_desc, dlc->transmit_pos);
180 }
181 /*
182 * determine next dlc allow to send
183 */
184 tx_next_send_allowed();
185 if(uart_data->tx.dlc_instance EQ UART_EMPTY_INSTANCE)
186 {
187 /*
188 * queue empty
189 */
190 uart_data->tx.send_state = UART_TX_NOT_SENDING;
191 break;
192 }
193 /*
194 * inform dlc about sending
195 */
196 dlc = &uart_data->dlc_table[uart_data->tx.dlc_instance];
197 if(uart_data->tx.dlc_instance EQ UART_CONTROL_INSTANCE)
198 {
199 /*
200 * Control channel
201 */
202 sig_tx_ker_sending_ind();
203 }
204 else
205 {
206 /*
207 * Data channel
208 */
209 uart_data->drx = dlc->drx;
210 sig_tx_drx_sending_req();
211 }
212 /*
213 * transmit data
214 */
215 #ifndef _SIMULATION_
216 tx_flushUart();
217 #endif /* !_SIMULATION_ */
218 if(uart_data EQ (&(uart_data_base[0])))
219 {
220 TRACE_EVENT("UF_WriteData()");
221 #ifdef _SIMULATION_
222 tx_writedata(0);
223 #else /* _SIMULATION_ */
224 UF_WriteData (uart_data->device, sm_suspend, tx_writeInFunc_0);
225 #endif /* else _SIMULATION_ */
226 }
227 #ifdef FF_TWO_UART_PORTS
228 else if(uart_data EQ (&(uart_data_base[1])))
229 {
230 TRACE_EVENT("UF_WriteData()");
231 #ifdef _SIMULATION_
232 tx_writedata(1);
233 #else /* _SIMULATION_ */
234 UF_WriteData (uart_data->device, sm_suspend, tx_writeInFunc_1);
235 #endif /* else _SIMULATION_ */
236 }
237 #endif /* FF_TWO_UART_PORTS */
238 else
239 {
240 TRACE_ERROR("wrong value of uart_data");
241 }
242 break;
243
244 default:
245 TRACE_ERROR( "UART_DRIVER_SENT_IND unexpected" );
246 break;
247 }
248 } /* tx_uart_driver_sent_ind() */
249
250
251
252 #ifdef _SIMULATION_
253 /*
254 +------------------------------------------------------------------------------
255 | Function : tx_dti_ready_ind
256 +------------------------------------------------------------------------------
257 | Description : Handles the primitive DTI_READY_IND
258 |
259 | Parameters : *dti_ready_ind - Ptr to primitive payload
260 |
261 +------------------------------------------------------------------------------
262 */
263 GLOBAL void tx_dti_ready_ind ( T_DTI2_READY_IND *dti_ready_ind )
264 {
265 TRACE_FUNCTION( "tx_dti_ready_ind" );
266
267 /*
268 * free the received primitive
269 */
270 PFREE(dti_ready_ind);
271 #ifdef DTI2 /* should combine "caller" and "read_data" */
272 /* when using both devices in the test document?! */
273 tx_uart_driver_sent_ind(&(uart_data_base[UART_TEST_C_ID_1]));
274 #else /* DTI2 */
275 tx_uart_driver_sent_ind(&(uart_data_base[dti_ready_ind->c_id]));
276 #endif /* DTI2 */
277 } /* tx_dti_ready_ind() */
278
279
280
281 /*
282 +------------------------------------------------------------------------------
283 | Function : tx_writedata
284 +------------------------------------------------------------------------------
285 | Description : Simulates UF_WriteData call
286 |
287 | Parameters : caller - calling UART instance
288 |
289 +------------------------------------------------------------------------------
290 */
291 GLOBAL void tx_writedata (UBYTE caller)
292 {
293 char buf[100];
294 T_reInstMode reInstall;
295 USHORT size[2];
296 USHORT pos;
297 USHORT i;
298 T_UART_DATA* uart_device;
299
300 TRACE_FUNCTION( "tx_writedata" );
301
302 /*
303 * set UART instance
304 */
305 uart_device = &(uart_data_base[caller]);
306
307 {
308 /*
309 * calculation of SDU length: ((((frame-size + 3) * 2) + 2) * 8)
310 */
311 PALLOC_SDU (dti_data_test_req, DTI2_DATA_TEST_REQ, 1088);
312 #ifdef DTI2 /* should switch for C_ID_1/2 when using both devices in the test document?! */
313 dti_data_test_req->link_id = LINK_WRITEDATA_PORT_1; /* for write_data call */
314 dti_data_test_req->parameters.p_id = 0;
315 dti_data_test_req->parameters.st_lines.st_flow = 0;
316 dti_data_test_req->parameters.st_lines.st_line_sa = 0;
317 dti_data_test_req->parameters.st_lines.st_line_sb = 0;
318 dti_data_test_req->parameters.st_lines.st_break_len = 0;
319 dti_data_test_req->sdu.o_buf = 0;
320 #else /* DTI2 */
321 dti_data_test_req->tui = 3; /* for write_data call */
322 dti_data_test_req->c_id = caller;
323 dti_data_test_req->p_id = 0;
324 dti_data_test_req->op_ack = 0;
325 dti_data_test_req->st_flow = 0;
326 dti_data_test_req->st_line_sa = 0;
327 dti_data_test_req->st_line_sb = 0;
328 dti_data_test_req->st_escape = 0;
329 dti_data_test_req->sdu.o_buf = 0;
330 #endif /* DTI2 */
331
332 uart_device->tx.dest[0] = dti_data_test_req->sdu.buf;
333 uart_device->tx.dest[1] = NULL;
334 size[0] = (USHORT)(1088 >> 3);
335 size[1] = 0;
336
337 /*
338 * call actual function
339 */
340 if(caller EQ 0)
341 {
342 tx_writeInFunc_0 (FALSE, &reInstall, 1, uart_device->tx.dest, size);
343 }
344 #ifdef FF_TWO_UART_PORTS
345 else if(caller EQ 1)
346 {
347 tx_writeInFunc_1 (FALSE, &reInstall, 1, uart_device->tx.dest, size);
348 }
349 #endif /* FF_TWO_UART_PORTS */
350 else
351 {
352 TRACE_ERROR("wrong caller value");
353 }
354
355 /*
356 * set length of sdu
357 */
358 dti_data_test_req->sdu.l_buf = ((USHORT)(1088 >> 3) - size[0]) << 3;
359
360 /*
361 * trace output
362 */
363 i = 0;
364 pos = 0;
365 while(pos < (dti_data_test_req->sdu.l_buf >> 3))
366 {
367 i+= sprintf(&buf[i], "0x%02x, ", dti_data_test_req->sdu.buf[pos]);
368 pos++;
369 if(i > 80)
370 {
371 TRACE_FUNCTION( buf );
372 i = 0;
373 }
374 else if(pos >= (dti_data_test_req->sdu.l_buf >> 3))
375 {
376 TRACE_FUNCTION( buf );
377 }
378 }
379 /*
380 * send primitive
381 */
382 PSEND (hCommMMI, dti_data_test_req);
383 }
384 } /* tx_writedata() */
385 #endif /* _SIMULATION_ */
386 #endif /* !FF_MULTI_PORT */