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

 
 
> DMA. Потери данных внутри пакета, Проблемы с инициализацией транзакции?
Nedd
сообщение Aug 10 2015, 11:31
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 5-08-15
Пользователь №: 87 854



Здравствуйте, прочитал на хабре статью про DMA контроллер, было решено повторить.
До момента написания драйвера все работает должным образом. Драйвер скомпилировать не удалось, поэтому было принято решение переписать утилиту phys_addr для автономной работы (инициализация интерфейсов, выделение памяти, запись стартового адреса в регистры, запуск транзакции). И здесь возникла проблема:

Были обнаружены потери данных внутри одной транзакции (данные передаются, но теряются некоторые посылки, зависимости установить не удалось).
Причем, потери возникают в том месте, где устанавливается стартовый бит (младший бит в регистре 0хс0000000) в единицу внутри программы. Если же программу поставить на паузу и вручную установить младший бит в регистре 0хс0000000 в единицу, потерь нет (так как описано в статье, утилиты mem и phys_addr).

Программный код обоих вариантов инициализации идентичен. Signal Tap потерь не видит, данные передаются соотетствующим образом.
Такое чувство, что я не замечаю какой-то нюанс, может кто-нибудь подсказать, в чем дело?


P.S. Cyclone V, de1-soc. Был бы рад руководству (документации), по написанию программ для sgdma ядра.
Слева изображение с потеряными посылками (№1,8,9), справа без потерь. Во вложении программный код.

Сообщение отредактировал Nedd - Aug 10 2015, 11:34
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  dma_test.rar ( 23.99 килобайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Nedd
сообщение Aug 11 2015, 06:59
Сообщение #2





Группа: Участник
Сообщений: 9
Регистрация: 5-08-15
Пользователь №: 87 854



Да, HDL код используется из статьи (в качестве эталонного), прикрепил во вложении. Привел код к более читаемому виду.

Алгоритм работы с dma следующий:
1.Включить интерфейс HPS-to-FPGA: echo 1 > /sys/class/fpga-bridge/hps2fpga/enable
2.Включить интерфейс fpga2sdram: ./mem.o 0xFFC25080 0x3fff
3.Запустить ./phys_addr, она выделит физический адрес, например 0x2d593000.
4.При использовании интерфейса fpga2sdram нужно адресоваться по словам.Так как слова у нас 128-битные, то адрес слова: 0x2d593000 / 16 = 0x2d59300
5. Запись полученного адреса в регистр ./mem.o 0xC0000002 0x2d59300
6. Запишем длину DMA-транзакции в контрольный регистр номер 3. Длина не должны превышать размера страницы,4096 байт. Так как наш fpga2sdram интерфейс имеет ширину в 128 бит, а размер транзакции указывается в словах, то в третий регистр записывается число 256. ./mem.o 0xC0000006 256.
7. Прочитать данные по адресу 0xC0000000, а потом записать их же, но с установленным нулевым битом. ./mem.o 0xC0000000; прочиталось 0x93000000; ./mem.o 0xC0000000 0x93000001
8. Снять утилиту phys_addr с паузы и прочитать данные.

Проблема возникает на этапе 7, причина пока неизвестна.

P.S. Автору написал, но у него пока нет свободного времени.

Сообщение отредактировал Nedd - Aug 11 2015, 07:00
Прикрепленные файлы
Прикрепленный файл  Dma_project_habr.rar ( 1.09 мегабайт ) Кол-во скачиваний: 16
 
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 07:13
Рейтинг@Mail.ru


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