FreeCalypso > hg > ffs-editor
diff src/cs/system/main/init.c @ 0:92470e5d0b9e
src: partial import from FC Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 15 May 2020 01:28:16 +0000 |
parents | |
children | c07376e250c1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/system/main/init.c Fri May 15 01:28:16 2020 +0000 @@ -0,0 +1,959 @@ +/* + * INIT.C + * + * This module allows to initialize the board: + * - wait states, + * - unmask selected interrupts, + * - initialize clock, + * - disable watchdog. + * Dummy functions used by the EVA3 library are defined. + */ + +/* Config Files */ + +#ifndef _WINDOWS + #include "l1sw.cfg" + #include "rf.cfg" + #include "chipset.cfg" + #include "board.cfg" + #include "swconfig.cfg" + #include "fc-target.h" + #if (OP_L1_STANDALONE == 0) + #include "rv.cfg" + #include "sys.cfg" + #include "debug.cfg" + #ifdef BLUETOOTH_INCLUDED + #include "btemobile.cfg" + #endif + #ifdef BLUETOOTH + #include "bluetooth.cfg" + #endif + #endif + + #if (OP_L1_STANDALONE == 0) + #include "rv/rv_defined_swe.h" + #endif +#endif + +/* Include Files */ +#include <assert.h> +#include <ctype.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> + +#include "nucleus.h" + +#include "sys_types.h" +#include "l1_types.h" +#include "l1_confg.h" +#include "l1_const.h" + +#if TESTMODE + #include "l1tm_defty.h" +#endif // TESTMODE + +#if (AUDIO_TASK == 1) + #include "l1audio_const.h" + #include "l1audio_cust.h" + #include "l1audio_defty.h" +#endif // AUDIO_TASK + +#if (L1_GTT == 1) + #include "l1gtt_const.h" + #include "l1gtt_defty.h" +#endif + +#if (L1_MP3 == 1) + #include "l1mp3_defty.h" +#endif + +#if (L1_MIDI == 1) + #include "l1midi_defty.h" +#endif + +#if (L1_AAC == 1) + #include "l1aac_defty.h" +#endif +#if (L1_DYN_DSP_DWNLD == 1) + #include "l1_dyn_dwl_defty.h" +#endif + +#if (TRACE_TYPE == 4) + #include "l1_defty.h" +#endif + + +#if ((OP_L1_STANDALONE == 1) && (CODE_VERSION != SIMULATION) && (PSP_STANDALONE == 0)) + + #if (AUDIO_TASK == 1) + #include "l1audio_signa.h" + #include "l1audio_msgty.h" + #endif // AUDIO_TASK + + #if (L1_GTT == 1) + #include "l1gtt_signa.h" + #include "l1gtt_msgty.h" + #endif + + #include "l1_defty.h" + #include "cust_os.h" + #include "l1_msgty.h" + #include "nu_main.h" + #include "l1_varex.h" + #include "l1_proto.h" + #include "hw_debug.h" + #include "l1_trace.h" + +#endif /* ((OP_L1_STANDALONE == 1) && (CODE_VERSION != SIMULATION) && (PSP_STANDALONE==0)) */ + + +#include "armio/armio.h" +#include "timer/timer.h" + +#if (OP_L1_STANDALONE == 0) + #include "rvf/rvf_api.h" + #include "rvm/rvm_api.h" /* A-M-E-N-D-E-D! */ + #include "sim/sim.h" +#endif + +#include "abb/abb.h" + +#include "inth/iq.h" +#include "tpudrv.h" +#include "memif/mem.h" +#include "clkm/clkm.h" +#include "inth/inth.h" + +#if (OP_L1_STANDALONE == 1) + #include "uart/serialswitch_core.h" +#else + #include "uart/serialswitch.h" +#endif +#include "uart/traceswitch.h" + + +#include "dma/dma.h" +#include "rhea/rhea_arm.h" + +#include "ulpd/ulpd.h" + +#if (PSP_STANDALONE == 0) + #if (OP_L1_STANDALONE == 0) + extern void ffs_main_init(void); + extern void create_tasks(void); + #if TI_NUC_MONITOR == 1 + extern void ti_nuc_monitor_tdma_action( void ); + #endif + + #if WCP_PROF == 1 + #if PRF_CALIBRATION == 1 + extern NU_HISR prf_CalibrationHISR; + #endif + #endif + + #else + void l1ctl_pgm_clk32(UWORD32 nb_hf, UWORD32 nb_32khz); + extern void L1_trace_string(char *s); + #endif /* (OP_L1_STANDALONE) */ +#endif + +#if (OP_L1_STANDALONE == 1) + #if ((TRACE_TYPE==1) || (TRACE_TYPE==2) || (TRACE_TYPE==3) || (TRACE_TYPE==7) || TESTMODE) + #include "uart/uart.h" +/* + * Serial Configuration set up. + */ + + extern char ser_cfg_info[NUMBER_OF_TR_UART]; + #include "rvt_gen.h" + extern T_RVT_USER_ID trace_id; + #endif +#endif /* (OP_L1_STANDALONE == 1) */ + +/* + * Serial Configuration set up. + */ + +/* +** One config is: +** {XXX_BT_HCI, // Bluetooth HCI +** XXX_FAX_DATA, // Fax/Data AT-Cmd +** XXX_TRACE, // L1/Riviera Trace Mux +** XXX_TRACE}, // Trace PS +** +** with XXX being DUMMY, UART_IRDA or UART_MODEM +*/ + +#if ((((TRACE_TYPE==1) || (TRACE_TYPE==2) || (TRACE_TYPE==3) || (TRACE_TYPE==7) ||\ + (TESTMODE)) && (OP_L1_STANDALONE == 1)) || (OP_L1_STANDALONE == 0)) + #if (OP_L1_STANDALONE == 1) + static T_AppliSerialInfo appli_ser_cfg_info = + #else + T_AppliSerialInfo appli_ser_cfg_info = + #endif /* OP_L1_STANDALONE */ + { + #ifdef CONFIG_RVTMUX_ON_MODEM + {DUMMY_BT_HCI, + DUMMY_FAX_DATA, + UART_MODEM_TRACE, + DUMMY_TRACE}, // 0x0248 + #else // RVTMUX_ON_MODEM + {DUMMY_BT_HCI, + UART_MODEM_FAX_DATA, + UART_IRDA_TRACE, + DUMMY_TRACE}, // default config = 0x0168 + #endif + #ifdef BTEMOBILE + 12, // 12 serial config allowed + #else // BTEMOBILE + 9, // 9 serial config allowed + #endif + { + // Configs with Condat Panel only + {DUMMY_BT_HCI, + DUMMY_FAX_DATA, + DUMMY_TRACE, + UART_IRDA_TRACE}, // 0x1048 + {DUMMY_BT_HCI, + DUMMY_FAX_DATA, + DUMMY_TRACE, + UART_MODEM_TRACE}, // 0x2048 + // Configs with L1/Riviera Trace only + {DUMMY_BT_HCI, + DUMMY_FAX_DATA, + UART_IRDA_TRACE, + DUMMY_TRACE}, // 0x0148 + {DUMMY_BT_HCI, + DUMMY_FAX_DATA, + UART_MODEM_TRACE, + DUMMY_TRACE}, // 0x0248 + // Configs with AT-Cmd only + {DUMMY_BT_HCI, + UART_MODEM_FAX_DATA, + DUMMY_TRACE, + DUMMY_TRACE}, // 0x0068 + // Configs with Condat Panel and L1/Riviera Trace + {DUMMY_BT_HCI, + DUMMY_FAX_DATA, + UART_MODEM_TRACE, + UART_IRDA_TRACE}, // 0x1248 + {DUMMY_BT_HCI, + DUMMY_FAX_DATA, + UART_IRDA_TRACE, + UART_MODEM_TRACE}, // 0x2148 + // Configs with Condat Panel and AT-Cmd + {DUMMY_BT_HCI, + UART_MODEM_FAX_DATA, + DUMMY_TRACE, + UART_IRDA_TRACE}, // 0x1068 + #ifdef BTEMOBILE + // Configs with L1/Riviera Trace and Bluetooth HCI + {UART_IRDA_BT_HCI, + DUMMY_FAX_DATA, + UART_MODEM_TRACE, + DUMMY_TRACE}, // 0x0249 + {UART_MODEM_BT_HCI, + DUMMY_FAX_DATA, + UART_IRDA_TRACE, + DUMMY_TRACE}, // 0x014A + // Configs with AT-Cmd and Bluetooth HCI + {UART_IRDA_BT_HCI, + UART_MODEM_FAX_DATA, + DUMMY_TRACE, + DUMMY_TRACE}, // 0x0069 + #endif // BTEMOBILE + // Configs with L1/Riviera Trace and AT-Cmd + {DUMMY_BT_HCI, + UART_MODEM_FAX_DATA, + UART_IRDA_TRACE, + DUMMY_TRACE} // 0x0168 + } + }; + #endif /* (TRACE_TYPE ...) || (OP_L1_STANDALONE == 0) */ + + +/* + * Init_Target + * + * Performs low-level HW Initialization. + */ +void Init_Target(void) +{ + #if (BOARD == 5) + #define WS_ROM (1) + #define WS_RAM (1) + #define WS_APIF (1) + #define WS_CS2 (7) /* LCD on EVA3. */ + #define WS_CS0 (7) /* DUART on EVA3. UART16750 and latch on A-Sample. */ + #define WS_CS1 (7) /* LCD on A-Sample. */ + + IQ_InitWaitState (WS_ROM, WS_RAM, WS_APIF, WS_CS2, WS_CS0, WS_CS1); + IQ_InitClock (2); /* Internal clock division factor. */ + + IQ_MaskAll (); /* Mask all interrupts. */ + IQ_SetupInterrupts (); /* IRQ priorities. */ + + TM_DisableWatchdog (); + + /* + * Reset all TSP and DBG fdefault values + */ + + AI_ResetTspIO (); + AI_ResetDbgReg (); + AI_ResetIoConfig (); + + /* + * Warning! The external reset signal is connected to the Omega and the + * external device. If the layer 1 is used its initialization removes + * the external reset. If the application does not use the layer 1 + * you must remove the external reset (bit 2 of the reset control + * register 0x505808). + */ + + AI_ResetTspIO(); + AI_ResetDbgReg(); + AI_ResetIoConfig(); + + /* + * Configure all IOs (see RD300 specification). + */ + + AI_ConfigBitAsInput (1); + AI_EnableBit (1); + + AI_ConfigBitAsOutput (2); + AI_EnableBit (2); + + AI_ConfigBitAsInput (11); + AI_EnableBit (11); + + AI_ConfigBitAsOutput (13); + AI_EnableBit (13); + + AI_Power (1); /* Maintain power supply. */ + + #elif (BOARD == 6) || (BOARD == 7) || (BOARD == 8) || (BOARD == 9) || \ + (BOARD == 40) || (BOARD == 41) || (BOARD == 42) || (BOARD == 43) || (BOARD == 45) || \ + (BOARD == 35) || (BOARD == 46) || (BOARD == 70) || (BOARD == 71) + +#if (PSP_STANDALONE == 0) + // RIF/SPI rising edge clock for ULYSSE + //-------------------------------------------------- + #if ((ANLG_FAM == 1) || (ANLG_FAM == 2) || (ANLG_FAM == 3)|| (ANLG_FAM == 11)) + #if ((CHIPSET >= 3)) + #if (CHIPSET == 12) + F_CONF_RIF_RX_RISING_EDGE; + F_CONF_SPI_RX_RISING_EDGE; + #elif (CHIPSET == 15) + //do the DRP init here for Locosto + #if (L1_DRP == 1) + // drp_power_on(); This should be done after the script is downloaded. + #endif + #else + #if (BOARD==35) + *((volatile SYS_UWORD16 *) ASIC_CONF) = 0x2000; + #elif defined(CONFIG_TARGET_PIRELLI) + /* + * Pirelli's version of this Init_Target() function + * in their fw sets the ASIC_CONF register to 0x6050, + * which means PWL on the LT/PWL pin and LPG on the + * DSR_MODEM pin. + */ + *((volatile SYS_UWORD16 *) ASIC_CONF) = 0x6050; + #elif defined(CONFIG_TARGET_GTAMODEM) || defined(CONFIG_TARGET_GTM900) + /* + * The DSR_MODEM/LPG Calypso signal is unconnected on + * Openmoko's modem, so let's mux it as LPG (output) + * so it doesn't float, like Foxconn seem to have done + * on the Pirelli. + * + * On the GTM900 module this signal is explicitly defined as LPG. + */ + *((volatile SYS_UWORD16 *) ASIC_CONF) = 0x6040; + #else + *((volatile SYS_UWORD16 *) ASIC_CONF) = 0x6000; + #endif /* (BOARD == 35) */ + #endif + #endif + #endif /* ANLG(ANALOG)) */ + + #if (OP_L1_STANDALONE == 1) + #if (BOARD == 40) || (BOARD == 41) || \ + (BOARD == 42) || (BOARD == 43) || (BOARD == 45) + // enable 8 Ohm amplifier for audio on D-sample + AI_ConfigBitAsOutput (1); + AI_SetBit(1); + #elif (BOARD == 70) || (BOARD == 71) + //Locosto I-sample or UPP costo board.BOARD + // Initialize the ARMIO bits as per the I-sample spec + // FIXME + #endif + #endif /* (OP_L1_STANDALONE == 1) */ +#endif /* PSP_STANDALONE ==0 */ + + // Watchdog + //-------------------------------------------------- + TM_DisableWatchdog(); /* Disable Watchdog */ + #if (CHIPSET == 12) || (CHIPSET == 15) + TM_SEC_DisableWatchdog(); + #endif + + #if ((CHIPSET == 4) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12) || (CHIPSET == 15)) + + #if (CHIPSET == 12) + + #if 0 /* example of configuration for DMA debug */ + #if (BOARD == 6) /* debug on EVA 4 , GPO2 must not be changed */ + + /* TPU_FRAME, NMIIT, IACKn */ + F_DBG_IRQ_CONFIG(C_DBG_IRQ_IRQ4|C_DBG_IRQ_NMIIT|C_DBG_IRQ_IACKN); + + /* NDMA_REQ_VIEW1, NDMA_REQ_VIEW0, DMA_V(1), DMA_S(1), DMAREQ_P1(3:0)*/ + F_DBG_DMA_P1_NDFLASH_CONFIG(C_DBG_DMA_P1_NDFLASH_NDMA_REQ_VIEW_1 | + C_DBG_DMA_P1_NDFLASH_NDMA_REQ_VIEW_0 | + C_DBG_DMA_P1_NDFLASH_DMA_REQ_P1_3 | + C_DBG_DMA_P1_NDFLASH_DMA_REQ_P1_2 | + C_DBG_DMA_P1_NDFLASH_DMA_REQ_P1_1 | + C_DBG_DMA_P1_NDFLASH_DMA_REQ_P1_0 | + C_DBG_DMA_P1_NDFLASH_DMA_REQ_S_1 | + C_DBG_DMA_P1_NDFLASH_DMA_REQ_V1 ); + /* DMA_REQ_S(2)*/ + F_DBG_DMA_P2_CONFIG(C_DBG_DMA_P2_DMA_REQ_S2); + + /* DMA_CLK_REQ, BRIDGE_CLK */ + F_DBG_CLK1_CONFIG(C_DBG_CLK1_DMA_CLK_REQ | + C_DBG_CLK1_BRIDGE_CLK ); + + /* XIO_nREADY */ + F_DBG_IMIF_CONFIG(C_DBG_IMIF_XIO_NREADY_MEM); + + /* DSP_nIRQ_VIEW1, DSP_nIRQ_VIEW0, BRIDGE_EN */ + F_DBG_KB_USIM_SHD_CONFIG(C_DBG_KB_USIM_SHD_DSP_NIRQ_VIEW_1 | + C_DBG_KB_USIM_SHD_DSP_NIRQ_VIEW_0 | + C_DBG_KB_USIM_SHD_BRIDGE_EN ); + + /* RHEA_nREADY , RHEA_nSTROBE */ + F_DBG_USIM_CONFIG(C_DBG_USIM_RHEA_NSTROBE | + C_DBG_USIM_RHEA_NREADY ); + + /* XIO_STROBE */ + F_DBG_MISC2_CONFIG(C_DBG_MISC2_X_IOSTRBN); + + /* DMA_CLK_REQ */ + F_DBG_CLK2_CONFIG(C_DBG_CLK2_DMA_CLK_REQ2); + + /* DSP_IRQ_SEL0=DMA, DSP_IRQ_SEL1=DMA, DMA_REQ_SEL0=RIF_RX, DMA_REQ_SEL1=RIF_RX */ + F_DBG_VIEW_CONFIG(0,0,C_DBG_DSP_INT_DMA, + C_DBG_DSP_INT_DMA, + C_DMA_CHANNEL_RIF_RX, + C_DMA_CHANNEL_RIF_RX); + + #endif /* (BOARD == 6) */ + #endif /* DMA debug example */ + #else + /* + * Configure ASIC in order to output the DPLL and ARM clock + */ + // (*( volatile UWORD16* )(0xFFFEF008)) = 0x8000; // DPLL + // (*( volatile UWORD16* )(0xFFFEF00E)) = 0x0004; // ARM clock + // (*( volatile UWORD16* )(0xfffef004)) = 0x0600; // DSP clock + nIACK + #endif /* (CHIPSET == 12) || CHIPSET == 15*/ + + + /* + * Enable/Disable of clock switch off for INTH, TIMER, BRIDGE and DPLL modules + */ + // IRQ, Timer and bridge may SLEEP + // In first step, same configuration as SAMSON + //-------------------------------------------------- + #if (CHIPSET == 12) + CLKM_INITCNTL(CLKM_IRQ_DIS | CLKM_TIMER_DIS | CLKM_BRIDGE_DIS | CLKM_DPLL_DIS); + #elif (CHIPSET == 15) +CLKM_INITCNTL(CLKM_IRQ_DIS | CLKM_TIMER_DIS | CLKM_CPORT_EN | CLKM_BRIDGE_DIS | 0x8000 ); /* CLKM_DPLL_DIS is remove by Ranga*/ + + #else + CLKM_INITCNTL(CLKM_IRQ_DIS | CLKM_TIMER_DIS); + + // Select VTCXO input frequency + //-------------------------------------------------- + CLKM_UNUSED_VTCXO_26MHZ; + + // Rita RF uses 26MHz VCXO + #if (RF_FAM == 12) + CLKM_USE_VTCXO_26MHZ; + #endif + // Renesas RF uses 26MHz on F-sample but 13MHz on TEB + #if (RF_FAM == 43) && (BOARD == 46) + CLKM_USE_VTCXO_26MHZ; + #endif + #endif + + + // Control HOM/SAM automatic switching + //-------------------------------------------------- + *((volatile unsigned short *) CLKM_CNTL_CLK) &= ~CLKM_EN_IDLE3_FLG; + + /* + * The following part has been reconstructed from disassembly. + */ + RHEA_INITRHEA(0,0,0xFF); + DPLL_INIT_BYPASS_MODE(DPLL_BYPASS_DIV_1); + #if (CHIPSET == 8) + DPLL_INIT_DPLL_CLOCK(DPLL_LOCK_DIV_1, 6); + #elif (CHIPSET == 10) || (CHIPSET == 11) + DPLL_INIT_DPLL_CLOCK(DPLL_LOCK_DIV_1, 8); + #else + #error "We only have DPLL setup for CHIPSETs 8 and 10" + #endif + CLKM_InitARMClock(0x00, 2, 0); /* no low freq, no ext clock, div by 1 */ + /* + * FreeCalypso change: memory timings and widths are target-dependent; + * please refer to the MEMIF-wait-states document in the freecalypso-docs + * repository for the full explanation. + */ + #ifdef CONFIG_TARGET_PIRELLI + /* + * Pirelli's version of this Init_Target() function + * in their fw does the following: + */ + MEM_INIT_CS0(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS1(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS2(5, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS3(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS4(7, MEM_DVS_16, MEM_WRITE_EN, 0); + #elif defined(CONFIG_TARGET_C155) + /* + * C155/156 official fw MEMIF config is almost the same as Pirelli's, + * only nCS4 WS is different, but nCS4 is unused on this model... + */ + MEM_INIT_CS0(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS1(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS2(5, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS3(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS4(6, MEM_DVS_16, MEM_WRITE_EN, 0); + #elif defined(CONFIG_TARGET_C11X) || defined(CONFIG_TARGET_C139) || \ + defined(CONFIG_TARGET_GTAMODEM) + /* + * The original settings from Openmoko, + * only nCS0 and nCS1 are actually used, + * same as on Mot C1xx phones, + * the nCS2/3/4 settings are dummies from TI. + */ + MEM_INIT_CS0(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS1(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS2(5, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS3(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS4(0, MEM_DVS_8, MEM_WRITE_EN, 0); + #elif defined(CONFIG_TARGET_J100) + /* + * Same as Mot C11x/12x/139/140 and Openmoko except for nCS2 WS: + * it appears that SE J100 has its ringtone melody generator chip + * hooked up there. + */ + MEM_INIT_CS0(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS1(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS2(6, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS3(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS4(0, MEM_DVS_8, MEM_WRITE_EN, 0); + #elif (CHIPSET == 8) + /* + * Our only Calypso C05 target is Mother Mychaela's D-Sample board. + * WS=3 with the ARM7 core running at 39 MHz gives us 92 ns, + * so we should be good on this board. + */ + MEM_INIT_CS0(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS1(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS2(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS3(3, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS4(0, MEM_DVS_8, MEM_WRITE_EN, 0); + #elif (CHIPSET == 10) || (CHIPSET == 11) + /* + * Default for Calypso C035 targets in the absence of a more specific + * selection above. We put the WS=4 memory-oriented setting on all + * chip selects so we automatically cover targets with a second flash + * chip select no matter if it's nCS2, nCS3 or nCS4, as well as even + * weirder targets with XRAM somewhere other than nCS1. + */ + MEM_INIT_CS0(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS1(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS2(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS3(4, MEM_DVS_16, MEM_WRITE_EN, 0); + MEM_INIT_CS4(4, MEM_DVS_16, MEM_WRITE_EN, 0); + #else + #error "Unknown MEMIF configuration" + #endif + MEM_INIT_CS6(0, MEM_DVS_32, MEM_WRITE_EN, 0); + MEM_INIT_CS7(0, MEM_DVS_32, MEM_WRITE_DIS, 0); + RHEA_INITAPI(0,1); + RHEA_INITARM(0,0); + DPLL_SET_PLL_ENABLE; + + /* + * Disable and Clear all pending interrupts + */ + #if (CHIPSET == 12) || (CHIPSET == 15) + F_INTH_DISABLE_ALL_IT; // MASK all it + F_INTH2_VALID_NEXT(C_INTH_IRQ); // reset current IT in INTH2 IRQ + F_INTH_VALID_NEXT(C_INTH_IRQ); // reset current IT in INTH IRQ + F_INTH_VALID_NEXT(C_INTH_FIQ); // reset current IT in INTH FIQ + F_INTH_RESET_ALL_IT; // reset all IRQ/FIQ source + #else + INTH_DISABLEALLIT; + #if 0 /* not present in our reference binary object */ + INTH_RESETALLIT; + #endif + INTH_CLEAR; /* reset IRQ/FIQ source */ + #endif + + // INTH + //-------------------------------------------------- + #if (CHIPSET == 12) || (CHIPSET == 15) + #if (GSM_IDLE_RAM != 0) + f_inth_setup((T_INTH_CONFIG *)a_inth_config_idle_ram); // setup configuration IT handlers + #else + f_inth_setup((T_INTH_CONFIG *)a_inth_config); // setup configuration IT handlers + #endif + #else + IQ_SetupInterrupts(); + #endif + + + #if (CHIPSET == 12) || (CHIPSET == 15) + #if (OP_L1_STANDALONE == 0) + + f_dma_global_parameter_set((T_DMA_TYPE_GLOBAL_PARAMETER *)&d_dma_global_parameter); + #endif + f_dma_channel_allocation_set(C_DMA_CHANNEL_0, C_DMA_CHANNEL_DSP); + #if (OP_L1_STANDALONE == 1) + f_dma_global_parameter_set((T_DMA_TYPE_GLOBAL_PARAMETER *)&d_dma_global_parameter); + f_dma_channel_allocation_set(C_DMA_CHANNEL_0, C_DMA_CHANNEL_DSP); + #endif + + #else + // DMA + //-------------------------------------------------- + // channel0 = Arm, channel1 = Lead, channel2 = forced to Arm, channel3=forced to Arm, dma_burst = 0001, priority = same + #if (OP_L1_STANDALONE == 0) + DMA_ALLOCDMA(1,0,1,1); // Channel 1 used by DSP with RIF RX + #endif + #endif + + /* CHIPSET = 4 or 7 or 8 or 10 or 11 or 12 */ + + #else + + // RHEA Bridge + //-------------------------------------------------- + // ACCES_FAC_0 = 0, ACCES_FAC_1 = 0 ,TIMEOUT = 0x7F + RHEA_INITRHEA(0,0,0x7F); + + #if (CHIPSET == 6) + // WS_H = 1 , WS_L = 15 + RHEA_INITAPI(1,15); // should be 0x01E1 for 65 Mhz + #else + // WS_H = 0 , WS_L = 7 + RHEA_INITAPI(0,7); // should be 0x0101 for 65 Mhz + #endif + + // Write_en_0 = 0 , Write_en_1 = 0 + RHEA_INITARM(0,0); + + // INTH + //-------------------------------------------------- + INTH_DISABLEALLIT; // MASK all it + INTH_CLEAR; // reset IRQ/FIQ source + IQ_SetupInterrupts(); + + // DMA + //-------------------------------------------------- + // channel0 = Arm, channel1 = Lead, dma_burst = 0001, priority = same + DMA_ALLOCDMA(1,0,1,1); // should be 0x25 (channel 1 = lead) + + #if (CHIPSET == 6) + // Memory WS configuration for ULYSS/G1 (26 Mhz) board + //----------------------------------------------------- + MEM_INIT_CS2(2,MEM_DVS_16,MEM_WRITE_EN,0); + #endif + + // CLKM + //-------------------------------------------------- + CLKM_InitARMClock(0x00, 2); /* no low freq, no ext clock, div by 1 */ + + #if (CHIPSET == 6) + CLKM_INITCNTL(CLKM_IRQ_DIS | CLKM_BRIDGE_DIS | CLKM_TIMER_DIS | CLKM_VTCXO_26); + #else + CLKM_INITCNTL(CLKM_IRQ_DIS | CLKM_BRIDGE_DIS | CLKM_TIMER_DIS); + #endif + + #endif /* CHIPSET = 4 or 7 or 8 or 10 or 11 or 12 */ + + // Freeze ULPD timer .... + //-------------------------------------------------- + *((volatile SYS_UWORD16 *) ULDP_GSM_TIMER_INIT_REG ) = 0; + *((volatile SYS_UWORD16 *) ULDP_GSM_TIMER_CTRL_REG ) = TPU_FREEZE; + + // reset INC_SIXTEEN and INC_FRAC + //-------------------------------------------------- + #if (OP_L1_STANDALONE == 1) + l1ctl_pgm_clk32(DEFAULT_HFMHZ_VALUE,DEFAULT_32KHZ_VALUE); + #else + ULDP_INCSIXTEEN_UPDATE(132); //32768.29038 =>132, 32500 => 133 + // 26000 --> 166 + ULDP_INCFRAC_UPDATE(15840); //32768.29038 =>15840, 32500 => 21845 + // 26000 --> 43691 + #endif /* OP_L1_STANDALONE */ + + // program ULPD WAKE-UP .... + //================================================= + #if (CHIPSET == 2) + *((volatile SYS_UWORD16 *)ULDP_SETUP_FRAME_REG) = SETUP_FRAME; // 2 frame + *((volatile SYS_UWORD16 *)ULDP_SETUP_VTCXO_REG) = SETUP_VTCXO; // 31 periods + *((volatile SYS_UWORD16 *)ULDP_SETUP_SLICER_REG) = SETUP_SLICER; // 31 periods + *((volatile SYS_UWORD16 *)ULDP_SETUP_CLK13_REG) = SETUP_CLK13; // 31 periods + #else + *((volatile SYS_UWORD16 *)ULDP_SETUP_FRAME_REG) = SETUP_FRAME; // 3 frames + *((volatile SYS_UWORD16 *)ULDP_SETUP_VTCXO_REG) = SETUP_VTCXO; // 0 periods + *((volatile SYS_UWORD16 *)ULDP_SETUP_SLICER_REG) = SETUP_SLICER; // 31 periods + *((volatile SYS_UWORD16 *)ULDP_SETUP_CLK13_REG) = SETUP_CLK13; // 31 periods + *((volatile SYS_UWORD16 *)ULPD_SETUP_RF_REG) = SETUP_RF; // 31 periods + #endif + + // Set Gauging versus HF (PLL) + //================================================= + ULDP_GAUGING_SET_HF; // Enable gauging versus HF + ULDP_GAUGING_HF_PLL; // Gauging versus PLL + + // current supply for quartz oscillation + //================================================= + #if (OP_L1_STANDALONE == 1) + #if ((CHIPSET != 9) && (CHIPSET != 12) && (CHIPSET !=15)) // programming model changed for Ulysse C035, stay with default value + *(volatile SYS_UWORD16 *)QUARTZ_REG = 0x27; + #endif + #else + #if ((BOARD == 6) || (BOARD == 8) || (BOARD == 9) || (BOARD == 35) || (BOARD == 40) || (BOARD == 41)) + *((volatile SYS_UWORD16 *)QUARTZ_REG) = 0x27; + #elif (BOARD == 7) + *((volatile SYS_UWORD16 *)QUARTZ_REG) = 0x24; + #endif + #endif /* OP_L1_STANDALONE */ + + // stop Gauging if any (debug purpose ...) + //-------------------------------------------------- + if ( *((volatile SYS_UWORD16 *) ULDP_GAUGING_CTRL_REG) & ULDP_GAUGING_EN) + { + volatile UWORD32 j; + ULDP_GAUGING_STOP; /* Stop the gauging */ + /* wait for gauging it*/ + // one 32khz period = 401 periods of 13Mhz + for (j=1; j<50; j++); + while (! (* (volatile SYS_UWORD16 *) ULDP_GAUGING_STATUS_REG) & ULDP_IT_GAUGING); + } + + #if (OP_L1_STANDALONE == 0) + AI_ClockEnable (); + + #if (BOARD == 7) + // IOs configuration of the B-Sample in order to optimize the power consumption + AI_InitIOConfig(); + + // Set LPG instead of DSR_MODEM + *((volatile SYS_UWORD16 *) ASIC_CONF) |= 0x40; + // Reset the PERM_ON bit of LCR_REG + *((volatile SYS_UWORD16 *) MEM_LPG) &= ~(0x80); + #elif ((BOARD == 8) || (BOARD == 9)) + // IOs configuration of the C-Sample in order to optimize the power consumption + AI_InitIOConfig(); + + // set the debug latch to 0x00. + *((volatile SYS_UWORD8 *) 0x2800000) = 0x00; + #elif ((BOARD == 35) || (BOARD == 46)) + AI_InitIOConfig(); + // CSMI INTERFACE + // Initialize CSMI clients for GSM control + // and Fax/Data services + CSMI_Init(); + GC_Initialize(); // GSM control initialization + CU_Initialize(); // Trace initialization + CF_Initialize(); // Fax/Data pre-initialization + #elif ((BOARD == 40) || (BOARD == 41)) + // IOs configuration of the D-Sample in order to optimize the power consumption + AI_InitIOConfig(); + + #ifdef BTEMOBILE + // Reset BT chip by toggling the Island's nRESET_OUT signal + *((volatile SYS_UWORD16 *) 0xFFFFFD04) |= 0x04; + *((volatile SYS_UWORD16 *) 0xFFFFFD04) &= ~(0x4); + #endif + + // set the debug latch to 0x0000. + /* + * FreeCalypso change: this write is only correct when running + * on an actual D-Sample board, but not on any of the real-world + * Calypso target devices. + */ + #ifdef CONFIG_TARGET_DSAMPLE + *((volatile SYS_UWORD16 *) 0x2700000) = 0x0000; + #endif + #endif // BOARD + + // Enable HW Timers 1 & 2 + TM_EnableTimer (1); + TM_EnableTimer (2); + + #endif /* (OP_L1_STANDALONE == 0) */ + + #endif /* #if (BOARD == 5) */ +} + +/* + * Init_Drivers + * + * Performs Drivers Initialization. + */ +void Set_Switch_ON_Cause(void); +void Init_Drivers(void) +{ + +#if (CHIPSET==15) + bspI2c_init(); + bspTwl3029_init(); + + #if (OP_L1_STANDALONE == 0) + Set_Switch_ON_Cause(); + #endif + + + /* Turn on DRP We will make VRMCC to device group Modem + * And Switch it on. + */ + bspTwl3029_Power_setDevGrp(NULL,BSP_TWL3029_POWER_VRMMC,BSP_TWL3029_POWER_DEV_GRP_MODEM); + wait_ARM_cycles(convert_nanosec_to_cycles(100000*2)); + bspTwl3029_Power_enable(NULL,BSP_TWL3029_POWER_VRMMC,BSP_TWL3029_POWER_STATE_ACTIVE); +#endif + +#if (CHIPSET!=15) + #if ABB_SEMAPHORE_PROTECTION + // Create the ABB semaphore + ABB_Sem_Create(); + #endif // SEMAPHORE_PROTECTION +#endif + + #if (OP_L1_STANDALONE == 0) + /* + * Initialize FFS invoking restore procedure by MPU-S + */ + #if ((BOARD == 35) || (BOARD == 46)) + GC_FfsRestore(); + #endif + + /* + * FFS main initialization. + */ + + ffs_main_init(); + + + /* + * Initialize Riviera manager and create tasks thanks to it. + */ +#if (CHIPSET!=15) || (REMU==0) + rvf_init(); + rvm_init(); /* A-M-E-M-D-E-D! */ + create_tasks(); +#endif + /* + * SIM Main Initialization. + */ + #if (CHIPSET!=15) + SIM_Initialize (); + #else + bspUicc_bootInit(); + #endif + #endif +} + +/* + * Init_Serial_Flows + * + * Performs Serialswitch + related serial data flows initialization. + */ +void Init_Serial_Flows (void) +{ + #if (OP_L1_STANDALONE == 0) + + /* + * Initialize Serial Switch module. + */ + #if ((BOARD==35) || (BOARD == 46)) + SER_InitSerialConfig (GC_GetSerialConfig()); + #else + SER_InitSerialConfig (&appli_ser_cfg_info); + #endif + /* + * Then Initialize the Serial Data Flows and the associated UARTs: + * - G2-3 Trace if GSM/GPRS Protocol Stack + * - AT-Cmd/Fax & Data Flow + * + * Layer1/Riviera Trace Flow and Bluetooth HCI Flow are initialized + * by the appropriate SW Entities. + * + * G2-3 Trace => No more Used + */ + SER_tr_Init(SER_PROTOCOL_STACK, TR_BAUD_38400, NULL); + + /* + * Fax & Data / AT-Command Interpreter Serial Data Flow Initialization + */ + + #if ((BOARD != 35) && (BOARD != 46)) + (void) SER_fd_Initialize (); + #endif + #else /* OP_L1_STANDALONE */ + + #if (TESTMODE || (TRACE_TYPE==1) || (TRACE_TYPE==2) || (TRACE_TYPE==3) || (TRACE_TYPE==6) || (TRACE_TYPE==7)) + #if ((BOARD == 35) || (BOARD == 46)) + ser_cfg_info[UA_UART_0] = '0'; + #else + ser_cfg_info[UA_UART_0] = 'G'; + #endif + #if (CHIPSET !=15) + ser_cfg_info[UA_UART_1] = 'R'; // Riviear Demux on UART MODEM + #else + ser_cfg_info[UA_UART_0] = 'R'; // Riviear Demux on UART MODEM + #endif + + /* init Uart Modem */ + SER_InitSerialConfig (&appli_ser_cfg_info); + + #if TESTMODE || (TRACE_TYPE == 1) || (TRACE_TYPE == 7) + SER_tr_Init (SER_LAYER_1, TR_BAUD_115200, rvt_activate_RX_HISR); + + rvt_register_id("OTHER",&trace_id,(RVT_CALLBACK_FUNC)NULL); + #else + SER_tr_Init (SER_LAYER_1, TR_BAUD_38400, NULL); + #endif + + L1_trace_string(" \n\r"); + + #endif /* TRACE_TYPE */ + + #endif /* OP_L1_STANDALONE */ +} + +/* + * Init_Unmask_IT + * + * Unmask all used interrupts. + */ +void Init_Unmask_IT (void) +{ + IQ_Unmask(IQ_FRAME); + IQ_Unmask(IQ_UART_IRDA_IT); + IQ_Unmask(IQ_UART_IT); + IQ_Unmask(IQ_ARMIO); +#if (L1_DYN_DSP_DWNLD == 1) + IQ_Unmask(IQ_API); +#endif +}