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

Взаимодействие через PCI Express

Уважаемые форумчане, буду признателен за помощь.

Ведется разработка устройства на базе FPFA Virtex5. Необходимо реализовать взаимодействие данного устройства с ПК через PCI Express. ПК опознает устройство как Memory Controller и с помощью утилиты PCI Tree можно обращаться к памяти, отображаемую через BAR. Само устройство (PowerPC на плате) выполняет некоторый код по обработке входных данных, а также должно выдавать результат вычислений.

У меня следующие вопросы:

1. Как "пробудить" PowerPC по приему данных от шины PCIe?

2. Как уведомить ПК о готовности результатов вычислений?

 

В дальнейшем предполагается использовать DMA.

Если можете, подскажите шаблон драйвера или что-то совсем простое, но готовое для платформы WinXP 32 bit.

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


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

Подключите ваш PowerPC к pciexpress контроллеру по интерфейсу Lokal Link. По DMA гляньте XAPP1052 и XAPP859, так же полезно глянуть ссылку http://www.xilinx.com/member/pci_exp_kit_ref/

Изменено пользователем ИльяКи

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


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

Подключите ваш PowerPC к pciexpress контроллеру по интерфейсу Lokal Link. По DMA гляньте XAPP1052 и XAPP859, так же полезно глянуть ссылку http://www.xilinx.com/member/pci_exp_kit_ref/

PowerPC подключен к шине PLB, к которой также подключен блок PLBv46 to PCI Full Bridge. У моста установлен флаг Bus Master Enable, чтобы устройство могло выступать в роли мастера на шине PCI Express. Сконфигурированы 2 BAR. Один настроен так, что адресует 4 КБ BRAM. Второй предоставляет прямой доступ к регистрам блока Central DMA (так же на шине PLB). Но вопрос о "пробуждении" PowerPC по завершению передачи данных от ПК еще актуален. Также интересен вопрос как уведомить ПК о готовности результатов вычислений. Возможно через механизм MSI, но опыта не хватает. Подскажите, если кто знает

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


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

2 Techno11

касательно

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

 

касательно

"пробуждении" PowerPC по завершению передачи данных от ПК
что именно вы подразумеваете под пробуждением ?

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


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

что именно вы подразумеваете под пробуждением ?

Извиняюсь за вольную трактовку. Каким образом уведомить PowerPC о появлении в памяти устройства новых данных, чтобы он мог начать их обработку?

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


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

2 Techno11

а прерывание (телепатируя вопрос: от модуля-источника на шине, в вашем случае PLB, её же средствами к процу) чем не подходит ?

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


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

касательнопрерывания, бывают MSI и легаси. Там главное читайте доку на корку к вашему V5 - и всё будет работать. Примеры гляньте которые вам там приводили...

 

Касательно MSI. Если не ошибаюсь, XP их не поддерживает. Да и линукс по умолчанию тоже, надо поддержку МСИ включать. А у микрософта что то в новых версиях(виста,7) что то с этим изменилось?

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


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

2 disel

на XP не проверял, проверял на WinServer2008, SUSE, CentOs, Solaris - MSI нормально работают, так по крайней мере программисты говорят.

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


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

2 Techno11

а прерывание (телепатируя вопрос: от модуля-источника на шине, в вашем случае PLB, её же средствами к процу) чем не подходит ?

Если использовать блок CentralDMA, то он может генерировать прерывание по окончанию передачи. Если же BAR адресовать прямо на ОЗУ, то кто будет генерировать прерывание? Если с записью в устройство стало ясно, то теперь нужно получить результаты. Заранее простите за малые познания и заблуждения про драйверы.

Несколько приложений должны параллельно использовать устройство, чтобы практически в любой момент времени к нему был доступ. С помощью драйвера отправляют команды с данными в него. Что дальше? Устройство произвело вычисления и сгенерировало прерывание. Драйвер выделил буфер для приема результатов. Но как драйверу сообщить приложению о приеме данных и какому именно приложению? Есть вариант с постоянным опросом результатов каждым приложением, но он кажется менее эффективным.

Может ли драйвер вести у себя таблицу обратившихся к нему процессов и использовать, например именованные события, чтобы сообщить обратившимся процессам о готовности результатов?

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


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

Если же BAR адресовать прямо на ОЗУ, то кто будет генерировать прерывание?

Никто, нужно добавлять свою логику.

 

Несколько приложений должны параллельно использовать устройство, чтобы практически в любой момент времени к нему был доступ. С помощью драйвера отправляют команды с данными в него....Устройство произвело вычисления и сгенерировало прерывание.

Это вы не ускоритель для софтового райда ваяете ?

 

Но как драйверу сообщить приложению о приеме данных и какому именно приложению?

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

 

Может ли драйвер вести у себя таблицу обратившихся к нему процессов и использовать, например именованные события, чтобы сообщить обратившимся процессам о готовности результатов?

Может, но довольно часто так получается что быстреее это сделать средствами FPGA.

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


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

Это вы не ускоритель для софтового райда ваяете ?

 

Нет, но в теме аппаратного ускорения определенных вычислений.

 

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

 

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

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


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

Несколько приложений должны параллельно использовать устройство, чтобы практически в любой момент времени к нему был доступ. С помощью драйвера отправляют команды с данными в него. Что дальше? Устройство произвело вычисления и сгенерировало прерывание. Драйвер выделил буфер для приема результатов. Но как драйверу сообщить приложению о приеме данных и какому именно приложению?
Каждое приложение должно открыть ваш драйвер и зарегистрировать в нем себя (с помощью специального IOCTL, который вы должны написать в драйвере). При регистрации драйвер создает у себя Event и отдает его HANDLE приложению. Там же создается управляющий блок (со всеми данными, уникальными для приложения), в него прописывается уникальный ID. Этот ID в дальнейшем используется в обменах с FPGA. Когда FPGA присылает данные для какого то ID, драйвер взводит Event из управляющего блока, соответствующего этому ID. Приложение же тупо ждет на Event'е

 

 

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


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

Каждое приложение должно открыть ваш драйвер и зарегистрировать в нем себя (с помощью специального IOCTL, который вы должны написать в драйвере). При регистрации драйвер создает у себя Event и отдает его HANDLE приложению. Там же создается управляющий блок (со всеми данными, уникальными для приложения), в него прописывается уникальный ID. Этот ID в дальнейшем используется в обменах с FPGA. Когда FPGA присылает данные для какого то ID, драйвер взводит Event из управляющего блока, соответствующего этому ID. Приложение же тупо ждет на Event'е

Огромное спасибо. Буду признателен, если посоветуете литературу соответствующую вашему посту

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


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

Буду признателен, если посоветуете литературу соответствующую вашему посту
Увы, кроме MSDN, DDK/WDK и сэмплов из них ничего в голову не приходит

 

 

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


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

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

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

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

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

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

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

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

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

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