#!/usr/bin/env python # # Copyright 2010 Ettus Research LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ######################################################################## # 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 #end for ######################################################################## ## 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 #end for 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 #end for ######################################################################## ## 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 #end for ######################################################################## ## 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 #end for ######################################################################## ## 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=""" boost::uint8_t get_reg(boost::uint8_t addr){ boost::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 |= (boost::uint16_t($reg.get_name()) & $reg.get_mask()) << $reg.get_shift(); #end for break; #end for } return reg; } void set_reg(boost::uint8_t addr, boost::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()); #end for break; #end for } } boost::uint16_t get_write_reg(boost::uint8_t addr){ return (boost::uint16_t(addr) << 8) | get_reg(addr); } boost::uint16_t get_read_reg(boost::uint8_t addr){ return (boost::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__, )