Как перезагрузить USB-устройства с помощью Windows API? - PullRequest
8 голосов
/ 12 июня 2009

Знаете ли вы, как использовать Windows XP API для сброса шины USB? Другими словами, я бы хотел, чтобы ОС отключила все USB-устройства, которые в данный момент подключены, а затем снова автоматически обнаружила все.

Мне известно о devcon , и я полагаю, что могу сделать системные вызовы к нему, но я надеюсь на прямой вызов в API.

Ответы [ 4 ]

12 голосов
/ 28 июня 2009

В режиме ядра: Вы можете принудительно подключить определенное USB-устройство, как если бы оно было отключено и снова подключено, отправив IOCTL_INTERNAL_USB_CYCLE_PORT на его PDO. (Это может быть сделано только из режима ядра, например, через вспомогательный драйвер.) Эта операция 'цикла' вызовет сброс USB, после чего устройство будет повторно перечислено. Например, если устройство возвращается с другим дескриптором устройства USB, для него может использоваться другой драйвер.

В режиме пользователя: Это можно сделать, извлекая устройство через API CfgMgr. Например, чтобы перейти через все USB-концентраторы и извлечь все устройства:

  1. Найти все устройства, имеющие интерфейс устройства GUID_DEVINTERFACE_USB_HUB с SetupDiGetClassDevs(... DIGCF_DEVICEINTERFACE).
  2. Перечислить полученный набор информации об устройстве (SetupDiEnumDeviceInfo).
  3. Для каждого устройства получите член DevInst:
    1. Вызывайте CM_Get_Child(DevInst), а затем CM_Get_Sibling несколько раз, чтобы пройти через все дочерние узлы концентратора (то есть устройства USB).
    2. Для каждого дочернего узла звоните CM_Request_Device_Eject.
2 голосов
/ 13 июля 2011

Можно также переключить родительский порт на USB-концентраторе, к которому подключено устройство. Это приведет, среди прочего, к явным действиям по отключению / повторному подключению, поскольку при этом вы увидите всплывающее окно.

Многое из этого плохо документировано, и, честно говоря, у меня сложилось впечатление, что в Microsoft есть всего несколько человек, которые действительно это хорошо понимают. Дизайнерское решение, которое я принял для будущих устройств, которые я проектирую, заключается в том, что я намерен включить функции сторожевого режима с обеих сторон, а также функцию полного сброса на стороне устройства. Таким образом, если устройство обнаруживает, что оно сбито с толку, оно может просто отключить свое питание на секунду и полностью сбросить настройки, если хост не может с ним связаться, он может сделать то же самое, и если устройство думает, что все хорошо, но хост знает лучше, хост может заказать его сброс.

Существует как минимум три API-интерфейса, на которые стоит обратить внимание в этой проблеме: API-интерфейс установки, API-интерфейс Config Manager и различные расширения WMI. Тем не менее, будьте осторожны при погружении в WMI, если вы собираетесь использовать цель Embedded XP, так как вам придется включить в образ ОС множество других вещей, которые в противном случае вам могут не понадобиться.

2 голосов
/ 12 июня 2009

Хорошо, пользователь может использовать API настройки (функции SetupDiXXX) для перечисления USB-устройств в системе, а затем вызывать WinUsb_ResetPipe для каждого, но я не уверен, что это то, что вы ищете. Прошло много времени с тех пор, как я работал с USB-устройствами, но, насколько я помню, стандартного способа сброса устройства не существует (то есть имитация цикла выключения / включения). Если это возможно для определенного устройства, вам необходимо отправить соответствующий IOCTL (используя DeviceIOControl) в драйвер. IOCTL будет варьироваться от производителя к производителю.

0 голосов
/ 15 июня 2009

Насколько я знаю, сделать это невозможно - вы можете выдать команду, чтобы PnP повторно сканировал шину для новых устройств, но это не то же самое, что сброс шины ,

Более того, то, что с аппаратной точки зрения вы произвели сброс шины, не означает, что Windows удалит PDO, которые представляют дочерние элементы концентратора, и переопределит их; драйвер USB-шины может (и делает) делать то, что я описываю (т.е. производить сброс аппаратной шины, не нарушая дерево устройств), и только после устройство не отвечает, оно выдает неожиданное удаление и дергает это из дерева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...