Katapult (ehemals CanBoot) wurde ursprünglich entwickelt, um über CAN-Bus Klipper Updates einzuspielen. Es wurde aber erweitert um die Möglichkeit auch mittels USB bzw. Seriell zu flashen. Somit ist Katapult ein sehr universell einsetzbarer Bootloader. Er ermöglicht ein Firmware Update (wie z.B. Klipper), ohne dass man am Druckerboard selber Hand anlegen muss. Also kein SD-Karten jonglieren, keine Jumper stecken, keine Taster drücken.
Das Video / diese Anleitung befasst sich nur mit STM32, RP2040 und da auch nur mit USB und CAN Bus! Serielles Flashen sollte am Ende ähnlich funktionieren wie die USB Variante. Die LPC176x Controller werden hier nicht behandelt da sie kaum noch Verwendung finden.
Hinweise:
1. SBC meint im folgenden Text immer Single Board Computer und dürfte bei den meisten ein Raspberry Pi sein.
2. Wenn ihr Katapult installiert, wird der Original Bootloader gelöscht!
Github Repo zu Katapult
https://github.com/Arksine/katapult
Man sollte im Vorfeld zwei wichtige Informationen ermitteln. Welcher Controller wird verwendet (und welche Einstellungen brauche ich dafür) und ob es ein Board mit oder ohne DFU Möglichkeit ist (DFU betrifft nur STM32 Boards).
Controller
make menuconfigDFU Möglichkeit
BT0, Boot0 oder B0 gekennzeichnet. Oft fehlt dieser Jumper bei älteren Boards oder kleinen Boards mit STM32F1 Controller. cd ~ && git clone https://github.com/Arksine/katapult && cd katapultmake menuconfigMicro-controller Architecture ist der Controller Type - also z.B. STM32 oder RP2040 Processor model ist die Variante - also z.B. STM32F446 Build Katapult deployment application muss dann aktiviert werden, wenn per SD-Karte gerflsht werden soll. Clock Reference ist die Geschwindigkeit vom Onboard TaktgeberCommunication interface legt fest wie ihr mit dem Board kommunizieren wolltApplication start offset legt fest wo im Flash vom Controller später die Firmware (z.B. Klipper) startet. Nehmt hier am besten immer den kleinsten Wert - reicht im NOrmalfall. Und achtet darauf, dass unter Build Katapult deployment application der gleiche Wert gesetzt ist wenn ihr die Option nutzt! USB ids lassen wir unangetastet GPIO pins to set on bootloader entry hier kann man Pins eintragen, die beim Board Start einen bestimmten Status (gesetzt / nicht gesetzt) haben müssen. Einige ältere STM32 Boards brauchen das. [*] Support bootloader entry on rapid double click of reset button diese Option sollte immer aktiviert sein. Denn so könnt ihr das Board auch mit dem Reset Taster in den Katapult Boot Modus bringen. Nennen wir es “Notanker” [ ] Enable bootloader entry on button (or gpio) state und [ ] Enable Status LED braucht man im Grunde niemakeout\katapult.bin.Hinweis
Kompiliert man für CAN Bus sollte man vorher die CAN Bus Geschwindigkeit auslesen:
cat /etc/network/interfaces.d/can0
Im Folgenden wird beschrieben, wie der Bootloader Katapult auf den Controller geflasht wird.
Das Flashen von Klipper erfolgt im nächsten Schritt!
Hinweise
1. Man sollte nach dem Flashen von Katapult das Board 1x resetten.
2. Katapult wird immer über einen der folgenden Wege geflasht (USB, SD, ST-Link). Nur die eigentliche Firmware (z.B. Klipper) kann später über den CAN Bus geflsht werden!
Bei den STM32 Controllern gibt es drei brauchbare Wege, um Katapult zu flashen. Der einfachste Weg wäre über den DFU Modus, der aber leider nicht bei allen Boards genutzt werden kann (siehe dazu Hauch Hardware erkennen → DFU Möglichkeit). Installation mittels SD-Karte wäre die zweite Option die (bis auf die SD-Karte) ohne extra Hardware auskommt. Die letzte Option wäre über einen ST-Link Programmieradapter.
Hinweis
Funktioniert nur über USB !
Wie schon erwähnt muss das Board dafür über einen extra Jumper (selten auch ein Taster) verfügen. Hier ein Beispiel vom Spider Board:
Dieser Jumper legt 3,3V auf den BT0 Pin. Das Board geht damit nach einem Reset in einen speziellen DFU Modus und mittels dfu-util kann dann Katapult geflasht werden.
Überprüfen kann man das mit dfu-util -l. Wenn das Board per USB z.B. an eurem Pi hängt, kriegt ihr dann folgende Ausgabe:
pi@Pi3Test:~/katapult $ dfu-util -l dfu-util 0.9 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc. Copyright 2010-2016 Tormod Volden and Stefan Schmidt This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to http://sourceforge.net/p/dfu-util/tickets/ Found DFU: [0483:df11] ver=2200, devnum=29, cfg=1, intf=0, path="1-1.4", alt=3, name="@Device Feature/0xFFFF0000/01*004 e", serial="STM32FxSTM32" Found DFU: [0483:df11] ver=2200, devnum=29, cfg=1, intf=0, path="1-1.4", alt=2, name="@OTP Memory /0x1FFF7800/01*512 e,01*016 e", serial="STM32FxSTM32" Found DFU: [0483:df11] ver=2200, devnum=29, cfg=1, intf=0, path="1-1.4", alt=1, name="@Option Bytes /0x1FFFC000/01*016 e", serial="STM32FxSTM32" Found DFU: [0483:df11] ver=2200, devnum=29, cfg=1, intf=0, path="1-1.4", alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,03*128Kg", serial="STM32FxSTM32"
Anschließend könnt ihr Katapult flashen:
dfu-util -R -a 0 -s 0x08000000:mass-erase:force -D ~/katapult/out/katapult.bin
Jetzt wird erst der Speicher gelöscht und anschließend Katapult geflasht.
Nicht vergessen, den Boot0 Jumper wieder zu entfernen!
Wenn euer Board keinen DFU Jumper hat, dann könnt ihr Katapult auch über die SD-Karte flashen. Aber um es gleich vorwegzunehmen … Manchmal braucht man bei der Methode Geduld und innere Ruhe Denn es wäre nicht das erste Mal, dass diese Methode mehr schlecht als recht funktioniert …
make menuconfig kann man bei Katapult folgende Option setzen: Build Katapult deployment application. Setzt hier den gleichen Wert wie bei Application start offset. make das Kompilieren starten~/katapult/out/deployer.bin. deployer.bin in firmware.binFIRMWARE.CUR umbenannt.
Man merkt schon an der Länge der Anleitung, dass Flashen über SD-Karte ein Graus ist, den man - wenn Katapult einmal läuft - nie wieder braucht
Für diese Variante wird ein ST-Link benötigt. Das ist ein Programmieradapter für STM32 Controller. Man bekommt ihn als China Clone bei eBay oder Amazon und die Teile sehen so aus:
Wenn gar nichts mehr funktioniert, bekommt man mit so einem Adapter fast jeden STM32 wieder flott
stlink kompilieren: sudo apt install gcc build-essential cmake libusb-1.0-0 libusb-1.0-0-dev libgtk-3-dev pandoc -ycd ~ && mkdir build -p && cd buildgit clone https://github.com/stlink-org/stlink.gitcd stlinkmake clean && make releasesudo make installsudo ldconfigCLK, DIO und GND. Die Verkabelung mit dem ST-Link Adapter <> Druckerboard ist dann wie folgt: st-flash --connect-under-reset erase st-flash --connect-under-reset erasest-flash --connect-under-reset write ~/katapult/out/katapult.bin 0x8000000 Nicht vergessen, die ST-Link Verkabelung wieder zu entfernen!
Bei einem RP2040 Board ist die Welt deutlich einfacher
make menuconfig von Katapult müsst ihr natürlich den RP2040 als Controller einstellen. make habt ihr dann ebenfalls im Ordner out die Datei katapult aber jetzt mit der Endung uf2make flash pi@Pi3Test:~/katapult $ make flash Flashing out/katapult.uf2 Loaded UF2 image with 21 pages Found rp2040 device on USB bus 1 address 35 Flashing... Resetting interface Locking Exiting XIP mode Erasing Flashing Rebooting device
Ihr könnt relativ einfach überprüfen, ob das Flashen von Katapult geklappt hat.
journalctl -kS -5min aufrufenNov 03 16:33:56 Pi3Test kernel: usb 1-1.4: Manufacturer: katapultHinweis
Die folgenden Schrotte setzen natürlich voraus, das der CAN Bus korrekt im Vorfeld eingerichtet wurde!
Wenn das Board über CAN verbunden ist, dann kann man mit den folgenden Schritten prüfen, ob Katapult geflasht wurde:
sudo systemctl stop klipper.service~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0 biqu@BTT-PI12:~/katapult$ ~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0 Found canbus_uuid=539892be834d, Application: CanBoot Total 1 uuids found
sudo systemctl start klipper.serviceKlipper kann jetzt über USB bzw. über CAN auf das Druckerboard geflasht werden.
cd ~/klippermake menuconfigBootloader offset muss so eingestellt werden wie in der Katapult Konfig unter Application start offset angegeben. (Beim RP2040 ist der Bootloader offset immer 16KiB)Communication interface muss hier logischerweise die richtige USB Konfig ausgewählt werden (gibt meist eh nur eine)!make kompilierenls -lR /dev/ | grep -v '\->\s../tty' | grep -v ttyprintk | grep -e 'tty[[:alpha:]]' -e serial /dev/serial/by-id:) lrwxrwxrwx 1 root root 13 Nov 3 16:44 usb-katapult_rp2040_E66138935F575A28-if00 → ../../ttyACM0 ttyACM0make flash FLASH_DEVICE=/dev/ttyACM0 Attempting to connect to bootloader CanBoot Connected Protocol Version: 1.0.0 Block Size: 64 bytes Application Start: 0x10004000 MCU type: rp2040 Flashing '/home/pi/klipper/out/klipper.bin'... [##################################################] Write complete: 108 pages Verifying (block count = 432)... [##################################################] Verification Complete: SHA = AC11C20CD24F671A530404E4BBABBBFE28E69326 CAN Flash Success
Hinweis
In der Original Anleitung soll das Klipper flashen so funktionieren:
/usr/bin/python3 ~/katapult/scripts/flashtool.py -d /dev/ttyACM0
Das klappt aber nicht, weil der Bootloader nicht aktiviert wird. Also muss man entweder den Katapult Bootloader über 2x schnelles Reset drücken manuell aktivieren oder über dieses Kommando:
cd ~/klipper/scripts && /usr/bin/python3 -c 'import flash_usb as u; u.enter_bootloader("/dev/ttyACM1")'
Deshalb lieber gleich diemake flash …Variante verwenden
cd ~/klippermake menuconfigBootloader offset muss so eingestellt werden wie in der Katapult Konfig unter Application start offset angegeben. (Beim RP2040 ist der Bootloader offset immer 16KiB)Communication interface muss hier logischerweise die richtige CAN Konfig ausgewählt werden!make kompilierensudo systemctl stop klipper.service~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0 biqu@BTT-PI12:~/katapult$ ~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0 Found canbus_uuid=539892be834d, Application: CanBoot Total 1 uuids found
CanBoot als Applikation gemeldet wird. Das ist ok!Klipper angezeigt wird. Das ist ebenfalls ok!~/klippy-env/bin/python3 ~/katapult/scripts/flash_can.py -i can0 -f ~/katapult/out/klipper.bin -u <uuid> ~/klippy-env/bin/python3 ~/katapult/scripts/flash_can.py -i can0 -f ~/klipper/out/klipper.bin -u 539892be834d~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0 Found canbus_uuid=539892be834d, Application: Klippersudo systemctl start klipper.serviceDie folgenden Kommandos dienen nur als Referenz
st-info --probe --connect-under-resetst-flash --connect-under-reset write out/katapult.bin 0x8000000st-flash --format ihex --connect-under-reset write filename.hexst-flash --connect-under-reset erasest-flash --connect-under-reset read mem.bin 0x8000000 64k