Merge remote-tracking branch 'origin/NR_FDD_FIX' into integration_2021_wk10
This commit is contained in:
@@ -0,0 +1,284 @@
|
|||||||
|
Active_gNBs = ( "gNB-Eurecom-5GNRBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
gNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
gNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_GNB";
|
||||||
|
|
||||||
|
gNB_name = "gNB-Eurecom-5GNRBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;});
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
ssb_SubcarrierOffset = 0;
|
||||||
|
pdsch_AntennaPorts = 1;
|
||||||
|
|
||||||
|
servingCellConfigCommon = (
|
||||||
|
{
|
||||||
|
#spCellConfigCommon
|
||||||
|
|
||||||
|
physCellId = 0;
|
||||||
|
|
||||||
|
# downlinkConfigCommon
|
||||||
|
#frequencyInfoDL
|
||||||
|
# this is 2150 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||||
|
absoluteFrequencySSB = 433096;
|
||||||
|
dl_frequencyBand = 66;
|
||||||
|
# this is 2150 MHz
|
||||||
|
dl_absoluteFrequencyPointA = 430000;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
dl_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_subcarrierSpacing = 1;
|
||||||
|
dl_carrierBandwidth = 106;
|
||||||
|
#initialDownlinkBWP
|
||||||
|
#genericParameters
|
||||||
|
# this is RBstart=0,L=50 (275*(L-1))+RBstart
|
||||||
|
initialDLBWPlocationAndBandwidth = 13475;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
|
#pdcch-ConfigCommon
|
||||||
|
initialDLBWPcontrolResourceSetZero = 12;
|
||||||
|
initialDLBWPsearchSpaceZero = 0;
|
||||||
|
#pdsch-ConfigCommon
|
||||||
|
#pdschTimeDomainAllocationList (up to 16 entries)
|
||||||
|
initialDLBWPk0_0 = 0;
|
||||||
|
#initialULBWPmappingType
|
||||||
|
#0=typeA,1=typeB
|
||||||
|
initialDLBWPmappingType_0 = 0;
|
||||||
|
#this is SS=1,L=13
|
||||||
|
initialDLBWPstartSymbolAndLength_0 = 40;
|
||||||
|
|
||||||
|
initialDLBWPk0_1 = 0;
|
||||||
|
initialDLBWPmappingType_1 = 0;
|
||||||
|
#this is SS=2,L=12
|
||||||
|
initialDLBWPstartSymbolAndLength_1 = 53;
|
||||||
|
|
||||||
|
initialDLBWPk0_2 = 0;
|
||||||
|
initialDLBWPmappingType_2 = 0;
|
||||||
|
#this is SS=1,L=12
|
||||||
|
initialDLBWPstartSymbolAndLength_2 = 54;
|
||||||
|
|
||||||
|
initialDLBWPk0_3 = 0;
|
||||||
|
initialDLBWPmappingType_3 = 0;
|
||||||
|
#this is SS=1,L=4
|
||||||
|
initialDLBWPstartSymbolAndLength_3 = 57;
|
||||||
|
#uplinkConfigCommon
|
||||||
|
#frequencyInfoUL
|
||||||
|
ul_frequencyBand = 66;
|
||||||
|
ul_absoluteFrequencyPointA = 350000;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
ul_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_subcarrierSpacing = 1;
|
||||||
|
ul_carrierBandwidth = 106;
|
||||||
|
pMax = 20;
|
||||||
|
#initialUplinkBWP
|
||||||
|
#genericParameters
|
||||||
|
initialULBWPlocationAndBandwidth = 13475;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
|
#rach-ConfigCommon
|
||||||
|
#rach-ConfigGeneric
|
||||||
|
prach_ConfigurationIndex = 98;
|
||||||
|
#prach_msg1_FDM
|
||||||
|
#0 = one, 1=two, 2=four, 3=eight
|
||||||
|
prach_msg1_FDM = 0;
|
||||||
|
prach_msg1_FrequencyStart = 0;
|
||||||
|
zeroCorrelationZoneConfig = 13;
|
||||||
|
preambleReceivedTargetPower = -118;
|
||||||
|
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||||
|
preambleTransMax = 6;
|
||||||
|
#powerRampingStep
|
||||||
|
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||||
|
powerRampingStep = 1;
|
||||||
|
#ra_ReponseWindow
|
||||||
|
#1,2,4,8,10,20,40,80
|
||||||
|
ra_ResponseWindow = 4;
|
||||||
|
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||||
|
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||||
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||||
|
#ra_ContentionResolutionTimer
|
||||||
|
#(0..7) 8,16,24,32,40,48,56,64
|
||||||
|
ra_ContentionResolutionTimer = 7;
|
||||||
|
rsrp_ThresholdSSB = 19;
|
||||||
|
#prach-RootSequenceIndex_PR
|
||||||
|
#1 = 839, 2 = 139
|
||||||
|
prach_RootSequenceIndex_PR = 2;
|
||||||
|
prach_RootSequenceIndex = 1;
|
||||||
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
|
#
|
||||||
|
msg1_SubcarrierSpacing = 1,
|
||||||
|
|
||||||
|
# restrictedSetConfig
|
||||||
|
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||||
|
restrictedSetConfig = 0,
|
||||||
|
# pusch-ConfigCommon (up to 16 elements)
|
||||||
|
initialULBWPk2_0 = 6;
|
||||||
|
initialULBWPmappingType_0 = 1
|
||||||
|
# this is SS=0 L=11
|
||||||
|
initialULBWPstartSymbolAndLength_0 = 55;
|
||||||
|
|
||||||
|
initialULBWPk2_1 = 6;
|
||||||
|
initialULBWPmappingType_1 = 1;
|
||||||
|
# this is SS=0 L=12
|
||||||
|
initialULBWPstartSymbolAndLength_1 = 69;
|
||||||
|
|
||||||
|
initialULBWPk2_2 = 7;
|
||||||
|
initialULBWPmappingType_2 = 1;
|
||||||
|
# this is SS=10 L=4
|
||||||
|
initialULBWPstartSymbolAndLength_2 = 52;
|
||||||
|
msg3_DeltaPreamble = 1;
|
||||||
|
p0_NominalWithGrant =-90;
|
||||||
|
|
||||||
|
# pucch-ConfigCommon setup :
|
||||||
|
# pucchGroupHopping
|
||||||
|
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||||
|
pucchGroupHopping = 0;
|
||||||
|
hoppingId = 40;
|
||||||
|
p0_nominal = -90;
|
||||||
|
# ssb_PositionsInBurs_BitmapPR
|
||||||
|
# 1=short, 2=medium, 3=long
|
||||||
|
ssb_PositionsInBurst_PR = 2;
|
||||||
|
ssb_PositionsInBurst_Bitmap = 1;
|
||||||
|
|
||||||
|
# ssb_periodicityServingCell
|
||||||
|
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||||
|
ssb_periodicityServingCell = 2;
|
||||||
|
|
||||||
|
# dmrs_TypeA_position
|
||||||
|
# 0 = pos2, 1 = pos3
|
||||||
|
dmrs_TypeA_Position = 0;
|
||||||
|
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
|
||||||
|
#tdd-UL-DL-ConfigurationCommon
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
referenceSubcarrierSpacing = 1;
|
||||||
|
# pattern1
|
||||||
|
# dl_UL_TransmissionPeriodicity
|
||||||
|
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||||
|
dl_UL_TransmissionPeriodicity = 6;
|
||||||
|
nrofDownlinkSlots = 7;
|
||||||
|
nrofDownlinkSymbols = 6;
|
||||||
|
nrofUplinkSlots = 2;
|
||||||
|
nrofUplinkSymbols = 4;
|
||||||
|
|
||||||
|
ssPBCH_BlockPower = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1;
|
||||||
|
nb_rx = 1;
|
||||||
|
att_tx = 0;
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 75;
|
||||||
|
eNB_instances = [0];
|
||||||
|
#beamforming 1x4 matrix:
|
||||||
|
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||||
|
sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
|
||||||
|
clock_src = "external";
|
||||||
|
# if_freq = 3700000000L;
|
||||||
|
# if_offset = 1000000;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -749,7 +749,7 @@ function report_test {
|
|||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
|
|
||||||
EPC_CONFIGS=("noS1")
|
EPC_CONFIGS=("noS1")
|
||||||
TRANS_MODES=("tdd")
|
TRANS_MODES=("fdd" "tdd")
|
||||||
BW_CASES=(106)
|
BW_CASES=(106)
|
||||||
for CN_CONFIG in ${EPC_CONFIGS[@]}
|
for CN_CONFIG in ${EPC_CONFIGS[@]}
|
||||||
do
|
do
|
||||||
|
|||||||
+57
-33
@@ -379,7 +379,7 @@ function check_iperf {
|
|||||||
local LOC_IS_DL=`echo $LOC_BASE_LOG | grep -c _dl`
|
local LOC_IS_DL=`echo $LOC_BASE_LOG | grep -c _dl`
|
||||||
local LOC_IS_BASIC_SIM=`echo $LOC_BASE_LOG | grep -c basic_sim`
|
local LOC_IS_BASIC_SIM=`echo $LOC_BASE_LOG | grep -c basic_sim`
|
||||||
local LOC_IS_RF_SIM=`echo $LOC_BASE_LOG | grep -c rf_sim`
|
local LOC_IS_RF_SIM=`echo $LOC_BASE_LOG | grep -c rf_sim`
|
||||||
local LOC_IS_NR=`echo $LOC_BASE_LOG | grep -c tdd_106prb`
|
local LOC_IS_NR=`echo $LOC_BASE_LOG | grep -c _106prb`
|
||||||
if [ -f ${LOC_BASE_LOG}_client.txt ]
|
if [ -f ${LOC_BASE_LOG}_client.txt ]
|
||||||
then
|
then
|
||||||
local FILE_COMPLETE=`egrep -c "Server Report" ${LOC_BASE_LOG}_client.txt`
|
local FILE_COMPLETE=`egrep -c "Server Report" ${LOC_BASE_LOG}_client.txt`
|
||||||
@@ -2189,39 +2189,50 @@ function run_test_on_vm {
|
|||||||
|
|
||||||
if [[ "$RUN_OPTIONS" == "complex" ]] && [[ $VM_NAME =~ .*-rf-sim.* ]]
|
if [[ "$RUN_OPTIONS" == "complex" ]] && [[ $VM_NAME =~ .*-rf-sim.* ]]
|
||||||
then
|
then
|
||||||
CN_CONFIG="noS1"
|
|
||||||
CONF_FILE=gnb.band78.tm1.106PRB.usrpn300.conf
|
|
||||||
S1_NOS1_CFG=0
|
|
||||||
PRB=106
|
|
||||||
FREQUENCY=3510
|
|
||||||
|
|
||||||
if [ ! -d $ARCHIVES_LOC ]
|
if [ ! -d $ARCHIVES_LOC ]
|
||||||
then
|
then
|
||||||
mkdir --parents $ARCHIVES_LOC
|
mkdir --parents $ARCHIVES_LOC
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local try_cnt=0
|
CN_CONFIG="noS1"
|
||||||
NR_STATUS=0
|
S1_NOS1_CFG=0
|
||||||
|
|
||||||
######### start of RA TEST loop
|
######### start of RA TEST loop
|
||||||
while [ $try_cnt -lt 5 ] #5 because it hardly succeed within CI
|
# for the moment only TDD
|
||||||
|
TRANS_MODES=("tdd")
|
||||||
|
for TMODE in ${TRANS_MODES[@]}
|
||||||
do
|
do
|
||||||
|
if [[ $TMODE =~ .*fdd.* ]]
|
||||||
|
then
|
||||||
|
CONF_FILE=gnb.band66.tm1.106PRB.usrpn300.conf
|
||||||
|
PRB=106
|
||||||
|
FREQUENCY=37000
|
||||||
|
else
|
||||||
|
CONF_FILE=gnb.band78.tm1.106PRB.usrpn300.conf
|
||||||
|
PRB=106
|
||||||
|
FREQUENCY=3510
|
||||||
|
fi
|
||||||
|
|
||||||
|
local try_cnt=0
|
||||||
|
NR_STATUS=0
|
||||||
|
while [ $try_cnt -lt 5 ] #5 because it hardly succeed within CI
|
||||||
|
|
||||||
|
do
|
||||||
SYNC_STATUS=0
|
SYNC_STATUS=0
|
||||||
RA_STATUS=0
|
RA_STATUS=0
|
||||||
rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}*ra_test.log
|
rm -f $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}*ra_test.log
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Starting the gNB"
|
echo "${CN_CONFIG} : Starting the gNB in ${TMODE} mode (RA TEST)"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
CURRENT_GNB_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_gnb_ra_test.log
|
CURRENT_GNB_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_gnb_ra_test.log
|
||||||
#last argument = 1 is to enable --do-ra for RA test
|
#last argument = 1 is to enable --do-ra for RA test
|
||||||
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 1
|
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 1
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Starting the NR-UE"
|
echo "${CN_CONFIG} : Starting the NR-UE in ${TMODE} mode (RA TEST)"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_ra_test.log
|
CURRENT_NR_UE_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ue_ra_test.log
|
||||||
#last argument = 1 is to enable --do-ra for RA test
|
#last argument = 1 is to enable --do-ra for RA test
|
||||||
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1
|
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1
|
||||||
if [ $NR_UE_SYNC -eq 0 ]
|
if [ $NR_UE_SYNC -eq 0 ]
|
||||||
@@ -2260,35 +2271,47 @@ function run_test_on_vm {
|
|||||||
else
|
else
|
||||||
try_cnt=$((try_cnt+10))
|
try_cnt=$((try_cnt+10))
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
done
|
done
|
||||||
########### end RA test
|
########### end RA test
|
||||||
|
|
||||||
sleep 30
|
sleep 30
|
||||||
|
|
||||||
|
|
||||||
######### start of PHY TEST loop
|
######### start of PHY TEST loop
|
||||||
try_cnt=0
|
SYNC_STATUS=0
|
||||||
while [ $try_cnt -lt 4 ]
|
PING_STATUS=0
|
||||||
|
IPERF_STATUS=0
|
||||||
|
TRANS_MODES=("fdd tdd")
|
||||||
|
for TMODE in ${TRANS_MODES[@]}
|
||||||
do
|
do
|
||||||
|
if [[ $TMODE =~ .*fdd.* ]]
|
||||||
|
then
|
||||||
|
CONF_FILE=gnb.band66.tm1.106PRB.usrpn300.conf
|
||||||
|
PRB=106
|
||||||
|
FREQUENCY=37000
|
||||||
|
else
|
||||||
|
CONF_FILE=gnb.band78.tm1.106PRB.usrpn300.conf
|
||||||
|
PRB=106
|
||||||
|
FREQUENCY=3510
|
||||||
|
fi
|
||||||
|
|
||||||
|
try_cnt=0
|
||||||
SYNC_STATUS=0
|
while [ $try_cnt -lt 4 ]
|
||||||
PING_STATUS=0
|
do
|
||||||
IPERF_STATUS=0
|
rm -f $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_gnb.log $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_ue.log
|
||||||
rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_gnb.log $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_ue.log
|
rm -f $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_ping_gnb_from_nrue.log $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_ping_from_gnb_nrue.log
|
||||||
rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_ping_gnb_from_nrue.log $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_ping_from_gnb_nrue.log
|
rm -f $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_iperf_dl*txt $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_iperf_ul*txt
|
||||||
rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_iperf_dl*txt $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_iperf_ul*txt
|
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Starting the gNB"
|
echo "${CN_CONFIG} : Starting the gNB in ${TMODE} mode (PHY TEST)"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
CURRENT_GNB_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_gnb.log
|
CURRENT_GNB_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_gnb.log
|
||||||
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 0
|
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 0
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Starting the NR-UE"
|
echo "${CN_CONFIG} : Starting the NR-UE in ${TMODE} mode (PHY TEST)"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue.log
|
CURRENT_NR_UE_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ue.log
|
||||||
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 0
|
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 0
|
||||||
if [ $NR_UE_SYNC -eq 0 ]
|
if [ $NR_UE_SYNC -eq 0 ]
|
||||||
then
|
then
|
||||||
@@ -2306,7 +2329,7 @@ function run_test_on_vm {
|
|||||||
echo "${CN_CONFIG} : Pinging the gNB from NR-UE"
|
echo "${CN_CONFIG} : Pinging the gNB from NR-UE"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
||||||
PING_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ping_gnb_from_nrue.log
|
PING_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ping_gnb_from_nrue.log
|
||||||
ping_epc_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $ENB_IP_ADDR $PING_LOG_FILE 1 0
|
ping_epc_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $ENB_IP_ADDR $PING_LOG_FILE 1 0
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
|
||||||
check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
|
check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
|
||||||
@@ -2315,7 +2338,7 @@ function run_test_on_vm {
|
|||||||
echo "${CN_CONFIG} : Pinging the NR-UE from gNB"
|
echo "${CN_CONFIG} : Pinging the NR-UE from gNB"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
||||||
PING_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ping_from_gnb_nrue.log
|
PING_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ping_from_gnb_nrue.log
|
||||||
ping_enb_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE 0
|
ping_enb_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE 0
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
|
||||||
check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
|
check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
|
||||||
@@ -2324,7 +2347,7 @@ function run_test_on_vm {
|
|||||||
echo "${CN_CONFIG} : iperf DL -- NR-UE is server and gNB is client"
|
echo "${CN_CONFIG} : iperf DL -- NR-UE is server and gNB is client"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
THROUGHPUT="30K"
|
THROUGHPUT="30K"
|
||||||
CURR_IPERF_LOG_BASE=tdd_${PRB}prb_${CN_CONFIG}_iperf_dl
|
CURR_IPERF_LOG_BASE=${TMODE}_${PRB}prb_${CN_CONFIG}_iperf_dl
|
||||||
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
||||||
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
||||||
generic_iperf $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $UE_IP_ADDR $GNB_VM_CMDS $GNB_VM_IP_ADDR $ENB_IP_ADDR $THROUGHPUT $CURR_IPERF_LOG_BASE 1 0
|
generic_iperf $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $UE_IP_ADDR $GNB_VM_CMDS $GNB_VM_IP_ADDR $ENB_IP_ADDR $THROUGHPUT $CURR_IPERF_LOG_BASE 1 0
|
||||||
@@ -2346,7 +2369,7 @@ function run_test_on_vm {
|
|||||||
echo "${CN_CONFIG} : iperf UL -- gNB is server and NR-UE is client"
|
echo "${CN_CONFIG} : iperf UL -- gNB is server and NR-UE is client"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
THROUGHPUT="30K"
|
THROUGHPUT="30K"
|
||||||
CURR_IPERF_LOG_BASE=tdd_${PRB}prb_${CN_CONFIG}_iperf_ul
|
CURR_IPERF_LOG_BASE=${TMODE}_${PRB}prb_${CN_CONFIG}_iperf_ul
|
||||||
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
||||||
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
||||||
generic_iperf $GNB_VM_CMDS $GNB_VM_IP_ADDR $ENB_IP_ADDR $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $UE_IP_ADDR $THROUGHPUT $CURR_IPERF_LOG_BASE 1 0
|
generic_iperf $GNB_VM_CMDS $GNB_VM_IP_ADDR $ENB_IP_ADDR $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $UE_IP_ADDR $THROUGHPUT $CURR_IPERF_LOG_BASE 1 0
|
||||||
@@ -2368,6 +2391,7 @@ function run_test_on_vm {
|
|||||||
else
|
else
|
||||||
try_cnt=$((try_cnt+10))
|
try_cnt=$((try_cnt+10))
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
done
|
done
|
||||||
######### end of loop
|
######### end of loop
|
||||||
full_l2_sim_destroy
|
full_l2_sim_destroy
|
||||||
|
|||||||
@@ -32,6 +32,81 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
#include "nr_common.h"
|
||||||
|
|
||||||
|
// Table 5.2-1 NR operating bands in FR1 & FR2 (3GPP TS 38.101)
|
||||||
|
// Table 5.4.2.3-1 Applicable NR-ARFCN per operating band in FR1 & FR2 (3GPP TS 38.101)
|
||||||
|
// Notes:
|
||||||
|
// - N_OFFs for bands from 80 to 89 and band 95 is referred to UL
|
||||||
|
// - Frequencies are expressed in KHz
|
||||||
|
// - col: NR_band ul_min ul_max dl_min dl_max step N_OFFs_DL deltaf_raster
|
||||||
|
nr_bandentry_t nr_bandtable[] = {
|
||||||
|
{1, 1920000, 1980000, 2110000, 2170000, 20, 422000, 100},
|
||||||
|
{2, 1850000, 1910000, 1930000, 1990000, 20, 386000, 100},
|
||||||
|
{3, 1710000, 1785000, 1805000, 1880000, 20, 361000, 100},
|
||||||
|
{5, 824000, 849000, 869000, 894000, 20, 173800, 100},
|
||||||
|
{7, 2500000, 2570000, 2620000, 2690000, 20, 524000, 100},
|
||||||
|
{8, 880000, 915000, 925000, 960000, 20, 185000, 100},
|
||||||
|
{12, 698000, 716000, 729000, 746000, 20, 145800, 100},
|
||||||
|
{14, 788000, 798000, 758000, 768000, 20, 151600, 100},
|
||||||
|
{18, 815000, 830000, 860000, 875000, 20, 172000, 100},
|
||||||
|
{20, 832000, 862000, 791000, 821000, 20, 158200, 100},
|
||||||
|
{25, 1850000, 1915000, 1930000, 1995000, 20, 386000, 100},
|
||||||
|
{26, 814000, 849000, 859000, 894000, 20, 171800, 100},
|
||||||
|
{28, 703000, 758000, 758000, 813000, 20, 151600, 100},
|
||||||
|
{29, 000, 000, 717000, 728000, 20, 143400, 100},
|
||||||
|
{30, 2305000, 2315000, 2350000, 2360000, 20, 470000, 100},
|
||||||
|
{34, 2010000, 2025000, 2010000, 2025000, 20, 402000, 100},
|
||||||
|
{38, 2570000, 2620000, 2570000, 2630000, 20, 514000, 100},
|
||||||
|
{39, 1880000, 1920000, 1880000, 1920000, 20, 376000, 100},
|
||||||
|
{40, 2300000, 2400000, 2300000, 2400000, 20, 460000, 100},
|
||||||
|
{41, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
||||||
|
{41, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
||||||
|
{47, 5855000, 5925000, 5855000, 5925000, 1, 790334, 15},
|
||||||
|
//{48, 3550000, 3700000, 3550000, 3700000, 1, 636667, 15},
|
||||||
|
//{48, 3550000, 3700000, 3550000, 3700000, 2, 636668, 30},
|
||||||
|
{50, 1432000, 1517000, 1432000, 1517000, 20, 286400, 100},
|
||||||
|
{51, 1427000, 1432000, 1427000, 1432000, 20, 285400, 100},
|
||||||
|
{53, 2483500, 2495000, 2483500, 2495000, 20, 496700, 100},
|
||||||
|
{65, 1920000, 2010000, 2110000, 2200000, 20, 422000, 100},
|
||||||
|
{66, 1710000, 1780000, 2110000, 2200000, 20, 422000, 100},
|
||||||
|
{70, 1695000, 1710000, 1995000, 2020000, 20, 399000, 100},
|
||||||
|
{71, 663000, 698000, 617000, 652000, 20, 123400, 100},
|
||||||
|
{74, 1427000, 1470000, 1475000, 1518000, 20, 295000, 100},
|
||||||
|
{75, 000, 000, 1432000, 1517000, 20, 286400, 100},
|
||||||
|
{76, 000, 000, 1427000, 1432000, 20, 285400, 100},
|
||||||
|
{77, 3300000, 4200000, 3300000, 4200000, 1, 620000, 15},
|
||||||
|
{77, 3300000, 4200000, 3300000, 4200000, 2, 620000, 30},
|
||||||
|
{78, 3300000, 3800000, 3300000, 3800000, 1, 620000, 15},
|
||||||
|
{78, 3300000, 3800000, 3300000, 3800000, 2, 620000, 30},
|
||||||
|
{79, 4400010, 5000000, 4400010, 5000000, 1, 693334, 15},
|
||||||
|
{79, 4400010, 5000000, 4400010, 5000000, 2, 693334, 30},
|
||||||
|
{80, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
||||||
|
{81, 880000, 915000, 000, 000, 20, 176000, 100},
|
||||||
|
{82, 832000, 862000, 000, 000, 20, 166400, 100},
|
||||||
|
{83, 703000, 748000, 000, 000, 20, 140600, 100},
|
||||||
|
{84, 1920000, 1980000, 000, 000, 20, 384000, 100},
|
||||||
|
{86, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
||||||
|
{89, 824000, 849000, 000, 000, 20, 342000, 100},
|
||||||
|
{90, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
||||||
|
{90, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
||||||
|
{90, 2496000, 2690000, 2496000, 2690000, 20, 499200, 100},
|
||||||
|
{91, 832000, 862000, 1427000, 1432000, 20, 285400, 100},
|
||||||
|
{92, 832000, 862000, 1432000, 1517000, 20, 286400, 100},
|
||||||
|
{93, 880000, 915000, 1427000, 1432000, 20, 285400, 100},
|
||||||
|
{94, 880000, 915000, 1432000, 1517000, 20, 286400, 100},
|
||||||
|
{95, 2010000, 2025000, 000, 000, 20, 402000, 100},
|
||||||
|
{257,26500020,29500000,26500020,29500000, 1,2054166, 60},
|
||||||
|
{257,26500080,29500000,26500080,29500000, 2,2054167, 120},
|
||||||
|
{258,24250080,27500000,24250080,27500000, 1,2016667, 60},
|
||||||
|
{258,24250080,27500000,24250080,27500000, 2,2016667, 120},
|
||||||
|
{260,37000020,40000000,37000020,40000000, 1,2229166, 60},
|
||||||
|
{260,37000080,40000000,37000080,40000000, 2,2229167, 120},
|
||||||
|
{261,27500040,28350000,27500040,28350000, 1,2070833, 60},
|
||||||
|
{261,27500040,28350000,27500040,28350000, 2,2070833, 120}
|
||||||
|
};
|
||||||
|
|
||||||
|
const size_t nr_bandtable_size = sizeof(nr_bandtable) / sizeof(nr_bandentry_t);
|
||||||
|
|
||||||
int NRRIV2BW(int locationAndBandwidth,int N_RB) {
|
int NRRIV2BW(int locationAndBandwidth,int N_RB) {
|
||||||
int tmp = locationAndBandwidth/N_RB;
|
int tmp = locationAndBandwidth/N_RB;
|
||||||
|
|||||||
@@ -36,6 +36,20 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
|
||||||
|
typedef struct nr_bandentry_s {
|
||||||
|
int16_t band;
|
||||||
|
uint64_t ul_min;
|
||||||
|
uint64_t ul_max;
|
||||||
|
uint64_t dl_min;
|
||||||
|
uint64_t dl_max;
|
||||||
|
uint64_t step_size;
|
||||||
|
uint64_t N_OFFs_DL;
|
||||||
|
uint8_t deltaf_raster;
|
||||||
|
} nr_bandentry_t;
|
||||||
|
|
||||||
|
extern const size_t nr_bandtable_size;
|
||||||
|
extern nr_bandentry_t nr_bandtable[];
|
||||||
|
|
||||||
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
||||||
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
||||||
int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);
|
int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);
|
||||||
|
|||||||
+5
-3
@@ -168,7 +168,7 @@ With the RF simulator (on the same machine):
|
|||||||
|
|
||||||
## IF setup with OAI
|
## IF setup with OAI
|
||||||
|
|
||||||
The -C and -CO flags can be used together at UE side to set custom downlink and uplink FR1 intermediate frequencies for the IF equipment.
|
The -C and --CO flags can be used together at UE side to set custom downlink and uplink FR1 arbitrary frequencies for the IF equipment.
|
||||||
|
|
||||||
In order to run this setup, the following flags are needed at the UE side:
|
In order to run this setup, the following flags are needed at the UE side:
|
||||||
|
|
||||||
@@ -182,9 +182,11 @@ and the following parameters must be configured in the RUs section of the gNB co
|
|||||||
|
|
||||||
`if_offset`
|
`if_offset`
|
||||||
|
|
||||||
### Run OAI with custom DL/UL intermediate frequencies
|
The values must be given in Hz.
|
||||||
|
|
||||||
The following example uses DL frequency 2169.080 MHz and UL frequency offset -400 MHz, with a configuration file for band 66 at gNB side.
|
### Run OAI with custom DL/UL arbitrary frequencies
|
||||||
|
|
||||||
|
The following example uses DL frequency 2169.080 MHz and UL frequency offset -400 MHz, with a configuration file for band 66 (FDD) at gNB side.
|
||||||
|
|
||||||
From the `cmake_targets/ran_build/build` folder:
|
From the `cmake_targets/ran_build/build` folder:
|
||||||
|
|
||||||
|
|||||||
+16
-9
@@ -703,16 +703,23 @@ void *UE_thread(void *arg) {
|
|||||||
|
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
int slot_tx_usrp = slot_nr + DURATION_RX_TO_TX - RX_NB_TH;
|
int slot_tx_usrp = slot_nr + DURATION_RX_TO_TX - RX_NB_TH;
|
||||||
uint8_t tdd_period = mac->phy_config.config_req.tdd_table.tdd_period_in_slots;
|
|
||||||
uint8_t num_UL_slots = mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots +
|
if (openair0_cfg[0].duplex_mode == duplex_mode_TDD) {
|
||||||
(mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols!=0);
|
|
||||||
uint8_t first_tx_slot = tdd_period - num_UL_slots;
|
uint8_t tdd_period = mac->phy_config.config_req.tdd_table.tdd_period_in_slots;
|
||||||
if (slot_tx_usrp%tdd_period==first_tx_slot)
|
int nrofUplinkSlots = mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
|
||||||
flags=2;
|
uint8_t num_UL_slots = nrofUplinkSlots + (nrofUplinkSlots != 0);
|
||||||
else if (slot_tx_usrp%tdd_period==first_tx_slot+num_UL_slots-1)
|
uint8_t first_tx_slot = tdd_period - num_UL_slots;
|
||||||
flags = 3;
|
|
||||||
else if (slot_tx_usrp%tdd_period>first_tx_slot)
|
if (slot_tx_usrp % tdd_period == first_tx_slot)
|
||||||
|
flags = 2;
|
||||||
|
else if (slot_tx_usrp % tdd_period == first_tx_slot + num_UL_slots - 1)
|
||||||
|
flags = 3;
|
||||||
|
else if (slot_tx_usrp % tdd_period > first_tx_slot)
|
||||||
|
flags = 1;
|
||||||
|
} else {
|
||||||
flags = 1;
|
flags = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags || IS_SOFTMODEM_RFSIM)
|
if (flags || IS_SOFTMODEM_RFSIM)
|
||||||
AssertFatal( writeBlockSize ==
|
AssertFatal( writeBlockSize ==
|
||||||
|
|||||||
@@ -531,7 +531,8 @@ int main( int argc, char **argv ) {
|
|||||||
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
||||||
|
|
||||||
nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
|
nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
|
||||||
init_symbol_rotation(&UE[CC_id]->frame_parms, UE[CC_id]->frame_parms.dl_CarrierFreq);
|
|
||||||
|
init_symbol_rotation(&UE[CC_id]->frame_parms);
|
||||||
init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
|
init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
|
||||||
|
|
||||||
#ifdef FR2_TEST
|
#ifdef FR2_TEST
|
||||||
|
|||||||
+40
-15
@@ -20,6 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "executables/nr-softmodem-common.h"
|
#include "executables/nr-softmodem-common.h"
|
||||||
|
#include "common/utils/nr/nr_common.h"
|
||||||
#include "PHY/defs_gNB.h"
|
#include "PHY/defs_gNB.h"
|
||||||
#include "PHY/phy_extern.h"
|
#include "PHY/phy_extern.h"
|
||||||
#include "PHY/NR_REFSIG/nr_refsig.h"
|
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||||
@@ -45,10 +46,42 @@
|
|||||||
|
|
||||||
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
|
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
|
||||||
|
|
||||||
/*
|
static
|
||||||
extern uint32_t from_nrarfcn(int nr_bandP,uint32_t dl_nrarfcn);
|
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex)
|
||||||
extern openair0_config_t openair0_cfg[MAX_CARDS];
|
{
|
||||||
*/
|
const uint64_t dl_freq_khz = downlink_frequency / 1000;
|
||||||
|
const int32_t delta_duplex_khz = delta_duplex / 1000;
|
||||||
|
|
||||||
|
uint64_t center_freq_diff_khz = 999999999999999999; // 2^64
|
||||||
|
uint16_t current_band = 0;
|
||||||
|
|
||||||
|
for (int ind = 0; ind < nr_bandtable_size; ind++) {
|
||||||
|
|
||||||
|
LOG_D(PHY, "Scanning band %d, dl_min %"PRIu64", ul_min %"PRIu64"\n", nr_bandtable[ind].band, nr_bandtable[ind].dl_min, nr_bandtable[ind].ul_min);
|
||||||
|
|
||||||
|
if (dl_freq_khz < nr_bandtable[ind].dl_min || dl_freq_khz > nr_bandtable[ind].dl_max)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int32_t current_offset_khz = nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min;
|
||||||
|
|
||||||
|
if (current_offset_khz != delta_duplex_khz)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
uint64_t center_frequency_khz = (nr_bandtable[ind].dl_max + nr_bandtable[ind].dl_min) / 2;
|
||||||
|
|
||||||
|
if (abs(dl_freq_khz - center_frequency_khz) < center_freq_diff_khz){
|
||||||
|
current_band = nr_bandtable[ind].band;
|
||||||
|
center_freq_diff_khz = abs(dl_freq_khz - center_frequency_khz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_I(PHY, "DL frequency %"PRIu64": band %d, UL frequency %"PRIu64"\n",
|
||||||
|
downlink_frequency, current_band, downlink_frequency+delta_duplex);
|
||||||
|
|
||||||
|
AssertFatal(current_band != 0, "Can't find EUTRA band for frequency %"PRIu64" and duplex_spacing %u\n", downlink_frequency, delta_duplex);
|
||||||
|
|
||||||
|
return current_band;
|
||||||
|
}
|
||||||
|
|
||||||
int l1_north_init_gNB() {
|
int l1_north_init_gNB() {
|
||||||
|
|
||||||
@@ -455,7 +488,6 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
|
|||||||
uint8_t short_sequence, num_sequences, rootSequenceIndex, fd_occasion;
|
uint8_t short_sequence, num_sequences, rootSequenceIndex, fd_occasion;
|
||||||
NR_DL_FRAME_PARMS *fp = &RC.gNB[Mod_id]->frame_parms;
|
NR_DL_FRAME_PARMS *fp = &RC.gNB[Mod_id]->frame_parms;
|
||||||
nfapi_nr_config_request_scf_t *gNB_config = &RC.gNB[Mod_id]->gNB_config;
|
nfapi_nr_config_request_scf_t *gNB_config = &RC.gNB[Mod_id]->gNB_config;
|
||||||
int32_t dlul_offset = 0;
|
|
||||||
|
|
||||||
memcpy((void*)gNB_config,phy_config->cfg,sizeof(*phy_config->cfg));
|
memcpy((void*)gNB_config,phy_config->cfg,sizeof(*phy_config->cfg));
|
||||||
RC.gNB[Mod_id]->mac_enabled = 1;
|
RC.gNB[Mod_id]->mac_enabled = 1;
|
||||||
@@ -466,16 +498,9 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
|
|||||||
uint64_t ul_bw_khz = (12*gNB_config->carrier_config.ul_grid_size[gNB_config->ssb_config.scs_common.value].value)*(15<<gNB_config->ssb_config.scs_common.value);
|
uint64_t ul_bw_khz = (12*gNB_config->carrier_config.ul_grid_size[gNB_config->ssb_config.scs_common.value].value)*(15<<gNB_config->ssb_config.scs_common.value);
|
||||||
fp->ul_CarrierFreq = ((ul_bw_khz>>1) + gNB_config->carrier_config.uplink_frequency.value)*1000 ;
|
fp->ul_CarrierFreq = ((ul_bw_khz>>1) + gNB_config->carrier_config.uplink_frequency.value)*1000 ;
|
||||||
|
|
||||||
//fp->nr_band = *RC.nrmac[Mod_id]->common_channels[0].ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
int32_t dlul_offset = fp->ul_CarrierFreq - fp->dl_CarrierFreq;
|
||||||
lte_frame_type_t frame_type = 0; // FDD
|
fp->nr_band = get_band(fp->dl_CarrierFreq, dlul_offset);
|
||||||
|
|
||||||
get_band(fp->dl_CarrierFreq,&fp->nr_band,&dlul_offset,&frame_type); //RC.nrmac[Mod_id] cannot be accessed in NFAPI
|
|
||||||
|
|
||||||
get_delta_duplex(fp->nr_band, gNB_config->ssb_config.scs_common.value, &dlul_offset);
|
|
||||||
dlul_offset *= 1000;
|
|
||||||
|
|
||||||
AssertFatal(fp->ul_CarrierFreq == (fp->dl_CarrierFreq + dlul_offset), "Disagreement in uplink frequency for band %d: ul_CarrierFreq = %lu Hz vs expected %lu Hz\n", fp->nr_band, fp->ul_CarrierFreq, fp->dl_CarrierFreq + dlul_offset);
|
|
||||||
|
|
||||||
LOG_I(PHY, "DL frequency %lu Hz, UL frequency %lu Hz: band %d, uldl offset %d Hz\n", fp->dl_CarrierFreq, fp->ul_CarrierFreq, fp->nr_band, dlul_offset);
|
LOG_I(PHY, "DL frequency %lu Hz, UL frequency %lu Hz: band %d, uldl offset %d Hz\n", fp->dl_CarrierFreq, fp->ul_CarrierFreq, fp->nr_band, dlul_offset);
|
||||||
|
|
||||||
fp->threequarter_fs = openair0_cfg[0].threequarter_fs;
|
fp->threequarter_fs = openair0_cfg[0].threequarter_fs;
|
||||||
@@ -504,7 +529,7 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
|
|||||||
// }
|
// }
|
||||||
RC.gNB[Mod_id]->configured = 1;
|
RC.gNB[Mod_id]->configured = 1;
|
||||||
|
|
||||||
init_symbol_rotation(fp,fp->dl_CarrierFreq);
|
init_symbol_rotation(fp);
|
||||||
|
|
||||||
LOG_I(PHY,"gNB %d configured\n",Mod_id);
|
LOG_I(PHY,"gNB %d configured\n",Mod_id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -352,9 +352,8 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
|
|||||||
fp->N_RB_UL = config->carrier_config.ul_grid_size[fp->numerology_index];
|
fp->N_RB_UL = config->carrier_config.ul_grid_size[fp->numerology_index];
|
||||||
fp->N_RB_DL = config->carrier_config.dl_grid_size[fp->numerology_index];
|
fp->N_RB_DL = config->carrier_config.dl_grid_size[fp->numerology_index];
|
||||||
|
|
||||||
int32_t uplink_frequency_offset = 0;
|
fp->frame_type = get_frame_type(fp->nr_band, fp->numerology_index);
|
||||||
get_delta_duplex(fp->nr_band, fp->numerology_index, &uplink_frequency_offset);
|
int32_t uplink_frequency_offset = get_delta_duplex(fp->nr_band, fp->numerology_index);
|
||||||
get_frame_type(fp->nr_band, fp->numerology_index, &fp->frame_type);
|
|
||||||
uplink_frequency_offset *= 1000;
|
uplink_frequency_offset *= 1000;
|
||||||
|
|
||||||
LOG_I(PHY, "Initializing frame parms: DL frequency %lu Hz, UL frequency %lu Hz: band %d, uldl offset %d Hz\n", fp->dl_CarrierFreq, fp->ul_CarrierFreq, fp->nr_band, uplink_frequency_offset);
|
LOG_I(PHY, "Initializing frame parms: DL frequency %lu Hz, UL frequency %lu Hz: band %d, uldl offset %d Hz\n", fp->dl_CarrierFreq, fp->ul_CarrierFreq, fp->nr_band, uplink_frequency_offset);
|
||||||
|
|||||||
@@ -591,35 +591,63 @@ void nr_dft(int32_t *z, int32_t *d, uint32_t Msc_PUSCH)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void init_symbol_rotation(NR_DL_FRAME_PARMS *fp,uint64_t CarrierFreq) {
|
void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
|
||||||
|
|
||||||
|
uint64_t dl_CarrierFreq = fp->dl_CarrierFreq;
|
||||||
|
uint64_t ul_CarrierFreq = fp->ul_CarrierFreq;
|
||||||
|
double f[2] = {(double)dl_CarrierFreq, (double)ul_CarrierFreq};
|
||||||
|
|
||||||
const int nsymb = fp->symbols_per_slot * fp->slots_per_frame/10;
|
const int nsymb = fp->symbols_per_slot * fp->slots_per_frame/10;
|
||||||
const double Tc=(1/480e3/4096);
|
const double Tc=(1/480e3/4096);
|
||||||
const double Nu=2048*64*(1/(float)(1<<fp->numerology_index));
|
const double Nu=2048*64*(1/(float)(1<<fp->numerology_index));
|
||||||
const double f0= (double)CarrierFreq;
|
|
||||||
const double Ncp0=16*64 + (144*64*(1/(float)(1<<fp->numerology_index)));
|
const double Ncp0=16*64 + (144*64*(1/(float)(1<<fp->numerology_index)));
|
||||||
const double Ncp1=(144*64*(1/(float)(1<<fp->numerology_index)));
|
const double Ncp1=(144*64*(1/(float)(1<<fp->numerology_index)));
|
||||||
double tl=0,poff,exp_re,exp_im;
|
|
||||||
double Ncp,Ncpm1=Ncp0;
|
|
||||||
|
|
||||||
poff = 2*M_PI*((Ncp0*Tc))*f0;
|
for (uint8_t ll = 0; ll < 2; ll++){
|
||||||
exp_re = cos(poff);
|
|
||||||
exp_im = sin(-poff);
|
double f0 = f[ll];
|
||||||
fp->symbol_rotation[0]=(int16_t)floor(exp_re*32767);
|
double Ncpm1 = Ncp0;
|
||||||
fp->symbol_rotation[1]=(int16_t)floor(exp_im*32767);
|
int16_t *symbol_rotation = fp->symbol_rotation[ll];
|
||||||
LOG_I(PHY,"Doing symbol rotation calculation for gNB TX/RX, f0 %f Hz, Nsymb %d\n",f0,nsymb);
|
|
||||||
LOG_I(PHY,"Symbol rotation %d/%d => (%d,%d)\n",0,nsymb,fp->symbol_rotation[0],fp->symbol_rotation[1]);
|
double tl = 0;
|
||||||
for (int l=1;l<nsymb;l++) {
|
double poff = 2 * M_PI * ((Ncp0 * Tc)) * f0;
|
||||||
if (l==(7*(1<<fp->numerology_index))) Ncp=Ncp0;
|
double exp_re = cos(poff);
|
||||||
else Ncp=Ncp1;
|
double exp_im = sin(-poff);
|
||||||
tl += (Nu+Ncpm1)*Tc;
|
symbol_rotation[0] = (int16_t)floor(exp_re * 32767);
|
||||||
poff = 2*M_PI*(tl + (Ncp*Tc))*f0;
|
symbol_rotation[1] = (int16_t)floor(exp_im * 32767);
|
||||||
exp_re = cos(poff);
|
LOG_I(PHY, "Doing symbol rotation calculation for gNB TX/RX, f0 %f Hz, Nsymb %d\n", f0, nsymb);
|
||||||
exp_im = sin(-poff);
|
LOG_I(PHY, "Symbol rotation %d/%d => (%d,%d)\n",
|
||||||
fp->symbol_rotation[l<<1]=(int16_t)floor(exp_re*32767);
|
0,
|
||||||
fp->symbol_rotation[1+(l<<1)]=(int16_t)floor(exp_im*32767);
|
nsymb,
|
||||||
LOG_I(PHY,"Symbol rotation %d/%d => tl %f (%d,%d) (%f)\n",l,nsymb,tl,fp->symbol_rotation[l<<1],fp->symbol_rotation[1+(l<<1)],
|
symbol_rotation[0],
|
||||||
(poff/2/M_PI)-floor(poff/2/M_PI));
|
symbol_rotation[1]);
|
||||||
Ncpm1=Ncp;
|
|
||||||
|
for (int l = 1; l < nsymb; l++) {
|
||||||
|
|
||||||
|
double Ncp;
|
||||||
|
if (l == (7 * (1 << fp->numerology_index))) {
|
||||||
|
Ncp = Ncp0;
|
||||||
|
} else {
|
||||||
|
Ncp = Ncp1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tl += (Nu + Ncpm1) * Tc;
|
||||||
|
poff = 2 * M_PI * (tl + (Ncp * Tc)) * f0;
|
||||||
|
exp_re = cos(poff);
|
||||||
|
exp_im = sin(-poff);
|
||||||
|
symbol_rotation[l<<1] = (int16_t)floor(exp_re * 32767);
|
||||||
|
symbol_rotation[1 + (l<<1)] = (int16_t)floor(exp_im * 32767);
|
||||||
|
|
||||||
|
LOG_I(PHY, "Symbol rotation %d/%d => tl %f (%d,%d) (%f)\n",
|
||||||
|
l,
|
||||||
|
nsymb,
|
||||||
|
tl,
|
||||||
|
symbol_rotation[l<<1],
|
||||||
|
symbol_rotation[1 + (l<<1)],
|
||||||
|
(poff / 2 / M_PI) - floor(poff / 2 / M_PI));
|
||||||
|
|
||||||
|
Ncpm1 = Ncp;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
|
|||||||
int nsymb,
|
int nsymb,
|
||||||
int length);
|
int length);
|
||||||
|
|
||||||
void init_symbol_rotation(NR_DL_FRAME_PARMS *fp,uint64_t CarrierFreq);
|
void init_symbol_rotation(NR_DL_FRAME_PARMS *fp);
|
||||||
|
|
||||||
void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
|
void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
int32_t *rxdataF,
|
int32_t *rxdataF,
|
||||||
|
|||||||
@@ -306,15 +306,23 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
|
|||||||
int length) {
|
int length) {
|
||||||
int symb_offset = (slot%fp->slots_per_subframe)*fp->symbols_per_slot;
|
int symb_offset = (slot%fp->slots_per_subframe)*fp->symbols_per_slot;
|
||||||
|
|
||||||
|
int16_t *symbol_rotation = fp->symbol_rotation[0];
|
||||||
|
|
||||||
for (int sidx=0;sidx<nsymb;sidx++) {
|
for (int sidx=0;sidx<nsymb;sidx++) {
|
||||||
|
|
||||||
LOG_D(PHY,"Rotating symbol %d, slot %d, symbol_subframe_index %d, length %d (%d,%d)\n",
|
LOG_D(PHY,"Rotating symbol %d, slot %d, symbol_subframe_index %d, length %d (%d,%d)\n",
|
||||||
first_symbol+sidx,slot,sidx+first_symbol+symb_offset,length,
|
first_symbol + sidx,
|
||||||
fp->symbol_rotation[2*(sidx+first_symbol+symb_offset)],fp->symbol_rotation[1+2*(sidx+first_symbol+symb_offset)]);
|
slot,
|
||||||
rotate_cpx_vector(trxdata+(sidx*length*2),
|
sidx + first_symbol + symb_offset,
|
||||||
&fp->symbol_rotation[2*(sidx+first_symbol+symb_offset)],
|
length,
|
||||||
trxdata+(sidx*length*2),
|
symbol_rotation[2 * (sidx + first_symbol + symb_offset)],
|
||||||
length,
|
symbol_rotation[1 + 2 * (sidx + first_symbol + symb_offset)]);
|
||||||
15);
|
|
||||||
|
rotate_cpx_vector(trxdata + (sidx * length * 2),
|
||||||
|
&symbol_rotation[2 * (sidx + first_symbol + symb_offset)],
|
||||||
|
trxdata + (sidx * length * 2),
|
||||||
|
length,
|
||||||
|
15);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
||||||
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
|
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol + symb_offset];
|
||||||
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
||||||
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
||||||
(int16_t*)&rot2,
|
(int16_t*)&rot2,
|
||||||
@@ -386,7 +386,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
||||||
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
|
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol + symb_offset];
|
||||||
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
||||||
|
|
||||||
#ifdef DEBUG_FEP
|
#ifdef DEBUG_FEP
|
||||||
@@ -513,7 +513,7 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
for (int symbol=0;symbol<nsymb;symbol++) {
|
for (int symbol=0;symbol<nsymb;symbol++) {
|
||||||
|
|
||||||
uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
|
uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[1])[symbol + symb_offset];
|
||||||
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
||||||
LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
|
LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
|
||||||
rotate_cpx_vector((int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
|
rotate_cpx_vector((int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
|
||||||
|
|||||||
@@ -61,8 +61,6 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
debug_ch_est = fopen("debug_ch_est.txt","w");
|
debug_ch_est = fopen("debug_ch_est.txt","w");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//uint16_t Nid_cell = (eNB_offset == 0) ? gNB->frame_parms.Nid_cell : gNB->measurements.adj_cell_id[eNB_offset-1];
|
|
||||||
|
|
||||||
uint8_t nushift;
|
uint8_t nushift;
|
||||||
int **ul_ch_estimates = gNB->pusch_vars[ul_id]->ul_ch_estimates;
|
int **ul_ch_estimates = gNB->pusch_vars[ul_id]->ul_ch_estimates;
|
||||||
int **rxdataF = gNB->common_vars.rxdataF;
|
int **rxdataF = gNB->common_vars.rxdataF;
|
||||||
@@ -79,12 +77,17 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
uint16_t nb_rb_pusch = pusch_pdu->rb_size;
|
uint16_t nb_rb_pusch = pusch_pdu->rb_size;
|
||||||
|
|
||||||
/*
|
|
||||||
#ifdef DEBUG_CH
|
#ifdef DEBUG_CH
|
||||||
printf("PUSCH Channel Estimation : ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n", ,ch_offset,symbol_offset,gNB->frame_parms.ofdm_symbol_size,
|
LOG_D(PHY, "In %s: ch_offset %d, symbol_offset %d OFDM size %d, Ns = %d, k = %d symbol %d\n",
|
||||||
gNB->frame_parms.Ncp,l,Ns,k, symbol);
|
__FUNCTION__,
|
||||||
|
ch_offset,
|
||||||
|
symbol_offset,
|
||||||
|
gNB->frame_parms.ofdm_symbol_size,
|
||||||
|
Ns,
|
||||||
|
k,
|
||||||
|
symbol);
|
||||||
#endif
|
#endif
|
||||||
*/
|
|
||||||
switch (nushift) {
|
switch (nushift) {
|
||||||
case 0:
|
case 0:
|
||||||
fl = filt8_l0;
|
fl = filt8_l0;
|
||||||
@@ -124,9 +127,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
//------------------generate DMRS------------------//
|
//------------------generate DMRS------------------//
|
||||||
|
|
||||||
if (pusch_pdu->transform_precoding == transform_precoder_disabled)
|
if (pusch_pdu->transform_precoding == transform_precoder_disabled) {
|
||||||
nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, pusch_pdu->rb_start*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type);
|
nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, pusch_pdu->rb_start*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type);
|
||||||
|
}
|
||||||
else { // if transform precoding or SC-FDMA is enabled in Uplink
|
else { // if transform precoding or SC-FDMA is enabled in Uplink
|
||||||
|
|
||||||
// NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible
|
// NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible
|
||||||
@@ -151,11 +154,15 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
//------------------------------------------------//
|
//------------------------------------------------//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
for (int i=0;i<(6*nb_rb_pusch);i++)
|
for (int i = 0; i < (6 * nb_rb_pusch); i++) {
|
||||||
printf("%d+j*(%d)\n",((int16_t*)pilot)[2*i],((int16_t*)pilot)[1+(2*i)]);
|
LOG_I(PHY, "In %s: %d + j*(%d)\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
((int16_t*)pilot)[2 * i],
|
||||||
|
((int16_t*)pilot)[1 + (2 * i)]);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
re_offset = k; /* Initializing the Resource element offset for each Rx antenna */
|
re_offset = k; /* Initializing the Resource element offset for each Rx antenna */
|
||||||
@@ -167,11 +174,11 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
|
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("symbol_offset %d, nushift %d\n",symbol_offset,nushift);
|
LOG_I(PHY, "In %s symbol_offset %d, nushift %d\n", __FUNCTION__, symbol_offset, nushift);
|
||||||
printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_UL);
|
LOG_I(PHY, "In %s ch est pilot addr %p, N_RB_UL %d\n", __FUNCTION__, &pilot[0], gNB->frame_parms.N_RB_UL);
|
||||||
printf("bwp_start_subcarrier %d, k %d, first_carrier %d, nb_rb_pusch %d\n",bwp_start_subcarrier,k,gNB->frame_parms.first_carrier_offset,nb_rb_pusch);
|
LOG_I(PHY, "In %s bwp_start_subcarrier %d, k %d, first_carrier %d, nb_rb_pusch %d\n", __FUNCTION__, bwp_start_subcarrier, k, gNB->frame_parms.first_carrier_offset, nb_rb_pusch);
|
||||||
printf("rxF addr %p p %d\n", rxF,p);
|
LOG_I(PHY, "In %s rxF addr %p p %d\n", __FUNCTION__, rxF, p);
|
||||||
printf("ul_ch addr %p nushift %d\n",ul_ch,nushift);
|
LOG_I(PHY, "In %s ul_ch addr %p nushift %d\n", __FUNCTION__, ul_ch, nushift);
|
||||||
#endif
|
#endif
|
||||||
//if ((gNB->frame_parms.N_RB_UL&1)==0) {
|
//if ((gNB->frame_parms.N_RB_UL&1)==0) {
|
||||||
|
|
||||||
@@ -182,9 +189,18 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
|
LOG_I(PHY, "In %s ch 0 %d\n", __FUNCTION__, ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
|
||||||
printf("pilot 0 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
LOG_I(PHY, "In %s pilot 0 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",
|
||||||
printf("data 0 : rxF - > (%d,%d) (%d)\n",rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
__FUNCTION__,
|
||||||
|
rxF[0],
|
||||||
|
rxF[1],
|
||||||
|
dBc(rxF[0],rxF[1]),
|
||||||
|
ch[0],
|
||||||
|
ch[1],
|
||||||
|
dBc(ch[0],ch[1]),
|
||||||
|
pil[0],
|
||||||
|
pil[1]);
|
||||||
|
LOG_I(PHY, "In %s data 0 : rxF - > (%d,%d) (%d)\n", __FUNCTION__, rxF[2], rxF[3], dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
multadd_real_vector_complex_scalar(fl,
|
multadd_real_vector_complex_scalar(fl,
|
||||||
@@ -201,9 +217,23 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("pilot 1 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
LOG_I(PHY, "In %s pilot 1 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",
|
||||||
printf("data 1 : rxF - > (%d,%d) (%d)\n",rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
__FUNCTION__,
|
||||||
|
rxF[0],
|
||||||
|
rxF[1],
|
||||||
|
dBc(rxF[0],rxF[1]),
|
||||||
|
ch[0],
|
||||||
|
ch[1],
|
||||||
|
dBc(ch[0],ch[1]),
|
||||||
|
pil[0],
|
||||||
|
pil[1]);
|
||||||
|
LOG_I(PHY, "In %s data 1 : rxF - > (%d,%d) (%d)\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
rxF[2],
|
||||||
|
rxF[3],
|
||||||
|
dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
multadd_real_vector_complex_scalar(fml,
|
multadd_real_vector_complex_scalar(fml,
|
||||||
ch,
|
ch,
|
||||||
ul_ch,
|
ul_ch,
|
||||||
@@ -217,9 +247,23 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("pilot 2 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
|
LOG_I(PHY, "In %s pilot 2 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",
|
||||||
printf("data 2 : rxF - > (%d,%d) (%d)\n",rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
|
__FUNCTION__,
|
||||||
|
rxF[0],
|
||||||
|
rxF[1],
|
||||||
|
dBc(rxF[0],rxF[1]),
|
||||||
|
ch[0],
|
||||||
|
ch[1],
|
||||||
|
dBc(ch[0],ch[1]),
|
||||||
|
pil[0],
|
||||||
|
pil[1]);
|
||||||
|
LOG_I(PHY, "In %s data 2 : rxF - > (%d,%d) (%d)\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
rxF[2],
|
||||||
|
rxF[3],
|
||||||
|
dBc(rxF[2],rxF[3]));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
multadd_real_vector_complex_scalar(fmm,
|
multadd_real_vector_complex_scalar(fmm,
|
||||||
ch,
|
ch,
|
||||||
ul_ch,
|
ul_ch,
|
||||||
|
|||||||
@@ -78,13 +78,15 @@ void nr_rf_card_config(openair0_config_t *openair0_cfg,
|
|||||||
|
|
||||||
openair0_cfg->autocal[i] = 1;
|
openair0_cfg->autocal[i] = 1;
|
||||||
|
|
||||||
LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %f, rx_gain %f, tx_freq %f Hz, rx_freq %f Hz\n",
|
if (i < openair0_cfg->rx_num_channels) {
|
||||||
i,
|
LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %f, rx_gain %f, tx_freq %f Hz, rx_freq %f Hz\n",
|
||||||
rf_chain,
|
i,
|
||||||
openair0_cfg->tx_gain[i],
|
rf_chain,
|
||||||
openair0_cfg->rx_gain[i],
|
openair0_cfg->tx_gain[i],
|
||||||
openair0_cfg->tx_freq[i],
|
openair0_cfg->rx_gain[i],
|
||||||
openair0_cfg->rx_freq[i]);
|
openair0_cfg->tx_freq[i],
|
||||||
|
openair0_cfg->rx_freq[i]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -496,13 +496,19 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
||||||
for(ap = 0; ap < Nl; ap++) {
|
for(ap = 0; ap < Nl; ap++) {
|
||||||
for (int s=0;s<NR_NUMBER_OF_SYMBOLS_PER_SLOT;s++){
|
for (int s=0;s<NR_NUMBER_OF_SYMBOLS_PER_SLOT;s++){
|
||||||
LOG_D(PHY,"rotating txdataF symbol %d (%d) => (%d.%d)\n",
|
|
||||||
s,s+symb_offset,frame_parms->symbol_rotation[2*(s+symb_offset)],frame_parms->symbol_rotation[1+(2*(s+symb_offset))]);
|
LOG_D(PHY,"In %s: rotating txdataF symbol %d (%d) => (%d.%d)\n",
|
||||||
rotate_cpx_vector((int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size*s],
|
__FUNCTION__,
|
||||||
&frame_parms->symbol_rotation[2*(s+symb_offset)],
|
s,
|
||||||
(int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size*s],
|
s + symb_offset,
|
||||||
frame_parms->ofdm_symbol_size,
|
frame_parms->symbol_rotation[1][2 * (s + symb_offset)],
|
||||||
15);
|
frame_parms->symbol_rotation[1][1 + (2 * (s + symb_offset))]);
|
||||||
|
|
||||||
|
rotate_cpx_vector((int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s],
|
||||||
|
&frame_parms->symbol_rotation[1][2 * (s + symb_offset)],
|
||||||
|
(int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s],
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
15);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -327,7 +327,8 @@ struct NR_DL_FRAME_PARMS {
|
|||||||
/// Cyclic Prefix for DL (0=Normal CP, 1=Extended CP)
|
/// Cyclic Prefix for DL (0=Normal CP, 1=Extended CP)
|
||||||
lte_prefix_type_t Ncp;
|
lte_prefix_type_t Ncp;
|
||||||
/// sequence which is computed based on carrier frequency and numerology to rotate/derotate each OFDM symbol according to Section 5.3 in 38.211
|
/// sequence which is computed based on carrier frequency and numerology to rotate/derotate each OFDM symbol according to Section 5.3 in 38.211
|
||||||
int16_t symbol_rotation[224*2];
|
/// First dimension is for the direction of the link (0 DL, 1 UL)
|
||||||
|
int16_t symbol_rotation[2][224*2];
|
||||||
/// shift of pilot position in one RB
|
/// shift of pilot position in one RB
|
||||||
uint8_t nushift;
|
uint8_t nushift;
|
||||||
/// SRS configuration from TS 38.331 RRC
|
/// SRS configuration from TS 38.331 RRC
|
||||||
@@ -368,20 +369,4 @@ struct NR_DL_FRAME_PARMS {
|
|||||||
#define KHz (1000UL)
|
#define KHz (1000UL)
|
||||||
#define MHz (1000*KHz)
|
#define MHz (1000*KHz)
|
||||||
|
|
||||||
typedef struct nr_bandentry_s {
|
|
||||||
int16_t band;
|
|
||||||
uint64_t ul_min;
|
|
||||||
uint64_t ul_max;
|
|
||||||
uint64_t dl_min;
|
|
||||||
uint64_t dl_max;
|
|
||||||
uint64_t step_size;
|
|
||||||
uint64_t N_OFFs_DL;
|
|
||||||
uint8_t deltaf_raster;
|
|
||||||
} nr_bandentry_t;
|
|
||||||
|
|
||||||
typedef struct nr_band_info_s {
|
|
||||||
int nbands;
|
|
||||||
nr_bandentry_t band_info[100];
|
|
||||||
} nr_band_info_t;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -238,33 +238,15 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
|
|||||||
int factor_mu = 1 << numerology;
|
int factor_mu = 1 << numerology;
|
||||||
uint16_t bw_scaling = get_bw_scaling(bwp_ul_NB_RB);
|
uint16_t bw_scaling = get_bw_scaling(bwp_ul_NB_RB);
|
||||||
|
|
||||||
LOG_D(PHY, "In %s: applying timing advance -- frame %d -- slot %d -- UE_mode %d\n", __FUNCTION__, frame_tx, slot_tx, ue->UE_mode[gNB_id]);
|
ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling / factor_mu;
|
||||||
|
|
||||||
if (ue->UE_mode[gNB_id] == RA_RESPONSE){
|
LOG_I(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
|
||||||
|
__FUNCTION__,
|
||||||
ue->timing_advance = ul_time_alignment->ta_command * bw_scaling / factor_mu;
|
ue->Mod_id,
|
||||||
|
frame_tx,
|
||||||
LOG_D(PHY, "In %s: [UE %d] [%d.%d] Received (RAR) timing advance command %d new value is %u \n",
|
slot_tx,
|
||||||
__FUNCTION__,
|
ul_time_alignment->ta_command,
|
||||||
ue->Mod_id,
|
ue->timing_advance);
|
||||||
frame_tx,
|
|
||||||
slot_tx,
|
|
||||||
ul_time_alignment->ta_command,
|
|
||||||
ue->timing_advance);
|
|
||||||
|
|
||||||
} else if (ue->UE_mode[gNB_id] == PUSCH){
|
|
||||||
|
|
||||||
ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling / factor_mu;
|
|
||||||
|
|
||||||
LOG_D(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
|
|
||||||
__FUNCTION__,
|
|
||||||
ue->Mod_id,
|
|
||||||
frame_tx,
|
|
||||||
slot_tx,
|
|
||||||
ul_time_alignment->ta_command,
|
|
||||||
ue->timing_advance);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
ul_time_alignment->ta_frame = -1;
|
ul_time_alignment->ta_frame = -1;
|
||||||
ul_time_alignment->ta_slot = -1;
|
ul_time_alignment->ta_slot = -1;
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
nr_init_frame_parms(gNB_config, fp);
|
nr_init_frame_parms(gNB_config, fp);
|
||||||
|
|
||||||
init_symbol_rotation(fp,fp->dl_CarrierFreq);
|
init_symbol_rotation(fp);
|
||||||
|
|
||||||
gNB->configured = 1;
|
gNB->configured = 1;
|
||||||
LOG_I(PHY,"gNB configured\n");
|
LOG_I(PHY,"gNB configured\n");
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||||
|
#include "common/utils/nr/nr_common.h"
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#define reserved 0xffff
|
#define reserved 0xffff
|
||||||
@@ -1220,6 +1221,11 @@ int get_nr_prach_occasion_info_from_index(uint8_t index,
|
|||||||
else { // FDD
|
else { // FDD
|
||||||
x = table_6_3_3_2_2_prachConfig_Index[index][2];
|
x = table_6_3_3_2_2_prachConfig_Index[index][2];
|
||||||
s_map = table_6_3_3_2_2_prachConfig_Index[index][4];
|
s_map = table_6_3_3_2_2_prachConfig_Index[index][4];
|
||||||
|
for(int i = 0; i < 64 ; i++) {
|
||||||
|
if ( (s_map >> i) & 0x01) {
|
||||||
|
(*N_RA_sfn)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
*N_RA_slot = table_6_3_3_2_2_prachConfig_Index[index][6];
|
*N_RA_slot = table_6_3_3_2_2_prachConfig_Index[index][6];
|
||||||
if (start_symbol != NULL && N_t_slot != NULL && N_dur != NULL && format != NULL){
|
if (start_symbol != NULL && N_t_slot != NULL && N_dur != NULL && format != NULL){
|
||||||
*start_symbol = table_6_3_3_2_2_prachConfig_Index[index][5];
|
*start_symbol = table_6_3_3_2_2_prachConfig_Index[index][5];
|
||||||
@@ -1429,6 +1435,11 @@ int get_nr_prach_info_from_index(uint8_t index,
|
|||||||
if ( (table_6_3_3_2_2_prachConfig_Index[index][6] <= 1) && (slot%2 == 0) )
|
if ( (table_6_3_3_2_2_prachConfig_Index[index][6] <= 1) && (slot%2 == 0) )
|
||||||
return 0; // no prach in even slots @ 30kHz for 1 prach per subframe
|
return 0; // no prach in even slots @ 30kHz for 1 prach per subframe
|
||||||
}
|
}
|
||||||
|
for(int i = 0; i <= subframe ; i++) {
|
||||||
|
if ( (s_map >> i) & 0x01) {
|
||||||
|
(*RA_sfn_index)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (start_symbol != NULL && N_t_slot != NULL && N_dur != NULL && format != NULL){
|
if (start_symbol != NULL && N_t_slot != NULL && N_dur != NULL && format != NULL){
|
||||||
*start_symbol = table_6_3_3_2_2_prachConfig_Index[index][5];
|
*start_symbol = table_6_3_3_2_2_prachConfig_Index[index][5];
|
||||||
*N_t_slot = table_6_3_3_2_2_prachConfig_Index[index][7];
|
*N_t_slot = table_6_3_3_2_2_prachConfig_Index[index][7];
|
||||||
@@ -1567,79 +1578,6 @@ uint8_t compute_nr_root_seq(NR_RACH_ConfigCommon_t *rach_config,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Table 5.2-1 NR operating bands in FR1 & FR2 (3GPP TS 38.101)
|
|
||||||
// Table 5.4.2.3-1 Applicable NR-ARFCN per operating band in FR1 & FR2 (3GPP TS 38.101)
|
|
||||||
// Notes:
|
|
||||||
// - N_OFFs for bands from 80 to 89 and band 95 is referred to UL
|
|
||||||
// - Frequencies are expressed in KHz
|
|
||||||
// - col: NR_band ul_min ul_max dl_min dl_max step N_OFFs_DL deltaf_raster
|
|
||||||
nr_bandentry_t nr_bandtable[] = {
|
|
||||||
{1, 1920000, 1980000, 2110000, 2170000, 20, 422000, 100},
|
|
||||||
{2, 1850000, 1910000, 1930000, 1990000, 20, 386000, 100},
|
|
||||||
{3, 1710000, 1785000, 1805000, 1880000, 20, 361000, 100},
|
|
||||||
{5, 824000, 849000, 869000, 894000, 20, 173800, 100},
|
|
||||||
{7, 2500000, 2570000, 2620000, 2690000, 20, 524000, 100},
|
|
||||||
{8, 880000, 915000, 925000, 960000, 20, 185000, 100},
|
|
||||||
{12, 698000, 716000, 729000, 746000, 20, 145800, 100},
|
|
||||||
{14, 788000, 798000, 758000, 768000, 20, 151600, 100},
|
|
||||||
{18, 815000, 830000, 860000, 875000, 20, 172000, 100},
|
|
||||||
{20, 832000, 862000, 791000, 821000, 20, 158200, 100},
|
|
||||||
{25, 1850000, 1915000, 1930000, 1995000, 20, 386000, 100},
|
|
||||||
{26, 814000, 849000, 859000, 894000, 20, 171800, 100},
|
|
||||||
{28, 703000, 758000, 758000, 813000, 20, 151600, 100},
|
|
||||||
{29, 000, 000, 717000, 728000, 20, 143400, 100},
|
|
||||||
{30, 2305000, 2315000, 2350000, 2360000, 20, 470000, 100},
|
|
||||||
{34, 2010000, 2025000, 2010000, 2025000, 20, 402000, 100},
|
|
||||||
{38, 2570000, 2620000, 2570000, 2630000, 20, 514000, 100},
|
|
||||||
{39, 1880000, 1920000, 1880000, 1920000, 20, 376000, 100},
|
|
||||||
{40, 2300000, 2400000, 2300000, 2400000, 20, 460000, 100},
|
|
||||||
{41, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
|
||||||
{41, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
|
||||||
{47, 5855000, 5925000, 5855000, 5925000, 1, 790334, 15},
|
|
||||||
//{48, 3550000, 3700000, 3550000, 3700000, 1, 636667, 15},
|
|
||||||
//{48, 3550000, 3700000, 3550000, 3700000, 2, 636668, 30},
|
|
||||||
{50, 1432000, 1517000, 1432000, 1517000, 20, 286400, 100},
|
|
||||||
{51, 1427000, 1432000, 1427000, 1432000, 20, 285400, 100},
|
|
||||||
{53, 2483500, 2495000, 2483500, 2495000, 20, 496700, 100},
|
|
||||||
{65, 1920000, 2010000, 2110000, 2200000, 20, 422000, 100},
|
|
||||||
{66, 1710000, 1780000, 2110000, 2200000, 20, 422000, 100},
|
|
||||||
{70, 1695000, 1710000, 1995000, 2020000, 20, 399000, 100},
|
|
||||||
{71, 663000, 698000, 617000, 652000, 20, 123400, 100},
|
|
||||||
{74, 1427000, 1470000, 1475000, 1518000, 20, 295000, 100},
|
|
||||||
{75, 000, 000, 1432000, 1517000, 20, 286400, 100},
|
|
||||||
{76, 000, 000, 1427000, 1432000, 20, 285400, 100},
|
|
||||||
{77, 3300000, 4200000, 3300000, 4200000, 1, 620000, 15},
|
|
||||||
{77, 3300000, 4200000, 3300000, 4200000, 2, 620000, 30},
|
|
||||||
{78, 3300000, 3800000, 3300000, 3800000, 1, 620000, 15},
|
|
||||||
{78, 3300000, 3800000, 3300000, 3800000, 2, 620000, 30},
|
|
||||||
{79, 4400010, 5000000, 4400010, 5000000, 1, 693334, 15},
|
|
||||||
{79, 4400010, 5000000, 4400010, 5000000, 2, 693334, 30},
|
|
||||||
{80, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
|
||||||
{81, 880000, 915000, 000, 000, 20, 176000, 100},
|
|
||||||
{82, 832000, 862000, 000, 000, 20, 166400, 100},
|
|
||||||
{83, 703000, 748000, 000, 000, 20, 140600, 100},
|
|
||||||
{84, 1920000, 1980000, 000, 000, 20, 384000, 100},
|
|
||||||
{86, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
|
||||||
{89, 824000, 849000, 000, 000, 20, 342000, 100},
|
|
||||||
{90, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
|
||||||
{90, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
|
||||||
{90, 2496000, 2690000, 2496000, 2690000, 20, 499200, 100},
|
|
||||||
{91, 832000, 862000, 1427000, 1432000, 20, 285400, 100},
|
|
||||||
{92, 832000, 862000, 1432000, 1517000, 20, 286400, 100},
|
|
||||||
{93, 880000, 915000, 1427000, 1432000, 20, 285400, 100},
|
|
||||||
{94, 880000, 915000, 1432000, 1517000, 20, 286400, 100},
|
|
||||||
{95, 2010000, 2025000, 000, 000, 20, 402000, 100},
|
|
||||||
{257,26500020,29500000,26500020,29500000, 1,2054166, 60},
|
|
||||||
{257,26500080,29500000,26500080,29500000, 2,2054167, 120},
|
|
||||||
{258,24250080,27500000,24250080,27500000, 1,2016667, 60},
|
|
||||||
{258,24250080,27500000,24250080,27500000, 2,2016667, 120},
|
|
||||||
{260,37000020,40000000,37000020,40000000, 1,2229166, 60},
|
|
||||||
{260,37000080,40000000,37000080,40000000, 2,2229167, 120},
|
|
||||||
{261,27500040,28350000,27500040,28350000, 1,2070833, 60},
|
|
||||||
{261,27500040,28350000,27500040,28350000, 2,2070833, 120}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// TS 38.211 Table 6.4.1.1.3-3: PUSCH DMRS positions l' within a slot for single-symbol DMRS and intra-slot frequency hopping disabled.
|
// TS 38.211 Table 6.4.1.1.3-3: PUSCH DMRS positions l' within a slot for single-symbol DMRS and intra-slot frequency hopping disabled.
|
||||||
// The first 4 colomns are PUSCH mapping type A and the last 4 colomns are PUSCH mapping type B.
|
// The first 4 colomns are PUSCH mapping type A and the last 4 colomns are PUSCH mapping type B.
|
||||||
// When l' = l0, it is represented by 1
|
// When l' = l0, it is represented by 1
|
||||||
@@ -1680,11 +1618,9 @@ int32_t table_6_4_1_1_3_4_pusch_dmrs_positions_l [12][8] = {
|
|||||||
{1, 1025, -1, -1, 1, 513, -1, -1}, //14 // (DMRS l' position)
|
{1, 1025, -1, -1, 1, 513, -1, -1}, //14 // (DMRS l' position)
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NR_BANDTABLE_SIZE (sizeof(nr_bandtable)/sizeof(nr_bandentry_t))
|
|
||||||
|
|
||||||
// Returns the corresponding row index of the NR table
|
// Returns the corresponding row index of the NR table
|
||||||
int get_nr_table_idx(int nr_bandP, uint8_t scs_index){
|
int get_nr_table_idx(int nr_bandP, uint8_t scs_index)
|
||||||
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
int scs_khz = 15 << scs_index;
|
int scs_khz = 15 << scs_index;
|
||||||
int supplementary_bands[] = {29,75,76,80,81,82,83,84,86,89,95};
|
int supplementary_bands[] = {29,75,76,80,81,82,83,84,86,89,95};
|
||||||
@@ -1695,8 +1631,8 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index){
|
|||||||
AssertFatal(0 == 1, "Band %d is a supplementary band (%d). This is not supported yet.\n", nr_bandP, supplementary_bands[j]);
|
AssertFatal(0 == 1, "Band %d is a supplementary band (%d). This is not supported yet.\n", nr_bandP, supplementary_bands[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
AssertFatal(nr_bandP <= nr_bandtable[NR_BANDTABLE_SIZE-1].band, "NR band %d exceeds NR bands table maximum limit %d\n", nr_bandP, nr_bandtable[NR_BANDTABLE_SIZE-1].band);
|
AssertFatal(nr_bandP <= nr_bandtable[nr_bandtable_size-1].band, "NR band %d exceeds NR bands table maximum limit %d\n", nr_bandP, nr_bandtable[nr_bandtable_size-1].band);
|
||||||
for (i = 0; i < NR_BANDTABLE_SIZE && nr_bandtable[i].band != nr_bandP; i++);
|
for (i = 0; i < nr_bandtable_size && nr_bandtable[i].band != nr_bandP; i++);
|
||||||
|
|
||||||
// selection of correct Deltaf raster according to SCS
|
// selection of correct Deltaf raster according to SCS
|
||||||
if ((nr_bandtable[i].deltaf_raster != 100) && (nr_bandtable[i].deltaf_raster != scs_khz))
|
if ((nr_bandtable[i].deltaf_raster != 100) && (nr_bandtable[i].deltaf_raster != scs_khz))
|
||||||
@@ -1705,35 +1641,33 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index){
|
|||||||
LOG_D(PHY, "NR band table index %d (Band %d, dl_min %lu, ul_min %lu)\n", i, nr_bandtable[i].band, nr_bandtable[i].dl_min,nr_bandtable[i].ul_min);
|
LOG_D(PHY, "NR band table index %d (Band %d, dl_min %lu, ul_min %lu)\n", i, nr_bandtable[i].band, nr_bandtable[i].dl_min,nr_bandtable[i].ul_min);
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Computes the duplex spacing (either positive or negative) in KHz
|
// Computes the duplex spacing (either positive or negative) in KHz
|
||||||
void get_delta_duplex(int nr_bandP, uint8_t scs_index, int32_t *delta_duplex){
|
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index)
|
||||||
|
{
|
||||||
int nr_table_idx = get_nr_table_idx(nr_bandP, scs_index);
|
int nr_table_idx = get_nr_table_idx(nr_bandP, scs_index);
|
||||||
|
|
||||||
*delta_duplex = (nr_bandtable[nr_table_idx].ul_min - nr_bandtable[nr_table_idx].dl_min);
|
int32_t delta_duplex = (nr_bandtable[nr_table_idx].ul_min - nr_bandtable[nr_table_idx].dl_min);
|
||||||
|
|
||||||
LOG_D(PHY, "NR band duplex spacing is %d KHz (nr_bandtable[%d].band = %d)\n", *delta_duplex, nr_table_idx, nr_bandtable[nr_table_idx].band);
|
LOG_I(PHY, "NR band duplex spacing is %d KHz (nr_bandtable[%d].band = %d)\n", delta_duplex, nr_table_idx, nr_bandtable[nr_table_idx].band);
|
||||||
|
|
||||||
|
return delta_duplex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_frame_type(uint16_t current_band,
|
lte_frame_type_t get_frame_type(uint16_t current_band, uint8_t scs_index)
|
||||||
uint8_t scs_index,
|
{
|
||||||
lte_frame_type_t *current_type){
|
lte_frame_type_t current_type;
|
||||||
|
int32_t delta_duplex = get_delta_duplex(current_band, scs_index);
|
||||||
|
|
||||||
int32_t current_offset;
|
if (delta_duplex == 0)
|
||||||
get_delta_duplex(current_band, scs_index, ¤t_offset);
|
current_type = TDD;
|
||||||
|
|
||||||
current_offset *= 1000;
|
|
||||||
if (current_offset == 0)
|
|
||||||
*current_type = TDD;
|
|
||||||
else
|
else
|
||||||
*current_type = FDD;
|
current_type = FDD;
|
||||||
|
|
||||||
LOG_I(MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode[*current_type], current_offset);
|
LOG_I(MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode[current_type], delta_duplex);
|
||||||
|
|
||||||
|
return current_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band)
|
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band)
|
||||||
@@ -1911,7 +1845,6 @@ uint64_t from_nrarfcn(int nr_bandP,
|
|||||||
int deltaFglobal = 5;
|
int deltaFglobal = 5;
|
||||||
uint32_t N_REF_Offs = 0;
|
uint32_t N_REF_Offs = 0;
|
||||||
uint64_t F_REF_Offs_khz = 0;
|
uint64_t F_REF_Offs_khz = 0;
|
||||||
int32_t delta_duplex;
|
|
||||||
uint64_t N_OFFs, frequency, freq_min;
|
uint64_t N_OFFs, frequency, freq_min;
|
||||||
int i = get_nr_table_idx(nr_bandP, scs_index);
|
int i = get_nr_table_idx(nr_bandP, scs_index);
|
||||||
|
|
||||||
@@ -1926,7 +1859,7 @@ uint64_t from_nrarfcn(int nr_bandP,
|
|||||||
F_REF_Offs_khz = 24250080;
|
F_REF_Offs_khz = 24250080;
|
||||||
}
|
}
|
||||||
|
|
||||||
get_delta_duplex(nr_bandP, scs_index, &delta_duplex);
|
int32_t delta_duplex = get_delta_duplex(nr_bandP, scs_index);
|
||||||
|
|
||||||
if (delta_duplex <= 0){ // DL band >= UL band
|
if (delta_duplex <= 0){ // DL band >= UL band
|
||||||
if (nrarfcn >= nr_bandtable[i].N_OFFs_DL){ // is TDD of FDD DL
|
if (nrarfcn >= nr_bandtable[i].N_OFFs_DL){ // is TDD of FDD DL
|
||||||
@@ -2836,11 +2769,15 @@ int is_nr_DL_slot(NR_ServingCellConfigCommon_t *scc,slot_t slot) {
|
|||||||
else return(slot_in_period <= slots1+scc->tdd_UL_DL_ConfigurationCommon->pattern2->nrofDownlinkSlots ? 1 : 0);
|
else return(slot_in_period <= slots1+scc->tdd_UL_DL_ConfigurationCommon->pattern2->nrofDownlinkSlots ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int is_nr_UL_slot(NR_ServingCellConfigCommon_t *scc,slot_t slot) {
|
int is_nr_UL_slot(NR_ServingCellConfigCommon_t *scc, slot_t slot, lte_frame_type_t frame_type) {
|
||||||
|
|
||||||
int period,period1,period2=0;
|
int period,period1,period2=0;
|
||||||
|
|
||||||
if (scc->tdd_UL_DL_ConfigurationCommon==NULL) return(1);
|
// Note: condition on frame_type
|
||||||
|
// goal: the UL scheduler assumes mode is TDD therefore this hack is needed to make FDD work
|
||||||
|
if (scc->tdd_UL_DL_ConfigurationCommon == NULL || frame_type == FDD) {
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (scc->tdd_UL_DL_ConfigurationCommon->pattern1.ext1 &&
|
if (scc->tdd_UL_DL_ConfigurationCommon->pattern1.ext1 &&
|
||||||
scc->tdd_UL_DL_ConfigurationCommon->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530)
|
scc->tdd_UL_DL_ConfigurationCommon->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530)
|
||||||
@@ -3067,48 +3004,6 @@ bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
|
|||||||
//printf("[MAC] PTRS is set K= %u L= %u\n", *K_ptrs,1<<*L_ptrs);
|
//printf("[MAC] PTRS is set K= %u L= %u\n", *K_ptrs,1<<*L_ptrs);
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
void get_band(uint64_t downlink_frequency,
|
|
||||||
uint16_t *current_band,
|
|
||||||
int32_t *current_offset,
|
|
||||||
lte_frame_type_t *current_type)
|
|
||||||
{
|
|
||||||
int ind;
|
|
||||||
uint64_t center_frequency_khz;
|
|
||||||
uint64_t center_freq_diff_khz;
|
|
||||||
uint64_t dl_freq_khz = downlink_frequency/1000;
|
|
||||||
|
|
||||||
center_freq_diff_khz = 999999999999999999; // 2^64
|
|
||||||
*current_band = 0;
|
|
||||||
|
|
||||||
for ( ind=0;
|
|
||||||
ind < sizeof(nr_bandtable) / sizeof(nr_bandtable[0]);
|
|
||||||
ind++) {
|
|
||||||
|
|
||||||
LOG_I(PHY, "Scanning band %d, dl_min %"PRIu64", ul_min %"PRIu64"\n", nr_bandtable[ind].band, nr_bandtable[ind].dl_min,nr_bandtable[ind].ul_min);
|
|
||||||
|
|
||||||
if ( nr_bandtable[ind].dl_min <= dl_freq_khz && nr_bandtable[ind].dl_max >= dl_freq_khz ) {
|
|
||||||
|
|
||||||
center_frequency_khz = (nr_bandtable[ind].dl_max + nr_bandtable[ind].dl_min)/2;
|
|
||||||
if (abs(dl_freq_khz - center_frequency_khz) < center_freq_diff_khz){
|
|
||||||
*current_band = nr_bandtable[ind].band;
|
|
||||||
*current_offset = (nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min)*1000;
|
|
||||||
center_freq_diff_khz = abs(dl_freq_khz - center_frequency_khz);
|
|
||||||
|
|
||||||
if (*current_offset == 0)
|
|
||||||
*current_type = TDD;
|
|
||||||
else
|
|
||||||
*current_type = FDD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_I( PHY, "DL frequency %"PRIu64": band %d, frame_type %d, UL frequency %"PRIu64"\n",
|
|
||||||
downlink_frequency, *current_band, *current_type, downlink_frequency+*current_offset);
|
|
||||||
|
|
||||||
AssertFatal(*current_band != 0,
|
|
||||||
"Can't find EUTRA band for frequency %lu\n", downlink_frequency);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t get_ssb_slot(uint32_t ssb_index){
|
uint32_t get_ssb_slot(uint32_t ssb_index){
|
||||||
// this function now only support f <= 3GHz
|
// this function now only support f <= 3GHz
|
||||||
|
|||||||
@@ -39,9 +39,9 @@
|
|||||||
|
|
||||||
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
|
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
|
||||||
|
|
||||||
void get_frame_type(uint16_t nr_bandP, uint8_t scs_index, lte_frame_type_t *current_type);
|
lte_frame_type_t get_frame_type(uint16_t nr_bandP, uint8_t scs_index);
|
||||||
|
|
||||||
void get_delta_duplex(int nr_bandP, uint8_t scs_index, int32_t *delta_duplex);
|
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index);
|
||||||
|
|
||||||
uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn);
|
uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn);
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,i
|
|||||||
|
|
||||||
int is_nr_DL_slot(NR_ServingCellConfigCommon_t *scc,slot_t slotP);
|
int is_nr_DL_slot(NR_ServingCellConfigCommon_t *scc,slot_t slotP);
|
||||||
|
|
||||||
int is_nr_UL_slot(NR_ServingCellConfigCommon_t *scc,slot_t slotP);
|
int is_nr_UL_slot(NR_ServingCellConfigCommon_t *scc, slot_t slotP, lte_frame_type_t frame_type);
|
||||||
|
|
||||||
uint16_t nr_dci_size(const NR_ServingCellConfigCommon_t *scc,
|
uint16_t nr_dci_size(const NR_ServingCellConfigCommon_t *scc,
|
||||||
const NR_CellGroupConfig_t *secondaryCellGroup,
|
const NR_CellGroupConfig_t *secondaryCellGroup,
|
||||||
@@ -140,7 +140,6 @@ bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
|
|||||||
uint8_t *K_ptrs, uint8_t *L_ptrs,uint8_t *portIndex,
|
uint8_t *K_ptrs, uint8_t *L_ptrs,uint8_t *portIndex,
|
||||||
uint8_t *nERatio,uint8_t *reOffset,
|
uint8_t *nERatio,uint8_t *reOffset,
|
||||||
uint8_t NrOfSymbols);
|
uint8_t NrOfSymbols);
|
||||||
void get_band(uint64_t downlink_frequency, uint16_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type);
|
|
||||||
|
|
||||||
uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols);
|
uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols);
|
||||||
|
|
||||||
|
|||||||
@@ -203,13 +203,12 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
|
|||||||
uint32_t band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
uint32_t band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
||||||
frequency_range_t frequency_range = band<100?FR1:FR2;
|
frequency_range_t frequency_range = band<100?FR1:FR2;
|
||||||
|
|
||||||
lte_frame_type_t frame_type;
|
mac->frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
|
||||||
get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing, &frame_type);
|
|
||||||
|
|
||||||
// cell config
|
// cell config
|
||||||
|
|
||||||
cfg->cell_config.phy_cell_id = *scc->physCellId;
|
cfg->cell_config.phy_cell_id = *scc->physCellId;
|
||||||
cfg->cell_config.frame_duplex_type = frame_type;
|
cfg->cell_config.frame_duplex_type = mac->frame_type;
|
||||||
|
|
||||||
// SSB config
|
// SSB config
|
||||||
cfg->ssb_config.ss_pbch_power = scc->ss_PBCH_BlockPower;
|
cfg->ssb_config.ss_pbch_power = scc->ss_PBCH_BlockPower;
|
||||||
@@ -313,7 +312,7 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
|
|||||||
|
|
||||||
cfg->prach_config.num_prach_fd_occasions_list[i].k1 = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart;
|
cfg->prach_config.num_prach_fd_occasions_list[i].k1 = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart;
|
||||||
cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig;
|
cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig;
|
||||||
cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup, nb_preambles, frame_type,frequency_range);
|
cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup, nb_preambles, mac->frame_type, frequency_range);
|
||||||
//cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ???
|
//cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ???
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -325,6 +325,8 @@ typedef struct {
|
|||||||
NR_ControlResourceSet_t *coreset[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP];
|
NR_ControlResourceSet_t *coreset[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP];
|
||||||
NR_SearchSpace_t *SSpace[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP][FAPI_NR_MAX_SS_PER_CORESET];
|
NR_SearchSpace_t *SSpace[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP][FAPI_NR_MAX_SS_PER_CORESET];
|
||||||
|
|
||||||
|
lte_frame_type_t frame_type;
|
||||||
|
|
||||||
/*BWP*/
|
/*BWP*/
|
||||||
// dedicated active DL BWP
|
// dedicated active DL BWP
|
||||||
NR_BWP_Id_t DL_BWP_Id;
|
NR_BWP_Id_t DL_BWP_Id;
|
||||||
|
|||||||
@@ -2230,7 +2230,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
|
|||||||
|
|
||||||
// TA command
|
// TA command
|
||||||
ul_time_alignment->apply_ta = 1;
|
ul_time_alignment->apply_ta = 1;
|
||||||
ul_time_alignment->ta_command = rar->TA2 + (rar->TA1 << 5);
|
ul_time_alignment->ta_command = 31 + rar->TA2 + (rar->TA1 << 5);
|
||||||
|
|
||||||
#ifdef DEBUG_RAR
|
#ifdef DEBUG_RAR
|
||||||
// CSI
|
// CSI
|
||||||
|
|||||||
@@ -118,13 +118,14 @@ long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) {
|
|||||||
* This function returns the UL config corresponding to a given UL slot
|
* This function returns the UL config corresponding to a given UL slot
|
||||||
* from MAC instance .
|
* from MAC instance .
|
||||||
*/
|
*/
|
||||||
fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int slot) {
|
fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int slot)
|
||||||
|
{
|
||||||
//Check if request to access ul_config is for a UL slot
|
//Check if request to access ul_config is for a UL slot
|
||||||
if (is_nr_UL_slot(mac->scc, slot) == 0) {
|
if (is_nr_UL_slot(mac->scc, slot, mac->frame_type) == 0) {
|
||||||
LOG_W(MAC, "Slot %d is not a UL slot. %s called for wrong slot!!!\n", slot, __FUNCTION__);
|
LOG_W(MAC, "Slot %d is not a UL slot. %s called for wrong slot!!!\n", slot, __FUNCTION__);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the index of the UL slot in mac->ul_config_request list. This is
|
// Calculate the index of the UL slot in mac->ul_config_request list. This is
|
||||||
// based on the TDD pattern (slot configuration period) and number of UL+mixed
|
// based on the TDD pattern (slot configuration period) and number of UL+mixed
|
||||||
// slots in the period. TS 38.213 Sec 11.1
|
// slots in the period. TS 38.213 Sec 11.1
|
||||||
@@ -1662,7 +1663,7 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
|
|||||||
ra->RA_offset = 2; // to compensate the rx frame offset at the gNB
|
ra->RA_offset = 2; // to compensate the rx frame offset at the gNB
|
||||||
ra->generate_nr_prach = 0; // Reset flag for PRACH generation
|
ra->generate_nr_prach = 0; // Reset flag for PRACH generation
|
||||||
|
|
||||||
if (is_nr_UL_slot(scc, slotP)) {
|
if (is_nr_UL_slot(scc, slotP, mac->frame_type)) {
|
||||||
|
|
||||||
// WIP Need to get the proper selected ssb_idx
|
// WIP Need to get the proper selected ssb_idx
|
||||||
// Initial beam selection functionality is not available yet
|
// Initial beam selection functionality is not available yet
|
||||||
@@ -1683,13 +1684,11 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
|
|||||||
format0 = format & 0xff; // single PRACH format
|
format0 = format & 0xff; // single PRACH format
|
||||||
format1 = (format >> 8) & 0xff; // dual PRACH format
|
format1 = (format >> 8) & 0xff; // dual PRACH format
|
||||||
|
|
||||||
ul_config->sfn = frameP;
|
|
||||||
ul_config->slot = slotP;
|
|
||||||
|
|
||||||
ul_config->ul_config_list[ul_config->number_pdus].pdu_type = FAPI_NR_UL_CONFIG_TYPE_PRACH;
|
|
||||||
prach_config_pdu = &ul_config->ul_config_list[ul_config->number_pdus].prach_config_pdu;
|
prach_config_pdu = &ul_config->ul_config_list[ul_config->number_pdus].prach_config_pdu;
|
||||||
memset(prach_config_pdu, 0, sizeof(fapi_nr_ul_config_prach_pdu));
|
memset(prach_config_pdu, 0, sizeof(fapi_nr_ul_config_prach_pdu));
|
||||||
ul_config->number_pdus += 1;
|
|
||||||
|
fill_ul_config(ul_config, frameP, slotP, FAPI_NR_UL_CONFIG_TYPE_PRACH);
|
||||||
|
|
||||||
LOG_D(PHY, "In %s: (%p) %d UL PDUs:\n", __FUNCTION__, ul_config, ul_config->number_pdus);
|
LOG_D(PHY, "In %s: (%p) %d UL PDUs:\n", __FUNCTION__, ul_config, ul_config->number_pdus);
|
||||||
|
|
||||||
ncs = get_NCS(rach_ConfigGeneric->zeroCorrelationZoneConfig, format0, setup->restrictedSetConfig);
|
ncs = get_NCS(rach_ConfigGeneric->zeroCorrelationZoneConfig, format0, setup->restrictedSetConfig);
|
||||||
@@ -1767,11 +1766,10 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
|
|||||||
AssertFatal(1 == 0, "Invalid PRACH format");
|
AssertFatal(1 == 0, "Invalid PRACH format");
|
||||||
}
|
}
|
||||||
} // if format1
|
} // if format1
|
||||||
|
fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, thread_id);
|
||||||
|
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
|
||||||
|
mac->if_module->scheduled_response(&scheduled_response);
|
||||||
} // is_nr_prach_slot
|
} // is_nr_prach_slot
|
||||||
|
|
||||||
fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, thread_id);
|
|
||||||
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
|
|
||||||
mac->if_module->scheduled_response(&scheduled_response);
|
|
||||||
} // if is_nr_UL_slot
|
} // if is_nr_UL_slot
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -127,8 +127,7 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
|
|||||||
uint32_t band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
uint32_t band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
||||||
frequency_range_t frequency_range = band<100?FR1:FR2;
|
frequency_range_t frequency_range = band<100?FR1:FR2;
|
||||||
|
|
||||||
lte_frame_type_t frame_type;
|
lte_frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
|
||||||
get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing, &frame_type);
|
|
||||||
RC.nrmac[Mod_idP]->common_channels[0].frame_type = frame_type;
|
RC.nrmac[Mod_idP]->common_channels[0].frame_type = frame_type;
|
||||||
|
|
||||||
// Cell configuration
|
// Cell configuration
|
||||||
|
|||||||
@@ -245,7 +245,8 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
|
|||||||
nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[0][slotP];
|
nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[0][slotP];
|
||||||
nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[module_idP]->config[0];
|
nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[module_idP]->config[0];
|
||||||
|
|
||||||
if (is_nr_UL_slot(scc,slotP)) {
|
if (is_nr_UL_slot(scc, slotP, cc->frame_type)) {
|
||||||
|
|
||||||
uint8_t config_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex;
|
uint8_t config_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex;
|
||||||
uint8_t mu,N_dur,N_t_slot,start_symbol = 0,N_RA_slot;
|
uint8_t mu,N_dur,N_t_slot,start_symbol = 0,N_RA_slot;
|
||||||
uint16_t RA_sfn_index = -1;
|
uint16_t RA_sfn_index = -1;
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
|
|||||||
|
|
||||||
ret = nr_ue_scheduler(NULL, ul_info);
|
ret = nr_ue_scheduler(NULL, ul_info);
|
||||||
|
|
||||||
if (is_nr_UL_slot(mac->scc, ul_info->slot_tx) && get_softmodem_params()->do_ra)
|
if (is_nr_UL_slot(mac->scc, ul_info->slot_tx, mac->frame_type) && get_softmodem_params()->do_ra)
|
||||||
nr_ue_prach_scheduler(module_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->thread_id);
|
nr_ue_prach_scheduler(module_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->thread_id);
|
||||||
|
|
||||||
switch(ret){
|
switch(ret){
|
||||||
|
|||||||
Reference in New Issue
Block a user