|
PCI Express: Как правильно реализовать систему? |
|
|
|
Aug 11 2015, 06:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Приветствую. Подскажите, как правильно реализовать систему? Есть плата HTG-V7-G3, принимает данные по 10G Ethernet и надо запихнуть эти данные в ПК под управлением Linux.
Пока добавил в проект FPGA ядро AXI Bridge for PCI Express Gen3 Subsystem, GPIO (повесил на светодиод), Timer (прерывание от таймера завёл на PCIe bridge). Всё это повесил на PCIe:BAR0. Под Linux сделал простенький драйвер для PCI, который умеет писать регистры периферии. На прерывание от PCIe (таймера) повесил обработчик который "моргает" GPIO. Драйвер выделяет буфер памяти, адрес буфера записываю в регистры моста AXIBAR2PCIEBAR_0U, AXIBAR2PCIEBAR_0L - могу писать данные с FPGA в буфер выделенный драйвером. Т.е. умею писать/читать данные и со стороны AXI и со стороны PCIe.
Посмотрел как работает символьный драйвер. Выделяется буфер памяти, его могу писать/читать из user space. Счас нужно добавить DMA, хочу использовать ядро CDMA от Xilinx (уже посмотрел, как оно работает).
Не совсем понимаю, как лучше собрать все эти куски вместе? Кто должен выступать инициатором передачи? Пока вижу такой путь. Система стартует и драйвер настраивает всю периферию. По заполнению буфера в FPGA на PCIe bridge идёт прерывание. Драйвер видит, что пришло прерывание, и запускает CDMA. CDMA должен успеть перебросить данные в выделенный драйвером буфер. В user space используются: fopen() - для доступа к файлу драйвера, fread() - для чтения данных из буфера драйвера, fclose() - при завершении работы user application. fread() будет работать в пуле, пытаться прочитать нужный объём данных. Возможно, что-то понимаю неправильно и есть верный путь реализации системы?
Нужно ли иметь доступ к управлению периферией в FPGA из user space или достаточно будет все настройки осуществлять из kernel space? Видел, что есть ещё какие-то ioctl, но пока не разобрался, что это такое. Нужно ли оно для моего случая? Спасибо.
|
|
|
|
|
 |
Ответов
|
Aug 14 2015, 10:55
|
Частый гость
 
Группа: Участник
Сообщений: 153
Регистрация: 25-08-08
Из: Санкт-Петербург
Пользователь №: 39 813

|
Цитата(doom13 @ Aug 14 2015, 10:59)  Посмотрел пример драйвера и приложения в xapp1052. Вопросы будут следующие. В проекте для FPGA для передачи данных по PCIe предполагается система состоящая из ядер PCIe Bridge (AXI Bridge for PCI Express Gen3 Subsystem) и CDMA. Прерывание от CDMA заводится на PCIe Bridge (возможно прерывание по заполнению буфера в FPGA). Как правильно разделить задачи по управлению системой между драйвером в kernel space и user space application? Как понял, в xapp1052 весь контроль над системой осуществляет user space application через read, write, ioctl. Обработчик прерывания вообще, кроме вывода сообщений в syslog, ничего не делает. Правильно ли что весь контроль над железом осуществляется пользовательским приложением? Не правильнее ли предоставить пользователю доступ к железу только через read/write (возможно какой-то минимальный набор команд для ioctl для отладки)? Как правильно использовать и обрабатывать прерывание в данной системе? Драйвер выделяет память для обоих ДМА каналов. По виртуальным адресам реализует методы read и write для юзерспейс, физическими адресами буферов инициализирует соответствующие регистры устройства. Можете реализовать блокирующее чтение\запись, в методе где нужно передадите управление ядру, а прерывании разбудите. Для этого придется часть управления регистрами устройства перенести в одуль ядра из user space
|
|
|
|
|
Aug 14 2015, 11:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(карамболь @ Aug 14 2015, 13:55)  Драйвер выделяет память для обоих ДМА каналов. По виртуальным адресам реализует методы read и write для юзерспейс, физическими адресами буферов инициализирует соответствующие регистры устройства. Тут всё понятно и уже работает. Цитата(карамболь @ Aug 14 2015, 13:55)  Можете реализовать блокирующее чтение\запись, в методе где нужно передадите управление ядру, а прерывании разбудите. Для этого придется часть управления регистрами устройства перенести в одуль ядра из user space А вот тут - нет. Где-то встречал про блокирующие чтение/запись, но пока не разобрался. Надо глянуть. Можете расписать по пунктам алгоритм действий по приёму данных (задача описана выше): с чего начинаем и т.д.? Например: Цитата 1) Заполнился буфер в FPGA 2) По заполнению буфера в FPGA мост выдал прерывание в систему ............ N)
|
|
|
|
Сообщений в этой теме
doom13 PCI Express: Как правильно реализовать систему? Aug 11 2015, 06:41 карамболь скачайте xapp1052.zip (?) там уж сами разберетесь,... Aug 11 2015, 10:41 doom13 Цитата(карамболь @ Aug 11 2015, 13:41) ск... Aug 11 2015, 11:24  карамболь Цитата(doom13 @ Aug 11 2015, 15:24) Спаси... Aug 12 2015, 06:38 doom13 Пока читаю xapp1052 и разбираюсь с содержимым архи... Aug 12 2015, 06:39 карамболь спрашивайте если что Aug 13 2015, 08:37 doom13 Цитата(карамболь @ Aug 13 2015, 11:37) сп... Aug 13 2015, 09:30  карамболь Цитата(doom13 @ Aug 13 2015, 13:30) Может... Aug 13 2015, 12:17   doom13 Цитата(карамболь @ Aug 13 2015, 15:17) Не... Aug 13 2015, 12:20 карамболь 3. считали данные, изменили позицию в буфере
4. Юз... Aug 14 2015, 11:34 doom13 Спасибо, понял - надо ещё читать книгу.
Тут хочу ... Aug 14 2015, 11:55 карамболь читайте про отложенные процессы, семафоры. Метод p... Aug 14 2015, 13:02 doom13 Цитата(карамболь @ Aug 14 2015, 16:02) чи... Aug 14 2015, 18:55  карамболь Цитата(doom13 @ Aug 14 2015, 22:55) Спаси... Aug 15 2015, 07:36
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|