Название: Qt и USB Отправлено: andi от Июнь 05, 2006, 05:06 Пишу приложенеи под Qt. Приложение общается с USB-устройством через драйвер и с++библиотеку-оболочку. Основная операция это запрос данных от устройства. Используется обычный вызов read(). За один раз считывается от 10 до 100 кб. Обычно после первого считывания, происходит зависание USB-подсистемы. Иногда очень редко это происходит после 2-3 считывания данных.
Для любопытствующих могу сказать, что ошибка проявляется таким образом: После считывания данных из драйвера, при завершении URB происходит вызов completion handler. Это стандартное поведение любого USB-драйвера. Так вот, при заходе в него обнаруживается, что urb->status = -104. В "linux device drivers 3th" дается описание этой ошибки: -ECONNRESET The urb was unlinked by a call to usb_unlink_urb, and the transfer_flags variable of the urb was set to URB_ASYNC_UNLINK. Получается, что кто-то командует отключить URB. Но я эту команду не даю. Можно конечно предположить, что виновата железка-драйвер-библиотека, но аналогичное(по функционалу) консольное приложение работает безупречно. Отсюда я допускаю мысль, что Qt на каком то этапе вмешивается в работу USB-подсистемы. Кто что думает по этому поводу? Что имеется: slackware 10.2 kernel 2.4.31 Qt 3.3.4 Устройство работает через usb 1.0 (Внешний модкль вводы вывода E14-140, производство L-Card, www.lcard.ru) Название: Re: Qt и USB Отправлено: Dair от Июнь 06, 2006, 09:12 Цитата: "andi" В "linux device drivers 3th" дается описание этой ошибки: -ECONNRESET The urb was unlinked by a call to usb_unlink_urb, and the transfer_flags variable of the urb was set to URB_ASYNC_UNLINK. Получается, что кто-то командует отключить URB. Но я эту команду не даю. Совсем нигде в приложении?.. А по завершении работы? Цитата: "andi" slackware 10.2 kernel 2.4.31 Qt 3.3.4 Думается, где-то сносит крышу при работе с драйвером и многопоточностью. Если у тебя Qt-приложение не заточено под многопоточность, попробуй пересобрать под один поток. Или, может, воспользоваться имеющимися в Qt средствами типа QIODevice/QFile/QDataStream? Название: Qt и USB Отправлено: andi от Июнь 06, 2006, 09:22 Понятно что в конце есть вызов закрыть устройство и т д.
Приложение слинкованно с многопоточностью. Попробую отключить... Насчет использования QDataStream... Не пойму в чем может быть выйгрыш от использования этих компонент? Спасибо что откликнулись. Название: Qt и USB Отправлено: Dair от Июнь 06, 2006, 09:43 Выигрыш может быть в том, что они заточены под многопоточность.
Хотя я сам лично QFile/QDataStream недолюбливаю - тоже всё read()... :-) Напиши лучше, помогла ли пересборка под один поток - интересно же (у меня тоже есть работа с USB из-под Qt) Название: Qt и USB Отправлено: andi от Июнь 06, 2006, 09:54 Пересобрал приложение без многопоточности.
Эффекта не последовало. добавлено спустя 2 минуты: Вобщем залез в модули ядра отвечающие за usb. Нашлепал там диагностических сообщений. Сижу разбираю дамп. Буду искать кто посылает команду на отключение urb. Название: Qt и USB Отправлено: Dair от Июнь 06, 2006, 10:11 А если в качестве теста попробовать читать не из девайса, а с stdin? Или надо в обе стороны?
(можно ко мне в аську стукнуться, 27135449, чтобы тут флейм не разводить) Название: Qt и USB Отправлено: andi от Июнь 06, 2006, 10:30 stdin не поможет.
у меня есть исходники драйвера железяки. Я точно вычленил на каком этапе происходит затык с какими симптомами. Вообще чтение из устройства по сути своей примитивно до безобразия. Происходит банальное копирование данных из буфера драйвера в указатель пользователя. Когда в буфере заканчиваются данные дергается прерывание, на предмет качнуть данные из устройства. Вот и все. Пошел к тебе в аську Название: Qt и USB Отправлено: andi от Июнь 07, 2006, 07:43 Вобщем после совещания с товарищами и нескольких консольных тестов.
Пришел к выводу что скорей всего кривой драйвер. Соответственно с qt подозрения пока сняты. Название: Qt и USB Отправлено: Admin от Июнь 07, 2006, 21:19 у меня на qt тоже были подозрения при USB+webcamera
оказалось проблема в пропускной способности UBS шины |