XMEGA-A1 XPlained unter Linux (/dev/ttyACM0)

Ich habe heute eine Weile damit verbracht, das XMEGA-A1 XPlained Evaluation-Kit unter Linux ansprechbar zu machen. Es dient der Evaluierung des ATxmega128A1 Mikrocontrollers. Bei mir zum Test der Implementierung eines Protokollstacks. Dabei gibt es folgendes Problem: Per USB angesteckt, wird zwar eine Gerätedatei /dev/ttyACM0 angelegt, jedoch lässt sich diese Schnittstelle nicht öffnen. Nach einiger Zeit lieferte Minicom eine Fehlermeldung.

Mit strace ist die Problemstelle recht schnell gefunden. Der Systemaufruf open() liefert -EINVAL zurück. Nach einigem Suchen wurde ich hier fündig. Das Problem liegt an einer älteren Firmware im UC3 Board-Controller. Der AT32UC3B1256 Schnittstellen-Controller funktioniert nicht mit der ausgelieferten Firmware unter Linux. Updaten hilft!

Die Firmware ist ein Beispiel des Atmel Software Framework (ASF) und muss in neuer Version neu übersetzt werden. Dazu habe ich das Atmel-Studio 6.1 installiert. Das Beispiel heißt „USB Device CDC Example – Board Controller“ (ASF 3.8.1). Die Standardeinstellungen in diesem Projekt führen dazu, dass sich das Evaluation-Board mit der USB-PID 0x2310 meldet (eigentliche PID des XMEGA-A1 XPlained ist 0x2122). Daher sind kleine Konfigurationen im Code vorzunehmen:

In der Datei asf-3.8.1/common/services/usb/usb_atmel.h ist die Zeile

#define USB_DEVICE_PRODUCT_ID USB_PID_ATMEL_UC3_CDC_DEBUG

zuändern in

#define USB_DEVICE_PRODUCT_ID USB_PID_ATMEL_XPLAINED

IMG_20130522_133009(1)

Zum Aktualisieren der Firmware im Board-Controller muss der Bootloader-Jumper (roter Pfeil) überbrückt sein.

Das erzeugte Hex-File kann über den Bootloader in den AT32UC3B1256 geladen werden. Dazu muss der Bootloader-Jumper vor dem Anschließen des USB-Ports gesetzt sein – also ein kleines bisschen Löten oder kurz mit Pinzette überbrücken. Mit dem DFU-Programmer kann das Hex-File anschließend übertragen werden; ggf. unter Windows den im Archiv enthaltenen USB-Gerätetreiber installieren.

dfu-programmer at32uc3b1256 erase
dfu-programmer at32uc3b1256 flash --suppress-bootloader-mem XPlained-BoardController-ASF-3.8.1-AT32UC3B1256.hex
dfu-programmer at32uc3b1256 start

Nach dem Firmware-Update kann unter Linux die Schnittstelle geöffnet sowie Zeichen ausgegeben und gelesen werden.

Update

Mir scheint es so, als würde das Löschen des Empfangepuffers noch nicht korrekt funktionieren. Nur jedes zweite Öffnen der Schnittstelle liefert Daten. Dann aber zunächst veraltete. Hier muss noch nachgebessert werden.