comparison src/g23m-fad/fad/fad_rbm.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
comparison
equal deleted inserted replaced
0:b6a5e36de839 1:d393cd9bb723
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-F&D (8411)
4 | Modul : FAD_RBM
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 receive buffer manager for
18 | the component Fax Adaptation 3.45 of the mobile station
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef FAD_RBM_C
23 #define FAD_RBM_C
24 #endif
25
26 #define ENTITY_FAD
27
28 /*==== INCLUDES ===================================================*/
29
30 #include <string.h>
31 #include "typedefs.h"
32 #include "pconst.cdg"
33 #include "vsi.h"
34 #include "custom.h"
35 #include "gsm.h"
36 #include "cnf_fad.h"
37 #include "mon_fad.h"
38 #include "prim.h"
39 #include "pei.h"
40 #include "tok.h"
41 #include "ccdapi.h"
42 #include "fad.h"
43 #include "ra_l1int.h"
44
45 /*==== CONST =======================================================*/
46
47 /*==== TYPES =======================================================*/
48
49 /*==== VAR EXPORT ==================================================*/
50
51 /*==== VAR LOCAL ===================================================*/
52
53 /*==== FUNCTIONS ===================================================*/
54
55 /*
56 +--------------------------------------------------------------------+
57 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
58 | STATE : code ROUTINE : rbmi_alloc_curr_prim |
59 +--------------------------------------------------------------------+
60
61 PURPOSE :
62
63 */
64
65 LOCAL BOOL rbmi_alloc_curr_prim(void)
66 {
67 T_RBM_FAD *rbm = &fad_data->rbm;
68
69 PALLOC_SDU (fad_data_ind, FAD_DATA_IND, (USHORT)(rbm->FramesPerPrim * FRAME_SIZE * 8));
70
71 TRACE_FUNCTION ("rbmi_alloc_curr_prim()");
72
73 fad_data_ind->sdu.l_buf = 0;
74 fad_data_ind->sdu.o_buf = 0;
75
76 rbm->CurrPrim = fad_data_ind;
77 rbm->FramesInCurrPrim = 0;
78
79 return (rbm->CurrPrim NEQ NULL);
80 }
81
82 /*
83 +--------------------------------------------------------------------+
84 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
85 | STATE : code ROUTINE : rbm_init |
86 +--------------------------------------------------------------------+
87
88 PURPOSE :
89
90 */
91
92 GLOBAL void rbm_init(USHORT framesPerPrim)
93 {
94 T_RBM_FAD *rbm = &fad_data->rbm;
95
96 TRACE_FUNCTION ("rbm_init()");
97
98 cl_ribu_create(&rbm->ribu, MAX_SDU_SIZE, DL_RIBU_DEPTH);
99 rbm->FramesPerPrim = framesPerPrim;
100 rbm_deinit(FALSE);
101
102 if (rbmi_alloc_curr_prim())
103 rbm->Initialised = TRUE;
104 }
105
106 /*
107 +--------------------------------------------------------------------+
108 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
109 | STATE : code ROUTINE : rbm_deinit |
110 +--------------------------------------------------------------------+
111
112 PURPOSE : This function frees all allocated T_FAD_DATA_IND primitives
113 of the receive buffer manager.
114
115 */
116
117 GLOBAL void rbm_deinit(BOOL final)
118 {
119 T_RBM_FAD *rbm = &fad_data->rbm;
120 U8 n;
121
122 TRACE_FUNCTION ("rbm_deinit()");
123
124 rbm->Initialised = FALSE;
125
126 if (rbm->CurrPrim NEQ (T_FAD_DATA_IND *)NULL)
127 {
128 PFREE (rbm->CurrPrim)
129 rbm->CurrPrim = (T_FAD_DATA_IND *) NULL;
130 }
131
132 for (n = 0; n < RBM_PQ_SIZE; n++)
133 {
134 if (rbm->PQ_Array[rbm->PQ.ri] NEQ (T_FAD_DATA_IND *)NULL)
135 {
136 PFREE (rbm->PQ_Array[rbm->PQ.ri])
137 rbm->PQ_Array[rbm->PQ.ri] = (T_FAD_DATA_IND *)NULL;
138 }
139 }
140 cl_ribu_init(&rbm->PQ, RBM_PQ_SIZE);
141 rbm->FramesInCurrPrim = 0;
142
143 if (final EQ TRUE) /* during deactivation */
144 {
145 cl_ribu_release(&rbm->ribu); /* frees downlink FIFO */
146 }
147 }
148
149 /*
150 +--------------------------------------------------------------------+
151 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
152 | STATE : code ROUTINE : rbmi_pq_enq |
153 +--------------------------------------------------------------------+
154
155 PURPOSE : A primitive is put into the primitive queue.
156
157 */
158
159 LOCAL BOOL rbmi_pq_enq(T_FAD_DATA_IND *prim)
160 {
161 T_RBM_FAD *rbm = &fad_data->rbm;
162
163 TRACE_FUNCTION ("rbmi_pq_enq()");
164
165 if (rbm->PQ_Array[rbm->PQ.wi] EQ NULL)
166 {
167 /*
168 * empty PQ entry found
169 */
170 prim->sdu.l_buf = rbm->FramesPerPrim * FRAME_SIZE * 8;
171
172 rbm->PQ_Array[cl_ribu_write_index(&rbm->PQ)] = prim;
173 return TRUE;
174 }
175 else
176 return FALSE; /* no available entry in PQ */
177 }
178
179 /*
180 +--------------------------------------------------------------------+
181 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
182 | STATE : code ROUTINE : rbmi_copy_frame_to_curr_prim |
183 +--------------------------------------------------------------------+
184
185 PURPOSE :
186
187 */
188
189 LOCAL BOOL rbmi_copy_frame_to_curr_prim(UBYTE *frame)
190 {
191 T_RBM_FAD *rbm = &fad_data->rbm;
192
193 TRACE_FUNCTION ("rbmi_copy_frame_to_curr_prim()");
194
195 if (rbm->CurrPrim EQ NULL)
196 if (!rbmi_alloc_curr_prim())
197 return FALSE;
198
199 if (rbm->FramesInCurrPrim < rbm->FramesPerPrim)
200 {
201 memcpy(&rbm->CurrPrim->sdu.buf[rbm->FramesInCurrPrim * FRAME_SIZE], frame, FRAME_SIZE);
202 rbm->FramesInCurrPrim++;
203 }
204
205 if (rbm->FramesInCurrPrim >= rbm->FramesPerPrim)
206 {
207 /*
208 * Current primitive is full.
209 * Store it in the PQ and allocate a new current prim
210 */
211 if (rbmi_pq_enq(rbm->CurrPrim))
212 {
213 /*
214 * Current prim is in PQ -> allocate a new current prim
215 */
216 return rbmi_alloc_curr_prim();
217 }
218 else
219 {
220 return FALSE;
221 }
222 }
223 return TRUE;
224 }
225
226 /*
227 +--------------------------------------------------------------------+
228 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
229 | STATE : code ROUTINE : rbmi_pq_deq |
230 +--------------------------------------------------------------------+
231
232 PURPOSE : A fad_data_ind primitive is taken from the queue. This
233 is done when the queue is not empty and a FAD_GETDATA_REQ
234 is executed. Of after storing a primitive in the queue,
235 when the upper layer is waiting for data.
236
237 */
238
239 LOCAL T_FAD_DATA_IND *rbmi_pq_deq(void)
240 {
241 T_RBM_FAD *rbm = &fad_data->rbm;
242 T_FAD_DATA_IND *prim = rbm->PQ_Array[rbm->PQ.ri];
243
244 TRACE_FUNCTION ("rbmi_pq_deq()");
245
246 if (prim NEQ NULL)
247 {
248 rbm->PQ_Array[cl_ribu_read_index(&rbm->PQ)] = NULL;
249 }
250 return prim;
251 }
252
253 /*
254 +--------------------------------------------------------------------+
255 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
256 | STATE : code ROUTINE : rbm_reset |
257 +--------------------------------------------------------------------+
258
259 PURPOSE : This function must be called once at startup before any
260 other procedures of the RBM is invoked. (Coldstart)
261
262 */
263
264 GLOBAL void rbm_reset(void)
265 {
266 T_RBM_FAD *rbm = &fad_data->rbm;
267
268 TRACE_FUNCTION ("rbm_reset()");
269
270 rbm->CurrPrim = (T_FAD_DATA_IND *) NULL;
271 rbm->FramesInCurrPrim = 0;
272 cl_ribu_init(&rbm->PQ, RBM_PQ_SIZE);
273 rbm->FramesPerPrim = 1;
274 rbm->Initialised = FALSE;
275 }
276
277 /*
278 +--------------------------------------------------------------------+
279 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
280 | STATE : code ROUTINE : rbm_store_frames |
281 +--------------------------------------------------------------------+
282
283 PURPOSE : This procedure is only used in the simulation environment
284 to store multiple frames in the receive buffer.
285 In the implementation the copy is performed by the RA layer
286 which have access to the shared memory area of the DSP.
287 */
288
289 GLOBAL BOOL rbm_store_frames(T_FD *pFD, BOOL *primIsReady)
290 {
291 T_RBM_FAD *rbm = &fad_data->rbm;
292
293 if (rbm->Initialised)
294 {
295 USHORT n;
296 BOOL flag = FALSE;
297
298 for (n = 0; n < pFD->len/FRAME_SIZE; n++)
299 {
300 if (!rbmi_copy_frame_to_curr_prim(&pFD->buf[n * FRAME_SIZE]))
301 {
302 flag = TRUE;
303 break;
304 }
305 }
306 if (flag)
307 return FALSE;
308 }
309 *primIsReady = rbm->PQ.filled;
310 return TRUE;
311 }
312
313 /*
314 +--------------------------------------------------------------------+
315 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
316 | STATE : code ROUTINE : rbm_get_prim |
317 +--------------------------------------------------------------------+
318
319 PURPOSE : This is just a wrapper for rbmi_pq_deq. The queu is an
320 internal matter of the RBM, therefore the function
321 rbmi_pq_deq should not be used directly by the user.
322
323 */
324
325 GLOBAL T_FAD_DATA_IND *rbm_get_prim(void)
326 {
327 TRACE_FUNCTION ("rbm_get_prim()");
328
329 return rbmi_pq_deq();
330 }
331
332 /*
333 +--------------------------------------------------------------------+
334 | PROJECT : GSM-F&D (8411) MODULE : FAD_RBM |
335 | STATE : code ROUTINE : rbm_get_curr_prim |
336 +--------------------------------------------------------------------+
337
338 PURPOSE :
339
340 */
341
342 GLOBAL T_FAD_DATA_IND *rbm_get_curr_prim(void)
343 {
344 T_RBM_FAD *rbm = &fad_data->rbm;
345 T_FAD_DATA_IND *prim;
346
347 TRACE_FUNCTION ("rbm_get_curr_prim()");
348
349 prim = rbm->CurrPrim;
350 if (prim NEQ NULL)
351 {
352 rbm->CurrPrim->sdu.l_buf = rbm->FramesInCurrPrim * FRAME_SIZE * 8;
353 rbm->CurrPrim = (T_FAD_DATA_IND *) NULL;
354 }
355 return prim;
356 }
357