diff options
| author | Josh Blum <josh@joshknows.com> | 2010-11-23 15:35:48 -0800 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-11-23 15:35:48 -0800 | 
| commit | f56c1247cbe7b7e90acee2711b5dda3356b9486a (patch) | |
| tree | 81dadc83537c2c50550cd94e224571e472176c6f /host/apps/omap_debug | |
| parent | 9f94ef843ceca63bcb83b2d473cbba709c9110b6 (diff) | |
| parent | eb26e8adb4a5718ee3db3bb7f32c0cd31d060af9 (diff) | |
| download | uhd-f56c1247cbe7b7e90acee2711b5dda3356b9486a.tar.gz uhd-f56c1247cbe7b7e90acee2711b5dda3356b9486a.tar.bz2 uhd-f56c1247cbe7b7e90acee2711b5dda3356b9486a.zip | |
Merge branch 'next' of ettus.sourcerepo.com:ettus/uhdpriv into next
Diffstat (limited to 'host/apps/omap_debug')
36 files changed, 2744 insertions, 0 deletions
| diff --git a/host/apps/omap_debug/.gitignore b/host/apps/omap_debug/.gitignore new file mode 100644 index 000000000..008a23138 --- /dev/null +++ b/host/apps/omap_debug/.gitignore @@ -0,0 +1,20 @@ +.gitignore +clkgen-config +fpga-downloader +usrp-e-button +usrp-e-crc-rw +usrp-e-ctl +usrp-e-debug-pins +usrp-e-fpga-rw +usrp-e-gpio +usrp-e-i2c +usrp-e-lb-test +usrp-e-led +usrp-e-loopback +usrp-e-random-loopback +usrp-e-rw +usrp-e-spi +usrp-e-timed +usrp-e-uart +usrp-e-uart-rx +usrp-e-mm-loopback diff --git a/host/apps/omap_debug/Makefile b/host/apps/omap_debug/Makefile new file mode 100644 index 000000000..46d4714a8 --- /dev/null +++ b/host/apps/omap_debug/Makefile @@ -0,0 +1,61 @@ +CFLAGS=-Wall -I../../lib/usrp/usrp_e/ -march=armv7-a -mtune=cortex-a8 -mfpu=neon -O3 +CXXFLAGS=-Wall -I../../lib/usrp/usrp_e/ -march=armv7-a -mtune=cortex-a8 -mfpu=neon -O3 + +all : usrp-e-spi usrp-e-i2c usrp-e-loopback usrp-e-mm-loopback 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-random-loopback usrp-e-timed usrp-e-lb-test usrp-e-crc-rw clkgen-config + +usrp-e-spi : usrp-e-spi.c + +usrp-e-i2c : usrp-e-i2c.c + +usrp-e-loopback : usrp-e-loopback.c +	gcc -o $@ $< -lpthread ${CFLAGS} + +usrp-e-mm-loopback : usrp-e-mm-loopback.c +	gcc -o $@ $< -lpthread ${CFLAGS} + +usrp-e-timed : usrp-e-timed.c +	gcc -o $@ $< -lpthread ${CFLAGS} + +usrp-e-random-loopback : usrp-e-random-loopback.c +	gcc -o $@ $< -lpthread ${CFLAGS} + +usrp-e-crc-rw : usrp-e-crc-rw.c +	gcc -o $@ $< -lpthread ${CFLAGS} + +usrp-e-uart : usrp-e-uart.c + +usrp-e-uart-rx : usrp-e-uart-rx.c + +usrp-e-led : usrp-e-led.c + +usrp-e-ctl : usrp-e-ctl.c + +usrp-e-button : usrp-e-button.c + +fpga-downloader : fpga-downloader.cc + +clkgen-config : clkgen-config.cc + +usrp-e-gpio : usrp-e-gpio.c + +usrp-e-lb-test : usrp-e-lb-test.c + +usrp-e-debug-pins : usrp-e-debug-pins.c +clean : +	rm -f usrp-e-spi +	rm -f usrp-e-i2c +	rm -f usrp-e-loopback +	rm -f usrp-e-mm-loopback +	rm -f usrp-e-timed +	rm -f usrp-e-rw-random +	rm -f usrp-e-uart +	rm -f usrp-e-uart-rx +	rm -f usrp-e-led +	rm -f usrp-e-ctl +	rm -f usrp-e-button +	rm -f fpga-downloader +	rm -f usrp-e-gpio +	rm -f usrp-e-debug-pins +	rm -f usrp-e-lb-test +	rm -f usrp-e-crc-rw +	rm -f clkgen-config diff --git a/host/apps/omap_debug/README b/host/apps/omap_debug/README new file mode 100644 index 000000000..bbe0c2cc4 --- /dev/null +++ b/host/apps/omap_debug/README @@ -0,0 +1 @@ +OMAP development tools go here diff --git a/host/apps/omap_debug/clkgen-config.cc b/host/apps/omap_debug/clkgen-config.cc new file mode 100644 index 000000000..e8279b4ae --- /dev/null +++ b/host/apps/omap_debug/clkgen-config.cc @@ -0,0 +1,296 @@ +/* -*- c++ -*- */ +/* + * Copyright 2003,2004,2008,2009 Free Software Foundation, Inc. + * + * This file is part of UHD + * + * GNU Radio 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, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. +*/ + +#include <iostream> +#include <sstream> +#include <fstream> +#include <string> +#include <cstdlib> + +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> + +#include <linux/spi/spidev.h> + + +// Programming data for clock gen chip +static const unsigned int config_data[] = { +	0x000024, +	0x023201, +	0x000081, +	0x000400, +	0x00104c, +	0x001101, +	0x001200, +	0x001300, +	0x001414, +	0x001500, +	0x001604, +	0x001704, +	0x001807, +	0x001900, +	//0x001a00,//for debug +	0x001a32, +	0x001b12, +	0x001c44, +	0x001d00, +	0x001e00, +	0x00f062, +	0x00f162, +	0x00f262, +	0x00f362, +	0x00f462, +	0x00f562, +	0x00f662, +	0x00f762, +	0x00f862, +	0x00f962, +	0x00fa62, +	0x00fb62, +	0x00fc00, +	0x00fd00, +	0x019021, +	0x019100, +	0x019200, +	0x019333, +	0x019400, +	0x019500, +	0x019611, +	0x019700, +	0x019800, +	0x019900, +	0x019a00, +	0x019b00, +	0x01e003, +	0x01e102, +	0x023000, +	0x023201, +	0x0b0201, +	0x0b0300, +	0x001fff, +	0x0a0000, +	0x0a0100, +	0x0a0200, +	0x0a0302, +	0x0a0400, +	0x0a0504, +	0x0a060e, +	0x0a0700, +	0x0a0810, +	0x0a090e, +	0x0a0a00, +	0x0a0bf0, +	0x0a0c0b, +	0x0a0d01, +	0x0a0e90, +	0x0a0f01, +	0x0a1001, +	0x0a11e0, +	0x0a1201, +	0x0a1302, +	0x0a1430, +	0x0a1580, +	0x0a16ff, +	0x023201, +	0x0b0301, +	0x023201, +}; + + +const unsigned int CLKGEN_SELECT = 145; + + +enum gpio_direction {IN, OUT}; + +class gpio { +	public: + +	gpio(unsigned int gpio_num, gpio_direction pin_direction, bool close_action); +	~gpio(); + +	bool get_value(); +	void set_value(bool state); + +	private: + +	unsigned int gpio_num; + +	std::stringstream base_path; +	std::fstream value_file; +	std::fstream direction_file; +	bool close_action; // True set to input and release, false do nothing +}; + +class spidev { +	public: + +	spidev(std::string dev_name); +	~spidev(); + +	void send(char *wbuf, char *rbuf, unsigned int nbytes); + +	private: + +	int fd; + +}; + +gpio::gpio(unsigned int _gpio_num, gpio_direction pin_direction, bool close_action) +{ +	std::fstream export_file; + +	gpio_num = _gpio_num; + +	export_file.open("/sys/class/gpio/export", std::ios::out); +	if (!export_file.is_open())  ///\todo Poor error handling +		std::cout << "Failed to open gpio export file." << std::endl; + +	export_file << gpio_num << std::endl; + +	base_path << "/sys/class/gpio/gpio" << gpio_num << std::flush; + +	std::string direction_file_name; + +	direction_file_name = base_path.str() + "/direction"; + +	direction_file.open(direction_file_name.c_str());  +	if (!direction_file.is_open()) +		std::cout << "Failed to open direction file." << std::endl; +	if (pin_direction == OUT) +		direction_file << "out" << std::endl; +	else +		direction_file << "in" << std::endl; + +	std::string value_file_name; + +	value_file_name = base_path.str() + "/value"; + +	value_file.open(value_file_name.c_str(), std::ios_base::in | std::ios_base::out); +	if (!value_file.is_open()) +		std::cout << "Failed to open value file." << std::endl; +} + +bool gpio::get_value() +{ + +	std::string val; + +	std::getline(value_file, val); +	value_file.seekg(0); + +	if (val == "0") +		return false; +	else if (val == "1") +		return true; +	else +		std::cout << "Data read from value file|" << val << "|" << std::endl; + +	return false; +} + +void gpio::set_value(bool state) +{ + +	if (state) +		value_file << "1" << std::endl; +	else +		value_file << "0" << std::endl; +} + +gpio::~gpio() +{ +	if (close_action) { +		std::fstream unexport_file; + +		direction_file << "in" << std::endl; + +		unexport_file.open("/sys/class/gpio/unexport", std::ios::out); +		if (!unexport_file.is_open())  ///\todo Poor error handling +			std::cout << "Failed to open gpio export file." << std::endl; + +		unexport_file << gpio_num << std::endl; +		 +	 } + +} + +spidev::spidev(std::string fname) +{ +	int ret; +	int mode = 0; +	int speed = 12000; +	int bits = 24; + +	fd = open(fname.c_str(), O_RDWR); + +	ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); +	ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); +	ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); +} +	 + +spidev::~spidev() +{ +	close(fd); +} + +void spidev::send(char *buf, char *rbuf, unsigned int nbytes) +{ +	int ret; + +	struct spi_ioc_transfer tr; +	tr.tx_buf = (unsigned long) buf; +	tr.rx_buf = (unsigned long) rbuf; +	tr.len = nbytes; +	tr.delay_usecs = 0; +	tr.speed_hz = 12000000; +	tr.bits_per_word = 24; + +	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);	 + +} + +static void send_config_to_clkgen(gpio &chip_select, const unsigned int data[], unsigned int data_size) +{ +	spidev spi("/dev/spidev1.0"); +	unsigned int rbuf; + +	for (unsigned int i = 0; i < data_size; i++) { + +		std::cout << "sending " << std::hex << data[i] << std::endl; +		chip_select.set_value(0); +		spi.send((char *)&data[i], (char *)&rbuf, 4); +		chip_select.set_value(1); + +	}; +} + +int main(int argc, char *argv[]) +{ + +	gpio clkgen_select(CLKGEN_SELECT, OUT, true); + +	send_config_to_clkgen(clkgen_select, config_data, sizeof(config_data)/sizeof(unsigned int)); +} + diff --git a/host/apps/omap_debug/fetch-bin.sh b/host/apps/omap_debug/fetch-bin.sh new file mode 100755 index 000000000..019ddaaf2 --- /dev/null +++ b/host/apps/omap_debug/fetch-bin.sh @@ -0,0 +1,6 @@ +if [ $GHQ ]; then +	scp $GHQ_USER@astro:/workspace/usrp1-e-dev/u1e.bin /home/root +else +	scp -P 8822 balister@192.168.1.10:src/git/fpgapriv/usrp2/top/u1e/build/u1e.bin /home/root +fi +sync diff --git a/host/apps/omap_debug/fetch-kernel.sh b/host/apps/omap_debug/fetch-kernel.sh new file mode 100755 index 000000000..ce420f3d2 --- /dev/null +++ b/host/apps/omap_debug/fetch-kernel.sh @@ -0,0 +1,7 @@ +if [ $GHQ ]; then +	scp $GHQ_USER@astro:/workspace/usrp1-e-dev/kernel_usrp/arch/arm/boot/uImage /media/mmcblk0p1/uImage +else +	scp balister@192.168.1.10:src/git/kernel_usrp/arch/arm/boot/uImage /media/mmcblk0p1/uImage +fi +sync + diff --git a/host/apps/omap_debug/fetch-module.sh b/host/apps/omap_debug/fetch-module.sh new file mode 100755 index 000000000..ec28989bd --- /dev/null +++ b/host/apps/omap_debug/fetch-module.sh @@ -0,0 +1,6 @@ +if [ $GHQ ]; then +	scp $GHQ_USER@astro:/workspace/usrp1-e-dev/kernel_usrp/drivers/misc/usrp_e.ko /lib/modules/2.6.33/kernel/drivers/misc +else +	scp balister@192.168.1.10:src/git/kernel_usrp/drivers/misc/usrp_e.ko /lib/modules/2.6.33/kernel/drivers/misc +fi +sync diff --git a/host/apps/omap_debug/fetch-u-boot.sh b/host/apps/omap_debug/fetch-u-boot.sh new file mode 100755 index 000000000..5309364b8 --- /dev/null +++ b/host/apps/omap_debug/fetch-u-boot.sh @@ -0,0 +1,7 @@ +if [ $GHQ ]; then +	scp $GHQ_USER@astro:/workspace/usrp1-e-dev/u-boot-overo/u-boot.bin /media/mmcblk0p1/ +else +	scp balister@192.168.1.167:src/git/u-boot/u-boot.bin /media/mmcblk0p1/  +fi +sync + diff --git a/host/apps/omap_debug/fpga-downloader.cc b/host/apps/omap_debug/fpga-downloader.cc new file mode 100644 index 000000000..4e475b5c1 --- /dev/null +++ b/host/apps/omap_debug/fpga-downloader.cc @@ -0,0 +1,253 @@ +/* -*- c++ -*- */ +/* + * Copyright 2003,2004,2008,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio 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, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. +*/ + +#include <iostream> +#include <sstream> +#include <fstream> +#include <string> +#include <cstdlib> + +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> + +#include <linux/spi/spidev.h> + +/* + * Configuration connections + * + * CCK    - MCSPI1_CLK + * DIN    - MCSPI1_MOSI + * PROG_B - GPIO_175     - output (change mux) + * DONE   - GPIO_173     - input  (change mux) + * INIT_B - GPIO_114     - input  (change mux) + * +*/ + +const unsigned int PROG_B = 175; +const unsigned int DONE   = 173; +const unsigned int INIT_B = 114; + +static std::string bit_file = "safe_u1e.bin"; + +const int BUF_SIZE = 4096; + +enum gpio_direction {IN, OUT}; + +class gpio { +	public: + +	gpio(unsigned int gpio_num, gpio_direction pin_direction); + +	bool get_value(); +	void set_value(bool state); + +	private: + +	std::stringstream base_path; +	std::fstream value_file;	 +}; + +class spidev { +	public: + +	spidev(std::string dev_name); +	~spidev(); + +	void send(char *wbuf, char *rbuf, unsigned int nbytes); + +	private: + +	int fd; + +}; + +gpio::gpio(unsigned int gpio_num, gpio_direction pin_direction) +{ +	std::fstream export_file; + +	export_file.open("/sys/class/gpio/export", std::ios::out); +	if (!export_file.is_open())  ///\todo Poor error handling +		std::cout << "Failed to open gpio export file." << std::endl; + +	export_file << gpio_num << std::endl; + +	base_path << "/sys/class/gpio/gpio" << gpio_num << std::flush; + +	std::fstream direction_file; +	std::string direction_file_name; + +	if (gpio_num != 114) { +		direction_file_name = base_path.str() + "/direction"; + +		direction_file.open(direction_file_name.c_str());  +		if (!direction_file.is_open()) +			std::cout << "Failed to open direction file." << std::endl; +		if (pin_direction == OUT) +			direction_file << "out" << std::endl; +		else +			direction_file << "in" << std::endl; +	} + +	std::string value_file_name; + +	value_file_name = base_path.str() + "/value"; + +	value_file.open(value_file_name.c_str(), std::ios_base::in | std::ios_base::out); +	if (!value_file.is_open()) +		std::cout << "Failed to open value file." << std::endl; +} + +bool gpio::get_value() +{ + +	std::string val; + +	std::getline(value_file, val); +	value_file.seekg(0); + +	if (val == "0") +		return false; +	else if (val == "1") +		return true; +	else +		std::cout << "Data read from value file|" << val << "|" << std::endl; + +	return false; +} + +void gpio::set_value(bool state) +{ + +	if (state) +		value_file << "1" << std::endl; +	else +		value_file << "0" << std::endl; +} + +static void prepare_fpga_for_configuration(gpio &prog, gpio &init) +{ + +	prog.set_value(true); +	prog.set_value(false); +	prog.set_value(true); + +#if 0 +	bool ready_to_program(false); +	unsigned int count(0); +	do { +		ready_to_program = init.get_value(); +		count++; + +		sleep(1); +	} while (count < 10 && !ready_to_program); + +	if (count == 10) { +		std::cout << "FPGA not ready for programming." << std::endl; +		exit(-1); +	} +#endif +} + +spidev::spidev(std::string fname) +{ +	int ret; +	int mode = 0; +	int speed = 12000000; +	int bits = 8; + +	fd = open(fname.c_str(), O_RDWR); + +	ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); +	ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); +	ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); +} +	 + +spidev::~spidev() +{ +	close(fd); +} + +void spidev::send(char *buf, char *rbuf, unsigned int nbytes) +{ +	int ret; + +	struct spi_ioc_transfer tr; +	tr.tx_buf = (unsigned long) buf; +	tr.rx_buf = (unsigned long) rbuf; +	tr.len = nbytes; +	tr.delay_usecs = 0; +	tr.speed_hz = 48000000; +	tr.bits_per_word = 8; + +	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);	 + +} + +static void send_file_to_fpga(std::string &file_name, gpio &error, gpio &done) +{ +	std::ifstream bitstream; + +	std::cout << "File name - " << file_name.c_str() << std::endl; + +	bitstream.open(file_name.c_str(), std::ios::binary); +	if (!bitstream.is_open()) +		std::cout << "File " << file_name << " not opened succesfully." << std::endl; + +	spidev spi("/dev/spidev1.0"); +	char buf[BUF_SIZE]; +	char rbuf[BUF_SIZE]; + +	do { +		bitstream.read(buf, BUF_SIZE); +		spi.send(buf, rbuf, bitstream.gcount()); + +		if (error.get_value()) +			std::cout << "INIT_B went high, error occured." << std::endl; + +		if (!done.get_value()) +			std::cout << "Configuration complete." << std::endl; + +	} while (bitstream.gcount() == BUF_SIZE); +} + +int main(int argc, char *argv[]) +{ + +	gpio gpio_prog_b(PROG_B, OUT); +	gpio gpio_init_b(INIT_B, IN); +	gpio gpio_done  (DONE,   IN); + +	if (argc == 2) +		bit_file = argv[1]; + +	std::cout << "FPGA config file: " << bit_file << std::endl; + +	prepare_fpga_for_configuration(gpio_prog_b, gpio_init_b); + +	std::cout << "Done = " << gpio_done.get_value() << std::endl; + +	send_file_to_fpga(bit_file, gpio_init_b, gpio_done); +} + diff --git a/host/apps/omap_debug/read_board_id.sh b/host/apps/omap_debug/read_board_id.sh new file mode 100755 index 000000000..96081f219 --- /dev/null +++ b/host/apps/omap_debug/read_board_id.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +i2cget -y 3 0x51 0x00 b +i2cget -y 3 0x51 0x01 b +i2cget -y 3 0x51 0x02 b +i2cget -y 3 0x51 0x03 b +i2cget -y 3 0x51 0x04 b +i2cget -y 3 0x51 0x05 b + + diff --git a/host/apps/omap_debug/reload-fpga.sh b/host/apps/omap_debug/reload-fpga.sh new file mode 100755 index 000000000..2754718a4 --- /dev/null +++ b/host/apps/omap_debug/reload-fpga.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +rmmod usrp_e +fpga-downloader /home/root/u1e.bin +modprobe usrp_e +usrp-e-debug-pins 1 + diff --git a/host/apps/omap_debug/set_debug_pins.py b/host/apps/omap_debug/set_debug_pins.py new file mode 100755 index 000000000..0f9ecd7b9 --- /dev/null +++ b/host/apps/omap_debug/set_debug_pins.py @@ -0,0 +1,35 @@ +#!/usr/bin/python + +import os + +# Memory Map +misc_base = 0 +uart_base = 1 +spi_base = 2 +i2c_base = 3 +gpio_base = 4 * 128 +settings_base = 5 + +# GPIO offset +gpio_pins = 0 +gpio_ddr = 4 +gpio_ctrl_lo = 8 +gpio_ctrl_hi = 12 + +def set_reg(reg, val): +    os.system("./usrp1-e-ctl w %d 1 %d" % (reg,val)) + +def get_reg(reg): +    fin,fout = os.popen4("./usrp1-e-ctl r %d 1" % (reg,)) +    print fout.read() + +# Set DDRs to output +set_reg(gpio_base+gpio_ddr, 0xFFFF) +set_reg(gpio_base+gpio_ddr+2, 0xFFFF) + +# Set CTRL to Debug #0 ( A is for debug 0, F is for debug 1 ) +set_reg(gpio_base+gpio_ctrl_lo, 0xAAAA) +set_reg(gpio_base+gpio_ctrl_lo+2, 0xAAAA) +set_reg(gpio_base+gpio_ctrl_hi, 0xAAAA) +set_reg(gpio_base+gpio_ctrl_hi+2, 0xAAAA) + diff --git a/host/apps/omap_debug/setup-board-id-eeprom.sh b/host/apps/omap_debug/setup-board-id-eeprom.sh new file mode 100755 index 000000000..4dba1cce5 --- /dev/null +++ b/host/apps/omap_debug/setup-board-id-eeprom.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +i2cset -y 3 0x51 0x00 0x00 +i2cset -y 3 0x51 0x01 0x03 +i2cset -y 3 0x51 0x02 0x00 +i2cset -y 3 0x51 0x03 0x01 +i2cset -y 3 0x51 0x04 0x01 +i2cset -y 3 0x51 0x05 0x00 +i2cset -y 3 0x51 0x06 0x00 + +i2cget -y 3 0x51 0 b   +i2cget -y 3 0x51 1 b   +i2cget -y 3 0x51 2 b   +i2cget -y 3 0x51 3 b   +i2cget -y 3 0x51 4 b   +i2cget -y 3 0x51 5 b   +i2cget -y 3 0x51 6 b   diff --git a/host/apps/omap_debug/test.c b/host/apps/omap_debug/test.c new file mode 100644 index 000000000..36f4d700a --- /dev/null +++ b/host/apps/omap_debug/test.c @@ -0,0 +1,34 @@ +#include <stdio.h> + +void +main() +{ +  int x; +  char *y; +  long long z; + +  x = 0x01020304; +  z = 0x0102030405060708LL; + +  printf("%x\n",x); +  y = (char *)&x; +  printf("%x\n",y[0]); +  printf("%x\n",y[1]); +  printf("%x\n",y[2]); +  printf("%x\n",y[3]); + +  printf("Printing z ...\n"); +  printf("%llx\n",z); +  printf("Printing z done\n"); + +  y = (char *)&z; +  printf("%x\n",y[0]); +  printf("%x\n",y[1]); +  printf("%x\n",y[2]); +  printf("%x\n",y[3]); +  printf("%x\n",y[4]); +  printf("%x\n",y[5]); +  printf("%x\n",y[6]); +  printf("%x\n",y[7]); +} + diff --git a/host/apps/omap_debug/u1e-read-stream.c b/host/apps/omap_debug/u1e-read-stream.c new file mode 100644 index 000000000..4e4c21d9e --- /dev/null +++ b/host/apps/omap_debug/u1e-read-stream.c @@ -0,0 +1,21 @@ +#include <stdio.h> +#include <sys/types.h> +#include <fcntl.h> + +int main(int rgc, char *argv[]) +{ +	int fp, cnt, n; +	short buf[1024]; + +	n = 0; + +	fp = open("/dev/usrp1_e0", O_RDONLY); +	printf("fp = %d\n", fp); + +	do { +		cnt = read(fp, buf, 2048); +		n++; +//		printf("Bytes read - %d\n", cnt); +	} while(n < 10*512); +	printf("Data - %hX\n", buf[0]); +} diff --git a/host/apps/omap_debug/usrp-e-button.c b/host/apps/omap_debug/usrp-e-button.c new file mode 100644 index 000000000..f13291491 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-button.c @@ -0,0 +1,56 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <fcntl.h> +#include <string.h> +#include <sys/ioctl.h> +#include <unistd.h> + +#include "usrp_e.h" +#include "usrp_e_regs.hpp" + +// Usage: usrp_e_uart <string> + +#define PB1 (1<<8) +#define PB2 (1<<9) +#define PB3 (1<<10) +#define P1 (0) +#define P2 (0xFF) +#define P3 (0xAA) +#define P4 (0x55) + +int main(int argc, char *argv[]) +{ +	int fp, ret; +	struct usrp_e_ctl16 d; +	int pb1=0, pb2=0, pb3=0, p1=0, p2=0, p3=0, p4=0; + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	d.offset = UE_REG_MISC_SW; +	d.count = 1; + +	do { +		ret = ioctl(fp, USRP_E_READ_CTL16, &d); +		if (d.buf[0] & PB1) { +			pb1 = 1; +			printf("Pushbutton 1 hit\n"); +		} + +		if (d.buf[0] & PB2) { +			pb2 = 1; +			printf("Pushbutton 2 hit\n"); +		} + +		if (d.buf[0] & PB3) { +			pb3 = 1; +			printf("Pushbutton 3 hit\n"); +		} + +		sleep(1); + +	} while (!(pb1 && pb2 && pb3)); + +	return 0; +} 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..c3ae45cc1 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-crc-rw.c @@ -0,0 +1,274 @@ +#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 "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; +	} + +	return 0; +} + +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; +	unsigned long bytes_transfered, elapsed_seconds; +	struct timeval start_time, finish_time; + +	__u8 *p; +	__u32 *pi; + +	printf("Greetings from the reading thread!\n"); + +	// IMPORTANT: must assume max length packet from fpga +	rx_data = malloc(2048); + +	rx_pkt_cnt = 0; + +	bytes_transfered = 0; +	gettimeofday(&start_time, NULL); + +	while (1) { +		 +		cnt = read(fp, rx_data, 2048); +		if (cnt < 0) +			printf("Error returned from read: %d\n", cnt); + +		rx_pkt_cnt++; + +#if 0 +		if (rx_pkt_cnt  == 512) { +			printf("."); +			fflush(stdout); +			rx_pkt_cnt = 0; +		} +#endif + +		if (rx_data->status & RB_OVERRUN) +			printf("O"); + +		printf("rx_data->len = %d\n", rx_data->len); + +	 +		crc = 0xFFFFFFFF; +		for (i = 0; i < rx_data->len - 4; i+=2) { +			crc = ((crc >> 8) & 0x00FFFFFF) ^ +				crc_tab[(crc ^ rx_data->buf[i+1]) & 0xFF]; +printf("idx = %d, data = %X, crc = %X\n", i, rx_data->buf[i+1],crc); +			crc = ((crc >> 8) & 0x00FFFFFF) ^ +				crc_tab[(crc ^ rx_data->buf[i]) & 0xFF]; +printf("idx = %d, data = %X, crc = %X\n", i, rx_data->buf[i],crc); +		} + +		p = &rx_data->buf[rx_data->len - 4]; +		pi = (__u32 *) p; +		rx_crc = *pi; + +#if 1 +		printf("rx_data->len = %d\n", rx_data->len); +		printf("rx_data->status = %d\n", rx_data->status); +		for (i = 0; i < rx_data->len; i++) +			printf("idx = %d, data = %X\n", i, rx_data->buf[i]); +		printf("calc crc = %lX, rx crc = %X\n", crc, rx_crc);  +		fflush(stdout); +		break; +#endif + +		if (rx_crc != (crc & 0xFFFFFFFF)) { +			printf("CRC Error, calc crc: %X, rx_crc: %X\n", +				(crc & 0xFFFFFFFF), rx_crc); +		} + +		bytes_transfered += rx_data->len; + +		if (bytes_transfered > (100 * 1000000)) { +			gettimeofday(&finish_time, NULL); +			elapsed_seconds = finish_time.tv_sec - start_time.tv_sec; + +			printf("Bytes transfered = %ld, elapsed seconds = %ld\n", bytes_transfered, elapsed_seconds); +			printf("RX data transfer rate = %f K Samples/second\n", +				(float) bytes_transfered / (float) elapsed_seconds / 250); + + +			start_time = finish_time; +			bytes_transfered = 0; +		} +	}	 +} +	 +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; +	unsigned long bytes_transfered, elapsed_seconds; +	struct timeval start_time, finish_time; + +	printf("Greetings from the write thread!\n"); + +	tx_pkt_cnt = 0; +	tx_data = malloc(2048); + +	bytes_transfered = 0; +	gettimeofday(&start_time, NULL); + +	while (1) { + +		tx_pkt_cnt++; + +#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 + +		tx_len = 2048 - sizeof(struct usrp_transfer_frame) - sizeof(int); +		tx_data->len = tx_len + sizeof(int); + +		crc = 0xFFFFFFFF; +		for (i = 0; i < tx_len; i++) { +			tx_data->buf[i] = i & 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); + + +		bytes_transfered += tx_data->len; + +		if (bytes_transfered > (100 * 1000000)) { +			gettimeofday(&finish_time, NULL); +			elapsed_seconds = finish_time.tv_sec - start_time.tv_sec; + +			printf("Bytes transfered = %d, elapsed seconds = %d\n", bytes_transfered, elapsed_seconds); +			printf("TX data transfer rate = %f K Samples/second\n", +				(float) bytes_transfered / (float) elapsed_seconds / 250); + + +			start_time = finish_time; +			bytes_transfered = 0; +		} + +//		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; +	} + +	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); + +	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"); + +	return 0; +} diff --git a/host/apps/omap_debug/usrp-e-ctl.c b/host/apps/omap_debug/usrp-e-ctl.c new file mode 100644 index 000000000..69c48ee6f --- /dev/null +++ b/host/apps/omap_debug/usrp-e-ctl.c @@ -0,0 +1,48 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <fcntl.h> +#include <sys/ioctl.h> + +#include "usrp_e.h" + +// Usage: usrp_e_ctl w|r offset number_of_values val1 val2 .... + +int main(int argc, char *argv[]) +{ +	int fp, i, cnt, ret; +	struct usrp_e_ctl16 ctl_data; + +	if (argc < 4) { +		printf("Usage: usrp_e_ctl w|r offset number_of_values val1 val2 ....\n"); +		exit(-1); +	} + +	cnt = atoi(argv[3]); + +	ctl_data.offset = atoi(argv[2]); +	ctl_data.count  = cnt; + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	if (*argv[1] == 'w') { +		for (i=0; i<cnt; i++) +			ctl_data.buf[i] = atoi(argv[4+i]); + +		ret = ioctl(fp, USRP_E_WRITE_CTL16, &ctl_data); +		printf("Return value from write ioctl = %d\n", ret); +	} + +	if (*argv[1] == 'r') { +		ret = ioctl(fp, USRP_E_READ_CTL16, &ctl_data); +		printf("Return value from write ioctl = %d\n", ret); + +		for (i=0; i<ctl_data.count; i++) { +			if (!(i%8)) +				printf("\nData at %4d :", i); +			printf(" %5d", ctl_data.buf[i]); +		} +		printf("\n"); +	} +} diff --git a/host/apps/omap_debug/usrp-e-debug-pins.c b/host/apps/omap_debug/usrp-e-debug-pins.c new file mode 100644 index 000000000..d18bbf990 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-debug-pins.c @@ -0,0 +1,77 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <fcntl.h> +#include <string.h> +#include <sys/ioctl.h> + +#include "usrp_e.h" +#include "usrp_e_regs.hpp" + +// Usage: usrp_e_gpio <string> + +static int fp; + +static int read_reg(__u16 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 write_reg(__u16 reg, __u16 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); +} + +int main(int argc, char *argv[]) +{ +	int test; + +	test = 0; +	if (argc < 2) { +		printf("%s 0|1|off\n", argv[0]); +	} + +        fp = open("/dev/usrp_e0", O_RDWR); +        printf("fp = %d\n", fp); +	if (fp < 0) { +		perror("Open failed"); +		return -1; +	} + +	if (strcmp(argv[1], "0") == 0) { +		printf("Selected 0 based on %s\n", argv[1]); +		write_reg(UE_REG_GPIO_TX_DDR, 0xFFFF); +		write_reg(UE_REG_GPIO_RX_DDR, 0xFFFF); +		write_reg(UE_REG_GPIO_TX_SEL, 0x0); +		write_reg(UE_REG_GPIO_RX_SEL, 0x0); +		write_reg(UE_REG_GPIO_TX_DBG, 0xFFFF); +		write_reg(UE_REG_GPIO_RX_DBG, 0xFFFF); +	} else if (strcmp(argv[1], "1") == 0) { +		printf("Selected 1 based on %s\n", argv[1]); +		write_reg(UE_REG_GPIO_TX_DDR, 0xFFFF); +		write_reg(UE_REG_GPIO_RX_DDR, 0xFFFF); +		write_reg(UE_REG_GPIO_TX_SEL, 0xFFFF); +		write_reg(UE_REG_GPIO_RX_SEL, 0xFFFF); +		write_reg(UE_REG_GPIO_TX_DBG, 0xFFFF); +		write_reg(UE_REG_GPIO_RX_DBG, 0xFFFF); +	} else { +		printf("Selected off based on %s\n", argv[1]); +		write_reg(UE_REG_GPIO_TX_DDR, 0x0); +		write_reg(UE_REG_GPIO_RX_DDR, 0x0); +	} + +	return 0; +} diff --git a/host/apps/omap_debug/usrp-e-gpio.c b/host/apps/omap_debug/usrp-e-gpio.c new file mode 100644 index 000000000..adef877d3 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-gpio.c @@ -0,0 +1,83 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <fcntl.h> +#include <string.h> +#include <sys/ioctl.h> + +#include "usrp_e.h" +#include "usrp_e_regs.hpp" + +// Usage: usrp_e_gpio <string> + +static int fp; + +static int read_reg(__u16 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 write_reg(__u16 reg, __u16 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); +} + +int main(int argc, char *argv[]) +{ +	int i, test, data_in; + +	test = 0; +	if (argc > 1) +		test = 1; + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	write_reg(UE_REG_GPIO_TX_DDR, 0x0); +	write_reg(UE_REG_GPIO_RX_DDR, 0xFFFF); + +	for (i=0; i < 16; i++) { +		write_reg(UE_REG_GPIO_RX_IO, 1 << i); +		sleep(1); +		if (test) { +			data_in = read_reg(UE_REG_GPIO_TX_IO); +			if (data_in != (1 << i)) +				printf("Read failed, wrote: %X read: %X\n", \ +					1 << i, data_in); +		} +	} + +	write_reg(UE_REG_GPIO_RX_DDR, 0x0); +	write_reg(UE_REG_GPIO_TX_DDR, 0xFFFF); + +	sleep(1); + +	for (i=0; i < 16; i++) { +		write_reg(UE_REG_GPIO_TX_IO, 1 << i); +		sleep(1); +		if (test) { +			data_in = read_reg(UE_REG_GPIO_RX_IO); +			if (data_in != (1 << i)) +				printf("Read failed, wrote: %X read: %X\n", \ +					1 << i, data_in); +		} +	} + +	write_reg(UE_REG_GPIO_RX_DDR, 0x0); +	write_reg(UE_REG_GPIO_TX_DDR, 0x0); + +	return 0; +} diff --git a/host/apps/omap_debug/usrp-e-i2c.c b/host/apps/omap_debug/usrp-e-i2c.c new file mode 100644 index 000000000..da8709ae1 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-i2c.c @@ -0,0 +1,87 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <fcntl.h> +#include <sys/ioctl.h> + +#include "usrp_e.h" + +// Usage: usrp_e_i2c w address data0 data1 data 2 .... +// Usage: usrp_e_i2c r address count + +int main(int argc, char *argv[]) +{ +	int fp, ret, i, tmp; +	struct usrp_e_i2c *i2c_msg; +	int direction, address, count; + +	if (argc < 3) { +		printf("Usage: usrp-e-i2c w address data0 data1 data2 ...\n"); +		printf("Usage: usrp-e-i2c r address count\n"); +		printf("All addresses and data in hex.\n"); +		exit(-1); +	} + +	if (strcmp(argv[1], "r") == 0) { +		direction = 0; +	} else if (strcmp(argv[1], "w") == 0) { +		direction = 1; +	} else { +		return -1; +	} + +	sscanf(argv[2], "%X", &address); +	printf("Address = %X\n", address); + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); +	if (fp < 0) { +		perror("Open failed"); +		return -1; +	} + +//	sleep(1); + +	if (direction) { +		count = argc - 3; +	} else { +		sscanf(argv[3], "%X", &count); +	} +	printf("Count = %X\n", count); + +	i2c_msg = malloc(sizeof(i2c_msg) + count * sizeof(char)); + +	i2c_msg->addr = address; +	i2c_msg->len = count; + +	for (i = 0; i < count; i++) { +		i2c_msg->data[i] = i; +	} + +	if (direction) { +		// Write + +		for (i=0; i<count; i++) { +			sscanf(argv[3+i], "%X", &tmp); +			i2c_msg->data[i] = tmp; +		} + +		ret = ioctl(fp, USRP_E_I2C_WRITE, i2c_msg); +		printf("Return value from i2c_write ioctl: %d\n", ret); +	} else { +		// Read + +		ret = ioctl(fp, USRP_E_I2C_READ, i2c_msg); +		printf("Return value from i2c_read ioctl: %d\n", ret); + +		printf("Ioctl: %d Data read :", ret); +		for (i=0; i<count; i++) { +			printf(" %X", i2c_msg->data[i]); +		} +		printf("\n"); +			 +	} +	return 0; +} diff --git a/host/apps/omap_debug/usrp-e-lb-test.c b/host/apps/omap_debug/usrp-e-lb-test.c new file mode 100644 index 000000000..68848064e --- /dev/null +++ b/host/apps/omap_debug/usrp-e-lb-test.c @@ -0,0 +1,58 @@ +#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 + +int main(int argc, char *argv[]) +{ +	struct usrp_transfer_frame *tx_data, *rx_data; +	int i, fp, packet_data_length, cnt; +	struct usrp_e_ctl16 d; + +	if (argc < 2) { +		printf("%s data_size (in bytes < 2040)\n", argv[0]); +		return -1; +	} + +	packet_data_length = atoi(argv[1]); + +	fp = open("/dev/usrp_e0", O_RDWR); + +	d.offset = 14; +	d.count = 1; +	d.buf[0] = (1 << 13); +	ioctl(fp, USRP_E_WRITE_CTL16, &d); + +	tx_data = malloc(2048); +	rx_data = malloc(2048); + +	tx_data->status = 0; +	tx_data->len = sizeof(struct usrp_transfer_frame) + packet_data_length; + +	while (1) { + +		for (i = 0; i < packet_data_length; i++) { +			tx_data->buf[i] = random() >> 24; + +		} + +		cnt = write(fp, tx_data, 2048); +		cnt = read(fp, rx_data, 2048); + +		if (tx_data->len != rx_data->len) +			printf("Bad frame length sent %d, read %d\n", tx_data->len, rx_data->len); + +		for (i = 0; i < packet_data_length; i++) { +			if (tx_data->buf[i] != rx_data->buf[i]) +				printf("Bad data at %d, sent %d, received %d\n", i, tx_data->buf[i], rx_data->buf[i]); +		} +		printf("---------------------------------------------------\n"); +		sleep(1); +	} +} diff --git a/host/apps/omap_debug/usrp-e-led.c b/host/apps/omap_debug/usrp-e-led.c new file mode 100644 index 000000000..d1b6c8996 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-led.c @@ -0,0 +1,35 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <fcntl.h> +#include <string.h> +#include <sys/ioctl.h> +#include <unistd.h> + +#include "usrp_e.h" +#include "usrp_e_regs.hpp" + +// Usage: usrp_e_uart <string> + + +int main(int argc, char *argv[]) +{ +	int fp, i, ret; +	struct usrp_e_ctl16 d; + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	d.offset = UE_REG_MISC_BASE; +	d.count = 1; + +	while (1) { +		for (i=0; i<8; i++) { +			d.buf[0] = i; +			ret = ioctl(fp, USRP_E_WRITE_CTL16, &d); +			sleep(1); +		} +	} + +	return 0; +} diff --git a/host/apps/omap_debug/usrp-e-loopback.c b/host/apps/omap_debug/usrp-e-loopback.c new file mode 100644 index 000000000..d11cf7d09 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-loopback.c @@ -0,0 +1,194 @@ +#include <stdio.h> +#include <sys/types.h> +#include <fcntl.h> +#include <pthread.h> +#include <stdlib.h> +#include <unistd.h> +#include <stddef.h> +#include <sys/mman.h> +#include "usrp_e.h" + +// max length #define PKT_DATA_LENGTH 1016 +static int packet_data_length; +static int error; + +struct pkt { +	int len; +	int checksum; +	int seq_num; +	short data[]; +}; + +static int fp; + +static int calc_checksum(struct pkt *p) +{ +	int i, sum; + +	i = 0; +	sum = 0; + +	for (i=0; i < p->len; i++) +		sum += p->data[i]; + +	sum += p->seq_num; +	sum += p->len; + +	return sum; +} + +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; + +	printf("Greetings from the reading thread!\n"); + +	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); + +//		printf("p->seq_num = %d\n", p->seq_num); + + +		pkt_count++; + +		if (p->seq_num != prev_seq_num + 1) { +			printf("Sequence number fail, current = %d, previous = %d, pkt_count = %d\n", +				p->seq_num, prev_seq_num, pkt_count); + +			seq_num_failure ++; +			if (seq_num_failure > 2) +				error = 1; +		} + +		prev_seq_num = p->seq_num; + +		if (calc_checksum(p) != p->checksum) { +			printf("Checksum fail packet = %X, expected = %X, pkt_count = %d\n", +				calc_checksum(p), p->checksum, pkt_count); +			error = 1; +		} + +		bytes_transfered += cnt; + +		if (bytes_transfered > (100 * 1000000)) { +			gettimeofday(&finish_time, NULL); +			elapsed_seconds = finish_time.tv_sec - start_time.tv_sec; + +			printf("RX data transfer rate = %f K Samples/second\n", +				(float) bytes_transfered / (float) elapsed_seconds / 4000); + + +			start_time = finish_time; +			bytes_transfered = 0; +		} + + +//		printf("."); +//		fflush(stdout); +//		printf("\n"); +	} + +} + +static void *write_thread(void *threadid) +{ +	int seq_number, i, cnt; +	void *tx_data; +	struct pkt *p; + +	printf("Greetings from the write thread!\n"); + +	tx_data = malloc(2048); +	p = (struct pkt *) ((void *)tx_data); + +	for (i=0; i < packet_data_length; i++) +//		p->data[i] = random() >> 16; +		p->data[i] = i; + +	seq_number = 1; + +	while (1) { +		p->seq_num = seq_number++; + +		if (packet_data_length > 0) +			p->len = packet_data_length; +		else +			p->len = (random() & 0x1ff) + (1004 - 512); + +		p->checksum = calc_checksum(p); + +		cnt = write(fp, tx_data, p->len * 2 + 12); +		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; +	struct sched_param s = { +		.sched_priority = 1 +	}; +	void *rb; +	struct usrp_transfer_frame *tx_rb, *rx_rb; + +	if (argc < 2) { +		printf("%s data_size\n", argv[0]); +		return -1; +	} + +	packet_data_length = atoi(argv[1]); + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	rb = mmap(0, 202 * 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fp, 0); +	if (!rb) { +		printf("mmap failed\n"); +		exit; +	} + + +	sched_setscheduler(0, SCHED_RR, &s); +	error = 0; + +#if 1 +	if (pthread_create(&rx, NULL, read_thread, (void *) t)) { +		printf("Failed to create rx thread\n"); +		exit(-1); +	} + +	sleep(1); +#endif + +	if (pthread_create(&tx, NULL, write_thread, (void *) t)) { +		printf("Failed to create tx thread\n"); +		exit(-1); +	} + +//	while (!error) +		sleep(1000000000); + +	printf("Done sleeping\n"); +} diff --git a/host/apps/omap_debug/usrp-e-mm-loopback.c b/host/apps/omap_debug/usrp-e-mm-loopback.c new file mode 100644 index 000000000..f5fc83c87 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-mm-loopback.c @@ -0,0 +1,258 @@ +#include <stdio.h> +#include <sys/types.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <pthread.h> +#include <stdlib.h> +#include <unistd.h> +#include <stddef.h> +#include <sys/mman.h> +#include <poll.h> +#include "usrp_e.h" + +// max length #define PKT_DATA_LENGTH 1016 +static int packet_data_length; +static int error; + +struct pkt { +	int len; +	int checksum; +	int seq_num; +	short data[1024-6]; +}; + +struct ring_buffer_info (*rxi)[]; +struct ring_buffer_info (*txi)[]; +struct pkt (*rx_buf)[200]; +struct pkt (*tx_buf)[200]; + +static int fp; +static struct usrp_e_ring_buffer_size_t rb_size; + +static int calc_checksum(struct pkt *p) +{ +	int i, sum; + +	i = 0; +	sum = 0; + +	for (i=0; i < p->len; i++) +		sum += p->data[i]; + +	sum += p->seq_num; +	sum += p->len; + +	return sum; +} + +static void *read_thread(void *threadid) +{ +	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); + +	prev_seq_num = 0; +	pkt_count = 0; +	seq_num_failure = 0; + +	while (1) { + +		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("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++; + +		if (p->seq_num != prev_seq_num + 1) { +			printf("Sequence number fail, current = %d, previous = %d, pkt_count = %d\n", +				p->seq_num, prev_seq_num, pkt_count); +			printf("pkt received, rb_read = %d\n", rb_read); +			printf("p = %X, p->seq_num = %d p->len = %d\n", p, p->seq_num, p->len); + +			seq_num_failure ++; +			if (seq_num_failure > 2) +				error = 1; +		} + +		prev_seq_num = p->seq_num; + +		if (calc_checksum(p) != p->checksum) { +			printf("Checksum fail packet = %X, expected = %X, pkt_count = %d\n", +				calc_checksum(p), p->checksum, pkt_count); +			error = 1; +		} + +		(*rxi)[rb_read].flags = RB_KERNEL; + +		rb_read++; +		if (rb_read == rb_size.num_rx_frames) +			rb_read = 0; + +		bytes_transfered += cnt; + +		if (bytes_transfered > (100 * 1000000)) { +			gettimeofday(&finish_time, NULL); +			elapsed_seconds = finish_time.tv_sec - start_time.tv_sec; + +			printf("RX data transfer rate = %f K Samples/second\n", +				(float) bytes_transfered / (float) elapsed_seconds / 4000); + + +			start_time = finish_time; +			bytes_transfered = 0; +		} + + +//		printf("."); +//		fflush(stdout); +//		printf("\n"); +	} + +} + +static void *write_thread(void *threadid) +{ +	int seq_number, i, cnt, rb_write; +	void *tx_data; +	struct pkt *p; + +	printf("Greetings from the write thread!\n"); + +	tx_data = malloc(2048); +	p = (struct pkt *) ((void *)tx_data); + +	for (i=0; i < packet_data_length; i++) +//		p->data[i] = random() >> 16; +		p->data[i] = i; + +	seq_number = 1; +	rb_write = 0; + +	while (1) { +		p->seq_num = seq_number++; + +		if (packet_data_length > 0) +			p->len = packet_data_length; +		else +			p->len = (random() & 0x1ff) + (1004 - 512); + +		p->checksum = calc_checksum(p); + +		if (!((*txi)[rb_write].flags & RB_KERNEL)) { +//			printf("Waiting for space\n"); +			struct pollfd pfd; +			pfd.fd = fp; +			pfd.events = POLLOUT; +			ssize_t ret = poll(&pfd, 1, -1); +		} + +		memcpy(&(*tx_buf)[rb_write], tx_data, p->len * 2 + 12); + +		(*txi)[rb_write].len = p->len * 2 + 12; +		(*txi)[rb_write].flags = RB_USER; + +		rb_write++; +		if (rb_write == rb_size.num_tx_frames) +			rb_write = 0; + +		cnt = write(fp, NULL, 0); +//		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; +	struct sched_param s = { +		.sched_priority = 1 +	}; +	int ret, map_size, page_size; +	void *rb; + +	if (argc < 2) { +		printf("%s data_size\n", argv[0]); +		return -1; +	} + +	packet_data_length = atoi(argv[1]); + +	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 = %X\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); + +	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; + +#if 1 +	if (pthread_create(&rx, NULL, read_thread, (void *) t)) { +		printf("Failed to create rx thread\n"); +		exit(-1); +	} + +	sleep(1); +#endif + +	if (pthread_create(&tx, NULL, write_thread, (void *) t)) { +		printf("Failed to create tx thread\n"); +		exit(-1); +	} + +//	while (!error) +		sleep(1000000000); + +	printf("Done sleeping\n"); +} diff --git a/host/apps/omap_debug/usrp-e-ram.c b/host/apps/omap_debug/usrp-e-ram.c new file mode 100644 index 000000000..d548f7ccd --- /dev/null +++ b/host/apps/omap_debug/usrp-e-ram.c @@ -0,0 +1,25 @@ +#include <stdio.h> +#include <sys/types.h> +#include <fcntl.h> + +int main(int rgc, char *argv[]) +{ +	int fp, i, cnt; +	unsigned short buf[1024]; +	unsigned short buf_rb[1024]; + +	fp = open("/dev/usrp1_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	for (i=0; i<1024; i++) +		buf[i] = i*256;  +	write(fp, buf, 2048); +	read(fp, buf_rb, 2048); + +	printf("Read back %hX %hX\n", buf_rb[0], buf_rb[1]); + +	for (i=0; i<1024; i++) { +		if (buf[i] != buf_rb[i]) +			printf("Read - %hX, expected - %hX\n", buf_rb[i], buf[i]); +	} +} diff --git a/host/apps/omap_debug/usrp-e-random-loopback.c b/host/apps/omap_debug/usrp-e-random-loopback.c new file mode 100644 index 000000000..5960b8fbd --- /dev/null +++ b/host/apps/omap_debug/usrp-e-random-loopback.c @@ -0,0 +1,149 @@ +#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 1014 +static int packet_data_length; + +struct pkt { +	int checksum; +	int seq_num; +	int len; +	short data[]; +}; + +static int fp; + +static int calc_checksum(struct pkt *p) +{ +	int i, sum; + +	i = 0; +	sum = 0; + +	for (i=0; i < p->len; i++) +		sum += p->data[i]; + +	sum += p->seq_num; + +	return sum; +} + +int randN(int n) +{ +	long tmp; + +	tmp = rand()  % n; + +	return tmp; +} + +static void *read_thread(void *threadid) +{ +	int cnt, prev_seq_num; +	struct usrp_transfer_frame *rx_data; +	struct pkt *p; + +	printf("Greetings from the reading thread!\n"); + +	// IMPORTANT: must assume max length packet from fpga +	rx_data = malloc(sizeof(struct usrp_transfer_frame) + sizeof(struct pkt) + (1014 * 2)); +	rx_data = malloc(2048); +	p = (struct pkt *) ((void *)rx_data + offsetof(struct usrp_transfer_frame, buf)); +	//p = &(rx_data->buf[0]); +	printf("Address of rx_data = %p, p = %p\n", rx_data, p); +	printf("offsetof = %d\n", offsetof(struct usrp_transfer_frame, buf)); +	printf("sizeof rx data = %d\n", sizeof(struct usrp_transfer_frame) + sizeof(struct pkt)); + +	prev_seq_num = 0; + +	while (1) { + +		cnt = read(fp, rx_data, 2048); +//		printf("Packet received, status = %X, len = %d\n", rx_data->status, rx_data->len); +//		printf("p->seq_num = %d\n", p->seq_num); + +		if (p->seq_num != prev_seq_num + 1) +			printf("Sequence number fail, current = %d, previous = %d\n", +				p->seq_num, prev_seq_num); +		prev_seq_num = p->seq_num; + +		if (calc_checksum(p) != p->checksum) +			printf("Checksum fail packet = %d, expected = %d\n", +				calc_checksum(p), p->checksum); +		printf("."); +		fflush(stdout); +//		printf("\n"); +	} + +} + +static void *write_thread(void *threadid) +{ +	int seq_number, i, cnt, pkt_cnt; +	struct usrp_transfer_frame *tx_data; +	struct pkt *p; + +	printf("Greetings from the write thread!\n"); + +	// Allocate max length buffer for frame +	tx_data = malloc(2048); +	p = (struct pkt *) ((void *)tx_data + offsetof(struct usrp_transfer_frame, buf)); +	printf("Address of tx_data = %p, p = %p\n", tx_data, p); + +	printf("sizeof rp_transfer_frame = %d, sizeof pkt = %d\n", sizeof(struct usrp_transfer_frame), sizeof(struct pkt)); + +	for (i=0; i < 1014; i++) +//		p->data[i] = random() >> 16; +		p->data[i] = i; + +	tx_data->status = 0xdeadbeef; +	tx_data->len = 8 + packet_data_length * 2; + +	printf("tx_data->len = %d\n", tx_data->len); + +	seq_number = 1; + +	while (1) { +		pkt_cnt = randN(16); +		for (i = 0; i < pkt_cnt; i++) { +			p->seq_num = seq_number++; +			p->len = randN(1013) + 1; +			p->checksum = calc_checksum(p); +			tx_data->len = 12 + p->len * 2; +			cnt = write(fp, tx_data, tx_data->len + 8); +		} +		sleep(random() >> 31); +	} +} + + +int main(int argc, char *argv[]) +{ +	pthread_t tx, rx; +	long int t; + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	if (pthread_create(&rx, NULL, read_thread, (void *) t)) { +		printf("Failed to create rx thread\n"); +		exit(-1); +	} + +	sleep(1); + +	if (pthread_create(&tx, NULL, write_thread, (void *) t)) { +		printf("Failed to create tx thread\n"); +		exit(-1); +	} + +	sleep(1000000000); + +	printf("Done sleeping\n"); +} diff --git a/host/apps/omap_debug/usrp-e-read.c b/host/apps/omap_debug/usrp-e-read.c new file mode 100644 index 000000000..c28f018d5 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-read.c @@ -0,0 +1,18 @@ +#include <stdio.h> +#include <sys/types.h> +#include <fcntl.h> + +int main(int rgc, char *argv[]) +{ +	int fp, cnt; +	short buf[1024]; + +	fp = open("/dev/usrp1_e0", O_RDONLY); +	printf("fp = %d\n", fp); + +	do { +	cnt = read(fp, buf, 2048); +//	printf("Bytes read - %d\n", cnt); +	} while(1); +	printf("Data - %hX\n", buf[0]); +} diff --git a/host/apps/omap_debug/usrp-e-spi.c b/host/apps/omap_debug/usrp-e-spi.c new file mode 100644 index 000000000..c353c409b --- /dev/null +++ b/host/apps/omap_debug/usrp-e-spi.c @@ -0,0 +1,54 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <fcntl.h> +#include <sys/ioctl.h> + +#include "usrp_e.h" + +// Usage: usrp_e_spi w|rb slave data + +int main(int argc, char *argv[]) +{ +	int fp, slave, length, ret; +	unsigned int data; +	struct usrp_e_spi spi_dat; + +	if (argc < 5) { +		printf("Usage: usrp_e_spi w|rb slave transfer_length data\n"); +		exit(-1); +	} + +	slave = atoi(argv[2]); +	length = atoi(argv[3]); +	data = atoll(argv[4]); + +	printf("Data = %X\n", data); + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); +	if (fp < 0) { +		perror("Open failed"); +		return -1; +	} + +//	sleep(1); + + +	spi_dat.slave = slave; +	spi_dat.data = data; +	spi_dat.length = length; +	spi_dat.flags = UE_SPI_PUSH_FALL | UE_SPI_LATCH_RISE; + +	if (*argv[1] == 'r') { +		spi_dat.readback = 1; +		ret = ioctl(fp, USRP_E_SPI, &spi_dat); +		printf("Ioctl returns: %d, Data returned = %d\n", ret, spi_dat.data); +	} else { +		spi_dat.readback = 0; +		ioctl(fp, USRP_E_SPI, &spi_dat); +	} + +	return 0; +} diff --git a/host/apps/omap_debug/usrp-e-timed.c b/host/apps/omap_debug/usrp-e-timed.c new file mode 100644 index 000000000..3cb33ce2d --- /dev/null +++ b/host/apps/omap_debug/usrp-e-timed.c @@ -0,0 +1,233 @@ +#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; + +struct pkt { +	int checksum; +	int seq_num; +	short data[]; +}; + +static int fp; + +static int calc_checksum(struct pkt *p) +{ +	int i, sum; + +	i = 0; +	sum = 0; + +	for (i=0; i < packet_data_length; i++) +		sum += p->data[i]; + +	sum += p->seq_num; + +	return sum; +} + +static void *read_thread(void *threadid) +{ +	int cnt, prev_seq_num; +	struct usrp_transfer_frame *rx_data; +	struct pkt *p; +	int rx_pkt_cnt; +	int i; +	unsigned long bytes_transfered, elapsed_seconds; +	struct timeval start_time, finish_time; + +	printf("Greetings from the reading thread!\n"); + +	bytes_transfered = 0; +	gettimeofday(&start_time, NULL); + +	// IMPORTANT: must assume max length packet from fpga +	rx_data = malloc(sizeof(struct usrp_transfer_frame) + sizeof(struct pkt) + (1016 * 2)); +	p = (struct pkt *) ((void *)rx_data + offsetof(struct usrp_transfer_frame, buf)); +	//p = &(rx_data->buf[0]); +	printf("Address of rx_data = %p, p = %p\n", rx_data, p); +	printf("offsetof = %d\n", offsetof(struct usrp_transfer_frame, buf)); +	printf("sizeof rx data = %d\n", sizeof(struct usrp_transfer_frame) + sizeof(struct pkt)); + +	prev_seq_num = 0; + +	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 0 +		if (rx_pkt_cnt  == 512) { +			printf("."); +			fflush(stdout); +			rx_pkt_cnt = 0; +		} +#endif + +		if (rx_data->status & RB_OVERRUN) +			printf("O"); + +		bytes_transfered += rx_data->len; + +		if (bytes_transfered > (100 * 1000000)) { +			gettimeofday(&finish_time, NULL); +			elapsed_seconds = finish_time.tv_sec - start_time.tv_sec; + +			printf("RX data transfer rate = %f K Samples/second\n", +				(float) bytes_transfered / (float) elapsed_seconds / 4000); + + +			start_time = finish_time; +			bytes_transfered = 0; +                } +	} + +} + +static void *write_thread(void *threadid) +{ +	int seq_number, i, cnt, tx_pkt_cnt; +	struct usrp_transfer_frame *tx_data; +	struct pkt *p; +	unsigned long bytes_transfered, elapsed_seconds; +	struct timeval start_time, finish_time; + +	printf("Greetings from the write thread!\n"); + +	bytes_transfered = 0; +	gettimeofday(&start_time, NULL); + +	tx_data = malloc(sizeof(struct usrp_transfer_frame) + sizeof(struct pkt) + (packet_data_length * 2)); +	p = (struct pkt *) ((void *)tx_data + offsetof(struct usrp_transfer_frame, buf)); +	printf("Address of tx_data = %p, p = %p\n", tx_data, p); + +	printf("sizeof rp_transfer_frame = %d, sizeof pkt = %d\n", sizeof(struct usrp_transfer_frame), sizeof(struct pkt)); + +	for (i=0; i < packet_data_length; i++) +//		p->data[i] = random() >> 16; +		p->data[i] = i; + +	tx_data->status = 0; +	tx_data->len = 8 + packet_data_length * 2; + +	printf("tx_data->len = %d\n", tx_data->len); + +	seq_number = 1; +	tx_pkt_cnt = 0; + +	while (1) { + +		tx_pkt_cnt++; + +#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("tx status = %X, len = %d\n", tx_data->status, tx_data->len); +		p->seq_num = seq_number++; +		p->checksum = calc_checksum(p); +		cnt = write(fp, tx_data, 2048); +		if (cnt < 0) +			printf("Error returned from write: %d\n", cnt); + +		bytes_transfered += tx_data->len; + +		if (bytes_transfered > (100 * 1000000)) { +			gettimeofday(&finish_time, NULL); +			elapsed_seconds = finish_time.tv_sec - start_time.tv_sec; + +			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); +	} +} + + +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 r|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"); +} diff --git a/host/apps/omap_debug/usrp-e-uart-rx.c b/host/apps/omap_debug/usrp-e-uart-rx.c new file mode 100644 index 000000000..24b417980 --- /dev/null +++ b/host/apps/omap_debug/usrp-e-uart-rx.c @@ -0,0 +1,53 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <fcntl.h> +#include <string.h> +#include <sys/ioctl.h> + +#include "usrp_e.h" +#include "usrp_e_regs.hpp" + +// Usage: usrp_e_uart <string> + + +int main(int argc, char *argv[]) +{ +	int fp, ret; +	struct usrp_e_ctl16 d; +	__u16 clkdiv; + +	if (argc == 0) { +		printf("Usage: usrp-e-uart-rx <opt clkdiv>\n"); +		printf("clkdiv = 278 is 230.4k \n"); +		printf("clkdiv = 556 is 115.2k \n"); +		exit(-1); +	} + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	if (argc == 2) { +		clkdiv = atoi(argv[1]); +		d.offset = UE_REG_UART_CLKDIV; +		d.count = 1; +		d.buf[0] = clkdiv; +		ret = ioctl(fp, USRP_E_WRITE_CTL16, &d); +	} + +	while(1) { +		d.offset = UE_REG_UART_RXLEVEL; +		d.count = 1; +		ret = ioctl(fp, USRP_E_READ_CTL16, &d); + +		if (d.buf[0] > 0) { +			d.offset = UE_REG_UART_RXCHAR; +			d.count = 1; +			ret = ioctl(fp, USRP_E_READ_CTL16, &d); +			printf("%c", d.buf[0]); +			fflush(stdout); +		} +	} + +	return 0; +} diff --git a/host/apps/omap_debug/usrp-e-uart.c b/host/apps/omap_debug/usrp-e-uart.c new file mode 100644 index 000000000..2956c407f --- /dev/null +++ b/host/apps/omap_debug/usrp-e-uart.c @@ -0,0 +1,48 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <fcntl.h> +#include <string.h> +#include <sys/ioctl.h> + +#include "usrp_e.h" +#include "usrp_e_regs.hpp" + +// Usage: usrp_e_uart <string> + + +int main(int argc, char *argv[]) +{ +	int fp, i, ret; +	struct usrp_e_ctl16 d; +	char *str = argv[1]; +	__u16 clkdiv; + +	if (argc < 2) { +		printf("Usage: usrp_e_uart <string> <opt clkdiv>\n"); +		printf("clkdiv = 278 is 230.4k \n"); +		printf("clkdiv = 556 is 115.2k \n"); +		exit(-1); +	} + +	fp = open("/dev/usrp_e0", O_RDWR); +	printf("fp = %d\n", fp); + +	if (argc == 3) { +		clkdiv = atoi(argv[2]); +		d.offset = UE_REG_UART_CLKDIV; +		d.count = 1; +		d.buf[0] = clkdiv; +		ret = ioctl(fp, USRP_E_WRITE_CTL16, &d); +	} + +	for (i=0; i<strlen(str); i++) { +		d.offset = UE_REG_UART_TXCHAR; +		d.count = 1; +		d.buf[0] = str[i]; +		ret = ioctl(fp, USRP_E_WRITE_CTL16, &d); +		printf("Wrote %X, to %X, ret = %d\n", d.buf[0], d.offset, ret); +	} + +	return 0; +} diff --git a/host/apps/omap_debug/usrp-e-write.c b/host/apps/omap_debug/usrp-e-write.c new file mode 100644 index 000000000..903c0071f --- /dev/null +++ b/host/apps/omap_debug/usrp-e-write.c @@ -0,0 +1,21 @@ +#include <stdio.h> +#include <sys/types.h> +#include <fcntl.h> + +int main(int rgc, char *argv[]) +{ +	int fp, i, cnt; +	short buf[1024]; + +	fp = open("/dev/usrp1_e0", O_WRONLY); +	printf("fp = %d\n", fp); + +	for (i=0; i<1024; i++) { +		buf[i] = i; +	} + +//	do { +		cnt = write(fp, buf, 2048); +		printf("Bytes written - %d\n", cnt); +//	} while (1); +} diff --git a/host/apps/omap_debug/usrp_e.h b/host/apps/omap_debug/usrp_e.h new file mode 100644 index 000000000..f96706c4a --- /dev/null +++ b/host/apps/omap_debug/usrp_e.h @@ -0,0 +1,90 @@ + +/* + *  Copyright (C) 2010 Ettus Research, LLC + * + *  Written by Philip Balister <philip@opensdr.com> + * + *  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 2 of the License, or + *  (at your option) any later version. + */ + +#ifndef __USRP_E_H +#define __USRP_E_H + +#include <linux/types.h> +#include <linux/ioctl.h> + +struct usrp_e_ctl16 { +	__u32 offset; +	__u32 count; +	__u16 buf[20]; +}; + +struct usrp_e_ctl32 { +	__u32 offset; +	__u32 count; +	__u32 buf[10]; +}; + +/* SPI interface */ + +#define UE_SPI_TXONLY	0 +#define UE_SPI_TXRX	1 + +/* Defines for spi ctrl register */ +#define UE_SPI_CTRL_TXNEG	(BIT(10)) +#define UE_SPI_CTRL_RXNEG	(BIT(9)) + +#define UE_SPI_PUSH_RISE	0 +#define UE_SPI_PUSH_FALL	UE_SPI_CTRL_TXNEG +#define UE_SPI_LATCH_RISE	0 +#define UE_SPI_LATCH_FALL	UE_SPI_CTRL_RXNEG +#define USRP_E_GET_COMPAT_NUMBER _IO(USRP_E_IOC_MAGIC, 0x28) + +#define USRP_E_COMPAT_NUMBER 1 + +struct usrp_e_spi { +	__u8 readback; +	__u32 slave; +	__u32 data; +	__u32 length; +	__u32 flags; +}; + +struct usrp_e_i2c { +	__u8 addr; +	__u32 len; +	__u8 data[]; +}; + +#define USRP_E_IOC_MAGIC	'u' +#define USRP_E_WRITE_CTL16	_IOW(USRP_E_IOC_MAGIC, 0x20, struct usrp_e_ctl16) +#define USRP_E_READ_CTL16	_IOWR(USRP_E_IOC_MAGIC, 0x21, struct usrp_e_ctl16) +#define USRP_E_WRITE_CTL32	_IOW(USRP_E_IOC_MAGIC, 0x22, struct usrp_e_ctl32) +#define USRP_E_READ_CTL32	_IOWR(USRP_E_IOC_MAGIC, 0x23, struct usrp_e_ctl32) +#define USRP_E_SPI		_IOWR(USRP_E_IOC_MAGIC, 0x24, struct usrp_e_spi) +#define USRP_E_I2C_READ		_IOWR(USRP_E_IOC_MAGIC, 0x25, struct usrp_e_i2c) +#define USRP_E_I2C_WRITE	_IOW(USRP_E_IOC_MAGIC, 0x26, struct usrp_e_i2c) +#define USRP_E_GET_RB_INFO      _IOR(USRP_E_IOC_MAGIC, 0x27, struct usrp_e_ring_buffer_size_t) + +/* Flag defines */ +#define RB_USER (1<<0) +#define RB_KERNEL (1<<1) +#define RB_OVERRUN (1<<2) +#define RB_DMA_ACTIVE (1<<3) + +struct ring_buffer_info { +	int flags; +	int len; +}; + +struct usrp_e_ring_buffer_size_t { +	int num_pages_rx_flags; +	int num_rx_frames; +	int num_pages_tx_flags; +	int num_tx_frames; +}; + +#endif diff --git a/host/apps/omap_debug/write-eeprom.sh b/host/apps/omap_debug/write-eeprom.sh new file mode 100755 index 000000000..301b06f07 --- /dev/null +++ b/host/apps/omap_debug/write-eeprom.sh @@ -0,0 +1,92 @@ +#!/bin/bash + +if [ $# -ne 3 ] && [ $# -ne 5 ]; +then +	echo "Usage:" +	echo "" +	echo "writeprom.sh deviceid rev fab_rev [envvar envsetting]" +	echo	 +	echo " deviceid   - expansion board device number from table:" +	echo  +	echo "   Summit     0x01" +	echo "   Tobi       0x02" +	echo "   Tobi Duo   0x03" +	echo "   Palo35     0x04" +	echo "   Palo43     0x05" +	echo "   Chestnut43 0x06" +	echo "   Pinto      0x07" +	echo +	echo " rev          - board revision (e.g. 0x00)" +	echo " fab_rev      - revision marking from pcb (e.g. R2411)" +	echo " envvar       - optional u-boot env variable name" +	echo "                (e.g. dvimode)" +	echo " envsetting   - optional u-boot env variable setting" +	echo "                (e.g. 1024x768MR-16@60)" +	exit 1 +fi + +fabrevision=$3 +if [ ${#fabrevision} -ge 8 ]; then +	echo "Error: fab revision string must less than 8 characters" +	exit 1 +fi + +envvar=$4 +if [ ${#envar} -ge 16 ]; then +	echo "Error: environment variable name string must less than 16 characters" +	exit 1 +fi + +envsetting=$5 +if [ ${#ensetting} -ge 64 ]; then +	echo "Error: environment setting string must less than 64 characters" +	exit 1 +fi + +bus=3 +device=0x51 +vendorid=0x03 + +i2cset -y $bus $device 0x00 0x00 +i2cset -y $bus $device 0x01 $vendorid +i2cset -y $bus $device 0x02 0x00 +i2cset -y $bus $device 0x03 $1 +i2cset -y $bus $device 0x04 $2 +i2cset -y $bus $device 0x05 00 + +let i=6 +hexdumpargs="'${#fabrevision}/1 \"0x%02x \"'" +command="echo -n \"$fabrevision\" | hexdump -e $hexdumpargs" +hex=$(eval $command) +for character in $hex; do +	i2cset -y $bus $device $i $character +	let i=$i+1 +done +i2cset -y $bus $device $i 0x00 + +if [ $# -eq 5 ] +then +	i2cset -y $bus $device 0x05 0x01 + +	let i=14 +	hexdumpargs="'${#envvar}/1 \"0x%02x \"'" +	command="echo -n \"$envvar\" | hexdump -e $hexdumpargs" +	hex=$(eval $command) +	for character in $hex; do +		i2cset -y $bus $device $i $character +		let i=$i+1 +	done + 	i2cset -y $bus $device $i 0x00 + +	let i=30 +	hexdumpargs="'${#envsetting}/1 \"0x%02x \"'" +	command="echo -n \"$envsetting\" | hexdump -e $hexdumpargs" +	hex=$(eval $command) +	for character in $hex; do +		i2cset -y $bus $device $i $character +		let i=$i+1 +	done	  +	i2cset -y $bus $device $i 0x00 +fi + + diff --git a/host/apps/omap_debug/write_board_id.sh b/host/apps/omap_debug/write_board_id.sh new file mode 100755 index 000000000..067269c64 --- /dev/null +++ b/host/apps/omap_debug/write_board_id.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +i2cset -y 3 0x51 0x00 0x00 +i2cset -y 3 0x51 0x01 0x03 +i2cset -y 3 0x51 0x02 0x00 +i2cset -y 3 0x51 0x03 0x01 +i2cset -y 3 0x51 0x04 0x00 +i2cset -y 3 0x51 0x05 0x00 + + | 
