diff options
| author | Philip Balister <balister@moose.(none)> | 2010-05-07 15:45:31 -0400 | 
|---|---|---|
| committer | Philip Balister <balister@moose.(none)> | 2010-05-07 15:45:31 -0400 | 
| commit | 8df3a38c3be477a02c4b9d636a3ddd647e55e4a5 (patch) | |
| tree | bac82e94ab78a9db25f6f99933425b4693dd4a4e | |
| parent | b47920906bd1b0480bbcd8427b2d703889cb78e3 (diff) | |
| download | uhd-8df3a38c3be477a02c4b9d636a3ddd647e55e4a5.tar.gz uhd-8df3a38c3be477a02c4b9d636a3ddd647e55e4a5.tar.bz2 uhd-8df3a38c3be477a02c4b9d636a3ddd647e55e4a5.zip | |
First pass at data transfer program that uses CRC.
| -rw-r--r-- | host/apps/omap_debug/Makefile | 6 | ||||
| -rw-r--r-- | host/apps/omap_debug/usrp-e-crc-rw.c | 195 | 
2 files changed, 200 insertions, 1 deletions
| diff --git a/host/apps/omap_debug/Makefile b/host/apps/omap_debug/Makefile index 14be592ff..9b590b9f7 100644 --- a/host/apps/omap_debug/Makefile +++ b/host/apps/omap_debug/Makefile @@ -1,6 +1,6 @@  CFLAGS=-Wall -I../../lib/usrp/usrp_e/ -all : usrp-e-spi usrp-e-i2c usrp-e-rw usrp-e-uart usrp-e-led usrp-e-ctl usrp-e-button usrp-e-uart-rx fpga-downloader usrp-e-gpio usrp-e-debug-pins usrp-e-rw-random usrp-e-fpga-rw usrp-e-lb-test +all : usrp-e-spi usrp-e-i2c usrp-e-rw usrp-e-uart usrp-e-led usrp-e-ctl usrp-e-button usrp-e-uart-rx fpga-downloader usrp-e-gpio usrp-e-debug-pins usrp-e-rw-random usrp-e-fpga-rw usrp-e-lb-test usrp-e-crc-rw  usrp-e-spi : usrp-e-spi.c @@ -15,6 +15,9 @@ usrp-e-fpga-rw : usrp-e-fpga-rw.c  usrp-e-rw-random : usrp-e-rw-random.c  	gcc -o $@ $< -lpthread +usrp-e-crc-rw : usrp-e-crc-rw.c +	gcc -o $@ $< -lpthread +  usrp-e-uart : usrp-e-uart.c  usrp-e-uart-rx : usrp-e-uart-rx.c @@ -47,3 +50,4 @@ clean :  	rm -f usrp-e-gpio  	rm -f usrp-e-debug-pins  	rm -f usrp-e-lb-test +	rm -f usrp-e-crc-rw diff --git a/host/apps/omap_debug/usrp-e-crc-rw.c b/host/apps/omap_debug/usrp-e-crc-rw.c new file mode 100644 index 000000000..1f23c8d54 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-crc-rw.c @@ -0,0 +1,195 @@ +#include <stdio.h> +#include <sys/types.h> +#include <fcntl.h> +#include <pthread.h> +#include <stdlib.h> +#include <unistd.h> +#include <stddef.h> +#include "usrp_e.h" + +// max length #define PKT_DATA_LENGTH 1016 +static int packet_data_length; + +static int fp; +static u_int32_t crc_tab[256]; + +// CRC code from http://www.koders.com/c/fid699AFE0A656F0022C9D6B9D1743E697B69CE5815.aspx +// GPLv2 + +static u_int32_t chksum_crc32_gentab(void) +{ +	unsigned long crc, poly; +	unsigned long i, j; + +	poly = 0xEDB88320L; + +	for (i = 0; i < 256; i++) { +		crc = i; +		for (j = 8; j > 0; j--) { +			if (crc & 1) { +				crc = (crc >> 1) ^ poly; +			} else { +				crc >>= 1; +			} +		} +		crc_tab[i] = crc; +	} +} + +static void *read_thread(void *threadid) +{ +	int cnt; +	struct usrp_transfer_frame *rx_data; +	int rx_pkt_cnt; +	int i; +	unsigned long crc; +	unsigned int rx_crc; + +	printf("Greetings from the reading thread!\n"); + +	// IMPORTANT: must assume max length packet from fpga +	rx_data = malloc(2048); + +	rx_pkt_cnt = 0; +	 +	while (1) { +		 +		cnt = read(fp, rx_data, 2048); +		if (cnt < 0) +			printf("Error returned from read: %d\n", cnt); + +		rx_pkt_cnt++; +		 +		if (rx_pkt_cnt  == 512) { +			printf("."); +			fflush(stdout); +			rx_pkt_cnt = 0; +		} +		 +		if (rx_data->flags & RB_OVERRUN) +			printf("O"); +		 +		crc = 0xFFFFFFFF; +		for (i = 0; i < rx_data->len - 4; i++) { +			crc = ((crc >> 8) & 0x00FFFFFF) ^ +				crc_tab[(crc ^ rx_data->buf[i]) & 0xFF]; +		} +		 +		rx_crc = *((int *) &rx_data[rx_data->len - 4]); +	 +		if (rx_crc != (crc & 0xFFFFFFFF)) { +			printf("CRC Error, sent: %d, rx: %d\n", +				rx_crc, (crc & 0xFFFFFFFF)); +		} +		 +	}	 +} +	 +static void *write_thread(void *threadid) +{ +	int seq_number, i, cnt, tx_pkt_cnt; +	int tx_len; +	unsigned long crc; +	struct usrp_transfer_frame *tx_data; +	struct pkt *p; + +	printf("Greetings from the write thread!\n"); + +	tx_data = malloc(2048); + +	while (1) { + +		tx_pkt_cnt++; +		if (tx_pkt_cnt  == 512) { +			printf("."); +			fflush(stdout); +		} +		if (tx_pkt_cnt  == 1024) { +			printf("'"); +			fflush(stdout); +		} +		if (tx_pkt_cnt  == 1536) { +			printf(":"); +			fflush(stdout); +			tx_pkt_cnt = 0; +		} + +		tx_len = 2048 - sizeof(struct usrp_transfer_frame) - sizeof(int); +		crc = 0xFFFFFFFF; +		for (i = 0; i < tx_len; i++) { +			tx_data->buf[i] = rand() & 0xFF; + +			crc = ((crc >> 8) & 0x00FFFFFF) ^ +				crc_tab[(crc ^ tx_data->buf[i]) & 0xFF]; + +		} +		*((int *) &tx_data[tx_len]) = crc; + +		cnt = write(fp, tx_data, 2048); +		if (cnt < 0) +			printf("Error returned from write: %d\n", cnt); +//		sleep(1); +	} +} + + +int main(int argc, char *argv[]) +{ +	pthread_t tx, rx; +	long int t; +	int fpga_config_flag ,decimation; +	struct usrp_e_ctl16 d; +	struct sched_param s = { +		.sched_priority = 1 +	}; + +	if (argc < 4) { +		printf("%s t|w|rw decimation data_size\n", argv[0]); +		return -1; +	} + +	decimation = atoi(argv[2]); +	packet_data_length = atoi(argv[3]); + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	fpga_config_flag = 0; +	if (strcmp(argv[1], "w") == 0) +		fpga_config_flag |= (1 << 15); +	else if (strcmp(argv[1], "r") == 0) +		fpga_config_flag |= (1 << 14); +	else if (strcmp(argv[1], "rw") == 0) +		fpga_config_flag |= ((1 << 15) | (1 << 14)); + +	fpga_config_flag |= decimation; + +	d.offset = 14; +	d.count = 1; +	d.buf[0] = fpga_config_flag; +	ioctl(fp, USRP_E_WRITE_CTL16, &d); + +	sleep(1); // in case the kernel threads need time to start. FIXME if so + +	sched_setscheduler(0, SCHED_RR, &s); + +	if (fpga_config_flag & (1 << 14)) { +		if (pthread_create(&rx, NULL, read_thread, (void *) t)) { +			printf("Failed to create rx thread\n"); +			exit(-1); +		} +	} + +	sleep(1); + +	if (fpga_config_flag & (1 << 15)) { +		if (pthread_create(&tx, NULL, write_thread, (void *) t)) { +			printf("Failed to create tx thread\n"); +			exit(-1); +		} +	} + +	sleep(10000); + +	printf("Done sleeping\n"); +} | 
