comparison src/g23m-gprs/grlc/grlc_tpcs.c @ 183:219afcfc6250

src/g23m-gprs: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Oct 2016 04:24:13 +0000
parents
children
comparison
equal deleted inserted replaced
182:f02d0a0e1849 183:219afcfc6250
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GPRS (8441)
4 | Modul : GRLC
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 module implements signal handler functions for service
18 | TPC of entity GRLC.
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef GRLC_TPCS_C
23 #define GRLC_TPCS_C
24 #endif /* #ifndef GRLC_TPCS_C */
25
26 #define ENTITY_GRLC
27
28 /*==== INCLUDES =============================================================*/
29
30 #include <string.h>
31 #include "typedefs.h"
32 #include "vsi.h"
33 #include "macdef.h"
34 #include "gprs.h"
35 #include "gsm.h"
36 #include "ccdapi.h"
37 #include "prim.h"
38 #include "message.h"
39 #include "grlc.h"
40 #include "grlc_tpcg.h"
41 #include "grlc_tpcs.h"
42 #include "grlc_meass.h"
43
44 /*==== CONST ================================================================*/
45
46 /*==== DIAGNOSTICS ==========================================================*/
47
48 /*==== LOCAL VARS ===========================================================*/
49
50 /*==== PRIVATE FUNCTIONS ====================================================*/
51
52 LOCAL void tpc_update_pch ( void );
53 LOCAL void tpc_reset_fix_pwr_par ( void );
54
55 /*==== PUBLIC FUNCTIONS =====================================================*/
56 /*
57 +------------------------------------------------------------------------------
58 | Function : sig_pei_config_tpc_set_pwr_par
59 +------------------------------------------------------------------------------
60 | Description : ...
61 |
62 | Parameters : ...
63 |
64 +------------------------------------------------------------------------------
65 */
66 GLOBAL void sig_pei_config_tpc_set_pwr_par( UBYTE alpha, UBYTE gamma )
67 {
68 TRACE_ISIG( "sig_pei_config_tpc_set_pwr_par" );
69
70 if( alpha NEQ TPC_ALFGAM_NOT_PRESENT AND gamma NEQ TPC_ALFGAM_NOT_PRESENT )
71 {
72 UBYTE i; /* used for counting */
73
74 grlc_data->tpc.v_fix_pwr_par = TRUE;
75
76 /* process parameter alpha */
77 grlc_data->tpc.fix_pwr_par.alpha = alpha;
78
79 /* process parameter gamma */
80 for( i = 0; i < MAC_MAX_TIMESLOTS; i++ )
81 {
82 grlc_data->tpc.fix_pwr_par.gamma_ch[i] = gamma;
83 }
84 }
85 else
86 {
87 tpc_reset_fix_pwr_par( );
88 }
89 } /* sig_pei_config_tpc_set_pwr_par() */
90
91 /*
92 +------------------------------------------------------------------------------
93 | Function : sig_pei_config_tpc_fix_pcl
94 +------------------------------------------------------------------------------
95 | Description : ...
96 |
97 | Parameters : ...
98 |
99 +------------------------------------------------------------------------------
100 */
101 GLOBAL void sig_pei_config_tpc_fix_pcl ( UBYTE pcl )
102 {
103 TRACE_ISIG( "sig_pei_config_tpc_fix_pcl" );
104
105 grlc_data->tpc.fix_pcl = pcl;
106
107 } /* sig_pei_config_tpc_fix_pcl() */
108
109 /*
110 +------------------------------------------------------------------------------
111 | Function : sig_gff_tpc_pwr_ctrl_ind
112 +------------------------------------------------------------------------------
113 | Description : Handles the signal SIG_GFF_TPC_PWR_CTRL_IND
114 |
115 | Parameters : *mac_pwr_ctrl_ind - Ptr to primitive MAC_PWR_CTRL_IND
116 |
117 +------------------------------------------------------------------------------
118 */
119 GLOBAL void sig_gff_tpc_pwr_ctrl_ind ( T_MAC_PWR_CTRL_IND * mac_pwr_ctrl_ind )
120 {
121 TRACE_ISIG( "sig_gff_tpc_pwr_ctrl_ind" );
122
123 meas_c_val_update_ptm( mac_pwr_ctrl_ind,
124 &grlc_data->tpc.glbl_pwr_par,
125 &grlc_data->tm.freq_param );
126
127 meas_sv_update( mac_pwr_ctrl_ind,
128 &grlc_data->tpc.glbl_pwr_par,
129 &grlc_data->tm.freq_param );
130
131 tpc_update_pch( );
132
133 } /* sig_gff_tpc_pwr_ctrl_ind() */
134
135 /*
136 +------------------------------------------------------------------------------
137 | Function : sig_tm_tpc_update_pch
138 +------------------------------------------------------------------------------
139 | Description : Handles the signal SIG_TM_TPC_UPDATE_PCH
140 |
141 | Parameters :
142 |
143 +------------------------------------------------------------------------------
144 */
145 GLOBAL void sig_tm_tpc_update_pch ( void )
146 {
147 TRACE_ISIG( "sig_tm_tpc_update_pch" );
148
149 tpc_update_pch( );
150
151 } /* sig_tm_tpc_update_pch() */
152
153 /*
154 +------------------------------------------------------------------------------
155 | Function : tpc_grlc_init
156 +------------------------------------------------------------------------------
157 | Description : The function tpc_grlc_init() initialize the services TPC
158 |
159 | Parameters : void
160 |
161 +------------------------------------------------------------------------------
162 */
163 GLOBAL void tpc_grlc_init ( void )
164 {
165 TRACE_FUNCTION( "tpc_grlc_init" );
166
167 /* init power control parameter */
168 tpc_reset_fix_pwr_par( );
169
170 grlc_data->tpc.fix_pcl = TPC_SWITCHED_ON;
171
172 #if !defined (NTRACE)
173
174 grlc_data->tpc.n_tpc_trace = 0;
175
176 #endif /* #if !defined (NTRACE) */
177
178 } /* tpc_grlc_init() */
179
180 /*
181 +------------------------------------------------------------------------------
182 | Function : tpc_update_pch
183 +------------------------------------------------------------------------------
184 | Description : This function calculates the transmit output power
185 |
186 | Parameters : void
187 |
188 +------------------------------------------------------------------------------
189 */
190 LOCAL void tpc_update_pch ( void )
191 {
192 UBYTE *pch;
193 SHORT nop; /* nominal output power applied by the MS */
194 SHORT pms_max; /* maximum output power applied by the MS */
195
196 LONG summand;
197 LONG gamma_ch;
198 LONG c_value;
199
200 T_MS_PWR_CAP mspc; /* MS power capabilities */
201
202 T_C_FILTER *c_data = &grlc_data->meas.c_filter;
203 T_CGRLC_pwr_ctrl_param *pwr_par = &grlc_data->tpc.pwr_par;
204
205 UBYTE pcl; /* power control level */
206 UBYTE i; /* used for counting */
207
208 UBYTE alpha;
209
210 #if !defined (NTRACE)
211
212 BOOL tracing = FALSE;
213
214 #endif /* #if !defined (NTRACE) */
215
216 TRACE_FUNCTION( "tpc_update_pch" );
217
218 if( grlc_data->tpc.pch_buffer.pch_idx EQ PCH_IDX_A )
219 {
220 pch = &grlc_data->tpc.pch_buffer.pch_array[PCH_IDX_B].pch[0];
221 }
222 else
223 {
224 pch = &grlc_data->tpc.pch_buffer.pch_array[PCH_IDX_A].pch[0];
225 }
226
227 tpc_get_ms_pwr_cap( grlc_data->tm.freq_param.pdch_band, &mspc );
228
229 pms_max = grlc_data->tpc.glbl_pwr_par.pwr_max;
230
231 if( grlc_data->tpc.pwr_par.alpha NEQ CGRLC_ALPHA_INVALID )
232 {
233 alpha = grlc_data->tpc.pwr_par.alpha;
234 }
235 else
236 {
237 alpha = grlc_data->tpc.glbl_pwr_par.alpha;
238 }
239
240 if( grlc_data->tpc.fix_pcl NEQ TPC_SWITCHED_ON )
241 {
242
243 #if !defined (NTRACE)
244
245 for( i = 0; i < MAC_MAX_TIMESLOTS; i++ )
246 {
247 if( pch[i] NEQ grlc_data->tpc.fix_pcl )
248 {
249 tracing = TRUE;
250 }
251 }
252
253 #endif /* #if !defined (NTRACE) */
254
255 memset( pch, grlc_data->tpc.fix_pcl, MAC_MAX_TIMESLOTS );
256 }
257 else
258 {
259 /*
260 * select the used power parameter, either the data received
261 * from BSS or the data received by dynamic configuration
262 */
263 if( grlc_data->tpc.v_fix_pwr_par EQ TRUE )
264 {
265 pwr_par = &grlc_data->tpc.fix_pwr_par;
266 alpha = grlc_data->tpc.fix_pwr_par.alpha;
267 }
268
269 if( c_data->index EQ 0 AND alpha NEQ 0 )
270 {
271 pcl = tpc_get_pcl( mspc.p_control, pms_max );
272
273 #if !defined (NTRACE)
274
275 for( i = 0; i < MAC_MAX_TIMESLOTS; i++ )
276 {
277 if( pch[i] NEQ pcl )
278 {
279 tracing = TRUE;
280 }
281 }
282
283 #endif /* #if !defined (NTRACE) */
284
285 memset( pch, pcl, MAC_MAX_TIMESLOTS );
286 }
287 else
288 {
289 /* process parameter summand */
290 c_value = ( 63 * MEAS_ACRCY ) - c_data->value;
291 summand = ( MEAS_ACRCY * mspc.gamma_0 ) + ( ( alpha * c_value ) / 10 );
292
293 /* set the power control level for each timeslot */
294 for( i = 0; i < MAC_MAX_TIMESLOTS; i++ )
295 {
296 if( pwr_par->gamma_ch[i] NEQ CGRLC_GAMMA_INVALID )
297 {
298 gamma_ch = 2 * MEAS_ACRCY * pwr_par->gamma_ch[i];
299
300 nop = MINIMUM( summand - gamma_ch, pms_max * MEAS_ACRCY ) /
301 MEAS_ACRCY;
302
303 if( nop < mspc.pwr_min )
304 {
305 nop = mspc.pwr_min;
306 }
307 }
308 else
309 {
310 nop = pms_max;
311 }
312
313 pcl = tpc_get_pcl( mspc.p_control, nop );
314
315 #if !defined (NTRACE)
316
317 if( pch[i] NEQ pcl )
318 {
319 tracing = TRUE;
320 }
321
322 #endif /* #if !defined (NTRACE) */
323
324 pch[i] = pcl;
325 }
326 }
327 }
328
329 #if !defined (NTRACE)
330
331 if( ( grlc_data->tpc.n_tpc_trace & M_TPC_TRACE_STATIC ) OR
332 ( grlc_data->tpc.n_tpc_trace & M_TPC_TRACE_CHANGE AND
333 tracing EQ TRUE ) )
334 {
335 ULONG trace[8];
336
337 trace[0] = ( grlc_data->tpc.glbl_pwr_par.t_avg_t << 24 );
338 trace[0] |= ( grlc_data->tpc.glbl_pwr_par.pb << 16 );
339 trace[0] |= ( grlc_data->tpc.glbl_pwr_par.pc_meas_chan << 8 );
340 trace[0] |= ( grlc_data->tpc.glbl_pwr_par.pwr_max << 0 );
341
342 trace[1] = ( grlc_data->tm.freq_param.pdch_hopping << 24 );
343 trace[1] |= ( grlc_data->tm.freq_param.pdch_band << 16 );
344 trace[1] |= ( grlc_data->tpc.glbl_pwr_par.alpha << 8 );
345 trace[1] |= ( grlc_data->tpc.pwr_par.alpha << 0 );
346
347 trace[2] = ( grlc_data->tpc.fix_pwr_par.alpha << 24 );
348 trace[2] |= ( grlc_data->tpc.fix_pcl << 16 );
349 trace[2] |= ( grlc_data->tpc.pch_buffer.pch_idx << 8 );
350
351 trace[3] = 0x00000000;
352 trace[4] = 0x00000000;
353
354 for( i = 0; i < MAC_MAX_TIMESLOTS; i++ )
355 {
356 trace[( i / 4 ) + 3] |= ( pwr_par->gamma_ch[i] << ( 24 - ( 8 * ( i % 4 ) ) ) );
357 }
358
359 trace[5] = ( c_data->index << 16 );
360 trace[5] |= ( c_data->value << 0 );
361
362 trace[6] = ( pch[0] << 24 );
363 trace[6] |= ( pch[1] << 16 );
364 trace[6] |= ( pch[2] << 8 );
365 trace[6] |= ( pch[3] << 0 );
366
367 trace[7] = ( pch[4] << 24 );
368 trace[7] |= ( pch[5] << 16 );
369 trace[7] |= ( pch[6] << 8 );
370 trace[7] |= ( pch[7] << 0 );
371
372 TRACE_EVENT_P8( "TPC: %08X %08X %08X %08X %08X %08X %08X %08X",
373 trace[0], trace[1], trace[2], trace[3],
374 trace[4], trace[5], trace[6], trace[7] );
375 }
376
377 #endif /* #if !defined (NTRACE) */
378
379 if( grlc_data->tpc.pch_buffer.pch_idx EQ PCH_IDX_A )
380 {
381 grlc_data->tpc.pch_buffer.pch_idx = PCH_IDX_B;
382 }
383 else
384 {
385 grlc_data->tpc.pch_buffer.pch_idx = PCH_IDX_A;
386 }
387 } /* tpc_update_pch() */
388
389 /*
390 +------------------------------------------------------------------------------
391 | Function : tpc_get_pch
392 +------------------------------------------------------------------------------
393 | Description :
394 |
395 | Parameters :
396 |
397 +------------------------------------------------------------------------------
398 */
399 GLOBAL void tpc_get_pch ( UBYTE *pch_dest )
400 {
401 UBYTE *pch_src;
402
403 TRACE_FUNCTION( "tpc_get_pch" );
404
405 if( grlc_data->tpc.pch_buffer.pch_idx EQ PCH_IDX_A )
406 {
407 pch_src = &grlc_data->tpc.pch_buffer.pch_array[PCH_IDX_A].pch[0];
408 }
409 else
410 {
411 pch_src = &grlc_data->tpc.pch_buffer.pch_array[PCH_IDX_B].pch[0];
412 }
413
414 memcpy( pch_dest, pch_src, MAC_MAX_TIMESLOTS );
415
416 } /* tpc_get_pch() */
417
418 /*
419 +------------------------------------------------------------------------------
420 | Function : tpc_set_pwr_ctrl_param
421 +------------------------------------------------------------------------------
422 | Description :
423 |
424 | Parameters :
425 |
426 +------------------------------------------------------------------------------
427 */
428 GLOBAL void tpc_set_pwr_ctrl_param ( T_CGRLC_pwr_ctrl_param *pwr_ctrl_param )
429 {
430 TRACE_FUNCTION( "tpc_set_pwr_ctrl_param" );
431
432 grlc_data->tpc.pwr_par = *pwr_ctrl_param;
433
434 } /* tpc_set_pwr_ctrl_param() */
435
436 /*
437 +------------------------------------------------------------------------------
438 | Function : tpc_set_glbl_pwr_ctrl_param
439 +------------------------------------------------------------------------------
440 | Description :
441 |
442 | Parameters :
443 |
444 +------------------------------------------------------------------------------
445 */
446 GLOBAL void tpc_set_glbl_pwr_ctrl_param
447 ( T_CGRLC_glbl_pwr_ctrl_param *glbl_pwr_ctrl_param )
448 {
449 TRACE_FUNCTION( "tpc_set_glbl_pwr_ctrl_param" );
450
451 grlc_data->tpc.glbl_pwr_par = *glbl_pwr_ctrl_param;
452
453 } /* tpc_set_glbl_pwr_ctrl_param() */
454
455 /*
456 +------------------------------------------------------------------------------
457 | Function : tpc_reset_fix_pwr_par
458 +------------------------------------------------------------------------------
459 | Description :
460 |
461 | Parameters :
462 |
463 +------------------------------------------------------------------------------
464 */
465 LOCAL void tpc_reset_fix_pwr_par ( void )
466 {
467 UBYTE i; /* used for counting */
468
469 TRACE_FUNCTION( "tpc_reset_fix_pwr_par" );
470
471 grlc_data->tpc.v_fix_pwr_par = FALSE;
472
473 /* process parameter alpha */
474 grlc_data->tpc.fix_pwr_par.alpha = TPC_ALFGAM_NOT_PRESENT;
475
476 /* process parameter gamma */
477 for( i = 0; i < MAC_MAX_TIMESLOTS; i++ )
478 {
479 grlc_data->tpc.fix_pwr_par.gamma_ch[i] = TPC_ALFGAM_NOT_PRESENT;
480 }
481 } /* tpc_reset_fix_pwr_par() */