Merge remote-tracking branch 'origin/NR_UE_fix_T300_expiry' into integration_2024_w12
This commit is contained in:
+2
-2
@@ -440,7 +440,7 @@ static void UE_synch(void *arg) {
|
|||||||
uint64_t dl_carrier, ul_carrier;
|
uint64_t dl_carrier, ul_carrier;
|
||||||
nr_get_carrier_frequencies(UE, &dl_carrier, &ul_carrier);
|
nr_get_carrier_frequencies(UE, &dl_carrier, &ul_carrier);
|
||||||
nr_initial_sync_t ret = nr_initial_sync(&syncD->proc, UE, 2, get_softmodem_params()->sa);
|
nr_initial_sync_t ret = nr_initial_sync(&syncD->proc, UE, 2, get_softmodem_params()->sa);
|
||||||
if (!ret.cell_notdetected) {
|
if (ret.cell_detected) {
|
||||||
syncD->rx_offset = ret.rx_offset;
|
syncD->rx_offset = ret.rx_offset;
|
||||||
freq_offset = UE->common_vars.freq_offset; // frequency offset computed with pss in initial sync
|
freq_offset = UE->common_vars.freq_offset; // frequency offset computed with pss in initial sync
|
||||||
hw_slot_offset =
|
hw_slot_offset =
|
||||||
@@ -538,7 +538,7 @@ void processSlotTX(void *arg)
|
|||||||
{
|
{
|
||||||
nr_rxtx_thread_data_t *rxtxD = (nr_rxtx_thread_data_t *) arg;
|
nr_rxtx_thread_data_t *rxtxD = (nr_rxtx_thread_data_t *) arg;
|
||||||
const UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
const UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
||||||
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
||||||
nr_phy_data_tx_t phy_data = {0};
|
nr_phy_data_tx_t phy_data = {0};
|
||||||
|
|
||||||
if (UE->if_inst)
|
if (UE->if_inst)
|
||||||
|
|||||||
@@ -100,13 +100,12 @@ void free_list(NR_UE_SSB *node) {
|
|||||||
free(node);
|
free(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc,
|
static bool nr_pbch_detection(const UE_nr_rxtx_proc_t *proc,
|
||||||
PHY_VARS_NR_UE *ue,
|
PHY_VARS_NR_UE *ue,
|
||||||
int pbch_initial_symbol,
|
int pbch_initial_symbol,
|
||||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||||
{
|
{
|
||||||
NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||||
int ret =-1;
|
|
||||||
|
|
||||||
NR_UE_SSB *best_ssb = NULL;
|
NR_UE_SSB *best_ssb = NULL;
|
||||||
NR_UE_SSB *current_ssb;
|
NR_UE_SSB *current_ssb;
|
||||||
@@ -138,8 +137,9 @@ int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_UE_SSB *temp_ptr=best_ssb;
|
NR_UE_SSB *temp_ptr = best_ssb;
|
||||||
while (ret!=0 && temp_ptr != NULL) {
|
bool ret = false;
|
||||||
|
while (!ret && temp_ptr != NULL) {
|
||||||
|
|
||||||
start_meas(&ue->dlsch_channel_estimation_stats);
|
start_meas(&ue->dlsch_channel_estimation_stats);
|
||||||
// computing channel estimation for selected best ssb
|
// computing channel estimation for selected best ssb
|
||||||
@@ -153,11 +153,18 @@ int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc,
|
|||||||
|
|
||||||
stop_meas(&ue->dlsch_channel_estimation_stats);
|
stop_meas(&ue->dlsch_channel_estimation_stats);
|
||||||
fapiPbch_t result = {0};
|
fapiPbch_t result = {0};
|
||||||
ret = nr_rx_pbch(ue, proc, estimateSz, dl_ch_estimates, frame_parms, temp_ptr->i_ssb, &result, rxdataF);
|
|
||||||
|
|
||||||
if (DUMP_PBCH_CH_ESTIMATES && (ret == 0)) {
|
int pbch_res = nr_rx_pbch(ue, proc, estimateSz, dl_ch_estimates, frame_parms, temp_ptr->i_ssb, &result, rxdataF);
|
||||||
|
ret = pbch_res == 0;
|
||||||
|
|
||||||
|
if (DUMP_PBCH_CH_ESTIMATES && ret) {
|
||||||
write_output("pbch_ch_estimates.m", "pbch_ch_estimates", dl_ch_estimates, frame_parms->nb_antennas_rx*estimateSz, 1, 1);
|
write_output("pbch_ch_estimates.m", "pbch_ch_estimates", dl_ch_estimates, frame_parms->nb_antennas_rx*estimateSz, 1, 1);
|
||||||
write_output("pbch_ch_estimates_time.m", "pbch_ch_estimates_time", dl_ch_estimates_time, frame_parms->nb_antennas_rx*frame_parms->ofdm_symbol_size, 1, 1);
|
write_output("pbch_ch_estimates_time.m",
|
||||||
|
"pbch_ch_estimates_time",
|
||||||
|
dl_ch_estimates_time,
|
||||||
|
frame_parms->nb_antennas_rx * frame_parms->ofdm_symbol_size,
|
||||||
|
1,
|
||||||
|
1);
|
||||||
}
|
}
|
||||||
|
|
||||||
temp_ptr=temp_ptr->next_ssb;
|
temp_ptr=temp_ptr->next_ssb;
|
||||||
@@ -165,14 +172,10 @@ int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc,
|
|||||||
|
|
||||||
free_list(best_ssb);
|
free_list(best_ssb);
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret) {
|
||||||
frame_parms->nb_antenna_ports_gNB = 1; // pbch_tx_ant;
|
frame_parms->nb_antenna_ports_gNB = 1; // pbch_tx_ant;
|
||||||
|
LOG_I(PHY, "[UE%d] Initial sync: pbch decoded sucessfully, ssb index %d\n", ue->Mod_id, frame_parms->ssb_index);
|
||||||
// set initial transmission mode to 1 or 2 depending on number of detected TX antennas
|
}
|
||||||
// frame_parms->mode1_flag = (pbch_tx_ant==1);
|
|
||||||
// openair_daq_vars.dlsch_transmission_mode = (pbch_tx_ant>1) ? 2 : 1;
|
|
||||||
|
|
||||||
LOG_I(PHY, "[UE%d] Initial sync: pbch decoded sucessfully, ssb index %d\n", ue->Mod_id, frame_parms->ssb_index);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,7 +265,7 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i
|
|||||||
|
|
||||||
int freq_offset_sss = 0;
|
int freq_offset_sss = 0;
|
||||||
bool ret_sss = rx_sss_nr(ue, proc, &metric_tdd_ncp, &phase_tdd_ncp, &freq_offset_sss, rxdataF);
|
bool ret_sss = rx_sss_nr(ue, proc, &metric_tdd_ncp, &phase_tdd_ncp, &freq_offset_sss, rxdataF);
|
||||||
ret.cell_notdetected = !ret_sss; // rx_sss_nr returns true if success
|
ret.cell_detected = ret_sss; // rx_sss_nr returns true if success
|
||||||
// digital compensation of FFO for SSB symbols
|
// digital compensation of FFO for SSB symbols
|
||||||
if (ue->UE_fo_compensation) {
|
if (ue->UE_fo_compensation) {
|
||||||
double s_time = 1 / (1.0e3 * fp->samples_per_subframe); // sampling time
|
double s_time = 1 / (1.0e3 * fp->samples_per_subframe); // sampling time
|
||||||
@@ -282,12 +285,12 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i
|
|||||||
ue->common_vars.freq_offset += freq_offset_sss;
|
ue->common_vars.freq_offset += freq_offset_sss;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret.cell_notdetected == 0) { // we got sss channel
|
if (ret.cell_detected) { // we got sss channel
|
||||||
nr_gold_pbch(ue);
|
nr_gold_pbch(ue);
|
||||||
ret.cell_notdetected = nr_pbch_detection(proc, ue, 1, rxdataF); // start pbch detection at first symbol after pss
|
ret.cell_detected = nr_pbch_detection(proc, ue, 1, rxdataF); // start pbch detection at first symbol after pss
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret.cell_notdetected == 0) {
|
if (ret.cell_detected) {
|
||||||
// sync at symbol ue->symbol_offset
|
// sync at symbol ue->symbol_offset
|
||||||
// computing the offset wrt the beginning of the frame
|
// computing the offset wrt the beginning of the frame
|
||||||
int mu = fp->numerology_index;
|
int mu = fp->numerology_index;
|
||||||
@@ -347,7 +350,7 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i
|
|||||||
fp->Nid_cell,
|
fp->Nid_cell,
|
||||||
metric_tdd_ncp,
|
metric_tdd_ncp,
|
||||||
phase_tdd_ncp,
|
phase_tdd_ncp,
|
||||||
!ret.cell_notdetected,
|
ret.cell_detected,
|
||||||
ret.rx_offset);
|
ret.rx_offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -356,11 +359,11 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i
|
|||||||
LOG_I(PHY, "TDD Normal prefix: SSS error condition: sync_pos %d\n", sync_pos);
|
LOG_I(PHY, "TDD Normal prefix: SSS error condition: sync_pos %d\n", sync_pos);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (ret.cell_notdetected == 0)
|
if (ret.cell_detected)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret.cell_notdetected = true;
|
ret.cell_detected = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Consider this is a false detection if the offset is > 1000 Hz
|
/* Consider this is a false detection if the offset is > 1000 Hz
|
||||||
@@ -371,7 +374,7 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i
|
|||||||
LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
if (ret.cell_notdetected == 0) { // PBCH found so indicate sync to higher layers and configure frame parameters
|
if (ret.cell_detected) { // PBCH found so indicate sync to higher layers and configure frame parameters
|
||||||
|
|
||||||
//#ifdef DEBUG_INITIAL_SYNCH
|
//#ifdef DEBUG_INITIAL_SYNCH
|
||||||
|
|
||||||
@@ -406,7 +409,7 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
// gain control
|
// gain control
|
||||||
if (ret.cell_notdetected != 0) { // we are not synched, so we cannot use rssi measurement (which is based on channel estimates)
|
if (!ret.cell_detected) { // we are not synched, so we cannot use rssi measurement (which is based on channel estimates)
|
||||||
int rx_power = 0;
|
int rx_power = 0;
|
||||||
|
|
||||||
// do a measurement on the best guess of the PSS
|
// do a measurement on the best guess of the PSS
|
||||||
@@ -429,6 +432,8 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i
|
|||||||
#ifdef DEBUG_INITIAL_SYNCH
|
#ifdef DEBUG_INITIAL_SYNCH
|
||||||
LOG_I(PHY, "[UE%d] Initial sync : Estimated power: %d dB\n", ue->Mod_id, ue->measurements.rx_power_avg_dB[0]);
|
LOG_I(PHY, "[UE%d] Initial sync : Estimated power: %d dB\n", ue->Mod_id, ue->measurements.rx_power_avg_dB[0]);
|
||||||
#endif
|
#endif
|
||||||
|
} else {
|
||||||
|
LOG_A(PHY, "Initial sync successful\n");
|
||||||
}
|
}
|
||||||
// exit_fun("debug exit");
|
// exit_fun("debug exit");
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INITIAL_UE_SYNC, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INITIAL_UE_SYNC, VCD_FUNCTION_OUT);
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ int dump_ue_stats(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
@param sa current running mode
|
@param sa current running mode
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool cell_notdetected;
|
bool cell_detected;
|
||||||
int rx_offset;
|
int rx_offset;
|
||||||
} nr_initial_sync_t;
|
} nr_initial_sync_t;
|
||||||
nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *phy_vars_ue, int n_frames, int sa);
|
nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *phy_vars_ue, int n_frames, int sa);
|
||||||
|
|||||||
@@ -766,10 +766,10 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
if (UE->is_synchronized == 0) {
|
if (UE->is_synchronized == 0) {
|
||||||
UE_nr_rxtx_proc_t proc={0};
|
UE_nr_rxtx_proc_t proc={0};
|
||||||
nr_initial_sync_t ret = nr_initial_sync(&proc, UE, 1, 0);
|
nr_initial_sync_t ret = nr_initial_sync(&proc, UE, 1, 0);
|
||||||
printf("nr_initial_sync1 returns %d\n", ret.cell_notdetected);
|
printf("nr_initial_sync1 returns %s\n", ret.cell_detected ? "cell detected" : "cell not detected");
|
||||||
if (ret.cell_notdetected)
|
if (!ret.cell_detected)
|
||||||
n_errors++;
|
n_errors++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
UE_nr_rxtx_proc_t proc={0};
|
UE_nr_rxtx_proc_t proc={0};
|
||||||
|
|||||||
@@ -1358,7 +1358,6 @@ void nr_rrc_mac_config_req_reset(module_id_t module_id,
|
|||||||
NR_UE_MAC_reset_cause_t cause)
|
NR_UE_MAC_reset_cause_t cause)
|
||||||
{
|
{
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
|
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
|
||||||
|
|
||||||
switch (cause) {
|
switch (cause) {
|
||||||
case GO_TO_IDLE:
|
case GO_TO_IDLE:
|
||||||
reset_ra(&mac->ra);
|
reset_ra(&mac->ra);
|
||||||
|
|||||||
@@ -86,26 +86,26 @@ void init_RA(NR_UE_MAC_INST_t *mac,
|
|||||||
|
|
||||||
if (rach_ConfigDedicated) {
|
if (rach_ConfigDedicated) {
|
||||||
if (rach_ConfigDedicated->cfra){
|
if (rach_ConfigDedicated->cfra){
|
||||||
LOG_I(MAC, "Initialization of 2-step contention-free random access procedure\n");
|
LOG_I(NR_MAC, "Initialization of 2-step contention-free random access procedure\n");
|
||||||
prach_resources->RA_TYPE = RA_2STEP;
|
prach_resources->RA_TYPE = RA_2STEP;
|
||||||
ra->cfra = 1;
|
ra->cfra = 1;
|
||||||
} else if (rach_ConfigDedicated->ext1){
|
} else if (rach_ConfigDedicated->ext1){
|
||||||
if (rach_ConfigDedicated->ext1->cfra_TwoStep_r16){
|
if (rach_ConfigDedicated->ext1->cfra_TwoStep_r16){
|
||||||
LOG_I(MAC, "Setting RA type to 2-step...\n");
|
LOG_I(NR_MAC, "Setting RA type to 2-step...\n");
|
||||||
prach_resources->RA_TYPE = RA_2STEP;
|
prach_resources->RA_TYPE = RA_2STEP;
|
||||||
ra->cfra = 1;
|
ra->cfra = 1;
|
||||||
} else {
|
} else {
|
||||||
LOG_E(MAC, "Config not handled\n");
|
LOG_E(NR_MAC, "Config not handled\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_E(MAC, "Config not handled\n");
|
LOG_E(NR_MAC, "Config not handled\n");
|
||||||
}
|
}
|
||||||
} else if (nr_rach_ConfigCommon){
|
} else if (nr_rach_ConfigCommon){
|
||||||
LOG_I(MAC, "Initialization of 4-step contention-based random access procedure\n");
|
LOG_I(NR_MAC, "Initialization of 4-step contention-based random access procedure\n");
|
||||||
prach_resources->RA_TYPE = RA_4STEP;
|
prach_resources->RA_TYPE = RA_4STEP;
|
||||||
ra->cfra = 0;
|
ra->cfra = 0;
|
||||||
} else {
|
} else {
|
||||||
LOG_E(MAC, "Config not handled\n");
|
LOG_E(NR_MAC, "Config not handled\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (rach_ConfigGeneric->powerRampingStep){ // in dB
|
switch (rach_ConfigGeneric->powerRampingStep){ // in dB
|
||||||
|
|||||||
@@ -41,10 +41,8 @@
|
|||||||
|
|
||||||
#include <asn_application.h>
|
#include <asn_application.h>
|
||||||
|
|
||||||
#include "RRC/NR/nr_rrc_defs.h"
|
|
||||||
#include "RRC/NR/nr_rrc_config.h"
|
#include "RRC/NR/nr_rrc_config.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The variant of the above function which dumps the BASIC-XER (XER_F_BASIC)
|
* The variant of the above function which dumps the BASIC-XER (XER_F_BASIC)
|
||||||
* output into the chosen string buffer.
|
* output into the chosen string buffer.
|
||||||
|
|||||||
@@ -616,7 +616,7 @@ static void nr_rrc_handle_msg3_indication(NR_UE_RRC_INST_t *rrc, rnti_t rnti)
|
|||||||
{
|
{
|
||||||
NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants;
|
NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants;
|
||||||
switch (rrc->ra_trigger) {
|
switch (rrc->ra_trigger) {
|
||||||
case INITIAL_ACCESS_FROM_RRC_IDLE:
|
case RRC_CONNECTION_SETUP:
|
||||||
// After SIB1 is received, prepare RRCConnectionRequest
|
// After SIB1 is received, prepare RRCConnectionRequest
|
||||||
rrc->rnti = rnti;
|
rrc->rnti = rnti;
|
||||||
// start timer T300
|
// start timer T300
|
||||||
@@ -744,7 +744,7 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(NR_UE_RRC_INST_t *rrc,
|
|||||||
LOG_A(NR_RRC, "SIB1 decoded\n");
|
LOG_A(NR_RRC, "SIB1 decoded\n");
|
||||||
nr_timer_start(&SI_info->sib1_timer);
|
nr_timer_start(&SI_info->sib1_timer);
|
||||||
if (rrc->nrRrcState == RRC_STATE_IDLE_NR) {
|
if (rrc->nrRrcState == RRC_STATE_IDLE_NR) {
|
||||||
rrc->ra_trigger = INITIAL_ACCESS_FROM_RRC_IDLE;
|
rrc->ra_trigger = RRC_CONNECTION_SETUP;
|
||||||
// preparing RRC setup request payload in advance
|
// preparing RRC setup request payload in advance
|
||||||
nr_rrc_ue_prepare_RRCSetupRequest(rrc);
|
nr_rrc_ue_prepare_RRCSetupRequest(rrc);
|
||||||
}
|
}
|
||||||
@@ -2221,6 +2221,9 @@ void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc,
|
|||||||
|
|
||||||
void handle_t300_expiry(NR_UE_RRC_INST_t *rrc)
|
void handle_t300_expiry(NR_UE_RRC_INST_t *rrc)
|
||||||
{
|
{
|
||||||
|
rrc->ra_trigger = RRC_CONNECTION_SETUP;
|
||||||
|
nr_rrc_ue_prepare_RRCSetupRequest(rrc);
|
||||||
|
|
||||||
// reset MAC, release the MAC configuration
|
// reset MAC, release the MAC configuration
|
||||||
NR_UE_MAC_reset_cause_t cause = T300_EXPIRY;
|
NR_UE_MAC_reset_cause_t cause = T300_EXPIRY;
|
||||||
nr_rrc_mac_config_req_reset(rrc->ue_id, cause);
|
nr_rrc_mac_config_req_reset(rrc->ue_id, cause);
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ typedef enum requested_SI_List_e {
|
|||||||
// 3GPP TS 38.300 Section 9.2.6
|
// 3GPP TS 38.300 Section 9.2.6
|
||||||
typedef enum RA_trigger_e {
|
typedef enum RA_trigger_e {
|
||||||
RA_NOT_RUNNING,
|
RA_NOT_RUNNING,
|
||||||
INITIAL_ACCESS_FROM_RRC_IDLE,
|
RRC_CONNECTION_SETUP,
|
||||||
RRC_CONNECTION_REESTABLISHMENT,
|
RRC_CONNECTION_REESTABLISHMENT,
|
||||||
DURING_HANDOVER,
|
DURING_HANDOVER,
|
||||||
NON_SYNCHRONISED,
|
NON_SYNCHRONISED,
|
||||||
|
|||||||
Reference in New Issue
Block a user