Commit 0da60274 authored by Cedric Roux's avatar Cedric Roux

bladerf: tentative to have it functional

Several problems are present.

The first is that _write returns 0 instead of the
number of samples. We solve it by returning
nsamps.

The second is that _read may return less samples at
the beginning and we don't want to exit for that.
We solve it also by returning nsamps.
(We still need to log more in this, to be done in the
next commit.)

The third is that after initialization we don't send
anything for a while, time for the softmodem to finish
its init. This generates lots of "RX overrun".
We solve it by disabling TX and RX modules after init
and then in trx_brf_start we activate them again (and
also call bladerf_sync_config, which seems to be
mandatory, and bladerf_calibrate_dc, which may be avoided,
perhaps).

Maybe not the end of the story. Sometimes it works, UE connects,
traffic is fine (tested only with 5MHz). Sometimes it does not,
UE does not connect, or it connects but then traffic is bad,
especially uplink.

To be refined.
parent f364d13d
...@@ -82,6 +82,48 @@ openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module mod ...@@ -82,6 +82,48 @@ openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module mod
* \returns 0 on success * \returns 0 on success
*/ */
int trx_brf_start(openair0_device *device) { int trx_brf_start(openair0_device *device) {
brf_state_t *brf = (brf_state_t*)device->priv;
int status;
brf->meta_tx.flags = 0;
if ((status = bladerf_sync_config(brf->dev,
BLADERF_MODULE_TX,
BLADERF_FORMAT_SC16_Q11_META,
brf->num_buffers,
brf->buffer_size,
brf->num_transfers,
100/*brf->tx_timeout_ms*/)) != 0 ) {
fprintf(stderr,"Failed to configure TX sync interface: %s\n", bladerf_strerror(status));
abort();
}
if ((status = bladerf_sync_config(brf->dev,
BLADERF_MODULE_RX,
BLADERF_FORMAT_SC16_Q11_META,
brf->num_buffers,
brf->buffer_size,
brf->num_transfers,
100/*brf->rx_timeout_ms*/)) != 0 ) {
fprintf(stderr,"Failed to configure RX sync interface: %s\n", bladerf_strerror(status));
abort();
}
if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_TX, true)) != 0) {
fprintf(stderr,"Failed to enable TX module: %s\n", bladerf_strerror(status));
abort();
}
if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_RX, true)) != 0) {
fprintf(stderr,"Failed to enable RX module: %s\n", bladerf_strerror(status));
abort();
}
if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_TX)) != 0) {
fprintf(stderr,"Failed to calibrate TX DC: %s\n", bladerf_strerror(status));
abort();
}
if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_RX)) != 0) {
fprintf(stderr,"Failed to calibrate RX DC: %s\n", bladerf_strerror(status));
abort();
}
return 0; return 0;
} }
...@@ -133,7 +175,7 @@ static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp, ...@@ -133,7 +175,7 @@ static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp,
brf->tx_count++; brf->tx_count++;
return(0); return nsamps; //brf->meta_tx.actual_count;
} }
/*! \brief Receive samples from hardware. /*! \brief Receive samples from hardware.
...@@ -155,6 +197,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, ...@@ -155,6 +197,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp,
// BRF has only one rx/tx chain // BRF has only one rx/tx chain
int16_t *samples = (int16_t*)buff[0]; int16_t *samples = (int16_t*)buff[0];
brf->meta_rx.actual_count = 0;
brf->meta_rx.flags = BLADERF_META_FLAG_RX_NOW; brf->meta_rx.flags = BLADERF_META_FLAG_RX_NOW;
status = bladerf_sync_rx(brf->dev, samples, (unsigned int) nsamps, &brf->meta_rx, 2*brf->rx_timeout_ms); status = bladerf_sync_rx(brf->dev, samples, (unsigned int) nsamps, &brf->meta_rx, 2*brf->rx_timeout_ms);
...@@ -180,7 +223,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, ...@@ -180,7 +223,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp,
*ptimestamp = brf->meta_rx.timestamp; *ptimestamp = brf->meta_rx.timestamp;
return brf->meta_rx.actual_count; return nsamps; //brf->meta_rx.actual_count;
} }
...@@ -188,6 +231,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, ...@@ -188,6 +231,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp,
* \param device the hardware to use * \param device the hardware to use
*/ */
void trx_brf_end(openair0_device *device) { void trx_brf_end(openair0_device *device) {
abort();
int status; int status;
brf_state_t *brf = (brf_state_t*)device->priv; brf_state_t *brf = (brf_state_t*)device->priv;
...@@ -1081,6 +1125,15 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { ...@@ -1081,6 +1125,15 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
// memcpy((void*)&device->openair0_cfg,(void*)&openair0_cfg[0],sizeof(openair0_config_t)); // memcpy((void*)&device->openair0_cfg,(void*)&openair0_cfg[0],sizeof(openair0_config_t));
if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_TX, false)) != 0) {
fprintf(stderr,"Failed to enable TX module: %s\n", bladerf_strerror(status));
abort();
}
if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_RX, false)) != 0) {
fprintf(stderr,"Failed to enable RX module: %s\n", bladerf_strerror(status));
abort();
}
return 0; return 0;
} }
......
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