Commit 6c6a8b7a authored by Matthieu Cattin's avatar Matthieu Cattin

fmc_adc_spec: Add clear ddr function.

This function makes chained dma as big as possible, using up to 255 pages
for items and only one for the pattern.
parent 895ae368
......@@ -537,4 +537,58 @@ class CFmcAdc100mSpec:
if verbose:
print('DMA finished!')
# Writes pattern to entire carrier's DDR memory
def clear_ddr(self, carrier_addr, pattern, length, verbose=False):
# Configure DMA
# Use page 0 to 254 to store dma items
# Use page 255 to store pattern
items_required = int(math.ceil(length/float(self.DMA_LENGTH)))
if(128*255 < items_required):
print('Required items: %d')%items_required
raise Exception('Current gn4124 class only supports up to %d items.'%(128*255))
if verbose:
print('Required items: %d')%items_required
for num in range(items_required):
if(items_required == num+1):
next_item = 0
item_length = (length-(num*self.DMA_LENGTH))
else:
next_item = 1
item_length = self.DMA_LENGTH
if(0 == num):
item_start_addr = carrier_addr
else:
item_start_addr = carrier_addr + (num*self.DMA_LENGTH)
#print("item nb:%d item_carrier_addr:0x%.8X item_host_addr:0x%.8X item_length:%d next_item:%d)")%(num,item_start_addr,self.dma_pages[num+1],item_length,next_item)
self.gnum.add_dma_item(item_start_addr, self.dma_pages[-1], item_length, 1, next_item)
#self.gnum.print_dma_items()
# Write pattern to DMA reserved host memory page (last page)
self.gnum.set_memory_page(255, pattern)
# Start DMA
self.gnum.start_dma()
# Wait for end of DMA interrupt
if verbose:
print('Wait GN4124 interrupt')
self.gnum.wait_irq()
if verbose:
print('GN4124 interrupt occured')
dma_finished = 0
if verbose:
self.print_irq_controller_regs()
print('irq mask:%.4X')%self.get_irq_en_mask()
while(0 == dma_finished):
irq_src = self.get_irq_source()
#print('IRQ source : %.4X')%irq_src
#print('DMA status: %s')%self.gnum.get_dma_status()
if(irq_src & self.IRQ_SRC_DMA_END):
#print('IRQ source : %.4X')%irq_src
self.clear_irq_source(self.IRQ_SRC_DMA_END)
#print('IRQ source : %.4X')%self.get_irq_source()
dma_finished = 1
time.sleep(0.005)
if verbose:
print('DMA finished!')
###########################################################################
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment