Commit 91f312eb authored by Raymond Knopp's avatar Raymond Knopp

12->16bit rescaling (transmission) for USRP device

parent 0fccd994
...@@ -145,46 +145,75 @@ static void trx_usrp_end(openair0_device *device) { ...@@ -145,46 +145,75 @@ static void trx_usrp_end(openair0_device *device) {
@param flags flags must be set to TRUE if timestamp parameter needs to be applied @param flags flags must be set to TRUE if timestamp parameter needs to be applied
*/ */
static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
int ret=0; int ret=0;
usrp_state_t *s = (usrp_state_t*)device->priv; usrp_state_t *s = (usrp_state_t*)device->priv;
s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); int nsamps2; // aligned to upper 32 or 16 byte boundary
s->tx_md.has_time_spec = flags; #if defined(__x86_64) || defined(__i386__)
#ifdef __AVX2__
nsamps2 = (nsamps+7)>>3;
if(flags>0) __m256i buff_tx[2][nsamps2];
s->tx_md.has_time_spec = true; #else
else nsamps2 = (nsamps+3)>>2;
s->tx_md.has_time_spec = false; __m128i buff_tx[2][nsamps2];
#endif
if (flags == 2) { // start of burst #elif defined(__arm__)
s->tx_md.start_of_burst = true; nsamps2 = (nsamps+3)>>2;
s->tx_md.end_of_burst = false; int16x8_t buff_tx[2][nsamps2];
} else if (flags == 3) { // end of burst #endif
s->tx_md.start_of_burst = false;
s->tx_md.end_of_burst = true; // bring RX data into 12 LSBs for softmodem RX
} else if (flags == 4) { // start and end for (int i=0; i<cc; i++) {
s->tx_md.start_of_burst = true; for (int j=0; j<nsamps2; j++) {
s->tx_md.end_of_burst = true; #if defined(__x86_64__) || defined(__i386__)
} else if (flags==1) { // middle of burst #ifdef __AVX2__
s->tx_md.start_of_burst = false; buff_tx[i][j] = _mm256_slli_epi16(((__m256i*)buff[i])[j],4);
s->tx_md.end_of_burst = false; #else
buff_tx[i][j] = _mm_slli_epi16(((__m128i*)buff128[i])[j],4);
#endif
#elif defined(__arm__)
buff_tx[i][j] = vshlq_n_s16(((int16x8_t*)buff128[i])[j],4);
#endif
} }
}
if (cc>1) { s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate);
std::vector<void *> buff_ptrs; s->tx_md.has_time_spec = flags;
for (int i=0; i<cc; i++)
buff_ptrs.push_back(buff[i]);
ret = (int)s->tx_stream->send(buff_ptrs, nsamps, s->tx_md,1e-3); if(flags>0)
} else s->tx_md.has_time_spec = true;
ret = (int)s->tx_stream->send(buff[0], nsamps, s->tx_md,1e-3); else
s->tx_md.has_time_spec = false;
if (flags == 2) { // start of burst
if (ret != nsamps) s->tx_md.start_of_burst = true;
LOG_E(PHY,"[xmit] tx samples %d != %d\n",ret,nsamps); s->tx_md.end_of_burst = false;
} else if (flags == 3) { // end of burst
return ret; s->tx_md.start_of_burst = false;
s->tx_md.end_of_burst = true;
} else if (flags == 4) { // start and end
s->tx_md.start_of_burst = true;
s->tx_md.end_of_burst = true;
} else if (flags==1) { // middle of burst
s->tx_md.start_of_burst = false;
s->tx_md.end_of_burst = false;
}
if (cc>1) {
std::vector<void *> buff_ptrs;
for (int i=0; i<cc; i++)
buff_ptrs.push_back(buff_tx[i]);
ret = (int)s->tx_stream->send(buff_ptrs, nsamps, s->tx_md,1e-3);
} else
ret = (int)s->tx_stream->send(buff_tx[0], nsamps, s->tx_md,1e-3);
if (ret != nsamps)
LOG_E(PHY,"[xmit] tx samples %d != %d\n",ret,nsamps);
return ret;
} }
/*! \brief Receive samples from hardware. /*! \brief Receive samples from hardware.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment