USB-Kommunikationsprotokoll Software bestimmt Hardware

Zusammenstellen der Softwareplattform

Der zu Designer gehörende Software-Platform- Builder verbindet sich auf passende Weise mit OpenBus und kann alle maschinennahen Hardware- Wrapper und Treiber sowie den kontextabhängigen Code für die Peripherie im jeweiligen Design visuell zusammenfügen, ohne dass der Anwender mit maschinennahem Code zu tun hat. Im Lieferumfang sind einige USB-Beispiele enthalten. Die Beispielanwendung »USB-Maus und -Tastatur« veranschaulicht die Anwendung der USB-Host-HID-Treiber (Human Interface Device).

Auf der Tastatur eingetippte Zeichen und Mauskoordinaten werden auf einem Terminal- Instrument angezeigt. Eine andere Anwendung ist »USB Mass Storage«. Sie macht deutlich, wie Bilddateien aus einem USB-Massenspeicher gelesen und auf dem Touchscreen der Entwicklungsplattform »Nanoboard« dargestellt werden.

Wie jede andere in Designer entwickelte Software beginnt der Prozess mit einem Embedded-Projekt, zu dem der Anwender eine Softwareplattform und eine C-Quellcode-Datei hinzufügt. Die Softwareplattform wird anschließend editiert, um Device-Stacks für jedes Hardwareelement des Designs zusammenzustellen. Ist diese Arbeit getan, kann das Schreiben des höheren Applikationscodes in »main.c« beginnen.

Aufbau des Protokollstapels

Der »Designer« ist eine durchgängige Entwicklungsumgebung, die das Hardwaredesign im FPGA mit dem auf der Hardware laufenden Embedded-Code verbindet. Deshalb kann der Entwickler direkt aus dem FPGA-Hardwareprojekt heraus mit dem Erstellen der untersten Ebene der Softwareplattform beginnen, indem er die Schaltfläche »Import from FPGA« anklickt. Das führt dazu, dass jedes im FPGA-Design vorgefundene Hardware-Element einen Hardware-Wrapper (in Bild 2 grün dargestellt) erhält.

Die weitere Vorgehensweise besteht darin, einen Wrapper auszuwählen und die Schaltfläche »Grow Stack Up« anzuklicken, um die Treiber (gelb) und die Kontextschicht (blau) hinzuzufügen. Der Stack lässt sich jetzt durch direktes Auswählen des passenden Kontextes bis zur obersten Schicht erweitern. Bild 2 zeigt die fertiggestellte Plattform für das Beispielprojekt »USB-Maus und -Tastatur«, bereit für den Betrieb auf dem »NanoBoard 3000«. Ist ein USB-Stack für die Tastatur definiert, kann der USB-Host-Controller »ISP 1760« an den existierenden Stack angebunden werden (»Link to Existing Stack«). Da jener Host-Controller drei USB-Ports unterstützt, soll der zweite USB-Stack für das Zeigegerät (die Maus) dienen. Dazu wählt der Anwender den vorhandenen USB-Host-Treiber aus und klickt erneut auf die Schaltfläche »Grow Stack Up« um den »Pointer Services«-Stack hinzuzufügen. Mit dem Aufbau des Terminal-Stacks ist die Softwareplattform fertig.

Codierung der Applikation

Nachdem die Softwareplattform fertig und alles für das eigentliche Schreiben des Codes bereit ist, stellt sich die Frage nach den verfügbaren APIs. Hierzu ist das Kontextmodul im Stack (beispielsweise »Pointer Context«) anzuklicken und F1 zu drücken. Daraufhin öffnet sich das »Knowledge Center Panel« des Designers und gibt Informationen über die Anbindung an die Pointer-Services aus.

Der Rahmen dieses Artikels lässt es nicht zu, im Detail auf das Schreiben des Applikationscodes einzugehen. Hierfür kann das Beispielprojekt auf einem eigenen »NanoBoard 3000« nachgebaut beziehungsweise heruntergeladen werden.

Nach dem Programmieren des FPGAs öffnet der Anwender das Terminal-Instrument, klickt auf »Download« in der »Devices«-Ansicht und startet die Applikation. Das Terminal-Instrument zeigt daraufhin Tastatur- und Maus-Ereignisse an (Bild 3).