Ich habe den Auftrag bekommen, einen Gerätetreiber für ein Embedded-Gerät zu schreiben, der über die SPI-Schnittstelle mit dem Mikrocontroller kommuniziert. Schließlich wird die USB-Schnittstelle verwendet, um den aktualisierten Code extern herunterzuladen und während der Überprüfungsphase zu verwenden.
Meine Frage ist: Kennt jemand ein gutes Referenzdesign oder eine Dokumentation oder ein Online-Tutorial, das die Implementierung / das Design des USB-Protokoll-Stacks / Gerätetreibers in einem eingebetteten System behandelt? Ich fange gerade an und das Lesen der 650 Seite USB 2.0 Spezifikation ist im Moment ein wenig entmutigend.
Genau wie ein FYI, der Mikrocontroller, den ich verwende, ist ein Freescale 9S12.
Markieren
Basierend auf den Kommentaren von goldenmean (-AD) wollte ich folgende Information hinzufügen:
1) Das eingebettete Gerät verwendet ein benutzerdefiniertes Executive und verwendet kein COTS oder RTOS.
2) Das Gerät verwendet Interrupts, um anzuzeigen, dass Daten bereit sind, vom Gerät abgerufen zu werden.
3) Ich habe einige Dokumente über Linux gelesen, aber da ich mit Linux überhaupt nicht vertraut bin, ist es im Moment nicht sehr hilfreich (obwohl ich hoffe, dass es sehr schnell geht).
4) Der Design-Ansatz, zumindest jetzt, um einen Gerätetreiber für das USB-Gerät zu schreiben, würde dann eine USB-Protokollschicht (I / O) auf dem Gerätetreiber befinden, um die Daten zu interpretieren. Ich würde annehmen, dass dies der beste Ansatz wäre, obwohl ich falsch liegen könnte.
Bearbeiten - Ein Jahr später
Ich wollte nur ein paar Dinge teilen, bevor sie aus meinem Gedächtnis verschwinden, falls ich nie wieder an einem USB-Gerät arbeite. Ich bin bei der Entwicklung von Code auf ein paar Hindernisse gestoßen und habe ihn zum ersten Mal gestartet.
Das erste Problem, auf das ich stieß, war, dass der Host eine Reset-Anfrage ausgab, wenn das USB-Gerät mit dem Host verbunden war (Windows in meinem Fall). Das USB-Gerät würde die Interrupt-Aktivierungsflags zurücksetzen und löschen. Ich habe die Literatur nicht genug gelesen, um zu wissen, dass dies passierte, daher erhielt ich nie den Unterbrechungs-Request für Setup-Anfragen. Es hat eine ganze Weile gedauert, bis ich das herausgefunden habe.
Das zweite Problem, mit dem ich zu kämpfen hatte, war, die Set-Up-Anfrage für Set_Configuration nicht korrekt zu bearbeiten. Ich habe es gehandhabt, aber ich habe die Anfrage nicht korrekt bearbeitet, da das USB-Gerät keine ACK gesendet hat, als diese Setup-Anfrage einging. Ich habe das schließlich herausgefunden, indem ich einen Hardware-USB-Protokollanalysator verwendet habe.
Es gab andere Probleme, denen ich begegnete, aber das waren die zwei größten, die mich eine ganze Weile brauchten, um es herauszufinden. Das andere Problem, um das ich mich sorgen musste, ist Big-Endian und Little-Endian, Freescale 9S12 vs USB-Datenformat (Intel), bzw..
Ich habe schließlich den USB-Gerätetreiber erstellt, der den UART-Gerätetreibern ähnelt, die ich in der Vergangenheit gemacht hatte. Ich habe den Code an die folgende URL gepostet.
Ich neige dazu, Strukturen häufig zu verwenden, so dass Leute sie nicht mögen, da sie nicht so Portal sind wie #defines (z. B. MAX3420_SETUP_DATA_AVAIL_INT_REQR 0x20), aber ich mag sie, da sie den Code für mich lesbarer macht. Wenn jemand Fragen dazu hat, bitte zögern Sie nicht per E-Mail und ich kann versuchen, einen Einblick zu geben. Das Buch "USB Complete: The Developer's Guide" war hilfreich, solange man wusste, auf welche Bereiche man sich konzentrieren sollte. Dies war eine einfache Anwendung und verwendete nur langsames USB.
Ich habe eine frühere Ausgabe von USB Complete von Jan Axelson verwendet. In der Tat sehr vollständig.
Aus der redaktionellen Überprüfung:
Dieses Entwicklerhandbuch für die USB-Schnittstelle (Universal Serial Bus) deckt jetzt in seiner vierten Ausgabe alle Aspekte der Projektentwicklung ab, wie z. B. Hardwaredesign, Gerätefirmware und Host-Anwendungssoftware.
Beim Schreiben eines Gerätetreibers für eine beliebige Schnittstelle (USB, Parallelanschluss usw.) hängt der zu entwickelnde Code davon ab, ob ein Betriebssystem (BS) auf diesem Prozessor / Microcontroller läuft. z.B. Wenn das läuft, sagt WinCE - Es wird sein eigenes Treiber-Entwicklungskit haben und Schritte, die bei der Gerätetreiberentwicklung zu befolgen sind. Das gleiche gilt für jedes andere Betriebssystem wie Linux, Symbian.
Wenn es sich um einen einfachen Firmware-Code (kein Betriebssystem) handelt, der den Prozessor / Mikrocontroller steuert, dann ist das eine ganz andere Situation. Also, basierend auf einer der obigen Situation, in der Sie sich befinden, muss man lesen & amp; verstehe: -
1.) Die Hardware-Spezifikation der Prozessor- / Mikrocontroller-Entwicklungskarte - Registrieren Sie Dateien, Ports, Speicherlayouts usw.
2.) USB-Spezifikation
3.) Paar Zeiger, die ich schnell gefunden habe. Google Shud sei dein Freund! Ссылка - Linux USB-Gerätetreiber
-AD
Ich bin neugierig, warum hast du den 9S12 ausgewählt? Ich habe es bei einem früheren Job benutzt und war nicht erfreut.
Das einzige, was ich nicht mehr mag, ist ein 8051. Ich benutze einen ARM CortexM3 bei meiner jetzigen Arbeit, es ist besser als ein 9S12 in jeder Hinsicht (schnellerer Takt, mehr Arbeit pro Takt, weniger Stromverbrauch, billiger, gute gcc-Unterstützung, 32-bit vs. 16-bit).
Ich weiß nicht, welche Hardware Sie verwenden möchten, aber vorausgesetzt, dass diese flexibel ist, bietet STMicro eine Reihe von Mikrocontrollern mit USB / SPI-Unterstützung und eine C-Code-Bibliothek, die mit ihren Teilen verwendet werden kann. - Ich habe ihre ARM7-Serie seit Jahren mit großem Erfolg eingesetzt.
Hier ist eine hervorragende Seite von Jonathan Valvano, Professor an der Universität von Texas. Er unterrichtet dort vier Kurse (drei Studenten, ein Absolvent), alle arbeiten mit einem 9S12 Mikrocontroller. Seine Site enthält alle Vorlesungsnotizen, Laboranleitungen und vor allem Starter-Dateien, die er für alle seine Klassen verwendet.
Die Website sieht aus wie in den 90er Jahren, aber graben Sie einfach ein bisschen herum und Sie sollten alles finden, was Sie brauchen.
Ich arbeite an einem Projekt mit dem Atmel V71. Der Prozessor ist sehr leistungsfähig und unter vielen High-End-Konnektivität auf dem Chip ist eine USB-Engine, die Gerät oder Host-Modi für 480 Mhz oder 48 MHz (nicht USB 3.0) tun wird. Die Tools sind kostenlos und enthalten eine Reihe von Host- und Geräte-USB-Beispielprojekten mit dem gesamten USB-Stack-Code. Es unterstützt 10 Endpunkte und alle Übertragungen erfolgen über DMA, so dass Sie die Prozessorleistung für andere Aufgaben zur Verfügung haben. Der Atmel USB-Stack funktioniert ohne ein RTOS zu benötigen
Tags und Links embedded usb device-driver