comparison src/g23m-fad/fad/fad_sbm.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_SBM
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 send buffer manager for
18 | the component Fax Adaptation 3.45 of the mobile station
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef FAD_SBM_C
23 #define FAD_SBM_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 "cl_ribu.h"
43 #include "fad.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_SBM |
58 | STATE : code ROUTINE : sbm_init |
59 +--------------------------------------------------------------------+
60
61 PURPOSE :
62
63 */
64 GLOBAL void sbm_init(USHORT frameSize)
65 {
66 T_SBM *sbm = &fad_data->sbm;
67 USHORT n;
68
69 TRACE_FUNCTION ("sbm_init()");
70
71 cl_ribu_init(&sbm->ribu, SBM_PRIMBUF_SIZE);
72
73 for (n = 0; n < sbm->ribu.depth; n++)
74 sbm->Prim[n].Prim = NULL;
75
76 sbm->PA = 0;
77 sbm->CurrPrimOff = 0;
78 sbm->CurrPrimLen = 0;
79 sbm->FrameSize = frameSize;
80
81 fad_data->snd.FD.buf = fad_data->snd.FD_buf;
82 }
83
84 /*
85 +--------------------------------------------------------------------+
86 | PROJECT : GSM-F&D (8411) MODULE : FAD_SBM |
87 | STATE : code ROUTINE : sbm_store_prim |
88 +--------------------------------------------------------------------+
89
90 PURPOSE :
91
92 */
93
94 GLOBAL void sbm_store_prim(T_SBM_PRIM *sendPrim)
95 {
96 T_SBM *sbm = &fad_data->sbm;
97
98 #ifdef _SIMULATION_
99 TRACE_FUNCTION ("sbm_store_prim()");
100 #endif
101
102 sbm->Prim[sbm->ribu.wi].Prim = sendPrim;
103
104 if (!sbm->ribu.filled) /* Initialize new primitive for read out */
105 {
106 sbm->CurrPrimOff = sendPrim->sdu.o_buf >> 3;
107 sbm->CurrPrimLen = sendPrim->sdu.l_buf >> 3;
108 }
109 cl_ribu_write_index(&sbm->ribu);
110 }
111
112 /*
113 +--------------------------------------------------------------------+
114 | PROJECT : GSM-F&D (8411) MODULE : FAD_SBM |
115 | STATE : code ROUTINE : sbm_free_empty_prims|
116 +--------------------------------------------------------------------+
117
118 PURPOSE :
119
120 */
121
122 GLOBAL void sbm_free_empty_prims(void)
123 {
124 T_SBM *sbm = &fad_data->sbm;
125
126 #ifdef _SIMULATION_
127 TRACE_FUNCTION ("sbm_free_empty_prims()");
128 #endif
129
130 while (sbm->PA NEQ sbm->ribu.ri)
131 {
132 PFREE (sbm->Prim[sbm->PA].Prim);
133 sbm->PA++;
134 if (sbm->PA EQ sbm->ribu.depth)
135 sbm->PA = 0;
136 }
137 }
138
139 /*
140 +--------------------------------------------------------------------+
141 | PROJECT : GSM-F&D (8411) MODULE : FAD_SBM |
142 | STATE : code ROUTINE : sbm_get_frame |
143 +--------------------------------------------------------------------+
144
145 PURPOSE :
146
147 */
148
149 GLOBAL BOOL sbm_get_frame(T_FRAME_DESC *ul_FD, UBYTE reqFrames)
150 {
151 T_SBM *sbm = &fad_data->sbm;
152
153 USHORT requiredData;
154 BOOL insertSync;
155
156 #ifdef _SIMULATION_
157 TRACE_FUNCTION ("sbm_get_frame()");
158 #endif
159
160 cl_set_frame_desc_0(ul_FD, NULL, 0);
161
162 if (!sbm->ribu.filled) /* There is no primitive */
163 {
164 return FALSE;
165 }
166
167 insertSync = FALSE;
168
169 if (sbm->syncCycle NEQ SYNC_CYCLE_NONE)
170 {
171 if (reqFrames > sbm->framesUntilSync)
172 {
173 insertSync = TRUE;
174 reqFrames--;
175 }
176 else
177 sbm->framesUntilSync -= reqFrames;
178 }
179
180 requiredData = sbm->FrameSize * (USHORT)reqFrames;
181
182 if (sbm->CurrPrimLen > requiredData)
183 {
184 /* Current primitive holds more than enough data */
185 cl_set_frame_desc_0(ul_FD, sbm->Prim[sbm->ribu.ri].Prim->sdu.buf + sbm->CurrPrimOff, requiredData);
186
187 sbm->CurrPrimOff += requiredData;
188 sbm->CurrPrimLen -= requiredData;
189 }
190 else
191 {
192 /*
193 * Current primitive doesn't hold enough data
194 * or just the right amount of data.
195 * -> Switch to next primitive
196 */
197
198 /* Take all data from first primitive */
199 cl_set_frame_desc_0(ul_FD, sbm->Prim[sbm->ribu.ri].Prim->sdu.buf + sbm->CurrPrimOff, sbm->CurrPrimLen);
200
201 cl_ribu_read_index(&sbm->ribu); /* Switch to next primitive */
202
203 if (!sbm->ribu.filled) /* There is no second primitive */
204 {
205 ul_FD->Adr[1] = (UBYTE *) NULL;
206 ul_FD->Len[1] = 0;
207 sbm->CurrPrimOff = 0;
208 sbm->CurrPrimLen = 0;
209 }
210 else /* Second primitive is available */
211 {
212 requiredData -= sbm->CurrPrimLen;
213
214 sbm->CurrPrimOff = sbm->Prim[sbm->ribu.ri].Prim->sdu.o_buf >> 3;
215 sbm->CurrPrimLen = sbm->Prim[sbm->ribu.ri].Prim->sdu.l_buf >> 3;
216
217 if (requiredData EQ 0)
218 {
219 /*
220 * First primitive was just used up.
221 * We had to switch to next primitive, but don't need data.
222 */
223 ul_FD->Adr[1] = (UBYTE *) NULL;
224 ul_FD->Len[1] = 0;
225 }
226 else
227 {
228 /* Data from next primitive is required */
229 ul_FD->Adr[1] = sbm->Prim[sbm->ribu.ri].Prim->sdu.buf + sbm->CurrPrimOff;
230
231 if (sbm->CurrPrimLen > requiredData)
232 {
233 /* Enough data found in second primitive */
234 ul_FD->Len[1] = requiredData;
235 sbm->CurrPrimOff += requiredData;
236 sbm->CurrPrimLen -= requiredData;
237 }
238 else
239 {
240 /* Even with the second primitive there are not enough data! */
241 ul_FD->Len[1] = sbm->CurrPrimLen;
242
243 /* Second primitive is also emptied, switch to next primitve */
244 cl_ribu_read_index(&sbm->ribu);
245
246 if (sbm->ribu.filled)
247 {
248 sbm->CurrPrimOff = sbm->Prim[sbm->ribu.ri].Prim->sdu.o_buf >> 3;
249 sbm->CurrPrimLen = sbm->Prim[sbm->ribu.ri].Prim->sdu.l_buf >> 3;
250
251 }
252 else
253 {
254 sbm->CurrPrimOff = 0;
255 sbm->CurrPrimLen = 0;
256 }
257 }
258 }
259 }
260 }
261
262 if ((ul_FD->Len[0]+ul_FD->Len[1]) < requiredData)
263 {
264 /*
265 * If there are not enough data available align the length to 64 bit
266 * align the length to 64 bit boundaries.
267 * This alignment should normally occur at the end of the message phase.
268 * The required data are always a multiple of 64 bits.
269 */
270 int i, k = 0;
271 int diff = requiredData - (ul_FD->Len[0]+ul_FD->Len[1]);
272
273 if (ul_FD->Len[1] > 0)
274 k = 1;
275
276 for (i = 0; i < ul_FD->Len[k]; i++)
277 fad_data->snd.ul_FD_align[i] = ul_FD->Adr[k][i];
278
279 for (i = ul_FD->Len[k]; i < ul_FD->Len[k] + diff; i++)
280 fad_data->snd.ul_FD_align[i] = 0;
281
282 ul_FD->Len[k] += diff;
283 ul_FD->Adr[k] = fad_data->snd.ul_FD_align;
284 }
285
286 if (insertSync)
287 {
288 USHORT framesUntilSync = sbm->framesUntilSync;
289 USHORT frame_off = 0, i, j;
290
291 for (i=0; i<2; i++)
292 {
293 for (j=0; j<ul_FD->Len[i]; j+=FRAME_SIZE)
294 {
295 if (framesUntilSync-- EQ 0)
296 {
297 memcpy((char*)&sbm->frames[frame_off], (char*)FR_SEQ_SYNC, FRAME_SIZE);
298 frame_off+=FRAME_SIZE;
299 }
300 memcpy((char*)&sbm->frames[frame_off], (char*)ul_FD->Adr[i], FRAME_SIZE);
301 frame_off+=FRAME_SIZE;
302
303 sbm->framesUntilSync = sbm->syncCycle - reqFrames + framesUntilSync;
304 }
305 }
306 cl_set_frame_desc_0(ul_FD, sbm->frames, (USHORT)((reqFrames+1)*FRAME_SIZE));
307 }
308 return TRUE;
309 }
310