Merge branch 'enhancement-10-harmony' of https://gitlab.eurecom.fr/oai/openairinterface5g into enhancement-10-harmony
Conflicts: targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
This commit is contained in:
@@ -71,6 +71,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
|
||||
slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1;
|
||||
blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1;
|
||||
|
||||
|
||||
if (eth->flags == ETH_RAW_IF4p5_MODE) {
|
||||
packet_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES);
|
||||
data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t);
|
||||
@@ -81,6 +82,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
|
||||
gen_IF4p5_dl_header(packet_header, frame, subframe);
|
||||
|
||||
for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) {
|
||||
if (eNB->CC_id==1) LOG_I(PHY,"DL_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,frame,subframe,symbol_id);
|
||||
|
||||
for (element_id=0; element_id<db_halflength; element_id++) {
|
||||
i = (uint16_t*) &txdataF[eNB->CC_id][blockoffsetF+element_id];
|
||||
@@ -231,7 +233,7 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t
|
||||
|
||||
*packet_type = packet_header->sub_type;
|
||||
|
||||
// printf("CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe);
|
||||
// LOG_I(PHY,"CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe);
|
||||
|
||||
if (*packet_type == IF4p5_PDLFFT) {
|
||||
*symbol_number = ((packet_header->frame_status)>>26)&0x000f;
|
||||
@@ -252,6 +254,8 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t
|
||||
} else if (*packet_type == IF4p5_PULFFT) {
|
||||
*symbol_number = ((packet_header->frame_status)>>26)&0x000f;
|
||||
|
||||
if (eNB->CC_id==1) LOG_I(PHY,"UL_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,*frame,*subframe,*symbol_number);
|
||||
|
||||
slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + 1;
|
||||
blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1;
|
||||
|
||||
|
||||
@@ -238,10 +238,14 @@ typedef struct eNB_proc_t_s {
|
||||
openair0_timestamp timestamp_tx;
|
||||
/// subframe to act upon for reception
|
||||
int subframe_rx;
|
||||
/// symbol mask for IF4p5 reception per subframe
|
||||
uint32_t symbol_mask[10];
|
||||
/// subframe to act upon for PRACH
|
||||
int subframe_prach;
|
||||
/// frame to act upon for reception
|
||||
int frame_rx;
|
||||
/// frame to act upon for transmission
|
||||
int frame_tx;
|
||||
/// frame offset for secondary eNBs (to correct for frame asynchronism at startup)
|
||||
int frame_offset;
|
||||
/// frame to act upon for PRACH
|
||||
|
||||
@@ -374,7 +374,7 @@ void *freq_thread(void *arg) {
|
||||
* \param dummy dummy variable not used
|
||||
* \returns 0 in success
|
||||
*/
|
||||
int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) {
|
||||
int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dont_block) {
|
||||
|
||||
usrp_state_t *s = (usrp_state_t*)device->priv;
|
||||
pthread_t f_thread;
|
||||
@@ -382,7 +382,12 @@ int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,
|
||||
printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]);
|
||||
|
||||
// spawn a thread to handle the frequency change to not block the calling thread
|
||||
pthread_create(&f_thread,NULL,freq_thread,(void*)device);
|
||||
if (dont_block == 1)
|
||||
pthread_create(&f_thread,NULL,freq_thread,(void*)device);
|
||||
else {
|
||||
s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]);
|
||||
s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]);
|
||||
}
|
||||
|
||||
return(0);
|
||||
|
||||
|
||||
+38
-31
@@ -745,11 +745,10 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
eNB_proc_t *proc = &eNB->proc;
|
||||
|
||||
uint16_t packet_type;
|
||||
uint32_t symbol_number,symbol_mask,symbol_mask_full;
|
||||
uint32_t symbol_number,symbol_mask_full;
|
||||
int subframe_tx,frame_tx;
|
||||
|
||||
symbol_number = 0;
|
||||
symbol_mask = 0;
|
||||
symbol_mask_full = (1<<fp->symbols_per_tti)-1;
|
||||
|
||||
do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
|
||||
@@ -766,21 +765,24 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
// exit_fun("Exiting");
|
||||
}
|
||||
if (subframe_tx != *subframe) {
|
||||
LOG_E(PHY,"fh_if4p5_asynch_DL: subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe);
|
||||
*subframe = subframe_tx;
|
||||
// exit_fun("Exiting");
|
||||
LOG_E(PHY,"fh_if4p5_asynch_DL: (frame %d) subframe_tx %d is not what we expect %d\n",frame_tx,subframe_tx,*subframe);
|
||||
//*subframe = subframe_tx;
|
||||
//exit_fun("Exiting");
|
||||
}
|
||||
}
|
||||
if (packet_type == IF4p5_PDLFFT) {
|
||||
symbol_mask = symbol_mask | (1<<symbol_number);
|
||||
proc->symbol_mask[subframe_tx] =proc->symbol_mask[subframe_tx] | (1<<symbol_number);
|
||||
}
|
||||
else {
|
||||
LOG_E(PHY,"Illegal IF4p5 packet type (should only be IF4p5_PDLFFT%d\n",packet_type);
|
||||
exit_fun("Exiting");
|
||||
}
|
||||
} while (symbol_mask != symbol_mask_full);
|
||||
} while (proc->symbol_mask[*subframe] != symbol_mask_full);
|
||||
|
||||
// intialize this to zero after we're done with the subframe
|
||||
proc->symbol_mask[*subframe] = 0;
|
||||
|
||||
do_OFDM_mod_rt(subframe_tx, eNB);
|
||||
do_OFDM_mod_rt(*subframe, eNB);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -978,44 +980,43 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
uint32_t symbol_number=0;
|
||||
uint32_t symbol_mask, symbol_mask_full;
|
||||
|
||||
symbol_mask = 0;
|
||||
symbol_mask_full = (1<<fp->symbols_per_tti)-1;
|
||||
prach_rx = 0;
|
||||
|
||||
prach_rx = (is_prach_subframe(fp, *frame, *subframe)>0) ? 1 : 0;
|
||||
if (eNB->CC_id==1) LOG_I(PHY,"rx_fh_if4p5: frame %d, subframe %d\n",*frame,*subframe);
|
||||
do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
|
||||
recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number);
|
||||
proc->frame_rx = (proc->frame_rx + proc->frame_offset)&1023;
|
||||
|
||||
//proc->frame_rx = (proc->frame_rx + proc->frame_offset)&1023;
|
||||
|
||||
if (packet_type == IF4p5_PULFFT) {
|
||||
symbol_mask = symbol_mask | (1<<symbol_number);
|
||||
prach_rx = (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>0) ? 1 : 0;
|
||||
proc->symbol_mask[proc->subframe_rx] = proc->symbol_mask[proc->subframe_rx] | (1<<symbol_number);
|
||||
} else if (packet_type == IF4p5_PRACH) {
|
||||
prach_rx = 0;
|
||||
}
|
||||
|
||||
} while( (symbol_mask != symbol_mask_full) || (prach_rx == 1));
|
||||
if (eNB->CC_id==1) LOG_I(PHY,"rx_fh_if4p5: symbol_mask[%d] %x, prach %d\n",*subframe,proc->symbol_mask[*subframe],prach_rx);
|
||||
|
||||
} while( (proc->symbol_mask[*subframe] != symbol_mask_full) || (prach_rx == 1));
|
||||
proc->symbol_mask[*subframe] = 0;
|
||||
proc->symbol_mask[(9+*subframe)%10]= 0; // to handle a resynchronization event
|
||||
|
||||
if (eNB->CC_id==1) LOG_I(PHY,"Clearing symbol_mask[%d]\n",*subframe);
|
||||
|
||||
//caculate timestamp_rx, timestamp_tx based on frame and subframe
|
||||
proc->timestamp_rx = ((proc->frame_rx * 10) + proc->subframe_rx ) * fp->samples_per_tti ;
|
||||
proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti);
|
||||
|
||||
proc->timestamp_rx = ((proc->frame_rx * 10) + proc->subframe_rx ) * fp->samples_per_tti ;
|
||||
proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti);
|
||||
|
||||
|
||||
if (proc->first_rx == 0) {
|
||||
if (proc->subframe_rx != *subframe){
|
||||
LOG_E(PHY,"rx_fh_if4p5, CC_id %d: Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d,CCid %d)\n",eNB->CC_id,proc->subframe_rx,*subframe,eNB->CC_id);
|
||||
/*
|
||||
if (proc->subframe_rx> *subframe) {
|
||||
LOG_E(PHY,"rx_fh_if4p5, CC_id %d: this is ahead of time, so adjusting\n",eNB->CC_id);
|
||||
*subframe = proc->subframe_rx;
|
||||
}
|
||||
else {
|
||||
LOG_E(PHY,"rx_fh_ip4p5, CC_id %d: this is behind time, dropping\n");
|
||||
}*/
|
||||
exit_fun("Exiting");
|
||||
}
|
||||
if (proc->frame_rx != *frame) {
|
||||
LOG_E(PHY,"rx_fh_if4p5: Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d,CCid %d)\n",proc->frame_rx,*frame,eNB->CC_id);
|
||||
exit_fun("Exiting");
|
||||
if (proc->frame_rx == proc->frame_offset) // This means that the RRU has adjusted its frame timing
|
||||
proc->frame_offset = 0;
|
||||
else
|
||||
LOG_E(PHY,"rx_fh_if4p5: Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d,CCid %d)\n",proc->frame_rx,*frame,eNB->CC_id);
|
||||
}
|
||||
} else {
|
||||
proc->first_rx = 0;
|
||||
@@ -1024,11 +1025,13 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
else
|
||||
proc->frame_offset = PHY_vars_eNB_g[0][0]->proc.frame_rx;
|
||||
|
||||
*frame = (proc->frame_rx + proc->frame_offset)&1023;
|
||||
*frame = proc->frame_rx;//(proc->frame_rx + proc->frame_offset)&1023;
|
||||
*subframe = proc->subframe_rx;
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
|
||||
|
||||
|
||||
if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
|
||||
|
||||
}
|
||||
|
||||
@@ -1495,7 +1498,7 @@ static void* eNB_thread_single( void* param ) {
|
||||
subframe++;
|
||||
}
|
||||
|
||||
LOG_D(PHY,"eNB thread single %p (proc %p, CC_id %d), frame %d (%p), subframe %d (%p)\n",
|
||||
if (eNB->CC_id==1) LOG_I(PHY,"eNB thread single %p (proc %p, CC_id %d), frame %d (%p), subframe %d (%p)\n",
|
||||
pthread_self(), proc, eNB->CC_id, frame,&frame,subframe,&subframe);
|
||||
|
||||
// synchronization on FH interface, acquire signals/data and block
|
||||
@@ -1509,6 +1512,8 @@ static void* eNB_thread_single( void* param ) {
|
||||
proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10;
|
||||
proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1)&1023;
|
||||
proc_rxtx->timestamp_tx = proc->timestamp_tx;
|
||||
// adjust for timing offset between RRU
|
||||
if (eNB->CC_id!=0) proc_rxtx->frame_tx = (proc_rxtx->frame_tx+proc->frame_offset)&1023;
|
||||
|
||||
// At this point, all information for subframe has been received on FH interface
|
||||
// If this proc is to provide synchronization, do so
|
||||
@@ -1556,6 +1561,8 @@ void init_eNB_proc(int inst) {
|
||||
proc->first_tx=1;
|
||||
proc->frame_offset = 0;
|
||||
|
||||
for (i=0;i<10;i++) proc->symbol_mask[i]=0;
|
||||
|
||||
pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL);
|
||||
pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL);
|
||||
pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL);
|
||||
|
||||
Reference in New Issue
Block a user