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