USBprog - universeller Adapter für Embedded-Programmierer

Abbildung 1: Fertig aufgebauter USBprog. Die einzelnen Komponenten: 1 acht IO-Ports, alternativ Port B vom ATMega32, + VCC und Masse, 2 Jumper als Schalter für Firmware, 3 Reset-Ansteuerung, 4 Einstellung VCC-Spannungsversorgung, 5 ansteuerbare LED, 6 UART-Anschluss, +VCC und Masse, 7 Power LED.

Eine einfache Schaltung hat das Zeug, eine ganze Handvoll proprietärer Adapter zu ersetzen, die sonst den Tisch des Embedded-Entwicklers vollmüllen. Mit anderer Firmware mutiert USBprog auch zur USB-to-RS232-Schnittstelle oder steuert Lampen und Motoren.

Im Lauf der Zeit sammeln sich bei Embedded-Entwicklern immer mehr Adapter an, die sie mit den diversen Mikroprozessor- und Evaluation-Boards entweder mitgeliefert bekommen oder aus schierer Notwendigkeit separat erworben haben. Jeder Adapter verbindet den PC mit dem Entwicklungsboard zum Programmieren, Debuggen oder einfach nur zum Datenaustausch. Jeder Hersteller kocht dabei sein eigenes Adapter-Süppchen, der Anwender hat das Durcheinander.

Es zu lichten ist Idee und Ziel des Projekts USBprog [1]: ein universell programmierbarer “USB zu fast beliebig”-Adapter, der sich zudem durch offene Hard- und Software auszeichnet. Seine einfache Schaltung ersetzt eine beträchtliche Zahl proprietärer Geräte.

Der Embedded-Entwickler wählt in einer speziellen Anwendung aus einem Online-Archiv eine Firmware aus und programmiert den Adapter damit. Damit verwandelt sich die USBprog-Platine in ein Programmiergerät für Atmel-AVR-Controller, einen ARM7/9-Debugger in Verbindung mit OpenOCD [2], einen USB-zu-RS232-Wandler oder in eine einfache IO-Schnittstelle.

Der Pool der Möglichkeiten wächst stetig. In den Startlöchern stehen im Augenblick eine Firmware für ein einfaches BDM-Interface, ein MSP430-Debugger und ein PIC-Programmiergerät.

Abbildung 1: Fertig aufgebauter USBprog. Die einzelnen Komponenten: 1 acht IO-Ports, alternativ Port B vom ATMega32, + VCC und Masse, 2 Jumper als Schalter für Firmware, 3 Reset-Ansteuerung, 4 Einstellung VCC-Spannungsversorgung, 5 ansteuerbare LED, 6 UART-Anschluss, +VCC und Masse, 7 Power LED.

Abbildung 1: Fertig aufgebauter USBprog. Die einzelnen Komponenten: 1 acht IO-Ports, alternativ Port B vom ATMega32, + VCC und Masse, 2 Jumper als Schalter für Firmware, 3 Reset-Ansteuerung, 4 Einstellung VCC-Spannungsversorgung, 5 ansteuerbare LED, 6 UART-Anschluss, +VCC und Masse, 7 Power LED.

Da das Projekt unter Linux begann, sind alle Versionen auch dafür konzipiert – viele kommerzielle Adaptern dagegen entstanden zuerst mit proprietärer Software und sind, wenn überhaupt, erst mit Verzögerung unter Linux einsetzbar. Darüber hinaus sind alle Unterlagen, Quelltexte und Pläne unter der GNU/GPL frei verfügbar, wodurch jeder die Möglichkeit hat, alles zu studieren und sich an der Entwicklung zu beteiligen.

Abbildung 2: Der Schaltplan für USBprog mit ATMega32 (IC1), USBN9604 (IC2), 10-poligem Stecker (SV2), UART-Anschluss (JP2), LED1 Status, LED2 Power, USB-B-Buchse oder einem A-Stecker (J1), Quarz 24 MHz (Y1).

Abbildung 2: Der Schaltplan für USBprog mit ATMega32 (IC1), USBN9604 (IC2), 10-poligem Stecker (SV2), UART-Anschluss (JP2), LED1 Status, LED2 Power, USB-B-Buchse oder einem A-Stecker (J1), Quarz 24 MHz (Y1).

Offene Hardware

Die Hardwareschaltung aus Abbildung 1 macht nur einen Teil des Gesamtkonzepts von USBprog aus. Sie ist so aufgebaut, dass ihre Funktionalität nicht an bestimmte Bauteile gebunden ist. Prinzipiell wären alle Komponenten mit vertretbarem Aufwand austauschbar, ohne USBprog von Grund auf neu entwickeln zu müssen. Als Mikrokontroller kommt derzeit ein weitverbreiteter ATMega32 [3] von Atmel zum Einsatz. Er ist nicht nur günstig in der Anschaffung, sondern es existieren viele freie Entwickleranwendungen dafür.

Da es nur wenige universelle und zugleich einfach zu handhabende Mikrokontroller mit USB-Interface gibt, sorgt ein externer Baustein, der USBN9604, für die USB-Schnittstelle. Controller und USBN kommunizieren über einen parallelen Bus (siehe Schaltplan in Abbildung 2). Neben dem USB-Port führt der USBN9604 auch einen programmierbaren Takt heraus, der in der Schaltung den ATMega32 versorgt. Die meisten Firmware-Versionen programmieren ihren Takt auf 16 MHz.

Kontakte nach draußen

Ein 10-poliger Stecker dient als Tor zur Außenwelt, die Leitungen sind frei belegbar, die jeweiligen Firmware-Beschreibungen geben Auskunft darüber. Die andere Aufgabe des Steckers ist es, die allererste Programmierung mit dem Bootloader durchzuführen. Dazu setzt der Entwickler einen Jumper auf JP1, der die Reset-Leitung des ATMega32 für externe Zugriffe freischaltet und den Anschluss jedes Standard-AVR-Programmiergeräts an den ATMega32 erlaubt.

Zusätzlich führt USBprog über den Jumper JP3 einen UART-Anschluss heraus. Für ihn ist eine Firmware verfügbar, mit der der Adapter vom PC aus gesehen zur RS232-Schnittstelle wird. Jumper 4 ist als Schalter für spätere Firmwares gedacht. Der Jumper JP2 konfiguriert ein Spannungspin an dem 10-poligen Stecker. Er schleift die 5 Volt des USB-Anschlusses direkt oder mit einer Schottkydiode geschützt zum Stecker durch. Ohne den Jumper ist der Pin nicht beschaltet und somit spannungslos.

Der hohe Abstraktionsgrad der Hardware setzt sich in der Software – sprich den Firmwares – fort. So gewährleistet es eine eigens für den USB-Baustein entwickelte Bibliothek [4], USB in jeder Mikrokontrolleranwendung ohne Spezialkenntnisse zu nutzen. Für den einfachen Einstieg in die Bibliothek ist mit [4] und [5] ausreichend Lesestoff vorhanden.

Das Wagnis der Initiation

Für den engagierten Bastler gibt es bereits fertige Platinenlayouts, die in Eigenregie im heimischen Hobbykeller produziert werden können. Für jene, die direkt loslegen wollen, gibt es fertig aufgebaute und programmierte Adapter auf der Projektseite für rund 40 Euro inklusive Versandkosten zu kaufen (siehe Abbildung 1). Wer die zweite Methode wählt, muss nur noch die USB-Buchse und den 10-poligen Stecker auflöten, da bereits alle SMD-Bauteile bestückt und verlötet sind.

Der nächste Schritt entpuppt sich als Henne-Ei-Problem. Das Gerät der Träume, das auch AVR-Controller programmieren kann, liegt auf dem Tisch und müsste sich nun selbst programmieren! Denn anfänglich ist keinerlei Bootloader oder Firmware im Flashspeicher des ATMega32-Controllers enthalten.

Wer einen befreundeten AVR-Hacker in der Nachbarschaft und damit Glück hat, borgt sich dessen Programmieradapter kurz aus. Wer nicht solche Freunde hat, dem bleibt die Möglichkeit, einen einfachen Parallelport-Programmierer [6] selbst zu basteln. Oder er bestellt einen fertig programmierten USBprog – die bequemste, aber auch langweiligste Variante. Ist das Gerät mit dem PC verkabelt und der Bootloader aktiviert, erkennt das Betriebssystem zunächst ein unbekanntes USB-Gerät. Im nächsten Schritt, der Wahl einer Firmware (mit einem extra entwickelten Programm) und deren Übertragung in den USBprog, erhält das Ganze seine gewünschte Funktion.

Viele Firmwares und Entwicklungstools

Die erste, am meisten verwendete und daher ausgereifteste Firmware ist die des AVR-Programmiergeräts. Sie eignet sich zum Programmieren von AVR- und einigen AT89-Mikrocontrollern der Firma Atmel. Da die Firmware nach den freigegebenen Datenblättern des originalen AVRISP mk2 entwickelt ist, funktioniert der Adapter 1:1 mit allen Original-AVR-Anwendungen, etwa AVR Dude [7] und AVR Studio [8]. Auch die Belegung des 10-poligen Steckers entspricht Atmels originalem ISP-Anschluss. Der Entwickler braucht nur ein 10-poliges Flachbandkabel zwischen dem USBprog und dem Zielprozessor einzuziehen.

Eine weitere beliebte Firmware ist die für OpenOCDs ARM-Debugger. OpenOCD bildet in einer GCC-ARM-Toolchain das Bindeglied zwischen Host-Entwicklungsumgebung und Zielhardware. Konkret: OpenOCD verbindet die Hardware mit dem freien GDB und ermöglicht damit echtes On Chip Debugging (OCD): Register- und Memory-Dumps, Single Step, Breakpoints und so weiter. Seit Sarge ist OpenOCD samt USBprog-Unterstützung fester Bestandteil von Debian Testing. Es gibt sogar eine USBprog-fähige MS-Windows-Version von OpenOCD.

Wer Embedded-Systeme mit Atmels AT89-Controllern programmiert, profitiert von einer anderen Firmware, auf die er nicht über ein Standardprogramm zugreift, sondern mit At89prog [9], einem eigens dafür entwickeltes Programm. Als weitere Variante gibt es einen universellen JTAG-Adapter, der sich relativ einfach in bestehende Quelltexte einbinden lässt. Auf diese Weise entstehen aktuell gerade ein Adapter für MSP430-Prozessoren und eine Anbindung für das freie JTAG-Tool von Openwince [10].

Neben den zahlreichen Programmieradaptern existieren für USBprog auch Firmwares für verschiedenste Steuerungsaufgaben (siehe Tabelle 1). Mit Simple Port beispielsweise kann man aus eigenen PC-Anwendungen heraus Geräte ansteuern. Die Simple-Port-Bibliotheken [11] bieten C-, Python-, Java- und andere Funktionen an, um die nach außen geführten Leitungen des USBprog als einfache Ein- und Ausgänge zu betreiben. Eine weitere Firmware macht den Adapter zum einfachen RS232-Wandler. Der ist als USB-Klassengerät implementiert und damit ohne extra Treiber in allen Betriebssystemen verwendbar. Im Aufbau befindet sich zudem ein kleines I2C-Testgerät. Und ein XSVF-Player [12] für Xilinix-Bausteine ist soeben entstanden.

Tabelle 1: Aktuelle
Firmware-Versionen

Damit USBprog-Besitzer nicht den Überblick über die vielen Firmwares verlieren, gibt es eine Anwendung, mit der sie aus dem Onlinepool bequem eine Version ausgewählen und direkt per USB-Verbindung übertragen dürfen. USBprog Flashtools fußt auf den Betriebssystemunabhängigen Bibliotheken WX Widget und Libusb, was deren Portierung leicht macht. Im Downloadbereich der Projektseite [1] lagern Versionen für die wichtigsten Betriebssysteme.

Beispiel: IO-Ports steuern

Wie erwähnt eignet sich die Firmware Simple Port [11] dazu, aus einem Programm die Ein- und Ausgabeleitungen von USBprog zu bedienen. So könnte USBprog Lampen, einen Motor oder eine einfache Schnittstelle ansteuern. Die erste Bibliothek war in C verfasst. Das Wrapper-Entwicklungswerkzeug Swig [13] sorgt für die Anbindungen an diverse andere Programmiersprachen. In C würde ein einfacher Zugriff aussehen wie in Listing 1.

Listing 1: Blinkende
Status-LED

01 #include <simpleport.h>
02 
03 int main()
04 {
05   struct simpleport * sp_handle;
06   int i;
07   /* Oeffnen des Geraets */
08   sp_handle = simpleport_open();
09 
10   /* Pin als Ausgang */
11   simpleport_set_pin_dir(sp_handle,11,1);
12   for(i=0;i<4;i++){
13    simpleport_set_pin(sp_handle,11,1); //LED an
14    sleep(1);
15    simpleport_set_pin(sp_handle,11,0); //LED aus
16    sleep(1);
17   }
18   simpleport_close(sp_handle);
19 
20   return 0;
21 }

Ähnlich elementar arbeitet »SimplePort_rs232«. Die Version entstand aus der ursprünglichen Simple-Port-Firmware und dem RS232-Wandler. Wer sie installiert, kann in einem Terminal über das entsprechende Gerät »/dev/ttyACMx« die Kommandos aus Tabelle 2 absetzen. Der Parameter »Pin« liegt im Wertebereich »1«, »2« … »9«, »A«, »B«. Der Parameter »Pin-Wert« ist »1« oder »0«. Jedes Kommando schließt mit »*«. Alle benötigten Dateien und Bibliotheken gibt es auf der Firmware-Seite [11].

Tabelle 2: Kommandos für
»SimplePort_rs232«

Fazit und Ausblick

Die Community von USBprog wächst wie die Menge der neuen Firmwares. Das mag daran liegen, dass selbst der kleinste Geldbeutel reicht, einen solchen Adapter zu kaufen oder selbst zu bauen. Das Projekt gibt sich einladend, verfolgt es doch das Ziel, eine gemeinsame Hardwareplattform für viele Programmiergeräte und Ansteuerungen zu etablieren. Es bleibt zu hoffen, dass weitere Entwickler und Bastler Spaß am Projekt finden und es aktiv unterstützen. (jk)

USBprog auf Embedded World
2008

Besucher der Messe “Embedded World” vom 26. bis 28. Februar in Nürnberg können USBprog dort besichtigen. Die FH Augsburg ist in Nürnberg mit ihrem Stand 208 in Halle 11.0 vertreten. An gleicher Stelle wird die im Artikel erwähnte Debugging-Software OpenOCD präsentiert. Beide Projekte sind im Bereich Embedded Systeme der FH Augsburg mit Unterstützung von Prof. Dr. Hubert Högl entstanden. Der Autor und USBprog-Initiator dankt Högl und der Fachhochschule herzlich für ihre Unterstützung.

Infos

[1] USBprog: [http://www.embedded-projects.net/usbprog]

[2] OpenOCD-Projekt: [http://openocd.berlios.de/web]

[3] ATMega32-Datenblatt: [http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf]

[4] USB9604-Bibliothek: [http://usbn2mc.berlios.de]

[5] USB-Tutorial für USBn2mc: [http://www.usb-projects.net]

[6] Parallel-Programmer: [http://www.ixbat.de/index.php?page_id=188]

[7] AVR Dude: [http://savannah.nongnu.org/projects/avrdude/]

[8] AVR Studio: [http://www.atmel.com/avrstudio]

[9] At89prog: [http://www.embedded-projects.net/index.php?page_id=189]

[10] Openwince: [http://openwince.sourceforge.net/jtag/]

[11] Simple Port: [http://www.embedded-projects.net/index.php?page_id=174]

[12] XSVF-Player: [htp://www.embedded-projects.net/index.php?page_id=155]

[13] Swig: [http://www.swig.org]

[14] Projekt-Forum: [http://forum.embedded-projects.net]

[15] Projekt-Shop: [http://shop.embedded-projects.net]

Der Autor

Benedikt Sauter ist leidenschaftlicher und freiberuflicher Open-Source-Hardware- und Software-Entwickler. Im Juli 2007 hat er sein Informatikstudium mit der Diplomarbeit “Entwurf und Implementierung eines freien USB-Stacks für eingebettete Systeme” beendet. Sauter sieht seine Arbeit an USBprog auch als Bekenntnis zu Open Source. Für diesen Artikel dankt er dem Linux-Magazin-Autor Nils Färber für die Unterstützung beim Verfassen.

E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben