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

Передача данных с ПЛИС через PCIe на ПК

Здравствуйте!

 

У меня есть задача:

Организовать передачу данных по PCIe с ПЛИС на ПК (Win7 x64).

 

Имеется: отладочная плача Xilinx vc709 на Virtex-7, опыт работы с ПЛИС

Отсутствует: опыт работы на уровне драйверов, работы с PCIe

 

Подскажите, как правильно и оптимально организовать систему?

 

Вместе с PCIe IP-core идет пример, в котором реализован контроллер памяти. Взяв триальный WinDriver я смог записывать и считывать байты через тестовое же, но на этот раз виндрайверское приложение. Однако виндрайвер платный, да и функционал мне нужен не то, чтобы выдающийся. Решил подумать на тему написания драйвера.

 

Поставил VS, WDK, настроил удалённый запуск и отладку драйвера на тестовом компьютере. Теперь настало время решить, в каком направлении двигаться и как это сделать менее болезненно.

 

Как я понимаю, у меня есть два варианта:

1. Определиться, устройство какого типа я буду формировать на ПЛИС: контроллер памяти, мультимедийное утсройство, что-то ещё и под него писать свой драйвер.

2. Подумать насчёт того, может уже есть драйверы, которые решают мою задачу, останется только сформировать на ПЛИС соответствующую конфигурацию устройства.

 

Собственно, вопросы к уважаемой публике:

1. Есть ли какие-то стандартные решения или подходы к подобной задачи? И какие?

2. Какой из вариантов лучше?

3. Что почитать?

 

Буду благодарен за любой совет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самое главное - с точки зрения драйвера нет разницы, PCI это, или PCIe. Поэтому, если был опыт с PCI - то делайте все точно так же, с точки зрения софта. Если не было опыта, то... Смотрите как пример драйвер, который идет с WDK (7600), в src\general\pcidrv\wdm - там довольно сложный драйвер, сетевой карты (Intel 82557/82558 based PCI Ethernet Adapter). Но, главное, не сама работа с сетью, а базовые вещи - как получаются адреса ресурсов железки, как прицепиться к прерыванию, как писать/читать эти самые ресурсы платы. Вот на базе этого и делайте свой драйвер. На самом деле, это не сложно. Сначала отрезать от него почти все (включая обработку всех IOCTL и READ/WRITE), оставив только минимум, получение ресурсов, регистрацию девайса в системе, и пр. PnP. А затем, добавлять по чуть-чуть свое. Ну и научиться писать INF - файл.

 

Что касается каких-то "стандартностей", тут Вам не УСБ, нет стандартов. Да, если Вы сделаете, например, UART, совместимый по всем портам с 16550, то без проблем повесите на него микрософтовский serial.sys, но это UART. А что-то сложнее делать, уже не выйдет подделаться под какую-то чужую железяку.

 

В общем, сделайте сначала железяку, которая через порт в I/O Space умеет зажечь/погасить светодиод. И напишите драйвер к ней, который имеет один IOCTL, зажечь/погасить его. А дальше уже все как по маслу пойдет, когда это сделаете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

У меня есть задача:

Организовать передачу данных по PCIe с ПЛИС на ПК (Win7 x64).

...

Подскажите, как правильно и оптимально организовать систему?

Для начала нужно четко понять что за систему Вы строите и что от нее хотите -

какие данные (непрерывный поток, пакеты, одиночные слова, ...), каков суммарный трафик, кто инициатор передачи, требования к задержке передачи, структура/интерфейс/параметры управления, наличие готовых IP корок, ....? .

 

Как я понимаю, у меня есть два варианта:

1. Определиться, устройство какого типа я буду формировать на ПЛИС: контроллер памяти, мультимедийное утсройство, что-то ещё и под него писать свой драйвер.

2. Подумать насчёт того, может уже есть драйверы, которые решают мою задачу, останется только сформировать на ПЛИС соответствующую конфигурацию устройства.

Драйвер должен "знать" железо которое вы реализуете в FPGA с точностью до регистра/бита. Поэтому вариант у Вас один - сначала определитесь со структурой железа.

 

Собственно, вопросы к уважаемой публике:

1. Есть ли какие-то стандартные решения или подходы к подобной задачи? И какие?

2. Какой из вариантов лучше?

3. Что почитать?

1a- все самому, 1b- заказать разработку, 1c-Купить подходящее готовое IP, 1d- найти похожее open source, 1e.., 1f.., ...

2. Нужно определить Ваши критерии "лучше"

 

Сомневаюсь что Вы найдете готовые драйвера под Win. Обычно сорцы драйверов только под linux. Можно посмотреть понять что и как нужно делать. Поищите реф дизайны с PCIe. Есть от Xilinx тот же TRD connectivity kit (c evaluated версией DMA контроллера или их appnote пример с PCIe master. Есть ряд open source проектов с PCIe и DMA на http://opencores.org ну или например тотже NetFPGA.

 

Успехов! Rob.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за быстрый отклик :)

 

SM, насчет стандартов я имел в виду какой-то сценарий действий, который позволит быстрее прийти к решению, не изобретая велосипедов.

Опыта ни с PCI, ни с PCIe нет, так что, пожалуй, последую вашему совету насчет разбора примера сетевой карты и мигания диодом.

 

Не подскажете какой-нибудь ресурс или литературу (кроме msdn и спецификации PCIe), чтобы можно было проще разобраться и въехать в тему? Нашел много книг про WDM, а сейчас, как я понимаю, WDF -- есть ли принципиальная разница или можно для начала и то почитать?

 

RobFPGA,

Для начала нужно четко понять что за систему Вы строите и что от нее хотите

В первом приближении: потоковая передача данных, единицы Гб/с. В остальном жёстких требований нет.

Самый простой из приемлемых вариантов: плата всегда молотит данные, компьютер принимает, когда готов. Или он сообщает устройству, что готов и плата начинает передачу. Но в настоящий момент в приоритете скорость реализации прототипа и приемлема любая система, позволяющая с адекватной скоростью передавать данные на ПК.

 

Из IP-корок есть Integrated block for PCIe от Xilinx. Правда, еще предстоит понять, как подружиться с AXI, но это отдельная тема.

 

Поэтому вариант у Вас один - сначала определитесь со структурой железа.

Имеет ли значение то, как сконфигурить корку (какое base class value и проч.), или если я сам буду писать драйвер, то указанный класс устройства мне не важен, так как я сам буду знать, как он отображается в дереве устройств и как к нему обращаться?

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SM, насчет стандартов я имел в виду какой-то сценарий действий, который позволит быстрее прийти к решению, не изобретая велосипедов.

Опыта ни с PCI, ни с PCIe нет, так что, пожалуй, последую вашему совету насчет разбора примера сетевой карты и мигания диодом.

 

Не подскажете какой-нибудь ресурс или литературу (кроме msdn и спецификации PCIe), чтобы можно было проще разобраться и въехать в тему? Нашел много книг про WDM, а сейчас, как я понимаю, WDF -- есть ли принципиальная разница или можно для начала и то почитать?

 

Сценарий:

1) Сделайте железку с Slave I/O портом, который зажигает светодиод.

2) Сделайте простейший драйвер для нее.

3) Добавьте в железо, например, таймер с прерыванием.

4) Сделайте в драйвере мигалку в прерывании.

5) Сделайте простой мастер - передачу в DMA 4096 байт данных в комп.

6) Сделайте драйвер для этого.

7) ... Ну тут уже сами всем все советовать будете ...

 

Не изобретая велосипедов... Я забыл главное! В WDK 2600 - WinDDK\2600\src\kernel\serial - драйвер UART 16C550 и иже с ними... Эту микросхемы каждый школьник знает, как она работает, какие у нее порты, и т.п. Драйвер там прост как валенок. Вот его берите, и обрезайте сначала до минимума (убрав ВЕСЬ I/O - read, write, ioctl), и потом добавляя сначала свои IOCTL, а потом, может быть, и read/write, правда, последние часто не нужны. Так что сетевую карту - отставить! Вот с чего надо начинать.

 

Ресурс... Я ничем, кроме msdn, спецификаций, гугля и исходников (как и serial.sys, и сетевухи, так и верилог-исходников от китов), не пользовался, поэтому не знаю... Также не знаю, что такое WDF. Не лезьте в дебри, берите WDK 7600, берите serial.sys (из 2600!!! не из 7600!), и собирайте из него свой драйвер. Не пользуйтесь всякими WDF/UMDF/KMDF и прочими гнилыми соплями C++ными. Кстати, тот же serial в 7600 - уже WDF-ный, мне лично, даже лень вникать стало в эту мутоту... Поэтому за основу - именно serial из 2600 (он БУДЕТ работать и под win 8.1 - если соберете в Win 7 build environment, и будет и под XP).

 

Железо отлаживайте с виндрайвером. С ним и ДМА без проблем отлаживается (проходил). А потом уже на отлаженном железе - свой драйвер. Периода evaluation на это хватит, да и если что... В личке скажу :)

 

 

Имеет ли значение то, как сконфигурить корку (какое base class value и проч.), или если я сам буду писать драйвер, то указанный класс устройства мне не важен, так как я сам буду знать, как он отображается в дереве устройств и как к нему обращаться?

Имеет... Винда может начать обзывать Ваш девайс PCI-PCI мостом (когда там нули), каким угодно адаптером, и т.д., так что, задайте туда нечто, близкое к реальности. Ну и VID/PID такой, чтобы не попасть на готовый драйвер в недрах микрософта...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за разъяснения!

7 пункт воодушевляет :)

 

А что не так с KMDF? Я, читая msdn, я увидел только два пути: UMDF и KMDF. Вот.

 

Или я чего-то не понимаю.

 

А насчёт виндрайвера, я пробовал то, о чем вы бы хотели мне сказать, но что-то там пошло не так. Не помню уже.

 

Какой тип устройства близок к реальности? Multimedia device подойдет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что не так с KMDF? Я, читая msdn, я увидел только два пути: UMDF и KMDF. Вот.

Возможно, это личное, но я терпеть не могу C++, и вообще, в принципе категорически против использования в драйверах чего либо, кроме API операционной системы. Все эти ***F - это внешние либы, хрен знает как что делающие.

 

Вот в MSDN верный путь - http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx и http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx

 

В общем, я предложил - брать serial.sys из DDK версии 2600, как самое простое в понимании и быстрое - но можете идти и своим путем, через *MDF. Я же не настаиваю... Это лишь мой опыт.

 

А насчёт виндрайвера, я пробовал то, о чем вы бы хотели мне сказать, но что-то там пошло не так. Не помню уже.

Это вряд ли, что именно то. Там ничего "не так" пойти не может ни при каких условиях.

 

Какой тип устройства близок к реальности? Multimedia device подойдет?

Я туда загнал 0x118000xx (там 24 бита, а младшие 8 - это ревизия девайса) - получилось как-то типа контроллера сбора данных, или что-то в этом смысле. В общем, от этого зависит только то, как система показывает это устройство, пока не него не установлены драйверы. Надо выбрать что-то адекватное, чтобы юзер не пугался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я же не настаиваю... Это лишь мой опыт.

Я просто не знал о том, что есть другие пути и msdn тщательно скрывает их от неофитов.

 

Ссылки завтра изучу, благодарю.

 

Это вряд ли, что именно то.

Тогда интересно, а в ЛС я почему-то не могу писать.

 

В общем, от этого зависит только то, как система показывает это устройство, пока не него не установлены драйверы.

То есть, это не более чем формальность, вроде разрешения файла в ОС? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда интересно, а в ЛС я почему-то не могу писать.

Ну, в общем, загляните в реестр в HKLM\Софтварь\Микрософт\Виндовоз NT\КаррентВершн\Network - там три явно лишних, очень характерных значения есть. Вот их удалить, и время тикает с нуля...

 

Вы мало еще тут натусовали сообщений, чтобы ЛС открылись...

 

То есть, это не более чем формальность, вроде разрешения файла в ОС? :)

Да. Потом оно все равно попадет в класс, GUID которого вписан в INF-файле от драйвера. Но, пока драйвера нету, оно будет числится соответственно указанному в configuration space классу.

 

PS.

А в MSDN что либо найти без поллитры практически невозможно. Поэтому, ставьте WDK 7600, и открывайте его хелп - через меню "Пуск" - Windows Driver Kits->WDK...->Help->... - там все это есть, куда я Вас в MSDN отправил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну хоть направление движения стало чуть яснее, еще раз спасибо.

 

Вы мало еще тут натусовали сообщений, чтобы ЛС открылись...

Придется пофлудить тогда, а то очень надо одному пользователю написать, да всё никак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я правильно понимаю, что на данный момент есть три варианта написания драйверов под win:

 

1. WDF. Продвигаемый и развивающийся МС фреймворк. Более гибко и универсально.

2. WDM. То что было до WDF, не поддерживается и не развивается, но работает.

3. Legacy. То, что вы предлагаете, с использованием функций API ядра, тогда как WDF/WDM используют более высокоуровневые обертки?

 

берите serial.sys (из 2600!!! не из 7600!), и собирайте из него свой драйвер

Вы имеете в виду, брать из примеров для WDK 2600? А где их взять, MS подсовывает 8.1, максимум, 7600.

 

И этот драйвер ком-порта, похоже, не совсем то, что вы имели в виду. Тут С++ исходники для сборки KMDF драйвера.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я правильно понимаю, что на данный момент есть три варианта написания драйверов под win:

 

1. WDF. Продвигаемый и развивающийся МС фреймворк. Более гибко и универсально.

2. WDM. То что было до WDF, не поддерживается и не развивается, но работает.

3. Legacy. То, что вы предлагаете, с использованием функций API ядра, тогда как WDF/WDM используют более высокоуровневые обертки?

 

WDM == Legacy - это одно и то же. Оно и поддерживается, и развивается, это же API ядра! Оно не может не развиваться, все происходит из него! Вот его и предлагаю. В доказательство, что оно развивается, приведу ссылку на MSDN:

http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx

вот Вам функция нативного API, которая "Available starting with Windows 8"

 

WDF же - это некое извращение-надстройка над WDM, которая делает вот что:

a) Увеличивает код драйвера в размере на порядок из-за линковки этой самой WDF

б) Уменьшает скорость/производительность драйвера.

в) Усложняет жизнь программисту тем, что еще и WDF изучать надо.

г) Делает невозможным работу драйвера под XP и 2000.

д) Возможно, делает еще что-то, о чем мне неизвестно

 

Поэтому, я не понимаю, зачем это нужно. Видимо, чтобы подсадить людей на самые последние винды, ибо под более старым все перестанет работать. А по сути - это WDF вызывает все те же WDM функции, представляя тупую прослойку неясного назначения. В общем, это мой принцип - драйвер и железка должен работать если не на 2000, то хотя бы на XP, и везде выше. (хотя бы потому, что сам работаю только под XP, ибо, к сожалению, все остальное, что старше, совершенно непотребно для работы (не бухгалтером и не секретуткой) сделано). WDK 7600, кстати, под XP все собирает как надо... WDK 8.1 почти не нужен, нужен только signtool от него.

 

 

Вы имеете в виду, брать из примеров для WDK 2600? А где их взять, MS подсовывает 8.1, максимум, 7600.

 

Он, тогда, не WDK, а DDK назывался... Да, из него. Собственно, мне не жалко, цепляю его сода.... Да и ссылка, где взять DDK целиком, гуглится на раз, например, https://winworldpc.com/download/3D08C50C-18...E5-7054D21A8599

 

Драйвер собирается и в DDK 2600, и в WDK 7600 в любом из его build environment командой build. Но, чтобы он работал и в винXP, и в 7 и 8 - его надо собирать в WDK 7600.

serial_src.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

WDM == Legacy - это одно и то же.

Вот здесь в комментариях к статье наткнулся на фразу:

"Вижу стандартный legacy драйвер, а вот ни одного признака WDM не вижу."

 

Я не хочу, да и не в том положении, чтобы спорить и что-то доказывать, наоборот, хочу разобраться в терминологии и собрать всё в ясную картину мира.

Там же советуют WDF, но это я как понял дело вкуса и ваше мнение я услышал :)

 

Главное, что, как я понял, WDM ничем не хуже WDF и с помощью WDM можно сделать то же самое, только WDF -- фреймворк над WDM? Тогда получается, что в WDF проекте можно и не использовать WDF плюшки. Так?

 

Собственно, мне не жалко, цепляю его сода.... Да и ссылка, где взять DDK целиком, гуглится на раз

Для этого надо знать что именно гуглить :) С ходу сложно уловить тонкости платформы, особенно если она менялась, переназывалась и вообще. Тем более ожидал увидеть его все-таки на официальном сайте. В общем, спасибо за помощь.

 

 

 

А по сути - это WDF вызывает все те же WDM функции, представляя тупую прослойку неясного назначения. В общем, это мой принцип - драйвер и железка должен работать если не на 2000, то хотя бы на XP, и везде выше.

Кстати, вот что пишет Википедия:

"KMDF также доступен для скачивания для Windows XP и даже Windows 2000, в то время, как UMDF доступен начиная только с Windows XP."

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот здесь в комментариях к статье наткнулся на фразу:

"Вижу стандартный legacy драйвер, а вот ни одного признака WDM не вижу."

 

Не хочу вникать особо, но, возможно, у кого-то Legacy ассоциируется с до-PnP эпохой (Windows NT 3.5, 4.0). Там, да, совсем все было Legacy. В общем, на самом деле, если драйвер обслуживает IRP_MJ_PNP, то это и есть признак того, что это WDM-драйвер.

 

Там же советуют WDF, но это я как понял дело вкуса и ваше мнение я услышал :)

Ну да, возможно, и вкуса. Возможно, кому-то нравится прицепить к своему автомобилю сзади связку из всякого хлама весом в пять машин, и так вот с грохотом и медленно ездить.

 

Главное, что, как я понял, WDM ничем не хуже WDF и с помощью WDM можно сделать то же самое, только WDF -- фреймворк над WDM? Тогда получается, что в WDF проекте можно и не использовать WDF плюшки. Так?

 

С помощью WDM можно сделать вообще все, что в виндовс можно. WDF - это да, фреймворк над WDM, но ничего не упрощающий, и убивающий совместимость со старыми ОС. Там (наверное) можно использовать и WDM-функции напрямую. Взять тот же serial.sys, но из WDK 7600 - там WDF - а используется налево и направо и WDM. В результате точно та же функциональность. Так что, совершенно неадекватно сравнивать "WDM хуже или нет WDF" - WDM драйвер можно просто написать, а можно написать сложно, используя WDF. Но драйвер все равно будет WDM (Windows Driver MODEL - это модель, и она не менялась с win2000, когда появилась).

 

 

Насчет KMDF и пр. - Ну да, возможно он и доступен и для XP. Но нафига это все надо, когда можно сделать драйвер размером 14336 байт (это реальный размер моего драйвера PCI/PCIe железяки со scatter-gather DMA), и он, ОДИН файл, будет работать везде, от win2000, и до win8.1 32-bit. Ну и отдельно собрать 64-битную версию (ее размер у меня 19456 байт, из того же исходника, естественно, без каких либо правок/добавок).

 

UPD:

Вот импорты из WDF-версии драйвера serial.sys

   WDFLDR.SYS
                18F9C Import Address Table
                1D2D0 Import Name Table
                    0 time date stamp
                    0 Index of first forwarder reference

                  6  WdfVersionBind
                  7  WdfVersionBindClass
                  8  WdfVersionUnbind
                  9  WdfVersionUnbindClass

 

Это на 2000 гарантировано работать не будет. Там нет WDFLDR.SYS!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас почитал в разных местах, везде пишут, мол, до PnP разработка драйверов была сущим адом, когда появилась WDM стало лучше, но всё еще "a challenging task". А вот WDF -- манна небесная, из WDM делает конфетку и вообще "easier to learn and easier to implement robust Windows drivers".

 

Подозреваю, конечно, и влияние маркетологов на эти утверждения :)

 

Теперь картина мира в общих чертах нарисовалась, ушёл в чтение книг и документации.

 

Но нафига это все надо, когда можно сделать драйвер размером 14336 байт

А у KMDF как получается?

Изменено пользователем spbroma

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...