2009-06-12 10 views
7

Kennen Sie eine Möglichkeit, die Windows XP-API zum Zurücksetzen des USB-Busses zu verwenden? Mit anderen Worten, ich möchte, dass das Betriebssystem alle derzeit angeschlossenen USB-Geräte ausschaltet und dann automatisch alles neu erkennt.Wie setze ich USB-Geräte mithilfe der Windows-API zurück?

Ich bin bewusst von devcon, und ich nehme an, dass ich Systemaufrufe dazu machen konnte, aber ich hoffe auf einen direkten Anruf in die API.

Antwort

2

Nun, verwenden Sie die Setup-API (SetupDiXXX Funktionen), um die USB-Geräte im System aufzuzählen, und dann WinUsb_ResetPipe auf jedem aufrufen, aber ich bin mir nicht sicher, ob das, was Sie suchen. Es ist eine Weile her, seit ich mit USB-Geräten gearbeitet habe, aber wie ich mich erinnere, gibt es keine Standardmethode, um ein Gerät zurückzusetzen (d. H. Einen Stromausschalt-/Einschaltzyklus zu simulieren). Wenn dies für ein bestimmtes Gerät möglich ist, müssen Sie eine geeignete IOCTL (mit DeviceIOControl) an den Treiber senden. Die IOCTL würde von Hersteller zu Hersteller variieren.

0

Soweit ich weiß, gibt es keine Möglichkeit, dies zu tun - Sie einen Befehl können PnP für neue Geräte Rescan den Bus zu haben, aber das ist nicht das gleiche wie ein Bus-Reset-Ausgabe.

Darüber hinaus, nur weil aus Hardware-Sicht Sie einen Bus-Reset ausgegeben haben bedeutet nicht, dass Windows die PDOs entfernt, die die Kinder des Hubs darstellen und sie neu erkennen; der USB-Bus-Treiber kann (und tut) genau das, was ich beschreibe (dh Hardware-Bus-Reset durchführen, ohne den Gerätebaum zu stören), und nur nach antwortet das Gerät nicht, gibt es die Überraschung Entfernung und reißt es aus dem Baum .

10

Von Kernel-Modus: Sie können ein bestimmtes USB-Gerät erzwingen wieder angeschlossen werden, als ob es unplugged war und replugged wieder, indem sie ein IOCTL_INTERNAL_USB_CYCLE_PORT seine PDO sendet. (Dies kann nur von einem Kernel-Modus aus geschehen, beispielsweise durch einen Hilfs-Treiber.) Diese "Zyklus" -Operation bewirkt, dass ein USB-Reset auftritt, wonach das Gerät erneut aufgelistet wird. Wenn das Gerät beispielsweise mit einem anderen USB-Gerätedeskriptor zurückkommt, kann ein anderer Treiber dafür gefunden werden.

Vom Benutzermodus: Sie können dies tun, indem Sie das Gerät über die CfgMgr-API auswerfen. Zum Beispiel, um alle USB-Hubs zu gehen und alle Geräte auswerfen:

  1. alle Geräte finden Geräteschnittstelle mit GUID_DEVINTERFACE_USB_HUB mit SetupDiGetClassDevs(... DIGCF_DEVICEINTERFACE).
  2. Aufzählung über die zurückgegebenen Geräteinformationen (SetupDiEnumDeviceInfo).
  3. Für jedes Gerät erhalten die DevInst Mitglied:
    1. Invoke CM_Get_Child(DevInst) und dann CM_Get_Sibling wiederholt alle untergeordneten Knoten der Nabe zu gehen (das heißt die USB-Geräte). Rufen Sie für jeden untergeordneten Knoten CM_Request_Device_Eject auf.
2

Es ist möglich, die Eltern-Anschluss an der USB-Hub-Zyklus das Gerät auch angebracht ist. Dies führt unter anderem dazu, dass Sie die Vorgänge zum Trennen/Umstecken trennen, da in diesem Fall ein Popup-Popup angezeigt wird.

Vieles davon ist schlecht dokumentiert, und ehrlich gesagt habe ich den Eindruck, dass es nur eine Handvoll Leute bei Microsoft gibt, die es wirklich gut verstehen.Die Design-Entscheidung, die ich für zukünftige Geräte getroffen habe, die ich entwerfe, ist, dass ich beabsichtige, Watchdog-Funktionalität auf beiden Seiten zu integrieren, sowie eine geräteseitige vollständige Reset-Funktion. Auf diese Weise kann das Gerät, wenn es sich herausstellt, verwirrt sein. Es kann nur eine Sekunde lang seine eigene Energie abschalten und vollständig zurücksetzen, wenn der Host nicht mit ihm kommunizieren kann, könnte es dasselbe tun und wenn das Gerät denkt, dass alles ist Gut, aber der Host weiß es besser, der Host könnte es zum Zurücksetzen befehlen.

Es gibt mindestens drei APIs, die für dieses Problem in Betracht gezogen werden müssen: die Setup-API, die Config Manager-API und verschiedene WMI-Erweiterungen. Seien Sie jedoch vorsichtig beim Eintauchen in WMI, wenn Sie beabsichtigen, ein Embedded XP-Ziel zu verwenden, da Sie viele andere Dinge in Ihr Betriebssystemimage einfügen müssen, die Sie sonst nicht benötigen.

Verwandte Themen