Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > USB перезапуск устройства


Автор: bass 27.9.2014, 01:02
Доброго времени суток.

Суть проблемы такая. Есть некий девайс весящий на УСБ порте. Определяеться как HID устройство. В девайсе стоит ватч дог (Если устройству не приходят команды от программы то он переодически ребутаеться). Бывает такое что девайс подвисает.... Не знаю что присходит но дело в УСБ, очень редко. Причем хост УСБ не понимает сразу что девайс отвалился..... Вач дог срабатывает через 1 мин.... При попытке программы послать данные в УСБ данная функция зависает.... Пока не сработает ватч дог в девайсе..... Хочу избежать данной ситуации.... Есть паралельный поток который отслеживает данное подвисание. Но пользуюсь библиотекой от атмела AtUsbHid..... Закрыть устройство не помогает..... Можно как то послать системе чтобы она ребутнула данный девайс.... Или просто отключила.... Через одну минуту всеравно подцепиться... В какую сторону ковырнуть.

За ранее спасибо.

Автор: Alexeis 27.9.2014, 13:22
  Устройство питается по УСБ или свое питание имеет?

Автор: bass 27.9.2014, 16:03
Хороший вопрос.
Там два устройства...... Причем одно берет питание с USB а второе может питаться от USB и от внешнего питания (Питание МК подаеться с любого источника.)..... Только если не будет питания USB шины второе устройство не инициализирует USB и будет переодически перезагружаться в течение одной минуты.  Могу выкрутиться путем разделения потоков обрабатывающих устройсва..... Просто получаеться виснет одно устройство, тянет за собой подвисание второго... Кода много переписывать, хочеться отделаться малой кровью . Хочеться чтобы система просто поняла что данного устройства нет в системе..... А через одну минуту оно снова подцепиться...

Автор: kuzulis 28.9.2014, 21:42
Попробуй использовать WinAPI функции семейства CM_* / SetupAPI - там много чего интересного...
А вообще, забанили в гугле что-ли? 

Автор: Dem_max 29.9.2014, 18:10
Цитата

Если устройству не приходят команды от программы то он переодически ребутаеться


Это не есть хорошо, не должно быть этого.

Автор: Akira 30.9.2014, 00:01
Это часом не Китайский агрегат для подлючения всевозможных жестких дисков?
Если оно, то у меня эта скотина тоже глючит.
Можно в принципе поискать доки если вы точно назовете устройство и модель, поскольку тут множество ньюансов, без которых можно очень долго растекаться мыслями по дереву.

Автор: bass 5.10.2014, 13:03
Цитата(Dem_max @ 29.9.2014,  18:10)
Цитата

Если устройству не приходят команды от программы то он переодически ребутаеться


Это не есть хорошо, не должно быть этого.


Может быть и не должно.. Но встречалась проблема: Ребутаеться система по причинам не зависящих от моей системы. А устройство винда не подцепляет(Сталкунулся на нескольких машинах)..... Прошивку в устройство писал я. Вернее в два устройства. Ну а работа устройства без прикладного ПО не имеет смысла. Устройство ребутаеться (При этом корректно завершает работу USB). Подцепляеться, ПО видит что устройство в системе и переодически отсылает команду устройству что есть соединение и устройство не ребутаеться. Как то так. Так же есть в ПО тайм аут для нахождения устройсва. 

Автор: Dem_max 6.10.2014, 07:06
Значит что то у тебя с прошивкой, раз винда не определяет.

Автор: bass 9.10.2014, 22:15
Цитата(Dem_max @ 6.10.2014,  07:06)
Значит что то у тебя с прошивкой, раз винда не определяет.

Стандартный пример от атмела. HID устройство.
Встречал что на данные системные блоки также есть устройства которые ребутаються..... На данных системах специфичная материнская плата, может что в биосе выставлено.. Я уже задавал данный вопрос на форуме.... Даже вы советовали использовать библиотеки луфа.... Но руки так и не добрались, выкрутиться ребутом. Спасибо за помощь.... Теперь дело в зависании, это происходит редко.... Но бывает... Как правило выяснилось из-за глючного порта USB. Ладно перераспределю потоки....

Автор: borisbn 15.10.2014, 13:07
У меня была похожая проблема, но с Cypress-овским контроллером. Никак не победил. Пришлось сделать коммутатор питания для платы, которым моя программа управляла через GPIO. Если программа видит проблему с платой, то она выключает, а затем включает питание платы. Вроде работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)