|
Передача данных с ПЛИС через PCIe на ПК, Какова методология, какие подходы, что читать и что писать? |
|
|
|
Dec 11 2014, 13:26
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 23-07-14
Пользователь №: 82 337

|
Здравствуйте!
У меня есть задача: Организовать передачу данных по PCIe с ПЛИС на ПК (Win7 x64).
Имеется: отладочная плача Xilinx vc709 на Virtex-7, опыт работы с ПЛИС Отсутствует: опыт работы на уровне драйверов, работы с PCIe
Подскажите, как правильно и оптимально организовать систему?
Вместе с PCIe IP-core идет пример, в котором реализован контроллер памяти. Взяв триальный WinDriver я смог записывать и считывать байты через тестовое же, но на этот раз виндрайверское приложение. Однако виндрайвер платный, да и функционал мне нужен не то, чтобы выдающийся. Решил подумать на тему написания драйвера.
Поставил VS, WDK, настроил удалённый запуск и отладку драйвера на тестовом компьютере. Теперь настало время решить, в каком направлении двигаться и как это сделать менее болезненно.
Как я понимаю, у меня есть два варианта: 1. Определиться, устройство какого типа я буду формировать на ПЛИС: контроллер памяти, мультимедийное утсройство, что-то ещё и под него писать свой драйвер. 2. Подумать насчёт того, может уже есть драйверы, которые решают мою задачу, останется только сформировать на ПЛИС соответствующую конфигурацию устройства.
Собственно, вопросы к уважаемой публике: 1. Есть ли какие-то стандартные решения или подходы к подобной задачи? И какие? 2. Какой из вариантов лучше? 3. Что почитать?
Буду благодарен за любой совет.
|
|
|
|
|
 |
Ответов
|
Dec 11 2014, 14:15
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Самое главное - с точки зрения драйвера нет разницы, 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, зажечь/погасить его. А дальше уже все как по маслу пойдет, когда это сделаете.
|
|
|
|
|
Dec 11 2014, 15:20
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 23-07-14
Пользователь №: 82 337

|
Спасибо за быстрый отклик :) SM, насчет стандартов я имел в виду какой-то сценарий действий, который позволит быстрее прийти к решению, не изобретая велосипедов. Опыта ни с PCI, ни с PCIe нет, так что, пожалуй, последую вашему совету насчет разбора примера сетевой карты и мигания диодом. Не подскажете какой-нибудь ресурс или литературу (кроме msdn и спецификации PCIe), чтобы можно было проще разобраться и въехать в тему? Нашел много книг про WDM, а сейчас, как я понимаю, WDF -- есть ли принципиальная разница или можно для начала и то почитать? RobFPGA, Цитата Для начала нужно четко понять что за систему Вы строите и что от нее хотите В первом приближении: потоковая передача данных, единицы Гб/с. В остальном жёстких требований нет. Самый простой из приемлемых вариантов: плата всегда молотит данные, компьютер принимает, когда готов. Или он сообщает устройству, что готов и плата начинает передачу. Но в настоящий момент в приоритете скорость реализации прототипа и приемлема любая система, позволяющая с адекватной скоростью передавать данные на ПК. Из IP-корок есть Integrated block for PCIe от Xilinx. Правда, еще предстоит понять, как подружиться с AXI, но это отдельная тема. Цитата Поэтому вариант у Вас один - сначала определитесь со структурой железа. Имеет ли значение то, как сконфигурить корку (какое base class value и проч.), или если я сам буду писать драйвер, то указанный класс устройства мне не важен, так как я сам буду знать, как он отображается в дереве устройств и как к нему обращаться?
|
|
|
|
|
Dec 11 2014, 16:18
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(spbroma @ Dec 11 2014, 18:20)  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 на это хватит, да и если что... В личке скажу  Цитата(spbroma @ Dec 11 2014, 18:20)  Имеет ли значение то, как сконфигурить корку (какое base class value и проч.), или если я сам буду писать драйвер, то указанный класс устройства мне не важен, так как я сам буду знать, как он отображается в дереве устройств и как к нему обращаться? Имеет... Винда может начать обзывать Ваш девайс PCI-PCI мостом (когда там нули), каким угодно адаптером, и т.д., так что, задайте туда нечто, близкое к реальности. Ну и VID/PID такой, чтобы не попасть на готовый драйвер в недрах микрософта...
|
|
|
|
|
Dec 11 2014, 19:33
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 23-07-14
Пользователь №: 82 337

|
Спасибо за разъяснения! 7 пункт воодушевляет :) А что не так с KMDF? Я, читая msdn, я увидел только два пути: UMDF и KMDF. Вот. Или я чего-то не понимаю. А насчёт виндрайвера, я пробовал то, о чем вы бы хотели мне сказать, но что-то там пошло не так. Не помню уже. Какой тип устройства близок к реальности? Multimedia device подойдет?
|
|
|
|
|
Dec 11 2014, 19:53
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(spbroma @ Dec 11 2014, 22:33)  А что не так с 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. Я же не настаиваю... Это лишь мой опыт. Цитата(spbroma @ Dec 11 2014, 22:33)  А насчёт виндрайвера, я пробовал то, о чем вы бы хотели мне сказать, но что-то там пошло не так. Не помню уже. Это вряд ли, что именно то. Там ничего "не так" пойти не может ни при каких условиях. Цитата(spbroma @ Dec 11 2014, 22:33)  Какой тип устройства близок к реальности? Multimedia device подойдет? Я туда загнал 0x118000xx (там 24 бита, а младшие 8 - это ревизия девайса) - получилось как-то типа контроллера сбора данных, или что-то в этом смысле. В общем, от этого зависит только то, как система показывает это устройство, пока не него не установлены драйверы. Надо выбрать что-то адекватное, чтобы юзер не пугался.
|
|
|
|
|
Dec 11 2014, 20:29
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 23-07-14
Пользователь №: 82 337

|
Цитата Я же не настаиваю... Это лишь мой опыт. Я просто не знал о том, что есть другие пути и msdn тщательно скрывает их от неофитов. Ссылки завтра изучу, благодарю. Цитата Это вряд ли, что именно то. Тогда интересно, а в ЛС я почему-то не могу писать. Цитата В общем, от этого зависит только то, как система показывает это устройство, пока не него не установлены драйверы. То есть, это не более чем формальность, вроде разрешения файла в ОС?
|
|
|
|
|
Dec 11 2014, 20:48
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(spbroma @ Dec 11 2014, 23:29)  Тогда интересно, а в ЛС я почему-то не могу писать. Ну, в общем, загляните в реестр в HKLM\Софтварь\Микрософт\Виндовоз NT\КаррентВершн\Network - там три явно лишних, очень характерных значения есть. Вот их удалить, и время тикает с нуля... Вы мало еще тут натусовали сообщений, чтобы ЛС открылись... Цитата(spbroma @ Dec 11 2014, 23:29)  То есть, это не более чем формальность, вроде разрешения файла в ОС?  Да. Потом оно все равно попадет в класс, GUID которого вписан в INF-файле от драйвера. Но, пока драйвера нету, оно будет числится соответственно указанному в configuration space классу. PS. А в MSDN что либо найти без поллитры практически невозможно. Поэтому, ставьте WDK 7600, и открывайте его хелп - через меню "Пуск" - Windows Driver Kits->WDK...->Help->... - там все это есть, куда я Вас в MSDN отправил.
|
|
|
|
|
Dec 12 2014, 08:28
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 23-07-14
Пользователь №: 82 337

|
Я правильно понимаю, что на данный момент есть три варианта написания драйверов под win: 1. WDF. Продвигаемый и развивающийся МС фреймворк. Более гибко и универсально. 2. WDM. То что было до WDF, не поддерживается и не развивается, но работает. 3. Legacy. То, что вы предлагаете, с использованием функций API ядра, тогда как WDF/WDM используют более высокоуровневые обертки? Цитата берите serial.sys (из 2600!!! не из 7600!), и собирайте из него свой драйвер Вы имеете в виду, брать из примеров для WDK 2600? А где их взять, MS подсовывает 8.1, максимум, 7600. И этот драйвер ком-порта, похоже, не совсем то, что вы имели в виду. Тут С++ исходники для сборки KMDF драйвера.
|
|
|
|
|
Dec 12 2014, 13:53
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(spbroma @ Dec 12 2014, 11:28)  Я правильно понимаю, что на данный момент есть три варианта написания драйверов под 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 от него. Цитата(spbroma @ Dec 12 2014, 11:28)  Вы имеете в виду, брать из примеров для 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.
|
|
|
|
|
Dec 12 2014, 15:27
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 23-07-14
Пользователь №: 82 337

|
Цитата WDM == Legacy - это одно и то же. Вот здесь в комментариях к статье наткнулся на фразу: "Вижу стандартный legacy драйвер, а вот ни одного признака WDM не вижу." Я не хочу, да и не в том положении, чтобы спорить и что-то доказывать, наоборот, хочу разобраться в терминологии и собрать всё в ясную картину мира. Там же советуют WDF, но это я как понял дело вкуса и ваше мнение я услышал :) Главное, что, как я понял, WDM ничем не хуже WDF и с помощью WDM можно сделать то же самое, только WDF -- фреймворк над WDM? Тогда получается, что в WDF проекте можно и не использовать WDF плюшки. Так? Цитата Собственно, мне не жалко, цепляю его сода.... Да и ссылка, где взять DDK целиком, гуглится на раз Для этого надо знать что именно гуглить :) С ходу сложно уловить тонкости платформы, особенно если она менялась, переназывалась и вообще. Тем более ожидал увидеть его все-таки на официальном сайте. В общем, спасибо за помощь. Цитата(SM @ Dec 12 2014, 16:53)  А по сути - это WDF вызывает все те же WDM функции, представляя тупую прослойку неясного назначения. В общем, это мой принцип - драйвер и железка должен работать если не на 2000, то хотя бы на XP, и везде выше. Кстати, вот что пишет Википедия: "KMDF также доступен для скачивания для Windows XP и даже Windows 2000, в то время, как UMDF доступен начиная только с Windows XP."
|
|
|
|
Сообщений в этой теме
spbroma Передача данных с ПЛИС через PCIe на ПК Dec 11 2014, 13:26       spbroma Ну хоть направление движения стало чуть яснее, еще... Dec 11 2014, 21:10          SM Цитата(spbroma @ Dec 12 2014, 18:27) Вот ... Dec 12 2014, 16:01           spbroma Сейчас почитал в разных местах, везде пишут, мол, ... Dec 12 2014, 16:13            SM Цитата(spbroma @ Dec 12 2014, 19:13) Сейч... Dec 12 2014, 16:18             spbroma Они обещают более простой интерфейс в WDF. Может, ... Dec 15 2014, 08:18              SM Цитата(spbroma @ Dec 15 2014, 11:18) Они ... Dec 15 2014, 11:06               spbroma Как я понял, UMDF исполняется не на уровне ядра, ч... Dec 15 2014, 12:39                SM Цитата(spbroma @ Dec 15 2014, 15:39) Как ... Dec 15 2014, 12:55                 spbroma Вообще UMDF ругают. Мол, первая версия убога, а по... Dec 15 2014, 13:03                  alexunder Цитата(spbroma @ Dec 15 2014, 17:03) Хм, ... Dec 15 2014, 14:57                   SM Цитата(alexunder @ Dec 15 2014, 17:57) В ... Dec 15 2014, 15:02                    alexunder Цитата(SM @ Dec 15 2014, 19:02) Эта часть... Dec 15 2014, 15:05                    spbroma Цитата(alexunder)С вашего позволения, господа, доб... Dec 15 2014, 15:57                   SM Цитата(alexunder @ Dec 15 2014, 17:57) По... Dec 15 2014, 15:26 RobFPGA Приветствую!
Цитата(spbroma @ Dec 11 201... Dec 11 2014, 14:32 otv116 Я тоже столкнулся с проблемой создания своего драй... Jan 22 2015, 14:04 habenskiy Здравствуйте.
Так же столкнулся с задачей реализац... Jan 29 2015, 16:29 spbroma Добрый вечер, добро пожаловать в наше уютное обсу... Jan 29 2015, 17:30  SM Цитата(spbroma @ Jan 29 2015, 20:30) А пе... Jan 29 2015, 18:36   spbroma Спасибо
Надо будет, все-таки собраться духом. Сей... Jan 29 2015, 18:41 habenskiy ЦитатаТестбенч, о котором вы говорите, как-то не п... Jan 30 2015, 07:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|