PIC-USB Bootloader

Aus SigVDR's Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Verwendung eines USB-Bootloaders mit den PIC Controllern

Die Microcontroller 18F2550,18F4550 ... von Microchip sind mit einer USB Schnittstelle ausgestattet. Mit Hilfe der von http://www.microchip.com downloadbaren Entwicklungsumgebung MPLAB, dem C Compiler C18 und dem Demoprojekt "MCHPUSB Bootloader" lässt sich ein USB-Bootloader erstellen, mit der dann anschließend die "User-Firmware" in den PIC geladen werden kann. Die Grundlagen zur Vorgehensweise sind bei http://www.sprut.de/electronic/pic/8bit/18f/programm/usbbootloader/usbboot.htm vorbildlich beschrieben. Als Ergänzung zu dem Artikel bei Sprut hier noch aktuellere Infos:

Die beschriebene Vorgehensweise ist auch mit neueren Bootloader Versionen (z.B die Ausgabe vom Juni 2010) noch erfolgreich benutzbar. Durch zusätzlich eingefügte Änderungen/Verbesserungen von Microchip muss aber für den "freien" C18 Compiler noch mehr Platz eingespart werden. Das lässt sich durch das komplette Entfernen der LED Ansteuerung gerade noch erreichen.

Die folgenden Punkte dienen als Ergänzung dieser ausführlichen Beschreibung und betrachten die besonderen Möglichkeiten im Zusammenhang mit Linux Betriebssystemen.

C18 Compiler

Bis Ende 2010 gab es den C18 Compiler von Microchip nicht für Linux. Um den auch auf einem Linux System nutzen zu können musste zuerst der Win Emulatur Wine installiert werden, und dann mit Hilfe von Wine konnte der C18 Compiler installiert und benutzt werden.

Jetzt (Mai 2011) konnte ich bei Microchip im Zusammenhang mit der IDE MPLABX einen C18 Compiler für Linux laden. Obwohl noch als "Beta" gekennzeichnet, konnte ich beide Pakete auf meinem Ubuntu (11.04) problemlos installieren und benutzen. Der C18 Linux Compiler erzeugt (noch?) einen kompakteren Hex-Code als die Windows Version C18 Lite. Über die Qualität des compilierten Programms möchte ich z.Zeit wegen zu kurzer Testzeit noch nichts aussagen.

Inzwischen kann MPLABX als offizielles Release geladen werden (Der passende C Compiler muss gesondert geladen werden). Leider sind die Demo Projekte von Microchip noch nicht an MPLABX angepasst, es können aber die alten MPLAB Projektdateien importiert werden (Stand: Apr. 2012). Die älteren Programmier und Debugger Tools wie z.B. mein ICD2 werden von MPLABX nicht unterstützt.

Bootloader Upload Tools

fsusb

Das Programm fsusb ist ein Kommandozeilen Tool um die "User-Firmware" in den PIC-Controller zu laden. Es ist nicht möglich damit eine Firmware in einen neuen oder gelöschten PIC Controller zu brennen. fsusb kann nur im Zusammenhang mit dem MCHPUSB Bootloader verwendet werden.

piklab-prog

Das Kommandozeilen Tool piklab-prog ist Bestandteil von Piklab , einer kompletten IDE für die Entwicklung von Programmen für PIC Controller incl. der Ansteuerung verschiedener PIC Brenner Hardware. piklab-prog kann verwendet werden um mit geeigneter Brenner Hardware auch neue PIC-Controller zu beschreiben. Es ist also mit piklab-prog möglich, den MCHPUSB Bootloader in den PIC Controller zu brennen, und anschließend (wie bei fsusb) die "User-Firmware" über den USB-Bootloader zu in den PIC-Controller zu laden.

autom. Firmwareupdate

Unter Linux lässt sich ein automatisches Firmware Update realisieren. Hier eine Beschreibung wie das bei einem udev basierendem Linux (Debian,Ubuntu... u.v.m) ablaufen kann. Berücksichtigt wird dabei auch, dass für mehrere PIC - Projekte auch unterschiedlicher Firmware geladen werden kann.

fsusb-0.2 Linux Softwaretools

Download: fsusb-0.2.tar.gz Die Linux Softwaretools für den Microchip Bootloader bestehend aus:

  • 90-microchiop.rules: UDEV Regel für die USB PIC Devices
  • pic_bootloader.sh: Bootloaderscript
  • fsusb: kommuniziert mit dem PIC Bootloader ( Kurzbeschreibung)
  • lspic: Angeschlossene USB PIC Devices erkennen

Nach dem Download in einen beliebigen Ordner entpacken (idealerweise im Ordner Deiner PIC Projekte).

  • Um fsusb benutzen zu können müssen diese Pakete installiert sein.
    • libusb: Die Library für USB ist bei fast allen Linuxdistributionen bereits installiert.
    • libusb-dev: Die Header Dateien der Library für USB
    • build-essential: Die GNU C++ Compiler Pakete als Debian Metapaket.
  • Erstellt wird fsusb mit make im fsusb Ordner

Installiert wird fsusb dann mit make install im fsusb Ordner, das muss mit Root Rechten ausgeführt werden (sudo).

fsusb wurde auf einem UBUNTU Linux erstellt und getestet. Insbesondere erwartet fsusb für eine sichere Installation den Linux Programmordner in /usr/bin und den Ordner für die UDEV Regeln in /lib/udev/rules.d Diese Ordner können manuell im Makefile des fsusb Ordners angepasst werden.

BIN_PATH=/usr/bin
UDEV_PATH=/lib/udev/rules.d

PIC Bootloader Firmware

Hinweis: Für die Details zur grundlegenden Vorgehensweise, eine Bootloader Firmware zu erstellen möchte ich noch einmal auf die Beschreibung von www.sprut.de hinweisen. Abweichend von seinen Vorschlägen benutze ich hier in diesem Beispiel die originale ProductID des Microchip Bootloaders. Zur Benutzung mit der ProductID von Sprut müssen die Dateien
  • 90-microchip.rules die Zeile ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="000b", MODE="0666", RUN+="/usr/bin/pic_bootloader.sh %s
  • pic_bootloader.sh die Zeile: LOADER_PARAM="--pic 18F4550 --usb-id ff0b"
entsprechend abgeändert werden.

Um den verschiedenen PIC Projekten die jeweils richtige Firmware zuordnen zu können, benötigen wir ein eindeutiges Unterscheidungsmerkmal in der Bootloader Firmware. Für diesen Zweck benutze ich hier die bcdDeviceNo die im USB Device Descriptor in usbdsc.c definiert weden kann. Die bcdDeviceNo darf nur die Ziffern 0..9 enthalten.

/* Device Descriptor */
rom USB_DEV_DSC device_dsc=
{    
    sizeof(USB_DEV_DSC),    // Size of this descriptor in bytes
    DSC_DEV,                // DEVICE descriptor type
    0x0200,                 // USB Spec Release Number in BCD format
    0x00,                   // Class Code
    0x00,                   // Subclass code
    0x00,                   // Protocol code
    EP0_BUFF_SIZE,          // Max packet size for EP0, see usbcfg.h
    0x04D8,                 // Vendor ID
    0x000b,                 // Product ID: PICDEM FS USB (Boot Mode)
    0x5520,                 // bcdDeviceNo: Device release number in BCD format
    0x00,                   // Manufacturer string index
    0x00,                   // Product string index
    0x00,                   // Device serial number string index
    0x01                    // Number of possible configurations
};

Es ist also für jedes PIC Projekt eine eigene Bootloader Firmware mit geänderter bcdDeviceNo zu erstellen. Für dieses Beispiel benutze ich die Nummer 5520.

PIC Usb-Gerät erkennen (Kommandozeile)

Die oben erzeugte bcdDeviceNo kann über den Befehl lsusb -v -d 04d8: vom über USB angeschlossenen PIC-Device ausgelesen werden. Mit fsusb wird auch ein Script lspic installiert um die wichtigsten Daten des PIC-Device anzuzeigen.

/usr/bin/lspic

#!/bin/sh
echo "lsusb -v  -d 04d8: | grep -E 'bcdD|idV|idP|iM|iP'"
lsusb -v  -d 04d8: | grep -E 'bcdD|idV|idP|iM|iP'

Ausgabebeispiel von lspic

lsusb -v  -d 04d8: | grep -E 'bcdD|idV|idP|iM|iP'
  idVendor           0x04d8 Microchip Technology, Inc.
  idProduct          0xfdbb PIC18Fx550
  bcdDevice            55.20
  iManufacturer           1 www.sigvdr.de
  iProduct                2 Basis-Firmware 2012

PIC Usb-Gerät erkennen (automatisiert)

Über das System von udev werden angeschlossene Geräte erkannt und gerätespezifische Aktionen ausgelöst. Die passende Aktion für den Bootloader unseres PIC Projekts müssen wir definieren (das wird bei der Installation von fsusb durchgeführt).

Wichtige Erkennungsmerkmale sind die über lspic (lsusb -v) angezeigten Parameter idVendor,idProduct und bcdDevice. Damit kann unsere Bootloader Firmware eindeutig identifiziert werden und in /lib/udev/rules.d/90-microchip.rules können wir diese Aktion definieren (möglicherweise benutzt Dein Linux einen anderen Ort):
ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="000b", MODE="0666", RUN+="/usr/bin/pic_bootloader.sh %s{bcdDevice}" $ATTRS{bcdDevice}

idVendor=04d8  Das ist die eindeutige Herstellerkennung von Microchip
idProduct=000b Mit der Product ID wird der Bootloader von Microchip definiert
bcdDevice      Unsere Bootloaderkennung die der zu ladenden PIC Firmware zugeordnet werden kann

Udev wird damit angewiesen das script /usr/bin/pic_bootloader.sh zu starten. Als Parameter wird dem Script die bcdDeviceNo übergeben also in unserem Beispiel:pic_bootloader.sh 5520

So sieht die fertige Datei für udev dann aus /lib/udev/rules.d/90-microchip.rules

# filename:	90-microchip.rules   ! must be a higer value than 51-xxxx.rules for Ubuntu Karmic (9.10)
# location:	/lib/udev/rules.d
# author:	Werner Sigrist <sig@sigvdr.de>
# description:	used to start a bootloader script to load firmware into an PIC device
#		on request by your hardware 

# rules for Microchip fsUsb Demoboard MCHPUSB-Bootloader
# ( PIC18F2550/4550 mcu devices )
SUBSYSTEM=="usb_device", GOTO="usb_microchip_start"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="usb_microchip_start"
GOTO="usb_microchip_end"
LABEL="usb_microchip_start"
ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="000b", MODE="0666", RUN+="/usr/bin/pic_bootloader.sh %s{bcdDevice}" $ATTRS{bcdDevice}

# Sprut's bootloader an derivate of MCHPUSB-Bootloader (www.sprut.de) need to communicate with everyone 
ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="ff0b", MODE="0666"

# PIC Devices like USBControl.... need to communicate with everyone 
ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="fdbb", MODE="0666"

LABEL="usb_microchip_end"

Bootloaderscript: Firmware laden

Das Bootloaderscript pic_bootloader.sh wird bei der Installation von fsusb in /usr/bin installiert.

Dabei wird (ausgehend vom fsusb Installationsordner) ein Ordner ../firmware als Speicherort für die zu ladende Firmware angenommen. Wenn also fsusb in den Ordner /home/user/pic/fsusb-0.2 ausgepackt wurde wird der Firmwareordner auf /home/user/pic/firmware gesetzt (Wenn du einen anderen Speicherort für Deine Firmware bevorzugst, dann ändere /usr/bun/pic_bootloader.sh manuell oder setze eine Symlink von /home/user/pic/firmware zu Deinem Ordner).

In diesem Firmware Ordner sucht das Bootloaderscript nach der zum PIC-Device passenden Firmware. Erstelle dazu am Besten einen Symlink auf die Firmware .hex in deinem Projektordner. Um die richtige Firmware zu finden muss sie mit den Ziffern aus der bcdDeviceNo beginnen. Für unser Beispiel mit der Nummer 5520 benötigen wir also eine Firmwaredatei z.B. 5520EinBeliebigerName.hex

Das Bootloaderscript arbeitet diese Schritte ab:

  • Check: ist eine Passende Firmware verfügbar? Nein: Programmende
  • Verify: hat sich die Firmware gegenüber der im PIC gespeicherten verändert? Nein: Programmende
  • Backup: die im PIC gespeicherte Firmware wird ausgelesen und gesichert nach 5520EinBeliebigerName.hex.zeitstempel
  • Save: die neue Firmware wird in den PIC geschrieben
  • Reset: die neue Firmware wird gestartet
Meine Werkzeuge