реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Доп. настройки DMA не хотят работать
Farsch
сообщение Jul 16 2012, 14:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 2-11-10
Из: СПб
Пользователь №: 60 600



Уважаемые разработчики,я использую в своей 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 продолжает инкрементироваться, а я бы хотел чтобы один пакет шёл по первому порту, другой-по другому.

Go to the top of the page
 
+Quote Post
Farsch
сообщение Jul 19 2012, 12:30
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 2-11-10
Из: СПб
Пользователь №: 60 600



Всё, я разобрался, тему можно сносить.

Итого, DMA memory-to-peripheral mode

Код
alt_dma_rxchan txchan;
if ((txchan = alt_dma_txchan_open("/dev/dma_1")) == NULL){
printf ("Failed to open transmit channel\n");
exit (1);
}
if((rc = alt_dma_txchan_ioctl(txchan,ALT_DMA_SET_MODE_32 ,NULL))<0){
printf("Failed to set mode 32\n");
exit(1);
}
if ((rc = alt_dma_txchan_ioctl(txchan, ALT_DMA_TX_ONLY_ON, (void*) (DESTINATION_PORT_BASE))) < 0){
printf ("Failed to set ioctl, reason = %i\n", rc);
exit (1);
}

if ((rc = alt_dma_txchan_send(txchan, (void*) SOURCE_PORT_BASE, TRANSACTION_LENGTH, done_0, NULL)) < 0){
printf ("Failed to post transmit request, reason = %i\n", rc);
exit (1);
}
while (!rx_done_0);
printf ("Transfer successful!\n");


может кому пригодится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 17:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01344 секунд с 7
ELECTRONIX ©2004-2016