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
228
229
230
231
232
233
234
235
236
|
#!/usr/bin/env python
#
# Copyright 2010 Ettus Research LLC
# Copyright 2018 Ettus Research, a National Instruments Company
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
########################################################################
# Template for raw text data describing registers
# name addr[bit range inclusive] default optional enums
########################################################################
REGS_TMPL="""\
########################################################################
## General
########################################################################
sdio_bidir 0[7] 0 sdio_sdo, sdio
lsb_first 0[6] 0 msb, lsb
soft_reset 0[5] 0
########################################################################
## Rx Power Down
########################################################################
vref_diff_pd 1[7] 0
vref_pd 1[6] 0
rx_digital_pd 1[5] 0
rx_channel_b_pd 1[4] 0
rx_channel_a_pd 1[3] 0
buffer_b_pd 1[2] 0
buffer_a_pd 1[1] 0
all_rx_pd 1[0] 0
########################################################################
## Rx A and B
########################################################################
% for x, i in (('a', 2), ('b', 3)):
byp_buffer_${x} ${i}[7] 0
rx_pga_${x} ${i}[0:4] 0
% endfor
########################################################################
## Rx Misc
########################################################################
hs_duty_cycle 4[2] 0
shared_ref 4[1] 0
clk_duty 4[0] 0
########################################################################
## RX I/F (INTERFACE)
########################################################################
three_state 5[4] 0
rx_retime 5[3] 0 clkout1, clkout2
rx_twos_comp 5[2] 0
inv_rxsync 5[1] 0
mux_out 5[0] 0 rx_mux_mode=1, dual_port_mode=0
########################################################################
## RX Digital
########################################################################
two_channel 6[3] 1 rx_b_dis, both_enb
rx_keep_ve 6[2] 0 pass_pos, pass_neg
rx_hilbert 6[1] 0 dis, enb
decimate 6[0] 0 dis, enb
########################################################################
## TX Power Down
########################################################################
alt_timing_mode 8[5] 0
txoff_enable 8[4] 0
tx_digital_pd 8[3] 0
tx_analog_pd 8[0:2] 0 none=0, txb=4, txa=2, both=7
########################################################################
## Tx Offset and Gain
########################################################################
% for x, i, j, k in (('a', 10, 11, 14), ('b', 12, 13, 15)):
dac_${x}_offset_1_0 ${i}[6:7] 0
dac_${x}_offset_dir ${i}[0] 0 neg_diff, pos_dif
dac_${x}_offset_9_2 ${j}[0:7] 0
dac_${x}_coarse_gain ${k}[6:7] 0
dac_${x}_fine_gain ${k}[0:5] 0
% endfor
tx_pga_gain 16[0:7] 0
########################################################################
## Tx Misc
########################################################################
tx_slave_enable 17[1] 0
tx_pga_mode 17[0] 0 normal, fast
########################################################################
## Tx IF (INTERFACE)
########################################################################
tx_retime 18[6] 1 clkout1=1, clkout2=0
qi_order 18[5] 0 iq, qi
inv_txsync 18[4] 0
tx_twos_comp 18[3] 0
inverse_samp 18[2] 0 rise, fall
edges 18[1] 0 normal, both
interleaved 18[0] 0 single, interleaved
########################################################################
## TX Digital
########################################################################
two_data_paths 19[4] 0 single, both
tx_keep_ve 19[3] 0 pass_pos, pass_neg
tx_hilbert 19[2] 0 dis, enb
interp 19[0:1] 0 1, 2, 4
########################################################################
## TX Modulator
########################################################################
neg_fine_tune 20[5] 0 pos_shift, neg_shift
fine_mode 20[4] 0 bypass, nco
real_mix_mode 20[3] 0 complex, real
neg_coarse_tune 20[2] 0 pos_shift, neg_shift
coarse_mod 20[0:1] 0 bypass, fdac_4, fdac_8
########################################################################
## NCO Tuning Word
########################################################################
ftw_7_0 21[0:7] 0
ftw_15_8 22[0:7] 0
ftw_23_16 23[0:7] 0
########################################################################
## DLL
########################################################################
input_clk_ctrl 24[6] 0 internal, external
adc_div2 24[5] 0 normal, div2
dll_mult 24[3:4] 0 1, 2, 4
dll_pd 24[2] 0
dll_mode 24[0] 0 slow, fast
########################################################################
## Clock Out
########################################################################
clkout2_div_factor 25[6:7] 0 1, 2, 4, 8
inv2 25[5] 0 normal, inverted
inv1 25[1] 0 normal, inverted
dis2 25[4] 0 enb, dis
dis1 25[0] 0 enb, dis
########################################################################
## Aux ADC
########################################################################
% for x, i in (('a2', 26), ('a1', 28), ('b2', 30), ('b1', 32)):
aux_adc_${x}_1_0 ${i}[6:7] 0
aux_adc_${x}_9_2 ${int(1+i)}[0:7] 0
% endfor
########################################################################
## Aux ADC Control
########################################################################
aux_spi 34[7] 0 dis, enb
sel_bnota 34[6] 0 adc_a, adc_b
% for x, i in (('b', 5), ('a', 2)):
refsel_${x} 34[${i}] 0 external, internal
select_${x} 34[${int(i-1)}] 0 aux_adc2, aux_adc1
start_${x} 34[${int(i-2)}] 0
% endfor
########################################################################
## Aux ADC Clock
########################################################################
clk_4 35[0] 0 1_2, 1_4
########################################################################
## Aux DAC
########################################################################
% for x, i in (('a', 36), ('b', 37), ('c', 38)):
aux_dac_${x} ${i}[0:7] 0
% endfor
########################################################################
## Aux DAC Update
########################################################################
aux_dac_slave_enable 39[7] 0
aux_dacupdate_c 39[2] 0
aux_dacupdate_b 39[1] 0
aux_dacupdate_a 39[0] 0
########################################################################
## AUX DAC Power Down
########################################################################
aux_dac_pd_a 40[2] 0
aux_dac_pd_b 40[1] 0
aux_dac_pd_c 40[0] 0
########################################################################
## AUX DAC Control
########################################################################
aux_dac_invert_a 41[2] 0
aux_dac_invert_b 41[1] 0
aux_dac_invert_c 41[0] 0
########################################################################
## Sig Delt
########################################################################
sig_delt_3_0 42[4:7] 0
sig_delt_11_4 43[0:7] 0
########################################################################
## ADC Low Power
########################################################################
rx_low_power_mode_r49 49[0:7] 0
rx_low_power_mode_r50 50[0:7] 0
########################################################################
## Chip ID
########################################################################
chip_id 63[0:7] 0
"""
########################################################################
# Header and Source templates below
########################################################################
BODY_TMPL="""
uint8_t get_reg(uint8_t addr){
uint8_t reg = 0;
switch(addr){
% for addr in range(0, 63+1):
case ${addr}:
% for reg in filter(lambda r: r.get_addr() == addr, regs):
reg |= (uint16_t(${reg.get_name()}) & ${reg.get_mask()}) << ${reg.get_shift()};
% endfor
break;
% endfor
}
return reg;
}
void set_reg(uint8_t addr, uint16_t reg){
switch(addr){
% for addr in sorted(set(map(lambda r: r.get_addr(), regs))):
case ${addr}:
% for reg in filter(lambda r: r.get_addr() == addr, regs):
${reg.get_name()} = ${reg.get_type()}((reg >> ${reg.get_shift()}) & ${reg.get_mask()});
% endfor
break;
% endfor
}
}
uint16_t get_write_reg(uint8_t addr){
return (uint16_t(addr) << 8) | get_reg(addr);
}
uint16_t get_read_reg(uint8_t addr){
return (uint16_t(addr) << 8) | (1 << 15);
}
"""
if __name__ == '__main__':
import common; common.generate(
name='ad9862_regs',
regs_tmpl=REGS_TMPL,
body_tmpl=BODY_TMPL,
file=__file__,
)
|