Merge remote-tracking branch 'origin/develop' into Fix_harq_value_scf
This commit is contained in:
@@ -30,14 +30,6 @@
|
||||
|
||||
#include <stdint.h> // for uint8/16/32_t
|
||||
|
||||
/* check if this ifndef is required for NB-IoT ?!
|
||||
//#ifndef NO_OPENAIR1
|
||||
//#include "PHY/defs_NB_IoT.h"
|
||||
//#else
|
||||
//#include "PHY/TOOLS/time_meas.h"
|
||||
//#endif
|
||||
*/
|
||||
|
||||
#define CRC24_A_NB_IoT 0
|
||||
#define CRC24_B_NB_IoT 1
|
||||
#define CRC16_NB_IoT 2
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include <stdlib.h>
|
||||
#include "nrLDPC_types.h"
|
||||
|
||||
#ifndef malloc32_clear
|
||||
/**
|
||||
\brief Allocates 32 byte aligned memory and initializes to zero
|
||||
\param size Input size in bytes
|
||||
@@ -46,7 +45,6 @@ static inline void* malloc32_clear(size_t size)
|
||||
memset(ptr, 0, size);
|
||||
return ptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief Allocates and initializes the internal decoder processing buffers
|
||||
|
||||
@@ -27,6 +27,58 @@
|
||||
uint32_t nr_subcarrier_spacing[MAX_NUM_SUBCARRIER_SPACING] = {15e3, 30e3, 60e3, 120e3, 240e3};
|
||||
uint16_t nr_slots_per_subframe[MAX_NUM_SUBCARRIER_SPACING] = {1, 2, 4, 8, 16};
|
||||
|
||||
// Table 5.4.3.3-1 38-101
|
||||
int nr_ssb_table[48][3] = {
|
||||
{1, 15, nr_ssb_type_A},
|
||||
{2, 15, nr_ssb_type_A},
|
||||
{3, 15, nr_ssb_type_A},
|
||||
{5, 15, nr_ssb_type_A},
|
||||
{5, 30, nr_ssb_type_B},
|
||||
{7, 15, nr_ssb_type_A},
|
||||
{8, 15, nr_ssb_type_A},
|
||||
{12, 15, nr_ssb_type_A},
|
||||
{14, 15, nr_ssb_type_A},
|
||||
{18, 15, nr_ssb_type_A},
|
||||
{20, 15, nr_ssb_type_A},
|
||||
{25, 15, nr_ssb_type_A},
|
||||
{26, 15, nr_ssb_type_A},
|
||||
{28, 15, nr_ssb_type_A},
|
||||
{29, 15, nr_ssb_type_A},
|
||||
{30, 15, nr_ssb_type_A},
|
||||
{34, 15, nr_ssb_type_A},
|
||||
{34, 30, nr_ssb_type_C},
|
||||
{38, 15, nr_ssb_type_A},
|
||||
{38, 30, nr_ssb_type_C},
|
||||
{39, 15, nr_ssb_type_A},
|
||||
{39, 30, nr_ssb_type_C},
|
||||
{40, 30, nr_ssb_type_C},
|
||||
{41, 15, nr_ssb_type_A},
|
||||
{41, 30, nr_ssb_type_C},
|
||||
{46, 30, nr_ssb_type_C},
|
||||
{48, 30, nr_ssb_type_C},
|
||||
{50, 30, nr_ssb_type_C},
|
||||
{51, 15, nr_ssb_type_A},
|
||||
{53, 15, nr_ssb_type_A},
|
||||
{65, 15, nr_ssb_type_A},
|
||||
{66, 15, nr_ssb_type_A},
|
||||
{66, 30, nr_ssb_type_B},
|
||||
{70, 15, nr_ssb_type_A},
|
||||
{71, 15, nr_ssb_type_A},
|
||||
{74, 15, nr_ssb_type_A},
|
||||
{75, 15, nr_ssb_type_A},
|
||||
{76, 15, nr_ssb_type_A},
|
||||
{77, 30, nr_ssb_type_C},
|
||||
{78, 30, nr_ssb_type_C},
|
||||
{79, 30, nr_ssb_type_C},
|
||||
{90, 15, nr_ssb_type_A},
|
||||
{90, 30, nr_ssb_type_C},
|
||||
{91, 15, nr_ssb_type_A},
|
||||
{92, 15, nr_ssb_type_A},
|
||||
{93, 15, nr_ssb_type_A},
|
||||
{94, 15, nr_ssb_type_A},
|
||||
{96, 30, nr_ssb_type_C}
|
||||
};
|
||||
|
||||
|
||||
void set_Lmax(NR_DL_FRAME_PARMS *fp) {
|
||||
// definition of Lmax according to ts 38.213 section 4.1
|
||||
@@ -85,27 +137,28 @@ int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp,uint8_t i_ssb) {
|
||||
|
||||
void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, int N_RB_DL)
|
||||
{
|
||||
int idx = 0;
|
||||
switch(mu) {
|
||||
|
||||
case NR_MU_0: //15kHz scs
|
||||
fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_0];
|
||||
fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_0];
|
||||
fp->ssb_type = nr_ssb_type_A;
|
||||
while(nr_ssb_table[idx][0]!=fp->nr_band)
|
||||
idx++;
|
||||
AssertFatal(nr_ssb_table[idx][1]==15,"SCS %d not applicable to band %d\n",
|
||||
fp->subcarrier_spacing,fp->nr_band);
|
||||
break;
|
||||
|
||||
case NR_MU_1: //30kHz scs
|
||||
fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_1];
|
||||
fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_1];
|
||||
|
||||
// selection of SS block pattern according to TS 38101-1 Table 5.4.3.3-1 for SCS 30kHz
|
||||
if (fp->nr_band == 5 || fp->nr_band == 66)
|
||||
fp->ssb_type = nr_ssb_type_B;
|
||||
else{
|
||||
if (fp->nr_band == 41 || fp->nr_band == 38 || ( fp->nr_band > 76 && fp->nr_band < 80) )
|
||||
fp->ssb_type = nr_ssb_type_C;
|
||||
else
|
||||
AssertFatal(1==0,"NR Operating Band n%d not available for SS block SCS with mu=%d\n", fp->nr_band, mu);
|
||||
while(nr_ssb_table[idx][0]!=fp->nr_band ||
|
||||
nr_ssb_table[idx][1]!=30) {
|
||||
AssertFatal(nr_ssb_table[idx][0]<=fp->nr_band,"SCS %d not applicable to band %d\n",
|
||||
fp->subcarrier_spacing,fp->nr_band);
|
||||
idx++;
|
||||
}
|
||||
fp->ssb_type = nr_ssb_table[idx][2];
|
||||
break;
|
||||
|
||||
case NR_MU_2: //60kHz scs
|
||||
|
||||
@@ -50,8 +50,6 @@
|
||||
//#define DEBUG_DCI_DECODING 1
|
||||
//#define DEBUG_PHY
|
||||
|
||||
//#undef ALL_AGGREGATION
|
||||
|
||||
//extern uint16_t phich_reg[MAX_NUM_PHICH_GROUPS][3];
|
||||
//extern uint16_t pcfich_reg[4];
|
||||
|
||||
|
||||
@@ -32,11 +32,8 @@
|
||||
#ifndef __DCI_NB_IOT_H__
|
||||
#define __DCI_NB_IOT_H__
|
||||
|
||||
//#ifndef USER_MODE
|
||||
//#include "PHY/types.h"
|
||||
//#else
|
||||
#include <stdint.h>
|
||||
//#endif
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
||||
@@ -36,10 +36,8 @@
|
||||
#include "PHY/extern.h"
|
||||
#include "SCHED/extern.h"
|
||||
|
||||
#ifdef OPENAIR2
|
||||
#include "openair2/LAYER2/MAC/proto.h"
|
||||
#include "openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
|
||||
#endif
|
||||
|
||||
extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index);
|
||||
|
||||
@@ -434,10 +432,8 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char *buffer, int length
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef OPENAIR2
|
||||
RRC_status = mac_UE_get_rrc_status(ue->Mod_id, 0);
|
||||
len += sprintf(&buffer[len],"[UE PROC] RRC status = %d\n",RRC_status);
|
||||
#endif
|
||||
len += sprintf(&buffer[len], "[UE PROC] Transmission Mode %d \n",ue->transmission_mode[eNB]);
|
||||
len += sprintf(&buffer[len], "[UE PROC] PBCH err conseq %d, PBCH error total %d, PBCH FER %d\n",
|
||||
ue->pbch_vars[eNB]->pdu_errors_conseq,
|
||||
|
||||
@@ -321,4 +321,4 @@ HLC_subband_cqi_mcs_CBA_20MHz_NB_IoT;
|
||||
#define MAX_ACK_PAYLOAD_NB_IoT 18
|
||||
#define MAX_RI_PAYLOAD_NB_IoT 6
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -50,9 +50,6 @@
|
||||
//#define DEBUG_DCI_DECODING 1
|
||||
//#define DEBUG_PHY
|
||||
|
||||
//#undef ALL_AGGREGATION
|
||||
|
||||
|
||||
uint16_t extract_crc(uint8_t *dci,uint8_t dci_len)
|
||||
{
|
||||
|
||||
@@ -2802,7 +2799,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
if (dci_cnt>old_dci_cnt)
|
||||
return(dci_cnt);
|
||||
|
||||
//#ifdef ALL_AGGREGATION
|
||||
// Now check UE_SPEC format 1 search spaces at aggregation 8
|
||||
old_dci_cnt=dci_cnt;
|
||||
dci_decoding_procedure0(pdcch_vars,0,mode,subframe,
|
||||
@@ -2836,7 +2832,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
if (dci_cnt>old_dci_cnt)
|
||||
return(dci_cnt);
|
||||
|
||||
//#endif //ALL_AGGREGATION
|
||||
} else if (tmode == 3) {
|
||||
|
||||
|
||||
@@ -2946,7 +2941,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
if (dci_cnt>old_dci_cnt)
|
||||
return(dci_cnt);
|
||||
|
||||
//#ifdef ALL_AGGREGATION
|
||||
// Now check UE_SPEC format 2_2A search spaces at aggregation 8
|
||||
LOG_D(PHY," Now check UE_SPEC format 2_2A search spaces at aggregation 8 dci length: %d[bits] %d[bytes]\n",format2A_size_bits,format2A_size_bytes);
|
||||
old_dci_cnt=dci_cnt;
|
||||
@@ -3082,7 +3076,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
if (dci_cnt>old_dci_cnt)
|
||||
return(dci_cnt);
|
||||
|
||||
//#ifdef ALL_AGGREGATION
|
||||
// Now check UE_SPEC format 2_2A search spaces at aggregation 8
|
||||
old_dci_cnt=dci_cnt;
|
||||
dci_decoding_procedure0(pdcch_vars,0,mode,
|
||||
@@ -3214,7 +3207,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
if (dci_cnt>old_dci_cnt)
|
||||
return(dci_cnt);
|
||||
|
||||
//#ifdef ALL_AGGREGATION
|
||||
|
||||
// Now check UE_SPEC format 1E_2A_M10PRB search spaces at aggregation 8
|
||||
old_dci_cnt=dci_cnt;
|
||||
@@ -3249,7 +3241,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
if (dci_cnt>old_dci_cnt)
|
||||
return(dci_cnt);
|
||||
|
||||
//#endif //ALL_AGGREGATION
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
#include <cblas.h>
|
||||
#include "linear_preprocessing_rec.h"
|
||||
|
||||
#define NOCYGWIN_STATIC
|
||||
//#define DEBUG_MMSE
|
||||
|
||||
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
|
||||
//#define DEBUG_ULSCH_MODULATION
|
||||
|
||||
#ifndef OFDMA_ULSCH
|
||||
void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
|
||||
{
|
||||
|
||||
@@ -371,7 +370,6 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
|
||||
// printf("\n");
|
||||
}
|
||||
|
||||
#endif
|
||||
void ulsch_modulation(int32_t **txdataF,
|
||||
short amp,
|
||||
uint32_t frame,
|
||||
@@ -690,57 +688,10 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
|
||||
// Transform Precoding
|
||||
|
||||
#ifdef OFDMA_ULSCH
|
||||
|
||||
for (i=0; i<ulsch_Msymb; i++) {
|
||||
ulsch->z[i] = ulsch->d[i];
|
||||
}
|
||||
|
||||
#else
|
||||
dft_lte(ulsch->z,ulsch->d,Msc_PUSCH,ulsch->Nsymb_pusch);
|
||||
#endif
|
||||
|
||||
DevAssert(txdataF);
|
||||
|
||||
#ifdef OFDMA_ULSCH
|
||||
re_offset0 = frame_parms->first_carrier_offset + (ulsch->harq_processes[harq_pid]->first_rb*12);
|
||||
|
||||
if (re_offset0>frame_parms->ofdm_symbol_size) {
|
||||
re_offset0 -= frame_parms->ofdm_symbol_size;
|
||||
// re_offset0++;
|
||||
}
|
||||
|
||||
// printf("re_offset0 %d\n",re_offset0);
|
||||
|
||||
|
||||
for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) {
|
||||
re_offset = re_offset0;
|
||||
symbol_offset = (int)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb));
|
||||
#ifdef DEBUG_ULSCH_MODULATION
|
||||
printf("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
|
||||
#endif
|
||||
txptr = &txdataF[0][symbol_offset];
|
||||
|
||||
if (((frame_parms->Ncp == 0) && ((l==3) || (l==10)))||
|
||||
((frame_parms->Ncp == 1) && ((l==2) || (l==8)))) {
|
||||
}
|
||||
// Skip reference symbols
|
||||
else {
|
||||
|
||||
// printf("copying %d REs\n",Msc_PUSCH);
|
||||
for (i=0; i<Msc_PUSCH; i++,j++) {
|
||||
#ifdef DEBUG_ULSCH_MODULATION
|
||||
printf("re_offset %d (%p): %d,%d\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]);
|
||||
#endif
|
||||
txptr[re_offset++] = ulsch->z[j];
|
||||
|
||||
if (re_offset==frame_parms->ofdm_symbol_size)
|
||||
re_offset = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# else // OFDMA_ULSCH = 0
|
||||
re_offset0 = frame_parms->first_carrier_offset + (ulsch->harq_processes[harq_pid]->first_rb*12);
|
||||
|
||||
if (re_offset0>frame_parms->ofdm_symbol_size) {
|
||||
@@ -777,8 +728,5 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_MODULATION, VCD_FUNCTION_OUT);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -206,7 +206,9 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
nr_sequences=8>>(1-pucch_pdu->sr_flag);
|
||||
}
|
||||
|
||||
LOG_D(PHY,"pucch0: nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, O_ACK %d, O_SR %d, mcs %d initial_cyclic_shift %d\n",pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->bit_len_harq,pucch_pdu->sr_flag,mcs[0],pucch_pdu->initial_cyclic_shift);
|
||||
LOG_D(PHY,"pucch0: nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, O_ACK %d, O_SR %d, mcs %d initial_cyclic_shift %d\n",
|
||||
pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->bit_len_harq,
|
||||
pucch_pdu->sr_flag,mcs[0],pucch_pdu->initial_cyclic_shift);
|
||||
|
||||
int cs_ind = get_pucch0_cs_lut_index(gNB,pucch_pdu);
|
||||
/*
|
||||
|
||||
@@ -42,7 +42,6 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
||||
short coef)
|
||||
{
|
||||
|
||||
static int max_pos_fil = 0;
|
||||
static int count_max_pos_ok = 0;
|
||||
static int first_time = 1;
|
||||
int max_val = 0, max_pos = 0;
|
||||
@@ -55,13 +54,14 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
LOG_D(PHY,"AbsSubframe %d: rx_offset (before) = %d\n",subframe,ue->rx_offset);
|
||||
|
||||
// we only use channel estimates from tx antenna 0 here
|
||||
for (int i = 0; i < frame_parms->nb_prefix_samples; i++) {
|
||||
// search for maximum position within the cyclic prefix
|
||||
for (int i = -frame_parms->nb_prefix_samples/2; i < frame_parms->nb_prefix_samples/2; i++) {
|
||||
int temp = 0;
|
||||
|
||||
int j = (i < 0) ? (i + frame_parms->ofdm_symbol_size) : i;
|
||||
for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
||||
int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(i<<1)];
|
||||
int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(i<<1)];
|
||||
int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(j<<1)];
|
||||
int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(j<<1)];
|
||||
temp += (Re*Re/2) + (Im*Im/2);
|
||||
}
|
||||
|
||||
@@ -71,19 +71,16 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
||||
}
|
||||
}
|
||||
|
||||
if (max_pos > frame_parms->ofdm_symbol_size/2)
|
||||
max_pos = max_pos - frame_parms->ofdm_symbol_size;
|
||||
|
||||
// filter position to reduce jitter
|
||||
if (clear == 1)
|
||||
max_pos_fil = max_pos;
|
||||
ue->max_pos_fil = max_pos;
|
||||
else
|
||||
max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15;
|
||||
ue->max_pos_fil = ((ue->max_pos_fil * coef) + (max_pos * ncoef)) >> 15;
|
||||
|
||||
// do not filter to have proactive timing adjustment
|
||||
//max_pos_fil = max_pos;
|
||||
//ue->max_pos_fil = max_pos;
|
||||
|
||||
int diff = max_pos_fil - sync_pos;
|
||||
int diff = ue->max_pos_fil - sync_pos;
|
||||
|
||||
if (frame_parms->freq_range==nr_FR2)
|
||||
sync_offset = 2;
|
||||
@@ -131,7 +128,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
||||
ue->rx_offset,
|
||||
clear,
|
||||
max_pos,
|
||||
max_pos_fil,
|
||||
ue->max_pos_fil,
|
||||
max_val,
|
||||
sync_pos);
|
||||
#endif //DEBUG_PHY
|
||||
|
||||
@@ -485,8 +485,8 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
|
||||
#ifdef DEBUG_PDCCH
|
||||
printf("PDCCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
||||
ue->frame_parms.Ncp,Ns,k, symbol);
|
||||
printf("PDCCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, symbol %d\n",
|
||||
proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,ue->frame_parms.Ncp,Ns,symbol);
|
||||
#endif
|
||||
|
||||
fl = filt16a_l1;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -33,13 +33,7 @@
|
||||
#ifndef __PHY_NR_UE_TRANSPORT_DCI_NR__H__
|
||||
#define __PHY_NR_UE_TRANSPORT_DCI_NR__H__
|
||||
|
||||
#ifndef USER_MODE
|
||||
#include "PHY/types.h"
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#define MAX_DCI_SIZE_BITS 45
|
||||
|
||||
|
||||
@@ -43,12 +43,6 @@
|
||||
#include "PHY/NR_REFSIG/dmrs_nr.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
|
||||
#ifndef USER_MODE
|
||||
#define NOCYGWIN_STATIC static
|
||||
#else
|
||||
#define NOCYGWIN_STATIC
|
||||
#endif
|
||||
|
||||
/* dynamic shift for LLR computation for TM3/4
|
||||
* set as command line argument, see lte-softmodem.c
|
||||
* default value: 0
|
||||
|
||||
@@ -485,9 +485,9 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
|
||||
|
||||
for(int n_ss = 0; n_ss<pdcch_vars->nb_search_space; n_ss++) {
|
||||
uint8_t nb_symb_pdcch = pdcch_vars->pdcch_config[n_ss].coreset.duration;
|
||||
int start_symb = pdcch_vars->pdcch_config[n_ss].coreset.StartSymbolIndex;
|
||||
get_coreset_rballoc(pdcch_vars->pdcch_config[n_ss].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
|
||||
|
||||
for (uint16_t l=0; l<nb_symb_pdcch; l++) {
|
||||
for (uint16_t l=start_symb; l<start_symb+nb_symb_pdcch; l++) {
|
||||
nr_slot_fep_init_sync(ue,
|
||||
proc,
|
||||
l, // the UE PHY has no notion of the symbols to be monitored in the search space
|
||||
|
||||
@@ -40,9 +40,7 @@
|
||||
//#define DEBUG_PBCH
|
||||
//#define DEBUG_PBCH_ENCODING
|
||||
|
||||
#ifdef OPENAIR2
|
||||
//#include "PHY_INTERFACE/defs.h"
|
||||
#endif
|
||||
|
||||
#define PBCH_A 24
|
||||
|
||||
|
||||
@@ -90,8 +90,8 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
|
||||
// the value of u,v (delta always 0 for PUCCH) has to be calculated according to TS 38.211 Subclause 6.3.2.2.1
|
||||
uint8_t u[2]={0,0},v[2]={0,0};
|
||||
|
||||
LOG_D(PHY,"pucch0: slot %d nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, mcs %d\n",nr_slot_tx,pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->mcs);
|
||||
|
||||
LOG_D(PHY,"pucch0: slot %d nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, mcs %d\n",
|
||||
nr_slot_tx,pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->mcs);
|
||||
|
||||
#ifdef DEBUG_NR_PUCCH_TX
|
||||
printf("\t [nr_generate_pucch0] sequence generation: variable initialization for test\n");
|
||||
|
||||
@@ -69,18 +69,12 @@ void reset_stats(FL_OBJECT *button, long arg) {
|
||||
|
||||
|
||||
static void *scope_thread_eNB(void *arg) {
|
||||
# ifdef ENABLE_XFORMS_WRITE_STATS
|
||||
FILE *eNB_stats;
|
||||
# endif
|
||||
struct sched_param sched_param;
|
||||
int UE_id, CC_id;
|
||||
int ue_cnt=0;
|
||||
sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
|
||||
sched_setscheduler(0, SCHED_FIFO,&sched_param);
|
||||
printf("Scope thread has priority %d\n",sched_param.sched_priority);
|
||||
# ifdef ENABLE_XFORMS_WRITE_STATS
|
||||
eNB_stats = fopen("eNB_stats.txt", "w");
|
||||
#endif
|
||||
|
||||
while (!oai_exit) {
|
||||
ue_cnt=0;
|
||||
@@ -99,16 +93,6 @@ static void *scope_thread_eNB(void *arg) {
|
||||
usleep(100*1000);
|
||||
}
|
||||
|
||||
// printf("%s",stats_buffer);
|
||||
# ifdef ENABLE_XFORMS_WRITE_STATS
|
||||
|
||||
if (eNB_stats) {
|
||||
rewind (eNB_stats);
|
||||
fwrite (stats_buffer, 1, len, eNB_stats);
|
||||
fclose (eNB_stats);
|
||||
}
|
||||
|
||||
# endif
|
||||
pthread_exit((void *)arg);
|
||||
}
|
||||
|
||||
|
||||
@@ -72,16 +72,10 @@ void reset_stats(FL_OBJECT *button, long arg) {
|
||||
|
||||
static void *scope_thread_UE(void *arg) {
|
||||
char stats_buffer[16384];
|
||||
# ifdef ENABLE_XFORMS_WRITE_STATS
|
||||
FILE *UE_stats, *eNB_stats;
|
||||
# endif
|
||||
struct sched_param sched_param;
|
||||
sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
|
||||
sched_setscheduler(0, SCHED_FIFO,&sched_param);
|
||||
printf("Scope thread has priority %d\n",sched_param.sched_priority);
|
||||
# ifdef ENABLE_XFORMS_WRITE_STATS
|
||||
UE_stats = fopen("UE_stats.txt", "w");
|
||||
#endif
|
||||
|
||||
while (!oai_exit) {
|
||||
// dump_ue_stats (PHY_vars_UE_g[0][0], &PHY_vars_UE_g[0][0]->proc.proc_rxtx[0],stats_buffer, 0, mode,rx_input_level_dBm);
|
||||
@@ -94,16 +88,6 @@ static void *scope_thread_UE(void *arg) {
|
||||
0,7);
|
||||
// printf("%s",stats_buffer);
|
||||
}
|
||||
|
||||
# ifdef ENABLE_XFORMS_WRITE_STATS
|
||||
|
||||
if (UE_stats) {
|
||||
rewind (UE_stats);
|
||||
fwrite (stats_buffer, 1, len, UE_stats);
|
||||
fclose (UE_stats);
|
||||
}
|
||||
|
||||
# endif
|
||||
pthread_exit((void *)arg);
|
||||
}
|
||||
|
||||
|
||||
@@ -517,9 +517,6 @@ void phy_scope_gNB(OAI_phy_scope_t *form,
|
||||
}
|
||||
static void *scope_thread_gNB(void *arg) {
|
||||
scopeData_t *p=(scopeData_t *) arg;
|
||||
//# ifdef ENABLE_XFORMS_WRITE_STATS
|
||||
// FILE *gNB_stats = fopen("gNB_stats.txt", "w");
|
||||
//#endif
|
||||
size_t stksize=0;
|
||||
pthread_attr_t atr;
|
||||
pthread_attr_init(&atr);
|
||||
|
||||
@@ -131,6 +131,49 @@ void print_meas(time_stats_t *ts,
|
||||
}
|
||||
}
|
||||
|
||||
int print_meas_log(time_stats_t *ts,
|
||||
const char *name,
|
||||
time_stats_t *total_exec_time,
|
||||
time_stats_t *sf_exec_time,
|
||||
char *output)
|
||||
{
|
||||
int stroff = 0;
|
||||
static int first_time = 0;
|
||||
static double cpu_freq_GHz = 0.0;
|
||||
|
||||
if (cpu_freq_GHz == 0.0)
|
||||
cpu_freq_GHz = get_cpu_freq_GHz();
|
||||
|
||||
if (first_time == 0) {
|
||||
first_time=1;
|
||||
|
||||
if ((total_exec_time == NULL) || (sf_exec_time== NULL))
|
||||
stroff += sprintf(output, "%25s %25s %25s %25s %25s %6f\n","Name","Total","Per Trials", "Num Trials","CPU_F_GHz", cpu_freq_GHz);
|
||||
else
|
||||
stroff += sprintf(output+stroff, "%25s %25s %25s %20s %15s %6f\n","Name","Total","Average/Frame","Trials", "CPU_F_GHz", cpu_freq_GHz);
|
||||
}
|
||||
|
||||
if (ts->trials>0) {
|
||||
//printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials);
|
||||
if ((total_exec_time == NULL) || (sf_exec_time== NULL)) {
|
||||
stroff += sprintf(output+stroff, "%25s: %15.3f us; %15d; %15.3f us;\n",
|
||||
name,
|
||||
(ts->diff/ts->trials/cpu_freq_GHz/1000.0),
|
||||
ts->trials,
|
||||
ts->max/cpu_freq_GHz/1000.0);
|
||||
} else {
|
||||
stroff += sprintf(output+stroff, "%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n",
|
||||
name,
|
||||
(ts->diff/cpu_freq_GHz/1000000.0),
|
||||
((ts->diff/cpu_freq_GHz/1000000.0)/(total_exec_time->diff/cpu_freq_GHz/1000000.0))*100, // percentage
|
||||
(ts->diff/ts->trials/cpu_freq_GHz/1000.0),
|
||||
((ts->diff/ts->trials/cpu_freq_GHz/1000.0)/(sf_exec_time->diff/sf_exec_time->trials/cpu_freq_GHz/1000.0))*100, // percentage
|
||||
ts->trials);
|
||||
}
|
||||
}
|
||||
return stroff;
|
||||
}
|
||||
|
||||
double get_time_meas_us(time_stats_t *ts)
|
||||
{
|
||||
static double cpu_freq_GHz = 0.0;
|
||||
|
||||
@@ -88,6 +88,7 @@ static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
|
||||
|
||||
void print_meas_now(time_stats_t *ts, const char *name, FILE *file_name);
|
||||
void print_meas(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time);
|
||||
int print_meas_log(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time, char *output);
|
||||
double get_time_meas_us(time_stats_t *ts);
|
||||
double get_cpu_freq_GHz(void);
|
||||
|
||||
|
||||
@@ -48,7 +48,6 @@
|
||||
#ifdef MEX
|
||||
#define msg mexPrintf
|
||||
#else
|
||||
#ifdef OPENAIR2
|
||||
#if ENABLE_RAL
|
||||
#include "collection/hashtable/hashtable.h"
|
||||
#include "COMMON/ral_messages_types.h"
|
||||
@@ -56,9 +55,6 @@
|
||||
#endif
|
||||
#include "common/utils/LOG/log.h"
|
||||
#define msg(aRGS...) LOG_D(PHY, ##aRGS)
|
||||
#else
|
||||
#define msg printf
|
||||
#endif
|
||||
#endif
|
||||
//use msg in the real-time thread context
|
||||
#define msg_nrt printf
|
||||
@@ -196,19 +192,6 @@ typedef struct {
|
||||
NB_IoT_UE_DLSCH_t *dlsch_rn_MCH[10];
|
||||
|
||||
} PHY_VARS_RN_NB_IoT;
|
||||
/*
|
||||
#ifdef OCP_FRAMEWORK
|
||||
#include <enums.h>
|
||||
#else
|
||||
//typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5,calib_prach_tx=6,rx_dump_frame=7,loop_through_memory=8} runmode_t;
|
||||
*/
|
||||
// enum transmission_access_mode {
|
||||
// NO_ACCESS=0,
|
||||
// POSTPONED_ACCESS,
|
||||
// CANCELED_ACCESS,
|
||||
// UNKNOWN_ACCESS,
|
||||
// SCHEDULED_ACCESS,
|
||||
// CBA_ACCESS};
|
||||
|
||||
typedef enum {
|
||||
eNodeB_3GPP_NB_IoT=0, // classical eNodeB function
|
||||
|
||||
@@ -87,7 +87,6 @@
|
||||
#define LOG_W(x, ...) mexPrintf(__VA_ARGS__)
|
||||
#define LOG_M(x, ...) mexPrintf(__VA_ARGS__)
|
||||
#else
|
||||
#ifdef OPENAIR2
|
||||
#if ENABLE_RAL
|
||||
#include "collection/hashtable/hashtable.h"
|
||||
#include "COMMON/ral_messages_types.h"
|
||||
@@ -95,9 +94,6 @@
|
||||
#endif
|
||||
#include "common/utils/LOG/log.h"
|
||||
#define msg(aRGS...) LOG_D(PHY, ##aRGS)
|
||||
#else
|
||||
#define msg printf
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -51,16 +51,12 @@
|
||||
#ifdef MEX
|
||||
#define msg mexPrintf
|
||||
#else
|
||||
#ifdef OPENAIR2
|
||||
#if ENABLE_RAL
|
||||
#include "common/utils/hashtable/hashtable.h"
|
||||
#include "COMMON/ral_messages_types.h"
|
||||
#include "UTIL/queue.h"
|
||||
#endif
|
||||
#define msg(aRGS...) LOG_D(PHY, ##aRGS)
|
||||
#else
|
||||
#define msg printf
|
||||
#endif
|
||||
#endif
|
||||
//use msg in the real-time thread context
|
||||
#define msg_nrt printf
|
||||
@@ -638,7 +634,7 @@ typedef struct {
|
||||
uint8_t dciFormat;
|
||||
uint8_t agregationLevel;
|
||||
int nb_search_space;
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t pdcch_config[FAPI_NR_MAX_SS_PER_CORESET];
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t pdcch_config[FAPI_NR_MAX_SS];
|
||||
// frame and slot for sib1 in initial sync
|
||||
uint16_t sfn;
|
||||
uint16_t slot;
|
||||
@@ -921,9 +917,10 @@ typedef struct {
|
||||
uint8_t init_sync_frame;
|
||||
/// temporary offset during cell search prior to MIB decoding
|
||||
int ssb_offset;
|
||||
uint16_t symbol_offset; // offset in terms of symbols for detected ssb in sync
|
||||
int rx_offset; /// Timing offset
|
||||
uint16_t symbol_offset; /// offset in terms of symbols for detected ssb in sync
|
||||
int rx_offset; /// Timing offset
|
||||
int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
|
||||
int max_pos_fil; /// Timing offset IIR filter
|
||||
int time_sync_cell;
|
||||
|
||||
/// Timing Advance updates variables
|
||||
|
||||
@@ -55,12 +55,6 @@ extern char mode_string[4][20];
|
||||
extern unsigned char NB_RU;
|
||||
|
||||
|
||||
#ifndef OPENAIR2
|
||||
extern unsigned char NB_eNB_INST;
|
||||
extern uint16_t NB_UE_INST;
|
||||
extern unsigned char NB_RN_INST;
|
||||
#endif
|
||||
|
||||
extern int flag_LA;
|
||||
extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
|
||||
extern double sinr_bler_map_up[MCS_COUNT][2][16];
|
||||
|
||||
@@ -63,12 +63,6 @@ extern char mode_string[4][20];
|
||||
|
||||
extern unsigned char NB_RU;
|
||||
|
||||
#ifndef OPENAIR2
|
||||
extern unsigned char NB_eNB_INST;
|
||||
extern uint16_t NB_UE_INST;
|
||||
extern unsigned char NB_RN_INST;
|
||||
#endif
|
||||
|
||||
extern int flag_LA;
|
||||
extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
|
||||
extern double sinr_bler_map_up[MCS_COUNT][2][16];
|
||||
|
||||
@@ -53,12 +53,6 @@ extern int flagMag;
|
||||
extern char mode_string[4][20];
|
||||
|
||||
|
||||
#ifndef OPENAIR2
|
||||
extern unsigned char NB_eNB_INST;
|
||||
extern uint16_t NB_UE_INST;
|
||||
extern unsigned char NB_RN_INST;
|
||||
#endif
|
||||
|
||||
extern int flag_LA;
|
||||
extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
|
||||
extern double sinr_bler_map_up[MCS_COUNT][2][16];
|
||||
|
||||
@@ -55,13 +55,6 @@ const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
|
||||
|
||||
unsigned char NB_RU=0;
|
||||
|
||||
#ifndef OPENAIR2
|
||||
//unsigned char NB_eNB_INST=0;
|
||||
//uint16_t NB_UE_INST=0;
|
||||
//unsigned char NB_RN_INST=0;
|
||||
//unsigned char NB_INST=0;
|
||||
#endif
|
||||
|
||||
int number_of_cards;
|
||||
|
||||
|
||||
|
||||
@@ -57,13 +57,6 @@ const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
|
||||
|
||||
unsigned char NB_RU=0;
|
||||
|
||||
#ifndef OPENAIR2
|
||||
unsigned char NB_eNB_INST=0;
|
||||
uint16_t NB_UE_INST=0;
|
||||
unsigned char NB_RN_INST=0;
|
||||
unsigned char NB_INST=0;
|
||||
#endif
|
||||
|
||||
|
||||
int number_of_cards;
|
||||
|
||||
|
||||
@@ -47,14 +47,6 @@ const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
|
||||
#include "SIMULATION/ETH_TRANSPORT/vars.h"
|
||||
|
||||
|
||||
#ifndef OPENAIR2
|
||||
unsigned char NB_eNB_INST=0;
|
||||
uint16_t NB_UE_INST=0;
|
||||
unsigned char NB_RN_INST=0;
|
||||
unsigned char NB_INST=0;
|
||||
#endif
|
||||
|
||||
|
||||
int number_of_cards;
|
||||
|
||||
|
||||
|
||||
@@ -22,11 +22,6 @@
|
||||
#ifndef __openair_TYPES_NB_IOT_H__
|
||||
#define __openair_TYPES_NB_IOT_H__
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#include <linux/types.h>
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*__openair_TYPES_NB_IOT_H__ */
|
||||
|
||||
@@ -403,8 +403,6 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
||||
|
||||
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
||||
|
||||
int timing_advance_update, cqi;
|
||||
int sync_pos;
|
||||
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
|
||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
||||
NR_gNB_SCH_STATS_t *stats=get_ulsch_stats(gNB,ulsch);
|
||||
@@ -412,19 +410,20 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
||||
nfapi_nr_pusch_pdu_t *pusch_pdu = &harq_process->ulsch_pdu;
|
||||
|
||||
// pdu->data = gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b;
|
||||
sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
|
||||
int sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
|
||||
|
||||
// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
|
||||
uint16_t bw_scaling = 16 * gNB->frame_parms.ofdm_symbol_size / 2048;
|
||||
int sync_pos_rounded;
|
||||
|
||||
// do some integer rounding to improve TA accuracy
|
||||
int sync_pos_rounded;
|
||||
if (sync_pos > 0)
|
||||
sync_pos_rounded = sync_pos + (bw_scaling / 2) - 1;
|
||||
else
|
||||
sync_pos_rounded = sync_pos - (bw_scaling / 2) - 1;
|
||||
sync_pos_rounded = sync_pos - (bw_scaling / 2) + 1;
|
||||
if (stats) stats->sync_pos = sync_pos;
|
||||
|
||||
timing_advance_update = sync_pos_rounded / bw_scaling;
|
||||
int timing_advance_update = sync_pos_rounded / bw_scaling;
|
||||
|
||||
// put timing advance command in 0..63 range
|
||||
timing_advance_update += 31;
|
||||
@@ -449,6 +448,7 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
||||
|
||||
LOG_D(PHY, "Estimated SNR for PUSCH is = %f dB (ulsch_power %f, noise %f)\n", SNRtimes10/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot)/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot)/10.0);
|
||||
|
||||
int cqi;
|
||||
if (SNRtimes10 < -640) cqi=0;
|
||||
else if (SNRtimes10 > 635) cqi=255;
|
||||
else cqi=(640+SNRtimes10)/5;
|
||||
|
||||
@@ -44,4 +44,4 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response);
|
||||
int8_t nr_ue_phy_config_request(nr_phy_config_t *phy_config);
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -768,7 +768,8 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int gNB_
|
||||
uint16_t s1 = dlsch0_harq->nb_symbols;
|
||||
bool is_SI = dlsch0->rnti_type == _SI_RNTI_;
|
||||
|
||||
LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_slot_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",ue->Mod_id,pdsch,nr_slot_rx,harq_pid,dlsch0_harq->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0_harq->dlDmrsSymbPos);
|
||||
LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_slot_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",
|
||||
ue->Mod_id,pdsch,nr_slot_rx,harq_pid,dlsch0_harq->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0_harq->dlDmrsSymbPos);
|
||||
|
||||
for (m = s0; m < (s0 +s1); m++) {
|
||||
if (dlsch0_harq->dlDmrsSymbPos & (1 << m)) {
|
||||
@@ -1733,8 +1734,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||
for (uint16_t l=0; l<nb_symb_pdcch; l++) {
|
||||
|
||||
// note: this only works if RBs for PDCCH are contigous!
|
||||
LOG_D(PHY, "pdcch_channel_estimation: first_carrier_offset %d, BWPStart %d, coreset_start_rb %d\n",
|
||||
fp->first_carrier_offset, pdcch_vars->pdcch_config[n_ss].BWPStart, coreset_start_rb);
|
||||
LOG_D(PHY, "pdcch_channel_estimation: first_carrier_offset %d, BWPStart %d, coreset_start_rb %d, coreset_nb_rb %d\n",
|
||||
fp->first_carrier_offset, pdcch_vars->pdcch_config[n_ss].BWPStart, coreset_start_rb, coreset_nb_rb);
|
||||
|
||||
if (coreset_nb_rb > 0)
|
||||
nr_pdcch_channel_estimation(ue,
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<gpib/ib.h>
|
||||
#include"gpib_send.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <gpib/ib.h>
|
||||
#include "gpib_send.h"
|
||||
void gpib_send(unsigned int gpib_board, unsigned int gpib_device, char *command_string )
|
||||
{
|
||||
unsigned short addlist[2] = {gpib_device, NOADDR};
|
||||
|
||||
Reference in New Issue
Block a user