Was sind die Einschränkungen des USB-Composite-Geräts?

Ich betrachte die Codierung eines USB-Geräts, das zwei USB-Geräte kapseln kann. Ich möchte eine HID-Tastatur mit einem einzigen zusätzlichen USB-Anschluss erstellen. Ein Massenspeichergerät würde an den Port angeschlossen werden.

Ich habe mich gefragt, ob ich die Tastatur so programmieren kann, dass sie als zusammengesetztes Gerät registriert wird, das den Massenspeicher und die Tastatur einkapselt.

Mein aktueller Denkprozess besteht darin, die Tastatur mit 2 Schnittstellen zu deklarieren. Ich dachte daran, einfach die USB-Befehle vom Massenlaufwerk in eine der Schnittstellen der Tastatur zu kopieren. Ist das möglich?

Wenn dies falsch gedacht ist, teilen Sie mir bitte mit, wie die Datenformatierung der Schnittstellen aussehen soll.

Danke schön.

Außerdem dient dies zu Bildungszwecken, um mein Wissen über USB zu erweitern.

Es ist einfacher, ein Hardware-USB-Hub-IC zu verwenden, als zu versuchen, einen USB-Hub in Composite zu erstellen. Diese ICs benötigen also nur eine Kappe und einen Kristall.

Antworten (2)

Sie können keine "HID-Tastatur" mit einem "einzelnen zusätzlichen Port" haben; Das Gerät dieser Art muss ein zusammengesetztes Gerät sein , das aus einem Zwei-Port-Hub besteht, wobei ein Port mit einem nicht entfernbaren HID-Gerät verbunden ist. Der andere Anschluss kann dauerhaft mit einem Massenspeichergerät verbunden sein. In diesem Fall müssen Sie dies möglicherweise nicht als zusammengesetztes Gerät (ein Gerät, das zwei alternative Klassen unterstützt) einpacken.

Das Entwerfen des richtigen Satzes von Deskriptoren für diese Art von Geräten ist furchtbar kompliziert (zumindest aus der Sicht des Hardware-Typen), aber Sie können fertige Anleitungen verwenden, beispielsweise von Keil-Compiler-Unterstützung, MDK-Middleware für USB-Geräte und Host- Kommunikation . Dieser Link ist ein Beispiel für ein zusammengesetztes USB-Gerät, das auf zwei der vorherigen Tutorials „USB Device HID“ und „USB Device mass storage“ basiert. Ich hoffe, das ist genau das, was Sie brauchen.

Hallo. Danke für Ihre Antwort. Vielen Dank für die Ressource. Ich werde es mir später mal anschauen. Ich frage mich jedoch, warum muss es ein zusammengesetztes Gerät sein? Mein bisheriges Verständnis ist, dass ein Comprosite-Gerät die Fähigkeit von 2 USB-Geräten ermöglichen kann, über die Schnittstelle als 1 angezeigt zu werden. Ist dieses Verständnis falsch?
@philm, ich glaube, mir war nicht klar, dass Sie zwei Möglichkeiten haben, zusammengesetzt und zusammengesetzt. Da Sie "zusätzlichen USB-Anschluss" sagten, wäre dies ein Pfad für ein zusammengesetztes Gerät, wenn beide Funktionen gleichzeitig über einen eingebetteten Hub verfügbar sind. Der Vorteil wäre, alle Standard-Host-Treiber für dieses Gerät zu verwenden. Wenn Sie möchten, dass die Massenspeicherfunktion ausgeblendet wird und Sie die Schnittstellen eines Verbundgeräts wechseln, benötigen Sie wahrscheinlich einen proprietären Treiber.
Ah ok, das klärt sich auf. Unter welchen Bedingungen sollte ich also das zusammengesetzte Gerät im Vergleich zum zusammengesetzten Gerät und umgekehrt verwenden?
@philm, Verbundgeräte bestehen normalerweise aus diskreten Controller-ICs. Ich glaube, es ist im Allgemeinen unmöglich, einen USB-Hub innerhalb einer MCU zu synthetisieren. Wenn Sie nur eine MCU haben, ist der Verbund der einzige Weg.
Ja, noch einmal, das ist nur für die Bildung. Ich habe einen Artikel gelesen, in dem ich einen TLC implementieren und auf jedes USB-Gerät über eine Berichts-ID verweisen konnte. Für mich scheint dies eine ziemlich einfache Lösung zu sein, anstatt die Schnittstellen zu verwenden, die, so wie es klingt, ein Ärgernis wären.

Ich habe früher viele solcher zusammengesetzten Geräte (HID + Massenspeicher) hergestellt, aber nicht mehr. Es gibt zwei Probleme. Das erste ist, dass Windows sie nicht mehr mag. Heutzutage gibt es eine Menge Probleme bei der Kommunikation mit zusammengesetzten Massenspeicher-Endpunkten. Sie funktionierten gut in Windows 2000 und Windows XP, aber nicht mehr so ​​​​viel. Ich habe keine Ahnung warum - vielleicht kann mich jemand aufklären?

Das zweite Problem besteht darin, dass, wenn Sie ein Massenspeichergerät als Teil Ihres zusammengesetzten Gerätedeskriptors deklarieren, Ihr Mikrocontroller-Code die Anforderungen des Massenspeichergeräts verarbeiten muss. Sie können sie nicht einfach Byte für Byte an einen anderen USB-Port weiterleiten, da die Schnittstellendeskriptoren (mit ziemlicher Sicherheit) unterschiedlich sind. Sie können dies tun, wenn Sie einen anderen USB-Host-Port in Ihrer MCU haben: Schreiben Sie den USB-Host-Code, der mit dem USB-Flash-Stick (oder sogar einem völlig anderen Speichergerät wie einer SD-Karte) kommuniziert, und leiten Sie die Block-Lese- und Schreibbefehle zwischen Ihrem Verbund weiter Schnittstelle und das andere Speichergerät. Es funktioniert zumindest mit Linux und älteren Windows-Kernels.

Aber wenn Sie nur einen einfachen USB-Anschluss an der Seite Ihrer Tastatur haben möchten und keine zusätzlichen Anforderungen haben (z. B. dass die Tastatur den USB-Flash-Speicher ohne den PC lesen kann), dann greifen Sie einfach zu einem USD0 .3 USB-Hub-IC, setzen Sie ihn auf dieselbe Platine, verdrahten Sie einen der Ports mit Ihrem Mikrocontroller und den/die anderen mit externen Anschlüssen in Ihrem Produkt. Der Vorteil besteht darin, dass Ihr Produkt dann Standard ist, z. B. können alle Arten von USB-Geräten an die externen Ports angeschlossen werden, einschließlich weiterer Hubs, und Sie haben keinerlei Probleme mit Ihrer MCU-Software.

[Bearbeiten] hmm ... ich habe nachgedacht ... Ich denke, es könnte möglich sein, die MSC-Protokollbefehle (die USBC - Daten - USBS-Pakete) an den anderen USB-Port weiterzuleiten, was die gesamte Softwareimplementierung erleichtern würde. .. aber die anderen Probleme bleiben.