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

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

Сейчас почитал в разных местах, везде пишут, мол, до PnP разработка драйверов была сущим адом, когда появилась WDM стало лучше

На самом деле, для несъемных устройств толком ничего не поменялось. Я писал кое что для NT4.0 - конкретно, делал драйвер, который прикидывался Altera ByteBlaster, но работал через совсем другой JTAG. API было в общем, все то же, просто добавился геморрой по обслуживанию PnP-запросов. А вот для съемных устройств, например USB, да, пришла манна небесная :) Куда потом WDF подлил немного дегтя... Да даже не подлил... Ведь и без него живется хорошо (я хорошо знаю WDM, и смотрел на WDF - ну ничего там нету полезного вообще!). Но кто-то зачем-то его сделал, скорее всего, как Вы заметили, вопросы маркетинга, убить старые ОС, заставить пересесть на новые, и заапгрейдить и купить железо, чтобы это так же быстро заработало, как и раньше.

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


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

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

 

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

 

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

 

В общем, эти мысли -- результат моего чтения выходного дня пропагандистской литературы от M$ :)

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


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

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

 

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

 

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

 

PS

А что такое user mode driver, я к сожалению вообще не в курсе... И зачем они нужны.

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


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

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

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


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

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

 

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

 

А запускать драйвер на той же системе, где он и компилируется, так это всегда без проблем. Кстати, для такой отладки есть жутко удобная утилитка - http://technet.microsoft.com/en-us/sysinte...s/bb896647.aspx

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


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

Вообще 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.

 

 

Хм, интересная утилитка

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


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

Хм, интересная утилитка

И весьма полезная!

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

 

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

Почему-то мне думается, что с программированием PCIe ситуация аналогичная. В любом случае, "вьезжать" в WDK стоит времени и сил, которые на это потребуются (WDF никогда не пользовал).

 

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

 

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


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

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

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

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


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

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

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

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


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

Почему-то мне думается, что с программированием 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, особенно мастер, это уже следующий уровень.

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


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

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

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

Теперь 2:0 в пользу WDM.

 

 

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

Что характерно, WDK 8.1 устанавливается уже без офлайновой справки (или же я не нашел её). А у 7600 всё на месте, чудеса.

 

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


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

Я тоже столкнулся с проблемой создания своего драйвера под PCIe.

Делал опираясь на toaster (WinDDK\7600.16385.1\src\general\toaster\wdm\func\).

В нем даже херить ничего не пришлось. Правда в нем нет обращений к реальному железу. Но это можно стянуть с упомянутого SM драйвера UART.

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


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

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

Так же столкнулся с задачей реализации 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) ... Ну тут уже сами всем все советовать будете ...

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


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

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

 

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

 

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

 

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

 

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

 

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

 

Вообще, мне достаточно научиться выкидывать прерывания, по которым драйвер читал бы определенную область памяти и всё. А переход от PIO к DMA, видимо, возможен не скоро, так как вообще не понимаю, как сейчас его реализовать.

 

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


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

А переход от PIO к DMA, видимо, возможен не скоро, так как вообще не понимаю, как сейчас его реализовать.

Если вернетесь на рельсы WDM - то смогу объяснить все пошагово, как и что. Так как у меня реализованы и прерывания, и бусмастер.

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


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

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

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

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

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

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

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

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

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

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