Raspberry Pi als Universalprogrammer

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Gestartet von Benutzer:Fpgakuechle (Volker Urban)

Dieser Artikel beschreibt, wie man den Minicomputer Raspberry Pi als Universal-Programmiergerät für Mikrocontroller, FPGAs usw. verwenden kann. Der Artikel ist noch in Arbeit, die Beschreibung der AVR-Programmierung ist aber schon komplett. Ergänzungen und Korrekturen sind willkommen.

Raspberry Pi as AVR-programmer

Allgemeines

Die nötigen GPIOs des Raspberry sind mit dem Programmierinterface des µC verbunden, ebenso die Stromversorgung des zu programmierenden Devices. Der RasPi ist über Ethernet oder WLAN mit einem PC verbunden. Auf dem PC (Laptop, Windows, Apple, egal) läuft ein Terminal-Programm bzw. ein Skript mit dem die Programmiertools auf dem RasPi gesteuert werden. Die Programmierdatei wird ebenfalls über das Netzwerk auf den RasPi übetragen. Falls diese Konfiguration auch an einem Laptop laufen soll muss die Stromversorgung auch mobil sein, also kein Steckernetzteil.

Netzwerkkonfiguration Headless Betrieb

Für die Nutzung des RasPi ohne Monitor und RasPi-eigene Tastatur nur über eine ssh-Verbindung über Ethernet (headless Betrieb) werden oft Einstellungen vorgeschlagen, die leider dazu führen, dass eine Internetverbindung des RaspPis über WLAN nicht mehr möglich ist. Leider ist es dann auch nicht mehr möglich die Pakete für den Programmer zu installieren. Deshalb empfiehlt der Autor erst nachdem der RasPi nachweislich als Programmer funktioniert, diesen auf Headless-Betrieb umzustellen.

Der Autor hat seinen Raspi über zwei Subnetze eingebunden, eins um den WLAN-Router (DHCP, subnet 192.168.178/255.255.0.0) und eins zum über Ethernet angeschlossenen Steuer-PC. Letzteres als statische IP (subnet 10.1.1.1/255.255.255.0).

Auszug /etc/network/interfaces :

iface eth0 inet static
address 10.1.1.1
netmask 255.255.255.0

allow-hotplug wlan0
iface wlan0 inet manual

wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

Variante: Standalone Programmer

Alternativ kann der RasPi natürlich auch als StandAlone-Programmer, also ohne verbundenen PC, verwendet werden. Dann muss am RasPi eine Tastatur über USB und ein Monitor über HDMI angeschlossen sein.

Filetransfer

Um Dateien wie das Flash-Image für den µC zwischen Steuer-PC und RasPi zu transferieren gibt es mehrere Möglichkeiten. Die einfachste ist SCP bzw. SFTP, da dafür nur der standardmäßig aktive SSH-Dienst benötigt wird, und keine weitere Software auf dem RasPi installiert werden muss. Passende Clientsoftware für den PC ist z.B. Filezilla (Windows), oder die bei Unix/Linux standardmäßig installierten Kommandozeilentools scp und sftp. Wenn nur Dateien kopiert werden sollen geht das mit dem Kommandozeilentool scp z.B. folgendermaßen (der RasPi hat hier die IP 10.0.0.1, und die Datei test.hex soll vom PC auf den RasPi kopiert werden):

scp test.hex 10.0.0.1:/tmp/

Dies lässt sich einfach in ein Skript oder Makefile integrieren wenn man die Übertragung des zu programmierenden Images und die Programmierung des Controllers bzw. FPGAs automatisieren möchte. Mit den folgenden zwei Befehlen wird z.B. ein Hex-File vom PC an den RasPi übertragen, und dann auf dem RasPi mit avrdude in einen angeschlossenen Controller geschrieben:

scp test.hex 10.0.0.1:/tmp/
ssh 10.0.0.1 sudo /usr/local/bin/avrdude -c linuxspi -p m328p -P /dev/spidev0.0 -U flash:w:"/tmp/test.hex"

Vorausgesetzt die Passwort-lose Anmeldung ist korrekt konfiguriert [1], sind keine manuellen Handlungen nötig.

Alternativen zu scp/sftp sind FTP oder SAMBA (kompatibel zu Windows-Dateifreigabe). Bei beiden ist der jeweils der passende Server aus dem RasPi zu installieren und gegebenenfalls der Port dafür in der Firewall freizuschalten. Als FTP-Server macht proftpd eine gute Figur.

  • Installationsanleitung für proftpd: [2]
  • Freischaltungen in der Firewall beispielsweise für ftp: [3]

RasPi Modell-Auswahl

Für die stand-alone Variante (RasPi mit Tastatur und Monitor) eignen sich model-A und B gleichermaßen, Dagegen ist eine Terminalverbindung über Ethernet mit dem Modell A oder A+ nicht möglich da diesem die Ethernet-Schnittstelle fehlt. Eine Terminalverbindung über WLAN dagegen ist mit allen RasPi's möglich. Die A+ und B+ Modelle bieten zwar mehr GPIO's, die Grundausstattung der RasPi ohne Plus genügt aber für den Einsatz als Programmer völlig.

Der portable Betrieb mit Speisung über eine USB-Powerbar oder aus den USB-Ports eines Laptops ist den "Plus" Modellen einfacher da diese Dank effizienter Regler weniger verbrauchen. Ohne diese Regler gerät das Model B (ohne plus) schnell an die Grenze einer USB-Stromversorgung. Das kann zu ungewollten Neustarts des RasPi führen, Abhilfe schafft nur ein sehr gutes USB-Netzteil. Etwas geringer wird das Problem wenn der RasPi über ein sogenanntes Y-Kabel von zwei USB-Anschlüssen des Laptops betrieben wird. Ein einzelner USB-Port darf mit höchstens 500 mA belastet werden, mit dem genannten Kabel erhöht sich der verfügbare Strom auf (theoretisch) 1000 mA (Nach USB 2.0.-Spezifikation).

Raspberry Beschaltung

Der RasPi kann über seine Steckerleiste folgende Interface ansteuern

  • Bitwackler (bitbanging) über 25 GPIO (Model b+)
  • SPI (wie die ISP -Schnittstelle der Atmel AVR-controller) 2x SPI_CE ; 3 Pins MISO, MOSI, SCLK
  • UART (ein Paar RxD/TxD)
  • I2C (?ein Paar SDA,SCL)

Ebenso liegen an zwei Pins 3V3 an mit denen bspw. ein µC leicht versorgbar ist. An zwei weiteren Pins stellt der RasPi 5V zur Verfügung, allerdings ist die Spannung abhängig von der aktuellen Rechenlast meist etwas niedriger. Massepotential liegt an 8 Pins (Modell B+).

Das Bitwackler Interface kann natürlich auch SPI, UART und I2C nachstellen, allerdings mit erhöhten Programmieraufwand und meist nicht so schnell wie mit den speziellen SPI-Pins. Dafür ist es erste Wahl bei anderen Schnittstellenstandards wie JTAG.

Es gelten die üblichen RasPi GPIO Hinweise:

  • An die Eingänge keine Signale mit Pegel höher 3.3V oder kleiner als 0V legen, diese können die CPU beschädigen.
  • Schäden können auch auftreten falls ein Pin mit mehr Strom belastet wird als konfiguriert. Minimal sind 2 mA möglich, ein höherer Wert in 2 mA Schritten aber nicht mehr als 16 mA kann konfiguriert werden. Dieser Wert gilt für alle GPIO's, er kann nicht Pin-individuell geändert werden. Nach einem Reset ist ein Wert von 8 mA voreingestellt. Nie mehr Strom "ziehen" als konfiguriert, ganz vorsichtige Bastler begrenzen den Strom durch einen Serienwiderstand (bspw. 10k).
  • Die 3V3 Spannung an der Pin-Leiste wird über einen IC erzeugt, der höchstens 50 mA zur Verfügung stellt. (Dieser Wert wurde für die nicht '+' Modelle angegeben, möglicherweise bei den im Bereich der Stromversorgung überarbeiteten '+' Modellen höher.

Bitwackler

Nicht unbedingt schnell (über Python 60 KHz ermittelt), mit passenden Treibern sollten aber mehrere hundert kHz möglich sein. Dafür ist das Timing nach Belieben programmierbar, was bspw. für JTAG nützlich ist.

SPI-Schnittstelle und -Treiber

Der RasPi hat in den betrachten Modellen ("model A", "model B", "model B+") nur eine SPI-Schnittstelle, die bei allen dreien die selben Pins nutzt. Varianten sind nur in der Nutzung der beiden Pins SPI_CE0 und SPI_CE1 möglich, welche eines der angeschlossenen SPI-Geräte auswählen (bis zu zwei möglich). Befindet sich nur ein Gerät an dieser Schnittstelle können die beiden SPI_CE Pins unbenutzt bleiben.

Für die Nutzung der SPI - Schnittstelle des RasPi muss der passende SPI-Treiber (module) laufen. Das ist an dem vorhandenen device /dev/spi0.0 erkennbar. Findet sich unter /dev/ kein SPI-device, dann ist das Module nicht gestartet. Dieses wird über modprobe spi-bcm2708 manuell gestartet. Soll es automatisch gestartet werden, darf das SPI-module nicht auf der schwarzen Liste /etc/modprobe.d/raspi-blacklist.conf stehen. Falls dort die Zeile blacklist spi-bcm2708 steht mit einem vorangestellten '#' deaktivieren oder die gesamte Zeile löschen:

# file: /etc/modprobe.d/raspi-blacklist.conf
# blacklist spi and i2c by default (many users don't need them)

#blacklist spi-bcm2708
blacklist i2c-bcm2708

Im Raspberry Konfigurations tool raspi-config wie es bspw. bei der NOOB Installation automatisch gestartet wird, findet sich versteckt unter "8 Advanced Options " der Unterpunkt SPI der standardmäßig auf No steht und so das Laden das benötigten Kernel-moduls verhindert. Setzt man diese Option auf Yes entfällt u.U. die oben beschriebene manuelle Aktivierung des SPI-Moduls.

AVR-Programmer

Um AVR-µC zu programmieren, benötigt man ein modifiziertes avrdude - ein weit verbreitetes Programmiertool. Dieses findet man als Quellcode in einem git-Source-Depot und kompiliert es direkt auf dem RasPi. Dazu werden weitere Pakete benötigt die aber nach Installation des kompilierten avrdude wieder entfernt werden können. Der avrdude nutzt auf dem RasPi die SPI-Schnittstelle auf der GPIO-Leiste und ein weiteres GPIO-Pin für die Reset-Leitung.

ATmega328P auf Steckbrett mit RasPi als Programmer

Verdrahtung

Wiring RasPi <-> AVR
Signal RasPi Atmel Mega32
MOSI GPIO 10
MISO GPIO 9
SCLK GPIO 11
RST_N GPIO 25
3V3
GND

Installation der Compiler

Um die Quelltexte für den avrdude aus den Depot zu laden, automatisch anzupassen und zu übersetzen sind 6 Pakete nötig:

  • git - Source-Versionsverwaltung, nötig zum Download der avrdude-Sources, Name des package: git-core
  • make - zum Regelbasierten Compilieren und Linken aus den Quelltexten
  • autoconf - zwecks Anpassung der Compiler-Skripte an das RasPi-Linux
  • gcc - C-Compiler
  • bison - mit Flex zusammen zum parsen von Quelltexten/Konfigurationsdateien
  • flex - mit bison zusammen zum parsen von Quelltexten/Konfigurationsdateien

Wer direkt auf dem RasPi in C/ASM für den AVR µC programmieren möchte, sollte auch folgende 3 Pakete installieren. Für die Nutzung des RasPi nur als avr-programmer sind sie nicht nötig:

  • gcc-avr
  • binutils-avr
  • avr-libc

Kommando:

apt-get update
apt-get install gcc git-core make  bison autoconf flex

avrdude Sourcen für RasPi aus Depot holen

Depot: https://github.com/kcuzner/avrdude Befehl:

git clone https://github.com/kcuzner/avrdude

Loginformationen zeigt git mit git log an, Aktualisierungen werden mit git pull origin heruntergeladen.

avrdude übersetzen und installieren

cd avrdude/avrdude
./bootstrap && ./configure
sudo make install

Einstellungen avrdude überprüfen und testen

In der Datei /usr/local/etc/avrdude.conf stehen die Einstellungen für die verschiedenen AVR Programmer wie die Pinzuordnung - Welches AVR-Pin mit welchem Programmer Pin verbunden ist. Für den RasPi finden sich diese in der Sektion linuxspi.

programmer 
  id       = "linuxspi";
  desc     = "Use Linux SPI device in /dev/spidev*";
  type     = "linuxspi";
  reset    = 25;
  baudrate = 400000;
;

Wichtig ist hier das Pin das mit dem Reset des AVR verbunden ist (Zeile reset = 25). Das kann ein beliebiges GPIO-Pin sein, hier wurde das Pin GPIO25 gewählt. Die SPI-Pins (MISO, MOSI, CLK) sind nicht wählbar, da der RasPi in allen betrachteten Modellen nur einen SPI-Port hat.

Kritisch ist ebenfalls der Eintrag unter baudrate. Mit diesen wird eingestellt wie schnell das Signal SPI_CLK schaltet und damit wie schnell der Controller programmiert wird. Die maximal mögliche Baudrate variiert je nach AVR-Typ, Versorgungsspannung, Taktbeschaltung und Konfigurationsregister. Ein sicherer Wert sind 125 kHz, die default Einstellung des avrdude liegt mit 400 000 deutlich darüber. Deshalb sollte man bei Problemen die Zeile zu:

  baudrate = 100000;

ändern.

Test

Auslesen des Flash-Speichers des Controllers, hinter -p den Typ des Controllers (hier ATmega 328P) angeben:

sudo /usr/local/bin/avrdude -c linuxspi -p m328p -P /dev/spidev0.0 -U flash:r:"/dev/null":r

Typische Fehler

Der Fehler kann sein

  • unvollständige Installation des Betriebssystem, wie Treiber für SPI nicht aktiv
  • falsche Bedienung Programmiertool avrdude bspw. ohne root-Rechte (sudo)
  • Verdrahtungsfehler bspw. Widerstand an der Reset-Leitung falsch

avrdude schreibt auch Fehlermeldungen von Folgefehlern wie avrdude initialization failed was auf einen Fehler in der Verdrahtung deutet, die eigentlich Fehlermeldung allerdings einige Zeilen früher genannt wird: "Unable to open SPI Port". Man tut also gut daran, die Ausgaben von avrdude komplett zu lesen.

Zugriff auf SPI scheitert

Die SPI-Schnittstelle liegt wie alle Geräte im Verzeichnis /dev/ , am besten mit ls /dev/ überprüfen. Findet sich dort kein spidev0.0 ist der SPI-Treiber/-module nicht aktiv oder nicht installiert. Siehe dazu Abschnitt SPI oben.

Für den Zugriff auf die SPI - Schnittstelle sind root-Rechte erforderlich. avrdude ist also von root - login oder mit vorangestellten sudo zu starten.

Der µC meldet sich nicht

Oft sind fehlende oder falsche elektrische Verbindungen dafür verantwortlich. Man sollte jetzt die Spannungen zwischen Vcc und GND resp. zwischen AVcc und GND am Controller messen. Die sollten 3.3 V betragen. Muss man den Controller mit 5V betreiben ist statt auf 3.3 V auf 5.0V zu prüfen und die Pegelwandler (levelshifter) zwischen Controller und RasPi. Die 5V sind an der GPIO-Leiste des RasPi's meist etwas geringer (~ 4.9V), eine leistungsstarke RasPi Stromversorgung (USB-Netzteil 1000 mA) und das Abziehen von beim AVR-Programmieren unbenutzte Hardware wie WLAN-Stick hilft dabei.

An der Reset-Leitung sollte im Normalfall die Betriebsspannung (3.3 V) anliegen, nur während der Programmierung misst man hier 0V. Die anderen Verbindungen klingelt man im stromlosen Zustand durch oder prüft die Signale mit einem Oszilloskop.

Für manche AVR-Typen muss der Code von avrdude leicht angepasst werden, sonst wird der µC nach Umstellung auf Quarz-Takt nicht mehr ansprechbar: Patch.

Weitere Tipps zur Fehlersuche finden sich in der AVR Checkliste.

JTAG-Dongle/ FPGA-Programmer

Über JTAG sind u.a. ARM-basierte Mikrocontroller sowie FPGAs und deren Firmware-PROMs programmierbar. Für JTAG kann beim Raspberry Pi nicht die SPI-Schnittstelle verwendet werden, sondern es werden "normale" GPIO-Pins genutzt. Die Open-Source-Tools URJTAG und OpenOCD unterstützen die auf dem Raspberry PI verwendete GPIO-Schnittstelle. Anleitungen findet man online:

Achtung: der RasPi unterstützt nur 3V3 Pegel, die JTAG-Schnittstelle bei FPGAs kann je nach Beschaltung auch andere Spannungspegel wie beispielsweise 2V5 erfordern.

Weblinks