Merge remote-tracking branch 'origin/develop' into Dedicated-BWPs
# Conflicts: # openair2/GNB_APP/gnb_config.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c # openair2/RRC/NR/L2_nr_interface.c # openair2/RRC/NR/MESSAGES/asn1_msg.c # openair2/RRC/NR/MESSAGES/asn1_msg.h # openair2/RRC/NR/nr_rrc_defs.h # openair2/RRC/NR/nr_rrc_proto.h # openair2/RRC/NR/rrc_gNB_reconfig.c
This commit is contained in:
+319
-98
@@ -101,31 +101,37 @@ static const eutra_bandentry_t eutra_bandtable[] = {
|
||||
|
||||
uint32_t to_earfcn_DL_aw2s(int eutra_bandP, long long int dl_CarrierFreq, uint32_t bw) {
|
||||
uint32_t dl_CarrierFreq_by_100k = dl_CarrierFreq / 100000;
|
||||
int i;
|
||||
int i=0;
|
||||
if (eutra_bandP > 68) { printf("eutra_band %d > 68\n", eutra_bandP); exit(-1);}
|
||||
|
||||
for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
|
||||
|
||||
printf("AW2S: band %d, index %d\n",eutra_bandP, i);
|
||||
|
||||
if (eutra_bandP > 0)
|
||||
for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
|
||||
printf("AW2S: band %d: index %d\n",eutra_bandP, i);
|
||||
|
||||
if (i >= BANDTABLE_SIZE) { printf(" i = %d , it will trigger out-of-bounds read.\n",i); exit(-1);}
|
||||
|
||||
if (dl_CarrierFreq_by_100k < eutra_bandtable[i].dl_min) {
|
||||
printf("Band %d, bw %u : DL carrier frequency %u .1 MHz < %u\n",
|
||||
eutra_bandP, bw, dl_CarrierFreq_by_100k,
|
||||
eutra_bandtable[i].dl_min); exit(-1);}
|
||||
while(i<BANDTABLE_SIZE) {
|
||||
if (dl_CarrierFreq_by_100k < eutra_bandtable[i].dl_min) {
|
||||
printf("Band %d, bw %u : DL carrier frequency %u .1 MHz < %u\n",
|
||||
eutra_bandtable[i].band, bw, dl_CarrierFreq_by_100k,
|
||||
eutra_bandtable[i].dl_min); i++; continue;}
|
||||
|
||||
if(dl_CarrierFreq_by_100k >
|
||||
(eutra_bandtable[i].dl_max - bw)) {
|
||||
printf("Band %d, bw %u : DL carrier frequency %u .1MHz > %d\n",
|
||||
eutra_bandP, bw, dl_CarrierFreq_by_100k,
|
||||
eutra_bandtable[i].dl_max - bw); exit(-1); }
|
||||
printf("AW2S: dl_CarrierFreq_by_100k %d, dl_min %d\n",dl_CarrierFreq_by_100k,eutra_bandtable[i].dl_min);
|
||||
if(dl_CarrierFreq_by_100k >
|
||||
(eutra_bandtable[i].dl_max - bw)) {
|
||||
printf("Band %d, bw %u : DL carrier frequency %u .1MHz > %d\n",
|
||||
eutra_bandtable[i].band, bw, dl_CarrierFreq_by_100k,
|
||||
eutra_bandtable[i].dl_max - bw); i++;continue; }
|
||||
printf("AW2S: dl_CarrierFreq_by_100k %d, dl_min %d\n",dl_CarrierFreq_by_100k,eutra_bandtable[i].dl_min);
|
||||
|
||||
return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min +
|
||||
(eutra_bandtable[i].N_OFFs_DL / 10));
|
||||
return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min +
|
||||
(eutra_bandtable[i].N_OFFs_DL / 10));
|
||||
|
||||
}
|
||||
printf("No DL band found\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
uint32_t to_earfcn_UL_aw2s(int eutra_bandP, long long int ul_CarrierFreq, uint32_t bw) {
|
||||
uint32_t ul_CarrierFreq_by_100k = ul_CarrierFreq / 100000;
|
||||
int i;
|
||||
@@ -134,6 +140,7 @@ uint32_t to_earfcn_UL_aw2s(int eutra_bandP, long long int ul_CarrierFreq, uint32
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
|
||||
|
||||
if(i >= BANDTABLE_SIZE) {printf("i = %d , it will trigger out-of-bounds read.\n",i); exit(-1);}
|
||||
@@ -221,15 +228,41 @@ int aw2s_startstreaming(openair0_device *device) {
|
||||
ORI_Result_e RE_result;
|
||||
|
||||
openair0_config_t *openair0_cfg = device->openair0_cfg;
|
||||
ORI_Object_s *tx0,*tx1,*tx2,*tx3,*rx0,*rx1,*rx2,*rx3;
|
||||
if (openair0_cfg->nr_flag == 0 ) {
|
||||
tx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_TxEUtraFDD :ORI_ObjectType_TxEUtraTDD, 0, NULL);
|
||||
tx1= (openair0_cfg->tx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxEUtraTDD, 1, NULL) : NULL;
|
||||
tx2= (openair0_cfg->tx_num_channels > 2) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxEUtraTDD, 2, NULL) : NULL;
|
||||
tx3= (openair0_cfg->tx_num_channels > 3) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxEUtraTDD, 3, NULL) : NULL;
|
||||
rx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 0, NULL);
|
||||
rx1= (openair0_cfg->rx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 1, NULL) : NULL;
|
||||
rx2= (openair0_cfg->rx_num_channels > 2) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 2, NULL) : NULL;
|
||||
rx3= (openair0_cfg->rx_num_channels > 3) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 3, NULL) : NULL;
|
||||
} else {
|
||||
tx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_TxNRFDD :ORI_ObjectType_TxNRTDD, 0, NULL);
|
||||
tx1= (openair0_cfg->tx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_TxNRFDD : ORI_ObjectType_TxNRTDD, 1, NULL) : NULL;
|
||||
tx2= (openair0_cfg->tx_num_channels > 2) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_TxNRFDD : ORI_ObjectType_TxNRTDD, 2, NULL) : NULL;
|
||||
tx3= (openair0_cfg->tx_num_channels > 3) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_TxNRFDD : ORI_ObjectType_TxNRTDD, 3, NULL) : NULL;
|
||||
rx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxNRFDD : ORI_ObjectType_RxNRTDD, 0, NULL);
|
||||
rx1= (openair0_cfg->rx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxNRFDD : ORI_ObjectType_RxNRTDD, 1, NULL) : NULL;
|
||||
rx2= (openair0_cfg->rx_num_channels > 2) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxNRFDD : ORI_ObjectType_RxNRTDD, 2, NULL) : NULL;
|
||||
rx3= (openair0_cfg->rx_num_channels > 3) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxNRFDD : ORI_ObjectType_RxNRTDD, 3, NULL) : NULL;
|
||||
|
||||
ORI_Object_s *tx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_TxEUtraFDD :ORI_ObjectType_TxEUtraTDD, 0, NULL);
|
||||
ORI_Object_s *tx1= (openair0_cfg->tx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxEUtraTDD, 1, NULL) : NULL;
|
||||
ORI_Object_s *rx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 0, NULL);
|
||||
ORI_Object_s *rx1= (openair0_cfg->rx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 1, NULL) : NULL;
|
||||
}
|
||||
ORI_Object_s *link= ORI_FindObject(ori, ORI_ObjectType_ORILink, 0, NULL);
|
||||
|
||||
if (tx0 == NULL || (tx1 == NULL && openair0_cfg->tx_num_channels > 1) || rx0 == NULL || (rx1 == NULL && openair0_cfg->rx_num_channels > 1) || link == NULL) return (-1);
|
||||
|
||||
if (tx0 == NULL ||
|
||||
(tx1 == NULL && openair0_cfg->tx_num_channels > 1) ||
|
||||
(tx2 == NULL && openair0_cfg->tx_num_channels > 2) ||
|
||||
(tx3 == NULL && openair0_cfg->tx_num_channels > 3) ||
|
||||
rx0 == NULL ||
|
||||
(rx1 == NULL && openair0_cfg->rx_num_channels > 1) ||
|
||||
(rx2 == NULL && openair0_cfg->rx_num_channels > 2) ||
|
||||
(rx3 == NULL && openair0_cfg->rx_num_channels > 3) ||
|
||||
link == NULL) {
|
||||
printf("tx0 %p, tx1 %p, tx2 %p, tx3 %p, rx0 %p, rx1 %p, rx2 %p, rx3 %p\n",tx0,tx1,tx2,tx3,rx0,rx1,rx2,rx3);
|
||||
return (-1);
|
||||
}
|
||||
/*******************************************************************
|
||||
* UNLOCK Link
|
||||
*******************************************************************/
|
||||
@@ -277,6 +310,40 @@ int aw2s_startstreaming(openair0_device *device) {
|
||||
}
|
||||
printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
/*******************************************************************
|
||||
* UNLOCK TX2
|
||||
*******************************************************************/
|
||||
|
||||
if (tx2) {
|
||||
printf("\n\n\n========================================================\n");
|
||||
|
||||
/* Put Tx1 into service */
|
||||
result = ORI_ObjectStateModification(ori, tx2, ORI_AST_Unlocked, &RE_result);
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
/*******************************************************************
|
||||
* UNLOCK TX3
|
||||
*******************************************************************/
|
||||
|
||||
if (tx3) {
|
||||
printf("\n\n\n========================================================\n");
|
||||
|
||||
/* Put Tx3 into service */
|
||||
result = ORI_ObjectStateModification(ori, tx1, ORI_AST_Unlocked, &RE_result);
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
/*******************************************************************
|
||||
* UNLOCK RX0
|
||||
*******************************************************************/
|
||||
@@ -313,16 +380,51 @@ int aw2s_startstreaming(openair0_device *device) {
|
||||
printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
* UNLOCK RX2
|
||||
*******************************************************************/
|
||||
if (rx2) {
|
||||
printf("\n\n\n========================================================\n");
|
||||
|
||||
/* Put Rx1 into service */
|
||||
result = ORI_ObjectStateModification(ori, rx2, ORI_AST_Unlocked, &RE_result);
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
/*******************************************************************
|
||||
* UNLOCK RX3
|
||||
*******************************************************************/
|
||||
if (rx3) {
|
||||
printf("\n\n\n========================================================\n");
|
||||
|
||||
/* Put Rx1 into service */
|
||||
result = ORI_ObjectStateModification(ori, rx3, ORI_AST_Unlocked, &RE_result);
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
/*
|
||||
while (rx0->fst != ORI_FST_Operational ||
|
||||
(openair0_cfg->rx_num_channels > 1 && rx1->fst != ORI_FST_Operational) ||
|
||||
tx0->fst != ORI_FST_Operational ||
|
||||
(openair0_cfg->tx_num_channels > 1 && tx1->fst != ORI_FST_Operational))
|
||||
{}
|
||||
|
||||
{}*/
|
||||
// test RX interface
|
||||
uint64_t TS;
|
||||
char temp_rx[1024] __attribute__((aligned(32)));
|
||||
char temp_rx[2048] __attribute__((aligned(32)));
|
||||
int aid,r0=0,r1=(openair0_cfg->rx_num_channels > 1) ? 0 : 1;
|
||||
int r2=(openair0_cfg->rx_num_channels > 2) ? 0 : 1;
|
||||
int r3=(openair0_cfg->rx_num_channels > 3) ? 0 : 1;
|
||||
|
||||
int i;
|
||||
int Npackets=1024000;
|
||||
for (i=0;i<Npackets;i++) {
|
||||
@@ -333,15 +435,23 @@ int aw2s_startstreaming(openair0_device *device) {
|
||||
&aid);
|
||||
if (aid == 0) r0=1;
|
||||
if (aid == 1) r1=1;
|
||||
if (aid == 2) r2=1;
|
||||
if (aid == 3) r3=1;
|
||||
}
|
||||
if (r0==1 && r1==1) printf("Streaming started, returning to OAI\n");
|
||||
if (r0==1 && r1==1 && r2==1 && r3==1) printf("Streaming started, returning to OAI\n");
|
||||
else {
|
||||
printf("Didn't get anything from one antenna port after %d packets %d,%d\n",Npackets,r0,r1);
|
||||
printf("Didn't get anything from one antenna port after %d packets %d,%d,%d,%d\n",Npackets,r0,r1,r2,r3);
|
||||
return(-1);
|
||||
}
|
||||
return(0);
|
||||
|
||||
}
|
||||
|
||||
uint32_t to_nrarfcn(int nr_bandP,
|
||||
uint64_t dl_CarrierFreq,
|
||||
uint8_t scs_index,
|
||||
uint32_t bw);
|
||||
|
||||
int aw2s_oriinit(openair0_device *device) {
|
||||
|
||||
|
||||
@@ -430,60 +540,65 @@ int aw2s_oriinit(openair0_device *device) {
|
||||
*******************************************************************/
|
||||
|
||||
/* Prepare parameters */
|
||||
ORI_ObjectTypeRef_s txTypeRef = { NULL, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxEUtraTDD};
|
||||
ORI_ObjectTypeRef_s txTypeRef = { NULL, openair0_cfg->duplex_mode == duplex_mode_FDD ?
|
||||
(openair0_cfg->nr_flag == 0 ? ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxNRFDD):
|
||||
(openair0_cfg->nr_flag == 0 ? ORI_ObjectType_TxEUtraTDD : ORI_ObjectType_TxNRTDD)};
|
||||
ORI_ObjectParams_u txParams;
|
||||
ORI_ObjectParam_e txParamList[9];
|
||||
ORI_Result_e txParamResult[9];
|
||||
int num_txparams;
|
||||
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD) {
|
||||
txParamList[0] = ORI_ObjectParam_SigPath_antPort;
|
||||
txParamList[1] = ORI_ObjectParam_SigPath_axcW;
|
||||
txParamList[2] = ORI_ObjectParam_SigPath_axcB;
|
||||
txParamList[3] = ORI_ObjectParam_SigPath_chanBW;
|
||||
txParamList[4] = ORI_ObjectParam_SigPath_earfcn;
|
||||
txParamList[5] = ORI_ObjectParam_TxSigPath_maxTxPwr;
|
||||
num_txparams = 6;
|
||||
}
|
||||
else {
|
||||
txParamList[0] = ORI_ObjectParam_SigPath_antPort;
|
||||
txParamList[1] = ORI_ObjectParam_SigPath_axcW;
|
||||
txParamList[2] = ORI_ObjectParam_SigPath_axcB;
|
||||
txParamList[3] = ORI_ObjectParam_SigPath_chanBW;
|
||||
txParamList[4] = ORI_ObjectParam_SigPath_earfcn;
|
||||
txParamList[5] = ORI_ObjectParam_TxSigPath_maxTxPwr;
|
||||
txParamList[6] = ORI_ObjectParam_SigPath_tddULDLConfig;
|
||||
txParamList[7] = ORI_ObjectParam_SigPath_tddSpecialSFConfig;
|
||||
txParamList[8] = ORI_ObjectParam_TxSigPath_tddCPLengthDL;
|
||||
num_txparams = 9;
|
||||
}
|
||||
txParamList[0] = ORI_ObjectParam_SigPath_antPort;
|
||||
txParamList[1] = ORI_ObjectParam_SigPath_axcW;
|
||||
txParamList[2] = ORI_ObjectParam_SigPath_axcB;
|
||||
txParamList[3] = ORI_ObjectParam_SigPath_chanBW;
|
||||
txParamList[4] = (openair0_cfg->nr_flag ==0) ? ORI_ObjectParam_SigPath_earfcn : ORI_ObjectParam_SigPath_AWS_arfcn;
|
||||
txParamList[5] = ORI_ObjectParam_TxSigPath_maxTxPwr;
|
||||
num_txparams = 6;
|
||||
|
||||
|
||||
/* Create tx0 */
|
||||
ORI_Object_s * tx0;
|
||||
printf("AW2S: duplex_mode %d, tx_bw %f, rx_bw %f\n",openair0_cfg->duplex_mode,openair0_cfg->tx_bw,openair0_cfg->rx_bw);
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD) {
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 0) {
|
||||
txParams.TxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
|
||||
txParams.TxEUtraFDD.axcW = 1;
|
||||
txParams.TxEUtraFDD.axcB = 0;
|
||||
txParams.TxEUtraFDD.chanBW = openair0_cfg->tx_bw/100e3;
|
||||
txParams.TxEUtraFDD.earfcn = 3350;
|
||||
txParams.TxEUtraFDD.maxTxPwr = -100;
|
||||
txParams.TxEUtraTDD.earfcn = to_earfcn_DL_aw2s(-1,(long long int)openair0_cfg->tx_freq[0],txParams.TxEUtraTDD.chanBW);
|
||||
txParams.TxEUtraFDD.maxTxPwr = 430-((int)openair0_cfg->tx_gain[0]*10);
|
||||
}
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD) {
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 1) {
|
||||
txParams.TxNRFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
|
||||
txParams.TxNRFDD.axcW = 1;
|
||||
txParams.TxNRFDD.axcB = 0;
|
||||
txParams.TxNRFDD.chanBW = openair0_cfg->tx_bw/100e3;
|
||||
|
||||
txParams.TxNRFDD.AWS_arfcn = to_nrarfcn(openair0_cfg->nr_band,(long long int)openair0_cfg->tx_freq[0],openair0_cfg->nr_scs_for_raster,(uint32_t)openair0_cfg->tx_bw);
|
||||
txParams.TxNRFDD.maxTxPwr = 430-((int)openair0_cfg->tx_gain[0]*10);
|
||||
}
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 0) {
|
||||
txParams.TxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
|
||||
txParams.TxEUtraTDD.axcW = 1;
|
||||
txParams.TxEUtraTDD.axcB = 0;
|
||||
txParams.TxEUtraTDD.chanBW = openair0_cfg->tx_bw/100e3;
|
||||
txParams.TxEUtraTDD.earfcn = to_earfcn_DL_aw2s(38,(long long int)openair0_cfg->tx_freq[0],txParams.TxEUtraTDD.chanBW);
|
||||
txParams.TxEUtraTDD.earfcn = to_earfcn_DL_aw2s(-1,(long long int)openair0_cfg->tx_freq[0],txParams.TxEUtraTDD.chanBW);
|
||||
txParams.TxEUtraTDD.maxTxPwr = 430-((int)openair0_cfg->tx_gain[0]*10);
|
||||
txParams.TxEUtraTDD.tddULDLConfig = 1;
|
||||
txParams.TxEUtraTDD.tddSpecialSFConfig = 0;
|
||||
txParams.TxEUtraTDD.tddCPLengthDL = ORI_tddCPLength_Normal;
|
||||
|
||||
printf("AW2S: Configuring for TDD, EARFCN %u, Power %d, BW %d\n",
|
||||
printf("AW2S: Configuring for LTE TDD, EARFCN %u, Power %d, BW %d\n",
|
||||
txParams.TxEUtraTDD.earfcn,txParams.TxEUtraTDD.maxTxPwr,txParams.TxEUtraTDD.chanBW);
|
||||
}
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 1) {
|
||||
txParams.TxNRTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
|
||||
txParams.TxNRTDD.axcW = 1;
|
||||
txParams.TxNRTDD.axcB = 0;
|
||||
txParams.TxNRTDD.chanBW = openair0_cfg->tx_bw/100e3;
|
||||
txParams.TxNRTDD.AWS_arfcn = to_nrarfcn(openair0_cfg->nr_band,(long long int)openair0_cfg->tx_freq[0],openair0_cfg->nr_scs_for_raster,(uint32_t)openair0_cfg->tx_bw);
|
||||
txParams.TxNRTDD.maxTxPwr = 430-((int)openair0_cfg->tx_gain[0]*10);
|
||||
|
||||
printf("AW2S: Configuring for NR TDD, NRARFCN %u, Power %d, BW %d\n",
|
||||
txParams.TxNRTDD.AWS_arfcn,txParams.TxNRTDD.maxTxPwr,txParams.TxNRTDD.chanBW);
|
||||
}
|
||||
else {
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
@@ -491,37 +606,78 @@ int aw2s_oriinit(openair0_device *device) {
|
||||
result = ORI_ObjectCreation(ori, txTypeRef, txParams, txParamList, num_txparams, txParamResult, &tx0, &RE_result);
|
||||
if(RE_result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectCreation (txParams0.TxEUtraFDD/TDD) failed with error: %s (%s,%s,%s,%s,%s,%s,%s,%s,%s\n", ORI_Result_Print(result),
|
||||
printf("ORI_ObjectCreation (txParams0.TxEUtra/NR/FDD/TDD) failed with error: %s (%s,%s,%s,%s,%s,%s\n", ORI_Result_Print(RE_result),
|
||||
ORI_Result_Print(txParamResult[0]),
|
||||
ORI_Result_Print(txParamResult[1]),
|
||||
ORI_Result_Print(txParamResult[2]),
|
||||
ORI_Result_Print(txParamResult[3]),
|
||||
ORI_Result_Print(txParamResult[4]),
|
||||
ORI_Result_Print(txParamResult[5]),
|
||||
ORI_Result_Print(txParamResult[6]),
|
||||
ORI_Result_Print(txParamResult[7]),
|
||||
ORI_Result_Print(txParamResult[8]));
|
||||
ORI_Result_Print(txParamResult[5]));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectCreation (txParams0.TxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
printf("ORI_ObjectCreation (txParams0.TxEUtra/NR/FDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
|
||||
|
||||
/* Create tx1 */
|
||||
if (openair0_cfg->tx_num_channels > 1) {
|
||||
ORI_Object_s * tx1;
|
||||
if (openair0_cfg->duplex_mode ==duplex_mode_FDD) txParams.TxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
else txParams.TxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 0)
|
||||
txParams.TxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 1)
|
||||
txParams.TxNRFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 0)
|
||||
txParams.TxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 1)
|
||||
txParams.TxNRTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
result = ORI_ObjectCreation(ori, txTypeRef, txParams, txParamList, num_txparams, txParamResult, &tx1, &RE_result);
|
||||
if(RE_result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectCreation (txParams1.TxEUtraFDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
|
||||
printf("ORI_ObjectCreation (txParams1.TxEUtra/NR/FDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectCreation (txParams1.TxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
printf("ORI_ObjectCreation (txParams1.TxEUtra/NR/FDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
|
||||
if (openair0_cfg->tx_num_channels > 2) {
|
||||
ORI_Object_s * tx2;
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 0)
|
||||
txParams.TxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 2, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 1)
|
||||
txParams.TxNRFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 2, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 0)
|
||||
txParams.TxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 2, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 1)
|
||||
txParams.TxNRTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 2, NULL);
|
||||
result = ORI_ObjectCreation(ori, txTypeRef, txParams, txParamList, num_txparams, txParamResult, &tx2, &RE_result);
|
||||
if(RE_result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectCreation (txParams2.TxEUtra/NR/FDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectCreation (txParams2.TxEUtra/NR/FDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
if (openair0_cfg->tx_num_channels == 4) {
|
||||
ORI_Object_s * tx3;
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 0)
|
||||
txParams.TxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 3, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 1)
|
||||
txParams.TxNRFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 3, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 0)
|
||||
txParams.TxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 3, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 1)
|
||||
txParams.TxNRTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 3, NULL);
|
||||
result = ORI_ObjectCreation(ori, txTypeRef, txParams, txParamList, num_txparams, txParamResult, &tx3, &RE_result);
|
||||
if(RE_result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectCreation (txParams3.TxEUtra/NRFDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectCreation (txParams3.TxEUtra/NRFDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
@@ -529,42 +685,56 @@ int aw2s_oriinit(openair0_device *device) {
|
||||
*******************************************************************/
|
||||
|
||||
/* Prepare parameters */
|
||||
ORI_ObjectTypeRef_s rxTypeRef = { NULL, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD};
|
||||
ORI_ObjectParams_u rxParams,rxParams1;
|
||||
ORI_ObjectParam_e rxParamList[8] = { ORI_ObjectParam_SigPath_antPort, ORI_ObjectParam_SigPath_axcW, ORI_ObjectParam_SigPath_axcB,
|
||||
ORI_ObjectParam_SigPath_chanBW, ORI_ObjectParam_SigPath_earfcn };
|
||||
ORI_Result_e rxParamResult[8];
|
||||
ORI_ObjectTypeRef_s rxTypeRef = { NULL, openair0_cfg->duplex_mode == duplex_mode_FDD ?
|
||||
(openair0_cfg->nr_flag == 0 ? ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxNRFDD ) :
|
||||
(openair0_cfg->nr_flag == 0 ? ORI_ObjectType_RxEUtraTDD : ORI_ObjectType_RxNRTDD)};
|
||||
ORI_ObjectParams_u rxParams;
|
||||
ORI_ObjectParam_e rxParamList[5] = { ORI_ObjectParam_SigPath_antPort, ORI_ObjectParam_SigPath_axcW, ORI_ObjectParam_SigPath_axcB,
|
||||
ORI_ObjectParam_SigPath_chanBW,
|
||||
openair0_cfg->nr_flag == 0 ? ORI_ObjectParam_SigPath_earfcn : ORI_ObjectParam_SigPath_AWS_arfcn};
|
||||
ORI_Result_e rxParamResult[5];
|
||||
int num_rxparams = 5;
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_TDD) {
|
||||
rxParamList[5] = ORI_ObjectParam_SigPath_tddULDLConfig;
|
||||
rxParamList[6] = ORI_ObjectParam_SigPath_tddSpecialSFConfig;
|
||||
rxParamList[7] = ORI_ObjectParam_RxSigPath_tddCPLengthUL;
|
||||
num_rxparams = 8;
|
||||
}
|
||||
/* Create rx0 */
|
||||
ORI_Object_s * rx0;
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD) {
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 0) {
|
||||
rxParams.RxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
|
||||
rxParams.RxEUtraFDD.axcW = 1;
|
||||
rxParams.RxEUtraFDD.axcB = 0;
|
||||
rxParams.RxEUtraFDD.chanBW = 200;
|
||||
rxParams.RxEUtraFDD.earfcn = 21350;
|
||||
rxParams.RxEUtraFDD.chanBW = txParams.TxEUtraFDD.chanBW;
|
||||
rxParams.RxEUtraFDD.earfcn = to_earfcn_UL_aw2s(-1,(long long int)openair0_cfg->rx_freq[0],txParams.TxEUtraFDD.chanBW);
|
||||
result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx0, &RE_result);
|
||||
}
|
||||
else {
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 1) {
|
||||
rxParams.RxNRFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
|
||||
rxParams.RxNRFDD.axcW = 1;
|
||||
rxParams.RxNRFDD.axcB = 0;
|
||||
rxParams.RxNRFDD.chanBW = txParams.TxNRFDD.chanBW;
|
||||
rxParams.RxNRFDD.AWS_arfcn = to_nrarfcn(openair0_cfg->nr_band,(long long int)openair0_cfg->rx_freq[0],openair0_cfg->nr_scs_for_raster,openair0_cfg->rx_bw);
|
||||
result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx0, &RE_result);
|
||||
}
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 0) {
|
||||
rxParams.RxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
|
||||
rxParams.RxEUtraTDD.axcW = 1;
|
||||
rxParams.RxEUtraTDD.axcB = 0;
|
||||
rxParams.RxEUtraTDD.chanBW = txParams.TxEUtraTDD.chanBW;
|
||||
rxParams.RxEUtraTDD.earfcn = txParams.TxEUtraTDD.earfcn;
|
||||
rxParams.RxEUtraTDD.tddULDLConfig = 1;
|
||||
rxParams.RxEUtraTDD.tddSpecialSFConfig = 1;
|
||||
rxParams.RxEUtraTDD.tddCPLengthUL = ORI_tddCPLength_Normal;
|
||||
|
||||
printf("AW2S: Creating RX0 for EARFCN %d\n",rxParams.RxEUtraTDD.earfcn);
|
||||
|
||||
result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx0, &RE_result);
|
||||
|
||||
}
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 1) {
|
||||
rxParams.RxNRTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL);
|
||||
rxParams.RxNRTDD.axcW = 1;
|
||||
rxParams.RxNRTDD.axcB = 0;
|
||||
rxParams.RxNRTDD.chanBW = txParams.TxNRTDD.chanBW;
|
||||
rxParams.RxNRTDD.AWS_arfcn = txParams.TxNRTDD.AWS_arfcn;
|
||||
|
||||
printf("AW2S: Creating RX0 for NRARFCN %d\n",rxParams.RxNRTDD.AWS_arfcn);
|
||||
|
||||
result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx0, &RE_result);
|
||||
|
||||
}
|
||||
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
@@ -573,27 +743,78 @@ int aw2s_oriinit(openair0_device *device) {
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectCreation (rxParams0.RxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
printf("ORI_ObjectCreation (rxParams0.RxEUtra/NR/FDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
|
||||
if (openair0_cfg->rx_num_channels > 1) {
|
||||
/* Create rx1 */
|
||||
ORI_Object_s * rx1;
|
||||
memcpy((void*)&rxParams1,(void*)&rxParams,sizeof(rxParams));
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD) rxParams1.RxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
else rxParams1.RxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 0)
|
||||
rxParams.RxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 1)
|
||||
rxParams.RxNRFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 0)
|
||||
rxParams.RxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 1)
|
||||
rxParams.RxNRTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL);
|
||||
|
||||
result = ORI_ObjectCreation(ori, rxTypeRef, rxParams1, rxParamList, num_rxparams, rxParamResult, &rx1, &RE_result);
|
||||
result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx1, &RE_result);
|
||||
|
||||
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectCreation (rxParams1.RxEUtraFDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
|
||||
printf("ORI_ObjectCreation (rxParams1.RxEUtra/NR/FDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectCreation (rxParams1.RxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
printf("ORI_ObjectCreation (rxParams1.RxEUtra/NR/FDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
|
||||
if (openair0_cfg->rx_num_channels > 2) {
|
||||
/* Create rx2 */
|
||||
ORI_Object_s * rx2;
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 0)
|
||||
rxParams.RxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 2, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 1)
|
||||
rxParams.RxNRFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 2, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 0)
|
||||
rxParams.RxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 2, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 1)
|
||||
rxParams.RxNRTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 2, NULL);
|
||||
|
||||
result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx2, &RE_result);
|
||||
|
||||
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectCreation (rxParams2.RxEUtra/NR/FDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectCreation (rxParams2.RxEUtra/NR/FDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
if (openair0_cfg->rx_num_channels > 3) {
|
||||
/* Create rx3 */
|
||||
ORI_Object_s * rx3;
|
||||
if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 0)
|
||||
rxParams.RxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 3, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_FDD && openair0_cfg->nr_flag == 1)
|
||||
rxParams.RxNRFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 3, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 0)
|
||||
rxParams.RxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 3, NULL);
|
||||
else if (openair0_cfg->duplex_mode == duplex_mode_TDD && openair0_cfg->nr_flag == 1)
|
||||
rxParams.RxNRTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 3, NULL);
|
||||
|
||||
result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx3, &RE_result);
|
||||
|
||||
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectCreation (rxParams3.RxEUtra/NR/FDD/TDD) failed with error: %s\n", ORI_Result_Print(result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
printf("ORI_ObjectCreation (rxParams3.RxEUtra/NR/FDD/TDD): %s\n", ORI_Result_Print(RE_result));
|
||||
}
|
||||
/* Create link */
|
||||
|
||||
ORI_ObjectParams_u linkParams;
|
||||
@@ -609,14 +830,14 @@ int aw2s_oriinit(openair0_device *device) {
|
||||
result = ORI_ObjectParamModify(ori,link,linkParams,linkParamList,3,linkParamResult,&RE_result);
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectParamModify (linkParams) failed with error: %s\n", ORI_Result_Print(result));
|
||||
printf("ORI_ObjectParamModify (linkParams) failed with error: %s\n", ORI_Result_Print(RE_result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
result = ORI_ObjectStateModification(ori, link, ORI_AST_Locked, &RE_result);
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result));
|
||||
printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(RE_result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
@@ -632,7 +853,7 @@ int aw2s_oriinit(openair0_device *device) {
|
||||
result = ORI_ObjectParamReport(ori, NULL, 0, ORI_ObjectParam_All, &RE_result);
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectParamReport failed with error: %s\n", ORI_Result_Print(result));
|
||||
printf("ORI_ObjectParamReport failed with error: %s\n", ORI_Result_Print(RE_result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
@@ -651,7 +872,7 @@ int aw2s_oriinit(openair0_device *device) {
|
||||
result = ORI_ObjectStateReport(ori, NULL, 0, ORI_StateType_All, ORI_EventDrivenReport_True, &RE_result);
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectStateReport failed with error: %s\n", ORI_Result_Print(result));
|
||||
printf("ORI_ObjectStateReport failed with error: %s\n", ORI_Result_Print(RE_result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
@@ -675,7 +896,7 @@ int aw2s_oriinit(openair0_device *device) {
|
||||
result = ORI_ObjectFaultReport(ori, NULL, 0, ORI_EventDrivenReport_True, &RE_result);
|
||||
if(result != ORI_Result_SUCCESS)
|
||||
{
|
||||
printf("ORI_ObjectFaultReport failed with error: %s\n", ORI_Result_Print(result));
|
||||
printf("ORI_ObjectFaultReport failed with error: %s\n", ORI_Result_Print(RE_result));
|
||||
aw2s_oricleanup(device);
|
||||
return -1;
|
||||
}
|
||||
|
||||
+104
-9
@@ -2,8 +2,8 @@
|
||||
* @file ori.h
|
||||
* @brief Open Radio Interface (ORI) C library header file.
|
||||
* @author AW2S (http://www.aw2s.com)
|
||||
* @version 1.6
|
||||
* @date July 29, 2019
|
||||
* @version 1.8
|
||||
* @date January 18, 2022
|
||||
*
|
||||
* This file is the AW2S REC ORI C library header, and contains all necessary
|
||||
* functions prototypes, enumerations, data structures and type definitions
|
||||
@@ -14,7 +14,7 @@
|
||||
#define ORI_H_
|
||||
|
||||
#define ORILIB_VERSION_MAJOR 1
|
||||
#define ORILIB_VERSION_MINOR 6
|
||||
#define ORILIB_VERSION_MINOR 8
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
@@ -144,10 +144,14 @@ typedef enum
|
||||
ORI_ObjectType_TxEUtraFDD, /**< */
|
||||
ORI_ObjectType_TxEUtraTDD, /**< */
|
||||
ORI_ObjectType_TxGSM, /**< */
|
||||
ORI_ObjectType_TxNRFDD, /**< */
|
||||
ORI_ObjectType_TxNRTDD, /**< */
|
||||
ORI_ObjectType_RxUtra, /**< */
|
||||
ORI_ObjectType_RxEUtraFDD, /**< */
|
||||
ORI_ObjectType_RxEUtraTDD, /**< */
|
||||
ORI_ObjectType_RxGSM, /**< */
|
||||
ORI_ObjectType_RxNRFDD, /**< */
|
||||
ORI_ObjectType_RxNRTDD, /**< */
|
||||
ORI_ObjectType_ORILink, /**< */
|
||||
ORI_ObjectType_ExternalEventPort, /**< */
|
||||
ORI_ObjectType_AISGPort, /**< */
|
||||
@@ -223,6 +227,7 @@ typedef enum
|
||||
ORI_ObjectParam_SigPath_AWS_enableCompBitChange, /**< */
|
||||
ORI_ObjectParam_SigPath_AWS_measuredPwr, /**< */
|
||||
ORI_ObjectParam_SigPath_AWS_axcIncr, /**< */
|
||||
ORI_ObjectParam_SigPath_AWS_arfcn, /**< */
|
||||
ORI_ObjectParam_TxSigPath_t2a, /**< */
|
||||
ORI_ObjectParam_TxSigPath_maxTxPwr, /**< */
|
||||
ORI_ObjectParam_TxSigPath_dlCalRE, /**< */
|
||||
@@ -252,12 +257,12 @@ typedef enum
|
||||
ORI_ObjectParam_ORILink_AWS_localMAC, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_remoteMAC, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_t14, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_sfpTxPow, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_sfpRxPow, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_remoteIP, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_localIP, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_remoteUdpPort, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_localUdpPort, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_sfpTxPow, /**< */
|
||||
ORI_ObjectParam_ORILink_AWS_sfpRxPow, /**< */
|
||||
ORI_ObjectParam_AISGPort_busPowerEnable, /**< */
|
||||
ORI_ObjectParam_AISGALD_deviceType, /**< */
|
||||
ORI_ObjectParam_AISGALD_UID, /**< */
|
||||
@@ -1146,6 +1151,50 @@ typedef struct
|
||||
ORI_Boolean_e AWS_enPeakCancel; /**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
|
||||
} ORI_ObjectParams_TxSigPathGSM_s;
|
||||
|
||||
/**
|
||||
* @struct ORI_ObjectParams_TxSigPathNRFDD_s
|
||||
* @brief Structure containing the parameters of a TxSigPath NRFDD object.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint16_t chanBW; /**< RW-Locked. Channel bandwith in MHz/10. */
|
||||
uint16_t dlCalREMax; /**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
|
||||
uint32_t t2a; /**< RO. RE time delay. */
|
||||
uint16_t dlCalRE; /**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
|
||||
int16_t maxTxPwr; /**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
|
||||
uint8_t axcW; /**< RW-Locked. AxC W parameter. */
|
||||
uint8_t axcB; /**< RW-Locked. AxC B parameter. */
|
||||
ORI_Object_s * oriLink; /**< RW-Locked. ORI Link on which the AxC is mapped. */
|
||||
ORI_Object_s * antPort; /**< RW-Locked. Reference Antenna port for this signal. */
|
||||
ORI_Boolean_e AWS_enableCompRateChange; /**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
|
||||
int16_t AWS_measuredPwr; /**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
|
||||
uint16_t AWS_axcIncr; /**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
|
||||
ORI_Boolean_e AWS_enPeakCancel; /**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
|
||||
uint32_t AWS_arfcn; /**< RW-Locked. ARFCN of the NR carrier. */
|
||||
} ORI_ObjectParams_TxSigPathNRFDD_s;
|
||||
|
||||
/**
|
||||
* @struct ORI_ObjectParams_TxSigPathNRTDD_s
|
||||
* @brief Structure containing the parameters of a TxSigPath NRTDD object.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint16_t chanBW; /**< RW-Locked. Channel bandwith in MHz/10. */
|
||||
uint16_t dlCalREMax; /**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
|
||||
uint32_t t2a; /**< RO. RE time delay. */
|
||||
uint16_t dlCalRE; /**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
|
||||
int16_t maxTxPwr; /**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
|
||||
uint8_t axcW; /**< RW-Locked. AxC W parameter. */
|
||||
uint8_t axcB; /**< RW-Locked. AxC B parameter. */
|
||||
ORI_Object_s * oriLink; /**< RW-Locked. ORI Link on which the AxC is mapped. */
|
||||
ORI_Object_s * antPort; /**< RW-Locked. Reference Antenna port for this signal. */
|
||||
ORI_Boolean_e AWS_enableCompRateChange; /**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
|
||||
int16_t AWS_measuredPwr; /**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
|
||||
uint16_t AWS_axcIncr; /**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
|
||||
ORI_Boolean_e AWS_enPeakCancel; /**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
|
||||
uint32_t AWS_arfcn; /**< RW-Locked. ARFCN of the NR carrier. */
|
||||
} ORI_ObjectParams_TxSigPathNRTDD_s;
|
||||
|
||||
/**
|
||||
* @struct ORI_ObjectParams_RxSigPathUtra_s
|
||||
* @brief Structure containing the parameters of a RxSigPath UTRAFDD object.
|
||||
@@ -1239,6 +1288,48 @@ typedef struct
|
||||
uint16_t AWS_axcIncr; /**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
|
||||
} ORI_ObjectParams_RxSigPathGSM_s;
|
||||
|
||||
/**
|
||||
* @struct ORI_ObjectParams_RxSigPathNRFDD_s
|
||||
* @brief Structure containing the parameters of a RxSigPath NRFDD object.
|
||||
*
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint16_t chanBW; /**< RW-Locked. Channel bandwith in MHz/10. */
|
||||
uint16_t ulCalREMax; /**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
|
||||
uint32_t ta3; /**< RO. RE time delay. */
|
||||
uint16_t ulCalRE; /**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
|
||||
uint8_t axcW; /**< RW-Locked. AxC W parameter. */
|
||||
uint8_t axcB; /**< RW-Locked. AxC B parameter. */
|
||||
ORI_Object_s * oriLink; /**< RW-Locked. ORI Link on which the AxC is mapped. */
|
||||
ORI_Object_s * antPort; /**< RW-Locked. Reference Antenna port for this signal. */
|
||||
ORI_Boolean_e AWS_enableCompRateChange; /**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
|
||||
int16_t AWS_measuredPwr; /**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
|
||||
uint16_t AWS_axcIncr; /**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
|
||||
uint32_t AWS_arfcn; /**< RW-Locked. ARFCN of the NR carrier. */
|
||||
} ORI_ObjectParams_RxSigPathNRFDD_s;
|
||||
|
||||
/**
|
||||
* @struct ORI_ObjectParams_RxSigPathNRTDD_s
|
||||
* @brief Structure containing the parameters of a RxSigPath NRTDD object.
|
||||
*
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint16_t chanBW; /**< RW-Locked. Channel bandwith in MHz/10. */
|
||||
uint16_t ulCalREMax; /**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
|
||||
uint32_t ta3; /**< RO. RE time delay. */
|
||||
uint16_t ulCalRE; /**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
|
||||
uint8_t axcW; /**< RW-Locked. AxC W parameter. */
|
||||
uint8_t axcB; /**< RW-Locked. AxC B parameter. */
|
||||
ORI_Object_s * oriLink; /**< RW-Locked. ORI Link on which the AxC is mapped. */
|
||||
ORI_Object_s * antPort; /**< RW-Locked. Reference Antenna port for this signal. */
|
||||
ORI_Boolean_e AWS_enableCompRateChange; /**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
|
||||
int16_t AWS_measuredPwr; /**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
|
||||
uint16_t AWS_axcIncr; /**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
|
||||
uint32_t AWS_arfcn; /**< RW-Locked. ARFCN of the NR carrier. */
|
||||
} ORI_ObjectParams_RxSigPathNRTDD_s;
|
||||
|
||||
/**
|
||||
* @struct ORI_ObjectParams_ORILink_s
|
||||
* @brief Structure containing the parameters of an ORI Link object.
|
||||
@@ -1258,12 +1349,12 @@ typedef struct
|
||||
uint8_t AWS_localMAC[6]; /**< R0. AW2S Vendor specific: Local MAC address of the ORI link. */
|
||||
uint8_t AWS_remoteMAC[6]; /**< RW. AW2S Vendor specific: Remote MAC address of the ORI link. */
|
||||
uint32_t AWS_t14; /**< RO. AW2S Vendor specific: CPRI time delay component. */
|
||||
uint8_t AWS_remoteIP[4]; /**< RW. AW2S Vendor specific: REC IP for ECPRI Ethernet frame */
|
||||
uint8_t AWS_localIP[4]; /**< R0. AW2S Vendor specific: RE IP for ECPRI Ethernet frame */
|
||||
uint16_t AWS_remoteUdpPort; /**< RW. AW2S Vendor specific: REC Udp Port for ECPRI Ethernet frame */
|
||||
uint16_t AWS_localUdpPort; /**< R0. AW2S Vendor specific: RE Udp Port for ECPRI Ethernet frame */
|
||||
uint32_t AWS_sfpTxPow; /**< RO. AW2S Vendor specific: SFP Tx power. */
|
||||
uint32_t AWS_sfpRxPow; /**< RO. AW2S Vendor specific: SFP Rx power. */
|
||||
uint8_t AWS_remoteIP[4]; /**< RW. AW2S Vendor specific: IP of REC for ECPRI Ethernet frame */
|
||||
uint8_t AWS_localIP[4]; /**< RW. AW2S Vendor specific: IP of RE for ECPRI Ethernet frame */
|
||||
uint16_t AWS_remoteUdpPort; /**< RW. AW2S Vendor specific: UDP port of REC for ECPRI Ethernet frame */
|
||||
uint16_t AWS_localUdpPort; /**< RO. AW2S Vendor specific: UDP port of RE for ECPRI Ethernet frame */
|
||||
} ORI_ObjectParams_ORILink_s;
|
||||
|
||||
/**
|
||||
@@ -1393,10 +1484,14 @@ typedef union
|
||||
ORI_ObjectParams_TxSigPathEUtraFDD_s TxEUtraFDD; /**< Parameters for ::ORI_ObjectType_TxEUtraFDD. */
|
||||
ORI_ObjectParams_TxSigPathEUtraTDD_s TxEUtraTDD; /**< Parameters for ::ORI_ObjectType_TxEUtraTDD. */
|
||||
ORI_ObjectParams_TxSigPathGSM_s TxGSM; /**< Parameters for ::ORI_ObjectType_TxGSM. */
|
||||
ORI_ObjectParams_TxSigPathNRFDD_s TxNRFDD; /**< Parameters for ::ORI_ObjectType_TxNRFDD. */
|
||||
ORI_ObjectParams_TxSigPathNRTDD_s TxNRTDD; /**< Parameters for ::ORI_ObjectType_TxNRTDD. */
|
||||
ORI_ObjectParams_RxSigPathUtra_s RxUtra; /**< Parameters for ::ORI_ObjectType_RxUtra. */
|
||||
ORI_ObjectParams_RxSigPathEUtraFDD_s RxEUtraFDD; /**< Parameters for ::ORI_ObjectType_RxEUtraFDD. */
|
||||
ORI_ObjectParams_RxSigPathEUtraTDD_s RxEUtraTDD; /**< Parameters for ::ORI_ObjectType_RxEUtraTDD. */
|
||||
ORI_ObjectParams_RxSigPathGSM_s RxGSM; /**< Parameters for ::ORI_ObjectType_RxGSM. */
|
||||
ORI_ObjectParams_RxSigPathNRFDD_s RxNRFDD; /**< Parameters for ::ORI_ObjectType_RxNRFDD. */
|
||||
ORI_ObjectParams_RxSigPathNRTDD_s RxNRTDD; /**< Parameters for ::ORI_ObjectType_RxNRTDD. */
|
||||
ORI_ObjectParams_ORILink_s ORILink; /**< Parameters for ::ORI_ObjectType_ORILink. */
|
||||
ORI_ObjectParams_ExternalEventPort_s ExternalEventPort; /**< Parameters for ::ORI_ObjectType_ExternalEventPort. */
|
||||
ORI_ObjectParams_AISGPort_s AISGPort; /**< Parameters for ::ORI_ObjectType_AISGPort. */
|
||||
|
||||
@@ -239,6 +239,12 @@ typedef struct {
|
||||
double tx_sample_rate;
|
||||
//! check for threequarter sampling rate
|
||||
int8_t threequarter_fs;
|
||||
//! Flag to indicate this configuration is for NR
|
||||
int nr_flag;
|
||||
//! NR band number
|
||||
int nr_band;
|
||||
//! NR scs for raster
|
||||
int nr_scs_for_raster;
|
||||
} openair0_config_t;
|
||||
|
||||
/*! \brief RF mapping */
|
||||
|
||||
@@ -674,27 +674,27 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
|
||||
}
|
||||
if (samples_received == nsamps) s->wait_for_first_pps=0;
|
||||
|
||||
// bring RX data into 12 LSBs for softmodem RX
|
||||
// bring RX data into 12 LSBs for softmodem RX
|
||||
for (int i=0; i<cc; i++) {
|
||||
for (int j=0; j<nsamps2; j++) {
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
#ifdef __AVX2__
|
||||
// FK: in some cases the buffer might not be 32 byte aligned, so we cannot use avx2
|
||||
|
||||
if ((((uintptr_t) buff[i])&0x1F)==0) {
|
||||
((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],rxshift);
|
||||
for (int j=0; j<nsamps2; j++)
|
||||
((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],rxshift);
|
||||
} else {
|
||||
((__m128i *)buff[i])[2*j] = _mm_srai_epi16(((__m128i *)buff_tmp[i])[2*j],rxshift);
|
||||
((__m128i *)buff[i])[2*j+1] = _mm_srai_epi16(((__m128i *)buff_tmp[i])[2*j+1],rxshift);
|
||||
for (int j=0; j<(nsamps2<<1); j++)
|
||||
((__m128i *)buff[i])[j] = _mm_srai_epi16(((__m128i *)buff_tmp[i])[j],rxshift);
|
||||
}
|
||||
|
||||
#else
|
||||
((__m128i *)buff[i])[j] = _mm_srai_epi16(buff_tmp[i][j],rxshift);
|
||||
#else
|
||||
for (int j=0; j<nsamps2; j++)
|
||||
((__m128i *)buff[i])[j] = _mm_srai_epi16(buff_tmp[i][j],rxshift);
|
||||
#endif
|
||||
#elif defined(__arm__)
|
||||
((int16x8_t *)buff[i])[j] = vshrq_n_s16(buff_tmp[i][j],rxshift);
|
||||
for (int j=0; j<nsamps2; j++)
|
||||
((int16x8_t *)buff[i])[j] = vshrq_n_s16(buff_tmp[i][j],rxshift);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (samples_received < nsamps) {
|
||||
@@ -1116,7 +1116,6 @@ extern "C" {
|
||||
if (device->type==USRP_X300_DEV) {
|
||||
openair0_cfg[0].rx_gain_calib_table = calib_table_x310;
|
||||
std::cerr << "-- Using calibration table: calib_table_x310" << std::endl;
|
||||
s->usrp->set_rx_dc_offset(true);
|
||||
}
|
||||
|
||||
if (device->type==USRP_N300_DEV) {
|
||||
|
||||
@@ -45,8 +45,6 @@ gNBs =
|
||||
remote_s_portc = 500;
|
||||
remote_s_portd = 2152;
|
||||
ssb_SubcarrierOffset = 0;
|
||||
pdsch_AntennaPorts = 1;
|
||||
pusch_AntennaPorts = 1;
|
||||
min_rxtxtime = 6;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
|
||||
@@ -37,6 +37,7 @@ gNBs =
|
||||
////////// Physical parameters:
|
||||
|
||||
ssb_SubcarrierOffset = 0;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
@@ -112,8 +112,6 @@ extern int transmission_mode;
|
||||
|
||||
extern int oaisim_flag;
|
||||
|
||||
//uint16_t sf_ahead=4;
|
||||
extern uint16_t sf_ahead;
|
||||
#include "executables/thread-common.h"
|
||||
//extern PARALLEL_CONF_t get_thread_parallel_conf(void);
|
||||
//extern WORKER_CONF_t get_thread_worker_conf(void);
|
||||
@@ -466,11 +464,11 @@ void eNB_top(PHY_VARS_eNB *eNB,
|
||||
|
||||
if (!oai_exit) {
|
||||
T(T_ENB_MASTER_TICK, T_INT(0), T_INT(ru_proc->frame_rx), T_INT(ru_proc->tti_rx));
|
||||
L1_proc->timestamp_tx = ru_proc->timestamp_rx + (sf_ahead*fp->samples_per_tti);
|
||||
L1_proc->timestamp_tx = ru_proc->timestamp_rx + (ru->sf_ahead*fp->samples_per_tti);
|
||||
L1_proc->frame_rx = ru_proc->frame_rx;
|
||||
L1_proc->subframe_rx = ru_proc->tti_rx;
|
||||
L1_proc->frame_tx = (L1_proc->subframe_rx > (9-sf_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
||||
L1_proc->subframe_tx = (L1_proc->subframe_rx + sf_ahead)%10;
|
||||
L1_proc->frame_tx = (L1_proc->subframe_rx > (9-ru->sf_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
||||
L1_proc->subframe_tx = (L1_proc->subframe_rx + ru->sf_ahead)%10;
|
||||
|
||||
if (rxtx(eNB,L1_proc,string) < 0)
|
||||
LOG_E(PHY,"eNB %d CC_id %d failed during execution\n",eNB->Mod_id,eNB->CC_id);
|
||||
@@ -614,11 +612,11 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,
|
||||
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
|
||||
// we want to generate subframe (n+sf_ahead), so TS_tx = TX_rx+sf_ahead*samples_per_tti,
|
||||
// and proc->subframe_tx = proc->subframe_rx+sf_ahead
|
||||
L1_proc->timestamp_tx = ru_proc->timestamp_rx + (sf_ahead*fp->samples_per_tti);
|
||||
L1_proc->timestamp_tx = ru_proc->timestamp_rx + (ru->sf_ahead*fp->samples_per_tti);
|
||||
L1_proc->frame_rx = ru_proc->frame_rx;
|
||||
L1_proc->subframe_rx = ru_proc->tti_rx;
|
||||
L1_proc->frame_tx = (L1_proc->subframe_rx > (9-sf_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
||||
L1_proc->subframe_tx = (L1_proc->subframe_rx + sf_ahead)%10;
|
||||
L1_proc->frame_tx = (L1_proc->subframe_rx > (9-ru->sf_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
||||
L1_proc->subframe_tx = (L1_proc->subframe_rx + ru->sf_ahead)%10;
|
||||
LOG_D(PHY,"wakeup_rxtx: L1_proc->subframe_rx %d, L1_proc->subframe_tx %d, RU %d\n",L1_proc->subframe_rx,L1_proc->subframe_tx,ru->idx);
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_WAKEUP_RXTX_RX_RU+ru->idx, L1_proc->frame_rx);
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_WAKEUP_RXTX_RX_RU+ru->idx, L1_proc->subframe_rx);
|
||||
|
||||
@@ -107,7 +107,6 @@ const char ru_states[6][9] = {"RU_IDLE","RU_CONFIG","RU_READY","RU_RUN","RU_ERRO
|
||||
extern const char NB_functions[7][20];
|
||||
extern const char NB_timing[2][20];
|
||||
|
||||
extern uint16_t sf_ahead;
|
||||
|
||||
extern const char ru_if_types[MAX_RU_IF_TYPES][20];
|
||||
|
||||
@@ -252,8 +251,8 @@ void fh_if4p5_south_in(RU_t *ru,
|
||||
|
||||
// proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti);
|
||||
if (get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD) {
|
||||
proc->tti_tx = (sf+sf_ahead)%10;
|
||||
proc->frame_tx = (sf>(9-sf_ahead)) ? (f+1)&1023 : f;
|
||||
proc->tti_tx = (sf+ru->sf_ahead)%10;
|
||||
proc->frame_tx = (sf>(9-ru->sf_ahead)) ? (f+1)&1023 : f;
|
||||
}
|
||||
|
||||
LOG_D(PHY,"Setting proc for (%d,%d)\n",sf,f);
|
||||
@@ -652,13 +651,13 @@ void rx_rf(RU_t *ru,
|
||||
|
||||
if (get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD && ru->fh_north_asynch_in == NULL) {
|
||||
#ifdef PHY_TX_THREAD
|
||||
proc->timestamp_phy_tx = proc->timestamp_rx+((sf_ahead-1)*fp->samples_per_tti);
|
||||
proc->subframe_phy_tx = (proc->tti_rx+(sf_ahead-1))%10;
|
||||
proc->frame_phy_tx = (proc->tti_rx>(9-(sf_ahead-1))) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||
proc->timestamp_phy_tx = proc->timestamp_rx+((ru->sf_ahead-1)*fp->samples_per_tti);
|
||||
proc->subframe_phy_tx = (proc->tti_rx+(ru->sf_ahead-1))%10;
|
||||
proc->frame_phy_tx = (proc->tti_rx>(9-(ru->sf_ahead-1))) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||
#else
|
||||
proc->timestamp_tx = proc->timestamp_rx+(sf_ahead*fp->samples_per_tti);
|
||||
proc->tti_tx = (proc->tti_rx+sf_ahead)%10;
|
||||
proc->frame_tx = (proc->tti_rx>(9-sf_ahead)) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||
proc->timestamp_tx = proc->timestamp_rx+(ru->sf_ahead*fp->samples_per_tti);
|
||||
proc->tti_tx = (proc->tti_rx+ru->sf_ahead)%10;
|
||||
proc->frame_tx = (proc->tti_rx>(9-ru->sf_ahead)) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||
#endif
|
||||
//proc->timestamp_tx = proc->timestamp_rx+(sf_ahead*fp->samples_per_tti);
|
||||
//proc->subframe_tx = (proc->tti_rx+sf_ahead)%10;
|
||||
@@ -3081,6 +3080,7 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas
|
||||
ru[j]->nb_rx = *(RUParamList.paramarray[j][RU_NB_RX_IDX].uptr);
|
||||
ru[j]->att_tx = *(RUParamList.paramarray[j][RU_ATT_TX_IDX].uptr);
|
||||
ru[j]->att_rx = *(RUParamList.paramarray[j][RU_ATT_RX_IDX].uptr);
|
||||
ru[j]->sf_ahead = *(RUParamList.paramarray[j][RU_SF_AHEAD].uptr);
|
||||
*ru_mask= (*ru_mask)|(1<<j);
|
||||
}// j=0..num_rus
|
||||
}
|
||||
|
||||
@@ -96,7 +96,6 @@ pthread_cond_t nfapi_sync_cond;
|
||||
pthread_mutex_t nfapi_sync_mutex;
|
||||
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
||||
|
||||
uint16_t sf_ahead=4;
|
||||
|
||||
pthread_cond_t sync_cond;
|
||||
pthread_mutex_t sync_mutex;
|
||||
|
||||
Reference in New Issue
Block a user