FreeCalypso > hg > fc-magnetite
diff src/cs/layer1/p_cfile/l1p_func.c @ 302:0740b5ff15f6
reconstructed L1_GPRS source imported from tcs211-l1-reconst
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 31 Oct 2017 03:42:35 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/layer1/p_cfile/l1p_func.c Tue Oct 31 03:42:35 2017 +0000 @@ -0,0 +1,566 @@ +/************* Revision Controle System Header ************* + * GSM Layer 1 software + * L1P_FUNC.C + * + * Filename l1p_func.c + * Copyright 2003 (C) Texas Instruments + * + ************* Revision Controle System Header *************/ + +#define L1P_FUNC_C + +#include "l1_macro.h" +#include "l1_confg.h" + +#if L1_GPRS + +#if (CODE_VERSION == SIMULATION) + #include "stddef.h" +#endif + +#include "l1_types.h" +#include "sys_types.h" +#include "l1_const.h" + + +#if TESTMODE + #include "l1tm_defty.h" +#endif +#if (AUDIO_TASK == 1) + #include "l1audio_const.h" + #include "l1audio_cust.h" + #include "l1audio_defty.h" +#endif +#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 +#include "l1_defty.h" +#include "l1_varex.h" + +#include "cust_os.h" +#include "l1_msgty.h" +#include "l1_time.h" + +#include "l1p_cons.h" +#include "l1p_msgt.h" +#include "l1p_deft.h" +#include "l1p_vare.h" +#include "l1p_sign.h" + +#if(RF_FAM == 61) + #include "l1_rf61.h" + #include "tpudrv61.h" +#endif + +#if (CODE_VERSION == SIMULATION) + #include "l1_rf2.h" +#endif + +/*-------------------------------------------------------*/ +/* Prototypes of external functions used in this file. */ +/*-------------------------------------------------------*/ + +void l1pddsp_meas_ctrl (UWORD8 nbmeas, UWORD8 pm_pos); +void l1dtpu_meas (UWORD16 radio_freq,WORD8 agc,UWORD8 lna_off, + UWORD16 win_id,UWORD16 tpu_synchro, UWORD8 adc_active +#if (RF_FAM == 61) + ,UWORD8 afc_mode + ,UWORD8 if_ctl +#endif + ); +WORD8 Cust_get_agc_from_IL (UWORD16 radio_freq, UWORD16 agc_index, UWORD8 table_id); +void l1ps_macs_init (void); + +/*-------------------------------------------------------*/ +/* initialize_l1pvar() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* ------------- */ +/* Return : */ +/* ------------- */ +/* Description : */ +/* ------------- */ +/* This routine is used to initialize the l1pa, l1ps and */ +/* l1pa_l1ps_com global structures. */ +/*-------------------------------------------------------*/ +void initialize_l1pvar(void) +{ + UWORD8 i; + + //++++++++++++++++++++++++++++++++++++++++++ + // Reset "l1ps" structure. + //++++++++++++++++++++++++++++++++++++++++++ + + l1ps.last_PR_good = 0; + l1ps.ILmin_beacon = 255; +#if 0 /* FreeCalypso TCS211 reconstruction */ + l1ps.read_param.assignment_id = 0xFF; /* do not return non initialized value to RLC */ +#endif + + for(i = 0; i < 8; i++) + l1ps.ILmin_others[i] = l1_config.params.il_min; + + //++++++++++++++++++++++++++++++++++++++++++ + // Reset "l1pa" structure. + //++++++++++++++++++++++++++++++++++++++++++ + + for(i=0;i<NBR_L1PA_PROCESSES;i++) + { + l1pa.state[i] = 0; + l1pa.l1pa_en_meas[i] = 0; + } + + //++++++++++++++++++++++++++++++++++++++++++ + // Reset "l1pa_l1ps_com" structure. + //++++++++++++++++++++++++++++++++++++++++++ + + // Initialize PC_MEAS_CHAN flag + l1ps.pc_meas_chan_ctrl = FALSE; + + // Initialize active list used in Neighbour Measurement Transfer Process + l1pa_l1ps_com.cres_freq_list.alist = &(l1pa_l1ps_com.cres_freq_list.list[0]); + + // Initialize parameters used in Neighbour Measurement Transfer Process + l1pa_l1ps_com.cres_freq_list.alist->nb_carrier = 0; + l1pa_l1ps_com.tcr_freq_list.new_list_present = FALSE; + + l1pa_l1ps_com.transfer.semaphore = TRUE; + l1pa_l1ps_com.transfer.aset = &(l1pa_l1ps_com.transfer.set[0]); + l1pa_l1ps_com.transfer.fset[0] = &(l1pa_l1ps_com.transfer.set[1]); + l1pa_l1ps_com.transfer.fset[1] = &(l1pa_l1ps_com.transfer.set[2]); + + // Initialize Downlink Power Control Struture. Set CRC to BAD, bcch_level + // and burst_level[] to INVALID. + l1pa_l1ps_com.transfer.dl_pwr_ctrl.crc_error = TRUE; + l1pa_l1ps_com.transfer.dl_pwr_ctrl.bcch_level = (WORD8)0x80;//omaps00090550 + + for(i = 0; i < 4; i++) + { + l1pa_l1ps_com.transfer.dl_pwr_ctrl.burst_level[i] = (WORD8)0x80;//omaps00090550 + } + + l1pa_l1ps_com.transfer.set[0].ul_tbf_alloc = &(l1pa_l1ps_com.transfer.ul_tbf_alloc[0]); + l1pa_l1ps_com.transfer.set[1].ul_tbf_alloc = &(l1pa_l1ps_com.transfer.ul_tbf_alloc[1]); + l1pa_l1ps_com.transfer.set[2].ul_tbf_alloc = &(l1pa_l1ps_com.transfer.ul_tbf_alloc[2]); + + for(i=0;i<3;i++) + { + l1pa_l1ps_com.transfer.set[i].SignalCode = 0; + l1pa_l1ps_com.transfer.set[i].dl_tbf_synchro_timeslot = 0; + l1pa_l1ps_com.transfer.set[i].dl_tbf_synchro_timeslot = 0; + l1pa_l1ps_com.transfer.set[i].transfer_synchro_timeslot = 0; + l1pa_l1ps_com.transfer.set[i].allocated_tbf = NO_TBF; + l1pa_l1ps_com.transfer.set[i].assignment_command = NO_TBF; + l1pa_l1ps_com.transfer.set[i].multislot_class = 0; + + l1pa_l1ps_com.transfer.set[i].packet_ta.ta = 255; + l1pa_l1ps_com.transfer.set[i].packet_ta.ta_index = 255; + l1pa_l1ps_com.transfer.set[i].packet_ta.ta_tn = 255; + + l1pa_l1ps_com.transfer.set[i].tsc = 0; + + l1pa_l1ps_com.transfer.set[i].freq_param.chan_sel.h = 0; + l1pa_l1ps_com.transfer.set[i].freq_param.chan_sel. + rf_channel.single_rf.radio_freq = 0; + + l1pa_l1ps_com.transfer.set[i].tbf_sti.present = FALSE; + + l1pa_l1ps_com.transfer.set[i].mac_mode = 0; + + l1pa_l1ps_com.transfer.set[i].ul_tbf_alloc->tfi = 255; + l1pa_l1ps_com.transfer.set[i].dl_tbf_alloc.tfi = 255; + + l1pa_l1ps_com.transfer.set[i].dl_pwr_ctl.p0 = 255; + l1pa_l1ps_com.transfer.set[i].dl_pwr_ctl.bts_pwr_ctl_mode = 0; + l1pa_l1ps_com.transfer.set[i].dl_pwr_ctl.pr_mode = 0; + } + + //++++++++++++++++++++++++++++++++++++++++++ + // Reset "l1pa_macs_com" structure. + //++++++++++++++++++++++++++++++++++++++++++ + + l1ps_macs_com.fix_alloc_exhaust_flag = FALSE; + l1ps_macs_com.rlc_downlink_call = FALSE; + #if FF_L1_IT_DSP_USF + l1ps_macs_com.usf_status = USF_AVAILABLE; + #endif + #if L1_EDA + l1ps_macs_com.fb_sb_task_enabled = FALSE; + l1ps_macs_com.fb_sb_task_detect = FALSE; + #endif + + //++++++++++++++++++++++++++++++++++++++++++ + // Reset MAC-S static structure. + //++++++++++++++++++++++++++++++++++++++++++ + l1ps_macs_init(); + + //++++++++++++++++++++++++++++++++++++++++++ + // Reset packet transfer mode commands. + //++++++++++++++++++++++++++++++++++++++++++ + + l1pa_l1ps_com.transfer.ptcch.ta_update_cmd = FALSE; + l1pa_l1ps_com.transfer.psi_param.psi_param_update_cmd = FALSE; + l1pa_l1ps_com.transfer.tbf_release_param.tbf_release_cmd = FALSE; + l1pa_l1ps_com.transfer.pdch_release_param.pdch_release_cmd = FALSE; + l1pa_l1ps_com.transfer.repeat_alloc.repeat_allocation = FALSE; +} + +/*-------------------------------------------------------*/ +/* l1ps_reset_db_mcu_to_dsp() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +void l1ps_reset_db_mcu_to_dsp(T_DB_MCU_TO_DSP_GPRS *page_ptr) +{ + API i; + API size = sizeof(T_DB_MCU_TO_DSP_GPRS) / sizeof(API); + API *ptr = (API *)page_ptr; + + // Clear all locations. + for(i=0; i<size; i++) *ptr++ = 0; +} + +/*-------------------------------------------------------*/ +/* l1ps_reset_db_dsp_to_mcu() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +void l1ps_reset_db_dsp_to_mcu(T_DB_DSP_TO_MCU *page_ptr) +{ + API i; + API size = sizeof(T_DB_DSP_TO_MCU_GPRS) / sizeof(API); + API *ptr = (API *)page_ptr; + + // Clear all locations. + for(i=0; i<size; i++) *ptr++ = 0; + + // Set crc result as "SB not found". + page_ptr->a_sch[0] = (1<<B_SCH_CRC); // B_SCH_CRC =1, BLUD =0 +} + +/*-------------------------------------------------------*/ +/* l1ps_swap_iq_dl() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +BOOL l1ps_swap_iq_dl(UWORD16 radio_freq) +{ + UWORD8 swap_iq; + BOOL swap_flag; + +#if (L1_FF_MULTIBAND == 0) + + if(((l1_config.std.id == DUAL) || (l1_config.std.id == DUALEXT) || (l1_config.std.id == DUAL_US)) && + (radio_freq >= l1_config.std.first_radio_freq_band2)) + { + swap_iq = l1_config.std.swap_iq_band2; + } + else + { + swap_iq = l1_config.std.swap_iq_band1; + } + +#else // L1_FF_MULTIBAND = 1 below + + UWORD16 physical_band_id; + physical_band_id = + l1_multiband_radio_freq_convert_into_physical_band_id(radio_freq); + swap_iq = rf_band[physical_band_id].swap_iq; + +#endif // #if (L1_FF_MULTIBAND == 0) else + + + switch(swap_iq) + { + case 0: /* No swap at all. */ + case 2: /* DL, no swap. */ + swap_flag = FALSE; + break; + case 1: /* DL I/Q swap. */ + case 3: /* DL I/Q swap. */ + swap_flag = TRUE; + break; + } + return(swap_flag); +} + +/*-------------------------------------------------------*/ +/* l1ps_swap_iq_ul() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +BOOL l1ps_swap_iq_ul(UWORD16 radio_freq) +{ + UWORD8 swap_iq; + BOOL swap_flag; + +#if (L1_FF_MULTIBAND == 0) + + if(((l1_config.std.id == DUAL) || (l1_config.std.id == DUALEXT) || (l1_config.std.id == DUAL_US)) && + (radio_freq >= l1_config.std.first_radio_freq_band2)) + { + swap_iq = l1_config.std.swap_iq_band2; + } + else + { + swap_iq = l1_config.std.swap_iq_band1; + } + +#else // L1_FF_MULTIBAND = 1 below + + UWORD16 physical_band_id = 0; + physical_band_id = + l1_multiband_radio_freq_convert_into_physical_band_id(radio_freq); + swap_iq = rf_band[physical_band_id].swap_iq; + +#endif // #if (L1_FF_MULTIBAND == 0) else + + switch(swap_iq) + { + case 0: /* No swap at all. */ + case 1: /* UL, no swap. */ + swap_flag = FALSE; + break; + case 2: /* UL I/Q swap. */ + case 3: /* UL I/Q swap. */ + swap_flag = TRUE; + break; + } + return(swap_flag); +} + +/*-------------------------------------------------------*/ +/* l1ps_tcr_ctrl() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +void l1ps_tcr_ctrl(UWORD8 pm_position) +{ + UWORD16 radio_freq_ctrl; + UWORD8 lna_off; + WORD8 agc; + + UWORD8 mode = PACKET_TRANSFER; + UWORD8 input_level; + #if (RF_FAM == 61) + UWORD16 dco_algo_ctl_pw = 0; + UWORD8 if_ctl = 0; + UWORD8 if_threshold = C_IF_ZERO_LOW_THRESHOLD_GSM; + #endif + + radio_freq_ctrl = l1pa_l1ps_com.cres_freq_list.alist->freq_list[l1pa_l1ps_com.tcr_freq_list.tcr_next_to_ctrl]; + + // Get AGC according to the last known IL. + + input_level = l1a_l1s_com.last_input_level[radio_freq_ctrl - l1_config.std.radio_freq_index_offset].input_level; + agc = Cust_get_agc_from_IL(radio_freq_ctrl, input_level >> 1, PWR_ID); + lna_off = l1a_l1s_com.last_input_level[radio_freq_ctrl - l1_config.std.radio_freq_index_offset].lna_off; + + #if (RF_FAM == 61) // Locosto DCO + #if (PWMEAS_IF_MODE_FORCE == 0) + cust_get_if_dco_ctl_algo(&dco_algo_ctl_pw, &if_ctl, (UWORD8) L1_IL_VALID , + input_level, + l1pa_l1ps_com.p_idle_param.radio_freq, if_threshold); + #else + if_ctl = IF_120KHZ_DSP; + dco_algo_ctl_pw = DCO_IF_0KHZ; + #endif + + + l1ddsp_load_dco_ctl_algo_pw(dco_algo_ctl_pw); + l1s.tcr_prog_done=1; + #endif + + // Memorize the IL and LNA used for AGC setting. + l1pa_l1ps_com.tcr_freq_list.used_il_lna.il = l1a_l1s_com.last_input_level[radio_freq_ctrl - l1_config.std.radio_freq_index_offset].input_level; + l1pa_l1ps_com.tcr_freq_list.used_il_lna.lna = l1a_l1s_com.last_input_level[radio_freq_ctrl - l1_config.std.radio_freq_index_offset].lna_off; + + // tpu pgm: 1 measurement only. + l1dtpu_meas(radio_freq_ctrl, + agc, + lna_off, + l1s.tpu_win, + l1s.tpu_offset,INACTIVE +#if(RF_FAM == 61) + ,L1_AFC_SCRIPT_MODE + ,if_ctl +#endif + ); + + // Increment tpu window identifier. + l1s.tpu_win += (l1_config.params.rx_synth_load_split + PWR_LOAD); + + // increment carrier counter for next measurement... + if(++l1pa_l1ps_com.tcr_freq_list.tcr_next_to_ctrl >= l1pa_l1ps_com.cres_freq_list.alist->nb_carrier) + l1pa_l1ps_com.tcr_freq_list.tcr_next_to_ctrl = 0; + + // Program DSP, in order to performed 1 measure. + // Second argument specifies PW position. + l1pddsp_meas_ctrl(1, pm_position); + + #if (TRACE_TYPE!=0) + //trace_fct(CST_CTRL_TRANSFER_MEAS, radio_freq_ctrl); + #endif + + // Update d_debug timer + l1s_dsp_com.dsp_db_w_ptr->d_debug = (l1s.debug_time + 2) ; + + + // Flag measurement control. + // ************************** + + // Set flag "ms_ctrl" to nb_meas_to_perform. + // It will be used as 2 tdma delayed to trigger Read phase. + l1pa_l1ps_com.tcr_freq_list.ms_ctrl = 1; + + // Flag DSP and TPU programmation. + // ******************************** + + // Set "CTRL_MS" flag in the controle flag register. + l1s.tpu_ctrl_reg |= CTRL_MS; + l1s.dsp_ctrl_reg |= CTRL_MS; + +} + +/*-------------------------------------------------------*/ +/* l1ps_bcch_meas_ctrl() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +void l1ps_bcch_meas_ctrl(UWORD8 ts) +{ + UWORD8 lna_off; + WORD8 agc; + + UWORD8 mode = PACKET_TRANSFER; + UWORD8 input_level; + #if (RF_FAM == 61) + UWORD16 dco_algo_ctl_pw =0; + UWORD8 if_ctl=0; + UWORD8 if_threshold = C_IF_ZERO_LOW_THRESHOLD_GSM; + #endif + + + if ((l1s.dsp_ctrl_reg & CTRL_ABORT) == 0) + { + #define radio_freq_ctrl l1a_l1s_com.Scell_info.radio_freq + + // Get AGC according to the last known IL. + input_level = l1a_l1s_com.last_input_level[radio_freq_ctrl - l1_config.std.radio_freq_index_offset].input_level; + agc = Cust_get_agc_from_IL(radio_freq_ctrl, input_level >> 1, PWR_ID); + lna_off = l1a_l1s_com.last_input_level[radio_freq_ctrl - l1_config.std.radio_freq_index_offset].lna_off; + // Memorize the IL and LNA used for AGC setting. + // Note: the same structure as for TCR meas is used for PC_MEAS_CHAN measurements + l1pa_l1ps_com.tcr_freq_list.used_il_lna.il = l1a_l1s_com.last_input_level[radio_freq_ctrl - l1_config.std.radio_freq_index_offset].input_level; + l1pa_l1ps_com.tcr_freq_list.used_il_lna.lna = l1a_l1s_com.last_input_level[radio_freq_ctrl - l1_config.std.radio_freq_index_offset].lna_off; + + + #if (RF_FAM == 61) // Locosto DCO + cust_get_if_dco_ctl_algo(&dco_algo_ctl_pw, &if_ctl, (UWORD8) L1_IL_VALID, + input_level, + radio_freq_ctrl,if_threshold); + + l1ddsp_load_dco_ctl_algo_pw(dco_algo_ctl_pw); + #endif + + + // tpu pgm: 1 measurement only. + l1dtpu_meas(radio_freq_ctrl, + agc, + lna_off, + l1s.tpu_win, + l1s.tpu_offset,INACTIVE +#if(RF_FAM == 61) + ,L1_AFC_SCRIPT_MODE + ,if_ctl +#endif + ); + + // Increment tpu window identifier. + l1s.tpu_win += (l1_config.params.rx_synth_load_split + PWR_LOAD); + + // Program DSP, in order to performed 1 measure. + // Second argument specifies PW position. + l1pddsp_meas_ctrl(1, (UWORD8)ts); + + #if (TRACE_TYPE!=0) && (TRACE_TYPE!=5) + //trace_fct(CST_CTRL_SCELL_TRANSFER_MEAS, radio_freq_ctrl); + #endif + + // Update d_debug timer + l1s_dsp_com.dsp_db_w_ptr->d_debug = (l1s.debug_time + 2) ; + + + // Flag measurement control. + // ************************** + + l1ps.pc_meas_chan_ctrl = TRUE; + + // Flag DSP and TPU programmation. + // ******************************** + + // Set "CTRL_MS" flag in the controle flag register. + l1s.tpu_ctrl_reg |= CTRL_MS; + l1s.dsp_ctrl_reg |= CTRL_MS; + } +} + +/*-------------------------------------------------------*/ +/* l1ps_update_read_set_parameters() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : Updating of the "Read_param" structure*/ +/* usefull in case the aset structure has been updated */ +/* before the last read of the current block */ +/*-------------------------------------------------------*/ +void l1ps_update_read_set_parameters(void) +{ + #define READ_PARAM l1ps.read_param + #define ASET l1pa_l1ps_com.transfer.aset + + // Copy of the "aset" parameters in the "read_param" structure +#if 0 /* FreeCalypso TCS211 reconstruction */ + READ_PARAM.dl_tn = l1a_l1s_com.dl_tn; +#endif + READ_PARAM.new_set = 0; + READ_PARAM.assignment_id = ASET->assignment_id; + READ_PARAM.allocated_tbf = ASET->allocated_tbf; + READ_PARAM.dl_tfi = ASET->dl_tbf_alloc.tfi; + READ_PARAM.ul_tfi = ASET->ul_tbf_alloc->tfi; + READ_PARAM.dl_pwr_ctl = ASET->dl_pwr_ctl; + READ_PARAM.pc_meas_chan = ASET->pc_meas_chan; + + // We need to know on which frequency band we work for LNA state processing + if (!l1pa_l1ps_com.transfer.aset->freq_param.chan_sel.h) + { + // Single frequency + READ_PARAM.radio_freq_for_lna = l1pa_l1ps_com.transfer.aset->freq_param.chan_sel.rf_channel.single_rf.radio_freq; + } + else + { + // Frequency hopping: all frequencies of the frequency list are on the same band + // We take the first frequency of the list + READ_PARAM.radio_freq_for_lna = l1pa_l1ps_com.transfer.aset->freq_param.freq_list.rf_chan_no.A[0]; + } +} +#endif