Dvorkin 1 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Устройство (endpoint) подключено к шине PCI Express. Оно посылает последовательность TLP WrMem, данные записываются в память хоста. Как драйвер, выполняющийся на хосте, может узнать, что данные уже записаны в память? - pci_map_single() - старт операции чтения, опрос состояния устройства - pci_unmap_single() Можно опрашивать регистр состояния устройства или получить от него прерывание, но все-таки нужно знать, когда полностью завершена транзакция и можно делать pci_unmap_single(). Хост работает под Linux Ubuntu. Устройство сделано на основе Xilinx XAPP1171. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dvorkin 1 5 июня, 2014 Опубликовано 5 июня, 2014 · Жалоба Устройство (endpoint) подключено к шине PCI Express. Оно посылает последовательность TLP WrMem, данные записываются в память хоста. Как драйвер, выполняющийся на хосте, может узнать, что данные уже записаны в память? - pci_map_single() - старт операции чтения, опрос состояния устройства - pci_unmap_single() Можно опрашивать регистр состояния устройства или получить от него прерывание, но все-таки нужно знать, когда полностью завершена транзакция и можно делать pci_unmap_single(). Хост работает под Linux Ubuntu. Устройство сделано на основе Xilinx XAPP1171. Решено. Сначала я опрашивал регистр состояния CDMA, установленного на endpoint устройстве. Это есть неправильно. После того, как я сделал ожидание прерывания, все проблемы устранились. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novartis 0 5 июня, 2014 Опубликовано 5 июня, 2014 · Жалоба Не понятно, а регистр состояния CDMA намного раньше выставляется, чем кидается прерывание? Не знаком с XAPP1171, но у нас сделано так: драйвер дает задание для DMA, DMA выставляет в регистр состояния "выполняю работу", после окончания выполнения задания (пересылки всех данных) DMA выставляет в регистр состояния "выполнил работу" и кидает прерывание. То есть вот в нашей системе абсолютно без разницы - читать регистр состояния или ожидать прерывание. Наш программист даже опцию такую сделал (для отладочных целей): работать только по регистру состояния или работать по прерываниям. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dvorkin 1 6 июня, 2014 Опубликовано 6 июня, 2014 · Жалоба Не понятно, а регистр состояния CDMA намного раньше выставляется, чем кидается прерывание? Не знаком с XAPP1171, но у нас сделано так: драйвер дает задание для DMA, DMA выставляет в регистр состояния "выполняю работу", после окончания выполнения задания (пересылки всех данных) DMA выставляет в регистр состояния "выполнил работу" и кидает прерывание. То есть вот в нашей системе абсолютно без разницы - читать регистр состояния или ожидать прерывание. Наш программист даже опцию такую сделал (для отладочных целей): работать только по регистру состояния или работать по прерываниям. Не понятно, а регистр состояния CDMA намного раньше выставляется, чем кидается прерывание? Нет. Можно сделать задержку, но я не делал. Чтение регистра состояния выполняется по шине PCIe. Может, это мешало? Хотя ведь передача по шине дуплексная. Но раньше при чтении больших блоков памяти (4 МБ) были ошибки - некоторые фрагменты приемного буфера не заполнялись данными. . Теперь ошибок нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться