FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/bsp/init_target.c @ 143:afceeeb2cba1
Our nuc-fw is destined to become gsm-fw, so I went ahead and did the big hg mv
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Tue, 12 Nov 2013 05:35:48 +0000 |
parents | nuc-fw/bsp/init_target.c@15d5977390c2 |
children | 98c6be4d3d8d |
comparison
equal
deleted
inserted
replaced
142:15d5977390c2 | 143:afceeeb2cba1 |
---|---|
1 /* | |
2 * Init_Target() is the first function called from Application_Initialize(). | |
3 * But unfortunately, our TCS211 semi-src has this function in a binary lib. | |
4 * I was able to find a conditioned-out version in the LoCosto source that | |
5 * seems to be a fit - so I'm going to massage it a bit to match the sequence | |
6 * of operations seen in the disassembly of our reference binary. | |
7 */ | |
8 | |
9 #include "../include/config.h" | |
10 #include "../include/sys_types.h" | |
11 | |
12 #include "mem.h" | |
13 #include "clkm.h" | |
14 #include "armio.h" | |
15 #include "dma.h" | |
16 #include "timer.h" | |
17 #include "inth.h" | |
18 #include "iq.h" | |
19 #include "rhea_arm.h" | |
20 #include "ulpd.h" | |
21 | |
22 #if !CONFIG_GSM | |
23 #include "timer2.h" | |
24 #endif | |
25 | |
26 /* TPU_FREEZE is defined in l1_const.h */ | |
27 #include "../L1/include/l1_confg.h" | |
28 #include "../L1/include/l1_const.h" | |
29 | |
30 void Init_Target(void) | |
31 { | |
32 #if 1 //(PSP_STANDALONE == 0) | |
33 // RIF/SPI rising edge clock for ULYSSE | |
34 //-------------------------------------------------- | |
35 #if ((ANALOG == 1) || (ANALOG == 2) || (ANALOG == 3) || (ANALOG == 11)) | |
36 #if ((CHIPSET >= 3)) | |
37 #if (CHIPSET == 12) | |
38 F_CONF_RIF_RX_RISING_EDGE; | |
39 F_CONF_SPI_RX_RISING_EDGE; | |
40 #elif (CHIPSET == 15) | |
41 //do the DRP init here for Locosto | |
42 #if (L1_DRP == 1) | |
43 // drp_power_on(); This should be done after the script is downloaded. | |
44 #endif | |
45 #else | |
46 #if (BOARD==35) | |
47 *((volatile SYS_UWORD16 *) ASIC_CONF) = 0x2000; | |
48 #elif CONFIG_TARGET_PIRELLI // from disasm of original fw | |
49 *((volatile SYS_UWORD16 *) ASIC_CONF) = 0x6050; | |
50 #else | |
51 *((volatile SYS_UWORD16 *) ASIC_CONF) = 0x6000; | |
52 #endif /* (BOARD == 35) */ | |
53 #endif | |
54 #endif | |
55 #endif /* ANLG(ANALOG)) */ | |
56 | |
57 #if 0 //(OP_L1_STANDALONE == 1) | |
58 #if (BOARD == 40) || (BOARD == 41) || \ | |
59 (BOARD == 42) || (BOARD == 43) || (BOARD == 45) | |
60 // enable 8 Ohm amplifier for audio on D-sample | |
61 AI_ConfigBitAsOutput (1); | |
62 AI_SetBit(1); | |
63 #elif (BOARD == 70) || (BOARD == 71) | |
64 //Locosto I-sample or UPP costo board.BOARD | |
65 // Initialize the ARMIO bits as per the I-sample spec | |
66 // FIXME | |
67 #endif | |
68 #endif /* (OP_L1_STANDALONE == 1) */ | |
69 #endif /* PSP_STANDALONE ==0 */ | |
70 | |
71 // Watchdog | |
72 //-------------------------------------------------- | |
73 TM_DisableWatchdog(); /* Disable Watchdog */ | |
74 #if (CHIPSET == 12) || (CHIPSET == 15) | |
75 TM_SEC_DisableWatchdog(); | |
76 #endif | |
77 | |
78 freecalypso_disable_bootrom_pll(); | |
79 | |
80 #if ((CHIPSET == 4) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12) || (CHIPSET == 15)) | |
81 | |
82 /* | |
83 * Enable/Disable of clock switch off for INTH, TIMER, BRIDGE and DPLL modules | |
84 */ | |
85 // IRQ, Timer and bridge may SLEEP | |
86 // In first step, same configuration as SAMSON | |
87 //-------------------------------------------------- | |
88 #if (CHIPSET == 12) | |
89 CLKM_INITCNTL(CLKM_IRQ_DIS | CLKM_TIMER_DIS | CLKM_BRIDGE_DIS | CLKM_DPLL_DIS); | |
90 #elif (CHIPSET == 15) | |
91 CLKM_INITCNTL(CLKM_IRQ_DIS | CLKM_TIMER_DIS | CLKM_CPORT_EN | CLKM_BRIDGE_DIS | 0x8000 ); /* CLKM_DPLL_DIS is remove by Ranga*/ | |
92 | |
93 #else | |
94 CLKM_CNTL_OR(CLKM_IRQ_DIS | CLKM_TIMER_DIS); | |
95 | |
96 // Select VTCXO input frequency | |
97 //-------------------------------------------------- | |
98 CLKM_UNUSED_VTCXO_26MHZ; | |
99 | |
100 // Rita RF uses 26MHz VCXO | |
101 #if (RF_FAM == 12) | |
102 CLKM_USE_VTCXO_26MHZ; | |
103 #endif | |
104 // Renesas RF uses 26MHz on F-sample but 13MHz on TEB | |
105 #if (RF_FAM == 43) && (BOARD == 46) | |
106 CLKM_USE_VTCXO_26MHZ; | |
107 #endif | |
108 #endif | |
109 | |
110 // Control HOM/SAM automatic switching | |
111 //-------------------------------------------------- | |
112 *((volatile unsigned short *) CLKM_CNTL_CLK) &= ~CLKM_EN_IDLE3_FLG; | |
113 | |
114 /* | |
115 * Disassembly of Init_Target() in init.obj in main.lib in the | |
116 * Leonardo reference version reveals that the code does the | |
117 * following at this point: | |
118 */ | |
119 RHEA_INITRHEA(0,0,0xFF); | |
120 DPLL_INIT_BYPASS_MODE(DPLL_BYPASS_DIV_1); | |
121 DPLL_INIT_DPLL_CLOCK(DPLL_LOCK_DIV_1, 8); | |
122 CLKM_InitARMClock(0x00, 2, 0); /* no low freq, no ext clock, div by 1 */ | |
123 /* at this point the original code sets up the memory wait states */ | |
124 /* we'll do it differently */ | |
125 RHEA_INITAPI(0,1); | |
126 RHEA_INITARM(0,0); | |
127 DPLL_SET_PLL_ENABLE; | |
128 | |
129 /* | |
130 * Disable and Clear all pending interrupts | |
131 */ | |
132 #if (CHIPSET == 12) || (CHIPSET == 15) | |
133 F_INTH_DISABLE_ALL_IT; // MASK all it | |
134 F_INTH2_VALID_NEXT(C_INTH_IRQ); // reset current IT in INTH2 IRQ | |
135 F_INTH_VALID_NEXT(C_INTH_IRQ); // reset current IT in INTH IRQ | |
136 F_INTH_VALID_NEXT(C_INTH_FIQ); // reset current IT in INTH FIQ | |
137 F_INTH_RESET_ALL_IT; // reset all IRQ/FIQ source | |
138 #else | |
139 INTH_DISABLEALLIT; | |
140 INTH_RESETALLIT; | |
141 INTH_CLEAR; /* reset IRQ/FIQ source */ | |
142 #endif | |
143 | |
144 // INTH | |
145 //-------------------------------------------------- | |
146 #if (CHIPSET == 12) || (CHIPSET == 15) | |
147 #if (GSM_IDLE_RAM != 0) | |
148 f_inth_setup((T_INTH_CONFIG *)a_inth_config_idle_ram); // setup configuration IT handlers | |
149 #else | |
150 f_inth_setup((T_INTH_CONFIG *)a_inth_config); // setup configuration IT handlers | |
151 #endif | |
152 #else | |
153 IQ_SetupInterrupts(); | |
154 #endif | |
155 | |
156 // DMA | |
157 //-------------------------------------------------- | |
158 // channel0 = Arm, channel1 = Lead, channel2 = forced to Arm, channel3=forced to Arm, dma_burst = 0001, priority = same | |
159 #if 1 //(OP_L1_STANDALONE == 0) | |
160 DMA_ALLOCDMA(1,0,1,1); // Channel 1 used by DSP with RIF RX | |
161 #endif | |
162 | |
163 /* CHIPSET = 4 or 7 or 8 or 10 or 11 or 12 */ | |
164 | |
165 #else | |
166 | |
167 // RHEA Bridge | |
168 //-------------------------------------------------- | |
169 // ACCES_FAC_0 = 0, ACCES_FAC_1 = 0 ,TIMEOUT = 0x7F | |
170 RHEA_INITRHEA(0,0,0x7F); | |
171 | |
172 #if (CHIPSET == 6) | |
173 // WS_H = 1 , WS_L = 15 | |
174 RHEA_INITAPI(1,15); // should be 0x01E1 for 65 Mhz | |
175 #else | |
176 // WS_H = 0 , WS_L = 7 | |
177 RHEA_INITAPI(0,7); // should be 0x0101 for 65 Mhz | |
178 #endif | |
179 | |
180 // Write_en_0 = 0 , Write_en_1 = 0 | |
181 RHEA_INITARM(0,0); | |
182 | |
183 // INTH | |
184 //-------------------------------------------------- | |
185 INTH_DISABLEALLIT; // MASK all it | |
186 INTH_CLEAR; // reset IRQ/FIQ source | |
187 IQ_SetupInterrupts(); | |
188 | |
189 // DMA | |
190 //-------------------------------------------------- | |
191 // channel0 = Arm, channel1 = Lead, dma_burst = 0001, priority = same | |
192 DMA_ALLOCDMA(1,0,1,1); // should be 0x25 (channel 1 = lead) | |
193 | |
194 #if (CHIPSET == 6) | |
195 // Memory WS configuration for ULYSS/G1 (26 Mhz) board | |
196 //----------------------------------------------------- | |
197 MEM_INIT_CS2(2,MEM_DVS_16,MEM_WRITE_EN,0); | |
198 #endif | |
199 | |
200 // CLKM | |
201 //-------------------------------------------------- | |
202 CLKM_InitARMClock(0x00, 2); /* no low freq, no ext clock, div by 1 */ | |
203 | |
204 #if (CHIPSET == 6) | |
205 CLKM_INITCNTL(CLKM_IRQ_DIS | CLKM_BRIDGE_DIS | CLKM_TIMER_DIS | CLKM_VTCXO_26); | |
206 #else | |
207 CLKM_INITCNTL(CLKM_IRQ_DIS | CLKM_BRIDGE_DIS | CLKM_TIMER_DIS); | |
208 #endif | |
209 | |
210 #endif /* CHIPSET = 4 or 7 or 8 or 10 or 11 or 12 */ | |
211 | |
212 // Freeze ULPD timer .... | |
213 //-------------------------------------------------- | |
214 *((volatile SYS_UWORD16 *) ULDP_GSM_TIMER_INIT_REG ) = 0; | |
215 *((volatile SYS_UWORD16 *) ULDP_GSM_TIMER_CTRL_REG ) = TPU_FREEZE; | |
216 | |
217 // reset INC_SIXTEEN and INC_FRAC | |
218 //-------------------------------------------------- | |
219 #if 0 //(OP_L1_STANDALONE == 1) | |
220 l1ctl_pgm_clk32(DEFAULT_HFMHZ_VALUE,DEFAULT_32KHZ_VALUE); | |
221 #else | |
222 ULDP_INCSIXTEEN_UPDATE(132); //32768.29038 =>132, 32500 => 133 | |
223 // 26000 --> 166 | |
224 ULDP_INCFRAC_UPDATE(15840); //32768.29038 =>15840, 32500 => 21845 | |
225 // 26000 --> 43691 | |
226 #endif /* OP_L1_STANDALONE */ | |
227 | |
228 // program ULPD WAKE-UP .... | |
229 //================================================= | |
230 #if (CHIPSET == 2) | |
231 *((volatile SYS_UWORD16 *)ULDP_SETUP_FRAME_REG) = SETUP_FRAME; // 2 frame | |
232 *((volatile SYS_UWORD16 *)ULDP_SETUP_VTCXO_REG) = SETUP_VTCXO; // 31 periods | |
233 *((volatile SYS_UWORD16 *)ULDP_SETUP_SLICER_REG) = SETUP_SLICER; // 31 periods | |
234 *((volatile SYS_UWORD16 *)ULDP_SETUP_CLK13_REG) = SETUP_CLK13; // 31 periods | |
235 #else | |
236 *((volatile SYS_UWORD16 *)ULDP_SETUP_FRAME_REG) = SETUP_FRAME; // 3 frames | |
237 *((volatile SYS_UWORD16 *)ULDP_SETUP_VTCXO_REG) = SETUP_VTCXO; // 0 periods | |
238 *((volatile SYS_UWORD16 *)ULDP_SETUP_SLICER_REG) = SETUP_SLICER; // 31 periods | |
239 *((volatile SYS_UWORD16 *)ULDP_SETUP_CLK13_REG) = SETUP_CLK13; // 31 periods | |
240 *((volatile SYS_UWORD16 *)ULPD_SETUP_RF_REG) = SETUP_RF; // 31 periods | |
241 #endif | |
242 | |
243 #if (CHIPSET == 15) | |
244 *((volatile SYS_UWORD16 *)ULPD_DCXO_SETUP_SLEEPN) = SETUP_SLEEPZ; // 0 | |
245 *((volatile SYS_UWORD16 *)ULPD_DCXO_SETUP_SYSCLKEN) = SETUP_SYSCLKEN; // 255 clocks of 32 KHz for 7.8 ms DCXO delay for Locosto | |
246 *((volatile SYS_UWORD16 *)0xFFFEF192) = 0x1; //CLRZ | |
247 *((volatile SYS_UWORD16 *)0xFFFEF190) = 0x2; //SLPZ | |
248 *((volatile SYS_UWORD16 *)0xFFFEF18E)= 0x2; //SYSCLKEN | |
249 *((volatile SYS_UWORD16 *)0xFFFEF186) = 0x2; //CLK13_EN | |
250 *((volatile SYS_UWORD16 *)0xFFFEF18A) = 0x2; //DRP_DBB_SYSCLK | |
251 #endif | |
252 | |
253 // Set Gauging versus HF (PLL) | |
254 //================================================= | |
255 ULDP_GAUGING_SET_HF; // Enable gauging versus HF | |
256 ULDP_GAUGING_HF_PLL; // Gauging versus PLL | |
257 | |
258 // current supply for quartz oscillation | |
259 //================================================= | |
260 #if 0 //(OP_L1_STANDALONE == 1) | |
261 #if ((CHIPSET != 9) && (CHIPSET != 12) && (CHIPSET !=15)) // programming model changed for Ulysse C035, stay with default value | |
262 *(volatile SYS_UWORD16 *)QUARTZ_REG = 0x27; | |
263 #endif | |
264 #else | |
265 #if ((BOARD == 6) || (BOARD == 8) || (BOARD == 9) || (BOARD == 35) || (BOARD == 40) || (BOARD == 41)) | |
266 *((volatile SYS_UWORD16 *)QUARTZ_REG) = 0x27; | |
267 #elif (BOARD == 7) | |
268 *((volatile SYS_UWORD16 *)QUARTZ_REG) = 0x24; | |
269 #endif | |
270 #endif /* OP_L1_STANDALONE */ | |
271 | |
272 // stop Gauging if any (debug purpose ...) | |
273 //-------------------------------------------------- | |
274 if ( *((volatile SYS_UWORD16 *) ULDP_GAUGING_CTRL_REG) & ULDP_GAUGING_EN) | |
275 { | |
276 volatile int j; | |
277 ULDP_GAUGING_STOP; /* Stop the gauging */ | |
278 /* wait for gauging it*/ | |
279 // one 32khz period = 401 periods of 13Mhz | |
280 for (j=1; j<50; j++); | |
281 while (! (* (volatile SYS_UWORD16 *) ULDP_GAUGING_STATUS_REG) & ULDP_IT_GAUGING); | |
282 } | |
283 | |
284 #if 1 //(OP_L1_STANDALONE == 0) | |
285 AI_ClockEnable (); | |
286 | |
287 #if (BOARD == 7) | |
288 // IOs configuration of the B-Sample in order to optimize the power consumption | |
289 AI_InitIOConfig(); | |
290 | |
291 // Set LPG instead of DSR_MODEM | |
292 *((volatile SYS_UWORD16 *) ASIC_CONF) |= 0x40; | |
293 // Reset the PERM_ON bit of LCR_REG | |
294 *((volatile SYS_UWORD16 *) MEM_LPG) &= ~(0x80); | |
295 #elif ((BOARD == 8) || (BOARD == 9)) | |
296 // IOs configuration of the C-Sample in order to optimize the power consumption | |
297 AI_InitIOConfig(); | |
298 | |
299 // set the debug latch to 0x00. | |
300 *((volatile SYS_UWORD8 *) 0x2800000) = 0x00; | |
301 #elif ((BOARD == 35) || (BOARD == 46)) | |
302 AI_InitIOConfig(); | |
303 // CSMI INTERFACE | |
304 // Initialize CSMI clients for GSM control | |
305 // and Fax/Data services | |
306 CSMI_Init(); | |
307 GC_Initialize(); // GSM control initialization | |
308 CU_Initialize(); // Trace initialization | |
309 CF_Initialize(); // Fax/Data pre-initialization | |
310 #elif ((BOARD == 40) || (BOARD == 41)) | |
311 // IOs configuration of the D-Sample in order to optimize the power consumption | |
312 AI_InitIOConfig(); | |
313 | |
314 #ifdef BTEMOBILE | |
315 // Reset BT chip by toggling the Island's nRESET_OUT signal | |
316 *((volatile SYS_UWORD16 *) 0xFFFFFD04) |= 0x04; | |
317 *((volatile SYS_UWORD16 *) 0xFFFFFD04) &= ~(0x4); | |
318 #endif | |
319 | |
320 #if 0 // FreeCalypso | |
321 // set the debug latch to 0x0000. | |
322 *((volatile SYS_UWORD16 *) 0x2700000) = 0x0000; | |
323 #endif | |
324 #elif ((BOARD == 70) || (BOARD == 71)) | |
325 AI_InitIOConfig(); | |
326 /* Mark The System configuration According to I-Sample */ | |
327 /* Adding GPIO Mux Setting Here */ | |
328 pin_configuration_all(); // Init Tuned for Power Management | |
329 /* A22 is Enabled in int.s hence not Here */ | |
330 /* FIXME: PULL_UP Enable and PULL UP Values Need to revisited */ | |
331 | |
332 /* Add code to find out the manufacture id of NOR flash*/ | |
333 | |
334 // Copy ffsdrv_device_id_read() function code to RAM. The only known | |
335 // way to determine the size of the code is to look either in the | |
336 // linker-generated map file or in the assember output file. | |
337 ffsdrv_copy_code_to_ram((UWORD16 *) detect_code, | |
338 (UWORD16 *) &ffsdrv_device_id_read, | |
339 sizeof(detect_code)); | |
340 | |
341 // Combine bit 0 of the thumb mode function pointer with the address | |
342 // of the code in RAM. Then call the detect function in RAM. | |
343 myfp = (pf_t) (((int) &ffsdrv_device_id_read & 1) | (int) detect_code); | |
344 (*myfp)(0x06000000, &manufact, device_id); | |
345 | |
346 enable_ps_ram_burst(); | |
347 | |
348 if( 0x7e == device_id[0] ) | |
349 { | |
350 enable_flash_burst(); | |
351 flash_device_id = 0x7E; | |
352 } | |
353 else | |
354 { | |
355 enable_flash_burst_mirror(); | |
356 flash_device_id = 0; | |
357 } | |
358 | |
359 /* FreeCalypso: a bunch of dead code cut out */ | |
360 | |
361 #endif // BOARD | |
362 | |
363 // Enable HW Timers 1 & 2 | |
364 TM_EnableTimer (1); | |
365 TM_EnableTimer (2); | |
366 | |
367 #if !CONFIG_GSM | |
368 Dtimer2_Init_cntl (1875, 1, 0, 1); | |
369 Dtimer2_Start (1); | |
370 #endif | |
371 | |
372 #endif /* (OP_L1_STANDALONE == 0) */ | |
373 | |
374 } | |
375 | |
376 /* | |
377 * Init_Unmask_IT() is the last function called from Application_Initialize(); | |
378 * it also had to be reconstructed from disassembly. | |
379 */ | |
380 | |
381 void Init_Unmask_IT(void) | |
382 { | |
383 #if CONFIG_GSM | |
384 IQ_Unmask(IQ_FRAME); | |
385 #endif | |
386 IQ_Unmask(IQ_UART_IRDA_IT); | |
387 IQ_Unmask(IQ_UART_IT); | |
388 #if 0 | |
389 IQ_Unmask(IQ_ARMIO); | |
390 IQ_Unmask(IQ_API); | |
391 #endif | |
392 #if !CONFIG_GSM | |
393 IQ_Unmask(IQ_TIM2); | |
394 #endif | |
395 } |