Kann ein USB-Gerät versuchen, über den Bus mit Strom versorgt zu werden und dann auf Selbstversorgung zurückgreifen?

Das Gerät hat eine Batterie, aber es wäre schön, wenn es über den Bus mit Strom versorgt werden könnte. Ein Computer liefert beispielsweise typischerweise 500 mA, während ein Smartphone im OTG-Modus nur 8 mA liefern muss .

Ist es möglich, so etwas zu tun?

  1. 500 mA anfordern
  2. wenn akzeptiert: Strom vom Computer und Akku vom Computer laden
  3. sonst: 200 mA anfordern
  4. falls akzeptiert: Stromversorgung vom Computer
  5. sonst: Anspruch auf Selbstversorgung, Strom aus Batterie

Dies scheint das zu sein, wofür Konfigurationen da sind :

Daher ist es möglich, zwei Konfigurationen zu haben, eine, wenn das Gerät über den Bus versorgt wird, und eine andere, wenn es über das Netz versorgt wird. ... Nachdem alle Konfigurationen vom Host untersucht wurden, sendet der Host einen SetConfiguration-Befehl mit einem Wert ungleich Null, der mit dem bConfigurationValue einer der Konfigurationen übereinstimmt. Hiermit wird die gewünschte Konfiguration ausgewählt.

Reicht es aus, mehrere Konfigurationen in den Deskriptoren anzugeben, eine für jede aktuelle Anforderung? Probiert das Betriebssystem sie automatisch der Reihe nach aus und fährt mit dem nächsten fort, wenn einer fehlschlägt?

USB-Geräte mit mehreren Konfigurationen und Windows scheint zu sagen, dass es so funktioniert:

Während der Aufzählung versucht USBCCGP zunächst, die Konfiguration auszuwählen, deren Deskriptor sich im angegebenen „ursprünglichen“ Index befindet. Wenn der Versuch fehlschlägt, normalerweise weil die Konfiguration mehr als 100 mA erfordert, während der Upstream-Hub des Geräts nur Busstrom hat, versucht USBCCGP stattdessen, die Konfiguration auszuwählen, die am angegebenen „alternativen“ Index gefunden wird.

Das funktioniert aber in der Praxis nicht? :

„Microsoft-Treiber funktionieren ausnahmslos nur mit der ersten Konfiguration eines Geräts. Der Microsoft-Support für zusammengesetzte Geräte wird nicht aktiviert, wenn das Gerät über mehrere Konfigurationen verfügt. Folglich scheinen Geräte mit mehreren Konfigurationen in der Praxis selten zu sein, und Microsoft rät Menschen davon ab, neue Geräte zu entwickeln .“

und :

Microsoft-Treiber fragen nur nach der ersten Konfiguration – und wenn das zu viel Strom erfordert, sei es so.

und :

Es ist nicht üblich, mehr als eine Konfiguration zu haben. Windows-Standardtreiber wählen immer die erste Konfiguration aus, daher ist dies nicht sehr sinnvoll.

Wenn mehrere Konfigurationen in der Praxis nicht funktionieren, kann das Gerät erkennen, dass es abgelehnt wurde, eine Trennung simulieren und mit einem anderen Satz von Deskriptoren erneut verbinden?

(Dies ist eine Frage zum USB-Aufzählungs-/Kommunikationsteil, nicht zur Hardwareimplementierung zum Anschließen der Batterie usw.)

Ich denke, dass es tatsächlich funktionieren könnte, und das Definieren mehrerer Konfigurationen, wie Sie es beschrieben haben, wäre der richtige Weg, aber wie andere darauf hingewiesen haben, gibt es keine Möglichkeit zu garantieren, wie das Gerät von einem (generischen) Windows-Treiber behandelt wird . Wenn Sie Ihren eigenen Treiber schreiben, können Sie natürlich den Host das Gerät so behandeln lassen, wie Sie es möchten, aber das Schreiben von Windows-Treibern ist nichts für schwache Nerven.

Antworten (1)

Das definiert einen normalen Enumerationsprozess. Wenn dies bei Ihnen nicht funktioniert und Sie die USB-Peripherieseite programmieren, können Sie dies problemlos tun.

Aufzählen, bei 500-mA-Anforderung fehlgeschlagen. Der Host sollte diesen Aufzählungsfehler gemäß den Specs signalisieren .

Das Gerät trennt die USB-Datenpins, ändert seinen USB-Deskriptor und signalisiert erneut eine Aufzählung.

Wenn fehlgeschlagen. Wiederholen Sie den Vorgang und ändern Sie den Deskriptor, um wieder mit eigener Stromversorgung zu lesen. Sie müssen eine Methode haben, um den Power-Pin zu wechseln. Ein USB-Netzschalter zum Beispiel. Eine Diode ODER Brücke, wenn der Spannungsabfall akzeptabel ist. Sie können den VUSB nicht mit Ihrer Batterie zurückspeisen, es sei denn, Sie möchten etwas kaputt machen. Dann nochmal signalisieren.

Der Deskriptor ist nichts als ein paar Bytes, die Sie über Variablen ändern könnten. Solange du das ändern kannst, ist alles in Ordnung.

Wie genau signalisiert der Host den Aufzählungsfehler?
@CL., dies ist nicht die Aufzählung "Ausfall", sondern eine Ablehnung eines Geräts, wenn sein Strombedarf nicht zum aktuellen Strombudget des Hosts passt. Die Aufzählung eines USB-Geräts ist abgeschlossen, wenn der Host die "Konfiguration" nach dem Einstellen der Geräteadresse durch Lesen einer Reihe von Deskriptoren einstellt. Wenn dieser letzte Teil des Aufzählungsprotokolls nicht abgeschlossen ist, kann das Gerät dies wissen und die von Passerby beschriebene Umschaltung durchführen.
"Gerät trennt die USB-Datenstifte" Kann es einfach den Pull-up auf D + senken, um die Verbindung zu trennen?
"Beim ersten Anschließen an USB führt CX3 automatisch die Cypress Vendor ID (0x04B4) auf und lädt die Firmware und USB-Deskriptoren über die USB-Schnittstelle herunter. Die heruntergeladene Firmware führt eine elektrische Trennung und Verbindung aus. CX3 führt erneut eine Auflistung durch, diesmal als definiertes Gerät durch die heruntergeladenen Informationen. Dieser patentierte zweistufige Prozess namens ReNumeration findet sofort statt, wenn das Gerät angeschlossen wird." Sie können die Neuaufzählung selbst nicht patentiert haben? Nur der ganze Bootloader-Prozess?
Wird diese Antwort davon beeinflusst, ob USB-C verwendet wird oder nicht?
@Reinderien Mit USB C haben Sie einen Pin, den Sie für PD verwenden, und kehren zu diesen Schritten zurück, wenn das andere Gerät ankündigt, dass Sie die alten USB-Schritte befolgen müssen. USB C gibt ein Strom-/Spannungsprofil aus, und Sie können es mit demselben Strom, niedrigerem Strom oder demselben mit einem gesetzten Flag akzeptieren, das Sie mehr Leistung wünschen. In diesem Fall wird die andere Seite ihr Bestes geben Sie mehr Leistung (ein USB-C-Hub könnte die Anfrage für mehr Leistung an den Upstream „weiterleiten“)