diff options
| author | Philip Balister <philip@opensdr.com> | 2010-08-11 22:23:40 +0000 | 
|---|---|---|
| committer | Philip Balister <philip@opensdr.com> | 2010-08-11 22:23:40 +0000 | 
| commit | a58b90ef219746e927a777efba919db15d139e84 (patch) | |
| tree | 27d0789db61b69e3be5ca34c056b210d7747d6e7 /host/apps/omap_debug/usrp-e-mm-loopback.c | |
| parent | 74e5238d08c780e96f617c86bea848a05f76988c (diff) | |
| download | uhd-a58b90ef219746e927a777efba919db15d139e84.tar.gz uhd-a58b90ef219746e927a777efba919db15d139e84.tar.bz2 uhd-a58b90ef219746e927a777efba919db15d139e84.zip | |
Convert to use mmaped rx ring buffer.
Diffstat (limited to 'host/apps/omap_debug/usrp-e-mm-loopback.c')
| -rw-r--r-- | host/apps/omap_debug/usrp-e-mm-loopback.c | 63 | 
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; | 
