Jump to content

    

Konst

Участник
  • Posts

    6
  • Joined

  • Last visited

Reputation

0 Обычный

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Пока что я читаю 15 главу книжки Linux Device Drivers, параллельно пытаясь понять, что от меня потребуется со стороны платы на Lattice. Но из того, что я прочитал, мне показалось, что эта проблема должна возникать, когда устройство и драйвер расшаривают одну область памяти на двоих и используют ее вместе, т.е. и процессор и драйвер пишут в одну и ту же область. Я же собираюсь, как и советовал Flood, выделить несколько буферов под DMA и циклически менять их местами, т.е. каждрый раз перезаряжать PCI-плату, подсовывая ей новый адрес приемного буфера. А проц будет только читать. В таком случае тоже может возникнуть проблема когеренции? Если так, то должны же быть какие-нибудь механизмы, позволяющие решить этот вопрос, кроме как запросить у ос специальный буфер через dma_alloc_coherent?
  2. Не возможно, а совершенно точно. Работу с PCI я не так представлял, но по Вашему возмущению относительно размера буфера из первого поста понял, что где-то не прав
  3. В том то и дело, что буфера для целого кадра на плате может и не оказаться, но даже если бы он и был, то 60 раз в секунду я могу и сам спросить, есть данные или нет. Какой мне тогда смысл от этих прерываний? На отладочной плате есть, конечно, DDR3, но с ней я не хочу связываться. А видеопоток не сильно мощный - 16 бит яркостного сигнала (целимся в формат пикселя, который в V4L2 в Linux называеся Y16) с разрешением 800х600 или 1600х1200 при 25 к/с. Родной памяти плиска имеет 108 блоков по 1024 18-разрядных слова, т.е. всего 1 990 656 бит.
  4. Спасибо за ответ! К сожалению, в примере c DMA прерывания не используются от слова совсем, хост просто все время читает из PCI. Но к примеру мне точно нужно присмотреться, может мне тоже можно будет сделать совсем без прерываний.
  5. Так, ну кое-что получилось. Оставлю тут на всякий случай, вдруг пригодится кому-нибудь. Во-первых, при работе с PCI на Jetson Nano выяснилась интересная особенность - по умолчанию Lattice генерирует ядро, в котором Class Code устройства равен 0x000000. Линух на Jetson как-то странно воспринимает этот код и, не смотря на то, что молча выполняет mmap на BAR'ы, читает всегда 0xFF и ничего не записывает, а попытка в драйвере вызвать pci_enable_device заканчивается кодом 22. Если посмотреть таблицу, то код 0x00000 будет соответствовать Unclassified Non-VGA-Compatible device. Если заменить Class Code на 0xFF (Unassigned Class), то драйвер благополучно прописывается в системе. Во-вторых, на форуме Nvidia нашлась информация (впрочем то сообщение было довольно древним, а сам пока не проверял), что Nvidia Jetson поддерживает только одно прерывание MSI на устройство, а если нужно больше то, пожалуйста, используйте MSI-x. Теперь по поводу прерываний MSI. В одном из примеров (PCIeSGMA) и в ответном для него приложении (написано под винду, исходники поставляются с примером), нашелся тест для прерываний. По нему стало понятно в какие регистры что записывать, чтобы заставить плату поднять линию MSI[0], которая и порождает прерывание. Это прерывание благополучно доставляется до драйвера, о чем сообщает печать в dmesg. Изначально я наивно полагал, что с помощью MSI мне удастся сразу отправить нужные данные на Jetson, а обработчик будет вызываться тогда, когда данные уютно обустроятся в каком-нибудь буфере, но, похоже, я перепутал мечты с реальностью. В связи с чем новый вопрос - насколько быстро система отвечает на прерывания? Сколько прерываний/с можно отправить на хост? От этого зависит размер буфера, который мне придется держать на ПЛИС.
  6. Всем привет! Есть задачка - загнать оцифрованный видеопоток на компьютер. В качестве компьютера используется Nvidia Jetson nano, к нему подключена через PCIe x1 карточка с ПЛИС Lattice ECP5. С платой идет несколько примеров: PCIeBasic, PCIeSGDMA и PCIeThruput. Если я правильно понял, ни в одном из этих примеров MSI не задействован, т.е. во всех случаях инициатором обмена является компьютер. Кто-нибудь использовал прерывания на PCIe IP-ядре от Lattice? Есть у кого-нибудь какая-нибудь дополнительная литература, appnotes, примеры, раскрывающие способы использования IP-ядра? Просто не хотелось бы руками писать свою логику поверх нативного интерфейса IP-ядра и по максимуму использовать инфраструктуру примеров (там используется шина Wishbone, и модули, к которым можно обратиться через маппинг BAR'ов, висят на ней).