/**
* @file bladeRF1.h
*
* @brief bladeRF1-specific API
*
* Copyright (C) 2013-2017 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 BLADERF1_H_
#define BLADERF1_H_
/**
* @defgroup BLADERF1 bladeRF1-specific API
*
* These functions are thread-safe.
*
* @{
*/
/**
* @defgroup BLADERF1_CONSTANTS Constants (deprecated)
*
* \deprecated These constants are deprecated, and only apply to the original
* bladeRF (x40/x115). They are here for compatibility with legacy
* applications. Alternatives are noted below.
*
* @{
*/
/** Minimum sample rate, in Hz.
*
* \deprecated Use bladerf_get_sample_rate_range()
*/
#define BLADERF_SAMPLERATE_MIN 80000u
/**
* Maximum recommended sample rate, in Hz.
*
* \deprecated Use bladerf_get_sample_rate_range()
*/
#define BLADERF_SAMPLERATE_REC_MAX 40000000u
/** Minimum bandwidth, in Hz
*
* \deprecated Use bladerf_get_bandwidth_range()
*/
#define BLADERF_BANDWIDTH_MIN 1500000u
/** Maximum bandwidth, in Hz
*
* \deprecated Use bladerf_get_bandwidth_range()
*/
#define BLADERF_BANDWIDTH_MAX 28000000u
/**
* Minimum tunable frequency (with an XB-200 attached), in Hz.
*
* While this value is the lowest permitted, note that the components on the
* XB-200 are only rated down to 50 MHz. Be aware that performance will likely
* degrade as you tune to lower frequencies.
*
* \deprecated Call bladerf_expansion_attach(), then use
* bladerf_get_frequency_range() to get the frequency range.
*/
#define BLADERF_FREQUENCY_MIN_XB200 0u
/** Minimum tunable frequency (without an XB-200 attached), in Hz
*
* \deprecated Use bladerf_get_frequency_range()
*/
#define BLADERF_FREQUENCY_MIN 237500000u
/** Maximum tunable frequency, in Hz
*
* \deprecated Use bladerf_get_frequency_range()
*/
#define BLADERF_FREQUENCY_MAX 3800000000u
/** @} (End of BLADERF1_CONSTANTS) */
/**
* @ingroup FN_IMAGE
* @defgroup BLADERF_FLASH_CONSTANTS Flash image format constants
*
* \note These apply to both the bladeRF1 and bladeRF2, but they are still in
* bladeRF1.h for the time being.
*
* @{
*/
/** Byte address of FX3 firmware */
#define BLADERF_FLASH_ADDR_FIRMWARE 0x00000000
/** Length of firmware region of flash, in bytes */
#define BLADERF_FLASH_BYTE_LEN_FIRMWARE 0x00030000
/** Byte address of calibration data region */
#define BLADERF_FLASH_ADDR_CAL 0x00030000
/** Length of calibration data, in bytes */
#define BLADERF_FLASH_BYTE_LEN_CAL 0x100
/**
* Byte address of of the autoloaded FPGA and associated metadata.
*
* The first page is allocated for metadata, and the FPGA bitstream resides
* in the following pages.
*/
#define BLADERF_FLASH_ADDR_FPGA 0x00040000
/** @} (End of BLADERF_FLASH_CONSTANTS) */
/**
* @defgroup FN_BLADERF1_GAIN Gain stages (deprecated)
*
* These functions provide control over the device's RX and TX gain stages.
*
* \deprecated Use bladerf_get_gain_range(), bladerf_set_gain(), and
* bladerf_get_gain() to control total system gain. For direct
* control of individual gain stages, use bladerf_get_gain_stages(),
* bladerf_get_gain_stage_range(), bladerf_set_gain_stage(), and
* bladerf_get_gain_stage().
*
* @{
*/
/**
* In general, the gains should be incremented in the following order (and
* decremented in the reverse order).
*
* TX: `TXVGA1`, `TXVGA2`
*
* RX: `LNA`, `RXVGA`, `RXVGA2`
*
*/
/** Minimum RXVGA1 gain, in dB
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_RXVGA1_GAIN_MIN 5
/** Maximum RXVGA1 gain, in dB
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_RXVGA1_GAIN_MAX 30
/** Minimum RXVGA2 gain, in dB
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_RXVGA2_GAIN_MIN 0
/** Maximum RXVGA2 gain, in dB
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_RXVGA2_GAIN_MAX 30
/** Minimum TXVGA1 gain, in dB
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_TXVGA1_GAIN_MIN (-35)
/** Maximum TXVGA1 gain, in dB
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_TXVGA1_GAIN_MAX (-4)
/** Minimum TXVGA2 gain, in dB
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_TXVGA2_GAIN_MIN 0
/** Maximum TXVGA2 gain, in dB
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_TXVGA2_GAIN_MAX 25
/**
* LNA gain options
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
typedef enum {
BLADERF_LNA_GAIN_UNKNOWN, /**< Invalid LNA gain */
BLADERF_LNA_GAIN_BYPASS, /**< LNA bypassed - 0dB gain */
BLADERF_LNA_GAIN_MID, /**< LNA Mid Gain (MAX-6dB) */
BLADERF_LNA_GAIN_MAX /**< LNA Max Gain */
} bladerf_lna_gain;
/**
* Gain in dB of the LNA at mid setting
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_LNA_GAIN_MID_DB 3
/**
* Gain in db of the LNA at max setting
*
* \deprecated Use bladerf_get_gain_stage_range()
*/
#define BLADERF_LNA_GAIN_MAX_DB 6
/**
* Set the PA gain in dB
*
* \deprecated Use either bladerf_set_gain() or bladerf_set_gain_stage().
*
* Values outside the range of
* [ \ref BLADERF_TXVGA2_GAIN_MIN, \ref BLADERF_TXVGA2_GAIN_MAX ]
* will be clamped.
*
* @param dev Device handle
* @param[in] gain Desired gain
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_set_txvga2(struct bladerf *dev, int gain);
/**
* Get the PA gain in dB
*
* \deprecated Use either bladerf_get_gain() or bladerf_get_gain_stage().
*
* @param dev Device handle
* @param[out] gain Pointer to returned gain
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT int CALL_CONV bladerf_get_txvga2(struct bladerf *dev, int *gain);
/**
* Set the post-LPF gain in dB
*
* \deprecated Use either bladerf_set_gain() or bladerf_set_gain_stage().
*
* Values outside the range of
* [ \ref BLADERF_TXVGA1_GAIN_MIN, \ref BLADERF_TXVGA1_GAIN_MAX ]
* will be clamped.
*
* @param dev Device handle
* @param[in] gain Desired gain
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_set_txvga1(struct bladerf *dev, int gain);
/**
* Get the post-LPF gain in dB
*
* \deprecated Use either bladerf_get_gain() or bladerf_get_gain_stage().
*
* @param dev Device handle
* @param[out] gain Pointer to returned gain
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_get_txvga1(struct bladerf *dev, int *gain);
/**
* Set the LNA gain
*
* \deprecated Use either bladerf_set_gain() or bladerf_set_gain_stage().
*
* @param dev Device handle
* @param[in] gain Desired gain level
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_set_lna_gain(struct bladerf *dev, bladerf_lna_gain gain);
/**
* Get the LNA gain
*
* \deprecated Use either bladerf_get_gain() or bladerf_get_gain_stage().
*
* @param dev Device handle
* @param[out] gain Pointer to the set gain level
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_get_lna_gain(struct bladerf *dev, bladerf_lna_gain *gain);
/**
* Set the pre-LPF VGA gain
*
* \deprecated Use either bladerf_set_gain() or bladerf_set_gain_stage().
*
* Values outside the range of
* [ \ref BLADERF_RXVGA1_GAIN_MIN, \ref BLADERF_RXVGA1_GAIN_MAX ]
* will be clamped.
*
* @param dev Device handle
* @param[in] gain Desired gain
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_set_rxvga1(struct bladerf *dev, int gain);
/**
* Get the pre-LPF VGA gain
*
* \deprecated Use either bladerf_get_gain() or bladerf_get_gain_stage().
*
* @param dev Device handle
* @param[out] gain Pointer to the set gain level
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_get_rxvga1(struct bladerf *dev, int *gain);
/**
* Set the post-LPF VGA gain
*
* \deprecated Use either bladerf_set_gain() or bladerf_set_gain_stage().
*
* Values outside the range of
* [ \ref BLADERF_RXVGA2_GAIN_MIN, \ref BLADERF_RXVGA2_GAIN_MAX ]
* will be clamped.
*
* @param dev Device handle
* @param[in] gain Desired gain
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_set_rxvga2(struct bladerf *dev, int gain);
/**
* Get the post-LPF VGA gain
*
* \deprecated Use either bladerf_get_gain() or bladerf_get_gain_stage().
*
* @param dev Device handle
* @param[out] gain Pointer to the set gain level
*/
API_EXPORT
int CALL_CONV bladerf_get_rxvga2(struct bladerf *dev, int *gain);
/** @} (End of FN_BLADERF1_GAIN) */
/**
* @defgroup FN_BLADERF1_SAMPLING_MUX Sampling Mux
*
* These functions provide control over internal and direct sampling modes of
* the LMS6002D.
*
* These functions are thread-safe.
*
* @{
*/
/**
* Sampling connection
*/
typedef enum {
BLADERF_SAMPLING_UNKNOWN, /**< Unable to determine connection type */
BLADERF_SAMPLING_INTERNAL, /**< Sample from RX/TX connector */
BLADERF_SAMPLING_EXTERNAL /**< Sample from J60 or J61 */
} bladerf_sampling;
/**
* Configure the sampling of the LMS6002D to be either internal or external.
*
* Internal sampling will read from the RXVGA2 driver internal to the chip.
* External sampling will connect the ADC inputs to the external inputs for
* direct sampling.
*
* @param dev Device handle
* @param[in] sampling Sampling connection
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_set_sampling(struct bladerf *dev,
bladerf_sampling sampling);
/**
* Read the device's current state of RXVGA2 and ADC pin connection
* to figure out which sampling mode it is currently configured in.
*
* @param dev Device handle
* @param[out] sampling Sampling connection
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_get_sampling(struct bladerf *dev,
bladerf_sampling *sampling);
/** @} (End of FN_BLADERF1_SAMPLING_MUX) */
/**
* @defgroup FN_BLADERF1_LPF_BYPASS LPF Bypass
*
* These functions provide control over the LPF bypass mode of the LMS6002D.
*
* These functions are thread-safe.
*
* @{
*/
/**
* Low-Pass Filter (LPF) mode
*/
typedef enum {
BLADERF_LPF_NORMAL, /**< LPF connected and enabled */
BLADERF_LPF_BYPASSED, /**< LPF bypassed */
BLADERF_LPF_DISABLED /**< LPF disabled */
} bladerf_lpf_mode;
/**
* Set the LMS LPF mode to bypass or disable it
*
* @param dev Device handle
* @param[in] ch Channel
* @param[in] mode Mode to be set
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_set_lpf_mode(struct bladerf *dev,
bladerf_channel ch,
bladerf_lpf_mode mode);
/**
* Get the current mode of the LMS LPF
*
* @param dev Device handle
* @param[in] ch Channel
* @param[out] mode Current mode of the LPF
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_get_lpf_mode(struct bladerf *dev,
bladerf_channel ch,
bladerf_lpf_mode *mode);
/** @} (End of FN_BLADERF1_LPF_BYPASS) */
/**
* @defgroup FN_SMB_CLOCK SMB clock port control
*
* The SMB clock port (J62) may be used to synchronize sampling on multiple
* devices, or to generate an arbitrary clock output for a different device.
*
* For MIMO configurations, one device is the clock "master" and outputs its
* 38.4 MHz reference on this port. The clock "slave" devices configure the SMB
* port as an input and expect to see this 38.4 MHz reference on this port. This
* implies that the "master" must be configured first.
*
* Alternatively, this port may be used to generate an arbitrary clock signal
* for use with other devices via the bladerf_set_smb_frequency() and
* bladerf_set_rational_smb_frequency() functions.
*
* @warning Do not use these functions when operating an expansion board.
* A different clock configuration is required for the XB devices which cannot
* be used simultaneously with the SMB clock port.
*
* These functions are thread-safe.
*
* @{
*/
/**
* Maximum output frequency on SMB connector, if no expansion board attached.
*/
#define BLADERF_SMB_FREQUENCY_MAX 200000000u
/**
* Minimum output frequency on SMB connector, if no expansion board attached.
*/
#define BLADERF_SMB_FREQUENCY_MIN ((38400000u * 66u) / (32 * 567))
/**
* SMB clock port mode of operation
*/
typedef enum {
BLADERF_SMB_MODE_INVALID = -1, /**< Invalid selection */
BLADERF_SMB_MODE_DISABLED, /**< Not in use. Device operates from its onboard
* clock and does not use J62.
*/
BLADERF_SMB_MODE_OUTPUT, /**< Device outputs a 38.4 MHz reference clock on
* J62. This may be used to drive another device
* that is configured with
* ::BLADERF_SMB_MODE_INPUT.
*/
BLADERF_SMB_MODE_INPUT, /**< Device configures J62 as an input and expects a
* 38.4 MHz reference to be available when this
* setting is applied.
*/
BLADERF_SMB_MODE_UNAVAILBLE, /**< SMB port is unavailable for use due to the
* underlying clock being used elsewhere (e.g.,
* for an expansion board).
*/
} bladerf_smb_mode;
/**
* Set the current mode of operation of the SMB clock port
*
* In a MIMO configuration, one "master" device should first be configured to
* output its reference clock to the slave devices via
* `bladerf_set_smb_mode(dev, BLADERF_SMB_MODE_OUTPUT)`.
*
* Next, all "slave" devices should be configured to use the reference clock
* provided on the SMB clock port (instead of using their on-board reference)
* via `bladerf_set_smb_mode(dev, BLADERF_SMB_MODE_INPUT)`.
*
* @param dev Device handle
* @param[in] mode Desired mode
*
* @return 0 on success, or a value from \ref RETCODES list on failure.
*/
API_EXPORT
int CALL_CONV bladerf_set_smb_mode(struct bladerf *dev, bladerf_smb_mode mode);
/**
* Get the current mode of operation of the SMB clock port
*
* @param dev Device handle
* @param[out] mode Desired mode
*
* @return 0 on success, or a value from \ref RETCODES list on failure.
*/
API_EXPORT
int CALL_CONV bladerf_get_smb_mode(struct bladerf *dev, bladerf_smb_mode *mode);
/**
* Set the SMB clock port frequency in rational Hz
*
* @param dev Device handle
* @param[in] rate Rational frequency
* @param[out] actual If non-NULL, this is written with the actual
*
* The frequency must be between \ref BLADERF_SMB_FREQUENCY_MIN and
* \ref BLADERF_SMB_FREQUENCY_MAX.
*
* This function inherently configures the SMB clock port as an output. Do not
* call bladerf_set_smb_mode() with ::BLADERF_SMB_MODE_OUTPUT, as this will
* reset the output frequency to the 38.4 MHz reference.
*
* @warning This clock should not be set if an expansion board is connected.
*
* @return 0 on success,
* BLADERF_ERR_INVAL for an invalid frequency,
* or a value from \ref RETCODES list on failure.
*/
API_EXPORT
int CALL_CONV
bladerf_set_rational_smb_frequency(struct bladerf *dev,
struct bladerf_rational_rate *rate,
struct bladerf_rational_rate *actual);
/**
* Set the SMB connector output frequency in Hz.
* Use bladerf_set_rational_smb_frequency() for more arbitrary values.
*
* @param dev Device handle
* @param[in] rate Frequency
* @param[out] actual If non-NULL. this is written with the actual
* frequency achieved.
*
* This function inherently configures the SMB clock port as an output. Do not
* call bladerf_set_smb_mode() with ::BLADERF_SMB_MODE_OUTPUT, as this will
* reset the output frequency to the 38.4 MHz reference.
*
* The frequency must be between \ref BLADERF_SMB_FREQUENCY_MIN and
* \ref BLADERF_SMB_FREQUENCY_MAX.
*
* @warning This clock should not be set if an expansion board is connected.
*
* @return 0 on success,
* BLADERF_ERR_INVAL for an invalid frequency,
* or a value from \ref RETCODES list on other failures
*/
API_EXPORT
int CALL_CONV bladerf_set_smb_frequency(struct bladerf *dev,
uint32_t rate,
uint32_t *actual);
/**
* Read the SMB connector output frequency in rational Hz
*
* @param dev Device handle
* @param[out] rate Pointer to returned rational frequency
*
* @return 0 on success, value from \ref RETCODES list upon failure
*/
API_EXPORT
int CALL_CONV bladerf_get_rational_smb_frequency(
struct bladerf *dev, struct bladerf_rational_rate *rate);
/**
* Read the SMB connector output frequency in Hz
*
* @param dev Device handle
* @param[out] rate Pointer to returned frequency
*
* @return 0 on success, value from \ref RETCODES list upon failure
*/
API_EXPORT
int CALL_CONV bladerf_get_smb_frequency(struct bladerf *dev,
unsigned int *rate);
/** @} (End of FN_SMB_CLOCK) */
/**
* @defgroup FN_EXP_IO Expansion I/O
*
* These definitions and functions provide high-level functionality for
* manipulating pins on the bladeRF1 U74 Expansion Header, and the associated
* mappings on expansion boards.
*
* These functions are thread-safe.
*
* @{
*/
/** Expansion pin GPIO number to bitmask */
#define BLADERF_XB_GPIO(n) (1 << (n - 1))
/** Specifies a pin to be an output */
#define BLADERF_XB_DIR_OUTPUT(pin) (pin)
/** Specifies a pin to be an input */
#define BLADERF_XB_DIR_INPUT(pin) (0)
/** Pin bitmask for Expansion GPIO 1 (U74 pin 11) */
#define BLADERF_XB_GPIO_01 BLADERF_XB_GPIO(1)
/** Pin bitmask for Expansion GPIO 2 (U74 pin 13) */
#define BLADERF_XB_GPIO_02 BLADERF_XB_GPIO(2)
/** Pin bitmask for Expansion GPIO 3 (U74 pin 17) */
#define BLADERF_XB_GPIO_03 BLADERF_XB_GPIO(3)
/** Pin bitmask for Expansion GPIO 4 (U74 pin 19) */
#define BLADERF_XB_GPIO_04 BLADERF_XB_GPIO(4)
/** Pin bitmask for Expansion GPIO 5 (U74 pin 23) */
#define BLADERF_XB_GPIO_05 BLADERF_XB_GPIO(5)
/** Pin bitmask for Expansion GPIO 6 (U74 pin 25) */
#define BLADERF_XB_GPIO_06 BLADERF_XB_GPIO(6)
/** Pin bitmask for Expansion GPIO 7 (U74 pin 29) */
#define BLADERF_XB_GPIO_07 BLADERF_XB_GPIO(7)
/** Pin bitmask for Expansion GPIO 8 (U74 pin 31) */
#define BLADERF_XB_GPIO_08 BLADERF_XB_GPIO(8)
/** Pin bitmask for Expansion GPIO 9 (U74 pin 35) */
#define BLADERF_XB_GPIO_09 BLADERF_XB_GPIO(9)
/** Pin bitmask for Expansion GPIO 10 (U74 pin 37) */
#define BLADERF_XB_GPIO_10 BLADERF_XB_GPIO(10)
/** Pin bitmask for Expansion GPIO 11 (U74 pin 41) */
#define BLADERF_XB_GPIO_11 BLADERF_XB_GPIO(11)
/** Pin bitmask for Expansion GPIO 12 (U74 pin 43) */
#define BLADERF_XB_GPIO_12 BLADERF_XB_GPIO(12)
/** Pin bitmask for Expansion GPIO 13 (U74 pin 47) */
#define BLADERF_XB_GPIO_13 BLADERF_XB_GPIO(13)
/** Pin bitmask for Expansion GPIO 14 (U74 pin 49) */
#define BLADERF_XB_GPIO_14 BLADERF_XB_GPIO(14)
/** Pin bitmask for Expansion GPIO 15 (U74 pin 53) */
#define BLADERF_XB_GPIO_15 BLADERF_XB_GPIO(15)
/** Pin bitmask for Expansion GPIO 16 (U74 pin 55) */
#define BLADERF_XB_GPIO_16 BLADERF_XB_GPIO(16)
/** Pin bitmask for Expansion GPIO 17 (U74 pin 12) */
#define BLADERF_XB_GPIO_17 BLADERF_XB_GPIO(17)
/** Pin bitmask for Expansion GPIO 18 (U74 pin 14) */
#define BLADERF_XB_GPIO_18 BLADERF_XB_GPIO(18)
/** Pin bitmask for Expansion GPIO 19 (U74 pin 18) */
#define BLADERF_XB_GPIO_19 BLADERF_XB_GPIO(19)
/** Pin bitmask for Expansion GPIO 20 (U74 pin 20) */
#define BLADERF_XB_GPIO_20 BLADERF_XB_GPIO(20)
/** Pin bitmask for Expansion GPIO 21 (U74 pin 24) */
#define BLADERF_XB_GPIO_21 BLADERF_XB_GPIO(21)
/** Pin bitmask for Expansion GPIO 22 (U74 pin 26) */
#define BLADERF_XB_GPIO_22 BLADERF_XB_GPIO(22)
/** Pin bitmask for Expansion GPIO 23 (U74 pin 30) */
#define BLADERF_XB_GPIO_23 BLADERF_XB_GPIO(23)
/** Pin bitmask for Expansion GPIO 24 (U74 pin 32) */
#define BLADERF_XB_GPIO_24 BLADERF_XB_GPIO(24)
/** Pin bitmask for Expansion GPIO 25 (U74 pin 36) */
#define BLADERF_XB_GPIO_25 BLADERF_XB_GPIO(25)
/** Pin bitmask for Expansion GPIO 26 (U74 pin 38) */
#define BLADERF_XB_GPIO_26 BLADERF_XB_GPIO(26)
/** Pin bitmask for Expansion GPIO 27 (U74 pin 42) */
#define BLADERF_XB_GPIO_27 BLADERF_XB_GPIO(27)
/** Pin bitmask for Expansion GPIO 28 (U74 pin 44) */
#define BLADERF_XB_GPIO_28 BLADERF_XB_GPIO(28)
/** Pin bitmask for Expansion GPIO 29 (U74 pin 48) */
#define BLADERF_XB_GPIO_29 BLADERF_XB_GPIO(29)
/** Pin bitmask for Expansion GPIO 30 (U74 pin 50) */
#define BLADERF_XB_GPIO_30 BLADERF_XB_GPIO(30)
/** Pin bitmask for Expansion GPIO 31 (U74 pin 54) */
#define BLADERF_XB_GPIO_31 BLADERF_XB_GPIO(31)
/** Pin bitmask for Expansion GPIO 32 (U74 pin 56) */
#define BLADERF_XB_GPIO_32 BLADERF_XB_GPIO(32)
/** Bitmask for XB-200 header J7, pin 1 */
#define BLADERF_XB200_PIN_J7_1 BLADERF_XB_GPIO_10
/** Bitmask for XB-200 header J7, pin 2 */
#define BLADERF_XB200_PIN_J7_2 BLADERF_XB_GPIO_11
/** Bitmask for XB-200 header J7, pin 5 */
#define BLADERF_XB200_PIN_J7_5 BLADERF_XB_GPIO_08
/** Bitmask for XB-200 header J7, pin 6 */
#define BLADERF_XB200_PIN_J7_6 BLADERF_XB_GPIO_09
/** Bitmask for XB-200 header J13, pin 1 */
#define BLADERF_XB200_PIN_J13_1 BLADERF_XB_GPIO_17
/** Bitmask for XB-200 header J13, pin 2 */
#define BLADERF_XB200_PIN_J13_2 BLADERF_XB_GPIO_18
/* XB-200 J13 Pin 6 is actually reserved for SPI */
/** Bitmask for XB-200 header J16, pin 1 */
#define BLADERF_XB200_PIN_J16_1 BLADERF_XB_GPIO_31
/** Bitmask for XB-200 header J16, pin 2 */
#define BLADERF_XB200_PIN_J16_2 BLADERF_XB_GPIO_32
/** Bitmask for XB-200 header J16, pin 3 */
#define BLADERF_XB200_PIN_J16_3 BLADERF_XB_GPIO_19
/** Bitmask for XB-200 header J16, pin 4 */
#define BLADERF_XB200_PIN_J16_4 BLADERF_XB_GPIO_20
/** Bitmask for XB-200 header J16, pin 5 */
#define BLADERF_XB200_PIN_J16_5 BLADERF_XB_GPIO_21
/** Bitmask for XB-200 header J16, pin 6 */
#define BLADERF_XB200_PIN_J16_6 BLADERF_XB_GPIO_24
/** Bitmask for XB-100 header J2, pin 3 */
#define BLADERF_XB100_PIN_J2_3 BLADERF_XB_GPIO_07
/** Bitmask for XB-100 header J2, pin 4 */
#define BLADERF_XB100_PIN_J2_4 BLADERF_XB_GPIO_08
/** Bitmask for XB-100 header J3, pin 3 */
#define BLADERF_XB100_PIN_J3_3 BLADERF_XB_GPIO_09
/** Bitmask for XB-100 header J3, pin 4 */
#define BLADERF_XB100_PIN_J3_4 BLADERF_XB_GPIO_10
/** Bitmask for XB-100 header J4, pin 3 */
#define BLADERF_XB100_PIN_J4_3 BLADERF_XB_GPIO_11
/** Bitmask for XB-100 header J4, pin 4 */
#define BLADERF_XB100_PIN_J4_4 BLADERF_XB_GPIO_12
/** Bitmask for XB-100 header J5, pin 3 */
#define BLADERF_XB100_PIN_J5_3 BLADERF_XB_GPIO_13
/** Bitmask for XB-100 header J5, pin 4 */
#define BLADERF_XB100_PIN_J5_4 BLADERF_XB_GPIO_14
/** Bitmask for XB-100 header J11, pin 2 */
#define BLADERF_XB100_PIN_J11_2 BLADERF_XB_GPIO_05
/** Bitmask for XB-100 header J11, pin 3 */
#define BLADERF_XB100_PIN_J11_3 BLADERF_XB_GPIO_04
/** Bitmask for XB-100 header J11, pin 4 */
#define BLADERF_XB100_PIN_J11_4 BLADERF_XB_GPIO_03
/** Bitmask for XB-100 header J11, pin 5 */
#define BLADERF_XB100_PIN_J11_5 BLADERF_XB_GPIO_06
/** Bitmask for XB-100 header J12, pin 2 */
#define BLADERF_XB100_PIN_J12_2 BLADERF_XB_GPIO_01
/* XB-100 header J12, pins 3 and 4 are reserved for SPI */
/** Bitmask for XB-100 header J12, pin 5 */
#define BLADERF_XB100_PIN_J12_5 BLADERF_XB_GPIO_02
/** Bitmask for XB-100 LED_D1 (blue) */
#define BLADERF_XB100_LED_D1 BLADERF_XB_GPIO_24
/** Bitmask for XB-100 LED_D2 (blue) */
#define BLADERF_XB100_LED_D2 BLADERF_XB_GPIO_32
/** Bitmask for XB-100 LED_D3 (blue) */
#define BLADERF_XB100_LED_D3 BLADERF_XB_GPIO_30
/** Bitmask for XB-100 LED_D4 (red) */
#define BLADERF_XB100_LED_D4 BLADERF_XB_GPIO_28
/** Bitmask for XB-100 LED_D5 (red) */
#define BLADERF_XB100_LED_D5 BLADERF_XB_GPIO_23
/** Bitmask for XB-100 LED_D6 (red) */
#define BLADERF_XB100_LED_D6 BLADERF_XB_GPIO_25
/** Bitmask for XB-100 LED_D7 (green) */
#define BLADERF_XB100_LED_D7 BLADERF_XB_GPIO_31
/** Bitmask for XB-100 LED_D8 (green) */
#define BLADERF_XB100_LED_D8 BLADERF_XB_GPIO_29
/** Bitmask for XB-100 tricolor LED, red cathode */
#define BLADERF_XB100_TLED_RED BLADERF_XB_GPIO_22
/** Bitmask for XB-100 tricolor LED, green cathode */
#define BLADERF_XB100_TLED_GREEN BLADERF_XB_GPIO_21
/** Bitmask for XB-100 tricolor LED, blue cathode */
#define BLADERF_XB100_TLED_BLUE BLADERF_XB_GPIO_20
/** Bitmask for XB-100 DIP switch 1 */
#define BLADERF_XB100_DIP_SW1 BLADERF_XB_GPIO_27
/** Bitmask for XB-100 DIP switch 2 */
#define BLADERF_XB100_DIP_SW2 BLADERF_XB_GPIO_26
/** Bitmask for XB-100 DIP switch 3 */
#define BLADERF_XB100_DIP_SW3 BLADERF_XB_GPIO_16
/** Bitmask for XB-100 DIP switch 4 */
#define BLADERF_XB100_DIP_SW4 BLADERF_XB_GPIO_15
/** Bitmask for XB-100 button J6 */
#define BLADERF_XB100_BTN_J6 BLADERF_XB_GPIO_19
/** Bitmask for XB-100 button J7 */
#define BLADERF_XB100_BTN_J7 BLADERF_XB_GPIO_18
/** Bitmask for XB-100 button J8 */
#define BLADERF_XB100_BTN_J8 BLADERF_XB_GPIO_17
/* XB-100 buttons J9 and J10 are not mapped to the GPIO register,
* but instead to reserved SPI pins. FPGA modifications are needed to
* use these. */
/**
* Read the state of expansion GPIO values
*
* @param dev Device handle
* @param[out] val Value of GPIO pins
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_expansion_gpio_read(struct bladerf *dev, uint32_t *val);
/**
* Write expansion GPIO pins.
*
* Callers should be sure to perform a read-modify-write sequence to avoid
* accidentally clearing other GPIO bits that may be set by the library
* internally.
*
* Consider using bladerf_expansion_gpio_masked_write() instead.
*
* @param dev Device handle
* @param[in] val Data to write to GPIO pins
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_expansion_gpio_write(struct bladerf *dev, uint32_t val);
/**
* Write values to the specified GPIO pins
*
* This function alleviates the need for the caller to perform a
* read-modify-write sequence. The supplied mask is used by the FPGA to perform
* the required RMW operation.
*
* @param dev Device handle
* @param[in] mask Mask of pins to write
* @param[in] value Value to write.
*
* For example, to set XB200 pins J16-1 and J16-2, and clear J16-4 and J16-5:
*
* @code{.c}
* const uint32_t pins_to_write =
* BLADERF_XB200_PIN_J16_1 |
* BLADERF_XB200_PIN_J16_2 |
* BLADERF_XB200_PIN_J16_3 |
* BLADERF_XB200_PIN_J16_4;
*
* const uint32_t values_to_write =
* BLADERF_XB200_PIN_J16_1 |
* BLADERF_XB200_PIN_J16_2;
*
* int status = bladerf_expansion_gpio_masked_write(dev,
* pins_to_write,
* values_to_write);
* @endcode
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_expansion_gpio_masked_write(struct bladerf *dev,
uint32_t mask,
uint32_t value);
/**
* Read the expansion GPIO direction register
*
* @param dev Device handle
* @param[out] outputs Pins configured as outputs will be set to '1'.
* Pins configured as inputs will be set to '0'.
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_expansion_gpio_dir_read(struct bladerf *dev,
uint32_t *outputs);
/**
* Write to the expansion GPIO direction register.
*
* Callers should be sure to perform a read-modify-write sequence to avoid
* accidentally clearing other GPIO bits that may be set by the library
* internally.
*
* Consider using bladerf_expansion_gpio_dir_masked_write() instead.
*
* @param dev Device handle
* @param[in] outputs Pins set to '1' will be configured as outputs.
* Pins set to '0' will be configured as inputs.
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_expansion_gpio_dir_write(struct bladerf *dev,
uint32_t outputs);
/**
* Configure the direction of the specified expansion GPIO pins
*
* This function alleviates the need for the caller to perform a
* read-modify-write sequence. The supplied mask is used by the FPGA to perform
* the required RMW operation.
*
* @param dev Device handle
* @param[in] mask Bitmask of pins to configure
* @param[in] outputs Pins set to '1' will be configured as outputs.
* Pins set to '0' will be configured as inputs.
*
* For example, to configure XB200 pins J16-1 and J16-2 and pins J16-4 and J16-5
* as inputs:
*
* @code{.c}
* const uint32_t pins_to_config =
* BLADERF_XB200_PIN_J16_1 |
* BLADERF_XB200_PIN_J16_2 |
* BLADERF_XB200_PIN_J16_3 |
* BLADERF_XB200_PIN_J16_4;
*
* const uint32_t output_pins =
* BLADERF_XB200_PIN_J16_1 |
* BLADERF_XB200_PIN_J16_2;
*
* int status = bladerf_expansion_gpio_masked_write(dev,
* pins_to_config,
* output_pins);
* @endcode
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_expansion_gpio_dir_masked_write(struct bladerf *dev,
uint32_t mask,
uint32_t outputs);
/** @} (End of FN_EXP_IO) */
/**
* @defgroup FN_BLADERF1_XB Expansion board support
*
* This group of functions provides the ability to control and configure
* expansion boards such as the XB-100, XB-200, and XB-300.
*
* These functions are thread-safe.
*
* @{
*/
/**
* XB-200 filter selection options
*/
typedef enum {
/** 50-54 MHz (6 meter band) filterbank */
BLADERF_XB200_50M = 0,
/** 144-148 MHz (2 meter band) filterbank */
BLADERF_XB200_144M,
/**
* 222-225 MHz (1.25 meter band) filterbank.
*
* Note that this filter option is technically wider, covering 206-235 MHz.
*/
BLADERF_XB200_222M,
/**
* This option enables the RX/TX channel's custom filter bank path across
* the associated FILT and FILT-ANT SMA connectors on the XB-200 board.
*
* For reception, it is often possible to simply connect the RXFILT and
* RXFILT-ANT connectors with an SMA cable (effectively, "no filter"). This
* allows for reception of signals outside of the frequency range of the
* on-board filters, with some potential trade-off in signal quality.
*
* For transmission, always use an appropriate filter on the custom
* filter path to avoid spurious emissions.
*
*/
BLADERF_XB200_CUSTOM,
/**
* When this option is selected, the other filter options are automatically
* selected depending on the RX or TX channel's current frequency, based
* upon the 1dB points of the on-board filters. For frequencies outside
* the range of the on-board filters, the custom path is selected.
*/
BLADERF_XB200_AUTO_1DB,
/**
* When this option is selected, the other filter options are automatically
* selected depending on the RX or TX channel's current frequency, based
* upon the 3dB points of the on-board filters. For frequencies outside the
* range of the on-board filters, the custom path is selected.
*/
BLADERF_XB200_AUTO_3DB
} bladerf_xb200_filter;
/**
* XB-200 signal paths
*/
typedef enum {
BLADERF_XB200_BYPASS = 0, /**< Bypass the XB-200 mixer */
BLADERF_XB200_MIX /**< Pass signals through the XB-200 mixer */
} bladerf_xb200_path;
/**
* XB-300 TRX setting
*/
typedef enum {
BLADERF_XB300_TRX_INVAL = -1, /**< Invalid TRX selection */
BLADERF_XB300_TRX_TX = 0, /**< TRX antenna operates as TX */
BLADERF_XB300_TRX_RX, /**< TRX antenna operates as RX */
BLADERF_XB300_TRX_UNSET /**< TRX antenna unset */
} bladerf_xb300_trx;
/**
* XB-300 Amplifier selection
*/
typedef enum {
BLADERF_XB300_AMP_INVAL = -1, /**< Invalid amplifier selection */
BLADERF_XB300_AMP_PA = 0, /**< TX Power amplifier */
BLADERF_XB300_AMP_LNA, /**< RX LNA */
BLADERF_XB300_AMP_PA_AUX /**< Auxillary Power amplifier */
} bladerf_xb300_amplifier;
/**
* Set XB-200 filterbank
*
* @param dev Device handle
* @param[in] ch Channel
* @param[in] filter XB200 filterbank
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb200_set_filterbank(struct bladerf *dev,
bladerf_channel ch,
bladerf_xb200_filter filter);
/**
* Get current XB-200 filterbank
*
* @param dev Device handle
* @param[in] ch Channel
* @param[out] filter Pointer to filterbank, only updated if return
* value is 0.
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb200_get_filterbank(struct bladerf *dev,
bladerf_channel ch,
bladerf_xb200_filter *filter);
/**
* Set XB-200 signal path
*
* @param dev Device handle
* @param[in] ch Channel
* @param[in] path Desired XB-200 signal path
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb200_set_path(struct bladerf *dev,
bladerf_channel ch,
bladerf_xb200_path path);
/**
* Get current XB-200 signal path
*
* @param dev Device handle
* @param[in] ch Channel
* @param[out] path Pointer to XB200 signal path
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb200_get_path(struct bladerf *dev,
bladerf_channel ch,
bladerf_xb200_path *path);
/**
* Configure the XB-300 TRX path
*
* @param dev Device handle
* @param[in] trx Desired XB-300 TRX setting
*
* @return 0 on success, BLADERF_ERR_* on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb300_set_trx(struct bladerf *dev, bladerf_xb300_trx trx);
/**
* Get the current XB-300 signal path
*
* @param dev Device handle
* @param[out] trx XB300 TRX antenna setting
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb300_get_trx(struct bladerf *dev,
bladerf_xb300_trx *trx);
/**
* Enable or disable selected XB-300 amplifier
*
* @param dev Device handle
* @param[in] amp XB-300 amplifier
* @param[in] enable Set true to enable or false to disable
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb300_set_amplifier_enable(struct bladerf *dev,
bladerf_xb300_amplifier amp,
bool enable);
/**
* Get state of selected XB-300 amplifier
*
* @param dev Device handle
* @param[in] amp XB-300 amplifier
* @param[out] enable Set true to enable or false to disable
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb300_get_amplifier_enable(struct bladerf *dev,
bladerf_xb300_amplifier amp,
bool *enable);
/**
* Get current PA PDET output power in dBm
*
* @param dev Device handle
* @param[out] val Output power in dBm
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb300_get_output_power(struct bladerf *dev, float *val);
/** @} (End of FN_BLADERF1_XB) */
/**
* @defgroup FN_BLADERF1_DC_CAL DC Calibration
*
* These functions are thread-safe.
*
* @{
*/
/**
* DC Calibration Modules
*/
typedef enum {
BLADERF_DC_CAL_INVALID = -1,
BLADERF_DC_CAL_LPF_TUNING,
BLADERF_DC_CAL_TX_LPF,
BLADERF_DC_CAL_RX_LPF,
BLADERF_DC_CAL_RXVGA2
} bladerf_cal_module;
/**
* Perform DC calibration
*
* @param dev Device handle
* @param[in] module Module to calibrate
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_calibrate_dc(struct bladerf *dev,
bladerf_cal_module module);
/** @} (End of FN_BLADERF1_DC_CAL) */
/**
* @defgroup FN_BLADERF1_LOW_LEVEL Low-level accessors
*
* In a most cases, higher-level routines should be used. These routines are
* only intended to support development and testing.
*
* Use these routines with great care, and be sure to reference the relevant
* schematics, data sheets, and source code (i.e., firmware and hdl).
*
* Be careful when mixing these calls with higher-level routines that manipulate
* the same registers/settings.
*
* These functions are thread-safe.
*
* @{
*/
/**
* Enable LMS receive
*
* @note This bit is set/cleared by bladerf_enable_module()
*/
#define BLADERF_GPIO_LMS_RX_ENABLE (1 << 1)
/**
* Enable LMS transmit
*
* @note This bit is set/cleared by bladerf_enable_module()
*/
#define BLADERF_GPIO_LMS_TX_ENABLE (1 << 2)
/**
* Switch to use TX low band (300MHz - 1.5GHz)
*
* @note This is set using bladerf_set_frequency().
*/
#define BLADERF_GPIO_TX_LB_ENABLE (2 << 3)
/**
* Switch to use TX high band (1.5GHz - 3.8GHz)
*
* @note This is set using bladerf_set_frequency().
*/
#define BLADERF_GPIO_TX_HB_ENABLE (1 << 3)
/**
* Counter mode enable
*
* Setting this bit to 1 instructs the FPGA to replace the (I, Q) pair in sample
* data with an incrementing, little-endian, 32-bit counter value. A 0 in bit
* specifies that sample data should be sent (as normally done).
*
* This feature is useful when debugging issues involving dropped samples.
*/
#define BLADERF_GPIO_COUNTER_ENABLE (1 << 9)
/**
* Bit mask representing the rx mux selection
*
* @note These bits are set using bladerf_set_rx_mux()
*/
#define BLADERF_GPIO_RX_MUX_MASK (0x7 << BLADERF_GPIO_RX_MUX_SHIFT)
/**
* Starting bit index of the RX mux values in FX3 <-> FPGA GPIO bank
*/
#define BLADERF_GPIO_RX_MUX_SHIFT 8
/**
* Switch to use RX low band (300M - 1.5GHz)
*
* @note This is set using bladerf_set_frequency().
*/
#define BLADERF_GPIO_RX_LB_ENABLE (2 << 5)
/**
* Switch to use RX high band (1.5GHz - 3.8GHz)
*
* @note This is set using bladerf_set_frequency().
*/
#define BLADERF_GPIO_RX_HB_ENABLE (1 << 5)
/**
* This GPIO bit configures the FPGA to use smaller DMA transfers (256 cycles
* instead of 512). This is required when the device is not connected at Super
* Speed (i.e., when it is connected at High Speed).
*
* However, the caller need not set this in bladerf_config_gpio_write() calls.
* The library will set this as needed; callers generally do not need to be
* concerned with setting/clearing this bit.
*/
#define BLADERF_GPIO_FEATURE_SMALL_DMA_XFER (1 << 7)
/**
* Enable Packet mode
*/
#define BLADERF_GPIO_PACKET (1 << 19)
/**
* Enable 8bit sample mode
*/
#define BLADERF_GPIO_8BIT_MODE (1 << 20)
/**
* AGC enable control bit
*
* @note This is set using bladerf_set_gain_mode().
*/
#define BLADERF_GPIO_AGC_ENABLE (1 << 18)
/**
* Enable-bit for timestamp counter in the FPGA
*/
#define BLADERF_GPIO_TIMESTAMP (1 << 16)
/**
* Timestamp 2x divider control.
*
* @note Important: This bit has no effect and is always enabled (1) in
* FPGA versions >= v0.3.0.
*
* @note The remainder of the description of this bit is presented here for
* historical purposes only. It is only relevant to FPGA versions <= v0.1.2.
*
* By default (value = 0), the sample counter is incremented with I and Q,
* yielding two counts per sample.
*
* Set this bit to 1 to enable a 2x timestamp divider, effectively achieving 1
* timestamp count per sample.
* */
#define BLADERF_GPIO_TIMESTAMP_DIV2 (1 << 17)
/**
* Packet capable core present bit.
*
* @note This is a read-only bit. The FPGA sets its value, and uses it to inform
* host that there is a core capable of using packets in the FPGA.
*/
#define BLADERF_GPIO_PACKET_CORE_PRESENT (1 << 28)
/**
* Write value to VCTCXO trim DAC.
*
* \deprecated Use bladerf_trim_dac_write().
*
* This should not be used when the VCTCXO tamer is enabled.
*
* @param dev Device handle
* @param[in] val Value to write to VCTCXO trim DAC
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_dac_write(struct bladerf *dev, uint16_t val);
/**
* Read value from VCTCXO trim DAC.
*
* \deprecated Use bladerf_trim_dac_read().
*
* This is similar to bladerf_get_vctcxo_trim(), except that it returns the
* current trim DAC value, as opposed to the calibration value read from flash.
*
* Use this if you are trying to query the value after having previously made
* calls to bladerf_dac_write().
*
* @param dev Device handle
* @param[out] val Value to read from VCTCXO trim DAC
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_dac_read(struct bladerf *dev, uint16_t *val);
/**
* Read a Si5338 register
*
* @param dev Device handle
* @param[in] address Si5338 register address
* @param[out] val Register value
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_si5338_read(struct bladerf *dev,
uint8_t address,
uint8_t *val);
/**
* Write a Si5338 register
*
* @param dev Device handle
* @param[in] address Si5338 register address
* @param[in] val Value to write to register
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_si5338_write(struct bladerf *dev,
uint8_t address,
uint8_t val);
/**
* Read a LMS register
*
* @param dev Device handle
* @param[in] address LMS register address
* @param[out] val Register value
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_lms_read(struct bladerf *dev,
uint8_t address,
uint8_t *val);
/**
* Write a LMS register
*
* @param dev Device handle
* @param[in] address LMS register address
* @param[in] val Value to write to register
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_lms_write(struct bladerf *dev,
uint8_t address,
uint8_t val);
/**
* This structure is used to directly apply DC calibration register values to
* the LMS, rather than use the values resulting from an auto-calibration.
*
* A value < 0 is used to denote that the specified value should not be written.
* If a value is to be written, it will be truncated to 8-bits.
*/
struct bladerf_lms_dc_cals {
int16_t lpf_tuning; /**< LPF tuning module */
int16_t tx_lpf_i; /**< TX LPF I filter */
int16_t tx_lpf_q; /**< TX LPF Q filter */
int16_t rx_lpf_i; /**< RX LPF I filter */
int16_t rx_lpf_q; /**< RX LPF Q filter */
int16_t dc_ref; /**< RX VGA2 DC reference module */
int16_t rxvga2a_i; /**< RX VGA2, I channel of first gain stage */
int16_t rxvga2a_q; /**< RX VGA2, Q channel of first gain stage */
int16_t rxvga2b_i; /**< RX VGA2, I channel of second gain stage */
int16_t rxvga2b_q; /**< RX VGA2, Q channel of second gain stage */
};
/**
* Manually load values into LMS6002 DC calibration registers.
*
* This is generally intended for applying a set of known values resulting from
* a previous run of the LMS autocalibrations.
*
* @param dev Device handle
* @param[in] dc_cals Calibration values to load. Values set to <0 will
* not be applied.
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_lms_set_dc_cals(
struct bladerf *dev, const struct bladerf_lms_dc_cals *dc_cals);
/**
* Retrieve the current DC calibration values from the LMS6002
*
* @param dev Device handle
* @param[out] dc_cals Populated with current values
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_lms_get_dc_cals(struct bladerf *dev,
struct bladerf_lms_dc_cals *dc_cals);
/**
* Write value to secondary XB SPI
*
* @param dev Device handle
* @param[out] val Value to write to XB SPI
*
* @return 0 on success, value from \ref RETCODES list on failure
*/
API_EXPORT
int CALL_CONV bladerf_xb_spi_write(struct bladerf *dev, uint32_t val);
/** @} (End of FN_BLADERF1_LOW_LEVEL) */
/** @} (End of BLADERF1) */
#endif /* BLADERF1_H_ */