
Появилась необходимость не только передавать в ПК данные из ПЛИС, но и вычитывать из ПК данные в ПЛИС.
Для этого добавил в свой автомат еще один шаг - отправку в ПК из ПЛИС запроса Memory Read Request. В ответ я ожидаю получение нескольких Completion with Data. Но в ответ тишина.
На стороне ПК в линуксе реализован драйвер, выдернул от туда строчки, может это поможет:
Код
addr = dma_map_single( dev, dest, size, DMA_FROM_DEVICE ); // выделение памяти, куда будут писаться данные из ПЛИС в ПК
start( adev, devaddr, addr, devsize, DmaRead ); // команда для ПЛИС, чтобы она начала засылать данные в ПК, в плату сообщается адрес addr выделенной области памяти
...
dma_unmap_single( dev, addr, size, DMA_FROM_DEVICE ); // закрываем выделенную память
start( adev, devaddr, addr, devsize, DmaRead ); // команда для ПЛИС, чтобы она начала засылать данные в ПК, в плату сообщается адрес addr выделенной области памяти
...
dma_unmap_single( dev, addr, size, DMA_FROM_DEVICE ); // закрываем выделенную память
Соответственно для варианта чтения данных из ПК аргумент DMA_FROM_DEVICE был заменен на DMA_TO_DEVICE,
а DmaRead на DmaWrite.
По Signal Tap отслеживаю, что сигналы бегают от PCIE ядра, так как я и задумывал, запрос к ПК на чтение выделенной памяти отсылается, а вот ответ на него не приходит.
При этом плата работает, pcie не отваливается, ПК не виснет.
Вопросы у меня такие:
Имеет ли право плата ПЛИС вообще засылать запросы на чтение (я к тому, что она ведь не ROOT, а Endpoint), хотя write запросы она ведь удачно засылает?
Может в драйвере нужно чего еще прописать, проинициализировать? К сожалению, драйвер писал не я, и всех тонкостей не знаю, и не силен в линукс-программировании.