-
Notifications
You must be signed in to change notification settings - Fork 48
/
ad9361.h
227 lines (201 loc) · 10.4 KB
/
ad9361.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/*
* 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__ */