ADB nach USB - Konverter, USB-HID Kompatibel

Mon 12 November 2012

Elektronik, PIC, Retro, USB

Dieser Artikel beschreibt den Aufbau eines Protokollumsetzers von Apple ADB, eine alten Busprotokoll für Eingabegeräte, auf den heute gängigen USB.

Allgemeines

Die Firma Apple Computer stellte in den 80er und frühen 90er Jahren des letzten Jahrhunderts, wie auch heute noch, Computersysteme her. Damals waren jedoch die Designanforderungen an die Geräte andere, es wurde eher auf Haltbarkeit und Robustheit konstruiert. Dabei wurden insbesondere Tastaturen und Mäuse entworfen, welche an Robustheit und Komfort noch heute, in den Augen einiger, Maßstäbe setzen.

Insbesondere das "Extended Keyboard II" hat sich beim Autor sehr gut bewährt. Leider hat die Unterstützung des damals eingesetzen Bus-Systems (ADB=Apple Desktop Bus) heute bis auf nahe Null abgenommen. Um die Tastatur vor der Verschrottung zu bewahren und diese weiterhin nutzen zu können wurde ein ADB auf USB-Konverter entworfen. Im Handel gibt es zwar eine Hand voll kommerzieller Produkte, welche zumindest in einem vorliegenden Fall, nur das ADB-Protokoll in USB einkapseln. Dies ist leider Außerhalb von Mac OS nicht ganz zweckmäßig, zwar hat Linux eine Unterstützung für ADB, die Frage ist aber wie lange noch irgend jemand solch eine Bus aus dem Computer-Eisenzeit unterstützen möchte. Zum Beispiel ist nicht klar, ob ein Rechner mit OS X 10.8 noch irgend etwas mit einer ADB nach USB Bridge anfangen kann.

Ziel des Projektes ist es, dem Host-Computer gegenüber als "moderne" USB-Tastatur zu erscheinen, während die Tastatur ihre gewohnte ADB-Kommunikation durchführt.

Hardware Details

Hier der, eher übersichtliche Schaltplan der elektronischen Seite des Projekts.

Der PIC wird direkt aus dem USB versorgt, ebenso der ADB Port und die daran angeschlossenen Geräte.

Die Schaltung zum Senden und Empfangen entspricht einer durch den Computerhersteller empfohlenen Konfiguration. Ein NPN-Transistor arbeitet als Open-Collector "Treiber" gegen einen 470 Ohm Pull-Up-Widerstand gegen +5V. Dieser wird vom CCP1-Modul des PIC angesteuert

Der Busstatus wird über den Pin RB0 eingelesen. Diese Konfiguration währe theoretisch auf durch geschicktes Umschalten der TRIS-Bits im PIC möglich gewesen, aber auch mit mehr Aufwand in der Software verbunden.

Die Flankensteilheit sowohl der steigenden als auch der fallenden Flanke sind ausreichtend, d.h. << einer Periodendauer.

Die elektrische Spezifikation wird sehr detailliertin einem Apple-Handbuch, welches auf archive.org verfügbar ist, beschrieben. Hierzu sucht man mit jeweils bevorzugten Suchmaschine nach "Guide to the Macintosh Familiy Hardware".

Software

Die Software ist in der, relativ unbekannten, PIC-Programmiersprache JALv2 (Just Another Language) geschrieben, diese bietet eine gute Unterstützung der PIC-Hardware, ohne dass bestimmte C-Konstrukte auf dem PIC mühsam emuliert werden müssen.

Es gibt im Internet eine recht aktive Gemeinschaft der JAL-Entwickler, welche auch in einer Bibliothek USB-Implementation für diese Sprache bereitstellen. Der PIC 18F4550 bringt bereits ab Werk den Hardwareteil einer USB-Schnittstelle mit. Dieser wird durch einen Software-Stack zu einer USB-Geräteimplementation vervollständigt.

Die Implementation der ADB-Seite stellt die größte Herausforderung in diesem Projekt dar, da es sich nicht um eine klassische UART-ähnliche Schnittstelle handelt. Vielmehr ist es eine Art Puls-Pausenmodulation, welche in der Bitdarstellung eher an einige Infrarot-Fernbedienungsprotokolle erinnert. Das Timer1- wird zusammen mit dem Capture-Compare-Modul eingesetzt, um dieses Timing zu umzusetzen. Der Programmcode stellt in einem Ringpuffer die Zeitabschnitte zwischen zwei Pegelwechseln am ADB-Busausgang bereit. Eine Interrupt-Routine wird jeweils nach Ablauf eines Intervalls aufgerufen und holt die neue Wartezeit. Damit ist ein sehr genaues Einhalten der Pulsfolgenzeiten möglich. Das folgende Diagramm zeigt das Sendens einer Attention-Sync-Condition, das Senden von Bits erfolgt analog.

Timing des ADB-Sendens

Der Empfang von ADB-Antworten passiert im normalen Programmablauf. Dies widerspricht eigenlich der Nebenläufigkeit der USB- und ADB-Stacks, scheint jedoch nach den gemachten Erfahrungen keine Probleme im täglichen Betrieb zu verursachen. Das Abtastungsverfahren ist an das von Sprite [1] beschriebe Verfahren angelehnt.
Dabei wird nach der fallenden Flanke auf dem Bus die Leitung ca. 50µs später abgetastet. Ist diese zu dem Zeitpunkt High, so wird vermutlich gerade ein 1-Bit gesendet, anderenfalls ein 0-Bit. Dabei muss die Leitung innerhalb vom 80 weiteren µs wieder auf High-Pegel kommen und auch wieder eine fallende Flanke aufweisen. Wenn dies der Fall ist, so ist das Bit als gütig zu kennzeichnen. Damit ist ja die Leitung wieder low und der Bit-Empfang beginnt von vorn. Im unten stehenden Diagramm handelt es sich um den Empfang zweier Bits, zuerst 0, dann 1.

Timing des ADB-Empfangs

Gegenwärtig ist nur eine Tastatur des Typs "Extended Keyboard II" als Gerät am ADB unterstützt, da das Ziel der Adaption dieser Tastatur an einen modernen Rechner erfüllt ist. Beispielsweise die zugehörigen Mäuse sind aufgrund der einzelnen Maustaste nicht für bestimmte Applikationen, wie z.B. Xfig, geeignet und von daher von sekundärer Bedeutung für den Autor. Durch das Protokoll des ADB ist jedoch gewährleistet, dass alle anderen Geräte einfach ignoriert werden, ohne dass es zu gegenseiten Störungen kommen sollte.

Downloads

Die Firmware basiert wie oben genannt auf dem Code der jallib-Gruppe. Es gilt eine BSD artige Lizenz, für Details siehe die Webseite der Jallib-Entwickler (http://code.google.com/p/jallib).
Die Firmware tgz entält alles, was man zum Starten braucht, auch eine HEX-Datei zum direkten Brennen (adb2usb/code/main.hex). Diese ist auch ohne JAL-Kompiler direkt auf den PIC ladbar. Wer selbst an dem Code weiterarbeiten möchte, oder etwas anderes daraus machen will, kann dazu die beiliegenenden Quellen benutzen. Hierbei ist zu beachten, dass die Quellen der Jallib wirklich auf ein Minimum beschränkt wurden, um den Download zu verkleinenern. Jedoch kann auch einfach das Originalpaket des Quellcodes verwendet werden, dort sind dann mehr PICs unterstützt.

Literatur

  1. SpritesMods.com: Macintosh SE/arm - Keyboard/mouse: http://spritesmods.com/?art=macsearm&page=4
  2. sprut.de: pic: basics Compare-Output: http://www.sprut.de/electronic/pic/grund/compare.htm