summaryrefslogtreecommitdiff
path: root/Radio/HW/BladeRF/src/backend/backend.h
diff options
context:
space:
mode:
Diffstat (limited to 'Radio/HW/BladeRF/src/backend/backend.h')
-rw-r--r--Radio/HW/BladeRF/src/backend/backend.h364
1 files changed, 364 insertions, 0 deletions
diff --git a/Radio/HW/BladeRF/src/backend/backend.h b/Radio/HW/BladeRF/src/backend/backend.h
new file mode 100644
index 0000000..e5e6d2c
--- /dev/null
+++ b/Radio/HW/BladeRF/src/backend/backend.h
@@ -0,0 +1,364 @@
+/**
+ * @file backend.h
+ *
+ * @brief This file defines the generic interface to bladeRF backends
+ *
+ * This file is part of the bladeRF project:
+ * http://www.github.com/nuand/bladeRF
+ *
+ * Copyright (C) 2013 Nuand LLC
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef BACKEND_BACKEND_H_
+#define BACKEND_BACKEND_H_
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#include <libbladeRF.h>
+
+#include "logger_entry.h"
+
+#define BACKEND_STR_ANY "*"
+#define BACKEND_STR_LIBUSB "libusb"
+#define BACKEND_STR_LINUX "linux"
+#define BACKEND_STR_CYPRESS "cypress"
+
+/**
+ * Specifies what to probe for
+ */
+typedef enum {
+ BACKEND_PROBE_BLADERF,
+ BACKEND_PROBE_FX3_BOOTLOADER,
+} backend_probe_target;
+
+/**
+ * Backend protocol to use
+ */
+typedef enum {
+ BACKEND_FPGA_PROTOCOL_NIOSII_LEGACY,
+ BACKEND_FPGA_PROTOCOL_NIOSII,
+} backend_fpga_protocol;
+
+struct bladerf_devinfo_list;
+struct fx3_firmware;
+
+/**
+ * Backend-specific function table
+ *
+ * The backend is responsible for making calls to
+ * capabilities_init_pre_fpga_load() and capabilities_init_post_fpga_load() when
+ * opening a device and after loading an FPGA, or detecting an FPGA is already
+ * loaded.
+ *
+ */
+struct backend_fns {
+ /* Returns true if a backend supports the specified backend type,
+ * and false otherwise */
+ bool (*matches)(bladerf_backend backend);
+
+ /* Backends probe for devices and append entries to this list using
+ * bladerf_devinfo_list_append() */
+ int (*probe)(backend_probe_target probe_target,
+ struct bladerf_devinfo_list *info_list);
+
+ /* Get VID and PID of the device */
+ int (*get_vid_pid)(struct bladerf *dev, uint16_t *vid, uint16_t *pid);
+
+ /* Get flash manufacturer/device IDs */
+ int (*get_flash_id)(struct bladerf *dev, uint8_t *mid, uint8_t *did);
+
+ /* Opening device based upon specified device info. */
+ int (*open)(struct bladerf *dev, struct bladerf_devinfo *info);
+
+ /* Set the FPGA protocol */
+ int (*set_fpga_protocol)(struct bladerf *dev,
+ backend_fpga_protocol fpga_protocol);
+
+ /* Closing of the device and freeing of the data */
+ void (*close)(struct bladerf *dev);
+
+ /* Is firmware ready */
+ int (*is_fw_ready)(struct bladerf *dev);
+
+ /* Get handle */
+ int (*get_handle)(struct bladerf *dev, void **handle);
+
+ /* FPGA Loading and checking */
+ int (*load_fpga)(struct bladerf *dev,
+ const uint8_t *image,
+ size_t image_size);
+ int (*is_fpga_configured)(struct bladerf *dev);
+ bladerf_fpga_source (*get_fpga_source)(struct bladerf *dev);
+
+ /* Version checking */
+ int (*get_fw_version)(struct bladerf *dev, struct bladerf_version *version);
+ int (*get_fpga_version)(struct bladerf *dev,
+ struct bladerf_version *version);
+
+ /* Flash operations */
+
+ /* Erase the specified number of erase blocks */
+ int (*erase_flash_blocks)(struct bladerf *dev, uint32_t eb, uint16_t count);
+
+ /* Read the specified number of pages */
+ int (*read_flash_pages)(struct bladerf *dev,
+ uint8_t *buf,
+ uint32_t page,
+ uint32_t count);
+
+ /* Write the specified number of pages */
+ int (*write_flash_pages)(struct bladerf *dev,
+ const uint8_t *buf,
+ uint32_t page,
+ uint32_t count);
+
+ /* Device startup and reset */
+ int (*device_reset)(struct bladerf *dev);
+ int (*jump_to_bootloader)(struct bladerf *dev);
+
+ /* Platform information */
+ int (*get_cal)(struct bladerf *dev, char *cal);
+ int (*get_otp)(struct bladerf *dev, char *otp);
+ int (*write_otp)(struct bladerf *dev, char *otp);
+ int (*lock_otp)(struct bladerf *dev);
+ int (*get_device_speed)(struct bladerf *dev, bladerf_dev_speed *speed);
+
+ /* Configuration GPIO (NIOS II <-> logic) accessors */
+ int (*config_gpio_write)(struct bladerf *dev, uint32_t val);
+ int (*config_gpio_read)(struct bladerf *dev, uint32_t *val);
+
+ /* Expansion GPIO accessors */
+ int (*expansion_gpio_write)(struct bladerf *dev,
+ uint32_t mask,
+ uint32_t val);
+ int (*expansion_gpio_read)(struct bladerf *dev, uint32_t *val);
+ int (*expansion_gpio_dir_write)(struct bladerf *dev,
+ uint32_t mask,
+ uint32_t outputs);
+ int (*expansion_gpio_dir_read)(struct bladerf *dev, uint32_t *outputs);
+
+ /* IQ Correction Settings */
+ int (*set_iq_gain_correction)(struct bladerf *dev,
+ bladerf_channel ch,
+ int16_t value);
+ int (*set_iq_phase_correction)(struct bladerf *dev,
+ bladerf_channel ch,
+ int16_t value);
+ int (*get_iq_gain_correction)(struct bladerf *dev,
+ bladerf_channel ch,
+ int16_t *value);
+ int (*get_iq_phase_correction)(struct bladerf *dev,
+ bladerf_channel ch,
+ int16_t *value);
+
+ /* AGC DC Correction Lookup Table */
+ int (*set_agc_dc_correction)(struct bladerf *dev,
+ int16_t q_max,
+ int16_t i_max,
+ int16_t q_mid,
+ int16_t i_mid,
+ int16_t q_low,
+ int16_t i_low);
+
+ /* Get current timestamp counter values */
+ int (*get_timestamp)(struct bladerf *dev,
+ bladerf_direction dir,
+ uint64_t *value);
+
+ /* Si5338 accessors */
+ int (*si5338_write)(struct bladerf *dev, uint8_t addr, uint8_t data);
+ int (*si5338_read)(struct bladerf *dev, uint8_t addr, uint8_t *data);
+
+ /* LMS6002D accessors */
+ int (*lms_write)(struct bladerf *dev, uint8_t addr, uint8_t data);
+ int (*lms_read)(struct bladerf *dev, uint8_t addr, uint8_t *data);
+
+ /* INA219 accessors */
+ int (*ina219_write)(struct bladerf *dev, uint8_t addr, uint16_t data);
+ int (*ina219_read)(struct bladerf *dev, uint8_t addr, uint16_t *data);
+
+ /* AD9361 accessors */
+ int (*ad9361_spi_write)(struct bladerf *dev, uint16_t cmd, uint64_t data);
+ int (*ad9361_spi_read)(struct bladerf *dev, uint16_t cmd, uint64_t *data);
+
+ /* AD9361 accessors */
+ int (*adi_axi_write)(struct bladerf *dev, uint32_t addr, uint32_t data);
+ int (*adi_axi_read)(struct bladerf *dev, uint32_t addr, uint32_t *data);
+
+ /* Wishbone Master accessors */
+ int (*wishbone_master_write)(struct bladerf *dev, uint32_t addr, uint32_t data);
+ int (*wishbone_master_read)(struct bladerf *dev, uint32_t addr, uint32_t *data);
+
+ /* RFIC command accessors */
+ int (*rfic_command_write)(struct bladerf *dev, uint16_t cmd, uint64_t data);
+ int (*rfic_command_read)(struct bladerf *dev, uint16_t cmd, uint64_t *data);
+
+ /* RFFE control accessors */
+ int (*rffe_control_write)(struct bladerf *dev, uint32_t value);
+ int (*rffe_control_read)(struct bladerf *dev, uint32_t *value);
+
+ /* RFFE-to-Nios fast lock profile saver */
+ int (*rffe_fastlock_save)(struct bladerf *dev,
+ bool is_tx,
+ uint8_t rffe_profile,
+ uint16_t nios_profile);
+
+ /* AD56X1 VCTCXO Trim DAC accessors */
+ int (*ad56x1_vctcxo_trim_dac_write)(struct bladerf *dev, uint16_t value);
+ int (*ad56x1_vctcxo_trim_dac_read)(struct bladerf *dev, uint16_t *value);
+
+ /* ADF400X accessors */
+ int (*adf400x_write)(struct bladerf *dev, uint8_t addr, uint32_t data);
+ int (*adf400x_read)(struct bladerf *dev, uint8_t addr, uint32_t *data);
+
+ /* VCTCXO accessors */
+ int (*vctcxo_dac_write)(struct bladerf *dev, uint8_t addr, uint16_t value);
+ int (*vctcxo_dac_read)(struct bladerf *dev, uint8_t addr, uint16_t *value);
+
+ int (*set_vctcxo_tamer_mode)(struct bladerf *dev,
+ bladerf_vctcxo_tamer_mode mode);
+ int (*get_vctcxo_tamer_mode)(struct bladerf *dev,
+ bladerf_vctcxo_tamer_mode *mode);
+
+ /* Expansion board SPI */
+ int (*xb_spi)(struct bladerf *dev, uint32_t value);
+
+ /* Configure firmware loopback */
+ int (*set_firmware_loopback)(struct bladerf *dev, bool enable);
+ int (*get_firmware_loopback)(struct bladerf *dev, bool *is_enabled);
+
+ /* Sample stream */
+ int (*enable_module)(struct bladerf *dev,
+ bladerf_direction dir,
+ bool enable);
+
+ int (*init_stream)(struct bladerf_stream *stream, size_t num_transfers);
+ int (*stream)(struct bladerf_stream *stream, bladerf_channel_layout layout);
+ int (*submit_stream_buffer)(struct bladerf_stream *stream,
+ void *buffer,
+ size_t *length,
+ unsigned int timeout_ms,
+ bool nonblock);
+ void (*deinit_stream)(struct bladerf_stream *stream);
+
+ /* Schedule a frequency retune operation */
+ int (*retune)(struct bladerf *dev,
+ bladerf_channel ch,
+ uint64_t timestamp,
+ uint16_t nint,
+ uint32_t nfrac,
+ uint8_t freqsel,
+ uint8_t vcocap,
+ bool low_band,
+ uint8_t xb_gpio,
+ bool quick_tune);
+
+ /* Schedule a frequency retune2 operation */
+ int (*retune2)(struct bladerf *dev,
+ bladerf_channel ch,
+ uint64_t timestamp,
+ uint16_t nios_profile,
+ uint8_t rffe_profile,
+ uint8_t port,
+ uint8_t spdt);
+
+ /* Load firmware from FX3 bootloader */
+ int (*load_fw_from_bootloader)(bladerf_backend backend,
+ uint8_t bus,
+ uint8_t addr,
+ struct fx3_firmware *fw);
+
+ /* Read a log entry from the FX3 firmware */
+ int (*read_fw_log)(struct bladerf *dev, logger_entry *e);
+
+ /* Read and Write access to trigger registers */
+ int (*read_trigger)(struct bladerf *dev,
+ bladerf_channel ch,
+ bladerf_trigger_signal trigger,
+ uint8_t *val);
+ int (*write_trigger)(struct bladerf *dev,
+ bladerf_channel ch,
+ bladerf_trigger_signal trigger,
+ uint8_t val);
+
+ /* Backend name */
+ const char *name;
+};
+
+/**
+ * Open the device using the backend specified in the provided
+ * bladerf_devinfo structure.
+ *
+ * @param[in] device Device to fill in backend info for
+ * @param[in] info Filled-in device info
+ *
+ * @return 0 on success, BLADERF_ERR_* code on failure
+ */
+int backend_open(struct bladerf *dev, struct bladerf_devinfo *info);
+
+/**
+ * Probe for devices, filling in the provided devinfo list and size of
+ * the list that gets populated
+ *
+ * @param[in] probe_target Device type to probe for
+ * @param[out] devinfo_items Device info for identified devices
+ * @param[out] num_items Number of items in the devinfo list.
+ *
+ * @return 0 on success, BLADERF_ERR_* on failure
+ */
+int backend_probe(backend_probe_target probe_target,
+ struct bladerf_devinfo **devinfo_items,
+ size_t *num_items);
+
+/**
+ * Search for bootloader via provided specification, download firmware,
+ * and boot it.
+ *
+ * @param[in] backend Backend to use for this operation
+ * @param[in] bus USB bus the device is connected to
+ * @param[in] addr USB addr associated with the device
+ * @param[in] fw Firmware to load
+ *
+ * @return 0 on success, BLADERF_ERR_* on failure
+ */
+int backend_load_fw_from_bootloader(bladerf_backend backend,
+ uint8_t bus,
+ uint8_t addr,
+ struct fx3_firmware *fw);
+
+/**
+ * Convert a backend enumeration value to a string
+ *
+ * @param[in] backend Value to convert to a string
+ *
+ * @return A backend string for the associated enumeration value. An invalid
+ * value will yield the "ANY" wildcard.
+ */
+const char *backend2str(bladerf_backend backend);
+
+/**
+ * Convert a string to a backend type value
+ *
+ * @param[in] str Backend type, as a string.
+ * @param[out] backend Associated backend, on success
+ *
+ * @return 0 on success, BLADERF_ERR_INVAL on invalid type string
+ */
+int str2backend(const char *str, bladerf_backend *backend);
+
+#endif