Commit e46b2cfe authored by Joanne Hugé's avatar Joanne Hugé

Spectrum Analyzer can see signal in all 10MHz bandwidth (SISO)

parent b5aca5fd
/* DPDK */
#define MEMPOOL_CACHE_SIZE 256
#define RTE_TEST_RX_DESC_DEFAULT 1024
#define RTE_TEST_TX_DESC_DEFAULT 1024
static uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT;
static uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;
struct rte_mempool *tx_mbuf_pool;
struct rte_mempool *rx_mbuf_pool;
struct rte_ether_addr s_addr;
struct rte_ether_addr d_addr;
static const struct rte_eth_conf port_conf_default = {
.rxmode = { .max_lro_pkt_size = RTE_ETHER_MAX_LEN }
};
static inline int port_init(int portid, struct rte_mempool *rx_mbuf_pool) {
struct rte_eth_conf port_conf = port_conf_default;
const uint16_t rx_rings = 1, tx_rings = 1;
int retval;
uint16_t q;
retval = rte_eth_dev_configure(portid, rx_rings, tx_rings, &port_conf);
if (retval != 0)
return retval;
/* Allocate and set up 1 RX queue per Ethernet port. */
for (q = 0; q < rx_rings; q++) {
retval = rte_eth_rx_queue_setup(portid, q, nb_rxd,
rte_eth_dev_socket_id(portid), NULL, rx_mbuf_pool);
if (retval < 0)
return retval;
}
/* Allocate and set up 1 TX queue per Ethernet port. */
for (q = 0; q < tx_rings; q++) {
retval = rte_eth_tx_queue_setup(portid, q, nb_txd,
rte_eth_dev_socket_id(portid), NULL);
if (retval < 0)
return retval;
}
/* Start the Ethernet port. */
retval = rte_eth_dev_start(portid);
if (retval < 0)
return retval;
return 0;
}
static void init_dpdk(int argc, char ** argv) {
unsigned int nb_mbufs;
int ret;
ret = rte_eal_init(argc, argv);
if (ret < 0)
rte_exit(EXIT_FAILURE, "initlize fail!");
argc -= ret;
argv += ret;
nb_mbufs = RTE_MAX((nb_rxd + nb_txd + BURST_SIZE + MEMPOOL_CACHE_SIZE), 8192U);
nb_mbufs = 1024U * 16 - 1;
tx_mbuf_pool = rte_pktmbuf_pool_create("TX_MBUF_POOL", nb_mbufs,
MEMPOOL_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, SOCKET_ID_ANY);
if (tx_mbuf_pool == NULL)
rte_exit(EXIT_FAILURE, "Cannot create tx mbuf pool\n");
rx_mbuf_pool = rte_pktmbuf_pool_create("RX_MBUF_POOL", nb_mbufs,
MEMPOOL_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, SOCKET_ID_ANY);
if (rx_mbuf_pool == NULL)
rte_exit(EXIT_FAILURE, "Cannot create rx mbuf pool\n");
if (port_init(0, rx_mbuf_pool) != 0)
rte_exit(EXIT_FAILURE, "Cannot init port %"PRIu8 "\n", 0);
}
This diff is collapsed.
......@@ -33,6 +33,10 @@
#include <time.h>
#include <unistd.h>
#include "private/trx_driver.h"
/* Proprietary code:
- fast conversion between int16_t and float
*/
#include "private/convert16_sse.c"
#define DEBUG
//#define DISABLE_SEND
......@@ -216,6 +220,11 @@ typedef struct {
uint8_t gps_time[10];
} ecpri_timing_packet;
static TRXEcpriState s_recv;
static TRXEcpriState s_recv2;
static TRXEcpriState s_recv3;
static TRXEcpriState s_recv4;
// Buffers
static ring_buffer_t trxr_rbuf[MAX_CHANNELS]; // Decoded IQ samples
static ring_buffer_t trxr2_rbuf[MAX_CHANNELS]; // Decoded IQ samples
......@@ -228,10 +237,11 @@ static uint8_t rx3_buf[MAX_PACKET_SIZE * MAX_RX_BURST];
static uint8_t rx4_buf[MAX_PACKET_SIZE * MAX_RX_BURST];
static uint8_t tx_buf[MAX_PACKET_SIZE * MAX_TX_BURST];
static TRXEcpriState s_recv;
static TRXEcpriState s_recv2;
static TRXEcpriState s_recv3;
static TRXEcpriState s_recv4;
#define TAB_SIZE 65536
float *trx_read_float_tab;
float *trx_write_float_tab;
int16_t *trx_read_int_tab;
int16_t *trx_write_int_tab;
// Counters
static counter_stat_t recv_counter[MAX_CHANNELS]; // IQs received from RRH
......@@ -1037,6 +1047,11 @@ int start(TRXEcpriState * s) {
//set_latency_target();
posix_memalign((void **)&trx_read_float_tab, 16, sizeof(float) * TAB_SIZE);
posix_memalign((void **)&trx_write_float_tab, 16, sizeof(float) * TAB_SIZE);
posix_memalign((void **)&trx_read_int_tab, 16, sizeof(int16_t) * TAB_SIZE);
posix_memalign((void **)&trx_write_int_tab, 16, sizeof(int16_t) * TAB_SIZE);
init_counter(&rx_drop_counter);
init_counter(&tx_drop_counter);
for(int i = 0; i < MAX_CHANNELS; i++) {
......@@ -1196,6 +1211,26 @@ static void trx_ecpri_write(TRXState *s1, trx_timestamp_t timestamp, const void
while(1)
usleep(1000);
#endif
/* Check for empty samples
int k = 0;
for(int j = 0; j < count; j++) {
if(_samples[0][j] == 0)
k++;
else {
k = 0;
break;
}
if(k > 20)
break;
}
if(k > 20) {
printf("samples = \n");
for(int j = 0; j < count / 2; j++)
printf("%f ", _samples[0][j]);
printf("\n");
log_exit("TRX_ECPRI_WRITE", "Null data");
}
*/
//log_debug("TRX_ECPRI_WRITE", "trx_ecpri_write, count = %ld", count / N_SAMPLES);
......@@ -1217,8 +1252,11 @@ static void trx_ecpri_write(TRXState *s1, trx_timestamp_t timestamp, const void
offset = 0;
count_left = count;
while((nc = rbuf_contiguous_copy(NULL, &trxw_rbuf[i], count_left * 4))) {
if(__samples)
memcpy(rbuf_write(&trxw_rbuf[i]), ((uint8_t *) _samples[i]) + offset, nc);
if(__samples) {
memcpy((uint8_t *) trx_write_float_tab, ((uint8_t *) _samples[i]) + offset, nc * 2);
float_to_int16(trx_write_int_tab, trx_write_float_tab, nc / 2, 32767);
memcpy(rbuf_write(&trxw_rbuf[i]), (uint8_t *) trx_write_int_tab, nc);
}
else
log_exit("TRX_ECPRI_WRITE", "samples empty during FDD mode");
rbuf_increment_write(&trxw_rbuf[i], nc);
......@@ -1229,6 +1267,8 @@ static void trx_ecpri_write(TRXState *s1, trx_timestamp_t timestamp, const void
update_counter(&write_counter, (s->tx_n_channel * count));
}
float mult = 1. / 32767.;
static int read_trxr(ring_buffer_t * rbuf, float * samples, int count_left, int offset) {
int to_read = 0;
int read = 0;
......@@ -1242,7 +1282,9 @@ static int read_trxr(ring_buffer_t * rbuf, float * samples, int count_left, int
to_read = count_left * 4;
while((nc = rbuf_contiguous_copy(rbuf, NULL, to_read))) {
memcpy(((uint8_t*) samples) + offset + read, rbuf_read(rbuf), nc);
memcpy((uint8_t*) trx_read_int_tab, rbuf_read(rbuf), nc);
int16_to_float(trx_read_float_tab, trx_read_int_tab, nc / 2, mult);
memcpy(((uint8_t*) samples) + offset + read, (uint8_t*) trx_read_float_tab, nc * 2);
rbuf_increment_read(rbuf, nc);
to_read -= nc;
read += nc;
......@@ -1311,6 +1353,7 @@ static int trx_ecpri_read(TRXState *s1, trx_timestamp_t *ptimestamp, void **__sa
static int trx_ecpri_get_sample_rate(TRXState *s1, TRXFraction *psample_rate,
int *psample_rate_num, int sample_rate_min)
{
log_info("TRX_ECPRI_GET_SAMPLE_RATE", "");
return -1;
}
......
This diff is collapsed.
This diff is collapsed.
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