1. Понемногу разбираюсь с DMA. Инициализировал прием следующим образом:
Код
rxchan = alt_dma_rxchan_open("/dev/dma");
alt_dma_rxchan_ioctl(rxchan, ALT_DMA_RX_ONLY_ON, (void *)(TEST_COMPONENT_BASE);
alt_dma_rxchan_ioctl(rxchan, ALT_DMA_SET_MODE_32, NULL);
alt_dma_rxchan_prepare (rxchan,rx_buffer,16,done,NULL);
В результате происходит чтение по адресу TEST_COMPONENT_BASE с нулевым смещением. Т.е., насколько я понял, для того, чтобы принять из этого компонента объем данных >4Б (напр., массив регистров), необходимо в нем хранить указатель на следующую порцию отправляемых данных и после каждой отправки 4Б увеличивать его соответственно на 4Б. Думаю, это будет работать, но верное и стандартное ли это решение? (все примеры, которые я рассматривал, принимали данные в компонент по DMA, но не отправляли).
2. Реализованный мной пример чтения данных из TEST_COMPONENT верно работает при их копировании в onchip_memory. Мне же, в конечном итоге, нужно их доставить в SDRAM, где находится программа на Си. В приведенном ниже коде я попытался это реализовать, но данные в массив data не попадают. В чем ошибка: в коде или SOPC ?

Код
#include <stdio.h>
#include <stdlib.h>
#include <sys/alt_dma.h>
#include "system.h"
#include "io.h"
static volatile int rx_done = 0;
alt_dma_txchan txchan;
alt_dma_rxchan rxchan;
int rc;
static void done (void* handle, void* data)
{
rx_done++;
}
void init_dma()
{
if ((rxchan = alt_dma_rxchan_open("/dev/dma")) == NULL)
{
printf ("Failed to open the DMA transmit channel\n");
exit(1);
}
if ((rc = alt_dma_rxchan_ioctl(rxchan, ALT_DMA_RX_ONLY_ON, (void *)(TEST_COMPONENT_BASE))) < 0)
{
printf ("Failed to set the DMA channel to transmit only, reason = %i\n", rc);
exit(1);
}
if ((rc = alt_dma_rxchan_ioctl(rxchan, ALT_DMA_SET_MODE_32, NULL)) < 0)
{
printf ("Failed to set the DMA channel to word access, reason = %i\n", rc);
exit(1);
}
}
int main()
{
unsigned long data[7];
void* rx_buffer = data;
init_dma();
if ((rc = alt_dma_rxchan_prepare (rxchan,rx_buffer,4,done,NULL)) < 0)
{
printf ("Failed to post read request, reason = %i\n", rc);
exit (1);
}
while (!rx_done);
printf ("\nTransfer successful!\n");
printf ("0x%X\n0x%X\n0x%X\n0x%X\n",data[0],data[1],data[2],data[3]);
return 0;
}