comparison g23m-gsm/dl/dl_dph.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 : GSM-PS
4 | Modul : DL_DPH
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 functions for distributing
18 | all primitives of the lower layers.
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef DL_DPH_C
23 #define DL_DPH_C
24
25 #include "config.h"
26 #include "fixedconf.h"
27 #include "condat-features.h"
28
29 #define ENTITY_DL
30
31 /*==== INCLUDES ===================================================*/
32
33 #include "typedefs.h"
34 #include <string.h>
35 #include "pconst.cdg"
36 #include "vsi.h"
37 #include "pconst.cdg"
38 #include "custom.h"
39 #include "gsm.h"
40 #include "mon_dl.h"
41 #include "prim.h"
42 #include "pei.h"
43 #include "tok.h"
44 #include "ccdapi.h"
45 #include "dl.h"
46 #include "dl_trc.h"
47
48 /*==== EXPORT =====================================================*/
49
50 /*==== PRIVAT =====================================================*/
51 #if defined(_SIMULATION_) && !defined(DL_2TO1)
52 LOCAL void dph_ph_data_req (T_PH_DATA_REQ * data_req);
53 #endif /* _SIMULATION_ && !DL_2TO1 */
54
55 #if defined(DL_2TO1) || defined(USE_L1M_GS001_1)
56 LOCAL U8 convert_dcch_ch_type (U8 channel_type);
57 #endif /* DL_2TO1 || USE_L1M_GS001_1 */
58
59 LOCAL void dl_process_downlink (UBYTE error_flag, UBYTE channel_type,
60 UBYTE * frame, ULONG fn);
61
62 /*==== VARIABLES ==================================================*/
63
64 /*==== FUNCTIONS ==================================================*/
65 #if defined(DL_2TO1)
66 #if defined(_SIMULATION_)
67 /*
68 +--------------------------------------------------------------------+
69 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
70 | STATE : code ROUTINE : dph_ph_ready_to_send |
71 +--------------------------------------------------------------------+
72
73 PURPOSE : Reception of a PH_READY_TO_SEND primitive.
74 Uplink opportunity for simulation.
75
76 */
77
78 GLOBAL void l1test_call_mphc_read_dcch (T_L1TEST_CALL_MPHC_READ_DCCH * ready)
79 {
80 UBYTE no_signalling_flag = NO_SIGNALLING;
81 T_RADIO_FRAME *frame = NULL;
82
83 GET_INSTANCE_DATA;
84 dl_data->dl_active = FALSE;
85
86 switch (ready->chn_mode)
87 {
88 case CM_SIGNALLING_ONLY:
89 /*
90 * Take over the behaviour of dll_read_dcch():
91 * No ch_type is given by the layer 1 for SDCCH and FACCH,
92 * the first parameter ch_type of the fuction dl1_uplink_ind() get a
93 * value set to zero.
94 */
95 no_signalling_flag = SIG_ONLY;
96 break;
97 default:
98 break;
99 }
100
101 frame = dl1_uplink_ind (0, no_signalling_flag);
102
103 if (frame)
104 {
105 l1test_return_mphc_read_dcch (frame);
106 }
107
108 MY_PFREE (ready);
109 }
110
111 GLOBAL void l1test_call_mphc_read_sacch (T_L1TEST_CALL_MPHC_READ_SACCH * ready)
112 {
113 T_RADIO_FRAME *frame = NULL;
114
115 GET_INSTANCE_DATA;
116 dl_data->dl_active = FALSE;
117
118 frame = dl1_uplink_ind (L2_CHANNEL_SACCH, SIG_ONLY);
119 if (frame)
120 {
121 l1test_return_mphc_read_sacch (frame);
122 }
123
124 MY_PFREE (ready);
125 }
126
127 /*
128 +--------------------------------------------------------------------+
129 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
130 | STATE : code ROUTINE : dph_ph_data_req |
131 +--------------------------------------------------------------------+
132
133 PURPOSE : Sending of a PH_DATA_REQ primitive.
134 Uplink for simulation.
135
136 */
137
138 GLOBAL void l1test_return_mphc_read_dcch (T_RADIO_FRAME * frame)
139 {
140 PALLOC(data_req, L1TEST_RETURN_MPHC_READ_DCCH);
141
142 TRACE_FUNCTION ("l1test_return_mphc_read_dcch()");
143
144 memcpy(data_req->l2_frame.frame_array, frame->frame_array, sizeof(data_req->l2_frame));
145 PSEND (hCommPL, data_req);
146 }
147
148 GLOBAL void l1test_return_mphc_read_sacch (T_RADIO_FRAME * frame)
149 {
150 PALLOC(data_req, L1TEST_RETURN_MPHC_READ_SACCH);
151
152 TRACE_FUNCTION ("l1test_return_mphc_read_sacch()");
153
154 memcpy(data_req->l2_frame.frame_array, frame->frame_array, sizeof(data_req->l2_frame));
155 PSEND (hCommPL, data_req);
156 }
157
158 /*
159 +--------------------------------------------------------------------+
160 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
161 | STATE : code ROUTINE : l1test_call_mphc_dcch_downlink |
162 +--------------------------------------------------------------------+
163
164 PURPOSE : Reception of a L1TEST_CALL_MPHC_DCCH_DOWNLINK primitive.
165
166 */
167
168 GLOBAL void l1test_call_mphc_dcch_downlink (T_L1TEST_CALL_MPHC_DCCH_DOWNLINK * data_ind)
169 {
170 /*
171 * Take over the behaviour of dll_dcch_downlink():
172 * No ch_type is given by the layer 1 for SDCCH and FACCH,
173 * the second parameter ch_type of the function dl_process_downlink() get a
174 * value set to zero.
175 */
176 dl_data->dl_active = FALSE;
177
178 dl_process_downlink (data_ind->valid_flag, 0, data_ind->l2_frame.frame_array, NOT_PRESENT_32BIT);
179
180 MY_PFREE (data_ind);
181 }
182 #endif /* _SIMULATION_ */
183
184 /*
185 +--------------------------------------------------------------------+
186 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
187 | STATE : code ROUTINE : dph_ph_data_ind |
188 +--------------------------------------------------------------------+
189
190 PURPOSE : Reception of a PH_DATA_IND primitive.
191 This function is only available in stacks >= TCS5 (DL_2TO1).
192 A function with the same name exist for the old GSM/GPRS stack.
193
194 It is used for SACCH downlink on target as well as on simulation.
195 In opposite to the old GSM/GPRS stack, a functional interface
196 (l1test_call_mphc_dcch_downlink) is used by the dual mode stack
197 implementation for SDCCH and FACCH during simulation. Therefore
198 this function is only used for SACCH.
199
200 */
201
202 GLOBAL void dph_ph_data_ind (T_MPHC_PH_DATA_IND * data_ind)
203 {
204 /*
205 * Take over the behaviour of dll_dcch_downlink():
206 * No ch_type is given by the layer 1 for SDCCH and FACCH,
207 * the second parameter ch_type of the function dl_process_downlink() get a
208 * value set to zero.
209 */
210
211 TRACE_FUNCTION ("dph_ph_data_ind() 2TO1");
212
213 if (data_ind->l2_channel_type EQ L2_CHANNEL_SACCH)
214 dl_process_downlink (data_ind->error_cause,
215 L2_CHANNEL_SACCH,
216 data_ind->l2_frame.frame_array,
217 NOT_PRESENT_32BIT);
218
219 MY_PFREE (data_ind);
220 }
221
222 #else /* DL_2TO1 */
223
224 #if defined(_SIMULATION_)
225 /*
226 +--------------------------------------------------------------------+
227 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
228 | STATE : code ROUTINE : dph_ph_ready_to_send |
229 +--------------------------------------------------------------------+
230
231 PURPOSE : Reception of a PH_READY_TO_SEND primitive.
232 Uplink opportunity for simulation.
233
234 */
235
236 GLOBAL void dph_ph_ready_to_send (T_PH_READY_TO_SEND * ready)
237 {
238 UBYTE no_signalling_flag = SIG_ONLY;
239 T_RADIO_FRAME *frame;
240 UBYTE ch_type;
241 switch (ready->ch_type)
242 {
243 case L2_CHANNEL_FACCH_F:
244 case L2_CHANNEL_FACCH_H:
245 no_signalling_flag = NO_SIGNALLING;
246 /*lint -fallthrough */
247 case L2_CHANNEL_SDCCH:
248 /*
249 * Take over the behaviour of dll_read_dcch():
250 * No ch_type is given by the layer 1 for SDCCH and FACCH,
251 * the first parameter ch_type of the function dl1_uplink_ind() get a
252 * value set to zero.
253 */
254 ch_type = 0;
255 break;
256 default:
257 ch_type = ready->ch_type;
258 break;
259 }
260
261 frame = dl1_uplink_ind (ch_type, no_signalling_flag);
262 if (frame)
263 {
264 PALLOC_SDU (data, PH_DATA_REQ, 23*BITS_PER_BYTE);/* T_PH_DATA_REQ */
265
266 /*
267 * In case the value of ready->ch_type was set to zero above it has to set
268 * to the value of dcch0_ch_type corresponding the behaviour of the
269 * function dl1_uplink_ind().
270 if (ready->ch_type EQ 0)
271 {
272 T_DL_DATA *dl_data = dl_get_data ();
273 ready->ch_type = dl_data->dcch0_ch_type ? dl_data->dcch0_ch_type : L2_CHANNEL_SDCCH;
274 }
275 */
276
277 memcpy (data->sdu.buf, frame, 23);/*lint !e419 (Warning -- Apparent data overrun) */
278 if (ready->ch_type EQ L2_CHANNEL_SACCH)
279 {
280 data->sdu.buf[0] = 0;/* layer 1 header occupies 2 bytes */
281 data->sdu.buf[1] = 0;/*lint !e415 (Warning -- access of out-of-bounds pointer) */
282 data->sdu.o_buf = 2 * BITS_PER_BYTE;
283 data->sdu.l_buf = 21 * BITS_PER_BYTE;
284 }
285 else
286 {
287 data->sdu.o_buf = 0;
288 data->sdu.l_buf = 23 * BITS_PER_BYTE;
289 }
290 data->ch_type = ready->ch_type;
291 dph_ph_data_req (data);
292 }
293
294 MY_PFREE (ready);
295 }
296
297 /*
298 +--------------------------------------------------------------------+
299 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
300 | STATE : code ROUTINE : dph_ph_data_req |
301 +--------------------------------------------------------------------+
302
303 PURPOSE : Sending of a PH_DATA_REQ primitive.
304 Uplink for simulation.
305
306 */
307
308 LOCAL void dph_ph_data_req (T_PH_DATA_REQ * data_req)
309 {
310 TRACE_FUNCTION ("dph_ph_data_req()");
311
312 #if defined(DL_TRACE_WIN32)
313 if (data_req->ch_type EQ L2_CHANNEL_SACCH)
314 {
315 /*lint -e416 (Warning -- creation of out-of-bounds pointer) */
316 FTRC (data_req->ch_type, data_req->sdu.buf+2, 1); /* uplink SACCH */
317 /*lint +e416 (Warning -- creation of out-of-bounds pointer) */
318 }
319 else
320 {
321 FTRC (data_req->ch_type, data_req->sdu.buf, 1); /* uplink other */
322 }
323 #endif /* DL_TRACE_WIN32 */
324
325 PSENDX (PL, data_req);
326 }
327 #endif /* _SIMULATION */
328
329 /*
330 +--------------------------------------------------------------------+
331 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
332 | STATE : code ROUTINE : dph_ph_data_ind |
333 +--------------------------------------------------------------------+
334
335 PURPOSE : Reception of a PH_DATA_IND primitive.
336 This function is only available in the old GSM/GPRS stack (<= TCS4).
337 A function with the same name exist for the dual mode stack.
338
339 It can be used for SACCH downlink on target as well as on simulation.
340 During simulation the old GSM/GPRS stack uses this primitive
341 function for SDCCH and FACCH also. In this case it takes over the
342 functional interface dll_dcch_downlink().
343 In the current implementation of the old GSM/GPRS stack the ALR
344 queue is exclusively used for incoming PH_DATA_IND primitives from
345 L1 for target builds. Only Acknowledged frames (SAPI=3) and frames
346 with Bter format (short PD header) are forwarded to DL and handled
347 by this function.
348
349 */
350
351 GLOBAL void dph_ph_data_ind (T_PH_DATA_IND * ph_data_ind)
352 {
353 if (ph_data_ind)
354 {
355 #if defined(_SIMULATION_)
356 /*
357 * Take over the behaviour of dll_dcch_downlink():
358 * No ch_type is given by the layer 1 for SDCCH and FACCH,
359 * the first parameter ch_type of the function dl_process_downlink() get a
360 * value set to zero.
361 */
362 switch (ph_data_ind->l2_channel_type)
363 {
364 case L2_CHANNEL_SDCCH:
365 case L2_CHANNEL_FACCH_F:
366 case L2_CHANNEL_FACCH_H:
367 ph_data_ind->l2_channel_type = 0;
368 break;
369 default:
370 break;
371 }
372 #else /* _SIMULATION */
373 if (ph_data_ind->l2_channel_type EQ L2_CHANNEL_SACCH)
374 #endif /* _SIMULATION */
375 dl_process_downlink (ph_data_ind->error_cause,
376 ph_data_ind->l2_channel_type,
377 ph_data_ind->l2_frame.A,
378 NOT_PRESENT_32BIT);
379
380 MY_PFREE (ph_data_ind);
381 }
382 }
383 #endif /* DL_2TO1 */
384
385 /*
386 +--------------------------------------------------------------------+
387 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
388 | STATE : code ROUTINE : dl_process_downlink |
389 +--------------------------------------------------------------------+
390
391 PURPOSE : really processing of layer 2 frame downlink.
392
393 */
394 LOCAL void dl_process_downlink (UBYTE error_flag, UBYTE channel_type, UBYTE * frame, ULONG fn)
395 {
396 GET_INSTANCE_DATA;
397
398 TRACE_FUNCTION ("dll_process_downlink()");
399
400 /* set the active dedicated channel type if necessary */
401 if (channel_type EQ 0)
402 {
403 TRACE_EVENT_WIN_P3 ("dl_process_downlink(%u,) -> ch=%u FN=%d", channel_type, dl_data->dcch0_ch_type, ((int)fn));
404 channel_type = dl_data->dcch0_ch_type ? dl_data->dcch0_ch_type : L2_CHANNEL_SDCCH;
405 }
406 else
407 {
408 TRACE_EVENT_WIN_P1 ("dl_process_downlink(%u,)", channel_type);
409 }
410
411 if (channel_type NEQ L2_CHANNEL_SACCH)
412 dl_data->interrupt_context = TRUE;
413
414 if (fn NEQ NOT_PRESENT_32BIT)
415 dl_data->fn = fn;
416
417 #if defined(DL_TRACE_ENABLED)
418 {
419 UCHAR trace_channel = TRACE_CH_UNKNOWN;
420 UCHAR frame_sapi;
421
422 switch (channel_type)
423 {
424 case L2_CHANNEL_SACCH:
425 frame_sapi = ((*(frame + 2)) & 0x1c) >> 2;
426 if (frame_sapi EQ PS_SAPI_0)
427 trace_channel = C_DCCH0;
428 else if (frame_sapi EQ PS_SAPI_3)
429 trace_channel = C_DCCH3;
430 break;
431 case L2_CHANNEL_SDCCH:
432 frame_sapi = ((*frame) & 0x1c) >> 2;
433 if (frame_sapi EQ PS_SAPI_0)
434 trace_channel = C_DCCH0;
435 else if (frame_sapi EQ PS_SAPI_3)
436 trace_channel = C_DCCH3;
437 break;
438 case L2_CHANNEL_FACCH_F:
439 case L2_CHANNEL_FACCH_H:
440 frame_sapi = ((*frame) & 0x1c) >> 2;
441 if (frame_sapi EQ PS_SAPI_0)
442 trace_channel = C_DCCH0;
443 break;
444 default:
445 break;
446 }/* endswitch chan */
447 if (error_flag EQ VALID_BLOCK)
448 {
449 DL_OFFLINE_TRACE (TRACE_DOWNLINK, trace_channel, channel_type, &frame[0]);
450 }
451 }
452 #endif /* DL_TRACE_ENABLED */
453
454 #if defined(DL_TRACE_WIN32)
455 if (error_flag EQ VALID_BLOCK)
456 {
457 if (channel_type EQ L2_CHANNEL_SACCH)
458 FTRC (channel_type, frame+2, 0); /* downlink SACCH */
459 else
460 FTRC (channel_type, frame, 0); /* downlink other */
461 }
462 #endif /* DL_TRACE_WIN32 */
463
464 if (channel_type EQ 0)
465 {
466 DL_OFFLINE_TRACE (TRACE_DL_EVENT, TRACE_CH_UNKNOWN, channel_type, "DL:no valid channel type");
467 }
468 else
469 {
470 dl_downlink (error_flag, channel_type, &frame[0], fn);
471 }
472
473 dl_data->interrupt_context = FALSE;
474 }
475
476 /*
477 +--------------------------------------------------------------------+
478 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
479 | STATE : code ROUTINE : dl1_uplink_ind |
480 +--------------------------------------------------------------------+
481
482 PURPOSE : Functional Interface for the uplink direction of the
483 logical channels SACCH/SDCCH/FACCH.
484 (only used by the target)
485
486 */
487 GLOBAL T_RADIO_FRAME * dl1_uplink_ind (UBYTE channel_type, UBYTE no_signalling_flag)
488 {
489 T_RADIO_FRAME * pRadioFrame;
490 UCHAR channel;
491 UCHAR sapi;
492 UCHAR signalling = SIG_ONLY;
493
494 GET_INSTANCE_DATA;
495
496 dl_data->interrupt_context = TRUE;
497
498 /* set the active dedicated channel type if necessary */
499 if (channel_type EQ 0)
500 channel_type = dl_data->dcch0_ch_type;
501
502 TRACE_EVENT_WIN_P1 ("dl1_uplink_ind(ch_type=%u,)", channel_type);
503
504 switch (channel_type)
505 {
506 case L2_CHANNEL_SACCH:
507 /*
508 * The priority arrangement on the SACCH must ensure that if a SAPI = 3
509 * frame is awaiting transmission, two SAPI = 0 frames are not sent in
510 * consecutive SACCH frames. In addition, for the mobile to network
511 * direction it must also be ensured that any SAPI = 3 frame is followed
512 * by at least one SAPI = 0 frame.
513 *
514 * SAPI = 3 is set as default value. The function dl_uplink() together with
515 * the variable 'sacch_last_uplink_sapi' determind the actual value.
516 * e.g. if last uplinked SACCH frame was one with SAPI=3
517 * or
518 * if no SACCH SAPI=3 frame is awaiting transmission
519 * then a SACCH SAPI=0 frame should be uplinked
520 */
521 channel = C_SACCH0;
522 sapi = PS_SAPI_3;
523 TRACE_EVENT_WIN_P2 ("dl1_uplink_ind(%s, %s)",
524 CH_TYPE_NAME[channel_type], signalling EQ SIG_ONLY?"SIG_ONLY":"NO_SIGNALLING");
525 break;
526
527 default:
528 TRACE_ERROR ("dl1_uplink_ind():no valid channel type, use SDCCH instead");
529 channel_type = L2_CHANNEL_SDCCH;
530 /*lint -fallthrough*/
531 case L2_CHANNEL_FACCH_F:
532 case L2_CHANNEL_FACCH_H:
533 case L2_CHANNEL_SDCCH:
534 /*
535 * build frame for SAPI = 3 will be called (with lower priority)
536 * if no data is waiting for SAPI = 0.
537 */
538 channel = C_DCCH0;
539 sapi = PS_SAPI_0;
540 dl_data->cch[channel].ch_type = channel_type;
541 signalling = no_signalling_flag;
542 TRACE_EVENT_WIN_P3 ("dl1_uplink_ind(%s, %s) SAPI=%u",
543 CH_TYPE_NAME[channel_type], signalling EQ SIG_ONLY?"SIG_ONLY":"NO_SIGNALLING",
544 sapi);
545 break;
546 }
547
548 pRadioFrame= dl_uplink (channel, sapi, signalling, FALSE);
549 if (pRadioFrame)
550 {
551 #ifndef DL_2TO1
552 DL_OFFLINE_TRACE (TRACE_UPLINK, channel, channel_type, &pRadioFrame->A[0]);
553 #else
554 DL_OFFLINE_TRACE (TRACE_UPLINK, channel, channel_type, &pRadioFrame->frame_array[0]);
555 #endif
556 }
557
558 dl_data->interrupt_context = FALSE;
559 return pRadioFrame; /* return pointer to frame to layer 1 */
560 }
561
562 #if defined(DL_2TO1) || defined(USE_L1M_GS001_1)
563 /*
564 +--------------------------------------------------------------------+
565 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
566 | STATE : code ROUTINE : convert_dcch_ch_type |
567 +--------------------------------------------------------------------+
568
569 PURPOSE : Converts dedicated channel types to layer 2 channel types
570 according to L1M_GS001_1 and L1M_GS001_3.
571
572 */
573 LOCAL U8 convert_dcch_ch_type (U8 channel_type)
574 {
575 UBYTE ch_type;
576 switch (channel_type)
577 {
578 case MPHC_CH_TCH_F: ch_type = L2_CHANNEL_FACCH_F;break;
579 case MPHC_CH_TCH_H: ch_type = L2_CHANNEL_FACCH_H;break;
580 case MPHC_CH_SDCCH_4:
581 case MPHC_CH_SDCCH_8:ch_type = L2_CHANNEL_SDCCH;break;
582 }
583 return ch_type;
584 }
585 #endif /* DL_2TO1 || USE_L1M_GS001_1 */
586
587 /*
588 +--------------------------------------------------------------------+
589 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
590 | STATE : code ROUTINE : dll_read_dcch |
591 +--------------------------------------------------------------------+
592
593 PURPOSE : Functional Interface for the uplink direction of
594 SDCCH/FACCH. Only used by the TI target, look into
595 TI interface S922 or L1M_GS001_1.
596
597 */
598 #if defined(DL_2TO1) || defined(USE_L1M_GS001_1)
599 GLOBAL T_RADIO_FRAME * dll_read_dcch (U8 chn_mode, U8 channel_type)
600 {
601 return dl1_uplink_ind(convert_dcch_ch_type(channel_type), chn_mode);
602 }
603 #else /* DL_2TO1 || USE_L1M_GS001_1 */
604 GLOBAL T_RADIO_FRAME * dll_read_dcch (U8 chn_mode)
605 {
606 /* 0 stands for the currently active SDCCH and FACCH channel type */
607 return dl1_uplink_ind(0, chn_mode);
608 }
609 #endif /* DL_2TO1 || USE_L1M_GS001_1 */
610
611 /*
612 +--------------------------------------------------------------------+
613 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
614 | STATE : code ROUTINE : dll_read_sacch |
615 +--------------------------------------------------------------------+
616
617 PURPOSE : Functional Interface for the uplink direction of SACCH.
618 Only used by the TI target, look into
619 TI interface S922 or L1M_GS001_1.
620
621 */
622 GLOBAL T_RADIO_FRAME * dll_read_sacch (UBYTE chn_mode)
623 {
624 return dl1_uplink_ind (L2_CHANNEL_SACCH, SIG_ONLY);
625 }
626
627 /*
628 +--------------------------------------------------------------------+
629 | PROJECT : GSM-PS (6147) MODULE : DL_DPH |
630 | STATE : code ROUTINE : dll_dcch_downlink |
631 +--------------------------------------------------------------------+
632
633 PURPOSE : Functional Interface for the downlink direction of
634 FACCH/DCCH. Only used by the TI target, look into
635 TI interface S922 or L1M_GS001_1.
636
637 */
638 #if defined(DL_2TO1) || defined(USE_L1M_GS001_1)
639 GLOBAL void dll_dcch_downlink(U32 * data_ptr, U8 valid_flag, U8 channel_type, U32 fn)
640 {
641 if ((data_ptr NEQ NULL) AND (valid_flag EQ DATA_VALID))
642 {
643 dl_process_downlink (VALID_BLOCK, convert_dcch_ch_type(channel_type),
644 (UBYTE *)data_ptr, fn);
645 }
646 }
647 #else /* DL_2TO1 || USE_L1M_GS001_1 */
648 #if defined(SEND_FN_TO_L2_IN_DCCH) && (SEND_FN_TO_L2_IN_DCCH == 1)
649 GLOBAL void dll_dcch_downlink(U32 * data_ptr, U8 valid_flag, U32 fn)
650 {
651 if ((data_ptr NEQ NULL) AND valid_flag)
652 {
653 /*
654 * channel type 0 stands for currently active dedicated
655 * SDCCH or FACCH channel type
656 */
657 dl_process_downlink (VALID_BLOCK, 0, (UBYTE *)data_ptr, fn);
658 }
659 }
660 #else /* SEND_FN_TO_L2_IN_DCCH == 1 */
661 GLOBAL void dll_dcch_downlink(U32 * data_ptr, U8 valid_flag)
662 {
663 if ((data_ptr NEQ NULL) AND valid_flag)
664 {
665 /*
666 * channel type 0 stands for currently active dedicated
667 * SDCCH or FACCH channel type
668 */
669 dl_process_downlink (VALID_BLOCK, 0, (UBYTE *)data_ptr, NOT_PRESENT_32BIT);
670 }
671 }
672 #endif /* SEND_FN_TO_L2_IN_DCCH == 1 */
673 #endif /* DL_2TO1 || USE_L1M_GS001_1 */
674 #endif /* DL_DPH_C */