comparison gsm-fw/ccd/freq_list.c @ 648:970d6199f2c5

gsm-fw/ccd/*.[ch]: initial import from the LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Thu, 04 Sep 2014 05:48:57 +0000
parents
children
comparison
equal deleted inserted replaced
647:a60b375014e3 648:970d6199f2c5
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : CCD
4 | Modul : freq_list.c
5 +-----------------------------------------------------------------------------
6 | Copyright 2004 Texas Instruments Deutschland GmbH
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Deutschland GmbH
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 Deutschland GmbH.
16 +-----------------------------------------------------------------------------
17 | Purpose : Definition of decoding function for FREQ_LIST type
18 +-----------------------------------------------------------------------------
19 */
20
21 #define FREQ_LIST_C
22
23 /*
24 * standard definitions like GLOBAL, UCHAR, ERROR etc.
25 */
26 #include "typedefs.h"
27 #include "header.h"
28
29 #include "string.h"
30
31 /*
32 * Types and functions for bit access and manipulation
33 */
34 #include "ccd_globs.h"
35 #include "bitfun.h"
36
37 /*
38 * Prototypes of ccd internal functions
39 */
40 #include "ccd.h"
41
42 /*
43 * Declaration of coder/decoder tables
44 */
45 #include "ccdtable.h"
46 /*
47 * Function prototypes of CCD-CCDDATA interface
48 */
49 #include "ccddata.h"
50
51
52 #if !(defined (CCD_TEST))
53 #include "vsi.h"
54 #endif
55
56 #ifndef RUN_INT_RAM
57 /*
58 * Attention: in this file all static and global functions as well as
59 * the static data are controlled by one RUN_.. clause.
60 * The static data and functions are currently only used in the decode
61 * function, whereas encoding is not yet available.
62 */
63 static U16 first;
64 static U16 last;
65 static U16 num;
66
67
68 /*
69 * The W-parameter in the 256 range start from bit 7 of the
70 * information element. The following table indicate the number
71 * of W-parameters and their length in bits. A length of zero
72 * indicated the end of the table.
73 */
74 static const T_W_PARAM param_256[10] =
75 {
76 /*
77 * length count
78 */
79 10, 1,
80 8, 1,
81 7, 2,
82 6, 4,
83 5, 8,
84 4, 16,
85 3, 32,
86 2, 64,
87 1, 128,
88 0, 0
89 };
90
91 /*
92 * The W-parameter in the 128 range start from bit 7 of the
93 * information element. The following table indicate the number
94 * of W-parameters and their length in bits. A length of zero
95 * indicated the end of the table.
96 */
97
98 static const T_W_PARAM param_128[9] =
99 {
100 /*
101 * length count
102 */
103 10, 1,
104 7, 1,
105 6, 2,
106 5, 4,
107 4, 8,
108 3, 16,
109 2, 32,
110 1, 64,
111 0, 0
112 };
113
114 /*
115 * Compare results of the first channel with those of the others
116 * to find the dimensions.
117 */
118 static void completeAddInfo (U8 *BitmapInStruct)
119 {
120 *(U16*) (BitmapInStruct - 2) += num;
121 if (*(U16*) (BitmapInStruct - 6) > first)
122 *(U16*) (BitmapInStruct - 6) = first;
123 if (*(U16*) (BitmapInStruct - 4) < last)
124 *(U16*) (BitmapInStruct - 6) = last;
125 }
126
127 static void setFirstChanNr (U8 *BitmapInStruct, short w0)
128 {
129 U16 bitposition;
130 bitposition = (w0 == 0) ? 0 : (U16)(BITOFFSET_LIST - w0);
131 BitmapInStruct[bitposition >> 3] |= ByteBitMask[bitposition & 7];
132 first = bitposition;
133 last = bitposition;
134 num = 1;
135 }
136 /*
137 +--------------------------------------------------------------------+
138 | PROJECT : CCD MODULE : cdc_freq_list_decode |
139 +--------------------------------------------------------------------+
140 PURPOSE : The function creates a frequency hopping list from one of
141 the following information elements according GSM 4.08:
142
143 cell channel description
144 frequency list
145 frequency short list
146 neighbour cell description
147
148 The format identifier of the information element is defined as:
149
150 FORMAT-ID, Format Identifier
151
152 Bit Bit Bit Bit Bit format notation
153 8 7 4 3 2
154
155 0 0 X X X bit map 0
156 1 0 0 X X 1024 range
157 1 0 1 0 0 512 range
158 1 0 1 0 1 256 range
159 1 0 1 1 0 128 range
160 1 0 1 1 1 variable bit map
161
162 The space this IE takes in the C-structure is depicted in the
163 example below:
164 typedef struct
165 {
166 U16 first;
167 U16 last;
168 U16 num;
169 U8 bitmap[128];
170 } BMP_arfcn_list;
171
172 The member bitmap stores a list of frequencies in a range of
173 0 - 1023 (GSM), where some of the frequencies are not yet used.
174 */
175
176 SHORT cdc_freq_list_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
177 {
178 U8 *FirstByte = globs->bitbuf + globs->bytepos;
179 ULONG cix_ref, num_prolog_steps, prolog_step_ref;
180
181 #ifdef DEBUG_CCD
182 TRACE_CCD (globs, "cdc_freq_list_decode()");
183 #ifdef CCD_SYMBOLS
184 TRACE_CCD (globs, "decoding list %s with range 1024 format",
185 ccddata_get_alias((USHORT) e_ref, 1));
186 #else
187 TRACE_CCD (globs, "decoding list %d of range 1024 format", melem[e_ref].elemRef);
188 #endif
189 #endif
190
191 cix_ref = melem[e_ref].calcIdxRef;
192 num_prolog_steps = calcidx[cix_ref].numPrologSteps;
193 prolog_step_ref = calcidx[cix_ref].prologStepRef;
194
195 /*
196 * if this element have a defined Prolog
197 * we have to process it before decoding the bitstream
198 */
199 if (num_prolog_steps)
200 {
201 ccd_performOperations (num_prolog_steps, prolog_step_ref, globs);
202 }
203
204 globs->SeekTLVExt = FALSE;
205 globs->pstructOffs = melem[e_ref].structOffs;
206
207 /*
208 * Bitmap 0 format
209 * only for GSM 900 or GSM 850 bands !!!!
210 * std = STD_900, STD_EGSM, STD_DUAL, STD_DUAL_EGSM, STD_850, STD_DUAL_US
211 * No check of std for being PCS 1900 or DCS 1800 is implemented.
212 */
213 if ((*FirstByte & 0x80) == 0)
214 {
215
216 #ifdef DEBUG_CCD
217 TRACE_CCD (globs, "bitmap 0 format");
218 #endif
219 /*
220 * Copy only the first 16 bytes. According to section 10.5.2.1b.2 of
221 * GSM04.08, 124 bits are dedicated to ARFCN and two bits to the Format-ID.
222 * Two bits are spare.
223 */
224 FirstByte = globs->pstruct + globs->pstructOffs;
225 /* first bit */
226 *(U16 *) FirstByte = 896;//T_LIST_MAX_SIZE - 16;
227 /* last bit */
228 *(U16 *) (FirstByte+2) = T_LIST_MAX_SIZE;
229 /* number of entries */
230 *(U16 *) (FirstByte+4) = 124;
231 memcpy (FirstByte + T_LIST_MAX_SIZE - 10, //FirstByte + 6 + T_LIST_MAX_SIZE - 16,
232 globs->bitbuf + globs->bytepos, 16);
233 }
234 else
235 {
236 U16 ListLength = mvar[melem[e_ref].elemRef].bSize;
237 U8 *BitmapInStruct = globs->pstruct + globs->pstructOffs;
238 first = 0;
239 last = 0;
240 num = 0;
241 /*
242 * RANGE 128,
243 */
244 if ((*FirstByte & 0x8E) == 0x8C)
245 {
246 /*
247 * Use dynamic memory for calculation instead of global memory or stack.
248 */
249 short *w;
250 MALLOC (w, 129 * sizeof (U16));
251
252 #ifdef DEBUG_CCD
253 TRACE_CCD (globs, "range 128 format");
254 #endif
255
256 /*
257 * The algorithm for several ranges is the same with different
258 * tables. The W-parameter start with bit 7. Skip over offset.
259 */
260 bf_incBitpos (7, globs);
261 cdc_decode_param (param_128, w, ListLength, globs);
262
263 /*
264 * W[0] contains the first channel number
265 */
266 setFirstChanNr (BitmapInStruct, w[0]);
267
268 /*
269 * Decode and set the remaining channel number according the
270 * algorithm described in GSM 4.08.
271 */
272 cdc_decode_frequencies (127, &w[1], w[0], FREQUENCY_LIST, globs);
273 completeAddInfo (BitmapInStruct);
274
275 /*
276 * free the dynamic allocated memory.
277 */
278 MFREE (w);
279 }
280 /*
281 * RANGE 256
282 */
283 if ((*FirstByte & 0x8E) == 0x8A)
284 {
285 /*
286 * Use dynamic memory for calculation instead of global memory or stack.
287 */
288 short *w;
289 MALLOC (w, 257 * sizeof (U16));
290
291 #ifdef DEBUG_CCD
292 TRACE_CCD (globs, "range 256 format");
293 #endif
294
295 /*
296 * Decode the W-parameter. The W-parameter start with bit 7.
297 */
298 bf_incBitpos (7, globs);
299 cdc_decode_param (param_256, w, ListLength, globs);
300
301 /*
302 * W[0] contains the first channel number
303 */
304 setFirstChanNr (BitmapInStruct, w[0]);
305
306 /*
307 * decode and set the remaining channel number according the
308 * algorithm described in GSM 4.08.
309 */
310 cdc_decode_frequencies (255, &w[1], w[0], FREQUENCY_LIST, globs);
311 completeAddInfo (BitmapInStruct);
312
313 /*
314 * free the dynamic allocated memory.
315 */
316 MFREE (w);
317 }
318 /*
319 * RANGE 512
320 */
321 if ((*FirstByte & 0x8E) == 0x88)
322 {
323 /*
324 * Use dynamic memory for calculation instead of global memory or stack.
325 */
326 short *w;
327 MALLOC (w, 257 * sizeof (U16));
328
329 #ifdef DEBUG_CCD
330 TRACE_CCD (globs, "range 512 format");
331 #endif
332
333 /*
334 * the algorithm for the several ranges is the same with different
335 * tables. The W-parameter start with bit 7. Skip over offset.
336 */
337 bf_incBitpos (7, globs);
338 cdc_decode_param (param_512, w, ListLength, globs);
339
340 /*
341 * W[0] contains the first channel number
342 */
343 setFirstChanNr (BitmapInStruct, w[0]);
344
345 /*
346 * decode and set the remaining channel number according the
347 * algorithm described in GSM 4.08.
348 */
349 cdc_decode_frequencies (511, &w[1], w[0], FREQUENCY_LIST, globs);
350 completeAddInfo (BitmapInStruct);
351
352 /*
353 * free the dynamic allocated memory.
354 */
355 MFREE (w);
356 }
357
358 if ((*FirstByte & 0x88) == 0x80)
359 {
360 /*
361 * RANGE 1024
362 *
363 * Use dynamic memory for calculation instead of global memory or stack.
364 */
365 U8 f0;
366 U8 offset;
367
368 short *w;
369 MALLOC (w, 257 * sizeof (U16));
370
371 #ifdef DEBUG_CCD
372 TRACE_CCD (globs, "range 1024 format");
373 #endif
374
375 /*
376 * Get the f0 indicator. It indicates whether channel 0 is part
377 * of the frequency hopping list or not.
378 */
379 /* The following lines are equal to:
380 * ccd_decodeByte (FirstByte, (U16)(globs->byteoffs+5), 1, &f0);
381 */
382 offset = globs->byteoffs+5;
383 if (offset < 8)
384 {
385 f0 = FirstByte[0] << offset;
386 f0 &= 0x80;
387 }
388 else
389 {
390 U16 tmpvar;
391 tmpvar = *(U16*) FirstByte;
392 tmpvar <<= offset;
393 f0 = tmpvar & 0x8000;
394 }
395
396 /*
397 * The algorithm for the several ranges is the same with different
398 * tables. The W-parameter start with bit 6. Skip over offset.
399 */
400 bf_incBitpos (6, globs);
401 cdc_decode_param (param_1024, w, ListLength, globs);
402
403 /*
404 * If indicated add channel 0 to the list
405 */
406 if (f0)
407 {
408 /* The following is equal to setFirstChanNr(0); */
409 BitmapInStruct[0] |= 0x80;
410 num = 1;
411 }
412
413 /*
414 * decode and set the remaining channel number according the
415 * algorithm described in GSM 4.08.
416 */
417 cdc_decode_frequencies (1023, &w[0], 0, FREQUENCY_LIST, globs);
418 completeAddInfo (BitmapInStruct);
419
420 /*
421 * free the dynamic allocated memory.
422 */
423 MFREE (w);
424 }
425 /*
426 * RANGE variable
427 */
428 if ((*FirstByte & 0x8E) == 0x8E)
429 {
430 /*
431 * The format is similar to the bitmap 0 format. The
432 * calculation starts from a base channel number svalue
433 * instead of channel number 1.
434 */
435 U32 lvalue;
436 U16 svalue;
437 U32 i;
438 U16 bitposition;
439
440 #ifdef DEBUG_CCD
441 TRACE_CCD (globs, "range variable format");
442 #endif
443
444 /* Get the first channel number. */
445 bf_incBitpos (7, globs);
446 lvalue = bf_getBits (10, globs);
447
448 /* Copy lvalue to svalue to set the correct channel. */
449 svalue = (U16)lvalue;
450 setFirstChanNr (BitmapInStruct, svalue);
451 first = svalue;
452 num = 1;
453 for (i = 1; i < 112; i++)
454 {
455 /*
456 * Get the value of the next bit.
457 * If the bit is set, set channel i+svalue
458 */
459 if (bf_readBit (globs))
460 {
461 U16 channel = (U16)for_modulo(i+svalue, 1024);
462
463 bitposition = (channel == 0) ? 0 : (U16)(BITOFFSET_LIST - channel);
464 BitmapInStruct[bitposition >> 3] |= ByteBitMask[bitposition & 7];
465 last = bitposition;
466 num++;
467 }
468 }
469 completeAddInfo (BitmapInStruct);
470 }
471 }
472
473 return 1;
474 }
475
476 /*
477 +--------------------------------------------------------------------+
478 | PROJECT : CCD MODULE : cdc_freq_list_encode |
479 +--------------------------------------------------------------------+
480
481 PURPOSE : Encoding function is not needed, since this message is
482 sent from net to MS.
483 It could be only useful for testing procedure if there
484 were an encoder function at this place.
485 This will be a future work.
486 */
487
488 SHORT cdc_freq_list_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
489 {
490
491 #ifdef DEBUG_CCD
492 TRACE_CCD (globs, "cdc_freq_list_encode()");
493 #endif
494 #ifdef TARGET_WIN32
495 /* TBD */
496 #endif
497
498 return 1;
499 }
500 #endif /* !RUN_INT_RAM */