Ранее был разговор о том, как загружать данные из CFI_FLASH в SDRAM. Была проблема в том что глючно происходила запись. Как выяснилось из документации - виноват кэш. И проблема, соответсвенно решилась использованием макросов IOWR/IORD.
Код перекачки одного кадра изображения из флеша в сдрам получился такой:
Код
for (i = 0; i < 614400; i++) {
dst_src = IORD_8DIRECT(CFI_FLASH_0_BASE+f_offset, i);
IOWR_8DIRECT(SDRAM_0_BASE+d_offset, i, dst_src);
}
dst_src = IORD_8DIRECT(CFI_FLASH_0_BASE+f_offset, i);
IOWR_8DIRECT(SDRAM_0_BASE+d_offset, i, dst_src);
}
Как вы понимаете - этот метод уже не устраивает, т.к. процессор загружен. Иными словами, я решил разобраться с прямым доступом к памяти DMA. Вот тут-то и возникли проблемы

Как используем DMA:
Код
alt_dma_txchan txchan;
alt_dma_rxchan rxchan;
int rc, rc1;
if ((txchan = alt_dma_txchan_open("/dev/dma_0")) == NULL) {rc1 = 2;};
if ((rxchan = alt_dma_rxchan_open("/dev/dma_0")) == NULL) {rc1 = 3;};
if ((rc = alt_dma_txchan_send (txchan, (void*)(CFI_FLASH_0_BASE+f_offset), 614400, NULL, NULL)) < 0)
{
rc1 = 4;
}
if ((rc = alt_dma_rxchan_prepare (rxchan, (void*)(SDRAM_0_BASE+d_offset), 614400, dma_done, NULL)) < 0)
{
rc1 = 5;
}
while (!rx_done); //инкремент в функции dma_done
rx_done = 0;
alt_dma_rxchan rxchan;
int rc, rc1;
if ((txchan = alt_dma_txchan_open("/dev/dma_0")) == NULL) {rc1 = 2;};
if ((rxchan = alt_dma_rxchan_open("/dev/dma_0")) == NULL) {rc1 = 3;};
if ((rc = alt_dma_txchan_send (txchan, (void*)(CFI_FLASH_0_BASE+f_offset), 614400, NULL, NULL)) < 0)
{
rc1 = 4;
}
if ((rc = alt_dma_rxchan_prepare (rxchan, (void*)(SDRAM_0_BASE+d_offset), 614400, dma_done, NULL)) < 0)
{
rc1 = 5;
}
while (!rx_done); //инкремент в функции dma_done
rx_done = 0;
Эта последовательность действий получена на основе примера memtest. Результат плачевный - в дебагере видно, что даже результат первых строчек NULL. Почему не открывается канал?
CFI_FLASH_0_BASE+f_offset = адрес картинки во влеше, источник
SDRAM_0_BASE+d_offset = куда копировать, адрес в ОЗУ
Прилагаю также картинки SOPC и настроек DMA.
Помогите разобраться что не так...