mirror of
https://github.com/EttusResearch/uhd.git
synced 2026-10-25 17:36:10 +00:00
mpm: read ADC/DAC mapping from RFDC memory
This commit is contained in:
parent
6c6d52fd65
commit
24dd961f10
@ -196,44 +196,21 @@ RF_PLL_ENABLE_RF1_CLK 0x16000[20] 0 enable, disable
|
||||
RF_PLL_ENABLE_RF1_CLK_x2 0x16000[24] 0 enable, disable
|
||||
CLEAR_DATA_CLK_UNLOCKED 0x16000[16] 0 enable, disable
|
||||
MMCM_LOCKED 0x16008[20] ro
|
||||
ADC_TILEMAP_DB0_CHAN0_TILE 0x17000[0:1] ro
|
||||
ADC_TILEMAP_DB0_CHAN0_BLOCK 0x17000[2:3] ro
|
||||
ADC_TILEMAP_DB0_CHAN1_TILE 0x17000[4:5] ro
|
||||
ADC_TILEMAP_DB0_CHAN1_BLOCK 0x17000[6:7] ro
|
||||
ADC_TILEMAP_DB0_CHAN2_TILE 0x17000[8:9] ro
|
||||
ADC_TILEMAP_DB0_CHAN2_BLOCK 0x17000[10:11] ro
|
||||
ADC_TILEMAP_DB0_CHAN3_TILE 0x17000[12:13] ro
|
||||
ADC_TILEMAP_DB0_CHAN3_BLOCK 0x17000[14:15] ro
|
||||
ADC_TILEMAP_DB1_CHAN0_TILE 0x17000[16:17] ro
|
||||
ADC_TILEMAP_DB1_CHAN0_BLOCK 0x17000[18:19] ro
|
||||
ADC_TILEMAP_DB1_CHAN1_TILE 0x17000[20:21] ro
|
||||
ADC_TILEMAP_DB1_CHAN1_BLOCK 0x17000[22:23] ro
|
||||
ADC_TILEMAP_DB1_CHAN2_TILE 0x17000[24:25] ro
|
||||
ADC_TILEMAP_DB1_CHAN2_BLOCK 0x17000[26:27] ro
|
||||
ADC_TILEMAP_DB1_CHAN3_TILE 0x17000[28:29] ro
|
||||
ADC_TILEMAP_DB1_CHAN3_BLOCK 0x17000[30:31] ro
|
||||
DAC_TILEMAP_DB0_CHAN0_TILE 0x17008[0:1] ro
|
||||
DAC_TILEMAP_DB0_CHAN0_BLOCK 0x17008[2:3] ro
|
||||
DAC_TILEMAP_DB0_CHAN1_TILE 0x17008[4:5] ro
|
||||
DAC_TILEMAP_DB0_CHAN1_BLOCK 0x17008[6:7] ro
|
||||
DAC_TILEMAP_DB0_CHAN2_TILE 0x17008[8:9] ro
|
||||
DAC_TILEMAP_DB0_CHAN2_BLOCK 0x17008[10:11] ro
|
||||
DAC_TILEMAP_DB0_CHAN3_TILE 0x17008[12:13] ro
|
||||
DAC_TILEMAP_DB0_CHAN3_BLOCK 0x17008[14:15] ro
|
||||
DAC_TILEMAP_DB1_CHAN0_TILE 0x17008[16:17] ro
|
||||
DAC_TILEMAP_DB1_CHAN0_BLOCK 0x17008[18:19] ro
|
||||
DAC_TILEMAP_DB1_CHAN1_TILE 0x17008[20:21] ro
|
||||
DAC_TILEMAP_DB1_CHAN1_BLOCK 0x17008[22:23] ro
|
||||
DAC_TILEMAP_DB1_CHAN2_TILE 0x17008[24:25] ro
|
||||
DAC_TILEMAP_DB1_CHAN2_BLOCK 0x17008[26:27] ro
|
||||
DAC_TILEMAP_DB1_CHAN3_TILE 0x17008[28:29] ro
|
||||
DAC_TILEMAP_DB1_CHAN3_BLOCK 0x17008[30:31] ro
|
||||
RFDC_INFO_DB0_XTRA_RESAMP 0x18000[0:3] ro
|
||||
RFDC_INFO_DB0_SPC_RX 0x18000[4:6] ro
|
||||
RFDC_INFO_DB0_SPC_TX 0x18000[7:9] ro
|
||||
RFDC_INFO_DB1_XTRA_RESAMP 0x18000[16:19] ro
|
||||
RFDC_INFO_DB1_SPC_RX 0x18000[20:22] ro
|
||||
RFDC_INFO_DB1_SPC_TX 0x18000[23:25] ro
|
||||
########################################################################
|
||||
## RFDC information
|
||||
########################################################################
|
||||
RFDC_INFO_BLOCK_MODE[16] 0x17000[0:1] 0 ENABLED, RESERVED1, RESERVED2, DISABLED
|
||||
RFDC_INFO_BLOCK[16] 0x17000[2:3] 0
|
||||
RFDC_INFO_TILE[16] 0x17000[4:5] 0
|
||||
RFDC_INFO_CHANNEL[16] 0x17000[8:9] 0
|
||||
RFDC_INFO_DB[16] 0x17000[10] 0
|
||||
RFDC_INFO_IS_ADC[16] 0x17000[11] 0
|
||||
"""
|
||||
|
||||
########################################################################
|
||||
@ -281,7 +258,7 @@ def set_reg(self, addr, reg):
|
||||
# Now the arrays
|
||||
% for addr in sorted(set([r.get_addr() for r in regs if r.is_array])):
|
||||
<% if_state = 'if' if loop.index == 0 else 'elif' %> \
|
||||
<% reglist = [r for r in regs if r.get_addr() == addr] %>
|
||||
<% reglist = [r for r in regs if r.get_addr() == addr] %>
|
||||
${if_state} ${addr} <= addr < ${addr} + ${reglist[0].get_array_len()} * 4:
|
||||
index = (addr - ${addr}) // 4
|
||||
% for reg in reglist:
|
||||
|
||||
@ -13,6 +13,9 @@ from usrp_mpm.chips.ic_reg_maps.x4xx_rfdc_regmap import x4xx_rfdc_regmap_t
|
||||
from usrp_mpm.mpmutils import poll_with_timeout
|
||||
from usrp_mpm.periph_manager.x4xx_clock_lookup import MMCM_LOCKGROUP_LOOKUP, MMCM_FILTERGROUP_LOOKUP
|
||||
|
||||
# Number of ADCs and DACs in the RFDC.
|
||||
NUM_CONVERTERS = 16
|
||||
|
||||
class RfdcRegsControl:
|
||||
"""
|
||||
Control the FPGA RFDC registers external to the XRFdc API
|
||||
@ -44,8 +47,8 @@ class RfdcRegsControl:
|
||||
self._update_reg('CAL_ENABLE_DB0_CHAN0')
|
||||
self._update_reg('FABRIC_DSP_INFO_BW')
|
||||
self._update_reg('RFDC_INFO_DB0_XTRA_RESAMP')
|
||||
self._update_reg('ADC_TILEMAP_DB0_CHAN0_TILE')
|
||||
self._update_reg('DAC_TILEMAP_DB0_CHAN0_TILE')
|
||||
for conv in range(NUM_CONVERTERS):
|
||||
self._update_reg("RFDC_INFO_BLOCK_MODE", conv)
|
||||
self._regs.save_state()
|
||||
# From now on, we can use _commit() to write registers instead of going
|
||||
# through peek/poke.
|
||||
@ -95,23 +98,31 @@ class RfdcRegsControl:
|
||||
This means there are 2 dboards. On the first dboard, we have 2 channels,
|
||||
and channel 0 uses tile 0, block 1.
|
||||
"""
|
||||
# define helper function to extract content from device memory
|
||||
def get_tuple(db, channel, is_adc):
|
||||
for i in range(NUM_CONVERTERS):
|
||||
if (
|
||||
(
|
||||
self._regs.RFDC_INFO_BLOCK_MODE[i]
|
||||
== self._regs.RFDC_INFO_BLOCK_MODE_t.RFDC_INFO_BLOCK_MODE_ENABLED
|
||||
)
|
||||
and (self._regs.RFDC_INFO_DB[i] == db)
|
||||
and (self._regs.RFDC_INFO_CHANNEL[i] == channel)
|
||||
and (self._regs.RFDC_INFO_IS_ADC[i] == is_adc)
|
||||
):
|
||||
return tuple((self._regs.RFDC_INFO_TILE[i], self._regs.RFDC_INFO_BLOCK[i]))
|
||||
else:
|
||||
raise ValueError(f"Could not find mapping for {db}, {channel}, {is_adc}")
|
||||
|
||||
adc_mapping = tuple(
|
||||
tuple(
|
||||
tuple((
|
||||
getattr(self._regs, f'ADC_TILEMAP_DB{db}_CHAN{chan}_TILE'),
|
||||
getattr(self._regs, f'ADC_TILEMAP_DB{db}_CHAN{chan}_BLOCK'),
|
||||
))
|
||||
for chan in range(num_channels)
|
||||
get_tuple(db, chan, True) for chan in range(num_channels)
|
||||
)
|
||||
for db, num_channels in enumerate(self.get_num_rx_channels())
|
||||
)
|
||||
dac_mapping = tuple(
|
||||
tuple(
|
||||
tuple((
|
||||
getattr(self._regs, f'DAC_TILEMAP_DB{db}_CHAN{chan}_TILE'),
|
||||
getattr(self._regs, f'DAC_TILEMAP_DB{db}_CHAN{chan}_BLOCK'),
|
||||
))
|
||||
for chan in range(num_channels)
|
||||
get_tuple(db, chan, False) for chan in range(num_channels)
|
||||
)
|
||||
for db, num_channels in enumerate(self.get_num_tx_channels())
|
||||
)
|
||||
@ -212,7 +223,7 @@ class RfdcRegsControl:
|
||||
self._poke(
|
||||
self._regs.get_addr("MMCM_LOAD_SEN"),
|
||||
self._regs.get_reg(self._regs.get_addr("MMCM_LOAD_SEN")))
|
||||
|
||||
|
||||
self.log.trace('MMCM Configuration applied, now waiting for MMCM to lock...')
|
||||
self.wait_for_mmcm_drp_done()
|
||||
self.clear_data_clk_unlocked()
|
||||
@ -597,10 +608,10 @@ class RfdcRegsControl:
|
||||
self._poke(addr, self._regs.get_reg(addr))
|
||||
self._regs.save_state()
|
||||
|
||||
def _update_reg(self, reg_name):
|
||||
def _update_reg(self, reg_name, idx=0):
|
||||
"""
|
||||
Update the saved state of a register from the hardware
|
||||
"""
|
||||
addr = self._regs.get_addr(reg_name)
|
||||
reg_val = self._peek(addr)
|
||||
self._regs.set_reg(addr, reg_val)
|
||||
reg_val = self._peek(addr + 4 * idx)
|
||||
self._regs.set_reg(addr + 4 * idx, reg_val)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user