Jump to content

USB Power Switch


erwin

Recommended Posts

Ich benutze schon eine zeitlang eine spezielle Steckdosenleiste zur Abschaltung von Monitor, Soundanlage und DVB-USB. Diese Steckdosenleiste besitzt ein USB-Anschlusskabel welches bei laufendem PC mit der 5V USB-Spannnung gespeist wird und ein Relais in der Leiste auf Durchgang schaltet. Also garantiert kein Standby-Verbrauch bei ausgeschaltetem PC - genauer wenn seine USB-Ports stromlos sind. Die Dinger gibts zur Zeit bei Pearl für etwa 10 Euro.

 

Der Gedanke liegt nahe USB Ports per Software stromlos schalten zu können. Man könnte dann solche Dinge wie

 

- Beleuchtung ein-/ausschalten

- Verdunklungsrollos herunterfahrenn

- Beamer und Soundanlage einschalten

- externe USB-Laufwerke nur bei Bedarf mit Strom versorgen

- usw, usf

 

per Software also z.B per Fernbedienung oder per Command.vbs schalten.

 

 

Lt. Spezifikation gibt es für USB-Hubs die Option die Ports per Kommando stromlos zu schalten. Option heist hier: der Hersteller entscheidet ob er es einbaut.

 

 

Es gibt für Windows eine Bibliothek zum Zugriff auf USB-Geräte:

 

libusb-win32

 

Diese ist Open-Source und steht unter der GPL.

 

Leider unterstützt diese keine USB-Hubs. Glücklicherweise ist sie quelloffen und darf unter den Bedingungen der GPL modifiziert, neu compilliert und vertrieben werden. Ich habe also diese gepatcht und diese für Hubs verfügbar gemacht.

 

Hier eine Anmerkung: Der Ursprungsentwickler hat Hubs explizit per if-Anweisung ausgeschlossen gehabt.

 

ER WIRD SEINE GRÜNDE DAFÜR GEHABT HABEN.

 

Also benutzt die nun zugänglichen Hubs mit Vorsicht und nur zum Powerswitchíng (etwas anderes habe ich nicht getestet)

 

Und.

 

NATÜRLICH OHNE HAFTUNG

 

meinerseits.

 

Bei den Internetrecherchen bin ich auf einige libusb-win32-User gestoßen die sich ihr komplettes USB-System disabled hatten.

 

Und dann hatten sie auch nur noch PC's OHNE PS2, also USB-Tastatur. USB-Maus. Peinlich!

 

Ich selbst hatte solche Probleme nicht. Aber dennoch zur Vorsicht: Systemabbild zum Restore zum Zustand vor den Tests erstellen und Reparatur-CD bereithalten.

 

So nun zur Anwendung. Vorerst hab ich nur eine Windows-XP Version.

 

libusb0.sys nach system32\driver

libusb0.dll nach system32 kopieren

 

install-filter-win.exe benutzen um die Filterdriver der verwendeten HUBs zu installiere/deinstalieren.

 

auf der Kommandozeile (oder eingebettet in *.BAT, *.CMD, COMMAND.VBS)

 

UPS [ -h HUBNUM -p PORTNUM -S { on | off } ]

 

UPS ohne Parameter zeigt die adressierbaren Hubs an, durchnummeriert beginnend mit 0. Dies Nummer ist als HUBNUM zu verwenden. Die PORTNUM beginnt bei 1. Also z.B.:

 

UPS -h 1 -p 3 -s off

 

schaltet den Strom des Port 3 des zweiten Hubs (#0, #1) aus, und

 

UPS -h 1 -p 3 -s on

 

wieder ein.

 

Der Quelltext von UPS.exe liegt GPL gemäß bei.

 

Achtung: mit der Konfiguration Hub an Hub hatte ich noch Probleme.

 

Viel Spass erwin

 

UPS.zip

 

EDIT: 23.04.12

 

Hab das Teil wieder vom Download genommen. Ist bei Fehlanwendung doch ein ziemliches Risiko. Falls dennoch Interesse dann nur über PM.

Edited by erwin
Link to comment
libusb-win32

Erlich gesagt wird mir da schlecht wenn ich libusb höre.. :blush:

Damit habe ich mir schon mindestens 2 Win7 Systeme lahmgelegt.

Ich weis aber nicht ob es mittlerweile Win7 x86/x64 kompatibel ist. Ist ca. 2-3 Jahre her.

 

Das Problem war, dass überhaupt keine USB Geräte mehr funktionierten. Deinstallation von libusb ist laut Beschreibung nicht möglich -> neu aufsetzen. Dazu musste ich eine alte Tastatur mit PS2 anschließen um das System irgendwie steuern zu können.

 

Unter WinXP scheint es aber keine Probleme zu geben.

Link to comment

Hi, Portisch!

 

Damit habe ich mir schon mindestens 2 Win7 Systeme lahmgelegt.

Ich weis aber nicht ob es mittlerweile Win7 x86/x64 kompatibel ist. Ist ca. 2-3 Jahre her.

 

Das Problem war, dass überhaupt keine USB Geräte mehr funktionierten. Deinstallation von libusb ist laut Beschreibung nicht möglich -> neu aufsetzen. Dazu musste ich eine alte Tastatur mit PS2 anschließen um das System irgendwie steuern zu können.

 

Diese Misere hatte ich ja der Fairness halber mitbeschrieben, obwohl es eine Kontraempfehlung ist. Jeder sollte wissen was er tut. Ich hab die Soft trotzdem bereitgestellt weil ich lange nach einer Lösung zum Abschalten der Portstromversorgung gesucht habe und absolut nichts gefunden habe bis auf die oft geäußerte "Expertenmeinung" es gehe prinzipiell nicht. Ich will denjenigen eine Lösung anbieten die wie ich lange gesucht haben.

 

 

Unter WinXP scheint es aber keine Probleme zu geben.

 

In der Tat habe ich bis jetzt nichts Böses festgestellt - unter XP! Ich danke Dir für die Vorwarnung dasss dies unter Windows 7 ganz anders aussehen kann. Ich könnte mir vorstellen das falsche Kerneltreiber libusb0.sys verwendet worden sind.

 

erwin

Link to comment

Es war damals die Version 0.1.12.2 von libusb die ich verwendet habe.

Das Problem dabei war sobald man den Treiber installiert ging gar kein USB Device mehr. Unistall gibt (zumindest damals) ja nicht nicht -> System hinüber.

 

Jetzt ist ja schon auf v1.2.2.0 vielleicht schaut es da besser aus - habe es aber nicht getestet.

 

Nativ über Windows Funktionen kommt man da nicht ran? Libusb muss ja auch irgendwie rankommen.

Link to comment

Das LibUSB Problem, dass dann gar nix mehr geht, ist ein Nutzer-Problem. Wenn man den Filter-Treiber installiert, und nicht aufpasst, was man anklickt, installiert der sich auf alle USB Geräte.

Mittlerweile haben die diesen Inf-Generator überarbeitet und man hat da mehr Kontrolle. Die neue LibUSB ist sogar signiert kann also auf x64 genutzt werden. Über Windows-Boardmittel geht das bestimmt auch, WinUSB wäre da der Ansatzpunkt. Bin mir aber nicht sicher, ob WinUSB auch Hubs ansteuern kann.

Link to comment

Es war damals die Version 0.1.12.2 von libusb die ich verwendet habe.

Das Problem dabei war sobald man den Treiber installiert ging gar kein USB Device mehr. Unistall gibt (zumindest damals) ja nicht nicht -> System hinüber.

 

Jetzt ist ja schon auf v1.2.2.0 vielleicht schaut es da besser aus - habe es aber nicht getestet.

Ich hab Version 1.2.5 verwendet. Dort gibt es neben "Install a device filter" auch "Remove a device filter".

 

 

Nativ über Windows Funktionen kommt man da nicht ran? Libusb muss ja auch irgendwie rankommen.

Bestimmt. Nur ist dann das Programmieren von Kernel Device Drivern angesagt. Eine Programmierklasse für sich, und ob man dann die Probleme los ist wage ich zu bezweifeln. Oder anders gesagt, wenn man die Ursache erkennt, könnnte man es auch in libusb-win32 fixen falls es überhaupt ein Problem der Soft ist. Ich gehe da mit SupaChris. Fehlerhafte Anwendung des libusb-win32 filter installer etwa. Was passiert etwa wenn man "Install a device filter" auf die Root Hubs des Systems anwendet. Ich wills lieber nicht ausprobieren.

 

erwin

Link to comment

PS: jetzt wo ich das so geschrieben habe wird mir doch Einiges klar. Ich schrieb im Ausgangspost:

 

Hier eine Anmerkung: Der Ursprungsentwickler hat Hubs explizit per if-Anweisung ausgeschlossen gehabt.

 

ER WIRD SEINE GRÜNDE DAFÜR GEHABT HABEN.

 

Ich hab nicht verstanden warum er die Hubs ausgeschlossen hat. Aber vielleicht sind die Root Hubs genau die Erklärung. In den früheren Versionen war dies vielleicht möglich, mit den unangenehmen Konsequenzen. Deshalb lieber zur Sicherheit alle Hubs ausschließen.

 

In der von mir vorgestellten Version kann man übrigens keine Root Hubs zur Filter Installation auswählen

 

erwin

Edited by erwin
Link to comment

Naja, die LibUSB als Treiber für einen Hub nehmen ist schon blöd, bei der Installation werden ja dann alle Hubs mit der gleichen VID/PID umgelabelt. Wenn man natürlich einen externen Hub hat, kann man sowas machen. Dann gehts aber auch mit der WinUSB. Theoretisch müsste es aber auch möglich sein, den Windows USB Hub Treiber direkt anzusprechen und zwar über die WinAPI und IOCONTROLS. Müsste man sich mal angucken. Aber das gefrickel ist eigentlich unnötig, es gibt doch den IOWarrior, der kann viel mehr und geht wesentlich besser zu bedienen.

Edited by SupaChris
Link to comment

Naja, die LibUSB als Treiber für einen Hub nehmen ist schon blöd, bei der Installation werden ja dann alle Hubs mit der gleichen VID/PID umgelabelt.

??? Was meinst Du?

 

Wenn man natürlich einen externen Hub hat, kann man sowas machen.

Einen externen Hub? Du meinst die, die man sich für wenige Euro kauft und dann anschließt? Ja sowas hab ich mir geleistet. Die internen, aka root hubs, wollte ich ja explizit ausgeschlossen wissen.

 

Dann gehts aber auch mit der WinUSB.

Ich hab mich auf libusb-win32 gestützt. WinUSB wäre da vorteilhafter?

 

Theoretisch müsste es aber auch möglich sein, den Windows USB Hub Treiber direkt anzusprechen und zwar über die WinAPI und IOCONTROLS. Müsste man sich mal angucken.

Ich suche seit ca. 2 Jahren. Her mit deinen Ideen!

 

 

Aber das gefrickel ist eigentlich unnötig, es gibt doch den IOWarrior, der kann viel mehr und geht wesentlich besser zu bedienen.

Ist ne Hardwarelösung oder? Kenn ich leider nicht. Danke Dir für den Hinweis.

 

erwin

Link to comment

Ich meine, wenn du mit dem LibUSB Inf Tool eine inf Datei erstellst, wird darin die USB Vendor ID (VID) und Product ID (PID) deines Hubs hinterlegt. Wenn du für den Hub dann die LibUSB als Treiber installierst, kannst du zwar aus dem User Space drauf zugreifen, aber der arbeitet natürlich nicht mehr als Hub. Und Windows installiert dann für alle Hubs die die gleiche VID/PID Kombination haben, LibUSB. Das ganze ist ein ziemlich unsauberes Gefrickel. Mit dem IOWarrior (USB Controller Chip, der einfach Ausgänge schalten kann) geht sowas viel einfacher und ohne Krücke. Ob und wenn ja wie man mit dem USB Hub Treiber von Windows sprechen kann, müsste ich mal untersuchen. Mit der WinUSB kenn ich mich aus, aber ich denke man kann auch so eventuell den Hub-Treiber ansprechen.

Link to comment
  • 1 month later...

Hallo erwin,

 

nettes Teil, das Du da kreiert hast. Habe ich schon lange gesucht. Vielen Dank dafür!

 

Ich verwende ein aktives 7-Port-Hub von Xystec. An dem 7-Port Hub habe ich ein "USB auf Paralell-Kabel". Nach einiger Zeit, meist mehreren Stunden, nimmt der Drucker keine Druckaufträge mehr an. Durch Ein- und Ausschalten des ganzen Hubs geht es dann wieder. Da will ich probieren, ob nicht mit Hilfe Deines Tools eine Automatiserung möglich ist, um das abgestürzte Kabel zu reseten.

 

Das Aus- und Einschalten funktioniert grundsätzlich, aber ich habe ein Problem mit der Aktualisierung im Gerätemanager. Schalte ich ein Gerät (Gerät1) aus, kommt auf der Commandline die Meldung, das der vorgang erfolgreich war. Im Gerätemanager tut sich aber nichts. Das Gerät ist auch weiterhin verwendbar. Erste wenn ich ein anderes Gerät (Gerät2) einschalte, verschwindet Gerät1 aus dem Gerätemanager und steht nicht mehr zur Verfügung. Schalte ich anstelle eines Gerätes einen freien Port am Hub ein, passiert auch nichts. Auch ein weiterer Ausschaltvorgang löst keine Aktualisierung aus. Weder mit noch ohne Gerät.

 

Meine UPS.bat sieht deshalb so aus:

"c:\programme\UPS\UPS.exe" -h 0 -p 4 -s %1

"c:\programme\UPS\UPS.exe" -h 0 -p 5 -s off

"c:\programme\UPS\UPS.exe" -h 0 -p 5 -s on

 

So kann ich Port 4 schalten, je nach übergebenen Parameter. Ohne Quälen des USB-Sticks auf Port 5 würde erst mal nichts passieren. Ich muss gestehen, dass ich bisher auch nicht die Geduld aufgebracht habe, mehr als eine Minute zu warten, ob der Ausschaltvorgang doch noch von alleine stattfindet.

 

An dem 7-Port-Hub hängt unter anderem ein passives 4 Port Hub. An beiden Hubs kann ich mein Problem feststellen. Es ist damit zumindest nicht herstellerspezifisch. Für mich sieht das so aus, dass das Hub den Port erst ausschaltet, wenn ein Einschaltvorgang läuft. Ein Ausschaltvorgang führt nicht zum Ausschalten, er wird nur irgendwie vorgemerkt. Du hattest geschrieben, das Du bei Hub an Hub Schwierigkeiten hattest. Außer dem beschriebenen Problem mit der Aktualisierung treten bei mir keine auf.

 

Ferner ist es bei mir so, dass alle Ports wieder an sind, wenn das aktive Hub vorübergehend stromlos gestellt wird. Ist das so gewollt? Ich hatte die Ausführungen über die Root-Hubs so verstanden, dass der geschaltete Zustand permanent ist. Ansonsten hätten die PC-Freunde, die ihre USB-Anlage lahmgelegt hatten, mit dem simplen Aus- und Einschalttrick eine Reparatur durchführen können.

 

MadTax

Link to comment

Hi erwin,

 

ich habe seit mehreren Stunden nun einen Druckertest laufen und dank Deines Tools bisher ohne Fehler. Ich freue mich!

 

Als alter Stromsparer habe ich gleich die USB-Kamera am Xystec-Hub ausgeschalten. Bild war sofort weg. Allerdings als ich in die Nähe der Kamera kam, habe ich gesehen, dass die Beleuchtungsdioden an der Kamera noch leuchteten. Ich muss davon ausgehen, dass Dein Tool nur die Datenverbindung unterbricht, aber nicht den Strom. Wurde da der USB-Standard bei meinem Hub nicht richtig umgesetzt oder kannst Du bei Deinem Tool etwas ändern?

 

MadTax

Link to comment

aber ich habe ein Problem mit der Aktualisierung im Gerätemanager. Schalte ich ein Gerät (Gerät1) aus, kommt auf der Commandline die Meldung, das der vorgang erfolgreich war. Im Gerätemanager tut sich aber nichts. Das Gerät ist auch weiterhin verwendbar. Erste wenn ich ein anderes Gerät (Gerät2) einschalte, verschwindet Gerät1 aus dem Gerätemanager und steht nicht mehr zur Verfügung. Schalte ich anstelle eines Gerätes einen freien Port am Hub ein, passiert auch nichts. Auch ein weiterer Ausschaltvorgang löst keine Aktualisierung aus. Weder mit noch ohne Gerät.

Ich versuch das mal nachzuvollziehen." Das Gerät ist auch weiterhin verwendbar." Lt. Gerätemanager, oder tatsächlich?

 

 

Ferner ist es bei mir so, dass alle Ports wieder an sind, wenn das aktive Hub vorübergehend stromlos gestellt wird. Ist das so gewollt?

Von mir gewollt? Nein. Scheint standardverhalten bei Hubs zu sein.

 

Ich hatte die Ausführungen über die Root-Hubs so verstanden, dass der geschaltete Zustand permanent ist. Ansonsten hätten die PC-Freunde, die ihre USB-Anlage lahmgelegt hatten, mit dem simplen Aus- und Einschalttrick eine Reparatur durchführen können.

Ich weiss nicht was die Pechvögel da wirklich geschafft haben, und will es auch gar nicht nachvollziehen ;-). Irgendwie haben die vielleicht das gesamte USB-System lahmgelegt.

 

Als alter Stromsparer habe ich gleich die USB-Kamera am Xystec-Hub ausgeschalten. Bild war sofort weg. Allerdings als ich in die Nähe der Kamera kam, habe ich gesehen, dass die Beleuchtungsdioden an der Kamera noch leuchteten. Ich muss davon ausgehen, dass Dein Tool nur die Datenverbindung unterbricht, aber nicht den Strom.

Ich hatte ja geschrieben, dass die Unterstützung hardwareabhängig ist. In der Tat unterstützen nur sehr sehr wenige im Handel erhältliche Hubs dieses Feature. Eines dieser Exoten ist das DELOCK 87445. Ohne Werbung machen zu wollen, ist dieses sehr preiswert z.Z. bei Reichelt für 4,45 Euro erhältlich

 

http://www.reichelt.de/USB-Hubs/DELOCK-87445/index.html?;ACTION=3;LA=2;ARTICLE=87439;GROUPID=4831;artnr=DELOCK+87445;SID=10T1RPf38AAAIAAE-A5xUcd5f30728b9dc8d3493b5a6e6327525f

 

Die anderen verhalten sich so, als wenn sie die Ports nur disablen (die LED bleibt z.B. an; wäre auch über devcon erreichbar). Ob tatsächlich Power-off Feature vorhanden sieht man an der Ausgabe im Commandwindow.

 

power switching capabilities: individual power switching.

Der Hub ist fähig jeden Port einzeln zu schalten.

 

power switching capabilities: ganged switching.

Der Hub schaltet (nur) Gruppen von Ports.

 

Bei fast allen meinen Hubs (Ausnahme oben genannt) bekomme ich diese Meldung, ohne jedoch hier irgendwelche Gruppen feststellen zu können (was aber nicht heisst, dass es Hubs mit wirklich dedizierten Gruppen von Ports gibt). Resultat: nur ein disable.

 

 

erwin

Edited by erwin
Link to comment

Hallo Erwin,

 

danke für Deine Stellungnahme. Ich habe gleich einmal das Ausschalten untersucht. Also das Gerät ist aus. Windows weiß aber nix davon (z. B. Gerätemanager). Ich muss mich für meine obflächliche Analyse entschuldigen. Das Vorhandensein der Geräte im Gerätemanager und der USB-Laufwerke im Explorer hat micht zu meinem vorschnellen Schluss kommen lassen.

 

Das von Dir erwähnte Delock Hub kenne ich aus einem anderen Thread, in dem es auch um das Schalten von Ports am USB-Hub geht:

 

http://www.vdr-portal.de/board19-verschiedenes/board52-andere-hardware/102608-stromversorgung-schalten-mit-usb-hub-f%C3%BCr-3-70-eur/

 

Ich werde mir das nun doppelt empfohlene Hub zulegen. Auf Deine Antwort hin bin ich gleich in den Keller geflitzt und habe mein Delock Hub gesucht. Es ist ein anderes, ein 61393. Und es ist unsichtbar für Dein Tool. Zuerst ans Xystec-Hub angeschlossen, nix. Dann direkt am Roothub ebenfalls nix. Dann als einziges Hub am Rechner. Kein Hub gefunden. Muss ein Stealth-Hub sein.

 

Ich habe da noch eine Verständnisfrage: Bei einem Teil der Hubs (ganged switching) kann im Ergebnis nur die Datenleitung gekappt werden. Bei einem anderen Teil (individual switching) werden immer die Datenleitung und die Stromleitung uno acto gekappt. Ist es vorstellbar, nur die Stromleitung zu kappen? Ich benutze einen USB zu Paralell-Adapter für einen alten Drucker. Und der Adapter geht nur, wenn er keinen Strom vom Hub bekommt (und ein passives Hub zwischengeschalten ist). Ich habe eine USB-Verlängerung in der Weise präpariert, dass die Stromleitungen durchtrennt sind. Könnte ich den Strom am Hub ausschalten, wäre das chicer.

 

MadTax

Link to comment

Ich habe da noch eine Verständnisfrage: Bei einem Teil der Hubs (ganged switching) kann im Ergebnis nur die Datenleitung gekappt werden. Bei einem anderen Teil (individual switching) werden immer die Datenleitung und die Stromleitung uno acto gekappt. Ist es vorstellbar, nur die Stromleitung zu kappen? Ich benutze einen USB zu Paralell-Adapter für einen alten Drucker. Und der Adapter geht nur, wenn er keinen Strom vom Hub bekommt (und ein passives Hub zwischengeschalten ist). Ich habe eine USB-Verlängerung in der Weise präpariert, dass die Stromleitungen durchtrennt sind. Könnte ich den Strom am Hub ausschalten, wäre das chicer.

 

Auf die schnelle habe ich in der USB-Spezifikation nur folgendes gefunden:

 

Bezüglich der Stati eines USB-Hub-Ports

 

11.5.1.3 Disconnected

A port transitions to this state in any of the following situations:

• From the Powered-off state when the hub receives a SetPortFeature(PORT_POWER) request

• From any state except the Not Configured and Powered-off states when the port’s disconnect timer times

out

• From the Restart_S or Restart_E state at the end of the restart interval

In the Disconnected state, the port’s differential transmitter and receiver are disabled and only connection detection is possible

 

Er geht also in den "Disconnected"-Status wenn er mit SetPortFeature(PORT_POWER) angesteuert wird. Dies macht das UPS-Programm.

 

In the Disconnected state, the port’s differential transmitter and receiver are disabled and only connection detection is possible

 

Wenn dir das was sagt? Genaueres in der im Web verfügbaren USB-Spezifikation.

 

Und was nicht in der Spezifikation steht, kann jeder Hersteller auslegen wir er will.

 

erwin

 

PS: Was ist das denn für ein seltsames Teil, wo du dann manuell selbst ein USB-Verlängerungskabel aufsplitten must?

Edited by erwin
Link to comment

Hi erwin,

 

warum das USB-Parallel-Kabel keinen Strom haben darf, kann ich Dir nicht sagen. Die Geschichte ging so:

 

Mein derzeitiges Spielzeug ist ein modifizierter Cedar 4000 Disc-Publisher mit Autoloader. Der besteht bei mir aus einer über die

 

serielle Schnittstelle geteuerten Be- und Entladeeinheit, einem DVD/CD-Drucker mit Parallelschnittstelle, zwei DVD-Brennern mit IDE

 

Schnittstelle und einer USB-Kamera. Alles wird über USB Adapter oder direkt auf das Xystec-Hub im Inneren der Einheit verbunden und

 

vom PC per USB angesteuert (Ein einziges Kabel).

 

Zuerst hatte ich nur das Parallel-Kabel am 7-Port Hub im Autoloader. Ging ohne Einschränkungen. Dann habe ich die

 

USB-Seriell-Schnittstelle dazugetan. Es ging. Dann den ersten USB / IDE Adapter plus DVD-Laufwerk. Es ging. Freude strahlte über mein

 

Gesicht. Dann das Entsetzen, als ich den zweiten USB / IDE Adapter plus DVD-Laufwerk angestöpselt hatte. Die USB-Druckerunterstützung

 

wurde nicht mehr erkannt. Ein unbekanntes Gerät in der Systemsteuerung.

 

Da vorher alles ging kombinierte ich: Durch das vierte Gerät hat sich die Spannungsversorgung im Hub verändert. Zuerst habe ich ein

 

aktives Hub zwischen den Xystec und das Parallel-Kabel geschalten, damit das Kabel mehr Spannung erhält. Resultat: Das Kabel wurde

 

nicht mehr gefunden. Nicht einmal mehr als unbekanntes Gerät. Also nächste Schlussfolgerung: Nicht zu wenig, sondern zuviel Strom

 

liegt auf dem Gerät. Das erschien mir logisch, da in meiner Vorstellung USB-Hubs mit 7 Ports zwei hintereinander geschaltete 4-Port

 

Hubs sind (Bei 11 Ports sind es drei Hubs in meiner Theorie). Bei Gerät Nr. 4 war ich auf dem anderen internen Hub und habe so die

 

Anpassung der Strommenge nach oben erzwungen. Also habe ich die Verlängerung mit durchtrennter Stromleitung gebaut. Das Experiment war

 

mir die drei Euronen für das Kabel wert. Und es hat funktioniert. Bis, ja bis ich es toll fand, noch einen USB-Stick auf Port 5 zu

 

stecken. Plötzlich ging nichts mehr. Das Parallel-Kabel wieder ein unbekanntes Gerät im Systemmanager. Diesmal hat ein passiver Hub

 

zwischen Xystec und dem stromaderndurchtrennten Kabel geholfen. Die Stromkabel waren ja durchtrennt , deshalb konnte es nur am

 

Datenkabel liegen. Ein Gerät mehr bedeutet anscheinend, dass der Hub die Strommenge auch auf den Datenkabeln erhöht. Die kann ich

 

durch einen passiven Hub quasi als Leitungswiderstand vermindern. Tja und seitdem geht es mit der Einschränkung unregelmäßiger

 

Abstürze bei langer Laufzeit.

 

Ich habe auch ein zweites baugleiches Parallel-Kabel, bei dem ist es genauso. Ich folgere daraus, dass es nicht defekt ist. Mein

 

Erklärungsversuch:

 

Zum einen ist das Parallel-Kabel USB 1.1 und das muss das Hub umsetzen. Zum anderen liegt am Parallel-Anschluss Spannung an. Die

 

Spannung speist auch den Adapter. Ist der Autoloader aus, aber der Drucker an, leuchtet die Betriebs-LED auf der Platine des

 

Autoloaders bei Verwendung von Standardkabeln. Das kann nur durch die Spannung am parallelen Port bewirkt werden, die über USB auf das

 

HUB und von dort über den USB-Seriell-Adapter auf die Platine geführt wird. Da läuft etwas nicht richtig. Durch das Trennen der

 

Stromadern kann kein Strom mehr in die verkehrte Richtung fließen. Der Drucker ist ein Primera-Signature IV. Die Füllstandsanzeige für

 

die Tintenpatrone funktioniert nur mit einer parallelen Verbindung, also nicht über USB. Ich glaube, da werden einfach unbelegte

 

Leitungen von Drucker und Druckertreiber benutzt. Die USB-Schnittstelle benutzt die nicht, wird aber irritiert. Daher auch der Absturz

 

in unregelmäßigen Abständen. Mehr Erklärung kann ich nicht liefern. Vor jedem Druck wird durch Dein Tool der Port des Drucker-Kabels

 

am passiven Hub einmal aus- und wieder eingeschalten. Beim letzten Lauf sind durch diesen Reset die Abstürze der USB-Verbindung zum

 

Drucker vollständig vermieden worden.

 

Ich habe schon überlegt, ob ich nicht die ganzen Probleme mit einem hochwertigerem USB-Parallel-Kabel loswerden kann. Ich habe aber

 

noch keines gefunden, bei dem ich mir sicher sein kann, dass es nicht baugleich mit meinem jetzigen ist.

 

Nach Deiner Beschreibung ist der von mir gewünschte Zustand der "powered-off". Ich werde mich da schlau machen. Ich habe das Delock

 

Hub bestellt. Kostet 7,80 Euronen inklusive Versand in der Bucht. Da soll das Druckerkabel und die Kamera dran. Denn die Kamera stört

 

mich, wenn sie auch dann hell erleuchtet ist, obwohl ich sie nicht brauche. Und der Drucker besteht darauf, dass sein Hub vor dem

 

Druck aus- und wieder eingeschalten wird. Werden bei Verwendung dieses Hubs die Geräte im Gerätemanager beim Ausschalten auch ohne

 

Einschaltvorgang deaktiviert? Na ich werde es erfahren, wenn das Hub geliefert wird. Und zur Not habe ich meinen Workaround.

 

Ich hoffe nicht gelangweilt zu haben.

 

MadTax

Edited by MadTax
Link to comment

Hi Erwin,

 

meine letzten Ausführungen waren wohl zu lang ;). Jetzt konzentrierter:

 

1) Ich habe das empfohlene Delock Hub ausprobiert und mit dem ist das Powerport-Switching möglich. Allerdings muss ich meinen Workaraound einsetzen, damit Windows das Ausschalten sofort mitbekommt.

 

2) Ich habe nach Deiner Emfehlung auch den Standard runtergeladen (Stand 27. April 2000) und bin mir nicht ganz schlüssig, ob

SetPortFeature(PORT_ENABLE)

ClearPortFeature(PORT_POWER)

funktioniert, um den von mir gewünschten Status "ohne Strom aber funktioniert", zu erreichen. Ich habe keine gegenteilige, explizite Auskunft gefunden. Aber der Disabled-Status wird "From any, but the Powered-Off ... on receipt of a ClearPortFeature(PORT_ENABLE) request" (11.5.1.4) eingestellt. Das könnte nur dann der Fall sein, wenn Powered-Off bereits zwingend mit Disabled verbunden ist. Muss ich ausprobieren.

 

Im Standard habe ich zum ganged-switching folgendes gefunden:

 

Ein Self-powered-Hub muss keinen Stromswitch haben. Ein Bus-powered-Hub muss einen Stromswitch haben. Bei "individual power switching" muss ein Hub den Strom beim einzelnen Port abschalten. Bei "ganged switching" muss das Hub den Strom dann (aber nicht nur dann) abschalten, wenn alle Ports im Status Powered-Off, also abgeschalten sind (11.11 Abs. 2). Die Abschaltungsbefehle erfolgen aber auch hier portweise. Ich habe alle meine "ganged switching"-Hubs durchprobiert. Keines schaltet den Strom ab, wenn auch der letzte Port Powered-Off wird. Allerdings nimmt keine meiner Switch in Anspruch, ein dem Standard entsprechendes Bus-powered-Hub zu sein. Gibt es hier andere Erfahrungen?

 

Von daher glaube ich, dass Dein Tool nicht nur den Strom, sondern auch immer das Gerät selbst ausschaltet. Kannst Du das bitte prüfen? Nach meinem Verständnis muss das über einen ClearPortFeature(PORT_ENABLE) erfolgen.

 

MadTax

Link to comment

meine letzten Ausführungen waren wohl zu lang ;).

schwer verdaulich

 

Ich habe alle meine "ganged switching"-Hubs durchprobiert. Keines schaltet den Strom ab, wenn auch der letzte Port Powered-Off wird. Allerdings nimmt keine meiner Switch in Anspruch, ein dem Standard entsprechendes Bus-powered-Hub zu sein. Gibt es hier andere Erfahrungen?

Ich hatte bisher nicht den Ehrgeiz meine anderen Hubs auf die Einhaltung des Standards zu prüfen. Gehe aber davon aus dass diese es tun. Was da genau im Standard gemeint ist habe ich nicht versucht zu begreifen, es hat mir gereicht dass bei besagtem Hub der Strom tatsächlich weg war.

 

Von daher glaube ich, dass Dein Tool nicht nur den Strom, sondern auch immer das Gerät selbst ausschaltet.

???

 

Nach meinem Verständnis muss das über einen ClearPortFeature(PORT_ENABLE) erfolgen

Nein Enable/Disable habe ich nicht geschaltet, nur die POWER. Wenn du der C-Sprache kundig sein solltest, oder zumindest den Code-Abstract zu bilden im Stande bist, empfehle ich dir den mitgelieferten Quelltext.

 

erwin

Link to comment

Hi Erwin,

 

ich habe das jetzt kapiert: Da Dein Tool in den PowerState Powered-off schaltet, gibt es den von mir gesuchten Zustand nicht, da

 

immer nur ein PowerState vorliegen kann.

 

Ich habe mit meinem vorletzten Beitrag versucht zu erklären, wie ich drauf gekommen bin, zwischen den beiden Datenleitungen und den

 

beiden Stromleitungen in einem USB-Kabel zu unterscheiden. Es gibt Geräte, wie die von Dir erwähnte Steckdosenleiste (Ich habe

 

mehrere von Gembird, die verhalten sich genauso wie Deine.), die nur Strom über USB beziehen. Aber keine Daten. Deshalb finde ich

 

solche Geräte auch nicht im Gerätemanager. Auf der anderen Seite habe ich unter den Geräten ein paar Sensibelchen, die nur dann

 

funktionieren, wenn sie gerade keinen Strom über die Stromleitungen, wohl aber Daten über die Datenleitungen erhalten. Dies geht

 

natürlich nur, wenn die Geräte eine andere Stromquelle haben. Bei dieser ist auch die Ursache für das Verhalten zu suchen.

 

Ein USB-Port eines Per-port-power-switching-Hub kann Strom und Daten getrennt schalten. Z.B.

Powered-off---------->Strom aus----------->Daten aus,

Disconnected------->Strom an------------->Daten aus (jedenfalls der Differential-Transmitter) oder

Enabled------ -------->Strom an------------->Daten an.

 

Beim Ganged-power-switching-Hub schaltet Dein Tool den Strom gerade nicht ab, das kann es nicht. Es schaltet nur die Datenleitungen

 

aus, indem es den Port in den Portstate Powered-off versetzt. Die Folge ist, dass das angeschlossene Gerät nicht mehr funktioniert,

 

aber noch Strom abbekommt. Das habe ich mit Gerät abschalten (=Kappen der Datenleitungen) gemeint.

 

Es gibt im Standard nur keinen PortState mit Strom aus und Daten an. Ich bleibe daher bei meiner Bastlerlösung und präpariere Kabel.

 

Ich habe versucht Dein Projekt mit Visual Express 2010 zu laden, habe es aber nicht geschafft. Ich bin nicht gut genug im Umgang mit

 

VC und / oder C, um den Fehler zu finden. Es kommt die Meldung, dass etwas fehlen würde.

 

Ich möchte Deine Arbeit bitte nicht kritisieren, das steht mir nicht zu. Und ich benutzte Dein Tool, also bin ich zufrieden. Noch

 

eine kleine Sache: Der Port-Status wird nach Ausführen der UPS.exe ausgegeben. Die Abfrage der Stati geschieht aber zeitlich so knapp

 

nach dem Schaltvorgang, dass Durchlauf-Zustände, wie z. B. Disconnected , noch ausgegeben werden. Dies ist dann hinderlich, wenn ein

 

anderer Zustand danach noch erreicht wird. Vielleicht eine kurze Pause vor der Abfrage einbauen, damit der Port in den endgültigen

 

Zustand kommen kann.

 

MadTax

Link to comment

Schöne Analyse von Dir.

 

Ich habe versucht Dein Projekt mit Visual Express 2010 zu laden, habe es aber nicht geschafft. Ich bin nicht gut genug im Umgang mit VC und / oder C, um den Fehler zu finden. Es kommt die Meldung, dass etwas fehlen würde.

Was genau?

 

Ich möchte Deine Arbeit bitte nicht kritisieren, das steht mir nicht zu.

Sachliche Kritik? Nur zu!

 

Und ich benutzte Dein Tool, also bin ich zufrieden.

Doch wohl nicht ganz?

 

Noch eine kleine Sache: Der Port-Status wird nach Ausführen der UPS.exe ausgegeben. Die Abfrage der Stati geschieht aber zeitlich so knapp nach dem Schaltvorgang, dass Durchlauf-Zustände, wie z. B. Disconnected , noch ausgegeben werden. Dies ist dann hinderlich, wenn ein anderer Zustand danach noch erreicht wird. Vielleicht eine kurze Pause vor der Abfrage einbauen, damit der Port in den endgültigen

Zustand kommen kann.

Ich hatte mich erstmal gefreut, dass diese "Durchlaufzustände" auch zur Anzeige kommen. Nochmal UPS ohne Parameter aufgerufen und man sieht den Endzustand. Diese Doppelanfrage könnte man natürlich auch einprogrammieren, wenns denn was bringt.

 

 

erwin

Link to comment

Hi Erwin,

 

also ich bin schon zufrieden. Ich musss es halt erst verstehen. Und mir ist klar, dass Dein Focus auf "Strom-aus-Daten-egal" lag. Das

 

liegt an der von Dir gesteuerten Steckdosenleiste, die nur prüft, ob an der Stromleitung Spannung anliegt.

 

Ich habe Deine Dateien öffnen, aber kein Projekt laden können. Das liegt aber an mir. Ich habe ein Buch über Visual Express bestellt,

 

das mir hoffentlich weiterhelfen wird.

 

Bei meiner prüferischen Durchsicht der Dateien ist mir folgender Teil in der UPS.cpp aufgefallen:

 

printf( "\nhub: #%d * vid: %0.4X pid: %0.4X * %s * device %03d\n", index, dev->descriptor.idVendor,

 

dev->descriptor.idProduct, bus->dirname, dev->devnum );

 

switch ( ( ( ( char ) uhd.wHubCharacteristics ) & 0x0003 ) ) {

case 0: {

printf( " power switching capabilities: ganged switching.\n" );

break;

}

case 1: {

printf( " power switching capabilities: individual power switching.\n");

break;

}

case 2:

case 3: {

printf( " power switching capabilities: not supported.\n");

break;

}

}

 

}

else {

printf( "can't get hub descriptor\n" );

usb_close( uh );

continue;

}

 

hubs[ index ].dev = dev;

hubs[ index ].nport = uhd.bNumberOfPorts;

 

hub_port_status( uh, hubs[ index ].nport, index );

 

index++;

 

usb_close( uh );

}

}

}

 

return index;

}

 

case2: hängt meiner Meinung nach komisch rum. Und Dein Tool gibt nie etwas anderes als "ganged switching" oder "individual power

 

switching" zurück. Keines meiner Hubs war ein "not supported", obwohl sich einige so verhalten haben. Wahrscheinlich in Ordnung,

 

vermag ich nicht zu beurteilen.

 

MadTax

Link to comment

case 2:

case 3: {

printf( " power switching capabilities: not supported.\n");

break;

}

 

case2: hängt meiner Meinung nach komisch rum.

Ist syntaktisch OK und gar nicht so selten gebrauchter C-Stil. Das ist ein Fall-Trough, d.h. tritt Fall 2 ein wird er von case 2: behandelt, wo hier im speziellen nichts passiert (also auch kein break, welches den switch beenden würde!) und "fällt" in den case 3: herein, wo es dann weitergeht. Aber du hast Recht: es sieht verdächtig nach einem Programmierfehler aus (wurde hier was vergessen?). Normalerweise kommmentiere ich solche Fälle in der Art:

 

case 2: {

// break; // no break! -> case 3:

}

case 3: {

printf( " power switching capabilities: not supported.\n");

break;

}

 

 

 

Und Dein Tool gibt nie etwas anderes als "ganged switching" oder "individual power

switching" zurück. Keines meiner Hubs war ein "not supported", obwohl sich einige so verhalten haben. Wahrscheinlich in Ordnung, vermag ich nicht zu beurteilen.

Schau mal hier: http://www.mail-archive.com/linux-usb-users@lists.sourceforge.net/msg13470.html und Folgendes

 

erwin

Edited by erwin
Link to comment
  • 2 weeks later...

Hi Erwin,

 

ich habe mir die Sache mit der Bestimmung der Art des Hubs einmal angesehen. In Deinem Tool werden die ersten beiden Bits von wHubCharakteristics abgefragt. Danach wird über die von mir bereits im anderen Zusammenhang erwähnte Stelle Deines Tools wie folgt entschieden:

 

00 ----> Ganged Power switching

01 ----> Individual Port Power Switching

10 ----> Power Switching not supported

11 ----> Power Switching not supported

 

Im Standard (11.23.2.1) steht beim zweiten Bit von wHubCharakteristics: "1X Reserved. Used only on 1.0 Compliant hubs that implement no power switching." Das bedeutet, dass alle USB 1.1 oder 2.0 Hubs an der zweiten Stelle immer eine Null haben. Ich verstehe die Aussage in dem von Dir angegebenen Link genauso. Der Standard (11.11 Absatz 6) legt ferner fest: "For a hub with no power switches, bPwrOn2PwrGood must be set to zero." Diese Variable wird von Deinem Tool zur Bestimung der Hubart nicht abgefragt.

 

Ich vermute deshalb werden alle meine Switches als Ganged-Power-Switching angezeigt. Ich habe kein USB 1.0 Hub, um das zu verifizieren. Ist das viel Aufwand, die Abfrage von bPwrOn2PwrGood einzubauen? Damit könnte ein Hub softwareseitig auf Schaltbarkeit geprüft werden. Im Augenblick werden nur Hubs mit Individual-Power-Switching zuverlässig erkannt. Die Definition von bPwrOn2PwrGood steht ebenfalls in 11.23.2.1 des Standards.

 

MadTax

Link to comment

ups.zip

 

erwin

 

 

EDIT: 23.04.12

 

Hab das Teil wieder vom Download genommen. Ist bei Fehlanwendung doch ein ziemliches Risiko. Falls dennoch Interesse dann nur über PM.

Edited by erwin
Link to comment
  • 4 weeks later...

@MadTax und andere!

 

Ich hab den Download wieder zurückgezogen.

 

Was war passiert?

 

Hab im PC-off Zustand, aber bei installierten USB-(Hub)Filtertreibern die USB-Verkabelung neu arrangiert. Also umgesteckt. Jetzt geht USB-mäßig so gut wie gar nichts mehr. Auch nach Windows Neuinstallation!!! Es sind alle installierten OS betroffen!!!

 

Ich empfehle eine saubere Deinstallation aller installierten USB-(Hub)Filtertreiber, also über das Tool.

Link to comment
  • 1 month later...

Hallo erwin.

 

Danke für die UPS.exe :)

 

Das sieht ja schon mal gar nicht schlecht aus :

 

C:\>UPS.exe
no hubs found.

Usage: UPS [ { -h HUBNUM | -i VID.PID } -p PORTNUM -s { on | off } ]


C:\>UPS.exe

hub: #0 * vid: 1A40 pid: 0201 * bus-0 * device 001
power switching capabilities : ganged switching.
power on till power good [ms]: 100
number of ports              : 7
max current [mA]             : 100
port status: hub #0
  port 1: power on, disabled,
  port 2: power on, disabled,
  port 3: power on, disabled,
  port 4: power on, disabled,
  port 5: power on, disabled,
  port 6: power on, highspeed, enabled, connected,
  port 7: power on, lowspeed, enabled, connected,

Usage: UPS [ { -h HUBNUM | -i VID.PID } -p PORTNUM -s { on | off } ]


C:\>UPS.exe -h 0 -p 6 -s off

hub: #0 * vid: 1A40 pid: 0201 * bus-0 * device 001
power switching capabilities : ganged switching.
power on till power good [ms]: 100
number of ports              : 7
max current [mA]             : 100
port status: hub #0
  port 1: power on, disabled,
  port 2: power on, disabled,
  port 3: power on, disabled,
  port 4: power on, disabled,
  port 5: power on, disabled,
  port 6: power on, highspeed, enabled, connected,
  port 7: power on, lowspeed, enabled, connected,

HUB #0 CLEAR FEATURE USB_PORT_FEAT_POWER, PORT 6

port status: hub #0
  port 1: power on, disabled,
  port 2: power on, disabled,
  port 3: power on, disabled,
  port 4: power on, disabled,
  port 5: power on, disabled,
  port 6: power off, disabled,
  port 7: power on, lowspeed, enabled, connected,

C:\>UPS.exe -h 0 -p 6 -s on

hub: #0 * vid: 1A40 pid: 0201 * bus-0 * device 001
power switching capabilities : ganged switching.
power on till power good [ms]: 100
number of ports              : 7
max current [mA]             : 100
port status: hub #0
  port 1: power on, disabled,
  port 2: power on, disabled,
  port 3: power on, disabled,
  port 4: power on, disabled,
  port 5: power on, disabled,
  port 6: power off, disabled,
  port 7: power on, lowspeed, enabled, connected,

HUB #0 SET FEATURE USB_PORT_FEAT_POWER, PORT 6

port status: hub #0
  port 1: power on, disabled,
  port 2: power on, disabled,
  port 3: power on, disabled,
  port 4: power on, disabled,
  port 5: power on, disabled,
  port 6: power on, disabled, connected,
  port 7: power on, lowspeed, enabled, connected,

C:\>UPS.exe

hub: #0 * vid: 1A40 pid: 0201 * bus-0 * device 001
power switching capabilities : ganged switching.
power on till power good [ms]: 100
number of ports              : 7
max current [mA]             : 100
port status: hub #0
  port 1: power on, disabled,
  port 2: power on, disabled,
  port 3: power on, disabled,
  port 4: power on, disabled,
  port 5: power on, disabled,
  port 6: power on, highspeed, enabled, connected,
  port 7: power on, lowspeed, enabled, connected,

Usage: UPS [ { -h HUBNUM | -i VID.PID } -p PORTNUM -s { on | off } ]


C:\>

 

Es scheint prinzipiell zu funktionieren. Zumindest wird die Kamera getrennt und erscheint auch nicht mehr im Device-Manager. Ob sie allerdings wirklich aus geschaltet ist, bezweifle ich, da mein jetziger HUB nur "ganged switching" kann. Aber kein Problem, der DELOCK kommt ja die nächsten Tage.

 

Zuerst hatte ich ein paar Probleme, den HUB für UPS.exe sichtbar zu bekommen. Erst ein deaktivieren des HUBs mit anschließender "Neusuche im Device-Manager" brachte das Gerät zum Vorschein. Der Filter ließ sich komischerweise schon vorher setzen. Allerdings mußte er nach der Neusuche erneut gesetzt werden :o

 

Was mir noch auffällt, das mein HUB anscheinend nur 100mA pro Port liefern kann, obwohl er "self powered" ist. Vielleicht liegt ja da sogar das Problem, das sich meine Kamera hin und wieder unaufgefordert abmeldet. Aber egal, es kommt ja der neue HUB dran.

 

Danke nochmal,

Thomas

Link to comment
  • 3 years later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...