FreeCalypso > hg > fc-magnetite
comparison src/cs/layer1/cfile/l1_pwmgr.c @ 69:50a15a54801e
src/cs/layer1: import from tcs211-l1-reconst project
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sat, 01 Oct 2016 23:45:38 +0000 |
| parents | |
| children | daddb933047d |
comparison
equal
deleted
inserted
replaced
| 68:838717193e09 | 69:50a15a54801e |
|---|---|
| 1 /************* Revision Controle System Header ************* | |
| 2 * GSM Layer 1 software | |
| 3 * L1_PWMGR.C | |
| 4 * | |
| 5 * Filename l1_pwmgr.c | |
| 6 * Copyright 2003 (C) Texas Instruments | |
| 7 * | |
| 8 ************* Revision Controle System Header *************/ | |
| 9 | |
| 10 #define L1_PWMGR_C | |
| 11 //#pragma DUPLICATE_FOR_INTERNAL_RAM_START | |
| 12 | |
| 13 #include "timer/timer2.h" | |
| 14 #include "armio/armio.h" | |
| 15 | |
| 16 //omaps00090550 #include "l1_macro.h" | |
| 17 #include "l1_confg.h" | |
| 18 | |
| 19 #if (OP_L1_STANDALONE == 1) | |
| 20 #include "uart/serialswitch_core.h" | |
| 21 #else | |
| 22 #include "uart/serialswitch.h" | |
| 23 #endif | |
| 24 | |
| 25 #if (OP_L1_STANDALONE == 0) | |
| 26 #include "sim/sim.h" | |
| 27 #include "rv_swe.h" | |
| 28 #endif | |
| 29 | |
| 30 | |
| 31 #if (CODE_VERSION == SIMULATION) | |
| 32 #include "l1_types.h" | |
| 33 #include "l1_const.h" | |
| 34 | |
| 35 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 36 #include "inth/sys_inth.h" | |
| 37 #include "sys_dma.h" | |
| 38 #include "ulpd.h" | |
| 39 #include "clkm.h" | |
| 40 | |
| 41 // typedef volatile unsigned short REG_UWORD16; //omaps00090550 | |
| 42 #define REG16(A) (*(REG_UWORD16*)(A)) | |
| 43 | |
| 44 #else | |
| 45 #include "inth/iq.h" | |
| 46 #endif | |
| 47 | |
| 48 #if TESTMODE | |
| 49 #include "l1tm_defty.h" | |
| 50 #endif // TESTMODE | |
| 51 | |
| 52 #if (AUDIO_TASK == 1) | |
| 53 #include "l1audio_const.h" | |
| 54 #include "l1audio_cust.h" | |
| 55 #include "l1audio_defty.h" | |
| 56 #endif // AUDIO_TASK | |
| 57 | |
| 58 #if (L1_GTT == 1) | |
| 59 #include "l1gtt_const.h" | |
| 60 #include "l1gtt_defty.h" | |
| 61 #endif | |
| 62 | |
| 63 #if (L1_MP3 == 1) | |
| 64 #include "l1mp3_defty.h" | |
| 65 #endif | |
| 66 | |
| 67 #if (L1_MIDI == 1) | |
| 68 #include "l1midi_defty.h" | |
| 69 #endif | |
| 70 //ADDED FOR AAC | |
| 71 #if (L1_AAC == 1) | |
| 72 #include "l1aac_defty.h" | |
| 73 #endif | |
| 74 #include "l1_defty.h" | |
| 75 #include "l1_varex.h" | |
| 76 #include "l1_tabs.h" | |
| 77 #include "cust_os.h" | |
| 78 #include "l1_msgty.h" | |
| 79 #include "l1_proto.h" | |
| 80 #include "ulpd.h" | |
| 81 #include "l1_trace.h" | |
| 82 | |
| 83 #if L1_GPRS | |
| 84 #include "l1p_cons.h" | |
| 85 #include "l1p_msgt.h" | |
| 86 #include "l1p_deft.h" | |
| 87 #include "l1p_vare.h" | |
| 88 #endif // L1_GPRS | |
| 89 | |
| 90 #include <stdio.h> | |
| 91 #include "sim_cfg.h" | |
| 92 #include "sim_cons.h" | |
| 93 #include "sim_def.h" | |
| 94 #include "sim_var.h" | |
| 95 //omaps00090550 | |
| 96 #include "nucleus.h" | |
| 97 | |
| 98 extern NU_TASK L1S_task; | |
| 99 STATUS status; | |
| 100 | |
| 101 | |
| 102 | |
| 103 #else // NO SIMULATION | |
| 104 | |
| 105 | |
| 106 | |
| 107 #include "l1_types.h" | |
| 108 #include "l1_const.h" | |
| 109 | |
| 110 #include "abb/abb.h" | |
| 111 #include "dma/sys_dma.h" | |
| 112 | |
| 113 #if (OP_BT == 1) | |
| 114 #include "hci_ll_simul.h" | |
| 115 #endif | |
| 116 | |
| 117 #if TESTMODE | |
| 118 #include "l1tm_defty.h" | |
| 119 #endif // TESTMODE | |
| 120 | |
| 121 #if (AUDIO_TASK == 1) | |
| 122 #include "l1audio_const.h" | |
| 123 #include "l1audio_cust.h" | |
| 124 #include "l1audio_defty.h" | |
| 125 #endif // AUDIO_TASK | |
| 126 | |
| 127 #if (L1_GTT == 1) | |
| 128 #include "l1gtt_const.h" | |
| 129 #include "l1gtt_defty.h" | |
| 130 #endif | |
| 131 | |
| 132 #if (L1_MP3 == 1) | |
| 133 #include "l1mp3_defty.h" | |
| 134 #endif | |
| 135 | |
| 136 #if (L1_MIDI == 1) | |
| 137 #include "l1midi_defty.h" | |
| 138 #endif | |
| 139 //ADDED FOR AAC | |
| 140 #if (L1_AAC == 1) | |
| 141 #include "l1aac_defty.h" | |
| 142 #endif | |
| 143 #include "l1_defty.h" | |
| 144 #include "l1_varex.h" | |
| 145 #include "l1_tabs.h" | |
| 146 #include "sys_types.h" | |
| 147 #include "tpudrv.h" | |
| 148 #include "cust_os.h" | |
| 149 #include "l1_msgty.h" | |
| 150 #include "l1_proto.h" | |
| 151 #include "l1_trace.h" | |
| 152 #include "timer/timer.h" | |
| 153 | |
| 154 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 155 #include "timer/timer_sec.h" | |
| 156 #include "inth/sys_inth.h" | |
| 157 | |
| 158 /* FreeCalypso: massive #if (CHIPSET == 15) chunk removed */ | |
| 159 | |
| 160 #else //(CHIPSET == 12) || (CHIPSET == 15) | |
| 161 #include "inth/iq.h" | |
| 162 #include "inth/inth.h" | |
| 163 #endif | |
| 164 // #include "timer1.h" | |
| 165 #include "ulpd/ulpd.h" | |
| 166 #include "clkm/clkm.h" | |
| 167 #include "memif/mem.h" | |
| 168 #if L2_L3_SIMUL | |
| 169 #include "hw_debug.h" | |
| 170 #endif | |
| 171 | |
| 172 #if (OP_WCP == 1) && (OP_L1_STANDALONE != 1) | |
| 173 #include "csmi/sleep.h" | |
| 174 #endif // OP_WCP | |
| 175 #if (W_A_CALYPSO_PLUS_SPR_19599 == 1) | |
| 176 #include "sys_memif.h" | |
| 177 #endif | |
| 178 | |
| 179 #if (GSM_IDLE_RAM != 0) | |
| 180 #if (OP_L1_STANDALONE == 1) | |
| 181 #include "csmi_simul.h" | |
| 182 #else | |
| 183 #include "csmi/csmi.h" | |
| 184 #endif | |
| 185 #endif | |
| 186 | |
| 187 #if (CHIPSET == 15) | |
| 188 #include "drp_api.h" | |
| 189 #endif | |
| 190 | |
| 191 #endif // NO SIMULATION | |
| 192 | |
| 193 #if (CODE_VERSION != SIMULATION) | |
| 194 // for PTOOL compatibility | |
| 195 extern void INT_DisableIRQ(void); | |
| 196 extern void INT_EnableIRQ(void); | |
| 197 extern void l1dmacro_RF_sleep(void); | |
| 198 extern void l1dmacro_RF_wakeup(void); | |
| 199 WORD32 l1s_get_HWTimers_ticks(void); | |
| 200 | |
| 201 // file timer1.h | |
| 202 SYS_UWORD16 Dtimer1_Get_cntlreg(void); | |
| 203 void Dtimer1_AR(unsigned short Ar); | |
| 204 void Dtimer1_PTV(unsigned short Ptv); | |
| 205 void Dtimer1_Clken(unsigned short En); | |
| 206 void Dtimer1_Start (unsigned short startStop); | |
| 207 void Dtimer1_Init_cntl (SYS_UWORD16 St, SYS_UWORD16 Reload, SYS_UWORD16 clockScale, SYS_UWORD16 clkon); | |
| 208 SYS_UWORD16 Dtimer1_WriteValue (SYS_UWORD16 value); | |
| 209 SYS_UWORD16 Dtimer1_ReadValue (void); | |
| 210 #endif | |
| 211 | |
| 212 void l1s_wakeup(void); | |
| 213 BOOL l1s_compute_wakeup_ticks(void); | |
| 214 void l1s_recover_Frame(void); | |
| 215 UWORD8 Cust_recover_Os(void); | |
| 216 void l1s_recover_HWTimers(void); | |
| 217 UWORD8 Cust_check_system(void); | |
| 218 void f_arm_sleep_cmd(UWORD8 d_sleep_mode); | |
| 219 | |
| 220 //#if (TRACE_TYPE == 2) || (TRACE_TYPE == 3) | |
| 221 extern void L1_trace_string(char *s); | |
| 222 extern void L1_trace_char (char s); | |
| 223 //#endif | |
| 224 extern UWORD16 slp_debug_flag; | |
| 225 | |
| 226 #if (GSM_IDLE_RAM != 0) | |
| 227 extern void l1s_trace_mftab(void); | |
| 228 #endif | |
| 229 | |
| 230 #if (CODE_VERSION != SIMULATION) && (CHIPSET == 15) | |
| 231 extern T_DRP_REGS_STR *drp_regs; | |
| 232 #endif | |
| 233 | |
| 234 #if L1_GPRS | |
| 235 WORD32 l1s_get_next_gauging_in_Packet_Idle(void); | |
| 236 #endif | |
| 237 //#pragma DUPLICATE_FOR_INTERNAL_RAM_END | |
| 238 | |
| 239 #if !((MOVE_IN_INTERNAL_RAM == 1) && (GSM_IDLE_RAM !=0)) // MOVE TO INTERNAL MEM IN CASE GSM_IDLE_RAM enabled | |
| 240 //#pragma GSM_IDLE_DUPLICATE_FOR_INTERNAL_RAM_START // KEEP IN EXTERNAL MEM otherwise | |
| 241 | |
| 242 /************************************************************/ | |
| 243 /* Macros for power management */ | |
| 244 /************************************************************/ | |
| 245 #define MIN(min, operand1) \ | |
| 246 if (operand1 <= min) min = operand1; | |
| 247 | |
| 248 // ex: RATIO T32khz/T4.33Mhz = 132.2428385417 | |
| 249 // => root = integer part of the ratio | |
| 250 // = 132 | |
| 251 // => frac = fractionnal part of the ratio multiplied by 65536 rounded to make it integer | |
| 252 // = 0.2428385417 * 65536 (Cf. ULPD specification) | |
| 253 // = 0.2428385417 * 2^16 | |
| 254 // = 15914.66666689 = 15914 | |
| 255 | |
| 256 #define RATIO(HF,LF, root, frac) \ | |
| 257 root = (UWORD32)(HF/LF); \ | |
| 258 frac = (UWORD32)(((HF - (root*LF)) << 16) / LF); | |
| 259 | |
| 260 // previous ratio with frac + 0.5 | |
| 261 #if 0 /* original LoCosto code */ | |
| 262 #define RATIO2(HF,LF, root, frac) \ | |
| 263 if(LF){ \ | |
| 264 root = (UWORD32)(HF/LF); \ | |
| 265 frac = (UWORD32)((((HF - (root*LF)) << 16) + 0.5*LF) / LF);} | |
| 266 #else /* FreeCalypso TCS211 reconstruction */ | |
| 267 #define RATIO2(HF,LF, root, frac) \ | |
| 268 { \ | |
| 269 root = (UWORD32)(HF/LF); \ | |
| 270 frac = (UWORD32)((((HF - (root*LF)) << 16) + 0.5*LF) / LF);} | |
| 271 #endif | |
| 272 | |
| 273 #define HFTHEO(LF, root, frac, hftheo) \ | |
| 274 hftheo = root*LF + ((frac*LF) >>16); | |
| 275 | |
| 276 #define SUM(HF, LF, nb, ind) \ | |
| 277 LF=HF=0; \ | |
| 278 for(ind=0; ind<nb; ind++) \ | |
| 279 { \ | |
| 280 LF = LF +l1s.pw_mgr.histo[ind][0]; \ | |
| 281 HF = HF +l1s.pw_mgr.histo[ind][1]; \ | |
| 282 } | |
| 283 | |
| 284 | |
| 285 #if 0 /* FreeCalypso TCS211 reconstruction */ | |
| 286 T_PWMGR_DEBUG l1_pwmgr_debug; | |
| 287 #endif | |
| 288 | |
| 289 | |
| 290 /* FreeCalypso: massive #if (CHIPSET == 15) chunk removed */ | |
| 291 | |
| 292 | |
| 293 // l1ctl_pgm_clk32() | |
| 294 // convert ratio in 4.33Mhz and pgm INC_FRAC,INC_SIXTEEN. | |
| 295 | |
| 296 void l1ctl_pgm_clk32(UWORD32 nb_hf, UWORD32 nb_32khz) | |
| 297 { | |
| 298 #if (CODE_VERSION != SIMULATION) | |
| 299 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 300 { | |
| 301 UWORD32 inc_sixteen= 0, inc_frac=0, lf; | |
| 302 | |
| 303 // REM: nb_hf is the real value of the high frequency (ex in nbr of 65Mhz clock) | |
| 304 // To compute the ratio, nb_hf must be expressed in nbr of clock 4.33 Mhz | |
| 305 // that's why nb_hf is divided by 3*l1_config.dpll | |
| 306 // RATIO2(nb_hf/(3*l1_config.dpll),nb_32khz,inc_sixteen,inc_frac); | |
| 307 // this line above is equal to the ligne below: | |
| 308 lf=(UWORD32)(3*l1_config.dpll*nb_32khz); | |
| 309 RATIO2(nb_hf,lf,inc_sixteen,inc_frac); | |
| 310 | |
| 311 // integer part | |
| 312 ULDP_INCSIXTEEN_UPDATE(inc_sixteen); | |
| 313 | |
| 314 // fractional part | |
| 315 ULDP_INCFRAC_UPDATE(inc_frac); | |
| 316 } | |
| 317 #endif | |
| 318 } | |
| 319 | |
| 320 | |
| 321 // l1ctl_gauging() | |
| 322 // Description: management of the gauging results | |
| 323 // At RESET state reset histogram and then go to INIT. | |
| 324 // At INIT state, go back to RESET on each */ | |
| 325 // gauging > +- 100 ppm. If NB_INIT good gauging go to ACQUIS state. | |
| 326 // At ACQUIS state, go back to RESET on each gauging > (+- 20ppm +- 1us). If NB_ACQU good gauging */ | |
| 327 // go to UPDATE state. Allow deep sleep feature. | |
| 328 // At UPDATE state, count consecutive gauging >+- 1 us. | |
| 329 // If MAX_BAD_GAUGING results go back to RESET. | |
| 330 // Otherwise re-enable deep sleep feature and reset bad results counter. | |
| 331 | |
| 332 void l1ctl_gauging ( UWORD32 nb_32khz, UWORD32 nb_hf) | |
| 333 { | |
| 334 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 335 { | |
| 336 enum states | |
| 337 { | |
| 338 RESET = 0, | |
| 339 INIT = 1, | |
| 340 ACQUIS = 2, | |
| 341 UPDATE = 3 | |
| 342 }; | |
| 343 | |
| 344 static UWORD8 bad_count; // bad gauging values | |
| 345 static UWORD8 gauging_state= RESET; // RESET,INIT, ACQUIS, UPDATE | |
| 346 static UWORD8 nb_gaug; // number of gauging in ACQUIS | |
| 347 static UWORD8 idx,i; // index | |
| 348 static UWORD32 root, frac; // ratio of HF and LF average | |
| 349 UWORD32 sumLF, sumHF; // sum of HF and LF counts | |
| 350 double nbHF_theo; | |
| 351 | |
| 352 | |
| 353 // AFC or TEMPERATURE variation | |
| 354 | |
| 355 //if ( (ABS( (WORD32)(l1s.pw_mgr.previous_afc-l1s.afc) ) > AFC_VARIATION) || | |
| 356 // (ABS( (WORD32)(l1s.pw_mgr.previous_temp-l1s.afc) > TEMP_VARIATION) ) | |
| 357 // gauging_state = RESET; | |
| 358 | |
| 359 // reset state machine if not in IDLE mode | |
| 360 #if L1_GPRS | |
| 361 if ((l1a_l1s_com.l1s_en_task[NP] != TASK_ENABLED) && (l1a_l1s_com.l1s_en_task[PNP] != TASK_ENABLED)) | |
| 362 gauging_state = RESET; | |
| 363 #else | |
| 364 if ((l1a_l1s_com.l1s_en_task[NP] != TASK_ENABLED) ) | |
| 365 gauging_state = RESET; | |
| 366 | |
| 367 #endif | |
| 368 | |
| 369 switch (gauging_state) | |
| 370 { | |
| 371 | |
| 372 case RESET: | |
| 373 { | |
| 374 UWORD8 i; | |
| 375 | |
| 376 // Reset Histogram | |
| 377 for (i=0; i < SIZE_HIST; i++) | |
| 378 { | |
| 379 l1s.pw_mgr.histo[i][0] = 0; | |
| 380 l1s.pw_mgr.histo[i][1] = 0; | |
| 381 } | |
| 382 idx = 0; | |
| 383 l1s.pw_mgr.enough_gaug= FALSE; // forbid Deep sleep | |
| 384 gauging_state = INIT; | |
| 385 nb_gaug = NB_INIT; // counter for ACQUIS state | |
| 386 bad_count = 0; // reset count of BAD gauging | |
| 387 | |
| 388 #if (TRACE_TYPE != 0) | |
| 389 l1_trace_gauging_reset(); | |
| 390 #endif | |
| 391 } | |
| 392 | |
| 393 | |
| 394 case INIT: | |
| 395 { | |
| 396 | |
| 397 // Acquire NB_INIT gauging wtw +- 100 ppm | |
| 398 | |
| 399 if (l1a_l1s_com.mode != I_MODE) return; | |
| 400 | |
| 401 // compute clocks ratio from measurements. | |
| 402 RATIO(nb_hf,nb_32khz,root,frac) | |
| 403 | |
| 404 | |
| 405 // allow [-500ppm,+100ppm] derive on 32Khz at startup. | |
| 406 #if 0 /* really old code, apparently */ | |
| 407 if ( | |
| 408 (root > l1s.pw_mgr.c_clk_min || | |
| 409 (root == l1s.pw_mgr.c_clk_min && | |
| 410 frac >= l1s.pw_mgr.c_clk_init_min) ) && | |
| 411 (root < l1s.pw_mgr.c_clk_max || | |
| 412 (root == l1s.pw_mgr.c_clk_max && | |
| 413 frac <= l1s.pw_mgr.c_clk_init_max ) ) | |
| 414 #elif 1 /* TCS211 reconstruction */ | |
| 415 if ( | |
| 416 (root == l1s.pw_mgr.c_clk_min && | |
| 417 frac >= l1s.pw_mgr.c_clk_init_min ) || | |
| 418 (root == l1s.pw_mgr.c_clk_max && | |
| 419 frac <= l1s.pw_mgr.c_clk_init_max ) | |
| 420 #else /* LoCosto code */ | |
| 421 if ( | |
| 422 ( l1s.pw_mgr.c_clk_min == l1s.pw_mgr.c_clk_max && | |
| 423 frac >= l1s.pw_mgr.c_clk_init_min && | |
| 424 frac <= l1s.pw_mgr.c_clk_init_max ) | |
| 425 || | |
| 426 ( l1s.pw_mgr.c_clk_min != l1s.pw_mgr.c_clk_max && | |
| 427 ( (root == l1s.pw_mgr.c_clk_min && | |
| 428 frac >= l1s.pw_mgr.c_clk_init_min ) || | |
| 429 (root > l1s.pw_mgr.c_clk_min && | |
| 430 root < l1s.pw_mgr.c_clk_max ) || | |
| 431 (root == l1s.pw_mgr.c_clk_max && | |
| 432 frac <= l1s.pw_mgr.c_clk_init_max ) ) ) | |
| 433 #endif | |
| 434 ) | |
| 435 { | |
| 436 l1s.pw_mgr.histo[idx ][0] = nb_32khz; // init histo with the number of 32kHz | |
| 437 l1s.pw_mgr.histo[idx++][1] = nb_hf; // init histo with the number of hf (13Mhz) | |
| 438 | |
| 439 #if (CODE_VERSION == SIMULATION) | |
| 440 #if (TRACE_TYPE==5) | |
| 441 trace_ULPD("Gauging INIT Case ", l1s.actual_time.fn); | |
| 442 #endif | |
| 443 #endif | |
| 444 | |
| 445 } | |
| 446 else | |
| 447 { | |
| 448 // out of the allowed derive -> reset | |
| 449 idx=0; | |
| 450 #if (TRACE_TYPE != 0) | |
| 451 l1_trace_gauging_reset(); | |
| 452 #endif | |
| 453 } | |
| 454 | |
| 455 if (idx == NB_INIT) | |
| 456 { | |
| 457 // enough measurement -> ACQUIS state | |
| 458 gauging_state = ACQUIS; | |
| 459 // compute clk ratio on count average | |
| 460 SUM(sumHF,sumLF, NB_INIT,i) // returns sumHF and sumLF | |
| 461 RATIO(sumHF,sumLF,root, frac) // returns root and frac*2E16, computed on the average | |
| 462 } | |
| 463 } | |
| 464 break; | |
| 465 | |
| 466 | |
| 467 case ACQUIS: | |
| 468 { | |
| 469 // Acquire NB_ACQU gauging at +-25ppm | |
| 470 // with jitter +- 1 us | |
| 471 UWORD8 n; | |
| 472 | |
| 473 // from nb_32khz "measured" | |
| 474 // compute nbHF_theo | |
| 475 HFTHEO(nb_32khz,root,frac,nbHF_theo) | |
| 476 | |
| 477 if ( (nb_hf >= (nbHF_theo - l1s.pw_mgr.c_delta_hf_acquis)) && | |
| 478 (nb_hf <= (nbHF_theo + l1s.pw_mgr.c_delta_hf_acquis)) ) | |
| 479 { | |
| 480 l1s.pw_mgr.histo[idx][0] = nb_32khz; | |
| 481 l1s.pw_mgr.histo[idx++][1] = nb_hf; | |
| 482 idx = idx % SIZE_HIST; | |
| 483 | |
| 484 // compute clk ratio on count average | |
| 485 if(++nb_gaug >= SIZE_HIST) n=SIZE_HIST; | |
| 486 else n= nb_gaug; | |
| 487 SUM(sumHF,sumLF, n,i) | |
| 488 RATIO(sumHF,sumLF,root, frac) | |
| 489 | |
| 490 #if (CODE_VERSION == SIMULATION) | |
| 491 #if (TRACE_TYPE==5) | |
| 492 trace_ULPD("Gauging ACQUIS Case ", l1s.actual_time.fn); | |
| 493 #endif | |
| 494 #endif | |
| 495 | |
| 496 if ( nb_gaug == (NB_INIT+NB_ACQU)) // NB_ACQU good gauging | |
| 497 { | |
| 498 gauging_state = UPDATE; // UPDATE state | |
| 499 l1s.pw_mgr.enough_gaug = TRUE; // allow Deep sleep | |
| 500 l1ctl_pgm_clk32(sumHF,sumLF); // clocks ratio in 4.33Mhz | |
| 501 } | |
| 502 } | |
| 503 else | |
| 504 { | |
| 505 gauging_state = RESET; | |
| 506 } | |
| 507 } | |
| 508 break; | |
| 509 | |
| 510 case UPDATE: | |
| 511 { | |
| 512 | |
| 513 // Update gauging histogram | |
| 514 // compute nbHF theoric for ratio_avg | |
| 515 HFTHEO(nb_32khz,root,frac,nbHF_theo) | |
| 516 | |
| 517 if ( (nb_hf >= (nbHF_theo-l1s.pw_mgr.c_delta_hf_update)) && | |
| 518 (nb_hf <= (nbHF_theo+l1s.pw_mgr.c_delta_hf_update)) ) | |
| 519 { | |
| 520 l1s.pw_mgr.histo[idx][0] = nb_32khz; | |
| 521 l1s.pw_mgr.histo[idx++][1] = nb_hf; | |
| 522 | |
| 523 // compute clk ratio on count average | |
| 524 SUM(sumHF,sumLF, SIZE_HIST,i) | |
| 525 l1ctl_pgm_clk32(sumHF,sumLF); // clocks ratio in 4.33Mhz | |
| 526 | |
| 527 l1s.pw_mgr.enough_gaug = TRUE; // allow Deep sleep | |
| 528 bad_count = 0; // reset count of BAD gauging | |
| 529 | |
| 530 #if (CODE_VERSION == SIMULATION) | |
| 531 #if (TRACE_TYPE==5) | |
| 532 trace_ULPD("Gauging UPDATE Case ", l1s.actual_time.fn); | |
| 533 #endif | |
| 534 #endif | |
| 535 | |
| 536 } | |
| 537 else | |
| 538 { | |
| 539 bad_count ++; | |
| 540 if (bad_count >= MAX_BAD_GAUGING) gauging_state = RESET; | |
| 541 l1s.pw_mgr.enough_gaug= FALSE; // forbid Deep sleep | |
| 542 } | |
| 543 idx = idx % SIZE_HIST; | |
| 544 } | |
| 545 break; | |
| 546 } | |
| 547 #if (TRACE_TYPE != 0) // Trace gauging | |
| 548 // save parameters in the corresponding structure | |
| 549 l1s.pw_mgr.state = gauging_state; | |
| 550 l1s.pw_mgr.lf = nb_32khz ; | |
| 551 // WARNING WARNING, this case gauging_state == UPDATE modify the algo. | |
| 552 // In case of trace the parameter root and frac are refresh. | |
| 553 // it is not the case if no trace and it seems there is mistake | |
| 554 #if 0 /* FreeCalypso TCS211 reconstruction */ | |
| 555 if (gauging_state == UPDATE) | |
| 556 { | |
| 557 RATIO2(sumHF,sumLF,root,frac); | |
| 558 } | |
| 559 #endif | |
| 560 //End of Warning. | |
| 561 l1s.pw_mgr.hf = nb_hf ; | |
| 562 l1s.pw_mgr.root = root ; | |
| 563 l1s.pw_mgr.frac = frac ; | |
| 564 #endif // End Trace gauging | |
| 565 } | |
| 566 } | |
| 567 | |
| 568 | |
| 569 /* GAUGING_Handler() */ | |
| 570 /* Description: update increment counter for 32Khz */ | |
| 571 /* This interrupt function computes the ratio between */ | |
| 572 /* HF/32Khz gauging counters and program ULPD increment */ | |
| 573 /* values. */ | |
| 574 | |
| 575 void GAUGING_Handler(void) | |
| 576 { | |
| 577 #if (CODE_VERSION != SIMULATION) | |
| 578 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 579 { | |
| 580 UWORD32 nb_32khz, nb_hf; | |
| 581 | |
| 582 // Gauging task is ended | |
| 583 l1s.pw_mgr.gauging_task = INACTIVE; | |
| 584 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 585 F_INTH_DISABLE_ONE_IT(C_INTH_ULPD_GAUGING_IT); // Mask ULPD GAUGING int. | |
| 586 #else | |
| 587 INTH_DISABLEONEIT(IQ_ULPD_GAUGING); // Mask ULPD GAUGING int. | |
| 588 #endif | |
| 589 | |
| 590 // Number of 32 Khz clock at the end of the gauging | |
| 591 nb_32khz = ((*( UWORD16 *)ULDP_COUNTER_32_MSB_REG) * 65536) + | |
| 592 (*( UWORD16 *)ULDP_COUNTER_32_LSB_REG); | |
| 593 | |
| 594 // Number of high frequency clock at the end of the gauging | |
| 595 // Convert it in nbr of 13 Mhz clocks (5*13=65Mhz) | |
| 596 nb_hf = ( ((*( UWORD16 *)ULDP_COUNTER_HI_FREQ_MSB_REG) * 65536) + | |
| 597 (*( UWORD16 *)ULDP_COUNTER_HI_FREQ_LSB_REG) ); // Divide by PLL ratio | |
| 598 | |
| 599 l1ctl_gauging(nb_32khz, nb_hf); | |
| 600 } | |
| 601 #else //Simulation part | |
| 602 | |
| 603 // Gauging task is ended | |
| 604 l1s.pw_mgr.gauging_task = INACTIVE; | |
| 605 | |
| 606 l1ctl_gauging(DEFAULT_32KHZ_VALUE,DEFAULT_HFMHZ_VALUE); | |
| 607 #endif | |
| 608 } | |
| 609 | |
| 610 | |
| 611 // l1s_get_HWTimers_ticks() | |
| 612 // Description: | |
| 613 // evaluate the loading of the HW Timers for dep sleep | |
| 614 // BIG SLEEP: timers CLK may be stopped (user dependant) | |
| 615 // DEEP SLEEP:timers CLK and WTCHDOG CLK are stopped | |
| 616 // CLKS are enabled after VTCX0+SLICER+13MHZ | |
| 617 // setup time | |
| 618 | |
| 619 WORD32 l1s_get_HWTimers_ticks(void) | |
| 620 { | |
| 621 #if (CODE_VERSION != SIMULATION) | |
| 622 WORD32 timer1,timer2,watchdog,HWTimer; | |
| 623 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 624 WORD32 watchdog_sec; | |
| 625 #endif | |
| 626 UWORD16 cntlreg; | |
| 627 UWORD16 modereg; | |
| 628 WORD32 old = 0; | |
| 629 | |
| 630 // read Hercules Timers & Watchdog | |
| 631 //================================================= | |
| 632 // Tint = Tclk * (LOAD_TIM+1) * 2^(PTV+1) | |
| 633 // Tclk = 1.2308us for Fclk=13Mhz | |
| 634 // PTV = X (pre-scaler field) | |
| 635 //------------------------------------------------- | |
| 636 timer1 = timer2 = watchdog = HWTimer = -1; | |
| 637 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 638 watchdog_sec = -1; | |
| 639 #endif | |
| 640 | |
| 641 cntlreg = Dtimer1_Get_cntlreg(); // AND 0x1F | |
| 642 if ( (cntlreg & D_TIMER_RUN) == D_TIMER_RUN) | |
| 643 { | |
| 644 #if 0 /* match TCS211 object */ | |
| 645 cntlreg = cntlreg&0x1F; | |
| 646 #endif | |
| 647 cntlreg >>= 2; // take PTV | |
| 648 cntlreg = 1 << (cntlreg+1); | |
| 649 timer1 = (WORD32) ( ((Dtimer1_ReadValue()+1) * cntlreg * 0.0012308) / 4.615 ); | |
| 650 if (timer1 <= MIN_SLEEP_TIME) return(0); | |
| 651 old = Dtimer1_ReadValue(); | |
| 652 HWTimer = timer1; | |
| 653 } | |
| 654 | |
| 655 cntlreg = Dtimer2_Get_cntlreg(); | |
| 656 if ( (cntlreg & D_TIMER_RUN) == D_TIMER_RUN) | |
| 657 { | |
| 658 #if 0 /* match TCS211 object */ | |
| 659 cntlreg = cntlreg&0x1F; | |
| 660 #endif | |
| 661 cntlreg >>= 2; // take PTV | |
| 662 cntlreg = 1 << (cntlreg+1); | |
| 663 timer2 = (WORD32) ( ((Dtimer2_ReadValue()+1) * cntlreg * 0.0012308) / 4.615 ); | |
| 664 if (timer2 <= MIN_SLEEP_TIME) return(0); | |
| 665 if (HWTimer == -1) HWTimer = timer2; | |
| 666 else MIN(HWTimer,timer2) | |
| 667 } | |
| 668 | |
| 669 cntlreg = TIMER_Read(0); // AND 0x0f80 | |
| 670 modereg = TIMER_Read(2); | |
| 671 | |
| 672 if ( (cntlreg & TIMER_ST) || (modereg & TIMER_WDOG)) | |
| 673 { | |
| 674 // in watchdog mode PTV is forced to 7 | |
| 675 if ( modereg & TIMER_WDOG ) | |
| 676 cntlreg |= TIMER_PTV; | |
| 677 | |
| 678 cntlreg = (cntlreg & TIMER_PTV) >> 9; // take PTV | |
| 679 cntlreg = 1 << (cntlreg+1); | |
| 680 watchdog = (WORD32) ( ((TIMER_ReadValue()+1) * cntlreg * 0.001078) / 4.615 ); | |
| 681 if (watchdog <= MIN_SLEEP_TIME) return(0); | |
| 682 if (HWTimer == -1) HWTimer = watchdog; | |
| 683 else MIN(HWTimer,watchdog) | |
| 684 } | |
| 685 | |
| 686 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 687 /* | |
| 688 * Secure Watchdog Timer management | |
| 689 */ | |
| 690 cntlreg = TIMER_SEC_Read(0); // AND 0x0f80 | |
| 691 modereg = TIMER_SEC_Read(2); | |
| 692 if ( (cntlreg & TIMER_ST) || (modereg & TIMER_WDOG)) | |
| 693 { | |
| 694 // in watchdog mode PTV is forced to 7 | |
| 695 if ( modereg & TIMER_WDOG ) | |
| 696 cntlreg |= TIMER_PTV; | |
| 697 | |
| 698 cntlreg = (cntlreg & TIMER_PTV) >> 9; // take PTV | |
| 699 cntlreg = 1 << (cntlreg+1); | |
| 700 watchdog_sec = (WORD32) ( ((TIMER_SEC_ReadValue()+1) * cntlreg * 0.001078) / 4.615 ); | |
| 701 if (watchdog_sec <= MIN_SLEEP_TIME) return(0); | |
| 702 if (HWTimer == -1) HWTimer = watchdog_sec; | |
| 703 else MIN(HWTimer,watchdog_sec) | |
| 704 } | |
| 705 | |
| 706 #endif | |
| 707 | |
| 708 return (HWTimer); | |
| 709 #else // simulation part | |
| 710 return (-1); // no HW timer in simulation | |
| 711 #endif | |
| 712 } | |
| 713 | |
| 714 #if (GSM_IDLE_RAM != 0) // Compile only if GSM_IDLE_RAM enabled | |
| 715 | |
| 716 void l1s_adapt_traffic_controller(void) | |
| 717 { | |
| 718 BOOL l1s_extram; | |
| 719 UWORD8 nb_bitmap; | |
| 720 T_L1S_GSM_IDLE_INTRAM * gsm_idle_ram_ctl; | |
| 721 | |
| 722 gsm_idle_ram_ctl = &(l1s.gsm_idle_ram_ctl); | |
| 723 | |
| 724 l1s_extram = FALSE; | |
| 725 | |
| 726 for(nb_bitmap=0; ((nb_bitmap < SIZE_TAB_L1S_MONITOR) && (l1s_extram == FALSE)); nb_bitmap++) | |
| 727 { | |
| 728 if (nb_bitmap == 1) | |
| 729 { | |
| 730 l1s_extram |= (((INT_RAM_GSM_IDLE_L1S_PROCESSES1 ^ gsm_idle_ram_ctl->task_bitmap_idle_ram[nb_bitmap]) & gsm_idle_ram_ctl->task_bitmap_idle_ram[nb_bitmap]) != 0); | |
| 731 }else | |
| 732 { | |
| 733 l1s_extram |= (gsm_idle_ram_ctl->task_bitmap_idle_ram[nb_bitmap] != 0); | |
| 734 } | |
| 735 } | |
| 736 | |
| 737 if ((l1s_extram != FALSE) && (!READ_TRAFFIC_CONT_STATE)) | |
| 738 { | |
| 739 CSMI_TrafficControllerOn(); | |
| 740 #if (TRACE_TYPE==1) || (TRACE_TYPE==4) | |
| 741 { | |
| 742 l1s_trace_mftab(); | |
| 743 } | |
| 744 #endif | |
| 745 } | |
| 746 } | |
| 747 #endif | |
| 748 | |
| 749 UWORD32 last_wakeup = 0; | |
| 750 UWORD8 wakeup_type; // Type of the interrupt | |
| 751 UWORD8 why_big_sleep; // Type of the big sleep | |
| 752 | |
| 753 extern UWORD16 int_id; | |
| 754 | |
| 755 // l1s_sleep_manager() | |
| 756 // Description: | |
| 757 // evaluate the loading of the system | |
| 758 // - SIM, UART, LCD .... | |
| 759 // - Nucleus tasks, Hisrs, timers | |
| 760 // - Timer1, Timer2, Watchdog | |
| 761 // program Big or Deep sleep | |
| 762 | |
| 763 void l1s_sleep_manager() | |
| 764 { | |
| 765 //UWORD8 temp=0; OMAPS00090550 | |
| 766 | |
| 767 UWORD16 temp_clear_intr; | |
| 768 | |
| 769 // fn when l1s_sleep_manager function is called | |
| 770 #if (CODE_VERSION != SIMULATION) | |
| 771 UWORD32 sleep_time = l1s.actual_time.fn_mod42432; | |
| 772 #else | |
| 773 UWORD32 sleep_time = l1s.actual_time.fn; | |
| 774 #endif | |
| 775 | |
| 776 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 777 { | |
| 778 // Power management is enabled | |
| 779 WORD32 min_time, HWtimer,wake_up_time,min_time_gauging; | |
| 780 WORD32 afc_fix; | |
| 781 static UWORD32 previous_sleep = CLOCK_STOP; | |
| 782 #if (W_A_CALYPSO_PLUS_SPR_19599 == 1) | |
| 783 BOOL extended_page_mode_state = 0; //Store state of extended page mode | |
| 784 #endif | |
| 785 WORD32 time_from_last_wakeup=0; | |
| 786 UWORD32 sleep_mode; | |
| 787 | |
| 788 #if (OP_BT == 1) | |
| 789 WORD32 hci_ll_status; | |
| 790 #endif | |
| 791 | |
| 792 // init for trace and debug | |
| 793 why_big_sleep = BIG_SLEEP_DUE_TO_UNDEFINED; | |
| 794 wakeup_type = WAKEUP_FOR_UNDEFINED; | |
| 795 | |
| 796 time_from_last_wakeup = (sleep_time - last_wakeup + 42432) % 42432; | |
| 797 | |
| 798 //================================================= | |
| 799 // check System (SIM, UART, LDC ..... ) | |
| 800 //================================================= | |
| 801 sleep_mode = Cust_check_system(); | |
| 802 | |
| 803 if (sleep_mode == DO_NOT_SLEEP) | |
| 804 return; | |
| 805 | |
| 806 #if (CODE_VERSION != SIMULATION) | |
| 807 //================================================= | |
| 808 // Protect System structures | |
| 809 // must be called BEFORE INT_DisableIRQ() while | |
| 810 // Nucleus does not restore IRQ/FIQ bits !!!! | |
| 811 //================================================= | |
| 812 OS_system_protect(); | |
| 813 //================================================= | |
| 814 // Disable IRQ | |
| 815 //================================================= | |
| 816 INT_DisableIRQ(); | |
| 817 #endif // NOT SIMULATION | |
| 818 | |
| 819 //================================================= | |
| 820 // check OS loading | |
| 821 //================================================= | |
| 822 min_time = OS_get_inactivity_ticks(); | |
| 823 | |
| 824 //================================================= | |
| 825 // check HW Timers loading | |
| 826 //================================================= | |
| 827 HWtimer= l1s_get_HWTimers_ticks(); | |
| 828 | |
| 829 //================================================= | |
| 830 // check next gauging task for Packet Idle | |
| 831 //================================================= | |
| 832 #if L1_GPRS | |
| 833 min_time_gauging = l1s_get_next_gauging_in_Packet_Idle(); | |
| 834 #else | |
| 835 min_time_gauging = -1; // not used | |
| 836 #endif | |
| 837 | |
| 838 #if (OP_BT == 1) | |
| 839 hci_ll_status = hci_ll_ok_for_sleep(); | |
| 840 #endif | |
| 841 // check if immediate activity planned | |
| 842 // 0 means immediate activity | |
| 843 // in case big sleep is choosen (sleep mode == FRAME_STOP) because of UART or SIM, | |
| 844 // return and wait end of this activity (few TDMA frames) then check on next TDMA frames | |
| 845 // if MS can go in deep sleep | |
| 846 if ( !min_time | |
| 847 || !HWtimer | |
| 848 || !min_time_gauging | |
| 849 || (sleep_mode != CLOCK_STOP) | |
| 850 #if (OP_BT == 1) | |
| 851 || !hci_ll_status | |
| 852 #endif | |
| 853 ) | |
| 854 { | |
| 855 | |
| 856 | |
| 857 #if (CODE_VERSION != SIMULATION) | |
| 858 OS_system_Unprotect(); | |
| 859 // free System structure | |
| 860 // Enable all IRQ | |
| 861 INT_EnableIRQ(); | |
| 862 // Wake up UART | |
| 863 | |
| 864 SER_WakeUpUarts(); // Wake up Uarts | |
| 865 | |
| 866 #endif | |
| 867 return; | |
| 868 } | |
| 869 //================================================= | |
| 870 // Select sleep duration .... | |
| 871 //================================================= | |
| 872 // remember: -1 means no activity planned | |
| 873 //l1a_l1s_com.time_to_next_l1s_task is UW32, min_time is W32. Max value of l1a_l1s_com.time_to_next_l1s_task will be 2p31 | |
| 874 //and ,min_time max value will be 2p30. If min_time > l1a_l1s_com.time_to_next_l1s_task, | |
| 875 //means MSB of l1a_l1s_com.time_to_next_l1s_task is zero. so, we can use- uw32_store_next_time & 0x7FFFFFFF | |
| 876 | |
| 877 if (min_time == -1) min_time = l1a_l1s_com.time_to_next_l1s_task; | |
| 878 else MIN(min_time, l1a_l1s_com.time_to_next_l1s_task) | |
| 879 if (HWtimer != -1) MIN(min_time, HWtimer) | |
| 880 if (min_time_gauging != -1) MIN(min_time, min_time_gauging) | |
| 881 | |
| 882 #if (TRACE_TYPE !=0 ) && (TRACE_TYPE != 2) && (TRACE_TYPE != 3) | |
| 883 // to trace the Wake up source | |
| 884 // depending of min_time choose the wakeup_type | |
| 885 wakeup_type = WAKEUP_FOR_OS_TASK; | |
| 886 if (min_time == l1a_l1s_com.time_to_next_l1s_task) wakeup_type = WAKEUP_FOR_L1_TASK; | |
| 887 if (min_time == HWtimer) wakeup_type = WAKEUP_FOR_HW_TIMER_TASK; | |
| 888 if (min_time == min_time_gauging) wakeup_type = WAKEUP_FOR_GAUGING_TASK; | |
| 889 #endif | |
| 890 | |
| 891 //================================================= | |
| 892 // Choose DEEP or BIG SLEEP | |
| 893 //================================================= | |
| 894 if ( ((l1s.pw_mgr.mode_authorized == DEEP_SLEEP) && (sleep_mode == CLOCK_STOP)) || | |
| 895 ((l1s.pw_mgr.mode_authorized == ALL_SLEEP) && (sleep_mode == CLOCK_STOP)) ) | |
| 896 { | |
| 897 // Check now gauging histogramme or if in inactive period of cell selection | |
| 898 #if (W_A_DSP_IDLE3 == 1) && (CODE_VERSION!=SIMULATION) | |
| 899 if (((l1s.pw_mgr.enough_gaug == TRUE) || (l1a_l1s_com.mode == CS_MODE0)) && | |
| 900 ( l1s_dsp_com.dsp_ndb_ptr->d_dsp_state == C_DSP_IDLE3)) | |
| 901 #else | |
| 902 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 903 if (((l1s.pw_mgr.enough_gaug == TRUE) || (l1a_l1s_com.mode == CS_MODE0)) && | |
| 904 !CLKM_READ_nIDLE3) | |
| 905 #else | |
| 906 if ((l1s.pw_mgr.enough_gaug == TRUE) || (l1a_l1s_com.mode == CS_MODE0)) | |
| 907 #endif | |
| 908 #endif | |
| 909 l1s.pw_mgr.sleep_performed = CLOCK_STOP; | |
| 910 else | |
| 911 { | |
| 912 // BIG SLEEP is chosen : check the reason | |
| 913 l1s.pw_mgr.sleep_performed = FRAME_STOP; | |
| 914 if (l1s.pw_mgr.enough_gaug != TRUE) | |
| 915 why_big_sleep = BIG_SLEEP_DUE_TO_GAUGING; | |
| 916 else | |
| 917 why_big_sleep = BIG_SLEEP_DUE_TO_DSP_TRACES; | |
| 918 } | |
| 919 } | |
| 920 if (l1s.pw_mgr.mode_authorized == BIG_SLEEP) | |
| 921 why_big_sleep = BIG_SLEEP_DUE_TO_SLEEP_MODE; | |
| 922 | |
| 923 if ( ((l1s.pw_mgr.mode_authorized == BIG_SLEEP) && (sleep_mode >= FRAME_STOP)) || | |
| 924 ((l1s.pw_mgr.mode_authorized >= DEEP_SLEEP) && (sleep_mode == FRAME_STOP)) ) | |
| 925 l1s.pw_mgr.sleep_performed = FRAME_STOP; | |
| 926 | |
| 927 | |
| 928 if ((previous_sleep == CLOCK_STOP) && (time_from_last_wakeup < 7)) | |
| 929 { | |
| 930 #if (CODE_VERSION != SIMULATION) | |
| 931 OS_system_Unprotect(); // free System structure | |
| 932 INT_EnableIRQ(); // Enable all IRQ | |
| 933 | |
| 934 SER_WakeUpUarts(); // Wake up Uarts | |
| 935 | |
| 936 #endif // NOT SIMULATION | |
| 937 return; | |
| 938 } | |
| 939 | |
| 940 // update previous sleep | |
| 941 previous_sleep = l1s.pw_mgr.sleep_performed; | |
| 942 | |
| 943 | |
| 944 #if (CODE_VERSION != SIMULATION) | |
| 945 | |
| 946 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 947 F_INTH_DISABLE_ONE_IT(C_INTH_FRAME_IT); // mask Frame int. | |
| 948 #else | |
| 949 INTH_DISABLEONEIT(IQ_FRAME); // mask Frame int. | |
| 950 #endif | |
| 951 #endif | |
| 952 | |
| 953 //===================================================== | |
| 954 // if CLOCK_STOP : stop RF, TPU, asleep Omega, DPLL, SPI | |
| 955 // if FRAME_STOP : asleep Omega, SPI | |
| 956 //===================================================== | |
| 957 #if (CODE_VERSION != SIMULATION) | |
| 958 if ( l1s.pw_mgr.sleep_performed == CLOCK_STOP ) | |
| 959 { | |
| 960 // ==== STop RF and TPU..... =================== | |
| 961 | |
| 962 //L1_trace_string("Proceeding to Deep Sleep\n"); | |
| 963 | |
| 964 | |
| 965 l1dmacro_RF_sleep(); | |
| 966 | |
| 967 // (*(volatile UWORD16 *)l1s_tpu_com.reg_cmd) =TPU_CTRL_RESET | | |
| 968 // TSP_CTRL_RESET |TPU_CTRL_CLK_EN; | |
| 969 // (*(volatile UWORD16 *)l1s_tpu_com.reg_cmd) =0; | |
| 970 | |
| 971 //===== SET default value for gauging ========= | |
| 972 // If we have come in here during the inactive period of cell | |
| 973 // selection, then load the ULPD timers with default values | |
| 974 // (used when the MS lost the network: in this case the deep sleep may be used) | |
| 975 if (l1a_l1s_com.mode == CS_MODE0) | |
| 976 { | |
| 977 l1ctl_pgm_clk32(DEFAULT_HFMHZ_VALUE, DEFAULT_32KHZ_VALUE); | |
| 978 } | |
| 979 } | |
| 980 | |
| 981 | |
| 982 //============================================== | |
| 983 // disable DPLL (do not provide clk to DSP & RIF (RIF)) | |
| 984 //============================================== | |
| 985 #if ((CHIPSET ==4) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12) || (CHIPSET == 15)) | |
| 986 // disable DPLL (do not provide clk to DSP & RIF (Bridge)) | |
| 987 ( * (volatile SYS_UWORD16 *) CLKM_CNTL_CLK) |= CLKM_DPLL_DIS | CLKM_BRIDGE_DIS; | |
| 988 #endif | |
| 989 | |
| 990 //============================================== | |
| 991 // if CLOCK_STOP or FRAME-STOP : Asleep OMEGA (ABB) | |
| 992 //============================================== | |
| 993 afc_fix = ABB_sleep(l1s.pw_mgr.sleep_performed, l1s.afc); | |
| 994 | |
| 995 #if (OP_BT == 1) | |
| 996 hci_ll_go_to_sleep(); | |
| 997 #endif | |
| 998 //================================================= | |
| 999 // STop SPI ..... | |
| 1000 //================================================= | |
| 1001 | |
| 1002 *((volatile UWORD16 *)MEM_SPI)&=0xFFFE; // SPI CLK DISABLED | |
| 1003 #endif // NOT SIMULATION | |
| 1004 | |
| 1005 | |
| 1006 //================================================= | |
| 1007 // CQ19599: For Calypso+ chipset, extended page mode | |
| 1008 // shall be disabled before entering deep sleep and | |
| 1009 // restored at wake up | |
| 1010 //================================================= | |
| 1011 #if (W_A_CALYPSO_PLUS_SPR_19599 == 1) | |
| 1012 extended_page_mode_state = (BOOL) f_memif_extended_page_mode_read_bit(); | |
| 1013 f_memif_extended_page_mode_disable(); | |
| 1014 #endif | |
| 1015 | |
| 1016 //================================================= | |
| 1017 // Init the timer : | |
| 1018 // | |
| 1019 // a margin of 4 frames (>MIN_SLEEP_TIME) is taken | |
| 1020 // when evaluating system loading, because 1 frame | |
| 1021 // is lost for wakeup only, and because sleep | |
| 1022 // duration less than 1 frame is not worth .... | |
| 1023 // | |
| 1024 // 1 2 3 4 5 6 7 8 | |
| 1025 // SLEEP_CTRL SLEEP WAKEUP TASK (RF,Timer, ...) | |
| 1026 // | |
| 1027 //================================================= | |
| 1028 //ULPD Timer can be loaded up to MAX_GSM_TIMER (possible in CS_MODE0) | |
| 1029 if ( l1s.pw_mgr.sleep_performed == CLOCK_STOP ) | |
| 1030 { | |
| 1031 // DEEP SLEEP -> need time to setup afc and rf | |
| 1032 wake_up_time = min_time - l1_config.params.setup_afc_and_rf; | |
| 1033 } | |
| 1034 else | |
| 1035 // BIG SLEEP | |
| 1036 wake_up_time = min_time - 1; | |
| 1037 | |
| 1038 | |
| 1039 | |
| 1040 #if (CODE_VERSION != SIMULATION) | |
| 1041 if ( wake_up_time >= MAX_GSM_TIMER) | |
| 1042 ULDP_TIMER_INIT(MAX_GSM_TIMER); | |
| 1043 else | |
| 1044 ULDP_TIMER_INIT(wake_up_time); | |
| 1045 | |
| 1046 ULDP_TIMER_LD; // Load the timer | |
| 1047 | |
| 1048 // BUG3060. Clear pending IQ_TGSM from ULPD. This could happen in case ULPD was frozen | |
| 1049 // with zero into its GSM counter. In that case, the interrupt is still pending | |
| 1050 // and if it is not cleared, it wakes the board up just after switching the clock. | |
| 1051 // Clear it into the ULPD... | |
| 1052 // The ULDP_GSM_TIMER_IT_REG is a read only register and is cleared on | |
| 1053 //reading the register. | |
| 1054 temp_clear_intr =(* (volatile UWORD16 *) ULDP_GSM_TIMER_IT_REG) & ULPD_IT_TIMER_GSM; | |
| 1055 // ... and next into the INTH. (must be done in this order | |
| 1056 | |
| 1057 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 1058 F_INTH_RESET_ONE_IT(C_INTH_TGSM_IT); | |
| 1059 F_INTH_ENABLE_ONE_IT(C_INTH_TGSM_IT); | |
| 1060 #else | |
| 1061 INTH_RESETONEIT(IQ_TGSM); // clear TDMA IRQ | |
| 1062 INTH_ENABLEONEIT(IQ_TGSM); // Unmask ULPD GSM int. | |
| 1063 #endif | |
| 1064 | |
| 1065 #if (GSM_IDLE_RAM != 0) | |
| 1066 if (READ_TRAFFIC_CONT_STATE) | |
| 1067 { | |
| 1068 CSMI_TrafficControllerOff(); | |
| 1069 } | |
| 1070 #endif | |
| 1071 | |
| 1072 ULDP_TIMER_START; // start count down | |
| 1073 | |
| 1074 | |
| 1075 #if (GSM_IDLE_RAM_DEBUG == 1) | |
| 1076 (*( volatile unsigned short* )(0xFFFE4802)) &= ~ (1 << 2); // GPIO-2=0 | |
| 1077 #endif | |
| 1078 | |
| 1079 if ( l1s.pw_mgr.sleep_performed == CLOCK_STOP ) | |
| 1080 // DEEP SLEEP | |
| 1081 { | |
| 1082 #if (OP_WCP == 1) && (OP_L1_STANDALONE != 1) | |
| 1083 // specific sleep for WCP | |
| 1084 arm7_deep_sleep(); | |
| 1085 #else // NO OP_WCP | |
| 1086 #if (W_A_CALYPSO_BUG_01435 == 1) | |
| 1087 f_arm_sleep_cmd(DEEP_SLEEP); | |
| 1088 #else | |
| 1089 *((volatile UWORD16 *)CLKM_ARM_CLK) &= ~(CLKM_DEEP_SLEEP); // set deep sleep mode | |
| 1090 #endif | |
| 1091 #endif // OP_WCP | |
| 1092 } | |
| 1093 else | |
| 1094 { | |
| 1095 // BIG SLEEP / l1s.pw_mgr.sleep_performed == FRAME_STOP | |
| 1096 | |
| 1097 //========================================================== | |
| 1098 //Shut down PERIPHERALS clocks UWIRE and ARMIO if authorized | |
| 1099 //========================================================== | |
| 1100 | |
| 1101 UWORD16 clocks_stopped; //OMAPS90550- new | |
| 1102 clocks_stopped = (l1s.pw_mgr.clocks & l1s.pw_mgr.modules_status); | |
| 1103 if((clocks_stopped & ARMIO_CLK_CUT) == ARMIO_CLK_CUT) | |
| 1104 *((volatile UWORD16 *)ARMIO_CNTL_REG) &= ~(ARMIO_CLOCKEN); | |
| 1105 if((clocks_stopped & UWIRE_CLK_CUT) == UWIRE_CLK_CUT) | |
| 1106 *((volatile UWORD16 *)(MEM_UWIRE + 0x8)) &= ~(0x0001); | |
| 1107 | |
| 1108 #if (W_A_CALYPSO_BUG_01435 == 1) | |
| 1109 f_arm_sleep_cmd(BIG_SLEEP); | |
| 1110 #else | |
| 1111 | |
| 1112 *((volatile UWORD16 *)CLKM_ARM_CLK) &= ~(CLKM_MCLK_EN); // set big sleep mode | |
| 1113 #endif | |
| 1114 } | |
| 1115 #else // Simulation part | |
| 1116 l1s.pw_mgr.sleep_duration = wake_up_time; | |
| 1117 hw.deep_sleep_en = 1; | |
| 1118 status = NU_Suspend_Task(&L1S_task); | |
| 1119 // check status value... | |
| 1120 if (status) | |
| 1121 { | |
| 1122 #if (TRACE_TYPE==5) | |
| 1123 sprintf(errormsg,"Error somewhere in the L1S application to suspend : deep sleep\n"); | |
| 1124 log_sim_error(ERR); | |
| 1125 #endif | |
| 1126 EXIT; | |
| 1127 } | |
| 1128 #endif // SIMULATION | |
| 1129 | |
| 1130 //================================================= | |
| 1131 // Wake-up procedure | |
| 1132 //================================================= | |
| 1133 // Restore L1 data base, Nucleus, HW Timers .... | |
| 1134 //================================================= | |
| 1135 | |
| 1136 #if (GSM_IDLE_RAM_DEBUG == 1) | |
| 1137 (*( volatile unsigned short* )(0xFFFE4802)) |= (1 << 2); // GPIO-2=1 | |
| 1138 #endif | |
| 1139 | |
| 1140 | |
| 1141 l1s_wakeup(); | |
| 1142 | |
| 1143 last_wakeup = l1s.actual_time.fn_mod42432; | |
| 1144 | |
| 1145 if (last_wakeup == sleep_time) | |
| 1146 // sleep duration == 0 -> wakeup in the same frame as sleep | |
| 1147 wakeup_type = WAKEUP_ASYNCHRONOUS_SLEEP_DURATION_0; | |
| 1148 | |
| 1149 #if (GSM_IDLE_RAM != 0) | |
| 1150 // Update counters with sleep duration -> will be used case expiration in next wake up phase before traffic controller is enabled by msg sending | |
| 1151 gsm_idle_ram_ctl->os_load -= (l1s.pw_mgr.sleep_duration); | |
| 1152 gsm_idle_ram_ctl->hw_timer -= (l1s.pw_mgr.sleep_duration); | |
| 1153 | |
| 1154 if (l1s.pw_mgr.wakeup_type != WAKEUP_FOR_L1_TASK) | |
| 1155 { | |
| 1156 if (!READ_TRAFFIC_CONT_STATE) | |
| 1157 { | |
| 1158 CSMI_TrafficControllerOn(); | |
| 1159 } | |
| 1160 } | |
| 1161 #endif | |
| 1162 //================================================= | |
| 1163 //if CLOCK_STOP : restart TPU and RF.... | |
| 1164 //================================================= | |
| 1165 #if (CODE_VERSION != SIMULATION) | |
| 1166 if ( l1s.pw_mgr.sleep_performed == CLOCK_STOP ) | |
| 1167 { | |
| 1168 // (*(volatile UWORD16 *)l1s_tpu_com.reg_cmd) = TPU_CTRL_CLK_EN; | |
| 1169 UWORD8 local_sleep_status; | |
| 1170 | |
| 1171 l1dmacro_RF_wakeup(); | |
| 1172 | |
| 1173 } | |
| 1174 | |
| 1175 #if ((CHIPSET ==4) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11)) | |
| 1176 // enable DPLL (provide clk to DSP & RIF(Bridge) in small/big sleep) | |
| 1177 // On CALYPSO, BRIDGE clock can be cut according to the ARM sleep mode even during DMA transfer | |
| 1178 ( * (volatile SYS_UWORD16 *) CLKM_CNTL_CLK) &= ~(CLKM_DPLL_DIS | CLKM_BRIDGE_DIS); | |
| 1179 #elif (CHIPSET == 12) | |
| 1180 // Nothing to be done because if DSP wants clock, it will exit from IDLE3 mode, which wakes up the DPLL | |
| 1181 #elif (CHIPSET == 15) | |
| 1182 ( * (volatile SYS_UWORD16 *) CLKM_CNTL_CLK) &= ~(CLKM_DPLL_DIS); | |
| 1183 #endif | |
| 1184 | |
| 1185 //================================================= | |
| 1186 //if CLOCK_STOP or FRAME-STOP : ReStart SPI | |
| 1187 //================================================= | |
| 1188 *((volatile UWORD16 *)MEM_SPI)|=0x0001; // SPI CLK ENABLED | |
| 1189 | |
| 1190 //================================================= | |
| 1191 // Wake up ABB | |
| 1192 //================================================= | |
| 1193 ABB_wakeup(l1s.pw_mgr.sleep_performed, l1s.afc); | |
| 1194 | |
| 1195 #if (OP_BT == 1) | |
| 1196 hci_ll_wake_up(); | |
| 1197 #endif | |
| 1198 #endif //CODE VERSION | |
| 1199 | |
| 1200 //================================================= | |
| 1201 // CQ19599: For Calypso+ chipset, restore the extended | |
| 1202 // page mode if it was enabled before entering in sleep | |
| 1203 //================================================= | |
| 1204 #if (W_A_CALYPSO_PLUS_SPR_19599 == 1) | |
| 1205 if ( extended_page_mode_state != 0 ) | |
| 1206 f_memif_extended_page_mode_enable(); | |
| 1207 #endif | |
| 1208 | |
| 1209 #if (OP_L1_STANDALONE == 0) | |
| 1210 /*GC_Wakeup(); OMAPS00134004*/ | |
| 1211 #endif | |
| 1212 | |
| 1213 #if (CODE_VERSION != SIMULATION) | |
| 1214 //================================================= | |
| 1215 // enable IRQ | |
| 1216 //================================================= | |
| 1217 OS_system_Unprotect(); | |
| 1218 #endif | |
| 1219 | |
| 1220 #if (TRACE_TYPE != 0) | |
| 1221 if (l1a_l1s_com.mode != CS_MODE0) // in this mode the trace prevent from going to deep sleep due to UART activity | |
| 1222 { | |
| 1223 #if (GSM_IDLE_RAM == 0) | |
| 1224 l1_trace_sleep(sleep_time, l1s.actual_time.fn_mod42432, l1s.pw_mgr.sleep_performed, wakeup_type, why_big_sleep); | |
| 1225 #else | |
| 1226 l1_trace_sleep_intram(sleep_time, l1s.actual_time.fn_mod42432, l1s.pw_mgr.sleep_performed, wakeup_type, why_big_sleep); | |
| 1227 #if (TRACE_TYPE==1) || (TRACE_TYPE==4) | |
| 1228 l1s_trace_mftab(); | |
| 1229 #endif | |
| 1230 #endif | |
| 1231 } | |
| 1232 #endif | |
| 1233 | |
| 1234 #if (TRACE_TYPE == 1) || (TRACE_TYPE == 4) | |
| 1235 trace_info.sleep_performed = TRUE; | |
| 1236 #endif | |
| 1237 | |
| 1238 #if (CODE_VERSION != SIMULATION) | |
| 1239 | |
| 1240 //================================================= | |
| 1241 // enable IRQ | |
| 1242 //================================================= | |
| 1243 INT_EnableIRQ(); | |
| 1244 | |
| 1245 //================================================= | |
| 1246 // Be careful:in case of asynchronous wake-up after sleep | |
| 1247 // an IT_TDMA may be unmasked and executed just after OS_system_Unprotect(). | |
| 1248 // As we already are inside an hisr(), it implies the execution of an another hisr(). | |
| 1249 // In order to avoid issues with the execution of an hisr() inside the hisr() | |
| 1250 // do not add code here after !!! | |
| 1251 // if possible respect this rule ! | |
| 1252 //================================================= | |
| 1253 | |
| 1254 //================================================= | |
| 1255 // wake-up UARTs | |
| 1256 //this function must be call after the UART interrupt, | |
| 1257 //it means after the function INT_EnableIRQ() | |
| 1258 //================================================= | |
| 1259 { | |
| 1260 #if (GSM_IDLE_RAM != 0) | |
| 1261 // Traffic controller has to be enabled before calling SER_WakeUpUarts | |
| 1262 // as this function can access the external RAM. | |
| 1263 // Reset the flag that will indicates if an interrup will put the traffic | |
| 1264 // controller ON during that time. | |
| 1265 l1s.gsm_idle_ram_ctl.trff_ctrl_enable_cause_int = FALSE; | |
| 1266 if (!READ_TRAFFIC_CONT_STATE) | |
| 1267 { | |
| 1268 flag_traffic_controller_state = 1; | |
| 1269 CSMI_TrafficControllerOn(); | |
| 1270 } | |
| 1271 #endif | |
| 1272 | |
| 1273 | |
| 1274 SER_WakeUpUarts(); // Wake up Uarts | |
| 1275 | |
| 1276 | |
| 1277 #if (GSM_IDLE_RAM != 0) | |
| 1278 // The traffic controller state shall be restored as it was before | |
| 1279 // calling SER_WakeUpUarts. Do not disable it if an interrup occured | |
| 1280 // in between and activated the traffic controller. | |
| 1281 if ((flag_traffic_controller_state == 1) && (l1s.gsm_idle_ram_ctl.trff_ctrl_enable_cause_int == FALSE)) | |
| 1282 { | |
| 1283 CSMI_TrafficControllerOff(); | |
| 1284 } | |
| 1285 flag_traffic_controller_state = 0; | |
| 1286 #endif | |
| 1287 } | |
| 1288 #endif // NOT SIMULATION | |
| 1289 } | |
| 1290 } | |
| 1291 | |
| 1292 // l1s_wakeup() */ | |
| 1293 // Description: wake-up of the MCU from GSM Timer it OR unscheduled wake-up | |
| 1294 // This function read the TPU timer and fix the : | |
| 1295 // - system clock | |
| 1296 // - Nucleus timers | |
| 1297 // - L1 frame counter | |
| 1298 // - L1 next task counter | |
| 1299 // - Hardware timers | |
| 1300 | |
| 1301 void l1s_wakeup(void) | |
| 1302 { | |
| 1303 #if (CODE_VERSION != SIMULATION) | |
| 1304 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 1305 { | |
| 1306 // Restore interrupts .... | |
| 1307 | |
| 1308 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 1309 // mask TGSM int. | |
| 1310 F_INTH_DISABLE_ONE_IT(C_INTH_TGSM_IT); | |
| 1311 #else | |
| 1312 INTH_DISABLEONEIT(IQ_TGSM); // mask TGSM int. | |
| 1313 #endif | |
| 1314 | |
| 1315 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 1316 int_id = ((* (SYS_UWORD16 *) C_INTH_B_IRQ_REG) & C_INTH_SRC_NUM);// For debug: Save IRQ that causes the waking up | |
| 1317 if ( int_id >= 256 ) | |
| 1318 int_id = ((* (SYS_UWORD16 *) C_INTH_B_FIQ_REG) & C_INTH_SRC_NUM)+100; | |
| 1319 #else | |
| 1320 int_id = ((* (SYS_UWORD16 *) INTH_B_IRQ_REG) & INTH_SRC_NUM);// For debug: Save IRQ that causes the waking up | |
| 1321 if ( int_id >= 256 ) | |
| 1322 int_id = ((* (SYS_UWORD16 *) INTH_B_FIQ_REG) & INTH_SRC_NUM)+100; | |
| 1323 #endif | |
| 1324 | |
| 1325 // clear pending IQ_FRAME it and unmask it | |
| 1326 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 1327 F_INTH_RESET_ONE_IT(C_INTH_FRAME_IT); | |
| 1328 F_INTH_ENABLE_ONE_IT(C_INTH_FRAME_IT); // Unmask FRAME int. | |
| 1329 #else | |
| 1330 INTH_RESETONEIT(IQ_FRAME); // clear TDMA IRQ | |
| 1331 INTH_ENABLEONEIT(IQ_FRAME); // Unmask FRAME int. | |
| 1332 #endif | |
| 1333 | |
| 1334 #if (CHIPSET == 8) | |
| 1335 // if deep sleep | |
| 1336 if ( l1s.pw_mgr.sleep_performed == CLOCK_STOP ) | |
| 1337 { | |
| 1338 UWORD8 i; | |
| 1339 | |
| 1340 // Loop with check whether DPLL is locked: 100 us max. | |
| 1341 for (i=0;i<16;i++) | |
| 1342 { | |
| 1343 if (DPLL_READ_DPLL_LOCK) | |
| 1344 break; | |
| 1345 } | |
| 1346 wait_ARM_cycles(convert_nanosec_to_cycles(50000)); // 50us | |
| 1347 | |
| 1348 // Enable DPLL | |
| 1349 //-------------------------------------------------- | |
| 1350 DPLL_SET_PLL_ENABLE; | |
| 1351 | |
| 1352 // Loop with check whether DPLL is locked: 100 us max. | |
| 1353 for (i=0;i<16;i++) | |
| 1354 { | |
| 1355 if (DPLL_READ_DPLL_LOCK) | |
| 1356 break; | |
| 1357 } | |
| 1358 wait_ARM_cycles(convert_nanosec_to_cycles(50000)); // 50us | |
| 1359 } // if deep sleep | |
| 1360 | |
| 1361 #endif // CHIPSET == 8 | |
| 1362 | |
| 1363 //================================================= | |
| 1364 //Restart PERIPHERALS clocks if necessary after a big sleep period | |
| 1365 // WARNING: restart other clocks modules!!! | |
| 1366 //================================================= | |
| 1367 | |
| 1368 | |
| 1369 #if(CHIPSET == 15) | |
| 1370 if(l1s.pw_mgr.sleep_performed == FRAME_STOP ) | |
| 1371 { | |
| 1372 | |
| 1373 //ABB_Wakeup_BS(); //Not Used | |
| 1374 //DBB_Wakeup_BS(); //Not Used | |
| 1375 } | |
| 1376 #else | |
| 1377 // if big sleep | |
| 1378 if ( l1s.pw_mgr.sleep_performed == FRAME_STOP ) | |
| 1379 { | |
| 1380 | |
| 1381 UWORD16 clocks_stopped; | |
| 1382 clocks_stopped = (l1s.pw_mgr.clocks & l1s.pw_mgr.modules_status); | |
| 1383 if((clocks_stopped & ARMIO_CLK_CUT) == ARMIO_CLK_CUT) | |
| 1384 *((volatile UWORD16 *)ARMIO_CNTL_REG) |= ARMIO_CLOCKEN; | |
| 1385 if((clocks_stopped & UWIRE_CLK_CUT) == UWIRE_CLK_CUT) | |
| 1386 *((volatile UWORD16 *)(MEM_UWIRE + 0x8)) |= 0x0001; | |
| 1387 | |
| 1388 } | |
| 1389 #endif | |
| 1390 | |
| 1391 | |
| 1392 /***************************************************/ | |
| 1393 /* Compute effective sleeping time .... */ | |
| 1394 /* */ | |
| 1395 /* sleep duration is */ | |
| 1396 /* - TIMER_INIT */ | |
| 1397 /* - or TIMER_INIT - TIMER_VALUE */ | |
| 1398 /* */ | |
| 1399 /* "frame_adjust" = TRUE for unschedules wake-up */ | |
| 1400 /* FALSE for scheduled wake-up */ | |
| 1401 /***************************************************/ | |
| 1402 l1s.pw_mgr.frame_adjust = l1s_compute_wakeup_ticks(); | |
| 1403 | |
| 1404 #if (TRACE_TYPE !=0 ) && (TRACE_TYPE != 2) && (TRACE_TYPE != 3) | |
| 1405 if ((l1s.pw_mgr.frame_adjust == TRUE)) | |
| 1406 wakeup_type = WAKEUP_BY_ASYNC_INTERRUPT; | |
| 1407 #endif | |
| 1408 | |
| 1409 | |
| 1410 /* Fix Frame */ | |
| 1411 | |
| 1412 l1s_recover_Frame(); | |
| 1413 | |
| 1414 | |
| 1415 /* Fix Hardware Timers */ | |
| 1416 /* */ | |
| 1417 /* GSM 1.0 : ntd - timer clock not cut */ | |
| 1418 /* */ | |
| 1419 /* GSM 1.5 : deep sleep - need to fix timers */ | |
| 1420 | |
| 1421 if (l1s.pw_mgr.sleep_performed == CLOCK_STOP) | |
| 1422 l1s_recover_HWTimers(); | |
| 1423 | |
| 1424 | |
| 1425 /* Fix Os */ | |
| 1426 | |
| 1427 if (Cust_recover_Os()) l1s.pw_mgr.Os_ticks_required = TRUE; | |
| 1428 } | |
| 1429 #else // SIMULATION part | |
| 1430 // update L1 timers (FN,...) | |
| 1431 l1s_recover_Frame(); | |
| 1432 #endif | |
| 1433 } | |
| 1434 | |
| 1435 | |
| 1436 | |
| 1437 /* l1s_wakeup_adjust() */ | |
| 1438 /* Description: 1 frame adjust a fter unscheduled wake-up */ | |
| 1439 /* This function fix the : */ | |
| 1440 /* - system clock */ | |
| 1441 /* - Nucleus timers */ | |
| 1442 /* - L1 frame counter */ | |
| 1443 /* - L1 next task counter */ | |
| 1444 /* - Hardware timers */ | |
| 1445 | |
| 1446 | |
| 1447 void l1s_wakeup_adjust () | |
| 1448 { | |
| 1449 #if (CODE_VERSION != SIMULATION) | |
| 1450 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 1451 { | |
| 1452 | |
| 1453 UWORD32 previous_sleep_time; | |
| 1454 | |
| 1455 /***************************************************/ | |
| 1456 // Freeze GSM Timer .... */ | |
| 1457 /***************************************************/ | |
| 1458 ULDP_TIMER_FREEZE; | |
| 1459 | |
| 1460 /***************************************************/ | |
| 1461 // Compute effective sleeping time .... | |
| 1462 // | |
| 1463 // compute sleep duration | |
| 1464 // - TIMER_INIT | |
| 1465 // - or TIMER_INIT - TIMER_VALUE | |
| 1466 /***************************************************/ | |
| 1467 // save sleep duration that was computed at "unscheduled wakeup" | |
| 1468 previous_sleep_time = l1s.pw_mgr.sleep_duration; | |
| 1469 | |
| 1470 l1s_compute_wakeup_ticks(); | |
| 1471 | |
| 1472 // reset flag for adjustment request .... | |
| 1473 l1s.pw_mgr.frame_adjust = FALSE; | |
| 1474 | |
| 1475 // fix sleep duration | |
| 1476 // => compute difference with duration computed at | |
| 1477 // "unscheduled wakeup" | |
| 1478 l1s.pw_mgr.sleep_duration -= previous_sleep_time; | |
| 1479 | |
| 1480 // adjust system with 1 frame IF NECESSARY .... | |
| 1481 if (l1s.pw_mgr.sleep_duration) | |
| 1482 { | |
| 1483 /***************************************************/ | |
| 1484 /* Fix Frame */ | |
| 1485 /***************************************************/ | |
| 1486 l1s_recover_Frame(); | |
| 1487 | |
| 1488 /***************************************************/ | |
| 1489 /* Fix Os */ | |
| 1490 /***************************************************/ | |
| 1491 if (Cust_recover_Os()) l1s.pw_mgr.Os_ticks_required = TRUE; | |
| 1492 } | |
| 1493 } | |
| 1494 #endif | |
| 1495 } | |
| 1496 | |
| 1497 | |
| 1498 /*-------------------------------------------------------*/ | |
| 1499 /* l1s_compute_wakeup_Ticks() */ | |
| 1500 /*-------------------------------------------------------*/ | |
| 1501 /* */ | |
| 1502 /* Description: wake-up */ | |
| 1503 /* ------------ */ | |
| 1504 /* This function compute the sleep duration according to */ | |
| 1505 /* current value of count down counter. */ | |
| 1506 /* - if TIMER_VALUE = 0 it returns TIMER_INIT */ | |
| 1507 /* - else it returns TIMER_INIT-TIMER_VALUE*/ | |
| 1508 /* */ | |
| 1509 /*-------------------------------------------------------*/ | |
| 1510 BOOL l1s_compute_wakeup_ticks(void) | |
| 1511 { | |
| 1512 UWORD16 temp_clear_intr; | |
| 1513 #if (CODE_VERSION != SIMULATION) | |
| 1514 // read current value of count down counter | |
| 1515 l1s.pw_mgr.sleep_duration = READ_ULDP_TIMER_VALUE; | |
| 1516 | |
| 1517 // if count down=0 it's a scheduled wake-up.... | |
| 1518 if (l1s.pw_mgr.sleep_duration == 0) | |
| 1519 { | |
| 1520 // read sleeping planned value in TPU INIT register | |
| 1521 l1s.pw_mgr.sleep_duration = READ_ULDP_TIMER_INIT; | |
| 1522 // INTH is different from the ULPD interrupt -> aynchronous wakeup | |
| 1523 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 1524 if (int_id != C_INTH_TGSM_IT) | |
| 1525 #else | |
| 1526 if (int_id != IQ_TGSM) | |
| 1527 #endif | |
| 1528 { | |
| 1529 wakeup_type = WAKEUP_ASYNCHRONOUS_ULPD_0; | |
| 1530 // RESET IT_ULPD in ULPD module | |
| 1531 // The ULDP_GSM_TIMER_IT_REG is a read only register and is cleared on reading the register | |
| 1532 temp_clear_intr =(* (volatile UWORD16 *) ULDP_GSM_TIMER_IT_REG) & ULPD_IT_TIMER_GSM; | |
| 1533 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 1534 // RESET IQ_TGSM (IT_ULPD) in IT register | |
| 1535 F_INTH_RESET_ONE_IT(C_INTH_TGSM_IT); | |
| 1536 // RESET IQ_FRAME in IT register | |
| 1537 F_INTH_RESET_ONE_IT(C_INTH_FRAME_IT); | |
| 1538 int_id = C_INTH_TGSM_IT; | |
| 1539 #else | |
| 1540 // RESET IQ_TGSM (IT_ULPD) in IT register | |
| 1541 INTH_RESETONEIT(IQ_TGSM); | |
| 1542 // RESET IQ_FRAME in IT register | |
| 1543 INTH_RESETONEIT(IQ_FRAME); | |
| 1544 int_id = IQ_TGSM; | |
| 1545 #endif | |
| 1546 return(FALSE); | |
| 1547 } | |
| 1548 else | |
| 1549 return(FALSE); | |
| 1550 } | |
| 1551 else // Unscheduled wakeup | |
| 1552 { | |
| 1553 // read sleeping planned value in TPU INIT register & compute time elapsed | |
| 1554 l1s.pw_mgr.sleep_duration = READ_ULDP_TIMER_INIT - l1s.pw_mgr.sleep_duration; | |
| 1555 return(TRUE); | |
| 1556 } | |
| 1557 #else | |
| 1558 return(FALSE);//omaps00090550 | |
| 1559 #endif | |
| 1560 } | |
| 1561 | |
| 1562 /*-------------------------------------------------------*/ | |
| 1563 /* l1s_recover_Frame() */ | |
| 1564 /*-------------------------------------------------------*/ | |
| 1565 /* */ | |
| 1566 /* Description: adjust layer1 data from sleep duration */ | |
| 1567 /* ------------ */ | |
| 1568 /*-------------------------------------------------------*/ | |
| 1569 void l1s_recover_Frame(void) | |
| 1570 { | |
| 1571 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 1572 { | |
| 1573 /***************************************************/ | |
| 1574 /* Fix Frame counters . */ | |
| 1575 /***************************************************/ | |
| 1576 l1s.debug_time += l1s.pw_mgr.sleep_duration; // used for debug and by L3 scenario. | |
| 1577 | |
| 1578 // Time... | |
| 1579 // Update "actual time". | |
| 1580 l1s_increment_time(&(l1s.actual_time), l1s.pw_mgr.sleep_duration); | |
| 1581 | |
| 1582 // Update "next time". | |
| 1583 l1s.next_time = l1s.actual_time; | |
| 1584 l1s_increment_time(&(l1s.next_time), 1); // Next time is actual_time + 1 | |
| 1585 | |
| 1586 #if L1_GPRS | |
| 1587 // Update "next plus time". | |
| 1588 l1s.next_plus_time = l1s.next_time; | |
| 1589 l1s_increment_time(&(l1s.next_plus_time), 1); // Next_plus time is next_time + 1 | |
| 1590 #endif | |
| 1591 | |
| 1592 #if (TRACE_TYPE == 1) || (TRACE_TYPE == 4) | |
| 1593 trace_fct(CST_L1S_ADJUST_TIME, (UWORD32)(-1)); | |
| 1594 #endif | |
| 1595 | |
| 1596 // Multiframe table... | |
| 1597 // Increment active frame % mftab size. | |
| 1598 l1s.afrm = (l1s.afrm + l1s.pw_mgr.sleep_duration) % MFTAB_SIZE; | |
| 1599 | |
| 1600 // Control function counters... | |
| 1601 // Increment frame count from last AFC update. | |
| 1602 l1s.afc_frame_count+= l1s.pw_mgr.sleep_duration; | |
| 1603 // reset counter to mask SNR/TOA results for 2 fr. | |
| 1604 #if (TOA_ALGO == 2) | |
| 1605 l1s.toa_var.toa_snr_mask=0; | |
| 1606 #else | |
| 1607 l1s.toa_snr_mask=0; | |
| 1608 #endif | |
| 1609 | |
| 1610 /***************************************************/ | |
| 1611 /* Fix next L1S task counter */ | |
| 1612 /***************************************************/ | |
| 1613 // Decrement time to next L1S task. | |
| 1614 if((l1a_l1s_com.time_to_next_l1s_task > 0) && | |
| 1615 (l1a_l1s_com.time_to_next_l1s_task < MAX_FN)) | |
| 1616 l1a_l1s_com.time_to_next_l1s_task -= l1s.pw_mgr.sleep_duration; | |
| 1617 } // l1_config.pwr_mngt == PWR_MNGT | |
| 1618 } | |
| 1619 | |
| 1620 | |
| 1621 /*-------------------------------------------------------*/ | |
| 1622 /* l1s_recover_HWTimers() */ | |
| 1623 /*-------------------------------------------------------*/ | |
| 1624 /* */ | |
| 1625 /* Description: adjust hardware timers from sleep */ | |
| 1626 /* ------------ duration */ | |
| 1627 /* */ | |
| 1628 /* Timers clocks are enabled after VTCX0+SLICER+13MHZ */ | |
| 1629 /* setup times. So sleep duration is : */ | |
| 1630 /* GSM TIMER - SETUP_FRAME + SETUP_SLICER + SETUP_VTCXO */ | |
| 1631 /* + SETUP_CLK13 */ | |
| 1632 /*-------------------------------------------------------*/ | |
| 1633 | |
| 1634 void l1s_recover_HWTimers(void) | |
| 1635 { | |
| 1636 #if (CODE_VERSION != SIMULATION) | |
| 1637 | |
| 1638 #define SETUP_FRAME_IN_CLK32 (SETUP_FRAME*4.615*32.768) | |
| 1639 #if (CHIPSET == 15) | |
| 1640 #define DELTA_TIME (0) | |
| 1641 #else | |
| 1642 #define DELTA_TIME (SETUP_FRAME_IN_CLK32 -SETUP_SLICER - SETUP_VTCXO) | |
| 1643 #endif | |
| 1644 | |
| 1645 | |
| 1646 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 1647 { | |
| 1648 WORD32 timer1,timer2,timer; | |
| 1649 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 1650 WORD32 timer_sec; | |
| 1651 #endif | |
| 1652 UWORD16 cntlreg; | |
| 1653 UWORD16 modereg; | |
| 1654 double duration; | |
| 1655 | |
| 1656 | |
| 1657 //WORD32 old;- OMAPS 90550 new | |
| 1658 | |
| 1659 // read Hercules Timers & Watchdog | |
| 1660 //================================================= | |
| 1661 // Tint = Tclk * (LOAD_TIM+1) * 2^(PTV+1) | |
| 1662 // Tclk = 1.2308us for Fclk=13Mhz | |
| 1663 // PTV = 7 (pre-scaler field) | |
| 1664 //------------------------------------------------- | |
| 1665 | |
| 1666 cntlreg = Dtimer1_Get_cntlreg(); | |
| 1667 if ( (cntlreg & D_TIMER_RUN) == D_TIMER_RUN) | |
| 1668 { | |
| 1669 #if 0 /* match TCS211 object */ | |
| 1670 cntlreg = cntlreg&0x1F; | |
| 1671 #endif | |
| 1672 cntlreg >>= 2; // take PTV | |
| 1673 cntlreg = 1 << (cntlreg+1); // compute 2^(PTV+1) | |
| 1674 // convert sleep duration in HWTimers ticks.... | |
| 1675 duration = (l1s.pw_mgr.sleep_duration * 4.615 - (DELTA_TIME/32.768)) / (cntlreg * 0.0012308); | |
| 1676 #if 0 /* match TCS211 object */ | |
| 1677 if (duration < 0.0){ | |
| 1678 duration = 0.0; // This needs to be done for all the timers | |
| 1679 } | |
| 1680 #endif | |
| 1681 timer1 = Dtimer1_ReadValue() - (UWORD16) duration; | |
| 1682 | |
| 1683 Dtimer1_Start(0); | |
| 1684 Dtimer1_WriteValue(timer1); | |
| 1685 Dtimer1_Start(1); | |
| 1686 } | |
| 1687 | |
| 1688 cntlreg = Dtimer2_Get_cntlreg(); | |
| 1689 if ( (cntlreg & D_TIMER_RUN) == D_TIMER_RUN) | |
| 1690 { | |
| 1691 #if 0 /* match TCS211 object */ | |
| 1692 cntlreg = cntlreg&0x1F; | |
| 1693 #endif | |
| 1694 cntlreg >>= 2; // take PTV | |
| 1695 cntlreg = 1 << (cntlreg+1); | |
| 1696 // convert sleep duration in HWTimers ticks.... | |
| 1697 duration = (l1s.pw_mgr.sleep_duration * 4.615 - (DELTA_TIME/32.768)) / (cntlreg * 0.0012308); | |
| 1698 #if 0 /* match TCS211 object */ | |
| 1699 if (duration < 0.0){ | |
| 1700 duration = 0.0; // This needs to be done for all the timers | |
| 1701 } | |
| 1702 #endif | |
| 1703 timer2 = Dtimer2_ReadValue() - (UWORD16) duration; | |
| 1704 Dtimer2_Start(0); | |
| 1705 Dtimer2_WriteValue(timer2); | |
| 1706 Dtimer2_Start(1); | |
| 1707 } | |
| 1708 | |
| 1709 cntlreg = TIMER_Read(0); | |
| 1710 modereg = TIMER_Read(2); | |
| 1711 if ( (cntlreg & TIMER_ST) || (modereg & TIMER_WDOG)) | |
| 1712 { | |
| 1713 // in watchdog mode PTV is forced to 7 | |
| 1714 if ( modereg & TIMER_WDOG ) | |
| 1715 cntlreg |= TIMER_PTV; | |
| 1716 | |
| 1717 cntlreg = (cntlreg & TIMER_PTV) >> 9; // take PTV | |
| 1718 cntlreg = 1 << (cntlreg+1); | |
| 1719 // convert sleep duration in HWTimers ticks.... | |
| 1720 duration = (l1s.pw_mgr.sleep_duration * 4.615 - (DELTA_TIME/32.768)) / (cntlreg * 0.001078); | |
| 1721 | |
| 1722 timer = TIMER_ReadValue() - (UWORD16) duration; | |
| 1723 TIMER_START_STOP(0); | |
| 1724 TIMER_WriteValue(timer); | |
| 1725 TIMER_START_STOP(1); | |
| 1726 } | |
| 1727 | |
| 1728 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 1729 cntlreg = TIMER_SEC_Read(0); | |
| 1730 modereg = TIMER_SEC_Read(2); | |
| 1731 if ( (cntlreg & TIMER_ST) || (modereg & TIMER_WDOG)) | |
| 1732 { | |
| 1733 // in watchdog mode PTV is forced to 7 | |
| 1734 if ( modereg & TIMER_WDOG ) | |
| 1735 cntlreg |= TIMER_PTV; | |
| 1736 | |
| 1737 cntlreg = (cntlreg & TIMER_PTV) >> 9; // take PTV | |
| 1738 cntlreg = 1 << (cntlreg+1); | |
| 1739 // convert sleep duration in HWTimers ticks.... | |
| 1740 duration = (l1s.pw_mgr.sleep_duration * 4.615 - (DELTA_TIME/32.768)) / (cntlreg * 0.001078); | |
| 1741 | |
| 1742 timer_sec = TIMER_SEC_ReadValue() - (UWORD16) duration; | |
| 1743 TIMER_SEC_START_STOP(0); | |
| 1744 TIMER_SEC_WriteValue(timer_sec); | |
| 1745 TIMER_SEC_START_STOP(1); | |
| 1746 } | |
| 1747 #endif | |
| 1748 | |
| 1749 } | |
| 1750 #endif | |
| 1751 } | |
| 1752 /*-------------------------------------------------------*/ | |
| 1753 /* l1s_get_next_gauging_in_Packet_Idle() */ | |
| 1754 /*-------------------------------------------------------*/ | |
| 1755 /* */ | |
| 1756 /* Description: */ | |
| 1757 /* ------------ */ | |
| 1758 /* return the nbr of frames before the next gauging */ | |
| 1759 /* return -1 means no activity planned */ | |
| 1760 /*-------------------------------------------------------*/ | |
| 1761 #if L1_GPRS | |
| 1762 UWORD32 next_gauging_scheduled_for_PNP; // gauging for Packet Idle | |
| 1763 | |
| 1764 WORD32 l1s_get_next_gauging_in_Packet_Idle(void) | |
| 1765 { | |
| 1766 WORD32 next_gauging; | |
| 1767 | |
| 1768 // gauging performed with Normal Paging (we are in Idle mode) | |
| 1769 if (l1a_l1s_com.l1s_en_task[NP] == TASK_ENABLED) | |
| 1770 return (-1); // no activity planned | |
| 1771 | |
| 1772 // we are not in Packet Idle Mode | |
| 1773 if (l1a_l1s_com.l1s_en_task[PNP] != TASK_ENABLED) | |
| 1774 return (-1); // no activity planned | |
| 1775 | |
| 1776 next_gauging = next_gauging_scheduled_for_PNP - l1s.actual_time.fn ; | |
| 1777 if (next_gauging < 0) | |
| 1778 next_gauging+=MAX_FN; | |
| 1779 | |
| 1780 if (next_gauging <= MIN_SLEEP_TIME) | |
| 1781 return(0); | |
| 1782 | |
| 1783 return (next_gauging); | |
| 1784 } | |
| 1785 #endif | |
| 1786 /*-------------------------------------------------------*/ | |
| 1787 /* l1s_gauging_decision_with_PNP() */ | |
| 1788 /*-------------------------------------------------------*/ | |
| 1789 /* */ | |
| 1790 /* Description: */ | |
| 1791 /* ------------ */ | |
| 1792 /* */ | |
| 1793 /*-------------------------------------------------------*/ | |
| 1794 #if L1_GPRS | |
| 1795 BOOL l1s_gauging_decision_with_PNP(void) | |
| 1796 { | |
| 1797 #define TWO_SECONDS_IN_FRAME (UWORD16)(2000/4.615) | |
| 1798 | |
| 1799 /* reconstructed TCS211 code */ | |
| 1800 if (l1s.actual_time.fn >= next_gauging_scheduled_for_PNP) | |
| 1801 { | |
| 1802 next_gauging_scheduled_for_PNP = l1s.actual_time.fn + TWO_SECONDS_IN_FRAME; | |
| 1803 if (next_gauging_scheduled_for_PNP >= MAX_FN) next_gauging_scheduled_for_PNP -= MAX_FN; | |
| 1804 return (TRUE); | |
| 1805 } | |
| 1806 | |
| 1807 return (FALSE); // do not perform gauging | |
| 1808 } | |
| 1809 #endif | |
| 1810 /*-------------------------------------------------------*/ | |
| 1811 /* l1s_gauging_decision_with_NP() */ | |
| 1812 /*-------------------------------------------------------*/ | |
| 1813 /* */ | |
| 1814 /* Description: */ | |
| 1815 /* ------------ */ | |
| 1816 /* */ | |
| 1817 /*-------------------------------------------------------*/ | |
| 1818 BOOL l1s_gauging_decision_with_NP(void) | |
| 1819 { | |
| 1820 | |
| 1821 static UWORD8 time_to_gaug; | |
| 1822 | |
| 1823 // a paging is scheduled or , was scheduled but discarded by a higher priority task | |
| 1824 if (l1s.pw_mgr.paging_scheduled == TRUE) | |
| 1825 { | |
| 1826 l1s.pw_mgr.paging_scheduled = FALSE; // reset Flag. | |
| 1827 | |
| 1828 // A gauging session is needed : start gauging session with this paging bloc ! | |
| 1829 | |
| 1830 //Nina modify to save power, not forbid deep sleep, only force gauging in next paging | |
| 1831 // FreeCalypso TCS211 reconstruction: Nina's change reverted | |
| 1832 #if 1 | |
| 1833 if (l1s.pw_mgr.enough_gaug != TRUE) | |
| 1834 time_to_gaug = 0; | |
| 1835 #else | |
| 1836 if ((l1s.pw_mgr.enough_gaug != TRUE)||(l1s.force_gauging_next_paging_due_to_CCHR == 1)) | |
| 1837 { | |
| 1838 time_to_gaug = 0; | |
| 1839 l1s.force_gauging_next_paging_due_to_CCHR = 0; | |
| 1840 } | |
| 1841 #endif | |
| 1842 if (time_to_gaug > 0) | |
| 1843 { | |
| 1844 time_to_gaug--; // perform the gauging with an another paging. | |
| 1845 } | |
| 1846 else // perform the gauging with this paging | |
| 1847 { | |
| 1848 if (l1s.task_status[NP].current_status == ACTIVE ) | |
| 1849 { | |
| 1850 time_to_gaug = GAUG_VS_PAGING_RATE[l1a_l1s_com.bs_pa_mfrms-2]-1; | |
| 1851 | |
| 1852 return (TRUE); // gauging allowed | |
| 1853 } | |
| 1854 else // a gauging is scheduled to be perform here but the paging is missing | |
| 1855 { // (paging discarded by a higher priority task ?) | |
| 1856 l1s.pw_mgr.enough_gaug= FALSE; // forbid Deep sleep until next gauging | |
| 1857 } | |
| 1858 } | |
| 1859 } | |
| 1860 return (FALSE); // gauging not allowed | |
| 1861 } | |
| 1862 | |
| 1863 /*************************************************************/ | |
| 1864 /* Gauging task management : */ | |
| 1865 /* */ | |
| 1866 /* CALYPSO */ | |
| 1867 /* */ | |
| 1868 /* 9 8 7 6 5 4 3 2 1 0 */ | |
| 1869 /* C0 C1 C2 C3 C4 W R - - - */ | |
| 1870 /* | | */ | |
| 1871 /* | | */ | |
| 1872 /* |_ start gauging |_ stop gauging */ | |
| 1873 /* */ | |
| 1874 /*OTHERS: */ | |
| 1875 /* */ | |
| 1876 /* 11 10 9 8 7 6 5 4 3 2 1 0 */ | |
| 1877 /* C0 C1 C2 C3 C4 W R - - - - - */ | |
| 1878 /* | | | | | */ | |
| 1879 /* | | |_ start gauging |_ stop gauging */ | |
| 1880 /* | | | | */ | |
| 1881 /* | |_ (ITCOM) | |(ITCOM) */ | |
| 1882 /* | | */ | |
| 1883 /* |_ pgm PLL |_restore PLL */ | |
| 1884 /* */ | |
| 1885 /* */ | |
| 1886 /*************************************************************/ | |
| 1887 void l1s_gauging_task(void) | |
| 1888 { | |
| 1889 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 1890 { | |
| 1891 /*************************************************************/ | |
| 1892 if (l1s.pw_mgr.gauging_task == ACTIVE) | |
| 1893 { | |
| 1894 /*************************************************************/ | |
| 1895 // COUNT = 10 ==> PLL is at 65 Mhz, start the gauging | |
| 1896 /*************************************************************/ | |
| 1897 #if (CHIPSET==7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12) || (CHIPSET == 15) | |
| 1898 // the gauging was started with the begining of the paging | |
| 1899 #else | |
| 1900 if (l1s.pw_mgr.gaug_count == (l1s.pw_mgr.gaug_duration-1)) | |
| 1901 { | |
| 1902 #if (CODE_VERSION != SIMULATION) | |
| 1903 ULDP_GAUGING_START; // start gauging | |
| 1904 #endif | |
| 1905 | |
| 1906 #if (TRACE_TYPE != 0) | |
| 1907 #if (GSM_IDLE_RAM != 0) | |
| 1908 l1_trace_gauging_intram(); | |
| 1909 #else | |
| 1910 l1_trace_gauging(); | |
| 1911 #endif | |
| 1912 #endif | |
| 1913 } | |
| 1914 #endif | |
| 1915 | |
| 1916 l1s.pw_mgr.gaug_count--; // decrement counter | |
| 1917 | |
| 1918 | |
| 1919 // When a MISC task is enabled L1S must be ran every frame | |
| 1920 // to be able to enable the frame interrupt for DSP | |
| 1921 l1a_l1s_com.time_to_next_l1s_task = 0; | |
| 1922 } | |
| 1923 | |
| 1924 /*************************************************************/ | |
| 1925 // REQUEST A GAUGING PROCESS ON EACH PAGING BLOCK | |
| 1926 // IN IDLE MODE ..... | |
| 1927 /*************************************************************/ | |
| 1928 | |
| 1929 else if (l1s.pw_mgr.gauging_task == INACTIVE ) | |
| 1930 { | |
| 1931 BOOL decision = FALSE; | |
| 1932 | |
| 1933 if (l1a_l1s_com.l1s_en_task[NP] == TASK_ENABLED) | |
| 1934 decision = l1s_gauging_decision_with_NP(); | |
| 1935 #if L1_GPRS | |
| 1936 else | |
| 1937 if (l1a_l1s_com.l1s_en_task[PNP] == TASK_ENABLED) | |
| 1938 decision = l1s_gauging_decision_with_PNP(); | |
| 1939 #endif | |
| 1940 | |
| 1941 if (decision == TRUE) | |
| 1942 { | |
| 1943 // gauging duration | |
| 1944 l1s.pw_mgr.gaug_count = l1s.pw_mgr.gaug_duration; | |
| 1945 | |
| 1946 #if (CHIPSET==7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12) || (CHIPSET == 15) | |
| 1947 // start ULPD gauging immediately with Calypso because we needn't IT_COM. | |
| 1948 #if (CODE_VERSION != SIMULATION) | |
| 1949 ULDP_GAUGING_START; | |
| 1950 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 1951 // Force the DPLL to be active | |
| 1952 ( * (volatile SYS_UWORD16 *) CLKM_CNTL_CLK) &= ~(CLKM_DPLL_DIS); | |
| 1953 #endif | |
| 1954 #endif | |
| 1955 | |
| 1956 #if (TRACE_TYPE != 0) | |
| 1957 #if (GSM_IDLE_RAM != 0) | |
| 1958 l1_trace_gauging_intram(); | |
| 1959 #else | |
| 1960 l1_trace_gauging(); | |
| 1961 #endif | |
| 1962 #endif | |
| 1963 #endif | |
| 1964 | |
| 1965 // DSP programmation ....... | |
| 1966 #if (DSP >= 33) | |
| 1967 #if (CHIPSET==4) | |
| 1968 l1s_dsp_com.dsp_ndb_ptr->d_pll_config |= B_32KHZ_CALIB; | |
| 1969 #endif | |
| 1970 #else | |
| 1971 l1s_dsp_com.dsp_ndb_ptr->d_pll_clkmod1 = CLKMOD2; // IDLE1 only for DSP | |
| 1972 #endif | |
| 1973 | |
| 1974 l1s.pw_mgr.gauging_task = ACTIVE; | |
| 1975 } | |
| 1976 } | |
| 1977 } | |
| 1978 } | |
| 1979 /*-------------------------------------------------------*/ | |
| 1980 /* l1s_gauging_task_end() */ | |
| 1981 /*-------------------------------------------------------*/ | |
| 1982 /* */ | |
| 1983 /* Description: */ | |
| 1984 /* ------------ */ | |
| 1985 /* stop the gauging activity */ | |
| 1986 /*-------------------------------------------------------*/ | |
| 1987 void l1s_gauging_task_end(void) | |
| 1988 { | |
| 1989 if (l1_config.pwr_mngt == PWR_MNGT) | |
| 1990 { | |
| 1991 /*************************************************************/ | |
| 1992 if (l1s.pw_mgr.gauging_task == ACTIVE) | |
| 1993 { | |
| 1994 /*************************************************************/ | |
| 1995 // COUNT = 1 ==> stop the gauging and free DSP idle modes.... | |
| 1996 /*************************************************************/ | |
| 1997 if (l1s.pw_mgr.gaug_count == 1) | |
| 1998 { | |
| 1999 // wait for end of gauging interrupt ... | |
| 2000 l1s.pw_mgr.gauging_task = WAIT_IQ; | |
| 2001 | |
| 2002 // Unmask ULPD GAUGING int. | |
| 2003 #if (CODE_VERSION != SIMULATION) | |
| 2004 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 2005 F_INTH_ENABLE_ONE_IT(C_INTH_ULPD_GAUGING_IT); | |
| 2006 #else | |
| 2007 INTH_ENABLEONEIT(IQ_ULPD_GAUGING); | |
| 2008 #endif | |
| 2009 ULDP_GAUGING_STOP; // stop ULPD gauging | |
| 2010 #if (CHIPSET == 12) || (CHIPSET == 15) | |
| 2011 // Allow the DPLL to be cut according to ARM sleep mode | |
| 2012 //( * (volatile SYS_UWORD16 *) CLKM_CNTL_CLK) |= (CLKM_DPLL_DIS); | |
| 2013 #endif | |
| 2014 #endif | |
| 2015 | |
| 2016 // DSP programmation : free IDLE modes... | |
| 2017 #if (DSP >= 33) | |
| 2018 #if (CHIPSET==4) | |
| 2019 l1s_dsp_com.dsp_ndb_ptr->d_pll_config &= ~B_32KHZ_CALIB; | |
| 2020 #endif | |
| 2021 #else | |
| 2022 l1s_dsp_com.dsp_ndb_ptr->d_pll_clkmod1 = CLKMOD1; | |
| 2023 #endif | |
| 2024 | |
| 2025 | |
| 2026 #if (CODE_VERSION == SIMULATION) | |
| 2027 // in order to simulate the Gauging interrupt | |
| 2028 GAUGING_Handler(); | |
| 2029 | |
| 2030 #if (TRACE_TYPE==5) | |
| 2031 trace_ULPD("Stop Gauging", l1s.actual_time.fn); | |
| 2032 #endif | |
| 2033 #endif | |
| 2034 } | |
| 2035 } | |
| 2036 } | |
| 2037 } | |
| 2038 | |
| 2039 //#pragma GSM_IDLE_DUPLICATE_FOR_INTERNAL_RAM_END | |
| 2040 #endif |
