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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Передача данных с ПЛИС через PCIe на ПК, Какова методология, какие подходы, что читать и что писать?
SM
сообщение Dec 12 2014, 16:18
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(spbroma @ Dec 12 2014, 19:13) *
Сейчас почитал в разных местах, везде пишут, мол, до PnP разработка драйверов была сущим адом, когда появилась WDM стало лучше

На самом деле, для несъемных устройств толком ничего не поменялось. Я писал кое что для NT4.0 - конкретно, делал драйвер, который прикидывался Altera ByteBlaster, но работал через совсем другой JTAG. API было в общем, все то же, просто добавился геморрой по обслуживанию PnP-запросов. А вот для съемных устройств, например USB, да, пришла манна небесная sm.gif Куда потом WDF подлил немного дегтя... Да даже не подлил... Ведь и без него живется хорошо (я хорошо знаю WDM, и смотрел на WDF - ну ничего там нету полезного вообще!). Но кто-то зачем-то его сделал, скорее всего, как Вы заметили, вопросы маркетинга, убить старые ОС, заставить пересесть на новые, и заапгрейдить и купить железо, чтобы это так же быстро заработало, как и раньше.
Go to the top of the page
 
+Quote Post
spbroma
сообщение Dec 15 2014, 08:18
Сообщение #17


Участник
*

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



Они обещают более простой интерфейс в WDF. Может, и не врут? Надо попробовать.

Мне кажется, тут ситуация как Python-ом и Си. Если я знаю Си, мне не надо изучать Пайтон , если всё то же я могу сделать более быстрым и за меньшее время на Си. Однако, тому, кто в первый раз слышит фразу "язык программирования", очевидно, работать с Пайтоном будет намного приятнее. И не думаю, что здесь стоит искать никакого другого заговора, кроме как нацеленного на снижение порога входа. А скорость работы и размеры, это плата за плюшки.

К тому же, как я понял, разделение драйвера на работающие в режиме ядра (KMDF) и в пользовательском (UMDF) тоже не на пустом месте получилось, а направлено на то, чтобы по возможности максимально отнести программиста от ядра, чтобы и драйвер работал, но в случае чего система не крашилась.

В общем, эти мысли -- результат моего чтения выходного дня пропагандистской литературы от M$ :)
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 15 2014, 11:06
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(spbroma @ Dec 15 2014, 11:18) *
Они обещают более простой интерфейс в WDF. Может, и не врут? Надо попробовать.


IMHO, попробовать, конечно, можно, но после того, как будете докой в WDM вообще, и в API ядра, в частности, чтобы понимать, что, где, как, и почему.

Потому, что драйвер, и вообще, ядро, это не то место, где можно разбрасываться ресурсами налево-направо.

PS
А что такое user mode driver, я к сожалению вообще не в курсе... И зачем они нужны.
Go to the top of the page
 
+Quote Post
spbroma
сообщение Dec 15 2014, 12:39
Сообщение #19


Участник
*

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



Как я понял, UMDF исполняется не на уровне ядра, что уменьшает вероятность появления бсода при ошибке, а также, позволяет отлаживать и запускать драйвер на той же системе, где он и разрабатывается.
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 15 2014, 12:55
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(spbroma @ Dec 15 2014, 15:39) *
Как я понял, UMDF исполняется не на уровне ядра, что уменьшает вероятность появления бсода при ошибке, а также, позволяет отлаживать и запускать драйвер на той же системе, где он и разрабатывается.


Даже если это и так, то доступ к I/O должен быть через средства виртуализации, не говоря уже о тормознутости реакции на прерывание с переключением контекста в пользовательский режим. Поэтому, я не думаю, что в юзер моде можно реализовать сколько нибудь эффективный драйвер. Как я предполагаю (но, не знаю), это, видимо, только для какого-то очень ограниченного списка подвидов драйверов годится.

А запускать драйвер на той же системе, где он и компилируется, так это всегда без проблем. Кстати, для такой отладки есть жутко удобная утилитка - http://technet.microsoft.com/en-us/sysinte...s/bb896647.aspx
Go to the top of the page
 
+Quote Post
spbroma
сообщение Dec 15 2014, 13:03
Сообщение #21


Участник
*

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



Вообще UMDF ругают. Мол, первая версия убога, а последняя только для 8.1 годится и то не для всех целей. А так KMDF для всего.

Цитата
User-mode programs are not trusted by the Windows core operating system. They run in a
restricted environment that prevents them from compromising other applications or the core operating
system.
Kernel-mode programs-including drivers-are trusted components of the Windows core
operating system. They operate with relatively few restrictions and some corresponding risks.



Хм, интересная утилитка
Go to the top of the page
 
+Quote Post
alexunder
сообщение Dec 15 2014, 14:57
Сообщение #22


unexpected token
****

Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987



Цитата(spbroma @ Dec 15 2014, 17:03) *
Хм, интересная утилитка

И весьма полезная!
С вашего позволения, господа, добавлю свои пять копеек. Во-первых, полностью солидарен с многоуважаемым SM: пользуйтесь WDK или хотя бы попытайтесь. У меня весьма скромный опыт работы с DDK (ныне WDK) - создавал простой драйвер для работы с USB-устройством в режиме Bulk, но впечатлений осталось на всю жизнь. Как Вам предложили ранее, возьмите примеры Microsoft, которые наличиствуют в установленном пакете WDK. Я брал bulkusb, убрал сначала все лишнее, а потом добавил нужное.

Функции драйвера, в том числе и процедуры передачи данных, реализуются посредством так называемых IOCTL-кодов. Обращение к драйверу осуществляется при помощи всего одной функции - DeviceIoControl(), входящей в API Windows, куда засылается IOCTL-код, однозначно определяющий какую процедуру драйверу нужно вызвать и как интерпретировать другие параметры, передаваемые в DeviceIoControl().
Почему-то мне думается, что с программированием PCIe ситуация аналогичная. В любом случае, "вьезжать" в WDK стоит времени и сил, которые на это потребуются (WDF никогда не пользовал).

В качестве документации я пользовался только MSDN, ибо там наличиствует вся необходимая информация. Только в моем случае это была локальная копия именуемая "MSDN 2000" (или 2002, не помню), которая тогда шла на трёх CD, ей было удобнее пользоваться, чем он-лайн версией. Возможно, сейчас существует обновленный вариант.


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 15 2014, 15:02
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(alexunder @ Dec 15 2014, 17:57) *
В качестве документации я пользовался только MSDN, ибо там наличиствует вся необходимая информация. Только в моем случае это была локальная копия именуемая "MSDN 2000" (или 2002, не помню), которая тогда шла на трёх CD, ей было удобнее пользоваться, чем он-лайн версией. Возможно, сейчас существует обновленный вариант.

Эта часть MSDN локально идет внутри WDK - в меню "Пуск": Windows Driver Kits -> WDK 7600.16385.1 -> Help -> WDK Documentation
Go to the top of the page
 
+Quote Post
alexunder
сообщение Dec 15 2014, 15:05
Сообщение #24


unexpected token
****

Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987



Цитата(SM @ Dec 15 2014, 19:02) *
Эта часть MSDN локально идет внутри WDK - в меню "Пуск": Windows Driver Kits -> WDK 7600.16385.1 -> Help -> WDK Documentation

Тем лучше, на мой взгляд. Он-лайн у меня всегда медленно работает. Эх, надо бы какую-нибудь задачу придумать, чтоб с WDK попрактиковаться.


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 15 2014, 15:26
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(alexunder @ Dec 15 2014, 17:57) *
Почему-то мне думается, что с программированием PCIe ситуация аналогичная.

Менее, чем наполовину. Отличие от USB кардинальное - если для USB все делает драйвер, которые под Вашим в стеке, то с PCI/PCIe все делаешь сам - сначала, в обработчике IRP_MJ_PNP/IRP_MN_START_DEVICE, драйвер получает информацию о ресурсах устройства (физические адреса его регионов I/O портов, памяти, и прерывание), а затем работает непосредственно с портами устройства при помощи всяких там WRITE_PORT_UCHAR и иже с ними, а также может производить DMA-операции (режим PCI BusMaster), когда устройство само передает данные в память компьютера - для этого производится блокирование страниц памяти, получение физических адресов этих страниц на шине PCI (PCIe), передача этих адресов в устройство и запуск передачи. Всего этого в USB нету.
То есть, USB, это совсем просто. А PCI, особенно мастер, это уже следующий уровень.
Go to the top of the page
 
+Quote Post
spbroma
сообщение Dec 15 2014, 15:57
Сообщение #26


Участник
*

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



Цитата(alexunder)
С вашего позволения, господа, добавлю свои пять копеек.

Я только рад, что к теме присоединяются новые люди . Спасибо за ваши пять копеек.
Теперь 2:0 в пользу WDM.


Цитата(SM)
Эта часть MSDN локально идет внутри WDK - в меню "Пуск": Windows Driver Kits -> WDK 7600.16385.1 -> Help -> WDK Documentation

Что характерно, WDK 8.1 устанавливается уже без офлайновой справки (или же я не нашел её). А у 7600 всё на месте, чудеса.
Go to the top of the page
 
+Quote Post
otv116
сообщение Jan 22 2015, 14:04
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466



Я тоже столкнулся с проблемой создания своего драйвера под PCIe.
Делал опираясь на toaster (WinDDK\7600.16385.1\src\general\toaster\wdm\func\).
В нем даже херить ничего не пришлось. Правда в нем нет обращений к реальному железу. Но это можно стянуть с упомянутого SM драйвера UART.
Go to the top of the page
 
+Quote Post
habenskiy
сообщение Jan 29 2015, 16:29
Сообщение #28





Группа: Участник
Сообщений: 13
Регистрация: 25-11-14
Пользователь №: 83 819



Здравствуйте.
Так же столкнулся с задачей реализации PCI Express на плате Xilinx.
Как понимаю вы так же запускали пример контроллера памяти на основе Integrated Block for PCI Express. Разбирались ли вы что там к чему? Уже какой день не могу понять как и что в нем работает...
Как я понимаю на сам ip возлагается задача инициализации в системе, фильтрация запросов (пропускает только то, что относится к нашей плате, и не пропускает то, что относиться к другим устройствам подключеным по PCIe), а так же преобразование в пользовательский AXI-интерфейс. Так ли это?
Просто я запустил тестбенч от этого примера и вижу следующую картину:
1) сперва появляются данные на дифпарах pci_exp_rx и pci_exp_tx. На AXI - тишина. Предполагаю что в этот момент как раз и идет инициализация платы.
2) затем появляются данные на axis_rx_tdata, такого вида:
Код
01a0_010f_0400_0001 (04 - конфигурационное чтение?)
d538_d087_01a0_0064 (судя по axis_rx_tkeep=0f  d538_d087 нам безразлично)

01a0_000f_4400_0001 (44 - конфигурационная запись?)
ffff_ffff_01a0_0010
01a0_010f_0400_0001
8881_01bb_01a0_0010 (аналогично axis_rx_tkeep=0f)

01a0_020f_4400_0001
ffff_ffff_01a0_0014
01a0_030f_0400_0001
d151_f891_01a0_0014 (аналогично axis_rx_tkeep=0f)

так повторяется еще для адресов 18, 1с, 20, 24, 30 (если я правильно понял что в ffff_ffff_01a0_00[14] это адрес).
Затем начинается следующая группа данных:
01a0_000f_4400_0001
0000_0000_01a0_0010

01a0_010f_4400_0001
0000_0000_01a0_0014

так повторяется для тех же самых адресов и добавляется следющие:
01a0_0701_4400_0001
0300_0000_01a0_0004

01a0_0801_4400_0001
5f00_0000_01a0_0068

но при этом сигнал валидности axis_rx_tvalid в нуле.
3) вместе с данными появляется сигнал валидности:
Код
axis_rx_tdata:
01a0_090f_4000_0001 (40 - запись?)
0403_0201_01a0_0010

axis_rx_tdata:
01a0_0a0f_0000_0001 (00 - чтение?)
de03_7320_0000_0010 (tkeep = 0f)

axis_[b]tx[/b]_tdata:
01a0_0004_4a00_0001 (4a - завершение чтения?)
0403_0201_01a0_0a10


Вот и не могу понять что за данные передаются без сигнала валидности, что за данные [15:0] во-втором DW и что за данные в третьем DW на axis_tx_tdata...
Если разбирать по полям правильно ли я понимаю на примере:
01a0_0a0f_0000_0001
de03_7320_0000_0010

01a0 - Requester ID
0a - Tag
0f - BE
0000_0001 - атрибуты и порядковый номер
de03_7320 - данные
0000_0010 - адрес
?

Попробовали ли вы действовать по этому сценарию? Получилось ли что то?
Цитата
Сценарий:
1) Сделайте железку с Slave I/O портом, который зажигает светодиод.
2) Сделайте простейший драйвер для нее.
3) Добавьте в железо, например, таймер с прерыванием.
4) Сделайте в драйвере мигалку в прерывании.
5) Сделайте простой мастер - передачу в DMA 4096 байт данных в комп.
6) Сделайте драйвер для этого.
7) ... Ну тут уже сами всем все советовать будете ...
Go to the top of the page
 
+Quote Post
spbroma
сообщение Jan 29 2015, 17:30
Сообщение #29


Участник
*

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



Добрый вечер, добро пожаловать в наше уютное обсуждение:)

Во-первых, да, именно этот проект я и зашил.

Сперва я запустил тестовый драйвер от виндрайвера, убедился, что устройство определяется в системе, что в память можно записывать и считывать. То есть, работающая болванка есть. На этом этапе я решил отложить часть ПЛИС и заняться драйвером.

Как можно заметить по другим моим топикам на этом форуме, я пошел против системы и SM-а :) и соблазнился на рекламируемые прелести WDF. На данный момент это закончилось тем, что отладчик подключается к рабочему компьютеру только когда моё устройство не подключено, что странно и бесполезно. На этой ноте я отчаялся и решил посмотреть и вовсе в сторону Виндрайвера и разобраться в том, что же такого удобного и классного у них есть.

Судя по описанию API действительно, всё радужно и хорошо. Тем более, что пример собирается и работает, а код его не выглядит пугающе. Как я понимаю работу дальше, необходимо научиться создавать на плате прерывания и тут мы погружаемся в пучину корки.

Тестбенч, о котором вы говорите, как-то не попадался мне на глаза, так что ничего прокомментировать не могу. Пока с трудом понимаю, как можно использовать готовый пример для создания собственного проекта. Однако обрабатывать и генерить все сигналы вручную представляется ещё большим мраком и я немного в растерянности. Еще хотелось бы отойти от AXI, а то разбираться ещё и в нём надо.

Вообще, мне достаточно научиться выкидывать прерывания, по которым драйвер читал бы определенную область памяти и всё. А переход от PIO к DMA, видимо, возможен не скоро, так как вообще не понимаю, как сейчас его реализовать.
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 29 2015, 18:36
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(spbroma @ Jan 29 2015, 20:30) *
А переход от PIO к DMA, видимо, возможен не скоро, так как вообще не понимаю, как сейчас его реализовать.

Если вернетесь на рельсы WDM - то смогу объяснить все пошагово, как и что. Так как у меня реализованы и прерывания, и бусмастер.
Go to the top of the page
 
+Quote Post

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

 


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


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