summaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/fx2
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2011-07-01 14:03:04 -0700
committerJosh Blum <josh@joshknows.com>2011-07-01 14:03:04 -0700
commit38eefb2eeaa9c5d83da8abcf5b7efa8eba5fe413 (patch)
treef8e282851a2e8cca568771601d3a6edacffd2784 /host/lib/usrp/fx2
parent16afe14e35ee7c79d24cbd933060af1c7cbafb13 (diff)
downloaduhd-38eefb2eeaa9c5d83da8abcf5b7efa8eba5fe413.tar.gz
uhd-38eefb2eeaa9c5d83da8abcf5b7efa8eba5fe413.tar.bz2
uhd-38eefb2eeaa9c5d83da8abcf5b7efa8eba5fe413.zip
usrp: moved fx2 stuff into common folder
Diffstat (limited to 'host/lib/usrp/fx2')
-rw-r--r--host/lib/usrp/fx2/CMakeLists.txt28
-rw-r--r--host/lib/usrp/fx2/fx2_ctrl.cpp462
-rw-r--r--host/lib/usrp/fx2/fx2_ctrl.hpp123
3 files changed, 0 insertions, 613 deletions
diff --git a/host/lib/usrp/fx2/CMakeLists.txt b/host/lib/usrp/fx2/CMakeLists.txt
deleted file mode 100644
index 1bb5ad683..000000000
--- a/host/lib/usrp/fx2/CMakeLists.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# 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/>.
-#
-
-########################################################################
-# This file included, use CMake directory variables
-########################################################################
-IF(ENABLE_USB)
- INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/../firmware/fx2/common)
-
- LIBUHD_APPEND_SOURCES(
- ${CMAKE_CURRENT_SOURCE_DIR}/fx2_ctrl.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/fx2_ctrl.hpp
- )
-ENDIF(ENABLE_USB)
diff --git a/host/lib/usrp/fx2/fx2_ctrl.cpp b/host/lib/usrp/fx2/fx2_ctrl.cpp
deleted file mode 100644
index 66a03f131..000000000
--- a/host/lib/usrp/fx2/fx2_ctrl.cpp
+++ /dev/null
@@ -1,462 +0,0 @@
-//
-// Copyright 2010-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 "fx2_ctrl.hpp"
-#include "usrp_commands.h"
-#include <uhd/utils/msg.hpp>
-#include <uhd/exception.hpp>
-#include <uhd/transport/usb_control.hpp>
-#include <boost/functional/hash.hpp>
-#include <boost/thread/thread.hpp>
-#include <fstream>
-#include <sstream>
-#include <string>
-#include <vector>
-#include <cstring>
-
-using namespace uhd;
-using namespace uhd::usrp;
-
-#define FX2_FIRMWARE_LOAD 0xa0
-
-static const bool load_img_msg = true;
-
-/***********************************************************************
- * Helper Functions
- **********************************************************************/
-/*!
- * Create a file hash
- * The hash will be used to identify the loaded firmware and fpga image
- * \param filename file used to generate hash value
- * \return hash value in a size_t type
- */
-static size_t generate_hash(const char *filename)
-{
- std::ifstream file(filename);
- if (not file){
- throw uhd::io_error(std::string("cannot open input file ") + filename);
- }
-
- size_t hash = 0;
-
- char ch;
- while (file.get(ch)) {
- boost::hash_combine(hash, ch);
- }
-
- if (not file.eof()){
- throw uhd::io_error(std::string("file error ") + filename);
- }
-
- file.close();
- return hash;
-}
-
-
-/*!
- * Verify checksum of a Intel HEX record
- * \param record a line from an Intel HEX file
- * \return true if record is valid, false otherwise
- */
-static bool checksum(std::string *record)
-{
-
- size_t len = record->length();
- unsigned int i;
- unsigned char sum = 0;
- unsigned int val;
-
- for (i = 1; i < len; i += 2) {
- std::istringstream(record->substr(i, 2)) >> std::hex >> val;
- sum += val;
- }
-
- if (sum == 0)
- return true;
- else
- return false;
-}
-
-
-/*!
- * Parse Intel HEX record
- *
- * \param record a line from an Intel HEX file
- * \param len output length of record
- * \param addr output address
- * \param type output type
- * \param data output data
- * \return true if record is sucessfully read, false on error
- */
-bool parse_record(std::string *record, unsigned int &len,
- unsigned int &addr, unsigned int &type,
- unsigned char* data)
-{
- unsigned int i;
- std::string _data;
- unsigned int val;
-
- if (record->substr(0, 1) != ":")
- return false;
-
- std::istringstream(record->substr(1, 2)) >> std::hex >> len;
- std::istringstream(record->substr(3, 4)) >> std::hex >> addr;
- std::istringstream(record->substr(7, 2)) >> std::hex >> type;
-
- for (i = 0; i < len; i++) {
- std::istringstream(record->substr(9 + 2 * i, 2)) >> std::hex >> val;
- data[i] = (unsigned char) val;
- }
-
- return true;
-}
-
-
-/*!
- * USRP control implementation for device discovery and configuration
- */
-class fx2_ctrl_impl : public fx2_ctrl {
-public:
- fx2_ctrl_impl(uhd::transport::usb_control::sptr ctrl_transport)
- {
- _ctrl_transport = ctrl_transport;
- }
-
- void usrp_load_firmware(std::string filestring, bool force)
- {
- const char *filename = filestring.c_str();
-
- size_t hash = generate_hash(filename);
-
- size_t loaded_hash; usrp_get_firmware_hash(loaded_hash);
-
- if (not force and (hash == loaded_hash)) return;
-
- //FIXME: verify types
- unsigned int len;
- unsigned int addr;
- unsigned int type;
- unsigned char data[512];
-
- std::ifstream file;
- file.open(filename, std::ifstream::in);
-
- if (!file.good()) {
- throw uhd::io_error("usrp_load_firmware: cannot open firmware input file");
- }
-
- unsigned char reset_y = 1;
- unsigned char reset_n = 0;
-
- //hit the reset line
- if (load_img_msg) UHD_MSG(status) << "Loading firmware image: " << filestring << "..." << std::flush;
- usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0, &reset_y, 1);
-
- while (!file.eof()) {
- std::string record;
- file >> record;
-
- //check for valid record
- if (not checksum(&record) or not parse_record(&record, len, addr, type, data)) {
- throw uhd::io_error("usrp_load_firmware: bad record checksum");
- }
-
- //type 0x00 is data
- if (type == 0x00) {
- int ret = usrp_control_write(FX2_FIRMWARE_LOAD, addr, 0, data, len);
- if (ret < 0) throw uhd::io_error("usrp_load_firmware: usrp_control_write failed");
- }
- //type 0x01 is end
- else if (type == 0x01) {
- usrp_set_firmware_hash(hash); //set hash before reset
- usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0, &reset_n, 1);
- file.close();
-
- //wait for things to settle
- boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
- if (load_img_msg) UHD_MSG(status) << " done" << std::endl;
- return;
- }
- //type anything else is unhandled
- else {
- throw uhd::io_error("usrp_load_firmware: unsupported record");
- }
- }
-
- //file did not end
- throw uhd::io_error("usrp_load_firmware: bad record");
- }
-
- void usrp_init(void){
- //disable
- usrp_rx_enable(false);
- usrp_tx_enable(false);
-
- //toggle resets
- usrp_rx_reset(true);
- usrp_tx_reset(true);
- usrp_rx_reset(false);
- usrp_tx_reset(false);
- }
-
- void usrp_load_fpga(std::string filestring)
- {
- const char *filename = filestring.c_str();
-
- size_t hash = generate_hash(filename);
-
- size_t loaded_hash; usrp_get_fpga_hash(loaded_hash);
-
- if (hash == loaded_hash) return;
- const int ep0_size = 64;
- unsigned char buf[ep0_size];
-
- if (load_img_msg) UHD_MSG(status) << "Loading FPGA image: " << filestring << "..." << std::flush;
- std::ifstream file;
- file.open(filename, std::ios::in | std::ios::binary);
- if (not file.good()) {
- throw uhd::io_error("usrp_load_fpga: cannot open fpga input file");
- }
-
- usrp_fpga_reset(true); //holding the fpga in reset while loading
-
- if (usrp_control_write_cmd(VRQ_FPGA_LOAD, 0, FL_BEGIN) < 0) {
- throw uhd::io_error("usrp_load_fpga: fpga load error");
- }
-
- while (not file.eof()) {
- file.read((char *)buf, sizeof(buf));
- size_t n = file.gcount();
- if(n == 0) continue;
- int ret = usrp_control_write(VRQ_FPGA_LOAD, 0, FL_XFER, buf, n);
- if (ret < 0 or size_t(ret) != n) {
- throw uhd::io_error("usrp_load_fpga: fpga load error");
- }
- }
-
- if (usrp_control_write_cmd(VRQ_FPGA_LOAD, 0, FL_END) < 0) {
- throw uhd::io_error("usrp_load_fpga: fpga load error");
- }
-
- usrp_set_fpga_hash(hash);
-
- usrp_fpga_reset(false); //done loading, take fpga out of reset
-
- file.close();
- if (load_img_msg) UHD_MSG(status) << " done" << std::endl;
- }
-
- void usrp_load_eeprom(std::string filestring)
- {
- if (load_img_msg) UHD_MSG(status) << "Loading EEPROM image: " << filestring << "..." << std::flush;
- const char *filename = filestring.c_str();
- const boost::uint16_t i2c_addr = 0x50;
-
- //FIXME: verify types
- int len;
- unsigned int addr;
- unsigned char data[256];
- unsigned char sendbuf[17];
-
- std::ifstream file;
- file.open(filename, std::ifstream::in);
-
- if (not file.good()) {
- throw uhd::io_error("usrp_load_eeprom: cannot open EEPROM input file");
- }
-
- file.read((char *)data, 256);
- len = file.gcount();
-
- if(len == 256) {
- throw uhd::io_error("usrp_load_eeprom: image size too large");
- }
-
- const int pagesize = 16;
- addr = 0;
- while(len > 0) {
- sendbuf[0] = addr;
- memcpy(sendbuf+1, &data[addr], len > pagesize ? pagesize : len);
- int ret = usrp_i2c_write(i2c_addr, sendbuf, (len > pagesize ? pagesize : len)+1);
- if (ret < 0) {
- throw uhd::io_error("usrp_load_eeprom: usrp_i2c_write failed");
- }
- addr += pagesize;
- len -= pagesize;
- boost::this_thread::sleep(boost::posix_time::milliseconds(100));
- }
- file.close();
- if (load_img_msg) UHD_MSG(status) << " done" << std::endl;
- }
-
-
- void usrp_set_led(int led_num, bool on)
- {
- UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_SET_LED, on, led_num) >= 0);
- }
-
-
- void usrp_get_firmware_hash(size_t &hash)
- {
- UHD_ASSERT_THROW(usrp_control_read(0xa0, USRP_HASH_SLOT_0_ADDR, 0,
- (unsigned char*) &hash, sizeof(size_t)) >= 0);
- }
-
-
- void usrp_set_firmware_hash(size_t hash)
- {
- UHD_ASSERT_THROW(usrp_control_write(0xa0, USRP_HASH_SLOT_0_ADDR, 0,
- (unsigned char*) &hash, sizeof(size_t)) >= 0);
-
- }
-
-
- void usrp_get_fpga_hash(size_t &hash)
- {
- UHD_ASSERT_THROW(usrp_control_read(0xa0, USRP_HASH_SLOT_1_ADDR, 0,
- (unsigned char*) &hash, sizeof(size_t)) >= 0);
- }
-
-
- void usrp_set_fpga_hash(size_t hash)
- {
- UHD_ASSERT_THROW(usrp_control_write(0xa0, USRP_HASH_SLOT_1_ADDR, 0,
- (unsigned char*) &hash, sizeof(size_t)) >= 0);
- }
-
- void usrp_tx_enable(bool on)
- {
- UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_FPGA_SET_TX_ENABLE, on, 0) >= 0);
- }
-
-
- void usrp_rx_enable(bool on)
- {
- UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_FPGA_SET_RX_ENABLE, on, 0) >= 0);
- }
-
-
- void usrp_tx_reset(bool on)
- {
- UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_FPGA_SET_TX_RESET, on, 0) >= 0);
- }
-
-
- void usrp_rx_reset(bool on)
- {
- UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_FPGA_SET_RX_RESET, on, 0) >= 0);
- }
-
- void usrp_fpga_reset(bool on)
- {
- UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_FPGA_SET_RESET, on, 0) >= 0);
- }
-
- int usrp_control_write(boost::uint8_t request,
- boost::uint16_t value,
- boost::uint16_t index,
- unsigned char *buff,
- boost::uint16_t length)
- {
- return _ctrl_transport->submit(VRT_VENDOR_OUT, // bmReqeustType
- request, // bRequest
- value, // wValue
- index, // wIndex
- buff, // data
- length); // wLength
- }
-
-
- int usrp_control_read(boost::uint8_t request,
- boost::uint16_t value,
- boost::uint16_t index,
- unsigned char *buff,
- boost::uint16_t length)
- {
- return _ctrl_transport->submit(VRT_VENDOR_IN, // bmReqeustType
- request, // bRequest
- value, // wValue
- index, // wIndex
- buff, // data
- length); // wLength
- }
-
-
- int usrp_control_write_cmd(boost::uint8_t request, boost::uint16_t value, boost::uint16_t index)
- {
- return usrp_control_write(request, value, index, 0, 0);
- }
-
- int usrp_i2c_write(boost::uint16_t i2c_addr, unsigned char *buf, boost::uint16_t len)
- {
- return usrp_control_write(VRQ_I2C_WRITE, i2c_addr, 0, buf, len);
- }
-
- int usrp_i2c_read(boost::uint16_t i2c_addr, unsigned char *buf, boost::uint16_t len)
- {
- return usrp_control_read(VRQ_I2C_READ, i2c_addr, 0, buf, len);
- }
-
- static const bool iface_debug = false;
- static const size_t max_i2c_data_bytes = 64;
-
- void write_i2c(boost::uint8_t addr, const byte_vector_t &bytes)
- {
- UHD_ASSERT_THROW(bytes.size() < max_i2c_data_bytes);
-
- unsigned char buff[max_i2c_data_bytes];
- std::copy(bytes.begin(), bytes.end(), buff);
-
- int ret = this->usrp_i2c_write(addr & 0xff,
- buff,
- bytes.size());
-
- if (iface_debug && (ret < 0))
- uhd::runtime_error("USRP: failed i2c write");
- }
-
- byte_vector_t read_i2c(boost::uint8_t addr, size_t num_bytes)
- {
- UHD_ASSERT_THROW(num_bytes < max_i2c_data_bytes);
-
- unsigned char buff[max_i2c_data_bytes];
- int ret = this->usrp_i2c_read(addr & 0xff,
- buff,
- num_bytes);
-
- if (iface_debug && ((ret < 0) || (unsigned)ret < (num_bytes)))
- uhd::runtime_error("USRP: failed i2c read");
-
- byte_vector_t out_bytes;
- for (size_t i = 0; i < num_bytes; i++)
- out_bytes.push_back(buff[i]);
-
- return out_bytes;
- }
-
-
-private:
- uhd::transport::usb_control::sptr _ctrl_transport;
-};
-
-/***********************************************************************
- * Public make function for fx2_ctrl interface
- **********************************************************************/
-fx2_ctrl::sptr fx2_ctrl::make(uhd::transport::usb_control::sptr ctrl_transport){
- return sptr(new fx2_ctrl_impl(ctrl_transport));
-}
-
diff --git a/host/lib/usrp/fx2/fx2_ctrl.hpp b/host/lib/usrp/fx2/fx2_ctrl.hpp
deleted file mode 100644
index eeff6287d..000000000
--- a/host/lib/usrp/fx2/fx2_ctrl.hpp
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-// Copyright 2010-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/>.
-//
-
-#ifndef INCLUDED_USRP_CTRL_HPP
-#define INCLUDED_USRP_CTRL_HPP
-
-#include <uhd/transport/usb_control.hpp>
-#include <uhd/types/serial.hpp> //i2c iface
-#include <boost/shared_ptr.hpp>
-#include <boost/utility.hpp>
-
-namespace uhd{ namespace usrp{
-
-class fx2_ctrl : boost::noncopyable, public uhd::i2c_iface{
-public:
- typedef boost::shared_ptr<fx2_ctrl> sptr;
-
- /*!
- * Make a usrp control object from a control transport
- * \param ctrl_transport a USB control transport
- * \return a new usrp control object
- */
- static sptr make(uhd::transport::usb_control::sptr ctrl_transport);
-
- //! Call init after the fpga is loaded
- virtual void usrp_init(void) = 0;
-
- /*!
- * Load firmware in Intel HEX Format onto device
- * \param filename name of firmware file
- * \param force reload firmware if already loaded
- */
- virtual void usrp_load_firmware(std::string filename,
- bool force = false) = 0;
-
- /*!
- * Load fpga file onto usrp
- * \param filename name of fpga image
- */
- virtual void usrp_load_fpga(std::string filename) = 0;
-
- /*!
- * Load USB descriptor file in Intel HEX format into EEPROM
- * \param filename name of EEPROM image
- */
- virtual void usrp_load_eeprom(std::string filestring) = 0;
-
- /*!
- * Submit an IN transfer
- * \param request device specific request
- * \param value device specific field
- * \param index device specific field
- * \param buff buffer to place data
- * \return number of bytes read or error
- */
- virtual int usrp_control_read(boost::uint8_t request,
- boost::uint16_t value,
- boost::uint16_t index,
- unsigned char *buff,
- boost::uint16_t length) = 0;
-
- /*!
- * Submit an OUT transfer
- * \param request device specific request
- * \param value device specific field
- * \param index device specific field
- * \param buff buffer of data to be sent
- * \return number of bytes written or error
- */
- virtual int usrp_control_write(boost::uint8_t request,
- boost::uint16_t value,
- boost::uint16_t index,
- unsigned char *buff,
- boost::uint16_t length) = 0;
-
- /*!
- * Perform an I2C write
- * \param i2c_addr I2C device address
- * \param buf data to be written
- * \param len length of data in bytes
- * \return number of bytes written or error
- */
-
- virtual int usrp_i2c_write(boost::uint16_t i2c_addr,
- unsigned char *buf,
- boost::uint16_t len) = 0;
-
- /*!
- * Perform an I2C read
- * \param i2c_addr I2C device address
- * \param buf data to be read
- * \param len length of data in bytes
- * \return number of bytes read or error
- */
-
- virtual int usrp_i2c_read(boost::uint16_t i2c_addr,
- unsigned char *buf,
- boost::uint16_t len) = 0;
-
- //! enable/disable the rx path
- virtual void usrp_rx_enable(bool on) = 0;
-
- //! enable/disable the tx path
- virtual void usrp_tx_enable(bool on) = 0;
-};
-
-}} //namespace uhd::usrp
-
-#endif /* INCLUDED_USRP_CTRL_HPP */