aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/mboard/usrp2
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-02-17 16:23:12 -0800
committerJosh Blum <josh@joshknows.com>2010-02-17 16:23:12 -0800
commit4fb4572e1a16f54439f57655f90e0fc937c57c1e (patch)
tree5dc731d266c8f5f783c5b28996a1583dac18ab57 /host/lib/usrp/mboard/usrp2
parenteb7e709b7aff162cc7c8f9b8004089846839ffbe (diff)
downloaduhd-4fb4572e1a16f54439f57655f90e0fc937c57c1e.tar.gz
uhd-4fb4572e1a16f54439f57655f90e0fc937c57c1e.tar.bz2
uhd-4fb4572e1a16f54439f57655f90e0fc937c57c1e.zip
Worked out spi api for the dboard interface.
Created usrp2 spi transaction control on host and fw
Diffstat (limited to 'host/lib/usrp/mboard/usrp2')
-rw-r--r--host/lib/usrp/mboard/usrp2/dboard_interface.cpp88
-rw-r--r--host/lib/usrp/mboard/usrp2/dboard_interface.hpp16
-rw-r--r--host/lib/usrp/mboard/usrp2/fw_common.h22
3 files changed, 114 insertions, 12 deletions
diff --git a/host/lib/usrp/mboard/usrp2/dboard_interface.cpp b/host/lib/usrp/mboard/usrp2/dboard_interface.cpp
index 05d29daef..d244e0bee 100644
--- a/host/lib/usrp/mboard/usrp2/dboard_interface.cpp
+++ b/host/lib/usrp/mboard/usrp2/dboard_interface.cpp
@@ -52,10 +52,10 @@ double dboard_interface::get_tx_clock_rate(void){
*/
static uint8_t gpio_bank_to_otw(uhd::usrp::dboard::interface::gpio_bank_t bank){
switch(bank){
- case uhd::usrp::dboard::interface::GPIO_TX_BANK: return USRP2_GPIO_BANK_TX;
- case uhd::usrp::dboard::interface::GPIO_RX_BANK: return USRP2_GPIO_BANK_RX;
+ case uhd::usrp::dboard::interface::GPIO_TX_BANK: return USRP2_DIR_TX;
+ case uhd::usrp::dboard::interface::GPIO_RX_BANK: return USRP2_DIR_RX;
}
- throw std::runtime_error("unknown gpio bank");
+ throw std::invalid_argument("unknown gpio bank type");
}
void dboard_interface::set_gpio_ddr(gpio_bank_t bank, uint16_t value, uint16_t mask){
@@ -109,3 +109,85 @@ void dboard_interface::set_atr_reg(gpio_bank_t bank, uint16_t tx_value, uint16_t
usrp2_ctrl_data_t in_data = _impl->ctrl_send_and_recv(out_data);
ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_GOT_THE_ATR_SETTINGS_DUDE);
}
+
+/***********************************************************************
+ * SPI
+ **********************************************************************/
+/*!
+ * Static function to convert a spi dev enum
+ * to an over-the-wire value for the usrp2 control.
+ * \param dev the dboard interface spi dev enum
+ * \return an over the wire representation
+ */
+static uint8_t spi_dev_to_otw(uhd::usrp::dboard::interface::spi_dev_t dev){
+ switch(dev){
+ case uhd::usrp::dboard::interface::SPI_TX_DEV: return USRP2_DIR_TX;
+ case uhd::usrp::dboard::interface::SPI_RX_DEV: return USRP2_DIR_RX;
+ }
+ throw std::invalid_argument("unknown spi device type");
+}
+
+/*!
+ * Static function to convert a spi latch enum
+ * to an over-the-wire value for the usrp2 control.
+ * \param latch the dboard interface spi latch enum
+ * \return an over the wire representation
+ */
+static uint8_t spi_latch_to_otw(uhd::usrp::dboard::interface::spi_latch_t latch){
+ switch(latch){
+ case uhd::usrp::dboard::interface::SPI_LATCH_RISE: return USRP2_CLK_EDGE_RISE;
+ case uhd::usrp::dboard::interface::SPI_LATCH_FALL: return USRP2_CLK_EDGE_FALL;
+ }
+ throw std::invalid_argument("unknown spi latch type");
+}
+
+/*!
+ * Static function to convert a spi push enum
+ * to an over-the-wire value for the usrp2 control.
+ * \param push the dboard interface spi push enum
+ * \return an over the wire representation
+ */
+static uint8_t spi_push_to_otw(uhd::usrp::dboard::interface::spi_push_t push){
+ switch(push){
+ case uhd::usrp::dboard::interface::SPI_PUSH_RISE: return USRP2_CLK_EDGE_RISE;
+ case uhd::usrp::dboard::interface::SPI_PUSH_FALL: return USRP2_CLK_EDGE_FALL;
+ }
+ throw std::invalid_argument("unknown spi push type");
+}
+
+uhd::usrp::dboard::interface::byte_vector_t dboard_interface::transact_spi(
+ spi_dev_t dev,
+ spi_latch_t latch,
+ spi_push_t push,
+ const byte_vector_t &buf,
+ bool readback
+){
+ //setup the out data
+ usrp2_ctrl_data_t out_data;
+ out_data.id = htonl(USRP2_CTRL_ID_TRANSACT_ME_SOME_SPI_BRO);
+ out_data.data.spi_args.dev = spi_dev_to_otw(dev);
+ out_data.data.spi_args.latch = spi_latch_to_otw(latch);
+ out_data.data.spi_args.push = spi_push_to_otw(push);
+ out_data.data.spi_args.readback = (readback)? 1 : 0;
+ out_data.data.spi_args.bytes = buf.size();
+
+ //limitation of spi transaction size
+ ASSERT_THROW(buf.size() <= sizeof(out_data.data.spi_args.data));
+
+ //copy in the data
+ for (size_t i = 0; i < buf.size(); i++){
+ out_data.data.spi_args.data[i] = buf[i];
+ }
+
+ //send and recv
+ usrp2_ctrl_data_t in_data = _impl->ctrl_send_and_recv(out_data);
+ ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_OMG_TRANSACTED_SPI_DUDE);
+ ASSERT_THROW(in_data.data.spi_args.bytes == buf.size());
+
+ //copy out the data
+ byte_vector_t result;
+ for (size_t i = 0; i < buf.size(); i++){
+ result.push_back(in_data.data.spi_args.data[i]);
+ }
+ return result;
+}
diff --git a/host/lib/usrp/mboard/usrp2/dboard_interface.hpp b/host/lib/usrp/mboard/usrp2/dboard_interface.hpp
index 645681f43..8880eaf97 100644
--- a/host/lib/usrp/mboard/usrp2/dboard_interface.hpp
+++ b/host/lib/usrp/mboard/usrp2/dboard_interface.hpp
@@ -39,19 +39,23 @@ public:
uint16_t read_gpio(gpio_bank_t);
- void write_i2c (int, const std::string &){}
+ void write_i2c(int, const byte_vector_t &){}
- std::string read_i2c (int, size_t){return "";}
-
- void write_spi (spi_dev_t, spi_push_t, const std::string &){}
-
- std::string read_spi (spi_dev_t, spi_latch_t, size_t){return "";}
+ byte_vector_t read_i2c(int, size_t){return byte_vector_t();}
double get_rx_clock_rate(void);
double get_tx_clock_rate(void);
private:
+ byte_vector_t transact_spi(
+ spi_dev_t dev,
+ spi_latch_t latch,
+ spi_push_t push,
+ const byte_vector_t &buf,
+ bool readback
+ );
+
impl_base *_impl;
};
diff --git a/host/lib/usrp/mboard/usrp2/fw_common.h b/host/lib/usrp/mboard/usrp2/fw_common.h
index 8cd15c7c3..8e5810a14 100644
--- a/host/lib/usrp/mboard/usrp2/fw_common.h
+++ b/host/lib/usrp/mboard/usrp2/fw_common.h
@@ -63,6 +63,9 @@ typedef enum{
USRP2_CTRL_ID_USE_THESE_ATR_SETTINGS_BRO,
USRP2_CTRL_ID_GOT_THE_ATR_SETTINGS_DUDE,
+ USRP2_CTRL_ID_TRANSACT_ME_SOME_SPI_BRO,
+ USRP2_CTRL_ID_OMG_TRANSACTED_SPI_DUDE,
+
USRP2_CTRL_ID_PEACE_OUT
} usrp2_ctrl_id_t;
@@ -84,9 +87,14 @@ typedef enum{
} usrp2_ref_source_t;
typedef enum{
- USRP2_GPIO_BANK_RX,
- USRP2_GPIO_BANK_TX
-} usrp2_gpio_bank_t;
+ USRP2_DIR_RX,
+ USRP2_DIR_TX
+} usrp2_dir_which_t;
+
+typedef enum{
+ USRP2_CLK_EDGE_RISE,
+ USRP2_CLK_EDGE_FALL
+} usrp2_clk_edge_t;
typedef struct{
uint32_t id;
@@ -117,6 +125,14 @@ typedef struct{
uint16_t rx_value;
uint16_t mask;
} atr_config;
+ struct {
+ uint8_t dev;
+ uint8_t latch;
+ uint8_t push;
+ uint8_t readback;
+ uint8_t bytes;
+ uint8_t data[sizeof(uint32_t)];
+ } spi_args;
} data;
} usrp2_ctrl_data_t;