FreeCalypso > hg > fc-magnetite
view src/cs/layer1/p_cfile/l1p_func.c @ 636:57e67ca2e1cb
pcmdata.c: default +CGMI to "FreeCalypso" and +CGMM to model
The present change has no effect whatsoever on Falconia-made and Openmoko-made
devices on which /pcm/CGMI and /pcm/CGMM files have been programmed in FFS
with sensible ID strings by the respective factories, but what should AT+CGMI
and AT+CGMM queries return when the device is a Huawei GTM900 or Tango modem
that has been converted to FreeCalypso with a firmware change? Before the
present change they would return compiled-in defaults of "<manufacturer>" and
"<model>", respectively; with the present change the firmware will self-identify
as "FreeCalypso GTM900-FC" or "FreeCalypso Tango" on the two respective targets.
This firmware identification will become important if someone incorporates an
FC-converted GTM900 or Tango modem into a ZeroPhone-style smartphone where some
high-level software like ofono will be talking to the modem and will need to
properly identify this modem as FreeCalypso, as opposed to some other AT command
modem flavor with different quirks.
In technical terms, the compiled-in default for the AT+CGMI query (which will
always be overridden by the /pcm/CGMI file in FFS if one is present) is now
"FreeCalypso" in all configs on all targets; the compiled-in default for the
AT+CGMM query (likewise always overridden by /pcm/CGMM if present) is
"GTM900-FC" if CONFIG_TARGET_GTM900 or "Tango" if CONFIG_TARGET_TANGO or the
original default of "<model>" otherwise.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 19 Jan 2020 20:14:58 +0000 |
| parents | 0740b5ff15f6 |
| children |
line wrap: on
line source
/************* 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
