Sorry, should have been page 25-11 and yes I meant next_descriptor_pointer. There are two DMA controllers that I am testing with one controlled by the PCI Host and one controlled by a NIOS. I want to use the registers directly so that I can use similar code for both. The initialization for the NIOS controlled DMA is below.
void dmaOutputInit()
{
//clear the RUN bit in DMA_OUTPUT
IOWR(DMA_OUTPUT_UCBASE, 1, 0x00000000);
//wait for BUSY bit to clear
while ((IORD(DMA_OUTPUT_UCBASE, 0)) & 0x00000010)
{
//do nothing
}
//set the next_descriptor_pointer in DMA_OUTPUT
IOWR(DMA_OUTPUT_UCBASE, 2, (unsigned int)&dmaDescriptorTable[0]);
//set the next_descriptor_pointer in the descriptor
IOWR(&dmaDescriptorTable[0], 4, (unsigned int)&dmaDescriptorTable[0]);
//set the destination* in the descriptor
IOWR(&dmaDescriptorTable[0], 2, A_WR_CTRL + 4);
//clear the OWNED_BY_HW in the descriptor
IOWR(&dmaDescriptorTable[0], 7, 0);
}
DMA_OUTPUT_UCBASE is the DMA_OUTPUT_BASE from the system.h file ored with 0x80000000 to bypass the cache. If I watch the memory in the memory viewer and step through the function with the debugger the registers never change.