Доброго времени суток всем!
Наверное, кто-то разбирался с альтровским mSGDMA и сможет помочь немного разобраться.
При написании драйвера под Windows для платы PCI-E дошел до организации транзакций чтения и записи с использованием mSGDMA и сел. Немного не понятно, как работает этот самый mSGDMA с конфигурацией Memory-Mapped to Memory-Mapped.
Допустим в драйвер поступил запрос на чтение. Выполнив необходимые программные действия дело доходит до программирования устройства и собственно нашего mSGDMA. Заносить в дескрипторы необходимо адреса и длину элементов SGL(scatter-gather list), сформированного ОС, т.е. большое число буферов малой длины (4кБ), или же просто записать в дескриптор mSGDMA адрес откуда читать и длину читаемых данных, а дальше он сам разберется что и как ему делать?
Запуск dma передачи начинается автоматически, как только данные из дескриптора передаются в дескрипторное FIFO при установке контрольного бита Go? а как только передача выполняется выставляется прерывание, которое сообщает о выполнении операции? и нужно ли что-то настраивать, чтобы эти прерывания генерировались?
Пока нашел только пример драйвера для Linux, описывающий работу с этим mSGDMA, но еще не совсем в нем разобрался. Здесь есть и описание управляющего регистра дескриптора для разных видов передачи
http://lxr.free-electrons.com/source/drive...tera_msgdmahw.h , но не знаю применимы для они для dma в pci-e.
Откликнитесь, кто-нибудь, пожалуйста. Вопросов, пока много, а понимания мало. Буду благодарен за любую консультацию.