gps-sdr-sim/player/plutoplayer_win/ad9361.h
2022-08-21 15:30:46 +09:00

228 lines
10 KiB
C

/*
* Copyright (C) 2015 Analog Devices, Inc.
*
* 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.
*/
/** @file ad9361.h
* @brief Public interface */
#ifndef __AD9361_H__
#define __AD9361_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup FLAGS MCS Flags
*
* @{
*/
/** Flag for ad9361_multichip_sync which verifies interface timing between
master and all slaves is identical
*/
#define FIXUP_INTERFACE_TIMING 1
/** Flag for ad9361_multichip_sync which checks if master and associated slaves
have the same sample rate
*/
#define CHECK_SAMPLE_RATES 2
/** @} */
#ifdef _WIN32
# ifdef LIBAD9361_EXPORTS
# define __api __declspec(dllexport)
# else
# define __api __declspec(dllimport)
# endif
#elif __GNUC__ >= 4 && !defined(MATLAB_MEX_FILE) && !defined(MATLAB_LOADLIBRARY)
# define __api __attribute__((visibility ("default")))
#else
# define __api
#endif
struct iio_context;
struct iio_device;
/**
* @struct filter_design_parameters
* @brief Custom Filter Design Parameters
*
* A structure for custom filter designs for the AD936X programmable FIR
* in both TX and RX paths.
*/
struct filter_design_parameters {
double Rdata; /**< Data rate of digital interface */
double Fpass; /**< Stop edge frequency in hertz of passband */
double Fstop; /**< Start edge frequency in hertz of stopband */
double caldiv; /**< Baseband analog filter calibration divider setting [1-511] */
double FIR; /**< Decimation/Interpolation setting of FIR [1,2,4] */
double HB1; /**< Decimation/Interpolation setting of HB1 [1,2] */
double DAC_div; /**< Divider enable setting of DAC clock [0,1] */
const char *Type; /**< Designer mode (only Lowpass supported) */
const char *RxTx; /**< Filter path [Tx,Rx] */
double RFbw; /**< 3dB corner of analog filter in hertz */
double converter_rate; /**< Rate of ADC in hertz */
double PLL_rate; /**< Rate of PLL in hertz */
double Fcenter; /**< Center frequency in hertz of bandpass (Unused) */
double wnom; /**< RF bandwidth of analog filter in hertz */
double FIRdBmin; /**< Minimum stop band attentuation of the FIR in dB */
double int_FIR; /**< Enable use of internal FIR filter [0,1] */
double PLL_mult; /**< Ratio of converter to PLL rate */
double Apass; /**< Desired passband ripple in dB */
double Astop; /**< Desired stopband attenuation in dB */
double phEQ; /**< Enable phase equalization [0,1] */
double HB2; /**< Decimation/Interpolation setting of HB2 [1,2] */
double HB3; /**< Decimation/Interpolation setting of HB3 [1,2,3] */
double maxTaps; /**< Maximum allowed FIR taps */
};
/* ---------------------------------------------------------------------------*/
/* ------------------------- Top-level functions -----------------------------*/
/** @defgroup TopLevel Top-level functions
* @{ */
/** @brief Multi-chip synchronization (MCS) management
* @param master A pointer to an iio_device structure
* @param slaves A double pointer to an iio_device structure
* @param num_slaves Number of slave devices associated with the master
* @param flags Control flags for MCS configuration
* @return On success, 0 is returned
* @return On error, a negative errno code is returned */
__api int ad9361_multichip_sync(struct iio_device *master,
struct iio_device **slaves, unsigned int num_slaves,
unsigned int flags);
/** @brief FMComms5 specific MCS management
* @param ctx A pointer to an iio_context structure
* @param flags Control flags for MCS configuration
* @return On success, 0 is returned
* @return On error, a negative errno code is returned */
__api int ad9361_fmcomms5_multichip_sync(
struct iio_context *ctx, unsigned int flags);
/** @brief Baseband rate configuration with generic filter support
* @param dev A pointer to an iio_device structure
* @param rate Rate in samples per second of desired baseband rate
* @return On success, 0 is returned
* @return On error, a negative errno code is returned
*
* <b>NOTE:</b> Three possible filters are loaded based on required rate and
* associated decimation/interpolation. These filters are generally very wide
* band and not waveform specific. */
__api int ad9361_set_bb_rate(struct iio_device *dev, unsigned long rate);
/** @brief Enable or disable transmit and receiver FIRs simultaneously
* @param dev A pointer to an iio_device structure
* @param enable Integer to enable FIRs when 1 or disable when 0
* @return On success, 0 is returned
* @return On error, a negative errno code is returned */
__api int ad9361_set_trx_fir_enable(struct iio_device *dev, int enable);
/** @brief Get current enable value of transmit and receiver FIRs
* @param dev A pointer to an iio_device structure
* @param enable Returned integer value of FIR enabled
* @return On success, 0 is returned
* @return On error, a negative errno code is returned */
__api int ad9361_get_trx_fir_enable(struct iio_device *dev, int *enable);
/** @brief Design custom FIR filter from specific design criteria
* @param parameters A pointer filter designer structure
* @param taps A pointer to taps of designed filter
* @param num_taps A pointer to integer number of taps designed in taps
* @param gain Integer gain for designed filter
* @return On success, 0 is returned
* @return On error, a negative errno code is returned */
__api int ad9361_generate_fir_taps(struct filter_design_parameters *parameters,
short *taps, int *num_taps, int *gain);
/** @brief Calculate the clock path rates for both transmit and receiver paths
* @param tx_sample_rate Sample rate in samples per second of desired baseband rate
* @param rate_gov Rate governor enable setting forcing HB3=3 when enabled
* @param rx_path_clks A pointer to a unsigned long variable where the 6 RX path rates should be stored
* @param tx_path_clks A pointer to a unsigned long variable where the 6 TX path rates should be stored
* @return On success, 0 is returned
* @return On error, a negative errno code is returned */
__api int ad9361_calculate_rf_clock_chain(unsigned long tx_sample_rate,
unsigned long rate_gov,
unsigned long *rx_path_clks,
unsigned long *tx_path_clks);
/** @brief Calculate the clock path rates and default filter settings for both transmit and receiver for a desired baseband rate
* @param fdpTX Filter design parameters structure where TX filter design parameters will be stored
* @param fdpRX Filter design parameters structure where RX filter design parameters will be stored
* @param sample_rate Desired basedband sample rate in samples per second for both RX and TX filter configurations
* @return On success, 0 is returned
* @return On error, a negative errno code is returned */
__api int ad9361_calculate_rf_clock_chain_fdp(struct filter_design_parameters *fdpTX,
struct filter_design_parameters *fdpRX,
unsigned long sample_rate);
/** @brief Baseband rate configuration with custom filter support based on desired baseband sample rate
* @param dev A pointer to an iio_device structure
* @param rate Rate in samples per second of desired baseband rate
* @return On success, 0 is returned
* @return On error, a negative errno code is returned
*
* <b>NOTE:</b> Designed filter will have the following configuration:
* Fpass = rate / 3
* Fstop = Fpass * 1.25
* wnomTX = 1.6 * Fstop
* wnomRX = 1.4 * Fstop */
__api int ad9361_set_bb_rate_custom_filter_auto(struct iio_device *dev,
unsigned long rate);
/** @brief Baseband rate configuration with custom filter support based on desired baseband sample rate and simplified filter configuration
* @param dev A pointer to an iio_device structure
* @param rate Rate in samples per second of desired baseband rate
* @param Fpass Stop edge frequency in hertz of passband
* @param Fstop Start edge frequency in hertz of stopband
* @param wnom_tx TX RF bandwidth of analog filter in hertz
* @param wnom_rx RX RF bandwidth of analog filter in hertz
* @return On success, 0 is returned
* @return On error, a negative errno code is returned */
__api int ad9361_set_bb_rate_custom_filter_manual(struct iio_device *dev,
unsigned long rate, unsigned long Fpass,
unsigned long Fstop, unsigned long wnom_tx,
unsigned long wnom_rx);
/** @brief FMComms5 phase synchronize all TX and RX channels together
* @param ctx A pointer to an iio_context structure
* @param lo Frequency in hertz of LO for TX and RX
* @return On success, 0 is returned
* @return On error, a negative errno code is returned. If -2 is returned calibration failed
*
* <b>NOTES:</b> To perform calibration the following side effects occur:
* - RF bandwidths of both TX and RX are expanded to the current sample rate. It can be changed after calibration without effecting phase synchronization.
* - DDSs are enabled and left on after synchronization. Changing these DDSs or switching to DMA sources will not effect phase synchronization.
* - TX and RX LOs are set to the same frequency based on the input provided. LO changes can invalidate phase synchronization.
* - AGCs are set to manual mode at predetermined hardware gains for TX and RX. Gain changes can invalidate phase synchronization.
*
* Phase synchronization is valid until the LOs are retuned or sample rates change or gains are modified.
*
* <b>External Links:</b>
* - <a href="https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms5-ebz/multi-chip-sync">Detailed information on synchronization process</a>
* - <a href="https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms5-ebz/hardware">Phase synchronization performance can depend on revision of hardware</a>*/
__api int ad9361_fmcomms5_phase_sync(struct iio_context *ctx, long long lo);
/** @} */
#ifdef __cplusplus
}
#endif
#undef __api
#endif /* __AD9361_H__ */