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.
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.
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.
Passant