aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Balister <philip@opensdr.com>2010-08-11 22:23:40 +0000
committerPhilip Balister <philip@opensdr.com>2010-08-11 22:23:40 +0000
commita58b90ef219746e927a777efba919db15d139e84 (patch)
tree27d0789db61b69e3be5ca34c056b210d7747d6e7
parent74e5238d08c780e96f617c86bea848a05f76988c (diff)
downloaduhd-a58b90ef219746e927a777efba919db15d139e84.tar.gz
uhd-a58b90ef219746e927a777efba919db15d139e84.tar.bz2
uhd-a58b90ef219746e927a777efba919db15d139e84.zip
Convert to use mmaped rx ring buffer.
-rw-r--r--host/apps/omap_debug/usrp-e-mm-loopback.c63
1 files changed, 50 insertions, 13 deletions
diff --git a/host/apps/omap_debug/usrp-e-mm-loopback.c b/host/apps/omap_debug/usrp-e-mm-loopback.c
index d11cf7d09..722d09825 100644
--- a/host/apps/omap_debug/usrp-e-mm-loopback.c
+++ b/host/apps/omap_debug/usrp-e-mm-loopback.c
@@ -6,6 +6,7 @@
#include <unistd.h>
#include <stddef.h>
#include <sys/mman.h>
+#include <poll.h>
#include "usrp_e.h"
// max length #define PKT_DATA_LENGTH 1016
@@ -16,9 +17,20 @@ struct pkt {
int len;
int checksum;
int seq_num;
- short data[];
+ short data[1024-6];
};
+/* delete after usrp_e.h updated */
+struct ring_buffer_info {
+ int flags;
+ int len;
+};
+
+struct ring_buffer_info (*rxi)[];
+struct ring_buffer_info (*txi)[];
+struct pkt (*rx_buf)[200];
+struct pkt (*tx_buf)[200];
+
static int fp;
static int calc_checksum(struct pkt *p)
@@ -39,32 +51,44 @@ static int calc_checksum(struct pkt *p)
static void *read_thread(void *threadid)
{
- char *rx_data;
int cnt, prev_seq_num, pkt_count, seq_num_failure;
struct pkt *p;
unsigned long bytes_transfered, elapsed_seconds;
struct timeval start_time, finish_time;
+ int rb_read;
printf("Greetings from the reading thread!\n");
+ printf("sizeof pkt = %d\n", sizeof(struct pkt));
+
+ rb_read = 0;
bytes_transfered = 0;
gettimeofday(&start_time, NULL);
- // IMPORTANT: must assume max length packet from fpga
- rx_data = malloc(2048);
- p = (struct pkt *) ((void *)rx_data);
-
prev_seq_num = 0;
pkt_count = 0;
seq_num_failure = 0;
while (1) {
- cnt = read(fp, rx_data, 2048);
- if (cnt < 0)
- printf("Error returned from read: %d, sequence number = %d\n", cnt, p->seq_num);
+ if (!((*rxi)[rb_read].flags & RB_USER)) {
+ printf("Waiting for data\n");
+ struct pollfd pfd;
+ pfd.fd = fp;
+ pfd.events = POLLIN;
+ ssize_t ret = poll(&pfd, 1, -1);
+ }
-// printf("p->seq_num = %d\n", p->seq_num);
+ printf("pkt received, rb_read = %d\n", rb_read);
+
+ cnt = (*rxi)[rb_read].len;
+ p = &(*rx_buf)[rb_read];
+
+// cnt = read(fp, rx_data, 2048);
+// if (cnt < 0)
+// printf("Error returned from read: %d, sequence number = %d\n", cnt, p->seq_num);
+
+ printf("p = %X, p->seq_num = %d p->len = %d\n", p, p->seq_num, p->len);
pkt_count++;
@@ -86,6 +110,12 @@ static void *read_thread(void *threadid)
error = 1;
}
+ (*rxi)[rb_read].flags = RB_KERNEL;
+
+ rb_read++;
+ if (rb_read == 200)
+ rb_read = 0;
+
bytes_transfered += cnt;
if (bytes_transfered > (100 * 1000000)) {
@@ -151,7 +181,6 @@ int main(int argc, char *argv[])
.sched_priority = 1
};
void *rb;
- struct usrp_transfer_frame *tx_rb, *rx_rb;
if (argc < 2) {
printf("%s data_size\n", argv[0]);
@@ -164,11 +193,19 @@ int main(int argc, char *argv[])
printf("fp = %d\n", fp);
rb = mmap(0, 202 * 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fp, 0);
- if (!rb) {
- printf("mmap failed\n");
+ if (rb == MAP_FAILED) {
+ perror("mmap failed");
exit;
}
+ printf("rb = %X\n", rb);
+
+ rxi = rb;
+ rx_buf = rb + 4096;
+ txi = rb + 4096 + 4096 * 200;
+ tx_buf = rb + 4096 * 2 + 4096 * 200;
+
+ printf("rxi = %X, rx_buf = %X, txi = %X, tx_buf = %X\n", rxi, rx_buf, txi, tx_buf);
sched_setscheduler(0, SCHED_RR, &s);
error = 0;