diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 0b999764a6db09ff6fc4ba20c90dc648659307a4..f1fc55ef496c76962a3564b7ac694af4e41dacc5 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -183,10 +183,10 @@ pthread_mutex_t sync_mutex; #endif #endif -pthread_attr_t attr_eNB_proc_tx[10]; -pthread_attr_t attr_eNB_proc_rx[10]; -struct sched_param sched_param_eNB_proc_tx[10]; -struct sched_param sched_param_eNB_proc_rx[10]; +pthread_attr_t attr_eNB_proc_tx[MAX_NUM_CCs][10]; +pthread_attr_t attr_eNB_proc_rx[MAX_NUM_CCs][10]; +struct sched_param sched_param_eNB_proc_tx[MAX_NUM_CCs][10]; +struct sched_param sched_param_eNB_proc_rx[MAX_NUM_CCs][10]; #ifdef XFORMS static pthread_t thread2; //xforms @@ -424,7 +424,7 @@ static void *scope_thread(void *arg) { # ifdef ENABLE_XFORMS_WRITE_STATS len = # endif - dump_eNB_stats (PHY_vars_eNB_g[0], stats_buffer, 0); + dump_eNB_stats (PHY_vars_eNB_g[0][0], stats_buffer, 0); fl_set_object_label(form_stats->stats_text, stats_buffer); # ifdef ENABLE_XFORMS_WRITE_STATS rewind (eNB_stats); @@ -432,7 +432,7 @@ static void *scope_thread(void *arg) { # endif for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) { phy_scope_eNB(form_enb[UE_id], - PHY_vars_eNB_g[eNB_id], + PHY_vars_eNB_g[eNB_id][0], UE_id); } @@ -844,20 +844,21 @@ static void * eNB_thread_tx(void *param) { vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_ENB, proc->subframe*2); if (oai_exit) break; - - if ((((PHY_vars_eNB_g[0]->lte_frame_parms.frame_type == TDD)&& - (subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms,proc->subframe_tx)==SF_DL))|| - (PHY_vars_eNB_g[0]->lte_frame_parms.frame_type == FDD))) { - - phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0],0,no_relay,NULL); + + if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD)&& + (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_DL))|| + (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) { + + phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); + } - if ((subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms,proc->subframe_tx)==SF_S)) { - phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0],0,no_relay,NULL); + if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_S)) { + phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); } - - do_OFDM_mod(proc->subframe_tx,PHY_vars_eNB_g[0]); + + do_OFDM_mod(proc->subframe_tx,PHY_vars_eNB_g[0][proc->CC_id]); if (pthread_mutex_lock(&proc->mutex_tx) != 0) { printf("[openair][SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe); @@ -900,7 +901,6 @@ static void * eNB_thread_rx(void *param) { //unsigned long cpuid; eNB_proc_t *proc = (eNB_proc_t*)param; - int i; // RTIME time_in,time_out; #ifdef RTAI RT_TASK *task; @@ -964,12 +964,12 @@ static void * eNB_thread_rx(void *param) { if (oai_exit) break; - if ((((PHY_vars_eNB_g[0]->lte_frame_parms.frame_type == TDD )&&(subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms,proc->subframe_rx)==SF_UL)) || - (PHY_vars_eNB_g[0]->lte_frame_parms.frame_type == FDD))){ - phy_procedures_eNB_RX(proc->subframe,PHY_vars_eNB_g[0],0,no_relay); + if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD )&&(subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx)==SF_UL)) || + (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))){ + phy_procedures_eNB_RX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay); } - if ((subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms,proc->subframe_rx)==SF_S)){ - phy_procedures_eNB_S_RX(proc->subframe,PHY_vars_eNB_g[0],0,no_relay); + if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx)==SF_S)){ + phy_procedures_eNB_S_RX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay); } if (pthread_mutex_lock(&proc->mutex_rx) != 0) { @@ -1014,97 +1014,103 @@ static void * eNB_thread_rx(void *param) { void init_eNB_proc() { int i; - - - - for (i=0;i<10;i++) { - pthread_attr_init (&attr_eNB_proc_tx[i]); - pthread_attr_setstacksize(&attr_eNB_proc_tx[i],OPENAIR_THREAD_STACK_SIZE); - //attr_dlsch_threads.priority = 1; - sched_param_eNB_proc_tx[i].sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_eNB_proc_tx[i], &sched_param_eNB_proc_tx); - pthread_attr_setschedpolicy (&attr_eNB_proc_tx[i], SCHED_FIFO); - - pthread_attr_init (&attr_eNB_proc_rx[i]); - pthread_attr_setstacksize(&attr_eNB_proc_rx[i],OPENAIR_THREAD_STACK_SIZE); - //attr_dlsch_threads.priority = 1; - sched_param_eNB_proc_rx[i].sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_eNB_proc_rx[i], &sched_param_eNB_proc_rx); - pthread_attr_setschedpolicy (&attr_eNB_proc_rx[i], SCHED_FIFO); - - PHY_vars_eNB_g[0]->proc[i].instance_cnt_tx=-1; - PHY_vars_eNB_g[0]->proc[i].instance_cnt_rx=-1; - PHY_vars_eNB_g[0]->proc[i].subframe=i; - pthread_mutex_init(&PHY_vars_eNB_g[0]->proc[i].mutex_tx,NULL); - pthread_mutex_init(&PHY_vars_eNB_g[0]->proc[i].mutex_rx,NULL); - pthread_cond_init(&PHY_vars_eNB_g[0]->proc[i].cond_tx,NULL); - pthread_cond_init(&PHY_vars_eNB_g[0]->proc[i].cond_rx,NULL); - pthread_create(&PHY_vars_eNB_g[0]->proc[i].pthread_tx,NULL,eNB_thread_tx,(void*)&PHY_vars_eNB_g[0]->proc[i]); - pthread_create(&PHY_vars_eNB_g[0]->proc[i].pthread_rx,NULL,eNB_thread_rx,(void*)&PHY_vars_eNB_g[0]->proc[i]); - PHY_vars_eNB_g[0]->proc[i].frame_tx = 0; - PHY_vars_eNB_g[0]->proc[i].frame_rx = 0; + int CC_id; + + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + for (i=0;i<10;i++) { + pthread_attr_init (&attr_eNB_proc_tx[CC_id][i]); + pthread_attr_setstacksize(&attr_eNB_proc_tx[CC_id][i],OPENAIR_THREAD_STACK_SIZE); + //attr_dlsch_threads.priority = 1; + sched_param_eNB_proc_tx[CC_id][i].sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&attr_eNB_proc_tx[CC_id][i], &sched_param_eNB_proc_tx[CC_id][i]); + pthread_attr_setschedpolicy (&attr_eNB_proc_tx[CC_id][i], SCHED_FIFO); + + pthread_attr_init (&attr_eNB_proc_rx[CC_id][i]); + pthread_attr_setstacksize(&attr_eNB_proc_rx[CC_id][i],OPENAIR_THREAD_STACK_SIZE); + //attr_dlsch_threads.priority = 1; + sched_param_eNB_proc_rx[CC_id][i].sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&attr_eNB_proc_rx[CC_id][i], &sched_param_eNB_proc_rx[CC_id][i]); + pthread_attr_setschedpolicy (&attr_eNB_proc_rx[CC_id][i], SCHED_FIFO); + + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_tx=-1; + PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx=-1; + PHY_vars_eNB_g[0][CC_id]->proc[i].subframe=i; + PHY_vars_eNB_g[0][CC_id]->proc[i].CC_id = CC_id; + pthread_mutex_init(&PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx,NULL); + pthread_mutex_init(&PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx,NULL); + pthread_cond_init(&PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx,NULL); + pthread_cond_init(&PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx,NULL); + pthread_create(&PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx,NULL,eNB_thread_tx,(void*)&PHY_vars_eNB_g[0][CC_id]->proc[i]); + pthread_create(&PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx,NULL,eNB_thread_rx,(void*)&PHY_vars_eNB_g[0][CC_id]->proc[i]); + PHY_vars_eNB_g[0][CC_id]->proc[i].frame_tx = 0; + PHY_vars_eNB_g[0][CC_id]->proc[i].frame_rx = 0; #ifndef USRP - PHY_vars_eNB_g[0]->proc[i].subframe_rx = (i+9)%10; - PHY_vars_eNB_g[0]->proc[i].subframe_tx = (i+1)%10; + PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_rx = (i+9)%10; + PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_tx = (i+1)%10; #else - PHY_vars_eNB_g[0]->proc[i].subframe_rx = i; - PHY_vars_eNB_g[0]->proc[i].subframe_tx = (i+2)%10; + PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_rx = i; + PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_tx = (i+2)%10; #endif - } - - + } + } + + #ifndef USRP // TX processes subframe + 1, RX subframe -1 // Note this inialization is because the first process awoken for frame 0 is number 1 and so processes 9 and 0 have to start with frame 1 - - //PHY_vars_eNB_g[0]->proc[0].frame_rx = 1023; - PHY_vars_eNB_g[0]->proc[9].frame_tx = 1; - PHY_vars_eNB_g[0]->proc[0].frame_tx = 1; + + //PHY_vars_eNB_g[0][CC_id]->proc[0].frame_rx = 1023; + PHY_vars_eNB_g[0][CC_id]->proc[9].frame_tx = 1; + PHY_vars_eNB_g[0][CC_id]->proc[0].frame_tx = 1; #else - // TX processes subframe +2, RX subframe - // Note this inialization is because the first process awoken for frame 0 is number 1 and so processes 8,9 and 0 have to start with frame 1 - PHY_vars_eNB_g[0]->proc[8].frame_tx = 1; - PHY_vars_eNB_g[0]->proc[9].frame_tx = 1; - PHY_vars_eNB_g[0]->proc[0].frame_tx = 1; + // TX processes subframe +2, RX subframe + // Note this inialization is because the first process awoken for frame 0 is number 1 and so processes 8,9 and 0 have to start with frame 1 + PHY_vars_eNB_g[0][CC_id]->proc[8].frame_tx = 1; + PHY_vars_eNB_g[0][CC_id]->proc[9].frame_tx = 1; + PHY_vars_eNB_g[0][CC_id]->proc[0].frame_tx = 1; #endif - } + } +} void kill_eNB_proc() { int i; int *status_tx,*status_rx; + int CC_id; - for (i=0;i<10;i++) { - + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) + for (i=0;i<10;i++) { + #ifdef DEBUG_THREADS - printf("Killing TX thread %d\n",i); + printf("Killing TX CC_id %d thread %d\n",CC_id,i); #endif - PHY_vars_eNB_g[0]->proc[i].instance_cnt_tx=0; - pthread_cond_signal(&PHY_vars_eNB_g[0]->proc[i].cond_tx); + PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_tx=0; + pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx); #ifdef DEBUG_THREADS - printf("Joining eNB TX thread %d...",i); + printf("Joining eNB TX CC_id %d thread %d...",CC_id,i); #endif - pthread_join(PHY_vars_eNB_g[0]->proc[i].pthread_tx,(void**)status_tx); + pthread_join(PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx,(void**)status_tx); #ifdef DEBUG_THREADS - if (status_tx) printf("status %d...",*status_tx); + if (status_tx) printf("status %d...",*status_tx); #endif #ifdef DEBUG_THREADS - printf("Killing RX thread %d\n",i); + printf("Killing RX CC_id %d thread %d\n",CC_id,i); #endif - PHY_vars_eNB_g[0]->proc[i].instance_cnt_rx=0; - pthread_cond_signal(&PHY_vars_eNB_g[0]->proc[i].cond_rx); + PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx=0; + pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx); #ifdef DEBUG_THREADS - printf("Joining eNB RX thread %d...",i); + printf("Joining eNB RX CC_id %d thread %d...",CC_id,i); #endif - pthread_join(PHY_vars_eNB_g[0]->proc[i].pthread_rx,(void**)status_rx); + pthread_join(PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx,(void**)status_rx); #ifdef DEBUG_THREADS - if (status_rx) printf("status %d...",*status_rx); + if (status_rx) printf("status %d...",*status_rx); #endif - pthread_mutex_destroy(&PHY_vars_eNB_g[0]->proc[i].mutex_tx); - pthread_mutex_destroy(&PHY_vars_eNB_g[0]->proc[i].mutex_rx); - pthread_cond_destroy(&PHY_vars_eNB_g[0]->proc[i].cond_tx); - pthread_cond_destroy(&PHY_vars_eNB_g[0]->proc[i].cond_rx); - } + pthread_mutex_destroy(&PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx); + pthread_mutex_destroy(&PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx); + pthread_cond_destroy(&PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx); + pthread_cond_destroy(&PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx); + } } @@ -1127,6 +1133,7 @@ static void *eNB_thread(void *arg) unsigned char slot=1; #endif int frame=0; + int CC_id; RTIME time_in, time_diff; @@ -1136,13 +1143,13 @@ static void *eNB_thread(void *arg) int mbox_target=0,mbox_current=0; int hw_slot,delay_cnt; int diff; - int i; int ret; #else unsigned int rx_cnt = 0; unsigned int tx_cnt = tx_delay; // int tx_offset; + int CC_id; hw_subframe = 0; @@ -1349,55 +1356,57 @@ static void *eNB_thread(void *arg) if (multi_thread == 0) { if ((slot&1) == 0) { LOG_I(PHY,"[eNB] Single thread slot %d\n",slot); - phy_procedures_eNB_lte ((2+(slot>>1))%10, PHY_vars_eNB_g[0], 0, no_relay,NULL); - do_OFDM_mod((2+(slot>>1))%10,PHY_vars_eNB_g[0]); + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + phy_procedures_eNB_lte ((2+(slot>>1))%10, PHY_vars_eNB_g[0][CC_id], 0, no_relay,NULL); + do_OFDM_mod((2+(slot>>1))%10,PHY_vars_eNB_g[0][CC_id]); + } } } else { // multi-thread > 0 if ((slot&1) == 1) { sf = ((slot>>1)+1)%10; - // LOG_I(PHY,"[eNB] Multithread slot %d (IC %d)\n",slot,PHY_vars_eNB_g[0]->proc[sf].instance_cnt); - - if (pthread_mutex_lock(&PHY_vars_eNB_g[0]->proc[sf].mutex_tx) != 0) { - LOG_E(PHY,"[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n",sf,PHY_vars_eNB_g[0]->proc[sf].instance_cnt_tx); - } - else { - // LOG_I(PHY,"[eNB] Waking up eNB process %d (IC %d)\n",sf,PHY_vars_eNB_g[0]->proc[sf].instance_cnt); - PHY_vars_eNB_g[0]->proc[sf].instance_cnt_tx++; - pthread_mutex_unlock(&PHY_vars_eNB_g[0]->proc[sf].mutex_tx); - if (PHY_vars_eNB_g[0]->proc[sf].instance_cnt_tx == 0) { - if (pthread_cond_signal(&PHY_vars_eNB_g[0]->proc[sf].cond_tx) != 0) { - LOG_E(PHY,"[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n",sf); - } + // LOG_I(PHY,"[eNB] Multithread slot %d (IC %d)\n",slot,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt); + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_tx) != 0) { + LOG_E(PHY,"[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx); } else { - LOG_W(PHY,"[eNB] Frame %d, eNB TX thread %d busy!!\n",PHY_vars_eNB_g[0]->proc[sf].frame_tx,sf); - oai_exit=1; - } - } - - if (pthread_mutex_lock(&PHY_vars_eNB_g[0]->proc[sf].mutex_rx) != 0) { - LOG_E(PHY,"[eNB] ERROR pthread_mutex_lock for eNB RX thread %d (IC %d)\n",sf,PHY_vars_eNB_g[0]->proc[sf].instance_cnt_rx); - } - else { - // LOG_I(PHY,"[eNB] Waking up eNB process %d (IC %d)\n",sf,PHY_vars_eNB_g[0]->proc[sf].instance_cnt); - PHY_vars_eNB_g[0]->proc[sf].instance_cnt_rx++; - pthread_mutex_unlock(&PHY_vars_eNB_g[0]->proc[sf].mutex_rx); - if (PHY_vars_eNB_g[0]->proc[sf].instance_cnt_rx == 0) { - if (pthread_cond_signal(&PHY_vars_eNB_g[0]->proc[sf].cond_rx) != 0) { - LOG_E(PHY,"[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n",sf); + // LOG_I(PHY,"[eNB] Waking up eNB process %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt); + PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx++; + pthread_mutex_unlock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_tx); + if (PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx == 0) { + if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_tx) != 0) { + LOG_E(PHY,"[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n",sf); + } + } + else { + LOG_W(PHY,"[eNB] Frame %d, eNB TX thread %d busy!!\n",PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_tx,sf); + oai_exit=1; } } + + if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx) != 0) { + LOG_E(PHY,"[eNB] ERROR pthread_mutex_lock for eNB RX thread %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx); + } else { - LOG_W(PHY,"[eNB] Frame %d, eNB RX thread %d busy!!\n",PHY_vars_eNB_g[0]->proc[sf].frame_rx,sf); - oai_exit=1; + // LOG_I(PHY,"[eNB] Waking up eNB process %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt); + PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx++; + pthread_mutex_unlock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx); + if (PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx == 0) { + if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_rx) != 0) { + LOG_E(PHY,"[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n",sf); + } + } + else { + LOG_W(PHY,"[eNB] Frame %d, eNB RX thread %d busy!!\n",PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_rx,sf); + oai_exit=1; + } } + } - } } } - #ifndef RTAI //pthread_mutex_lock(&tti_mutex); #endif @@ -1507,7 +1516,7 @@ static void *UE_thread(void *arg) { if (is_synchronized) { //this is the mbox counter that indicates the start of the frame - rx_offset_mbox = (PHY_vars_UE_g[0]->rx_offset * 150) / (10*PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti); + rx_offset_mbox = (PHY_vars_UE_g[0][0]->rx_offset * 150) / (10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti); //this is the mbox counter where we should be mbox_target = (((((slot+1)%20)*15+1)>>1) + rx_offset_mbox + 1)%150; // round up to the next multiple of two (mbox counter from express MIMO gives only even numbers) @@ -1583,7 +1592,7 @@ static void *UE_thread(void *arg) { next_slot = (slot+3)%LTE_SLOTS_PER_FRAME; if (is_synchronized) { - phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0], 0, 0,mode,0,NULL); + phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0][0], 0, 0,mode,0,NULL); } else { // we are not yet synchronized @@ -1595,7 +1604,7 @@ static void *UE_thread(void *arg) { // rt_sleep_ns(FRAME_PERIOD); // LOG_D(HW,"after sleep\n"); - if (initial_sync(PHY_vars_UE_g[0],mode)==0) { + if (initial_sync(PHY_vars_UE_g[0][0],mode)==0) { /* lte_adjust_synch(&PHY_vars_UE_g[0]->lte_frame_parms, PHY_vars_UE_g[0], @@ -1618,7 +1627,7 @@ static void *UE_thread(void *arg) { //LOG_D(HW,"Before openair0_start_rt_acquisition \n"); openair0_start_rt_acquisition(card); - hw_slot_offset = (PHY_vars_UE_g[0]->rx_offset<<1) / PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti; + hw_slot_offset = (PHY_vars_UE_g[0][0]->rx_offset<<1) / PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti; LOG_D(HW,"Got synch: hw_slot_offset %d\n",hw_slot_offset); } } @@ -1866,7 +1875,7 @@ int main(int argc, char **argv) { void *status; #endif - + int CC_id; uint16_t Nid_cell = 0; uint8_t cooperation_flag=0, transmission_mode=1, abstraction_flag=0; #ifndef OPENAIR2 @@ -2052,85 +2061,96 @@ int main(int argc, char **argv) { // N_ZC = (prach_fmt <4)?839:139; if (UE_flag==1) { - PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE*)); - PHY_vars_UE_g[0] = init_lte_UE(frame_parms, UE_id,abstraction_flag,transmission_mode); - -#ifndef OPENAIR2 - for (i=0;i<NUMBER_OF_eNB_MAX;i++) { - PHY_vars_UE_g[0]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; - PHY_vars_UE_g[0]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; - PHY_vars_UE_g[0]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; + PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE**)); + PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_UE*)*MAX_NUM_CCs); + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + PHY_vars_UE_g[CC_id][0] = init_lte_UE(frame_parms, UE_id,abstraction_flag,transmission_mode); - PHY_vars_UE_g[0]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = UE_id; - PHY_vars_UE_g[0]->scheduling_request_config[i].sr_ConfigIndex = 7+(UE_id%3); - PHY_vars_UE_g[0]->scheduling_request_config[i].dsr_TransMax = sr_n4; - } +#ifndef OPENAIR2 + for (i=0;i<NUMBER_OF_eNB_MAX;i++) { + PHY_vars_UE_g[CC_id][0]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; + PHY_vars_UE_g[CC_id][0]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; + PHY_vars_UE_g[CC_id][0]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; + + PHY_vars_UE_g[CC_id][0]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = UE_id; + PHY_vars_UE_g[CC_id][0]->scheduling_request_config[i].sr_ConfigIndex = 7+(UE_id%3); + PHY_vars_UE_g[CC_id][0]->scheduling_request_config[i].dsr_TransMax = sr_n4; + } #endif - - compute_prach_seq(&PHY_vars_UE_g[0]->lte_frame_parms.prach_config_common, - PHY_vars_UE_g[0]->lte_frame_parms.frame_type, - PHY_vars_UE_g[0]->X_u); - - PHY_vars_UE_g[0]->lte_ue_pdcch_vars[0]->crnti = 0x1234; + + compute_prach_seq(&PHY_vars_UE_g[CC_id][0]->lte_frame_parms.prach_config_common, + PHY_vars_UE_g[CC_id][0]->lte_frame_parms.frame_type, + PHY_vars_UE_g[CC_id][0]->X_u); + + PHY_vars_UE_g[CC_id][0]->lte_ue_pdcch_vars[0]->crnti = 0x1234; #ifndef OPENAIR2 - PHY_vars_UE_g[0]->lte_ue_pdcch_vars[0]->crnti = 0x1235; + PHY_vars_UE_g[CC_id][0]->lte_ue_pdcch_vars[0]->crnti = 0x1235; #endif - NB_UE_INST=1; - NB_INST=1; - - openair_daq_vars.manual_timing_advance = 0; - //openair_daq_vars.timing_advance = TIMING_ADVANCE_HW; - openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; - openair_daq_vars.auto_freq_correction = 0; - openair_daq_vars.use_ia_receiver = 0; - + for (i=0;i<4;i++) { - PHY_vars_UE_g[0]->rx_gain_max[i] = rxg_max[i]; - // PHY_vars_UE_g[0]->rx_gain_med[i] = rxg_med[i]; - // PHY_vars_UE_g[0]->rx_gain_byp[i] = rxg_byp[i]; + PHY_vars_UE_g[CC_id][0]->rx_gain_max[i] = rxg_max[i]; + // PHY_vars_UE_g[CC_id][0]->rx_gain_med[i] = rxg_med[i]; + // PHY_vars_UE_g[CC_id][0]->rx_gain_byp[i] = rxg_byp[i]; } if ((mode == normal_txrx) || (mode == rx_calib_ue) || (mode == no_L2_connect) || (mode == debug_prach)) { for (i=0;i<4;i++) openair0_cfg.rxg_mode[i] = max_gain; - PHY_vars_UE_g[0]->rx_total_gain_dB = PHY_vars_UE_g[0]->rx_gain_max[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain + PHY_vars_UE_g[CC_id][0]->rx_total_gain_dB = PHY_vars_UE_g[CC_id][0]->rx_gain_max[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain } else if ((mode == rx_calib_ue_med)) { for (i=0;i<4;i++) openair0_cfg.rxg_mode[i] = med_gain; - PHY_vars_UE_g[0]->rx_total_gain_dB = PHY_vars_UE_g[0]->rx_gain_med[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain; + PHY_vars_UE_g[CC_id][0]->rx_total_gain_dB = PHY_vars_UE_g[CC_id][0]->rx_gain_med[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain; } else if ((mode == rx_calib_ue_byp)) { for (i=0;i<4;i++) openair0_cfg.rxg_mode[i] = byp_gain; - PHY_vars_UE_g[0]->rx_total_gain_dB = PHY_vars_UE_g[0]->rx_gain_byp[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain; + PHY_vars_UE_g[CC_id][0]->rx_total_gain_dB = PHY_vars_UE_g[CC_id][0]->rx_gain_byp[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain; } - PHY_vars_UE_g[0]->tx_power_max_dBm = tx_max_power; + PHY_vars_UE_g[CC_id][0]->tx_power_max_dBm = tx_max_power; + } + NB_UE_INST=1; + NB_INST=1; + + openair_daq_vars.manual_timing_advance = 0; + //openair_daq_vars.timing_advance = TIMING_ADVANCE_HW; + openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; + openair_daq_vars.auto_freq_correction = 0; + openair_daq_vars.use_ia_receiver = 0; + + // printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_power,tx_max_power)); } else { //this is eNB - PHY_vars_eNB_g = malloc(sizeof(PHY_VARS_eNB*)); - PHY_vars_eNB_g[0] = init_lte_eNB(frame_parms,eNB_id,Nid_cell,cooperation_flag,transmission_mode,abstraction_flag); - + PHY_vars_eNB_g = malloc(sizeof(PHY_VARS_eNB**)); + PHY_vars_eNB_g[0] = malloc(sizeof(PHY_VARS_eNB*)); + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + PHY_vars_eNB_g[0][CC_id] = init_lte_eNB(frame_parms,eNB_id,Nid_cell,cooperation_flag,transmission_mode,abstraction_flag); + + #ifndef OPENAIR2 - for (i=0;i<NUMBER_OF_UE_MAX;i++) { - PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; - PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; - PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; - - PHY_vars_eNB_g[0]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i; - PHY_vars_eNB_g[0]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3); - PHY_vars_eNB_g[0]->scheduling_request_config[i].dsr_TransMax = sr_n4; - } + for (i=0;i<NUMBER_OF_UE_MAX;i++) { + PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; + PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; + PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; + + PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i; + PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3); + PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; + } #endif + + compute_prach_seq(&PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.prach_config_common, + PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.frame_type, + PHY_vars_eNB_g[0][CC_id]->X_u); - compute_prach_seq(&PHY_vars_eNB_g[0]->lte_frame_parms.prach_config_common, - PHY_vars_eNB_g[0]->lte_frame_parms.frame_type, - PHY_vars_eNB_g[0]->X_u); + PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB = rxg_max[0] + (int)rx_gain - 30; //was measured at rxgain=30; + } NB_eNB_INST=1; NB_INST=1; @@ -2140,7 +2160,6 @@ int main(int argc, char **argv) { openair_daq_vars.target_ue_ul_mcs=6; // set eNB to max gain - PHY_vars_eNB_g[0]->rx_total_gain_eNB_dB = rxg_max[0] + (int)rx_gain - 30; //was measured at rxgain=30; for (i=0;i<4;i++) openair0_cfg.rxg_mode[i] = max_gain; } @@ -2257,24 +2276,26 @@ int main(int argc, char **argv) { // connect the TX/RX buffers if (UE_flag==1) { - setup_ue_buffers(PHY_vars_UE_g[0],frame_parms,ant_offset); - printf("Setting UE buffer to all-RX\n"); - // Set LSBs for antenna switch (ExpressMIMO) - for (i=0; i<frame_parms->samples_per_tti*10; i++) - for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) - PHY_vars_UE_g[0]->lte_ue_common_vars.txdata[aa][i] = 0x00010001; - + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + setup_ue_buffers(PHY_vars_UE_g[CC_id][0],frame_parms,ant_offset); + printf("Setting UE buffer to all-RX\n"); + // Set LSBs for antenna switch (ExpressMIMO) + for (i=0; i<frame_parms->samples_per_tti*10; i++) + for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) + PHY_vars_UE_g[CC_id][0]->lte_ue_common_vars.txdata[aa][i] = 0x00010001; + } //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX; } else { - setup_eNB_buffers(PHY_vars_eNB_g[0],frame_parms,ant_offset); - printf("Setting eNB buffer to all-RX\n"); - // Set LSBs for antenna switch (ExpressMIMO) - for (i=0; i<frame_parms->samples_per_tti*10; i++) - for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) - PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001; + for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { + setup_eNB_buffers(PHY_vars_eNB_g[CC_id][0],frame_parms,ant_offset); + printf("Setting eNB buffer to all-RX\n"); + // Set LSBs for antenna switch (ExpressMIMO) + for (i=0; i<frame_parms->samples_per_tti*10; i++) + for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) + PHY_vars_eNB_g[CC_id][0]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001; + } } - #ifndef USRP openair0_dump_config(card); #endif