diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index 8b91a74b4923ec5cc7d3f30c6dc87875a7c6d228..b7700ec06fc04c3225c705739cca1320d2160e75 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -52,7 +52,7 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf openair0_dev_init_exmimo(device, openair0_cfg); printf("openair0_dev_init_exmimo...\n"); #elif OAI_USRP - device->type=USRP_IF; + device->type=USRP_B200_IF; openair0_dev_init_usrp(device, openair0_cfg); printf("openair0_dev_init_usrp ...\n"); #elif OAI_BLADERF diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 8432441568321c2754afbf4905bed00e34be6adb..4f7e8014486e58eb44471161925cf72ca8076b80 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -151,8 +151,10 @@ typedef enum { ETH_IF, /*!\brief device is ExpressMIMO */ EXMIMO_IF, - /*!\brief device is USRP*/ - USRP_IF, + /*!\brief device is USRP B200/B210*/ + USRP_B200_IF, + /*!\brief device is USRP X300/X310*/ + USRP_X300_IF, /*!\brief device is BLADE RF*/ BLADERF_IF, /*!\brief device is NONE*/ diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index e0be5a66d31e27292127035610a4704dc06806ad..2371b04770f3981be95ca53a0b847455ac8e611d 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -171,45 +171,44 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp #endif - /* - if (cc>1) { - // receive multiple channels (e.g. RF A and RF B) - std::vector<void *> buff_ptrs; - - for (int i=0;i<cc;i++) buff_ptrs.push_back(buff_tmp[i]); - samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md); - } else { - // receive a single channel (e.g. from connector RF A) - samples_received = s->rx_stream->recv(buff_tmp[0], nsamps, s->rx_md); - }*/ - - if (cc>1) { + if (device->type == USRP_B200_IF) { + if (cc>1) { // receive multiple channels (e.g. RF A and RF B) - std::vector<void *> buff_ptrs; + std::vector<void *> buff_ptrs; - for (int i=0;i<cc;i++) buff_ptrs.push_back(buff[i]); - samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md); - } else { + for (int i=0;i<cc;i++) buff_ptrs.push_back(buff_tmp[i]); + samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md); + } else { // receive a single channel (e.g. from connector RF A) - samples_received = s->rx_stream->recv(buff[0], nsamps, s->rx_md); - } - - /* + samples_received = s->rx_stream->recv(buff_tmp[0], nsamps, s->rx_md); + } + // bring RX data into 12 LSBs for softmodem RX - for (int i=0;i<cc;i++) { - for (int j=0; j<nsamps2; j++) { + for (int i=0;i<cc;i++) { + for (int j=0; j<nsamps2; j++) { #if defined(__x86_64__) || defined(__i386__) #ifdef __AVX2__ - ((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],4); + ((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],4); #else - ((__m128i *)buff[i])[j] = _mm_srai_epi16(buff_tmp[i][j],4); + ((__m128i *)buff[i])[j] = _mm_srai_epi16(buff_tmp[i][j],4); #endif #elif defined(__arm__) - ((int16x8_t*)buff[i])[j] = vshrq_n_s16(buff_tmp[i][j],4); + ((int16x8_t*)buff[i])[j] = vshrq_n_s16(buff_tmp[i][j],4); #endif + } } + } else if (device->type == USRP_X300_IF) { + if (cc>1) { + // receive multiple channels (e.g. RF A and RF B) + std::vector<void *> buff_ptrs; + + for (int i=0;i<cc;i++) buff_ptrs.push_back(buff[i]); + samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md); + } else { + // receive a single channel (e.g. from connector RF A) + samples_received = s->rx_stream->recv(buff[0], nsamps, s->rx_md); } - */ + } if (samples_received < nsamps) { printf("[recv] received %d samples out of %d\n",samples_received,nsamps); @@ -397,6 +396,9 @@ int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_ // lock mboard clocks s->usrp->set_clock_source("internal"); + //Setting device type to USRP X300/X310 + device->type=USRP_X300_IF; + // this is not working yet, master clock has to be set via constructor // set master clock rate and sample rate for tx & rx for streaming //s->usrp->set_master_clock_rate(usrp_master_clock); diff --git a/targets/RT/USER/eNB_transport_IQ.c b/targets/RT/USER/eNB_transport_IQ.c index 07533ff59cfd66b7ee3755797e5bd99338f31bb3..af3873ef76cfd4b940988333c93f4c9d586f5fb7 100644 --- a/targets/RT/USER/eNB_transport_IQ.c +++ b/targets/RT/USER/eNB_transport_IQ.c @@ -172,7 +172,7 @@ void config_BBU_mod( rrh_module_t *mod_enb, uint8_t RT_flag, uint8_t NRT_flag) { mod_enb->devs->openair0_cfg.tx_delay = 8; } } - else if (mod_enb->devs->type == USRP_IF) { + else if ((mod_enb->devs->type == USRP_B200_IF )||(mod_enb->devs->type == USRP_X300_IF )) { if ( mod_enb->devs->openair0_cfg.num_rb_dl == 100 ) { mod_enb->devs->openair0_cfg.samples_per_packet = 2048; mod_enb->devs->openair0_cfg.tx_forward_nsamps = 175; diff --git a/targets/RT/USER/rrh_gw.c b/targets/RT/USER/rrh_gw.c index 39b726ae07472a200c274f307005e399903848db..89c8679554ef7053b2853dc8b10d4ea01145ded9 100644 --- a/targets/RT/USER/rrh_gw.c +++ b/targets/RT/USER/rrh_gw.c @@ -216,7 +216,7 @@ static rrh_module_t new_module (unsigned int id) { LOG_I(RRH,"Setting RF device to EXMIMO\n"); #elif OAI_USRP rrh_mod.devs=oai_dv; - rrh_mod.devs->type=USRP_IF; + rrh_mod.devs->type=USRP_B200_IF; LOG_I(RRH,"Setting RF device to USRP\n"); #elif OAI_BLADERF rrh_mod.devs=oai_dv; diff --git a/targets/RT/USER/rrh_gw.h b/targets/RT/USER/rrh_gw.h index 69546dbe07e9fbf41de6b943fa1239457bd56aab..739e2088b221296d20037b15fd2e65a1f51ed9ad 100644 --- a/targets/RT/USER/rrh_gw.h +++ b/targets/RT/USER/rrh_gw.h @@ -51,7 +51,7 @@ /*! \brief RRH supports two types of modules: eNB and UE each module is associated with an ethernet device (device of ETH_IF) - and optionally with a RF device (device type can be USRP_IF/BLADERF_IF/EXMIMO_IF/NONE_IF) + and optionally with a RF device (device type can be USRP_B200/USRP_X300/BLADERF_IF/EXMIMO_IF/NONE_IF) UE modules will always have RF device type NONE_IF */ typedef struct { /*! \brief module id */