Уважаемые разработчики,я использую в своей SOPC модуль DMA и самописный Verilog-модуль, который производит действия с SDRAM и вычисления по алгоритму.
одна передача пакета информации происходит у меня по такой функции:
Код
void dma_work(const char* name,alt_dma_txchan txchan,void* txdata,alt_dma_rxchan rxchan,void* rx_buffer,int rx_done,void* done/*, int mode*/)
{
rx_done=0;
if ((txchan = alt_dma_txchan_open(name)) == NULL)
{
printf ("Failed to open transmit channel\n");
exit (1);
}else printf("txchan=%s ok\n",name);
if ((rxchan = alt_dma_rxchan_open(name)) == NULL)
{
printf ("Failed to open receive channel\n");
exit (1);
}else printf("rxchan=%s ok\n",name);
alt_avalon_dma_rx_ioctl (txchan_0, (int) ALT_AVALON_DMA_TX_STREAM, fec_in);
if ((rc = alt_dma_txchan_send (txchan,
txdata,
PK_SIZE,
NULL,
NULL)) < 0)
{
printf ("Failed to post transmit request, reason = %i\n", rc);
exit (1);
}else printf("dma_0_txchan_send ok\n");
if ((rc = alt_dma_rxchan_prepare (rxchan,
rx_buffer,
PK_SIZE,
done,
NULL)) < 0)
{
printf ("Failed to post read request, reason = %i\n", rc);
exit (1);
}else printf("dma_0_rxchan_recive ok\n");
}
Проблема в том, что я никак не могу настроить такой режим DMA, при котором она будет читать из порта SRC с адресами (onchip ram) а записывать прочитанное уже по фиксированному адресу порта DST.
То бишь читаем из адресного пространства а то что начитали суём в одну "дырку", то бишь Авалон-порт.
Я уже пробовал ставить бит WCON в DMA control register. Бит устанавливается но ДМА не начинает танзакцию, зависает.
Я пробовал пользоваться HAL API функциями
смотрите, обнаружил интересный момент - в HAL API Refefence 2011 года эти функции называются alt_dma_txchan_ioctl() и alt_dma_rxchan_ioctl() соответственно, а в файле altera_avalon_dma.с они уже проходят под несколько инфыми названиями: alt_avalon_dma_tx_ioctl() и alt_avalon_dma_rx_ioctl() - как считаете, это ничего? причём при использовании и тех и других имён ошибки не выскакивает, но и результат не меняется.
В пояснениях к этим функциям сказано:
Цитата
ioctl() Operations
ioctl() operation requests are defined for both the receive and transmit channels,
which allows you to control the hardware-dependent aspects of the DMA controller.
Two ioctl() functions are defined for the receiver driver and the transmitter driver:
alt_dma_rxchan_ioctl() and alt_dma_txchan_ioctl(). Table 24–2 lists the
available operations. These are valid for both the transmit and receive channels.
Request Meaning
ALT_DMA_SET_MODE_8 Transfers data in units of 8 bits. The parameter arg is ignored.
ALT_DMA_SET_MODE_16 Transfers data in units of 16 bits. The parameter arg is ignored.
ALT_DMA_SET_MODE_32 Transfers data in units of 32 bits. The parameter arg is ignored.
ALT_DMA_SET_MODE_64 Transfers data in units of 64 bits. The parameter arg is ignored.
ALT_DMA_SET_MODE_128 Transfers data in units of 128 bits. The parameter arg is ignored.
ALT_DMA_RX_ONLY_ON Sets a DMA receiver into streaming mode. In this case, data is read continuously from a single location. The parameter arg specifies the address to read from.
ALT_DMA_RX_ONLY_OFF Turns off streaming mode for a receive channel. The parameter arg is ignored.
ALT_DMA_TX_ONLY_ON Sets a DMA transmitter into streaming mode. In this case, data is written continuously to a single location. The parameter arg specifies the address to write to.
ALT_DMA_TX_ONLY_OFF Turns off streaming mode for a transmit channel. The parameter arg is ignored.
Пожалуйста, поясните - ЗАЧЕМ для обоих типов каналов (txchan,rxchan) определены параметры ALT_DMA_RX_ONLY_ON, ALT_DMA_ТX_ONLY_ON... ведь логичней было бы если txchan берёт параметры ALT_DMA_ТX_ONLY_...
а rxchan только касающиеся RX: ALT_DMA_RX_ONLY_... Или я неверно их понимаю? в любом случае, вызов этих функций ничего не меняет и адрес порта куда DMA делает write продолжает инкрементироваться, а я бы хотел чтобы один пакет шёл по первому порту, другой-по другому.