Перейти к содержанию
    

yaxn

Новичок
  • Постов

    1
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Всем здраствуйте, сейчас сижу и разбираюсь с XDMA со стороны хоста. Опыта в программировании драйверов нет. Ситуация такая: на карточке (Ultrascale) есть корка, которая на своей частоте выдает счетчики (два по 16 бит) в FIFO, нарезая их по 2048 байт, а он уже как AXI-Stream подключен к XDMA. При использовании ./dma_from_device -s 0x8000 -f out.bin внутренняя функция read() дает как количество считанного только половину - 0x4000 (замечу, что не всегда, иногда чуть меньше половины, я связываю это с заполненностью FIFO). Такая же ситуация на других размерах чтения вплоть до размера 2048, при котором, ожидаемо, создается только один запрос на 2048Б и он весь и считывается. Полученный файл out.bin представляет собой файл из 2048 Б валидных настоящих данных и 2048 Б нулей. На графике представлены два счетчика, синий полностью перекрывается оранжевым. Я такое поведение связываю с тем, что драйвер при запросе N > 4096 байт данных решает, что они содержат минимум 4096 валидных данных и предполагает N/4096 транзакций, хотя для моего случая количество транзакций и размер трансфера должен быть, судя по всему, N/2048. Я не смог найти способа (возможно, я просто не умею использовать ioctl) принудительной настройки размера транзакции. Текущий последний коммит ветки Xilinx на Github добавляет поддержку EOP в драйвер и в инструменты, но по какой-то причине это не улучшает считывание, зато заметна пропажа данных: Способ использования нескольких вызовов функции read() в целом рабочий и дает непрерывный результат (к слову, не всегда, вероятно есть какая-то проблемка в hw проекте и нужно полностью вычитывать буфер FIFO перед запросом), но, судя по dmesg и отладочном режиме драйвера, такой способ очень расточительный - вместо цепочки DMA запросов создается только один, и происходит много обслуживающих процедур типа xdma engine_start. По таймеру такой подход где-то в 10 раз медленнее функции read() с большим аргументом. ./dma_from_device -s 0x800 -f out.bin -c 32 Я хочу использовать Xilinx драйвер без изменений, так как уверен, что у них опыта явно больше, чем у меня, но я не понимаю, как правильно работать с драйвером. Также у меня есть ощущение, что пакетный способ передачи данных не совсем подходит для потока и нарезки, и лучше использовать AXI-MM, но с этим подходом очень много непонятного в плане hw-дизайна. К слову, на Windows с Xilinx API, представленные в Xilinx Answer 65444 данные с запросом read() на 512 KB приходят валидные и без нулей, что заставляет думать, что hw дизайн сделан верно, и проблема только в софте. Алсо, исходники на Windows драйвер лежат в сети
×
×
  • Создать...