Тайм-аут USB для массовой передачи, пока он работает под Windows - PullRequest
1 голос
/ 09 марта 2019

[Редактировать: я нашел причину, см. Ниже]

Проблема:

Я создал «драйвер» для устройства в Windows, используя Python (PyUSBи libusb-win32).Хотя это программное обеспечение бесперебойно работает на нескольких компьютерах под управлением Windows, используя мой тестовый ноутбук Linux (Kubuntu 18.10), последовательность массовых записей длиной 512 байт каждый раз после второй объемной передачи 512 байт.

Интересно: ятакже попробовал то же самое, используя VirtualBox.И оказывается, что при использовании гостевой системы Windows через VirtualBox на том же хосте Linux, та же ошибка все еще происходит.Так что это не из-за

Вопрос:

Что может произойти в Linux, не происходит в Windows, что приводит к тайм-ауту [Errno 110]?

Дополнительная информация, если это поможет:

  • В Windows Wireshark показывает разницу во времени между двумя объемными записями по 6 мс для первой и5 мсек для каждого последующего, в то время как в Linux дельта составляет всего около 3 мс, что в основном является результатом операции сна (соответствующий исходный код Python прилагается).Удвоение этого времени ничего не дает.
  • dmesg показывает сообщения типа 'массовая конечная точка ## имеет недопустимый maxpacket 64', где ## - 0x01, 0x08 и 0x81.
  • Устройство имеет только одну конфигурацию.
  • В тестовом ноутбуке есть только разъемы USB 3.0, где на ПК с Windows установлены как USB 3.0, так и 2.0.Я проверил все.
  • Wireshark показывает, что устройство отвечает другим (пустым) объемом при каждой массовой записи в Linux, в то время как в Windows это не отображается.Насколько я понимаю, это потому, что USBPcap не может захватывать рукопожатия под Windows.Но я не уверен в этом, потому что я не знаю, будет ли этот тип ответа действительно классифицироваться как «URB_BULK out».
  • Я попробовал libusb0, libusb1 и OpenUSB в качестве бэкэнда под Linux, но безуспешно.
  • Рассматриваемая массовая передача - это передача встроенного программного обеспечения FPGA на устройство.
  • Я могу связываться с устройством до операции массовой многократной 512 байтовой порции на тех же конечных точках, используя тольконесколько байтов.Код, который затем вызывает тайм-аут, следующий во второй итерации цикла for:
for chunk in chunks: # chunks: array of bytearrays with 512 bytes each
    self.write(0x01,chunk)
    time.sleep(0.003)

[Edit] Причина Я обнаружил, что это происходит толькона моем тестовом ноутбуке с использованием xhci, а не на втором тестовом компьютере с Linux с использованием ehci.Так что это может быть вызвано xhci.У меня пока нет обходного пути, но это, по крайней мере, дает объяснение.

...