Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как определить, когда завершена транзакция чтения?
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > ISA/PCI/PCI-X/PCI Express
Dvorkin
Устройство (endpoint) подключено к шине PCI Express. Оно посылает последовательность TLP WrMem, данные записываются в память хоста. Как драйвер, выполняющийся на хосте, может узнать, что данные уже записаны в память?

- pci_map_single()
- старт операции чтения, опрос состояния устройства
- pci_unmap_single()

Можно опрашивать регистр состояния устройства или получить от него прерывание, но все-таки нужно знать, когда полностью завершена транзакция и можно делать pci_unmap_single().
Хост работает под Linux Ubuntu. Устройство сделано на основе Xilinx XAPP1171.
Dvorkin
Цитата(Dvorkin @ May 30 2014, 18:34) *
Устройство (endpoint) подключено к шине PCI Express. Оно посылает последовательность TLP WrMem, данные записываются в память хоста. Как драйвер, выполняющийся на хосте, может узнать, что данные уже записаны в память?

- pci_map_single()
- старт операции чтения, опрос состояния устройства
- pci_unmap_single()

Можно опрашивать регистр состояния устройства или получить от него прерывание, но все-таки нужно знать, когда полностью завершена транзакция и можно делать pci_unmap_single().
Хост работает под Linux Ubuntu. Устройство сделано на основе Xilinx XAPP1171.


Решено.
Сначала я опрашивал регистр состояния CDMA, установленного на endpoint устройстве. Это есть неправильно. После того, как я сделал ожидание прерывания, все проблемы устранились.
novartis
Не понятно, а регистр состояния CDMA намного раньше выставляется, чем кидается прерывание?
Не знаком с XAPP1171, но у нас сделано так:
драйвер дает задание для DMA,
DMA выставляет в регистр состояния "выполняю работу",
после окончания выполнения задания (пересылки всех данных) DMA выставляет в регистр состояния "выполнил работу" и кидает прерывание.
То есть вот в нашей системе абсолютно без разницы - читать регистр состояния или ожидать прерывание.
Наш программист даже опцию такую сделал (для отладочных целей): работать только по регистру состояния или работать по прерываниям.
Dvorkin
Цитата(novartis @ Jun 5 2014, 21:31) *
Не понятно, а регистр состояния CDMA намного раньше выставляется, чем кидается прерывание?
Не знаком с XAPP1171, но у нас сделано так:
драйвер дает задание для DMA,
DMA выставляет в регистр состояния "выполняю работу",
после окончания выполнения задания (пересылки всех данных) DMA выставляет в регистр состояния "выполнил работу" и кидает прерывание.
То есть вот в нашей системе абсолютно без разницы - читать регистр состояния или ожидать прерывание.
Наш программист даже опцию такую сделал (для отладочных целей): работать только по регистру состояния или работать по прерываниям.


Цитата(novartis @ Jun 5 2014, 21:31) *
Не понятно, а регистр состояния CDMA намного раньше выставляется, чем кидается прерывание?

Нет. Можно сделать задержку, но я не делал.

Чтение регистра состояния выполняется по шине PCIe. Может, это мешало? Хотя ведь передача по шине дуплексная.

Но раньше при чтении больших блоков памяти (4 МБ) были ошибки - некоторые фрагменты приемного буфера не заполнялись данными. . Теперь ошибок нет.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.