Проблема чтения с устройства с libusb - PullRequest
4 голосов
/ 08 октября 2008

Ситуация такова: у меня есть USB-устройство (пользовательское устройство, с которым я пытаюсь общаться) с двумя конечными точками, одна записывает данные на устройство, одна читает с устройства. Оба являются массовыми переводами. Каждая коммуникационная транзакция имеет вид (1) Записать команду на устройство (2) Прочитать ответ. Я использую libusb (версия 0.1, а не бета-версия 1.0), чтобы фактически осуществлять связь.

В Windows все хорошо. Я могу подключить устройство, запросить интерфейс и общаться счастливо. Однако в Ubuntu (стандартная установка Hardy для настольных компьютеров), хотя я могу подключиться к устройству и выполнить запись на него, все операции чтения завершаются с ошибкой «ошибка отправки URB: неверный аргумент», сообщенной из libusb (код ошибки -22).

Если я проверяю / var / log / messages, я вижу предупреждающее сообщение, зарегистрированное в то же время, что и попытка чтения: это действительно на той шине и это конечная точка 81, с которой я пытаюсь читать).

Итак ... кто-нибудь видел подобную проблему при использовании libusb, или есть идеи, как ее исправить?

Ответы [ 4 ]

2 голосов
/ 13 октября 2008

Оказывается, это была неправильная конфигурация дескрипторов на самом устройстве. lsusb -v показал дополнительный интерфейс, который никогда не использовался и имел единственную изохронную конечную точку 0x81. Так как это никогда не использовалось (и никогда не было проверено, насколько я мог видеть, так что вполне возможно, даже не определено правильно), я полностью удалил его из дескрипторов устройства (в прошивке).

А теперь у меня полностью работающее устройство. Почему linux отказался читать с устройства, но Windows работала нормально, я не знаю, но это определенно привело меня к безумной погоне.

1 голос
/ 09 октября 2008

Мне пришлось взломать правила udev, чтобы создать устройство с нужными разрешениями для работы libusb. Вот так:

SUBSYSTEM=="usb" ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", \
                MODE="0666" SYMLINK+="missile_launcher"

(Это была пусковая установка USB, для которой я писал драйвер.

Также этот фрагмент был необходим, чтобы не конфликтовать с ядром.

if(LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP)
{
    // Detach kernel driver (usbhid) from device interface. (Linux hack)
    usb_detach_kernel_driver_np(launcher, 0);
    usb_detach_kernel_driver_np(launcher, 1);
}

Я не уверен, как это связано с вашей проблемой, но, по крайней мере, есть две возможные точки отказа, которые могут быть связаны.

1 голос
/ 09 октября 2008

Я давно не использовал libusb - но ошибка sysfs указывает на то, что это скорее проблема с ядром, чем с libusb, поэтому я начну с попытки отследить ее. (Не стоит пытаться работать с libusb, пока вы не убедитесь, что ваше ядро ​​правильно обращается к устройству).

Патч на http://kerneltrap.org/mailarchive/linux-usb-devel/2007/10/17/345922 применим к вашему ядру? (Если так, это решает проблему?)

0 голосов
/ 09 октября 2008

Вы можете попробовать WinDriver , это коммерческий инструмент, но у него есть бесплатная полнофункциональная оценка (как-то ограниченная во времени). Вы можете проверить с помощью WinDriver, и если проблема воспроизводима, это может быть ошибка устройства или вашего протокола. Вы не предоставили достаточно информации для определения или анализа.

...