diff options
| author | Josh Blum <josh@joshknows.com> | 2011-08-22 03:59:57 +0000 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-08-31 18:44:34 -0700 | 
| commit | 26bfe6d54a4ecd82f4efcf6cc1c6f69d216adb1c (patch) | |
| tree | 701770e2acc8941eaabf8aa713edf5d4c711a704 | |
| parent | 0fa5508ccca415c82fa005312f42060e5ed3c2bf (diff) | |
| download | uhd-26bfe6d54a4ecd82f4efcf6cc1c6f69d216adb1c.tar.gz uhd-26bfe6d54a4ecd82f4efcf6cc1c6f69d216adb1c.tar.bz2 uhd-26bfe6d54a4ecd82f4efcf6cc1c6f69d216adb1c.zip | |
e100: changed compat numbers, and tweaks
| -rw-r--r-- | host/lib/usrp/e100/e100_impl.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/e100/e100_impl.hpp | 6 | ||||
| -rw-r--r-- | host/lib/usrp/e100/include/linux/usrp_e.h | 2 | ||||
| -rw-r--r-- | host/usrp_e_utils/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | host/usrp_e_utils/common.hpp | 64 | ||||
| -rw-r--r-- | host/usrp_e_utils/usrp-e-timed.c | 382 | ||||
| -rw-r--r-- | host/usrp_e_utils/usrp-e-wb-test.cpp | 49 | 
7 files changed, 72 insertions, 436 deletions
| diff --git a/host/lib/usrp/e100/e100_impl.cpp b/host/lib/usrp/e100/e100_impl.cpp index 0defb2973..d3d9e32e6 100644 --- a/host/lib/usrp/e100/e100_impl.cpp +++ b/host/lib/usrp/e100/e100_impl.cpp @@ -232,7 +232,7 @@ e100_impl::e100_impl(const uhd::device_addr_t &device_addr){          _fpga_ctrl, E100_REG_SR_ADDR(UE_SR_RX_DSP1), E100_REG_SR_ADDR(UE_SR_RX_CTRL1), E100_RX_SID_BASE + 1      ));      for (size_t dspno = 0; dspno < _rx_dsps.size(); dspno++){ -        _rx_dsps[dspno]->set_link_rate(E100_LINK_RATE_BPS); +        _rx_dsps[dspno]->set_link_rate(E100_RX_LINK_RATE_BPS);          _tree->access<double>(mb_path / "tick_rate")              .subscribe(boost::bind(&rx_dsp_core_200::set_tick_rate, _rx_dsps[dspno], _1));          fs_path rx_dsp_path = mb_path / str(boost::format("rx_dsps/%u") % dspno); @@ -253,7 +253,7 @@ e100_impl::e100_impl(const uhd::device_addr_t &device_addr){      _tx_dsp = tx_dsp_core_200::make(          _fpga_ctrl, E100_REG_SR_ADDR(UE_SR_TX_DSP), E100_REG_SR_ADDR(UE_SR_TX_CTRL), E100_TX_ASYNC_SID      ); -    _tx_dsp->set_link_rate(E100_LINK_RATE_BPS); +    _tx_dsp->set_link_rate(E100_TX_LINK_RATE_BPS);      _tree->access<double>(mb_path / "tick_rate")          .subscribe(boost::bind(&tx_dsp_core_200::set_tick_rate, _tx_dsp, _1));      _tree->create<double>(mb_path / "tx_dsps/0/rate/value") diff --git a/host/lib/usrp/e100/e100_impl.hpp b/host/lib/usrp/e100/e100_impl.hpp index 76af828d0..1800e15b5 100644 --- a/host/lib/usrp/e100/e100_impl.hpp +++ b/host/lib/usrp/e100/e100_impl.hpp @@ -42,10 +42,12 @@  uhd::transport::zero_copy_if::sptr e100_make_mmap_zero_copy(e100_ctrl::sptr iface); -static const double          E100_LINK_RATE_BPS = 166e6/4*2; //gpmc_clock_rate/clk_div*bytes_per_transaction +// = gpmc_clock_rate/clk_div/cycles_per_transaction*bytes_per_transaction +static const double          E100_RX_LINK_RATE_BPS = 166e6/3/2*2; +static const double          E100_TX_LINK_RATE_BPS = 166e6/3/1*2;  static const std::string     E100_I2C_DEV_NODE = "/dev/i2c-3";  static const std::string     E100_FPGA_FILE_NAME = "usrp_e100_fpga_v2.bin"; -static const boost::uint16_t E100_FPGA_COMPAT_NUM = 0x05; +static const boost::uint16_t E100_FPGA_COMPAT_NUM = 0x06;  static const boost::uint32_t E100_RX_SID_BASE = 2;  static const boost::uint32_t E100_TX_ASYNC_SID = 1;  static const double          E100_DEFAULT_CLOCK_RATE = 64e6; diff --git a/host/lib/usrp/e100/include/linux/usrp_e.h b/host/lib/usrp/e100/include/linux/usrp_e.h index 2c4aa2ac1..37e9ee31a 100644 --- a/host/lib/usrp/e100/include/linux/usrp_e.h +++ b/host/lib/usrp/e100/include/linux/usrp_e.h @@ -36,7 +36,7 @@ struct usrp_e_ctl32 {  #define USRP_E_GET_RB_INFO      _IOR(USRP_E_IOC_MAGIC, 0x27, struct usrp_e_ring_buffer_size_t)  #define USRP_E_GET_COMPAT_NUMBER _IO(USRP_E_IOC_MAGIC, 0x28) -#define USRP_E_COMPAT_NUMBER 2 +#define USRP_E_COMPAT_NUMBER 3  /* Flag defines */  #define RB_USER (1<<0) diff --git a/host/usrp_e_utils/CMakeLists.txt b/host/usrp_e_utils/CMakeLists.txt index 9162a2099..10117ef13 100644 --- a/host/usrp_e_utils/CMakeLists.txt +++ b/host/usrp_e_utils/CMakeLists.txt @@ -28,7 +28,6 @@ IF(ENABLE_USRP_E_UTILS)      SET(usrp_e_utils_sources          usrp-e-loopback.c -        usrp-e-timed.c          usrp-e-wb-test.cpp          usrp-e-debug-pins.c          usrp-e-gpio.c diff --git a/host/usrp_e_utils/common.hpp b/host/usrp_e_utils/common.hpp new file mode 100644 index 000000000..1fc9a1f7b --- /dev/null +++ b/host/usrp_e_utils/common.hpp @@ -0,0 +1,64 @@ +// +// Copyright 2011 Ettus Research LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#include <sys/ioctl.h> //ioctl +#include <fcntl.h> //open, close + +#include <linux/usrp_e.h> +#include "e100_regs.hpp" + +static int fp; + +static int peek16(int reg){ +    int ret; +    struct usrp_e_ctl16 d; + +    d.offset = reg; +    d.count = 1; +    ret = ioctl(fp, USRP_E_READ_CTL16, &d); +    return d.buf[0]; +} + +static void poke16(int reg, int val){ +    int ret; +    struct usrp_e_ctl16 d; + +    d.offset = reg; +    d.count = 1; +    d.buf[0] = val; +    ret = ioctl(fp, USRP_E_WRITE_CTL16, &d); +} + +static int peek32(int reg){ +    int ret; +    struct usrp_e_ctl32 d; + +    d.offset = reg; +    d.count = 1; +    ret = ioctl(fp, USRP_E_READ_CTL32, &d); +    return d.buf[0]; +} + +static void poke32(int reg, int val){ +    int ret; +    struct usrp_e_ctl32 d; + +    d.offset = reg; +    d.count = 1; +    d.buf[0] = val; +    ret = ioctl(fp, USRP_E_WRITE_CTL32, &d); +} diff --git a/host/usrp_e_utils/usrp-e-timed.c b/host/usrp_e_utils/usrp-e-timed.c deleted file mode 100644 index 407564429..000000000 --- a/host/usrp_e_utils/usrp-e-timed.c +++ /dev/null @@ -1,382 +0,0 @@ -#include <stdio.h> -#include <sys/types.h> -#include <sys/time.h> -#include <sys/ioctl.h> -#include <string.h> -#include <fcntl.h> -#include <pthread.h> -#include <stdlib.h> -#include <unistd.h> -#include <stddef.h> -#include <poll.h> -#include <sys/mman.h> -#include "linux/usrp_e.h" - -// max length #define PKT_DATA_LENGTH 1016 -static int packet_data_length; - -struct ring_buffer_info (*rxi)[]; -struct ring_buffer_info (*txi)[]; -__u8 *rx_buf; -__u8 *tx_buf; -static struct usrp_e_ring_buffer_size_t rb_size; - -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 = 0x04C11DB7L; - -	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; -//		printf("crc_tab[%d] = %X\n", i , crc); -	} - -	return 0; -} - -struct timeval delta_time(struct timeval f, struct timeval s) -{ -	struct timeval d; - -	if (f.tv_usec > s.tv_usec) { -		d.tv_usec = f.tv_usec - s.tv_usec; -		d.tv_sec = f.tv_sec - s.tv_sec; -	} else { -		d.tv_usec = f.tv_usec - s.tv_usec + 1e6; -		d.tv_sec = f.tv_sec - s.tv_sec - 1; -	} - -	return d; -} - - -static void *read_thread(void *threadid) -{ -	unsigned int cnt; -	int rx_pkt_cnt, rb_read; -	unsigned int i; -	unsigned long crc, ck_sum; -	unsigned int rx_crc, pkt_len, pkt_seq; -	unsigned long bytes_transfered; -	struct timeval start_time; -	unsigned int prev_seq = 0; -	int first = 1; -	long tid; -	__u8 *p; - - -	tid = (long)threadid; -	printf("Greetings from the reading thread(%ld)!\n", tid); - -	// IMPORTANT: must assume max length packet from fpga -	 -	rx_pkt_cnt = 0; -	rb_read = 0; - -	bytes_transfered = 0; -	gettimeofday(&start_time, NULL); - -	while (1) { -		 -		while (!((*rxi)[rb_read].flags & RB_USER)) { -			struct pollfd pfd; -			pfd.fd = fp; -			pfd.events = POLLIN; -			poll(&pfd, 1, -1); -		} -		(*rxi)[rb_read].flags = RB_USER_PROCESS; - -		rx_pkt_cnt++; -		cnt = (*rxi)[rb_read].len; -		p = rx_buf + (rb_read * 2048); - -		rx_crc = *(int *) &p[cnt-4]; -		crc = 0xFFFFFFFF; -		ck_sum = 0; - -		pkt_len = *(unsigned int *) &p[0]; -		pkt_seq = *(unsigned int *) &p[4]; - -//		printf("Pkt len = %X, pkt seq = %X, driver len = %X\n", pkt_len, pkt_seq, cnt); - -		if (pkt_len != (cnt - 4)) -			printf("Packet length check fail, driver len = %ud, content = %ud\n", -					cnt, pkt_len); - -		if (!first && (pkt_seq != (prev_seq + 1))) -			printf("Sequence number check fail, pkt_seq = %ud, prev_seq = %ud\n", -					pkt_seq, prev_seq); -		first = 0; -		prev_seq = pkt_seq; - -		for (i = 0; i < cnt-4; i++) { -			ck_sum += p[i]; - -			crc = ((crc >> 8) & 0x00FFFFFF) ^ -				crc_tab[(crc ^ p[i]) & 0xFF]; -//printf("idx = %d, data = %X, crc = %X, ck_sum = %X\n", i, p[i], crc, ck_sum); -//			crc = ((crc >> 8) & 0x00FFFFFF) ^ -//				crc_tab[(crc ^ p[i+1]) & 0xFF]; -//printf("idx = %d, data = %X, crc = %X\n", i, p[i+1],crc); -		} - -		(*rxi)[rb_read].flags = RB_KERNEL; -		write(fp, NULL, 1); - -		if (rx_crc != ck_sum) -			printf("Ck_sum eror, calc ck_sum = %lX, rx ck_sum = %X\n", -					ck_sum, rx_crc); - -#if 0 -		if (rx_crc != (crc & 0xFFFFFFFF)) { -			printf("CRC Error, calc crc: %X, rx_crc: %X\n", -				(crc & 0xFFFFFFFF), rx_crc); -		} -#endif - -		rb_read++; -		if (rb_read == rb_size.num_rx_frames) -			rb_read = 0; - -		bytes_transfered += cnt; - -		if (bytes_transfered > (100 * 1000000)) { -			struct timeval finish_time, d_time; -			float elapsed_seconds; - -			gettimeofday(&finish_time, NULL); - -			printf("sec = %ld, usec = %ld\n", finish_time.tv_sec, finish_time.tv_usec); - -			d_time = delta_time(finish_time, start_time); - -			elapsed_seconds = (float)d_time.tv_sec + ((float)d_time.tv_usec * 1e-6f); - -			printf("Bytes transfered = %ld, elapsed seconds = %f\n", bytes_transfered, elapsed_seconds); -			printf("RX data transfer rate = %f K Samples/second\n", -				(float) bytes_transfered / (float) elapsed_seconds / 4000); - - -			start_time = finish_time; -			bytes_transfered = 0; -		} -	}	 -	return NULL; -} -	 -static void *write_thread(void *threadid) -{ -	int i, tx_pkt_cnt, rb_write; -	int tx_len; -	unsigned long crc; -	unsigned long bytes_transfered; -	struct timeval start_time; -	unsigned int pkt_seq = 0; -	long tid; -	__u8 *p; - -	tid = (long)threadid; -	printf("Greetings from the write thread(%ld)!\n", tid); - -	rb_write = 0; -	tx_pkt_cnt = 0; - -	bytes_transfered = 0; -	gettimeofday(&start_time, NULL); - -	while (1) { - -		tx_pkt_cnt++; -		p = tx_buf + (rb_write * 2048); - -//		printf("p = %p\n", p); - -		if (packet_data_length > 0) -			tx_len = packet_data_length; -		else -			tx_len = (random() & 0x1ff) + (2044 - 512); - -#if 0 -		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; -		} -#endif - -//		printf("Checking for space at rb entry = %d\n", rb_write); -		while (!((*txi)[rb_write].flags & RB_KERNEL)) { -			struct pollfd pfd; -			pfd.fd = fp; -			pfd.events = POLLOUT; -			poll(&pfd, 1, -1); -		} -//		printf("Got space\n"); - -		for (i=8; i < tx_len-4; i++) { -			p[i] = i & 0xFF; -		} - -		*(unsigned int *) &p[0] = tx_len-4; -		*(unsigned int *) &p[4] = pkt_seq; - -		pkt_seq++; - -		crc = 0xFFFFFFFF; -		for (i = 0; i < tx_len-4; i++) { -//			printf("%X ", p[i]); -			crc = ((crc >> 8) & 0x00FFFFFF) ^ -				crc_tab[(crc ^ p[i]) & 0xFF]; - -		} -		*(unsigned int *) &p[tx_len-4] = crc; -//		printf("\n crc = %lX\n", crc); - -		(*txi)[rb_write].len = tx_len; -		(*txi)[rb_write].flags = RB_USER; - -		rb_write++; -		if (rb_write == rb_size.num_tx_frames) -			rb_write = 0; - -		bytes_transfered += tx_len; - -		if (bytes_transfered > (100 * 1000000)) { -			struct timeval finish_time, d_time; -			float elapsed_seconds; - -			gettimeofday(&finish_time, NULL); - -			d_time = delta_time(finish_time, start_time); - -			elapsed_seconds = (float)d_time.tv_sec + ((float)d_time.tv_usec * 1e-6f); - -			printf("Bytes transfered = %ld, elapsed seconds = %f\n", bytes_transfered, elapsed_seconds); -			printf("TX data transfer rate = %f K Samples/second\n", -				(float) bytes_transfered / (float) elapsed_seconds / 4000); - - -			start_time = finish_time; -			bytes_transfered = 0; -		} - -//		sleep(1); -	} -	return NULL; -} - - -int main(int argc, char *argv[]) -{ -	pthread_t tx, rx; -	long int t=0; -	int fpga_config_flag ,decimation; -	int ret, map_size, page_size; -	void *rb; - -	struct usrp_e_ctl16 d; -	struct sched_param s = { -		.sched_priority = 1 -	}; - -	if (argc < 4) { -		printf("%s r|w|rw decimation data_size\n", argv[0]); -		return -1; -	} - -	chksum_crc32_gentab(); - -	decimation = atoi(argv[2]); -	packet_data_length = atoi(argv[3]); - -	fp = open("/dev/usrp_e0", O_RDWR); -	printf("fp = %d\n", fp); - -	page_size = getpagesize(); - -	ret = ioctl(fp, USRP_E_GET_RB_INFO, &rb_size); - -	map_size = (rb_size.num_pages_rx_flags + rb_size.num_pages_tx_flags) * page_size + -		(rb_size.num_rx_frames + rb_size.num_tx_frames) * (page_size >> 1); - -	rb = mmap(0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fp, 0); -	if (rb == MAP_FAILED) { -		perror("mmap failed"); -		return -1; -	} - -	printf("rb = %p\n", rb); - -	rxi = rb; -	rx_buf = rb + (rb_size.num_pages_rx_flags * page_size); -	txi = rb + (rb_size.num_pages_rx_flags * page_size) + -		(rb_size.num_rx_frames * page_size >> 1); -	tx_buf = rb + (rb_size.num_pages_rx_flags * page_size) + -		(rb_size.num_rx_frames * page_size >> 1) + -		(rb_size.num_pages_tx_flags * page_size); - -	fpga_config_flag = (1<<8); -	if (strcmp(argv[1], "w") == 0) -		fpga_config_flag |= (1 << 11); -	else if (strcmp(argv[1], "r") == 0) -		fpga_config_flag |= (1 << 10); -	else if (strcmp(argv[1], "rw") == 0) -		fpga_config_flag |= ((1 << 10) | (1 << 11)); - -	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 << 10)) { -		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 << 11)) { -		if (pthread_create(&tx, NULL, write_thread, (void *) t)) { -			printf("Failed to create tx thread\n"); -			exit(-1); -		} -	} - -	sleep(10000); - -	printf("Done sleeping\n"); - -	return 0; -} diff --git a/host/usrp_e_utils/usrp-e-wb-test.cpp b/host/usrp_e_utils/usrp-e-wb-test.cpp index eab4caede..2b793dc06 100644 --- a/host/usrp_e_utils/usrp-e-wb-test.cpp +++ b/host/usrp_e_utils/usrp-e-wb-test.cpp @@ -15,61 +15,14 @@  // along with this program.  If not, see <http://www.gnu.org/licenses/>.  // +#include "common.hpp"  #include <cstdlib>  #include <cstdio>  #include <ctime>  #include <iostream> -#include <sys/ioctl.h> //ioctl -#include <fcntl.h> //open, close - -#include <linux/usrp_e.h> -#include "e100_regs.hpp" -  static const size_t num_test_iters = 10000000; -static int fp; - -static int peek16(int reg){ -    int ret; -    struct usrp_e_ctl16 d; - -    d.offset = reg; -    d.count = 1; -    ret = ioctl(fp, USRP_E_READ_CTL16, &d); -    return d.buf[0]; -} - -static void poke16(int reg, int val){ -    int ret; -    struct usrp_e_ctl16 d; - -    d.offset = reg; -    d.count = 1; -    d.buf[0] = val; -    ret = ioctl(fp, USRP_E_WRITE_CTL16, &d); -} - -static int peek32(int reg){ -    int ret; -    struct usrp_e_ctl32 d; - -    d.offset = reg; -    d.count = 1; -    ret = ioctl(fp, USRP_E_READ_CTL32, &d); -    return d.buf[0]; -} - -static void poke32(int reg, int val){ -    int ret; -    struct usrp_e_ctl32 d; - -    d.offset = reg; -    d.count = 1; -    d.buf[0] = val; -    ret = ioctl(fp, USRP_E_WRITE_CTL32, &d); -} -  int main(int, char *[]){      srandom(time(NULL)); //seed random() | 
