FreeCalypso > hg > fc-magnetite
comparison src/g23m-fad/fad/fad_sndf.c @ 174:90eb61ecd093
src/g23m-fad: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 12 Oct 2016 05:40:46 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
173:bf64d785238a | 174:90eb61ecd093 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : GSM-F&D (8411) | |
4 | Modul : FAD_SNDF | |
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 defines the procedures and functions for | |
18 | the SND subcomponent SEQ (sequencer) | |
19 +----------------------------------------------------------------------------- | |
20 */ | |
21 | |
22 #ifndef FAD_SNDF_C | |
23 #define FAD_SNDF_C | |
24 #endif | |
25 | |
26 #define ENTITY_FAD | |
27 | |
28 /*==== INCLUDES ===================================================*/ | |
29 | |
30 #include <string.h> | |
31 #include "typedefs.h" | |
32 #include "vsi.h" | |
33 #include "macdef.h" | |
34 #include "pconst.cdg" | |
35 #include "custom.h" | |
36 #include "gsm.h" | |
37 #include "cnf_fad.h" | |
38 #include "mon_fad.h" | |
39 #include "prim.h" | |
40 #include "pei.h" | |
41 #include "tok.h" | |
42 #include "ccdapi.h" | |
43 #include "fad.h" | |
44 #include "ra_l1int.h" | |
45 | |
46 /*==== CONST =======================================================*/ | |
47 | |
48 /*==== TYPES =======================================================*/ | |
49 | |
50 /*==== VAR EXPORT ==================================================*/ | |
51 | |
52 /*==== VAR LOCAL ===================================================*/ | |
53 | |
54 /*==== FUNCTIONS ===================================================*/ | |
55 | |
56 /* | |
57 +--------------------------------------------------------------------+ | |
58 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
59 | STATE : code ROUTINE : snd_init | | |
60 +--------------------------------------------------------------------+ | |
61 | |
62 PURPOSE : initialise the sequencer | |
63 | |
64 */ | |
65 | |
66 GLOBAL void snd_init (void) | |
67 { | |
68 T_SND *snd = &fad_data->snd; | |
69 T_SBM *sbm = &fad_data->sbm; | |
70 | |
71 TRACE_FUNCTION ("snd_init()"); | |
72 | |
73 snd->bytes_to_send = REPEAT_FOREVER; | |
74 snd->ra_req_frames = 0; | |
75 snd->reset = SYNC_RESET; | |
76 snd->send_ready_to_t30 = FALSE; | |
77 snd->seq_buflen = 0; | |
78 snd->seq_bufpos = 0; | |
79 snd->data_bufpos = 0; | |
80 snd->fad_data_req = NULL; | |
81 | |
82 sbm->FrameSize = FRAME_SIZE; | |
83 sbm->syncCycle = SYNC_CYCLE_NONE; | |
84 sbm->framesUntilSync = 0; | |
85 | |
86 snd_SetSequence (snd->seq_buf, &snd->seq_buflen, (UBYTE*)FR_SEQ_SYNC, LEN_SEQ_SYNC, 3); | |
87 } | |
88 | |
89 | |
90 /* | |
91 +--------------------------------------------------------------------+ | |
92 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
93 | STATE : code ROUTINE : snd_setupTCF | | |
94 +--------------------------------------------------------------------+ | |
95 | |
96 PURPOSE : initialise the sequencer for TCF | |
97 | |
98 */ | |
99 | |
100 LOCAL void snd_setupTCF (void) | |
101 { | |
102 T_SND *snd = &fad_data->snd; | |
103 | |
104 snd->seq_buflen = 0; | |
105 | |
106 switch (snd->trans_rate) | |
107 { | |
108 case R_12000: /* 5 Data frames + 1 SYNC frame */ | |
109 snd_SetSequence(snd->seq_buf, &snd->seq_buflen, (UBYTE*)FR_SEQ_TCF, LEN_SEQ_TCF, 5); | |
110 snd_SetSequence(&snd->seq_buf [snd->seq_buflen], &snd->seq_buflen, (UBYTE*)FR_SEQ_SYNC, LEN_SEQ_SYNC, 1); | |
111 TRACE_EVENT ("setup TCF 12kbps"); | |
112 break; | |
113 | |
114 case R_7200: /* 3 Data frames + 1 SYNC frame */ | |
115 snd_SetSequence(snd->seq_buf, &snd->seq_buflen, (UBYTE*)FR_SEQ_TCF, LEN_SEQ_TCF, 3); | |
116 snd_SetSequence(&snd->seq_buf [snd->seq_buflen], &snd->seq_buflen, (UBYTE*)FR_SEQ_SYNC, LEN_SEQ_SYNC, 1); | |
117 TRACE_EVENT ("setup TCF 7.2kbps"); | |
118 break; | |
119 | |
120 case R_14400: /* 5 Data frames */ | |
121 case R_9600: | |
122 case R_4800: | |
123 case R_2400: | |
124 default: | |
125 snd_SetSequence (snd->seq_buf, &snd->seq_buflen, (UBYTE *)FR_SEQ_TCF, LEN_SEQ_TCF, 5); | |
126 TRACE_EVENT ("setup norm TCF"); | |
127 break; | |
128 } | |
129 } | |
130 | |
131 /* | |
132 +-------------------------------------------------------------------------+ | |
133 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDS | | |
134 | STATE : code ROUTINE : snd_SendReset | | |
135 +-------------------------------------------------------------------------+ | |
136 | |
137 PURPOSE : Send SYNC frames following return to IDLE state | |
138 | |
139 */ | |
140 | |
141 GLOBAL void snd_SendReset (USHORT bytes_to_send) | |
142 { | |
143 T_SND *snd = &fad_data->snd; | |
144 | |
145 TRACE_FUNCTION ("snd_SendReset()"); | |
146 | |
147 if (snd->reset) | |
148 { | |
149 snd->reset--; | |
150 snd_SendSequence (bytes_to_send, FR_SYNC); | |
151 } | |
152 | |
153 if (!snd->reset) | |
154 { | |
155 snd->seq_buflen = 0; | |
156 snd->seq_bufpos = 0; | |
157 | |
158 switch (GET_STATE (SND)) | |
159 { | |
160 case PREAM_SND: | |
161 snd->bytes_to_send = PREAMBLE_BYTES_TI_SND; | |
162 snd_SetSequence (snd->seq_buf, &snd->seq_buflen, (UBYTE*)FR_SEQ_PREAMBLE, LEN_SEQ_PREAMBLE, 12); | |
163 break; | |
164 | |
165 case TCF_SND: | |
166 snd->bytes_to_send = snd_DurationToBytes (snd->trans_rate, TIME_TCF_SND); | |
167 snd_setupTCF(); /* set the sequencer for the TCF pattern */ | |
168 break; | |
169 | |
170 case TRAIN_SND: | |
171 #ifdef _SIMULATION_ | |
172 snd_SetSequence (snd->seq_buf, &snd->seq_buflen, (UBYTE*)FR_SEQ_TRAIN_SND, LEN_SEQ_TRAIN, 4); | |
173 snd_SetSequence (&snd->seq_buf [snd->seq_buflen], &snd->seq_buflen, (UBYTE*)FR_SEQ_SYNC, LEN_SEQ_SYNC, 1); | |
174 #else /* TI: only 2 bytes set - no SYNCs */ | |
175 snd_SetSequence (snd->seq_buf, &snd->seq_buflen, (UBYTE*)FR_SEQ_TRAIN_SND, LEN_SEQ_TRAIN, 1); | |
176 #endif | |
177 break; | |
178 | |
179 case TRAIN_CNF_SND: | |
180 #ifdef _SIMULATION_ | |
181 snd_SetSequence (snd->seq_buf, &snd->seq_buflen, (UBYTE*)FR_SEQ_TRAIN_RCV, LEN_SEQ_TRAIN, 4); | |
182 snd_SetSequence (&snd->seq_buf [snd->seq_buflen], &snd->seq_buflen, (UBYTE*)FR_SEQ_SYNC, LEN_SEQ_SYNC, 1); | |
183 #else /* TI: only 2 bytes set - no SYNCs */ | |
184 snd_SetSequence (snd->seq_buf, &snd->seq_buflen, (UBYTE*)FR_SEQ_TRAIN_RCV, LEN_SEQ_TRAIN, 1); | |
185 #endif | |
186 break; | |
187 } | |
188 } | |
189 } | |
190 | |
191 | |
192 /* | |
193 +--------------------------------------------------------------------+ | |
194 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
195 | STATE : code ROUTINE : snd_SetSequence | | |
196 +--------------------------------------------------------------------+ | |
197 | |
198 PURPOSE : set frame | |
199 | |
200 */ | |
201 | |
202 GLOBAL void snd_SetSequence (UBYTE *seq_buf, USHORT *seq_buflen, | |
203 UBYTE *sequence, USHORT seq_len, USHORT repeat) | |
204 { | |
205 TRACE_FUNCTION ("snd_SetSequence()"); | |
206 | |
207 *seq_buflen += (seq_len * repeat); | |
208 | |
209 while (repeat--) | |
210 { | |
211 memcpy (seq_buf, sequence, seq_len); | |
212 seq_buf += seq_len; | |
213 } | |
214 } | |
215 | |
216 #if defined TRACE_FAD_UL_STATUS || defined _SIMULATION_ | |
217 | |
218 LOCAL void trace_fad_ul_frame_type(USHORT cus_frame_type, UBYTE* buf1, USHORT bytes_to_write) | |
219 { | |
220 const char type[5] = "DSYT"; | |
221 char buf[15] = "TISx:0x00-0x00"; | |
222 | |
223 if (cus_frame_type < 4) | |
224 buf[3] = type[cus_frame_type]; | |
225 | |
226 if (buf1) | |
227 BYTE2HEXSTR(*(buf1+1), &buf[7]); | |
228 | |
229 BYTE2HEXSTR((UBYTE)bytes_to_write, &buf[12]); | |
230 TRACE_EVENT (buf); | |
231 } | |
232 | |
233 #endif | |
234 | |
235 /* | |
236 +--------------------------------------------------------------------+ | |
237 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
238 | STATE : code ROUTINE : snd_ra_data_req | | |
239 +--------------------------------------------------------------------+ | |
240 | |
241 PURPOSE : Converts contents of frame descriptor to primitive | |
242 | |
243 */ | |
244 LOCAL void snd_ra_data_req(T_FD *pFD) | |
245 { | |
246 | |
247 #if defined TRACE_FAD_UL_STATUS || defined _SIMULATION_ | |
248 | |
249 if (pFD->type EQ FR_STATUS) | |
250 { | |
251 trace_fad_ul_frame_type(FR_STATUS, pFD->buf, pFD->len); | |
252 } | |
253 /* | |
254 void t30_ker_debug(CHAR *header, UBYTE *buf, USHORT len); | |
255 | |
256 if (pFD->type EQ FR_STATUS) | |
257 { | |
258 t30_ker_debug("BCS-RCV", pFD->buf, pFD->len); | |
259 } | |
260 */ | |
261 #endif | |
262 | |
263 #ifdef _SIMULATION_ | |
264 { | |
265 PALLOC_SDU (ra_data_req, RA_DATA_REQ, (USHORT)(pFD->len<<3)); | |
266 | |
267 TRACE_FUNCTION ("snd_ra_data_req()"); | |
268 | |
269 ra_data_req->sdu.l_buf = pFD->len<<3; | |
270 memcpy (&ra_data_req->sdu.buf, pFD->buf, pFD->len); | |
271 ra_data_req->fr_type = pFD->type; | |
272 ra_data_req->dtx_flg = DTX_DIS; | |
273 ra_data_req->status = ST_SA; | |
274 PSENDX (RA, ra_data_req); | |
275 } | |
276 #else | |
277 | |
278 l1i_ra_data_req_new(pFD); | |
279 | |
280 #endif | |
281 } | |
282 | |
283 | |
284 /* | |
285 +--------------------------------------------------------------------+ | |
286 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
287 | STATE : code ROUTINE : snd_SendSequence | | |
288 +--------------------------------------------------------------------+ | |
289 | |
290 PURPOSE : | |
291 | |
292 */ | |
293 | |
294 GLOBAL USHORT snd_SendSequence (USHORT bytes_to_send, UBYTE fr_type) | |
295 { | |
296 T_SND *snd = &fad_data->snd; | |
297 USHORT sdu_buf_pos = 0; | |
298 | |
299 #ifdef _SIMULATION_ | |
300 TRACE_FUNCTION ("snd_SendSequence()"); | |
301 #endif | |
302 | |
303 #ifdef _TARGET_ | |
304 switch (fr_type) | |
305 { | |
306 case FR_SYNC: | |
307 break; | |
308 | |
309 case FR_STATUS: | |
310 case FR_TRAIN: | |
311 bytes_to_send = 2; | |
312 break; | |
313 | |
314 default: | |
315 break; | |
316 } | |
317 #endif | |
318 | |
319 if (snd->bytes_to_send NEQ REPEAT_FOREVER) | |
320 { | |
321 if (snd->bytes_to_send > bytes_to_send) | |
322 snd->bytes_to_send -= bytes_to_send; | |
323 else | |
324 snd->bytes_to_send = 0; | |
325 } | |
326 | |
327 snd->FD.type = fr_type; | |
328 snd->FD.len = (U8)bytes_to_send; | |
329 | |
330 while (bytes_to_send) | |
331 { | |
332 UBYTE bytes_to_read = MINIMUM(snd->seq_buflen - snd->seq_bufpos, bytes_to_send); | |
333 | |
334 memcpy(&snd->FD.buf[sdu_buf_pos], &snd->seq_buf[snd->seq_bufpos], bytes_to_read); | |
335 sdu_buf_pos += bytes_to_read; | |
336 snd->seq_bufpos += bytes_to_read; /* reset pos. in sequence */ | |
337 | |
338 if (bytes_to_send > bytes_to_read) | |
339 bytes_to_send -= bytes_to_read; | |
340 else | |
341 bytes_to_send = 0; | |
342 | |
343 if (snd->seq_bufpos >= snd->seq_buflen) /* check sequence boundary */ | |
344 snd->seq_bufpos -= snd->seq_buflen; | |
345 } | |
346 | |
347 snd_ra_data_req(&snd->FD); | |
348 | |
349 return (snd->bytes_to_send); | |
350 } | |
351 | |
352 /* | |
353 +--------------------------------------------------------------------+ | |
354 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
355 | STATE : code ROUTINE : snd_DurationToBytes | | |
356 +--------------------------------------------------------------------+ | |
357 | |
358 PURPOSE : convert duration of sequence to be sent to bytes, taking | |
359 account of the transmission rate set | |
360 | |
361 */ | |
362 | |
363 GLOBAL USHORT snd_DurationToBytes (USHORT trans_rate, USHORT duration) | |
364 { | |
365 | |
366 TRACE_FUNCTION ("snd_DurationToBytes()"); | |
367 | |
368 return (trans_rate * duration / (8 * 1000)); | |
369 | |
370 } | |
371 | |
372 #ifdef _SIMULATION_ | |
373 /* | |
374 +--------------------------------------------------------------------+ | |
375 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
376 | STATE : code ROUTINE : SetBcsFrameBuffer | | |
377 +--------------------------------------------------------------------+ | |
378 | |
379 PURPOSE : copy HDLC data for buffer sending - add BCS-REC ident & repeats | |
380 | |
381 */ | |
382 | |
383 LOCAL void SetBcsFrameBuffer (UBYTE *bcs_buf, UBYTE *hdlc_buf, USHORT len, USHORT repeat) | |
384 { | |
385 USHORT i, j, k; | |
386 | |
387 TRACE_FUNCTION ("SetBcsFrameBuffer()"); | |
388 | |
389 for (i = 0; i < len; hdlc_buf++) | |
390 { | |
391 for (j = 0; j < repeat; j++) | |
392 for (k = 0; k < HDLC_REPEAT; i++, k++, bcs_buf++) | |
393 if (i & 0x0001) | |
394 *bcs_buf = *hdlc_buf; | |
395 else | |
396 *bcs_buf = IDENT_BCS_REC; | |
397 } | |
398 | |
399 } | |
400 | |
401 #endif | |
402 | |
403 /* | |
404 +-----------------------------------------------------------------------+ | |
405 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
406 | STATE : code ROUTINE : snd_BuildStatusFrames | | |
407 +-----------------------------------------------------------------------+ | |
408 | |
409 PURPOSE : build BCS frames from HDLC data received from T30 | |
410 pass to SBM buffer | |
411 | |
412 */ | |
413 | |
414 #ifdef _SIMULATION_ | |
415 GLOBAL void snd_BuildStatusFrames(T_FAD_DATA_REQ *fad_data_req, USHORT max_bytes) | |
416 #else | |
417 GLOBAL void snd_BuildStatusFrames(T_FAD_DATA_REQ *fad_data_req) | |
418 #endif | |
419 { | |
420 T_SND *snd = &fad_data->snd; | |
421 | |
422 #ifdef _SIMULATION_ | |
423 USHORT repeat; | |
424 | |
425 TRACE_FUNCTION ("snd_BuildStatusFrames()"); | |
426 | |
427 snd->final = fad_data_req->final; | |
428 | |
429 /* set total bytes to be sent */ | |
430 | |
431 repeat = (USHORT)(snd->trans_rate / (BCS_RATE << 3)); | |
432 snd->data_to_send = fad_data_req->sdu.l_buf * HDLC_REPEAT * repeat; | |
433 | |
434 if (snd->data_to_send <= max_bytes) | |
435 fad_data_req->sdu.l_buf = 0; | |
436 else | |
437 { | |
438 snd->data_to_send = max_bytes; | |
439 fad_data_req->sdu.l_buf -= (snd->data_to_send / HDLC_REPEAT / repeat); | |
440 } | |
441 | |
442 SetBcsFrameBuffer (&snd->seq_buf [0], &fad_data_req->sdu.buf [fad_data_req->sdu.o_buf], snd->data_to_send, repeat); | |
443 | |
444 snd->data_bufpos = 0; | |
445 if (fad_data_req->sdu.l_buf) | |
446 fad_data_req->sdu.o_buf += (snd->data_to_send / HDLC_REPEAT / repeat); | |
447 | |
448 #else /* _TARGET_ */ | |
449 | |
450 snd->data_to_send = fad_data_req->sdu.l_buf >> 3; | |
451 fad_data_req->sdu.l_buf = 0; | |
452 snd->data_bufpos = 0; | |
453 | |
454 #endif | |
455 } | |
456 | |
457 /* | |
458 +--------------------------------------------------------------------+ | |
459 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
460 | STATE : code ROUTINE : snd_StoreMsgData | | |
461 +--------------------------------------------------------------------+ | |
462 | |
463 PURPOSE : store MSG data and pass to SBM buffer | |
464 | |
465 */ | |
466 | |
467 GLOBAL void snd_StoreMsgData (T_FAD_DATA_REQ *fad_data_req) | |
468 { | |
469 T_SND *snd = &fad_data->snd; | |
470 | |
471 TRACE_FUNCTION ("snd_StoreMsgData()"); | |
472 | |
473 snd->final = fad_data_req->final; | |
474 | |
475 if (fad_data_req->sdu.l_buf) | |
476 { | |
477 snd->data_bufpos += (fad_data_req->sdu.l_buf >> 3); | |
478 sbm_store_prim (fad_data_req); /* pass primitive to send buffer */ | |
479 } | |
480 if (!snd->final) | |
481 { | |
482 if (snd->data_to_send < snd->threshold) | |
483 sig_snd_ker_ready_ind (); | |
484 else | |
485 snd->send_ready_to_t30 = TRUE; | |
486 } | |
487 } | |
488 | |
489 | |
490 /* | |
491 +--------------------------------------------------------------------+ | |
492 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
493 | STATE : code ROUTINE : snd_SendMsgData | | |
494 +--------------------------------------------------------------------+ | |
495 | |
496 PURPOSE : | |
497 | |
498 */ | |
499 | |
500 GLOBAL BOOL snd_SendMsgData (UBYTE req_frames) | |
501 { | |
502 T_SND *snd = &fad_data->snd; | |
503 T_FRAME_DESC ul_FD; | |
504 | |
505 #ifdef _SIMULATION_ | |
506 TRACE_FUNCTION ("snd_SendMsgData()"); | |
507 #endif | |
508 | |
509 if (sbm_get_frame(&ul_FD, req_frames) EQ TRUE) | |
510 { | |
511 U8 sdu_len = (U8)(ul_FD.Len[0] + ul_FD.Len[1]); | |
512 | |
513 snd->data_to_send -= sdu_len; | |
514 snd->FD.type = FR_T4DATA; | |
515 snd->FD.len = sdu_len; | |
516 memcpy(snd->FD.buf, ul_FD.Adr[0], ul_FD.Len[0]); | |
517 memcpy(&snd->FD.buf[ul_FD.Len[0]], ul_FD.Adr[1], ul_FD.Len[1]); | |
518 snd_ra_data_req(&snd->FD); | |
519 return TRUE; | |
520 } | |
521 else | |
522 { | |
523 return FALSE; | |
524 } | |
525 } | |
526 | |
527 /* | |
528 +--------------------------------------------------------------------+ | |
529 | PROJECT : GSM-F&D (8411) MODULE : FAD_SNDF | | |
530 | STATE : code ROUTINE : snd_SendBcsData | | |
531 +--------------------------------------------------------------------+ | |
532 | |
533 PURPOSE : | |
534 | |
535 */ | |
536 #ifdef _SIMULATION_ | |
537 GLOBAL void snd_SendBcsData (USHORT bytes_to_send) | |
538 #else | |
539 GLOBAL void snd_SendBcsData (void) | |
540 #endif | |
541 { | |
542 T_SND *snd = &fad_data->snd; | |
543 | |
544 TRACE_FUNCTION ("snd_SendBcsData()"); | |
545 | |
546 if (!snd->data_to_send) | |
547 return; | |
548 | |
549 snd->FD.type = FR_STATUS; | |
550 | |
551 #ifdef _SIMULATION_ | |
552 | |
553 if (snd->data_to_send >= bytes_to_send) | |
554 snd->data_to_send -= bytes_to_send; | |
555 else | |
556 { | |
557 bytes_to_send = snd->data_to_send; | |
558 snd->data_to_send = 0; | |
559 } | |
560 snd->FD.len = (U8)bytes_to_send; | |
561 memcpy(snd->FD.buf, &snd->seq_buf[snd->data_bufpos], snd->FD.len); | |
562 snd->data_bufpos += bytes_to_send; | |
563 | |
564 #else /* _TARGET_ */ | |
565 snd->FD.buf[0] = IDENT_BCS_REC; | |
566 snd->FD.buf[1] = snd->fad_data_req->sdu.buf[snd->data_bufpos++]; | |
567 snd->FD.len = 2; | |
568 snd->data_to_send--; | |
569 | |
570 #endif /* _TARGET_ */ | |
571 | |
572 snd_ra_data_req(&snd->FD); | |
573 } | |
574 |