FreeCalypso > hg > fc-magnetite
diff src/cs/layer1/p_cfile/l1p_afun.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_afun.c Tue Oct 31 03:42:35 2017 +0000 @@ -0,0 +1,404 @@ +/************* Revision Controle System Header ************* + * GSM Layer 1 software + * L1P_AFUN.C + * + * Filename l1p_afun.c + * Copyright 2003 (C) Texas Instruments + * + ************* Revision Controle System Header *************/ + +#define L1P_AFUN_C + +#include "l1_macro.h" +#include "l1_confg.h" + +#if L1_GPRS + +#if (CODE_VERSION == SIMULATION) + #include <string.h> + #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 "cust_os.h" + #include "l1_varex.h" + #include "l1p_cons.h" + #include "l1p_msgt.h" + #include "l1p_deft.h" + #include "l1p_vare.h" + + #include "l1_msgty.h" + #include "l1_proto.h" + +#else + + #include <string.h> + #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 "cust_os.h" + #include "l1_varex.h" + #include "l1p_cons.h" + #include "l1p_msgt.h" + #include "l1p_deft.h" + #include "l1p_vare.h" + + #include "l1_msgty.h" + #include "l1_proto.h" + +#endif + +// Internal prototypes +T_TRANSFER_SET *l1pa_get_free_transfer_set (UWORD8 new_tbf); +int l1pa_sort (const void *a, const void *b); +void l1pa_reset_cr_freq_list (); +T_CRES_LIST_PARAM *l1pa_get_free_cres_list_set(); +void l1pa_send_int_meas_report (UWORD32 SignalCode, + T_L1P_ITMEAS_IND *last_l1s_msg, + T_L1A_INT_MEAS_PARAM *first_meas_ptr); +void l1pa_send_confirmation (UWORD32 SignalCode, UWORD8 id); + +/*-------------------------------------------------------*/ +/* l1pa_get_free_transfer_set() */ +/*-------------------------------------------------------*/ +/* */ +/* Description: */ +/* ------------ */ +/* */ +/* Modified parameters from globals: */ +/* --------------------------------- */ +/* */ +/*-------------------------------------------------------*/ +T_TRANSFER_SET *l1pa_get_free_transfer_set(UWORD8 new_tbf) +{ + T_TRANSFER_SET *transfer_set; + + #define clear_and_new(i, tbf) \ + switch(tbf) \ + { \ + case UL_TBF: \ + l1pa_l1ps_com.transfer.fset[i]->allocated_tbf = DL_TBF; \ + break; \ + \ + case DL_TBF: \ + l1pa_l1ps_com.transfer.fset[i]->allocated_tbf = UL_TBF; \ + break; \ + } + + // If new_tbf is to replace an existing one, we must return + // the considered free set. + if(new_tbf == BOTH_TBF) + { + if(l1pa_l1ps_com.transfer.fset[0]->allocated_tbf == NO_TBF) + transfer_set = l1pa_l1ps_com.transfer.fset[1]; + else + transfer_set = l1pa_l1ps_com.transfer.fset[0]; + } + else + if(l1pa_l1ps_com.transfer.fset[0]->allocated_tbf == new_tbf) + transfer_set = l1pa_l1ps_com.transfer.fset[0]; + else + if(l1pa_l1ps_com.transfer.fset[1]->allocated_tbf == new_tbf) + transfer_set = l1pa_l1ps_com.transfer.fset[1]; + else + if(l1pa_l1ps_com.transfer.fset[0]->allocated_tbf == BOTH_TBF) + { + clear_and_new(0, new_tbf); + transfer_set = l1pa_l1ps_com.transfer.fset[1]; + } + else + if(l1pa_l1ps_com.transfer.fset[1]->allocated_tbf == BOTH_TBF) + { + clear_and_new(1, new_tbf); + transfer_set = l1pa_l1ps_com.transfer.fset[0]; + } + else + if(l1pa_l1ps_com.transfer.fset[0]->allocated_tbf == NO_TBF) + transfer_set = l1pa_l1ps_com.transfer.fset[0]; + else + transfer_set = l1pa_l1ps_com.transfer.fset[1]; + + transfer_set->SignalCode = NULL; + transfer_set->dl_tbf_synchro_timeslot = 0; + transfer_set->ul_tbf_synchro_timeslot = 0; + transfer_set->transfer_synchro_timeslot = 0; + + // No init of "allocated_tbf" + + transfer_set->assignment_command = NO_TBF; + transfer_set->multislot_class = 0; + transfer_set->packet_ta.ta = 255; // Not present + transfer_set->packet_ta.ta_index = 255; // Not present + transfer_set->packet_ta.ta_tn = 255; // Not present + transfer_set->tsc = 0; + + transfer_set->freq_param.chan_sel.h = 0; + transfer_set->freq_param.chan_sel.rf_channel.single_rf.radio_freq = 0; + transfer_set->freq_param.chan_sel.rf_channel.hopping_rf.maio = 0; + transfer_set->freq_param.chan_sel.rf_channel.hopping_rf.hsn = 0; + transfer_set->freq_param.freq_list.rf_chan_cnt = 0; + + transfer_set->tbf_sti.present = FALSE; + + transfer_set->dl_pwr_ctl.p0 = 255; + transfer_set->dl_pwr_ctl.bts_pwr_ctl_mode = 0; + transfer_set->dl_pwr_ctl.pr_mode = 0; + + transfer_set->ts_override = 0; + transfer_set->pc_meas_chan = 0; + + // No init of "ul_tbf_alloc" and "ul_tbf_alloc", mac_mode is enought + + return(transfer_set); +} + +/*-------------------------------------------------------*/ +/* l1pa_sort() */ +/*-------------------------------------------------------*/ +/* */ +/* Description: */ +/* ------------ */ +/* */ +/* Modified parameters from globals: */ +/* --------------------------------- */ +/* */ +/*-------------------------------------------------------*/ +int l1pa_sort(const void *a, const void *b) +{ + UWORD8 entry1, entry2; + + entry1 = *((UWORD8*) a); + entry2 = *((UWORD8*) b); + + if (entry1 < entry2 ) + return(-1); + else if (entry1 == entry2) + return(0); + else + return(1); +} + +/*-------------------------------------------------------*/ +/* l1pa_reset_cr_freq_list() */ +/*-------------------------------------------------------*/ +/* */ +/* Description: */ +/* ------------ */ +/* This function resets parameters used in Frequency */ +/* list task */ +/* */ +/*-------------------------------------------------------*/ +void l1pa_reset_cr_freq_list() +{ + UWORD8 i; + + for(i=0; i<NB_MEAS_MAX_GPRS; i++) + { + l1pa_l1ps_com.cr_freq_list.used_il_lna [i].il = l1_config.params.il_min; // IL used in CTRL phase for AGC setting. + l1pa_l1ps_com.cr_freq_list.used_il_lna_d [i].il = l1_config.params.il_min; // ... 1 frame delay. + l1pa_l1ps_com.cr_freq_list.used_il_lna_dd[i].il = l1_config.params.il_min; // ... 2 frames delay, used in READ phase. + + l1pa_l1ps_com.cr_freq_list.used_il_lna [i].lna = FALSE; // LNA used in CTRL phase for AGC setting. + l1pa_l1ps_com.cr_freq_list.used_il_lna_d [i].lna = FALSE; // ... 1 frame delay. + l1pa_l1ps_com.cr_freq_list.used_il_lna_dd[i].lna = FALSE; // ... 2 frames delay, used in READ phase. + } + + // Initialize next power measurement control. + l1pa_l1ps_com.cr_freq_list.next_to_ctrl = 0; + + // Initialize next power measurement result. + l1pa_l1ps_com.cr_freq_list.next_to_read = 0; + + // Reset PPCH burst ctrl indication + l1pa_l1ps_com.cr_freq_list.pnp_ctrl = 0; + +} + +/*-------------------------------------------------------*/ +/* l1pa_get_free_cres_list_set() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +T_CRES_LIST_PARAM *l1pa_get_free_cres_list_set() +{ + T_CRES_LIST_PARAM *flist; + + // Get free set pointer. + if(l1pa_l1ps_com.cres_freq_list.alist == &(l1pa_l1ps_com.cres_freq_list.list[0])) + flist = &(l1pa_l1ps_com.cres_freq_list.list[1]); + else + flist = &(l1pa_l1ps_com.cres_freq_list.list[0]); + + // Clear free set. + flist->nb_carrier = 0; + flist->list_id = 0; + + // Reset fifo used in AGC algo => NEED MORE INVESTIGATION. + + + return(flist); +} + +/*-------------------------------------------------------*/ +/* l1pa_send_int_meas_report() */ +/*-------------------------------------------------------*/ +/* */ +/* Description: */ +/* ------------ */ +/* This function builds and sends the Interf. Meas. */ +/* report to L3 */ +/* */ +/*-------------------------------------------------------*/ +void l1pa_send_int_meas_report(UWORD32 SignalCode, + T_L1P_ITMEAS_IND *last_l1s_msg, + T_L1A_INT_MEAS_PARAM *first_meas_ptr) +{ + xSignalHeaderRec *msg; + UWORD8 i,j,k; + UWORD8 bit_mask = 0x80; + + // Allocate report msg and fill signal code. + msg = os_alloc_sig(sizeof(T_MPHP_INT_MEAS_IND)); + DEBUGMSG(status,NU_ALLOC_ERR) + msg->SignalCode = SignalCode; + + // Save measurement results + //------------------------- + for(i = 0, j = 0, k = 0; i < 8; i++, bit_mask >>= 1) + { + // Fill 1st measurement report + //---------------------------- + // If a measurement was done on timeslot i + if(first_meas_ptr->meas_bitmap & bit_mask) + { + // The result is stored in the msg. + ((T_MPHP_INT_MEAS_IND *) (msg->SigP))->int_meas[i].rxlev[0] = first_meas_ptr->rxlev[j]; + + // Next measurement value + j++; + } + else + { + // No measurement processed on timeslot i (0x80 value) + ((T_MPHP_INT_MEAS_IND *) (msg->SigP))->int_meas[i].rxlev[0] = (WORD8)NO_MEAS; //omaps00090550 + } + + // Fill 2nd measurement report + //---------------------------- + // If a measurement was done on timeslot i + if(last_l1s_msg->meas_bitmap & bit_mask) + { + // The result is stored in the msg. + ((T_MPHP_INT_MEAS_IND *) (msg->SigP))->int_meas[i].rxlev[1] = last_l1s_msg->rxlev[k]; + + // Next measurement value + k++; + } + else + { + // No measurement processed on timeslot i (0x80 value) + ((T_MPHP_INT_MEAS_IND *) (msg->SigP))->int_meas[i].rxlev[1] = (WORD8)NO_MEAS; + } + } + + // Set ID in the report message + ((T_MPHP_INT_MEAS_IND *) (msg->SigP))->id = first_meas_ptr->id; + + #if (TRACE_TYPE==1) || (TRACE_TYPE==4) + l1_trace_message(msg); + #endif + + os_send_sig(msg, GRRM1_QUEUE); + DEBUGMSG(status,NU_SEND_QUEUE_ERR) +} + +/*-------------------------------------------------------*/ +/* l1pa_send_confirmation() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +void l1pa_send_confirmation(UWORD32 SignalCode, UWORD8 id) +{ + xSignalHeaderRec *msg_con; + + msg_con = os_alloc_sig(sizeof(T_MPHP_ASSIGNMENT_CON)); + DEBUGMSG(status,NU_ALLOC_ERR) + msg_con->SignalCode = SignalCode; + + ((T_MPHP_ASSIGNMENT_CON *) msg_con->SigP)->assignment_id = id; + + #if (TRACE_TYPE==1) || (TRACE_TYPE==4) + l1_trace_message(msg_con); + #endif + + os_send_sig(msg_con, GRRM1_QUEUE); + DEBUGMSG(status,NU_SEND_QUEUE_ERR) +} + + +/*-------------------------------------------------------*/ +/* l1pa_send_tbf_release_con() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +void l1pa_send_tbf_release_con(UWORD32 SignalCode, UWORD8 tbf_type) +{ + xSignalHeaderRec *conf_msg; + + // Send the confirmation message with the TBF type to L3 + // Allocate confirmation message... + conf_msg = os_alloc_sig( sizeof(T_MPHP_TBF_RELEASE_CON)); + DEBUGMSG(status,NU_ALLOC_ERR); + + //Fill the message + conf_msg->SignalCode = SignalCode; + ((T_MPHP_TBF_RELEASE_CON *)(conf_msg->SigP))->tbf_type = tbf_type; + + // Send the confirmation message... + os_send_sig(conf_msg, GRRM1_QUEUE); + DEBUGMSG(status,NU_SEND_QUEUE_ERR) +} +#endif //L1_GPRS