FreeCalypso > hg > freecalypso-tools
diff target-utils/calversion/dsp_bringup.c @ 441:1dcc9e4b71fd
target-utils/calversion: program written, compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 26 Dec 2018 06:40:02 +0000 |
parents | |
children | ca98f800bbf3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/target-utils/calversion/dsp_bringup.c Wed Dec 26 06:40:02 2018 +0000 @@ -0,0 +1,222 @@ +/* + * This module contains the dsp_power_on() function from TCS211, + * stripped and adapted for the present DSP version determination + * standalone program. + */ + +#include "types.h" +#include "leadapi.h" +#include "dsp_const.h" +#include "dsp_defty.h" + +/* definitions originally in l1_types.h */ + +typedef unsigned char BOOL; +typedef char CHAR; + +typedef unsigned char UWORD8; +typedef signed char WORD8; + +typedef unsigned short UWORD16; +typedef short WORD16; + +typedef unsigned long UWORD32; +typedef long WORD32; + +/* definitions originally in l1_confg.h */ + +#define DSP_START 0x7000 +#define INSTALL_ADD 0x7002 // Used to set gprs_install_address pointer + +#define C_PLL_CONFIG 0x154 // For VTCXO = 13 MHz and max DSP speed = 84.5 Mips + +#define C_DSP_SW_WORK_AROUND 0x000E + +#define C_DEBUG_BUFFER_ADD 0x17ff // Address of DSP write pointer... data are just after. +#define C_DEBUG_BUFFER_SIZE 7 // Real size is incremented by 1 for DSP write pointer. +#define C_DEBUG_TRACE_TYPE 0x0000 // Level = BASIC; Features = Timer + Buffer Header + Burst. + +/* DSP reset control register definitions */ + +#define MEM_CLKM_ADDR 0xfffffd00 /* CLKM registers addr. */ +#define CLKM_CNTL_RST (MEM_CLKM_ADDR + 4) /* CLKM Reset Control reg. */ + +#define CLKM_LEAD_RST 0x0002 +#define CLKM_EXT_RST 0x0004 + +/*-------------------------------------------------------*/ +/* dsp_power_on() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/* Remarq : USART Buffer is 256 characters. While USART*/ +/* is not run during Application_Initialize */ +/* (hisrs not served because Nucleus scheduler*/ +/* is not running yet) : */ +/* ==> check string size < 256 !!!!!! */ +/*-------------------------------------------------------*/ +void dsp_power_on(void) +{ + UWORD16 dsp_start_address; + UWORD16 param_size; + + API i; + volatile API *pt; + WORD16 j; + + volatile T_NDB_MCU_DSP * dsp_ndb_ptr; + + static API_SIGNED param_tab[] = { + + D_TRANSFER_RATE, + + // ..................Latencies + D_LAT_MCU_BRIDGE, D_LAT_MCU_HOM2SAM, + + D_LAT_MCU_BEF_FAST_ACCESS, D_LAT_DSP_AFTER_SAM, + + //...................p_gprs_install_adress + D_HOLE, + + //...................d_misc_config + D_MISC_CONFIG, + + //...................d_cn_sw_workaround + C_DSP_SW_WORK_AROUND, + + //...................Reserved + D_HOLE, D_HOLE, + D_HOLE, D_HOLE, + + //...................Frequency burst + D_FB_MARGIN_BEG, D_FB_MARGIN_END, + D_NSUBB_IDLE, D_NSUBB_DEDIC, D_FB_THR_DET_IACQ, + D_FB_THR_DET_TRACK, + //...................Demodulation + D_DC_OFF_THRES, D_DUMMY_THRES, D_DEM_POND_GEWL, + D_DEM_POND_RED, + //...................TCH Full Speech + D_MACCTHRESH1, D_MLDT, D_MACCTHRESH, + D_GU, D_GO, D_ATTMAX, + D_SM, D_B, + + //...................V42 bis + D_V42B_SWITCH_HYST, D_V42B_SWITCH_MIN, D_V42B_SWITCH_MAX, + D_V42B_RESET_DELAY, + + //...................TCH Half Speech + D_LDT_HR, D_MACCTRESH_HR, D_MACCTRESH1_HR, + D_GU_HR, D_GO_HR, D_B_HR, + D_SM_HR, D_ATTMAX_HR, + + //...................Added variables for EFR + C_MLDT_EFR, C_MACCTHRESH_EFR, C_MACCTHRESH1_EFR, + C_GU_EFR, C_GO_EFR, C_B_EFR, + C_SM_EFR, C_ATTMAX_EFR, + + //...................Full rate variables + D_SD_MIN_THR_TCHFS, + D_MA_MIN_THR_TCHFS, D_MD_MAX_THR_TCHFS, D_MD1_MAX_THR_TCHFS, + + //...................TCH Half Speech + D_SD_MIN_THR_TCHHS, D_MA_MIN_THR_TCHHS, D_SD_AV_THR_TCHHS, + D_MD_MAX_THR_TCHHS, D_MD1_MAX_THR_TCHHS, + + //...................TCH Enhanced Full Rate Speech + D_SD_MIN_THR_TCHEFS, D_MA_MIN_THR_TCHEFS, D_MD_MAX_THR_TCHEFS, + D_MD1_MAX_THR_TCHEFS, D_WED_FIL_INI, + + D_WED_FIL_TC, D_X_MIN, D_X_MAX, + D_SLOPE, D_Y_MIN, D_Y_MAX, + D_WED_DIFF_THRESHOLD,D_MABFI_MIN_THR_TCHHS,D_FACCH_THR, + + D_MAX_OVSPD_UL, D_SYNC_THRES, D_IDLE_THRES, + D_M1_THRES, D_MAX_OVSP_DL, D_GSM_BGD_MGT + }; + param_size = 79; + + // NDB pointer. + dsp_ndb_ptr = (volatile T_NDB_MCU_DSP *) NDB_ADR; + + //------------- + // DSP STARTUP + //------------- + { + // Release Lead reset before DSP code/patch download to insure proper reset of DSP + printf("Releasing DSP core from reset\n"); + (*(unsigned short *) CLKM_CNTL_RST) &= ~CLKM_LEAD_RST; + + // GSM 1.5 + //----------------------------------------------------------------- + // After RESET release, DSP is in SAM Mode ! while API_CNTR (0xF900) + // register is in reset state: HOM mode, PLL off, Bridge off. No ws + // are applied for MCU<-->API access !!!!! So, MCU must wait for + // end of Leadboot execution before accessing API. + //wait_ARM_cycles(convert_nanosec_to_cycles(10000)); // wait 10us + osmo_delay_ms(10); + + // NO DOWNLOAD... + { + // Wait for READY status from DSP. + printf("Waiting for DSP bootloader READY status\n"); + while(*((volatile UWORD16 *)DOWNLOAD_STATUS) != LEAD_READY); + + // Set DSP start address. + dsp_start_address = DSP_START; + } + } + + //-------------------------------------------------------------- + // Loading of NDB parameters....... + //-------------------------------------------------------------- + printf("Loading NDB parameters\n"); + // Initialize background control variable to No background. Background tasks can be launch in GPRS + // as in GSM. + dsp_ndb_ptr->d_background_enable = 0; + dsp_ndb_ptr->d_background_abort = 0; + dsp_ndb_ptr->d_background_state = 0; + dsp_ndb_ptr->d_debug_ptr = 0x0074; + dsp_ndb_ptr->d_debug_bk = 0x0001; + dsp_ndb_ptr->d_pll_config = C_PLL_CONFIG; + dsp_ndb_ptr->p_debug_buffer = C_DEBUG_BUFFER_ADD; + dsp_ndb_ptr->d_debug_buffer_size = C_DEBUG_BUFFER_SIZE; + dsp_ndb_ptr->d_debug_trace_type = C_DEBUG_TRACE_TYPE; + + // Deep Sleep work around used on Calypso + // This init is used to backward compatibility with old patch. + dsp_ndb_ptr->d_dsp_state = C_DSP_IDLE3; + + dsp_ndb_ptr->d_audio_gain_ul = 0; + dsp_ndb_ptr->d_audio_gain_dl = 0; + + // for patch >= 2100, use new AEC + dsp_ndb_ptr->d_es_level_api = 0x5213; + dsp_ndb_ptr->d_mu_api = 0x5000; + + //-------------------------------------------------------------- + // Loading of PARAM area....... + //-------------------------------------------------------------- + printf("Loading PARAM area\n"); + // Load PARAM memory... + pt = (volatile API *) PARAM_ADR; + + for (i=0; i<param_size; i++) *pt++ = param_tab[i]; + + { + T_PARAM_MCU_DSP *pt_param = (T_PARAM_MCU_DSP *) PARAM_ADR; + + // "d_gprs_install_address" has to be set only if no PATCH is download, i.e. + // "d_gprs_install_address" is automatically set by DSP if a PATCH is download + pt_param->d_gprs_install_address = INSTALL_ADD; + } + + printf("Booting DSP main code\n"); + *(volatile UWORD16 *) DOWNLOAD_SIZE = 0; // Size=0 to force DSP to start from address... + *(volatile UWORD16 *) DOWNLOAD_ADDR = dsp_start_address; // Start address. + *(volatile UWORD16 *) DOWNLOAD_STATUS = BLOCK_READY; // Start DSP... + + osmo_delay_ms(50); + printf("DSP reports version 0x%04X 0x%04X\n", + dsp_ndb_ptr->d_version_number1, dsp_ndb_ptr->d_version_number2); +}