Commit 2417088afe0d8d7eff0de5d33f58a3e9cb496122
receivedFri, 20. Sep 2024, 07:22:10 (by user sx)
Fri, 20 Sep 2024 05:22:10 +0000 (07:22 +0200)
authorManfred Steiner <sx@htl-kaindorf.at>
Fri, 20 Sep 2024 05:22:07 +0000 (07:22 +0200)
committerManfred Steiner <sx@htl-kaindorf.at>
Fri, 20 Sep 2024 05:22:07 +0000 (07:22 +0200)
27 files changed:
kicad/dist/1284-v1a/README.md
kicad/dist/644-v1a/README.md
software/bootloader-arduino/.gdb_history [deleted file]
software/bootloader-arduino/.gdbinit [deleted file]
software/bootloader-arduino/.gitignore [deleted file]
software/bootloader-arduino/.vscode/c_cpp_properties.json [deleted file]
software/bootloader-arduino/.vscode/launch.json [deleted file]
software/bootloader-arduino/.vscode/settings.json [deleted file]
software/bootloader-arduino/.vscode/tasks.json [deleted file]
software/bootloader-arduino/Makefile [deleted file]
software/bootloader-arduino/README.md [deleted file]
software/bootloader-arduino/protocol [deleted file]
software/bootloader-arduino/release/.gitkeep [deleted file]
software/bootloader-arduino/src/main.c [deleted file]
software/nano-1284/bootloader-arduino/.gdb_history [new file with mode: 0644]
software/nano-1284/bootloader-arduino/.gdbinit [new file with mode: 0644]
software/nano-1284/bootloader-arduino/.gitignore [new file with mode: 0644]
software/nano-1284/bootloader-arduino/.vscode/c_cpp_properties.json [new file with mode: 0644]
software/nano-1284/bootloader-arduino/.vscode/launch.json [new file with mode: 0644]
software/nano-1284/bootloader-arduino/.vscode/settings.json [new file with mode: 0644]
software/nano-1284/bootloader-arduino/.vscode/tasks.json [new file with mode: 0644]
software/nano-1284/bootloader-arduino/Makefile [new file with mode: 0644]
software/nano-1284/bootloader-arduino/README.md [new file with mode: 0644]
software/nano-1284/bootloader-arduino/protocol [new file with mode: 0644]
software/nano-1284/bootloader-arduino/release/2024-09-05_120945/bootloader-arduino_nano-1284.elf [new file with mode: 0755]
software/nano-1284/bootloader-arduino/release/2024-09-05_120945/bootloader-arduino_nano-1284.hex [new file with mode: 0644]
software/nano-1284/bootloader-arduino/src/main.c [new file with mode: 0644]

index 3bb999e3e1cf6defb6939f08a17bb7788f5827aa..07fce5af491706db5f5f84b6602c45b72bfcb5c4 100644 (file)
@@ -40,10 +40,15 @@ Vorne | Hinten
  19.8.2024 | € -38,95 | Rückzahlung Bauteile (10 x Atmega1284P)
  20.8.2024 | €  52,10 | Bauteile
  22.8.2024 | € 242,87 | Fertigung (PCB+Bestückung), Bauteile
- --        | € 353,39 | Gesamtkosten für 10 Stück
- --      | **€ 35,339** | **Kosten pro Stück**
+ 20.9.2024 | €  82,97 | Zoll
+ --        | € 436,36 | Gesamtkosten für 10 Stück
+ --      | **€ 43,636** | **Kosten pro Stück**
 
-Ausständig: Zoll, Steuer
+
+Stückpreis (gemittelt):
+* Nano-644:  € 48,190
+* Nano-1284: € 42,636
+* **Kaufpreis: € 45,413**
 
 ----------------------------------------------------------------
 
index f606265d816f4f05c0eeb441c4d809810633455e..cbbaffdc8570d153947a61bccba384d5976e15d7 100644 (file)
@@ -41,10 +41,9 @@ Datum | Kosten | Beschreibung
 27.5.2024 | €  61,27 | Bauteile
 27.5.2024 | €  -3,69 | Rückzahlung Bauteile
 17.6.2024 | € 203,43 | PCB, Bestückung, Transport
--- | € 400,79 | Gesamtkosten für 10 Stück
---  | **€ 40,079** | **Kosten pro Stück**
-
-Ausständig: Zoll, Steuer
+15.7.2024 | €  81,11 | Zoll
+-- | € 481,90 | Gesamtkosten für 10 Stück
+--  | **€ 48,190** | **Kosten pro Stück**
 
 ## Sonstiges
 
diff --git a/software/bootloader-arduino/.gdb_history b/software/bootloader-arduino/.gdb_history
deleted file mode 100644 (file)
index 3339046..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-target remote :1234
-layout split
-stepi
-quit
-target remote :1234
-layout split
-stepi
-b *main+9
-quit
diff --git a/software/bootloader-arduino/.gdbinit b/software/bootloader-arduino/.gdbinit
deleted file mode 100644 (file)
index a8c4b59..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-set history save on
-set history size 1000
-set history remove-duplicates 2
-set history filename .gdb_history
-
diff --git a/software/bootloader-arduino/.gitignore b/software/bootloader-arduino/.gitignore
deleted file mode 100644 (file)
index a959910..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-.depend
-**/build
-**/dist
-**/sim
diff --git a/software/bootloader-arduino/.vscode/c_cpp_properties.json b/software/bootloader-arduino/.vscode/c_cpp_properties.json
deleted file mode 100644 (file)
index 773ff69..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-    "configurations": [
-        {
-            "name": "Linux AVR",
-            "includePath": [
-                "/usr/lib/avr/include/**",
-                "/usr/lib/gcc/avr/**"
-            ],
-            "defines": [],
-            "compilerPath": "/usr/bin/avr-gcc",
-            "compilerArgs": [
-                "-mmcu=atmega1284p",
-                "-Os",
-                "-DF_CPU=12000000",
-                "-DBAUD_RATE=115200",
-                "-DDOUBLE_SPEED",
-                "-DNUM_LED_FLASHES=4",
-                "-DMAX_TIME_COUNT=F_CPU>>4"
-            ],
-            "cStandard": "gnu11",
-            "cppStandard": "gnu++11",
-            "intelliSenseMode": "linux-gcc-x64"
-        }
-    ],
-    "version": 4
-}
diff --git a/software/bootloader-arduino/.vscode/launch.json b/software/bootloader-arduino/.vscode/launch.json
deleted file mode 100644 (file)
index f29cf2e..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-    // Use IntelliSense to learn about possible attributes.
-    // Hover to view descriptions of existing attributes.
-    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
-    "version": "0.2.0",
-    "configurations": [
-        {
-            "name": "Build",
-            // "request": "launch",
-            "type": "node-terminal",
-            "preLaunchTask": "build"
-        },{
-            "name": "Flash",
-            // "request": "launch",
-            "type": "node-terminal",
-            "preLaunchTask": "flash"
-        },{
-            "name": "Clean",
-            // "request": "launch",
-            "type": "node-terminal",
-            "preLaunchTask": "clean"
-        },{
-            // es muss mit simuc --board arduino dist/programm.elf der Simulator 
-            // gestartet werden. Dessen gdb-stub öffnet auf localhost:1234 einen Port
-            "name": "Debug (simuc)",
-            "type": "cppdbg",
-            "request": "launch",
-            "program": "${workspaceFolder}/sim/atmega328p.elf",
-            "cwd": "${workspaceFolder}",
-            "externalConsole": false,
-            "MIMode": "gdb",
-            "miDebuggerPath": "/usr/bin/avr-gdb",
-            "miDebuggerServerAddress": ":1234",
-            "preLaunchTask": "build"
-        }
-    ]
-}
diff --git a/software/bootloader-arduino/.vscode/settings.json b/software/bootloader-arduino/.vscode/settings.json
deleted file mode 100644 (file)
index 114a717..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-    "[c]": {
-        "editor.insertSpaces": true,
-        "editor.tabSize": 3,
-        "editor.detectIndentation": false
-    },
-    "[h]": {
-        "editor.insertSpaces": true,
-        "editor.tabSize": 3,
-        "editor.detectIndentation": false
-    },
-    "cSpell.words": [],
-    "cSpell.ignorePaths": [
-        "**/*.json", "**/*.c", "**/*.h", "**/Makefile"
-    ],
-    "files.associations": {
-        "delay.h": "c",
-        "boot.h": "c",
-        "stdio.h": "c"
-    }
-}
diff --git a/software/bootloader-arduino/.vscode/tasks.json b/software/bootloader-arduino/.vscode/tasks.json
deleted file mode 100644 (file)
index 74fb1c7..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    // See https://go.microsoft.com/fwlink/?LinkId=733558
-    // for the documentation about the tasks.json format
-    "version": "2.0.0",
-    "tasks": [{
-        "label": "build",
-        "type": "shell",
-        "command": "make",
-        "problemMatcher":[
-            "$gcc"
-        ]
-    },{
-        "label": "clean",
-        "type": "shell",
-        "command": "make",
-        "args": [ "clean" ],
-    },{
-        "label": "flash",
-        "type": "shell",
-        "command": "make",
-        "args": [ "flash" ],
-    }]
-}
\ No newline at end of file
diff --git a/software/bootloader-arduino/Makefile b/software/bootloader-arduino/Makefile
deleted file mode 100644 (file)
index 665918a..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-.PHONY: all info flash picocom clean
-$(shell mkdir -p dist >/dev/null)
-$(shell mkdir -p build >/dev/null)
-$(shell mkdir -p sim >/dev/null)
-$(shell mkdir -p sim/build >/dev/null)
-
-NAME="bootloader-arduino_nano-1284"
-SRC= $(wildcard src/*.c src/*.cpp src/*/*.c src/*/*.cpp) 
-HDR= $(wildcard src/*.h src/*.hpp src/*/*.h src/*/*.hpp) 
-OBJ_CPP = $(SRC:src/%.cpp=build/%.o)
-OBJ = $(OBJ_CPP:src/%.c=build/%.o)
-OBJ_SIM_CPP = $(SRC:src/%.cpp=sim/build/%.o)
-OBJ_SIM = $(OBJ_SIM_CPP:src/%.c=sim/build/%.o)
-
-DEVICE=atmega1284p
-
-CC= avr-g++
-CFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000  -DBAUD_RATE=115200 -DDOUBLE_SPEED -DNUM_LED_FLASHES=4 '-DMAX_TIME_COUNT=F_CPU>>4' -c
-#LFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000 -Wl,-u,vfprintf -lprintf_flt -lm
-LFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000 -Wl,--section-start=.text=0x1e000
-
-CFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g  -DBAUD_RATE=115200 -DDOUBLE_SPEED -DNUM_LED_FLASHES=4 '-DMAX_TIME_COUNT=F_CPU>>4' -c
-#LFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g -Wl,-u,vfprintf -lprintf_flt -lm
-LFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g -Wl,--section-start=.text=0x1e000
-
-
-all: dist/$(NAME).elf dist/$(NAME).s dist/$(NAME).hex sim/$(NAME).elf sim/$(NAME).s info
-
-dbg:
-       @echo --HDR---------------------------------
-       @echo $(HDR)
-       @echo --SRC---------------------------------
-       @echo $(SRC)
-       @echo --OBJ---------------------------------
-       @echo $(OBJ)
-       @echo --OBJ_CPP-----------------------------
-       @echo $(OBJ_CPP)
-       @echo --OBJ---------------------------------
-       @echo $(OBJ)
-       @echo ===================================
-       @echo   
-
-info:
-       @avr-size --mcu=$(DEVICE) --format=avr dist/$(NAME).elf
-
-.depend: $(SRC) $(HDR)
-       $(CC) -mmcu=$(DEVICE) -MM $(SRC) | sed --regexp-extended 's/^(.*\.o)\: src\/(.*)(\.cpp|\.c) (.*)/build\/\2\.o\: src\/\2\3 \4/g' > .depend
-
--include .depend
-
-# .depend solte auch auf Header Files achten!
-
-dist/$(NAME).elf: .depend $(OBJ)
-       $(CC) $(LFLAGS) -o $@ $(OBJ)
-
-dist/%.s: dist/%.elf
-       avr-objdump -d $< > $@
-
-dist/%.hex: dist/%.elf
-       #avr-objcopy -j .text -j .data -O ihex $< $@
-       avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@
-
-sim/$(NAME).elf: .depend $(OBJ_SIM)
-               $(CC) $(LFLAGS_SIM) -o $@ $(OBJ_SIM)
-
-
-build/%.o: src/%.c
-       @mkdir -p $(dir $@)
-       $(CC) $(CFLAGS) -o $@ $<
-
-build/%.o: src/%.cpp
-       @mkdir -p $(dir $@)
-       $(CC) $(CFLAGS) -o $@ $<
-
-sim/build/%.o: src/%.c
-       @mkdir -p $(dir $@)
-       $(CC) $(CFLAGS_SIM) -o $@ $<
-
-sim/build/%.o: src/%.cpp
-       @mkdir -p $(dir $@)
-       $(CC) $(CFLAGS_SIM) -o $@ $<
-
-sim/%.s: sim/%.elf
-       avr-objdump -d $< > $@
-
-simuc: sim/$(NAME).elf
-       simuc --board arduino $<
-
-gdb: sim/$(NAME).elf
-       avr-gdb $<
-
-isp-1284p:
-       avrdude -c usbasp -p m1284p
-
-isp-flash-1284p: dist/$(NAME).elf all
-       avrdude -c usbasp -p m1284p -e -U flash:w:$<
-
-flash-1284p: dist/$(NAME).elf all
-       avrdude -c arduino -p m1284p -P /dev/ttyUSB0 -b 115200 -e -U flash:w:$<
-
-
-picocom:
-       # picocom sends CR for ENTER -> convert cr (\r) to lf (\n)
-       picocom -b 115200 --omap crlf /dev/ttyUSB0
-
-isp-erase-1284p:
-       avrdude -c usbasp -p m1284p -e
-isp-fuse-1284p:
-       # LFUSE=0xE7 -> startuptime 16K CLOCKS + 4.1ms -> 5.4ms
-       avrdude -c usbasp -p m1284p -U lfuse:w:0xEF:m -U hfuse:w:0xD8:m -U efuse:w:0xFE:m -U lock:w:0xEF:m
-
-clean:
-       @rm -r dist
-       @rm -r build
-       @rm -r sim
-       @find . -type f -name ".depend" -exec rm {} \;
-       @echo "clean done"
diff --git a/software/bootloader-arduino/README.md b/software/bootloader-arduino/README.md
deleted file mode 100644 (file)
index 81b4a47..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-# Arduino-Bootloader (STK500) für Nano-1284
-
-Dieser Bootloader ermöglicht die Programmierung über das "Arduino-System". Als Kommunikationsprotokoll kommt das [STK500 Protokoll]( https://www.microchip.com/content/dam/mchp/documents/OTH/ApplicationNotes/ApplicationNotes/doc2525.pdf) zur Anwendung (Kommunikationsablauf siehe Datei [protocol](protocol)).
-
-Beim Bootloader in [src/main.c](src/main.c) handelt es sich um eine Anpassung von [https://github.com/arduino/ArduinoCore-avr/blob/master/bootloaders/atmega/ATmegaBOOT_168.c](https://github.com/arduino/ArduinoCore-avr/blob/master/bootloaders/atmega/ATmegaBOOT_168.c) an die Hardware des Nano-1284 Boards.
-
-Diese Anpassung der Quelltext-Datei umfasst:
-* Microcontroller ATmega1284P (mit 128KiB Flash, davon die hinteren 8KiB für den Bootloader)
-* Frequenz 12MHz
-* 3 LEDs (rot, gelb, grün)
-* Assembler-Anweisungen durch Macros aus `avr/boot.h` ersetzt
-* Quelltextkorrekturen, damit der Bootloader auch bei einer Page-Size von 256 Byte funktioniert
-
-Der Bootloader kann entweder selbst aus der Quelltextdatei erzeugt werden (siehe [Übersetzung](#%C3%BCbersetzung)), oder es wird eine der bereits fertigen Dateien im Ordner [release](release) verwendet:
-* [release/bootloader-arduino_nano-1284.elf](release/bootloader-arduino_nano-1284.elf)
-* [release/bootloader-arduino_nano-1284.hex](release/bootloader-arduino_nano-1284.hex)
-
-## Übersetzung
-
-Folgende Tools sind erforderlich:
-* avr-gcc
-* avrdude
-
-Auf einem Linux-Debian System müssen daher folgende Pakete installiert sein:
-```sh
-sudo apt update
-sudo apt install gcc-avr avr-libc binutils-avr avrdude
-```
-
-Die Übersetzung erfolgt dann mit dem Kommando `make`.
-
-## Download auf den µC
-
-Die korrekte Programmierung der Fuses sowie der Download des Bootloaders in den Bootloader-Bereich des µC-Flash kann mit Hilfe eines [USBasp-Programmiergeräts](https://www.fischl.de/usbasp/) mit folgenden Kommandos erfolgen:
-
-```sh
-make isp-fuse
-make isp-flash
-```
-
-Nach der Programmierung sollten die drei LEDs den Start des Bootloader anzeigen (rot -> rot+orange -> grün -> grün blinken).
-
-
-## Download von Programmen mit Hilfe des Bootloaders
-
-Sobald sich am µC ein Bootloader befindet ist kein Programmiergerät mehr erforderlich. Das Programm wird über die serielle UART-Schnittstelle (via USB-Schnittstelle) in den Flash gespeichert.
-
-UART-Schnittstelle (Option `-P`) und Name der ELF-Programmdatei (nach `flash:w:`) sind anzupassen...
-
-```sh
-avrdude -c arduino -p m1284p -P /dev/ttyUSB0 -b 115200 -e -U flash:w:programm.elf
-```
-
-## Einbindung in die Arduino IDE
-
-Zunächst den Ordner mit der Arduino Installation finden. Unter Linux ist das der Pfad:
-```
-/usr/share/arduino/hardware/arduino/avr
-```
-
-Dort im Unterordner `bootloaders` einen Ordner `atmeg1284` anlegen und darin die Intel-Hex Datei des Bootloaders ablegen.
-
-```sh
-make
-sudo mkdir /usr/share/arduino/hardware/arduino/avr/bootloaders/atmega1284
-cp dist/bootloader-arduino_nano-1284.hex /usr/share/arduino/hardware/arduino/avr/bootloaders/atmega1284/
-```
-
-Danach in der Datei `/usr/share/arduino/hardware/arduino/avr/boards.txt` folgende Einträge ergänzen:
-```
-#########################################################
-
-nano1284.name=Nano-1284
-
-nano1284.vid.0=0x1a86
-nano1284.pid.0=0x7522
-nano1284.upload_port.0.vid=0x1a86
-nano1284.upload_port.0.pid=0x7522
-
-nano1284.upload.tool=avrdude
-nano1284.upload.tool.default=avrdude
-nano1284.upload.tool.network=arduino_ota
-nano1284.upload.protocol=arduino
-nano1284.upload.maximum_size=122880
-nano1284.upload.maximum_data_size=16384
-nano1284.upload.speed=115200
-
-nano1284.bootloader.tool=avrdude
-nano1284.bootloader.tool.default=avrdude
-nano1284.bootloader.low_fuses=0xEF
-nano1284.bootloader.high_fuses=0xD8
-nano1284.bootloader.extended_fuses=0xFE
-nano1284.bootloader.unlock_bits=0xFE
-nano1284.bootloader.lock_bits=0xEF
-nano1284.bootloader.file=atmega1284/bootloader-arduino_nano-1284.hex
-
-nano1284.build.mcu=atmega1284p
-nano1284.build.f_cpu=12000000L
-nano1284.build.board=AVR_NANO1284
-nano1284.build.core=arduino
-nano1284.build.variant=standard
-
-##############################################################
-```
-
-Nach dem Start der Arduino-IDE kann:
-* über das Menü *Werkzeuge->Board* das ***Nano-1284*** gewählt werden
-* über das Menü *Werkzeuge->Programmer* der ***ArduinoISP*** gewählt werden
-
diff --git a/software/bootloader-arduino/protocol b/software/bootloader-arduino/protocol
deleted file mode 100644 (file)
index 8c0ea61..0000000
+++ /dev/null
@@ -1,323 +0,0 @@
-  0.552750 -->   2: 3020
-  0.555474 <--   2: 1410
-  0.803623 -->   2: 3020
-  0.806825 <--   2: 1410
-  1.054395 -->   2: 3020
-  1.057282 <--   2: 1410
-
-  1.057514 -->   3: 4181 20
-  1.060837 <--   3: 1401 10
-  1.061061 -->   3: 4182 20
-  1.063819 <--   3: 1410 10
-  1.064049 -->  22: 4282 0000 0101 0101 03ff ffff ff01 0008  0000 0100 0020
-  1.068274 <--   2: 1410
-  1.068436 -->   7: 4505 08d7 a000 20
-  1.071346 <--   2: 1410
-  1.071432 -->   2: 5020
-  1.074021 <--   2: 1410
-  1.084349 -->   2: 7520
-  1.087176 <--   5: 141e 960a 10
-  1.087341 -->   6: 5650 0000 0020
-  1.090435 <--   3: 1400 10
-  1.090608 -->   6: 5650 0000 0020
-  1.093517 <--   3: 1400 10
-  1.093662 -->   6: 5650 0000 0020
-  1.096678 <--   3: 1400 10
-  1.096838 -->   6: 5658 0800 0020
-  1.099974 <--   3: 1400 10
-  1.100216 -->   6: 5658 0800 0020
-  1.103433 <--   3: 1400 10
-  1.103621 -->   6: 5658 0800 0020
-  1.106596 <--   3: 1400 10
-  1.106798 -->   6: 5650 0800 0020
-  1.109878 <--   3: 1400 10
-  1.110108 -->   6: 5650 0800 0020
-  1.113015 <--   3: 1400 10
-  1.113141 -->   6: 5650 0800 0020
-  1.116120 <--   3: 1400 10
-  1.116256 -->   6: 56ac 8000 0020
-  1.119179 <--   3: 1400 10
-  1.174951 -->   3: 4181 20
-  1.177570 <--   3: 1401 10
-  1.177770 -->   3: 4182 20
-  1.180450 <--   3: 1410 10
-  1.180666 -->  22: 4282 0000 0101 0101 03ff ffff ff01 0008  0000 0100 0020
-  1.184868 <--   2: 1410
-  1.185056 -->   7: 4505 08d7 a000 20
-  1.187956 <--   2: 1410
-  1.188059 -->   2: 5020
-  1.190517 <--   2: 1410
-  
-  1.191326 -->   4: 5500 0020
-  1.193964 <--   2: 1410
-  
-  1.194133 -->  32: 6401 0046 0c94 3e00 0c94 5b00 0c94 5b00  0c94 5b00 0c94 5b00 0c94 5b00 0c94 5b00
-  1.194154 -->  32: 0c94 5b00 0c94 5b00 0c94 5b00 0c94 5b00  0c94 5b00 0c94 5b00 0c94 ad00 0c94 5b00
-  1.194285 -->  32: 0c94 5b00 0c94 5b00 0c94 5b00 0c94 5b00  0c94 5b00 0c94 7d00 0c94 5b00 0c94 5b00
-  1.194310 -->  32: 0c94 5b00 0c94 5b00 0c94 5b00 0c94 5b00  0c94 5b00 0c94 9c00 0c94 5b00 0c94 5b00
-  1.197469 -->  32: 1124 1fbe cfef d0e1 debf cdbf 11e0 a0e0  b1e0 e8e2 f8e0 02c0 0590 0d92 aa34 b107
-  1.199991 -->  32: d9f7 21e0 aae4 b1e0 01c0 1d92 a235 b207  e1f7 0e94 d100 0c94 1204 0c94 0000 0f93
-  1.202760 -->  32: 1f93 cf93 c82f 8b01 8a30 19f4 8de0 0e94  5d00 8091 c000 85ff fccf 8091 4e01 9091
-  1.205599 -->  32: 4f01 0817 1907 19f4 c093 c600 02c0 c093  ce00 80e0 90e0 cf91 1f91 0f91 0895 1f92
-  1.208326 -->   5: 0f92 0fb6 20
-  1.255493 <--   2: 1410
-  
-  1.255743 -->   4: 5580 0020
-  1.258608 <--   2: 1410
-  
-  1.258821 -->  32: 6401 0046 0f92 1124 8f93 9f93 ef93 ff93  98b1 88e0 8927 88b9 8091 c600 8093 ce00
-  1.258842 -->  32: e0e0 f1e0 90e2 9083 8483 ff91 ef91 9f91  8f91 0f90 0fbe 0f90 1f90 1895 1f92 0f92
-  1.258964 -->  32: 0fb6 0f92 1124 8f93 8091 ce00 8032 09f4  429a 8f91 0f90 0fbe 0f90 1f90 1895 1f92
-  1.258995 -->  32: 0f92 0fb6 0f92 1124 2f93 8f93 9f93 8091  4a01 9091 4b01 0196 9093 4b01 8093 4a01
-  1.262021 -->  32: 883e 9340 40f0 98b1 80e1 8927 88b9 1092  4b01 1092 4a01 9f91 8f91 2f91 0f90 0fbe
-  1.264633 -->  32: 0f90 1f90 1895 8ce1 87b9 8ce3 88b9 8ae0  8093 8100 8ced 95e0 9093 8900 8093 8800
-  1.267379 -->  32: 82e0 8093 6f00 8093 c000 38e9 3093 c100  26e0 2093 c200 1092 c500 9ce0 9093 c400
-  1.270166 -->  32: 8093 c800 3093 c900 2093 ca00 1092 cd00  9093 cc00 84e1 91e0 9093 4f01 8093 4e01
-  1.272904 -->   5: 86e0 91e0 20
-  1.320139 <--   2: 1410
-  
-  1.320378 -->   4: 5500 0120
-  1.323002 <--   2: 1410
-  
-  1.323205 -->  32: 6401 0046 9093 5101 8093 5001 1092 0001  7894 80e0 90e0 c0e0 d1e0 0ee2 11e0 359b
-  1.323226 -->  32: 03c0 28e4 31e0 02c0 22e2 31e0 7c01 4fef  e41a f40a 3f93 2f93 df93 cf93 9f93 8f93
-  1.323364 -->  32: 1f93 0f93 0e94 3401 8db7 9eb7 0896 0fb6  f894 9ebf 0fbe 8dbf 359b 4298 8fe2 95e7
-  1.323390 -->  32: 0197 f1f7 00c0 0000 c701 d9cf a0e0 b0e0  eae3 f1e0 0c94 eb03 ae01 4b5f 5f4f fa01
-  1.326221 -->  32: 6191 7191 af01 8091 4e01 9091 4f01 0e94  4a01 e2e0 0c94 0704 abe0 b0e0 e0e5 f1e0
-  1.329091 -->  32: 0c94 db03 6c01 7b01 8a01 fc01 1782 1682  8381 81ff ccc1 ce01 0196 3c01 f601 9381
-  1.331759 -->  32: f701 93fd 8591 93ff 8191 7f01 8823 09f4  bac1 8532 39f4 93fd 8591 93ff 8191 7f01
-  1.334544 -->  32: 8532 29f4 b601 90e0 0e94 4103 e7cf 912c  212c 312c ffe1 f315 d8f0 8b32 79f0 38f4
-  1.337305 -->   5: 8032 79f0 20
-  1.384623 <--   2: 1410
-  
-  1.384878 -->   4: 5580 0120
-  1.387608 <--   2: 1410
-  
-  1.387773 -->  32: 6401 0046 8332 a1f4 232d 2061 1dc0 8d32  61f0 8033 69f4 232d 2160 16c0 832d 8260
-  1.387789 -->  32: 382e e32d e460 3e2e 2ac0 f32d f860 1dc0  37fc 2dc0 20ed 280f 2a30 40f0 8e32 b9f4
-  1.387862 -->  32: 36fc 81c1 232d 2064 322e 19c0 36fe 06c0  8ae0 989e 200d 1124 922e 11c0 eae0 2e9e
-  1.387921 -->  32: 200d 1124 222e f32d f062 3f2e 08c0 8c36  21f4 832d 8068 382e 02c0 8836 41f4 f701
-  1.390834 -->  32: 93fd 8591 93ff 8191 7f01 8111 b3cf 982f  9f7d 9554 9330 28f4 0c5f 1f4f 9fe3 9983
-  1.393604 -->  32: 0dc0 8336 31f0 8337 71f0 8335 09f0 59c0  21c0 f801 8081 8983 0e5f 1f4f 8824 8394
-  1.396338 -->  32: 912c 5301 13c0 2801 f2e0 4f0e 511c f801  a080 b180 36fe 03c0 692d 70e0 02c0 6fef
-  1.399072 -->  32: 7fef c501 0e94 3603 4c01 8201 f32d ff77  3f2e 16c0 2801 22e0 420e 511c f801 a080
-  1.401922 -->   5: b180 36fe 20
-  1.448945 <--   2: 1410
-  
-  1.449212 -->   4: 5500 0220
-  1.451904 <--   2: 1410
-  
-  1.452121 -->  32: 6401 0046 03c0 692d 70e0 02c0 6fef 7fef  c501 0e94 2b03 4c01 f32d f068 3f2e 8201
-  1.452143 -->  32: 33fc 1bc0 822d 90e0 8816 9906 b0f4 b601  80e2 90e0 0e94 4103 2a94 f4cf f501 37fc
-  1.452282 -->  32: 8591 37fe 8191 5f01 b601 90e0 0e94 4103  2110 2a94 21e0 821a 9108 8114 9104 71f7
-  1.452308 -->  32: e8c0 8436 11f0 8936 41f5 f801 37fe 07c0  6081 7181 8281 9381 0c5f 1f4f 08c0 6081
-  1.455454 -->  32: 7181 072e 000c 880b 990b 0e5f 1f4f f32d  ff76 3f2e 97ff 09c0 9095 8095 7095 6195
-  1.457980 -->  32: 7f4f 8f4f 9f4f f068 3f2e 2ae0 30e0 a301  0e94 7d03 882e 8618 45c0 8537 31f4 232d
-  1.460725 -->  32: 2f7e b22e 2ae0 30e0 25c0 932d 997f b92e  8f36 c1f0 18f4 8835 79f0 b5c0 8037 19f0
-  1.463464 -->  32: 8837 21f0 b0c0 e92f e061 be2e b4fe 0dc0  fb2d f460 bf2e 09c0 34fe 0ac0 292f 2660
-  1.466235 -->   5: b22e 06c0 20
-  1.513447 <--   2: 1410
-  
-  1.513715 -->   4: 5580 0220
-  1.516432 <--   2: 1410
-  
-  1.516636 -->  32: 6401 0046 28e0 30e0 05c0 20e1 30e0 02c0  20e1 32e0 f801 b7fe 07c0 6081 7181 8281
-  1.516663 -->  32: 9381 0c5f 1f4f 06c0 6081 7181 80e0 90e0  0e5f 1f4f a301 0e94 7d03 882e 8618 fb2d
-  1.516831 -->  32: ff77 3f2e 36fe 0dc0 232d 2e7f a22e 8914  58f4 34fe 0bc0 32fc 09c0 832d 8e7e a82e
-  1.516877 -->  32: 05c0 b82c a32c 03c0 b82c 01c0 b92c a4fe  0fc0 fe01 e80d f11d 8081 8033 21f4 9a2d
-  1.519644 -->  32: 997e a92e 09c0 a2fe 06c0 b394 b394 04c0  8a2d 8678 09f0 b394 a3fc 11c0 a0fe 06c0
-  1.522490 -->  32: b214 88f4 280c 922c 9b18 0ec0 b214 60f4  b601 80e2 90e0 0e94 4103 b394 f7cf b214
-  1.525257 -->  32: 18f4 2b18 02c0 982c 212c a4fe 10c0 b601  80e3 90e0 0e94 4103 a2fe 17c0 a1fc 03c0
-  1.527986 -->  32: 88e7 90e0 02c0 88e5 90e0 b601 0cc0 8a2d  8678 59f0 a1fe 02c0 8be2 01c0 80e2 a7fc
-  1.530784 -->   5: 8de2 b601 20
-  1.577915 <--   2: 1410
-  
-  1.578186 -->   4: 5500 0320
-  1.580952 <--   2: 1410
-  
-  1.581190 -->  32: 6401 0046 90e0 0e94 4103 8914 38f4 b601  80e3 90e0 0e94 4103 9a94 f7cf 8a94 f301
-  1.581212 -->  32: e80d f11d 8081 b601 90e0 0e94 4103 8110  f5cf 2220 09f4 42ce b601 80e2 90e0 0e94
-  1.581358 -->  32: 4103 2a94 f6cf f601 8681 9781 02c0 8fef  9fef 2b96 e2e1 0c94 f703 fc01 0590 6150
-  1.581385 -->  32: 7040 0110 d8f7 8095 9095 8e0f 9f1f 0895  fc01 6150 7040 0190 0110 d8f7 8095 9095
-  1.584265 -->  32: 8e0f 9f1f 0895 0f93 1f93 cf93 df93 fb01  2381 21fd 03c0 8fef 9fef 2cc0 22ff 16c0
-  1.587011 -->  32: 4681 5781 2481 3581 4217 5307 44f4 a081  b181 9d01 2f5f 3f4f 3183 2083 8c93 2681
-  1.589734 -->  32: 3781 2f5f 3f4f 3783 2683 14c0 8b01 ec01  fb01 0084 f185 e02d 0995 892b e1f6 d801
-  1.592493 -->  32: 1696 8d91 9c91 1797 0196 1796 9c93 8e93  1697 ce01 df91 cf91 1f91 0f91 0895 fa01
-  1.595249 -->   5: aa27 2830 20
-  1.642464 <--   2: 1410
-  
-  1.642718 -->   4: 5580 0320
-  1.645473 <--   2: 1410
-  
-  1.645679 -->  32: 6401 0046 51f1 2031 81f1 e894 6f93 6e7f  6e5f 7f4f 8f4f 9f4f af4f b1e0 3ed0 b4e0
-  1.645701 -->  32: 3cd0 670f 781f 891f 9a1f a11d 680f 791f  8a1f 911d a11d 6a0f 711d 811d 911d a11d
-  1.645848 -->  32: 20d0 09f4 6894 3f91 2ae0 269f 1124 3019  305d 3193 def6 cf01 0895 462f 4770 405d
-  1.645887 -->  32: 4193 b3e0 0fd0 c9f7 f6cf 462f 4f70 405d  4a33 18f0 495d 31fd 4052 4193 02d0 a9f7
-  1.648691 -->  32: eacf b4e0 a695 9795 8795 7795 6795 ba95  c9f7 0097 6105 7105 0895 9b01 ac01 0a2e
-  1.651486 -->  32: 0694 5795 4795 3795 2795 ba95 c9f7 620f  731f 841f 951f a01d 0895 2f92 3f92 4f92
-  1.654229 -->  32: 5f92 6f92 7f92 8f92 9f92 af92 bf92 cf92  df92 ef92 ff92 0f93 1f93 cf93 df93 cdb7
-  1.657068 -->  32: deb7 ca1b db0b 0fb6 f894 debf 0fbe cdbf  0994 2a88 3988 4888 5f84 6e84 7d84 8c84
-  1.659779 -->   5: 9b84 aa84 20
-  1.706941 <--   2: 1410
-  
-  1.707172 -->   4: 5500 0420
-  1.709845 <--   2: 1410
-  
-  1.710064 -->  32: 6401 0046 b984 c884 df80 ee80 fd80 0c81  1b81 aa81 b981 ce0f d11d 0fb6 f894 debf
-  1.710085 -->  32: 0fbe cdbf ed01 0895 f894 ffcf 202d 3e20  5800 0000 0002 0000 0000 5d00 0000 0000
-  1.710260 -->  32: 0000 0002 0000 0000 5d00 0000 0000 5357  3220 7072 6573 7365 6400 2530 3478 3a20
-  1.710304 -->  32: 4865 6c6c 6f20 776f 726c 6425 7320 2025  3132 730d 0000 ffff ffff ffff ffff ffff
-  1.713085 -->  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
-  1.715997 -->  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
-  1.718639 -->  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
-  1.721439 -->  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
-  1.724135 -->   5: ffff ffff 20
-  1.771467 <--   2: 1410
-  
-  1.772647 -->   4: 5500 0020
-  1.775440 <--   2: 1410
-  
-  1.775659 -->   5: 7401 0046 20
-  1.779386 <--  32: 140c 943e 000c 945b 000c 945b 000c 945b  000c 945b 000c 945b 000c 945b 000c 945b
-  1.781924 <--  32: 000c 945b 000c 945b 000c 945b 000c 945b  000c 945b 000c 94ad 000c 945b 000c 945b
-  1.784614 <--  32: 000c 945b 000c 945b 000c 945b 000c 945b  000c 947d 000c 945b 000c 945b 000c 945b
-  1.787364 <--  32: 000c 945b 000c 945b 000c 945b 000c 945b  000c 949c 000c 945b 000c 945b 0011 241f
-  1.790456 <--  32: becf efd0 e1de bfcd bf11 e0a0 e0b1 e0e8  e2f8 e002 c005 900d 92aa 34b1 07d9 f721
-  1.792965 <--  32: e0aa e4b1 e001 c01d 92a2 35b2 07e1 f70e  94d1 000c 9412 040c 9400 000f 931f 93cf
-  1.795688 <--  32: 93c8 2f8b 018a 3019 f48d e00e 945d 0080  91c0 0085 fffc cf80 914e 0190 914f 0108
-  1.798432 <--  32: 1719 0719 f4c0 93c6 0002 c0c0 93ce 0080  e090 e0cf 911f 910f 9108 951f 920f 920f
-  1.800632 <--   2: b610
-  
-  1.800878 -->   4: 5580 0020
-  1.803619 <--   2: 1410
-  
-  1.803814 -->   5: 7401 0046 20
-  1.807479 <--  32: 140f 9211 248f 939f 93ef 93ff 9398 b188  e089 2788 b980 91c6 0080 93ce 00e0 e0f1
-  1.809984 <--  32: e090 e290 8384 83ff 91ef 919f 918f 910f  900f be0f 901f 9018 951f 920f 920f b60f
-  1.812844 <--  32: 9211 248f 9380 91ce 0080 3209 f442 9a8f  910f 900f be0f 901f 9018 951f 920f 920f
-  1.815639 <--  32: b60f 9211 242f 938f 939f 9380 914a 0190  914b 0101 9690 934b 0180 934a 0188 3e93
-  1.818304 <--  32: 4040 f098 b180 e189 2788 b910 924b 0110  924a 019f 918f 912f 910f 900f be0f 901f
-  1.821082 <--  32: 9018 958c e187 b98c e388 b98a e080 9381  008c ed95 e090 9389 0080 9388 0082 e080
-  1.823911 <--  32: 936f 0080 93c0 0038 e930 93c1 0026 e020  93c2 0010 92c5 009c e090 93c4 0080 93c8
-  1.826612 <--  32: 0030 93c9 0020 93ca 0010 92cd 0090 93cc  0084 e191 e090 934f 0180 934e 0186 e091
-  1.828744 <--   2: e010
-  
-  1.828876 -->   4: 5500 0120
-  1.831444 <--   2: 1410
-  
-  1.831620 -->   5: 7401 0046 20
-  1.835129 <--  32: 1490 9351 0180 9350 0110 9200 0178 9480  e090 e0c0 e0d1 e00e e211 e035 9b03 c028
-  1.837845 <--  32: e431 e002 c022 e231 e07c 014f efe4 1af4  0a3f 932f 93df 93cf 939f 938f 931f 930f
-  1.840579 <--  32: 930e 9434 018d b79e b708 960f b6f8 949e  bf0f be8d bf35 9b42 988f e295 e701 97f1
-  1.843432 <--  32: f700 c000 00c7 01d9 cfa0 e0b0 e0ea e3f1  e00c 94eb 03ae 014b 5f5f 4ffa 0161 9171
-  1.846426 <--  32: 91af 0180 914e 0190 914f 010e 944a 01e2  e00c 9407 04ab e0b0 e0e0 e5f1 e00c 94db
-  1.848837 <--  32: 036c 017b 018a 01fc 0117 8216 8283 8181  ffcc c1ce 0101 963c 01f6 0193 81f7 0193
-  1.851649 <--  32: fd85 9193 ff81 917f 0188 2309 f4ba c185  3239 f493 fd85 9193 ff81 917f 0185 3229
-  1.854442 <--  32: f4b6 0190 e00e 9441 03e7 cf91 2c21 2c31  2cff e1f3 15d8 f08b 3279 f038 f480 3279
-  1.856623 <--   2: f010
-  
-  1.856748 -->   4: 5580 0120
-  1.859363 <--   2: 1410
-  
-  1.859447 -->   5: 7401 0046 20
-  1.862911 <--  32: 1483 32a1 f423 2d20 611d c08d 3261 f080  3369 f423 2d21 6016 c083 2d82 6038 2ee3
-  1.865610 <--  32: 2de4 603e 2e2a c0f3 2df8 601d c037 fc2d  c020 ed28 0f2a 3040 f08e 32b9 f436 fc81
-  1.868409 <--  32: c123 2d20 6432 2e19 c036 fe06 c08a e098  9e20 0d11 2492 2e11 c0ea e02e 9e20 0d11
-  1.871210 <--  32: 2422 2ef3 2df0 623f 2e08 c08c 3621 f483  2d80 6838 2e02 c088 3641 f4f7 0193 fd85
-  1.873963 <--  32: 9193 ff81 917f 0181 11b3 cf98 2f9f 7d95  5493 3028 f40c 5f1f 4f9f e399 830d c083
-  1.876709 <--  32: 3631 f083 3771 f083 3509 f059 c021 c0f8  0180 8189 830e 5f1f 4f88 2483 9491 2c53
-  1.879571 <--  32: 0113 c028 01f2 e04f 0e51 1cf8 01a0 80b1  8036 fe03 c069 2d70 e002 c06f ef7f efc5
-  1.882458 <--  32: 010e 9436 034c 0182 01f3 2dff 773f 2e16  c028 0122 e042 0e51 1cf8 01a0 80b1 8036
-  1.884340 <--   2: fe10
-  
-  1.884567 -->   4: 5500 0220
-  1.887255 <--   2: 1410
-  
-  1.887443 -->   5: 7401 0046 20
-  1.890818 <--  32: 1403 c069 2d70 e002 c06f ef7f efc5 010e  942b 034c 01f3 2df0 683f 2e82 0133 fc1b
-  1.893598 <--  32: c082 2d90 e088 1699 06b0 f4b6 0180 e290  e00e 9441 032a 94f4 cff5 0137 fc85 9137
-  1.896393 <--  32: fe81 915f 01b6 0190 e00e 9441 0321 102a  9421 e082 1a91 0881 1491 0471 f7e8 c084
-  1.899280 <--  32: 3611 f089 3641 f5f8 0137 fe07 c060 8171  8182 8193 810c 5f1f 4f08 c060 8171 8107
-  1.902001 <--  32: 2e00 0c88 0b99 0b0e 5f1f 4ff3 2dff 763f  2e97 ff09 c090 9580 9570 9561 957f 4f8f
-  1.904757 <--  32: 4f9f 4ff0 683f 2e2a e030 e0a3 010e 947d  0388 2e86 1845 c085 3731 f423 2d2f 7eb2
-  1.907577 <--  32: 2e2a e030 e025 c093 2d99 7fb9 2e8f 36c1  f018 f488 3579 f0b5 c080 3719 f088 3721
-  1.910469 <--  32: f0b0 c0e9 2fe0 61be 2eb4 fe0d c0fb 2df4  60bf 2e09 c034 fe0a c029 2f26 60b2 2e06
-  1.912524 <--   2: c010
-  
-  1.912815 -->   4: 5580 0220
-  1.915611 <--   2: 1410
-  
-  1.915811 -->   5: 7401 0046 20
-  1.919244 <--  32: 1428 e030 e005 c020 e130 e002 c020 e132  e0f8 01b7 fe07 c060 8171 8182 8193 810c
-  1.921988 <--  32: 5f1f 4f06 c060 8171 8180 e090 e00e 5f1f  4fa3 010e 947d 0388 2e86 18fb 2dff 773f
-  1.924734 <--  32: 2e36 fe0d c023 2d2e 7fa2 2e89 1458 f434  fe0b c032 fc09 c083 2d8e 7ea8 2e05 c0b8
-  1.927531 <--  32: 2ca3 2c03 c0b8 2c01 c0b9 2ca4 fe0f c0fe  01e8 0df1 1d80 8180 3321 f49a 2d99 7ea9
-  1.930309 <--  32: 2e09 c0a2 fe06 c0b3 94b3 9404 c08a 2d86  7809 f0b3 94a3 fc11 c0a0 fe06 c0b2 1488
-  1.933091 <--  32: f428 0c92 2c9b 180e c0b2 1460 f4b6 0180  e290 e00e 9441 03b3 94f7 cfb2 1418 f42b
-  1.935886 <--  32: 1802 c098 2c21 2ca4 fe10 c0b6 0180 e390  e00e 9441 03a2 fe17 c0a1 fc03 c088 e790
-  1.938647 <--  32: e002 c088 e590 e0b6 010c c08a 2d86 7859  f0a1 fe02 c08b e201 c080 e2a7 fc8d e2b6
-  1.940863 <--   2: 0110
-  
-  1.941071 -->   4: 5500 0320
-  1.943869 <--   2: 1410
-  
-  1.944088 -->   5: 7401 0046 20
-  1.947433 <--  32: 1490 e00e 9441 0389 1438 f4b6 0180 e390  e00e 9441 039a 94f7 cf8a 94f3 01e8 0df1
-  1.950256 <--  32: 1d80 81b6 0190 e00e 9441 0381 10f5 cf22  2009 f442 ceb6 0180 e290 e00e 9441 032a
-  1.953054 <--  32: 94f6 cff6 0186 8197 8102 c08f ef9f ef2b  96e2 e10c 94f7 03fc 0105 9061 5070 4001
-  1.955732 <--  32: 10d8 f780 9590 958e 0f9f 1f08 95fc 0161  5070 4001 9001 10d8 f780 9590 958e 0f9f
-  1.958565 <--  32: 1f08 950f 931f 93cf 93df 93fb 0123 8121  fd03 c08f ef9f ef2c c022 ff16 c046 8157
-  1.961369 <--  32: 8124 8135 8142 1753 0744 f4a0 81b1 819d  012f 5f3f 4f31 8320 838c 9326 8137 812f
-  1.964157 <--  32: 5f3f 4f37 8326 8314 c08b 01ec 01fb 0100  84f1 85e0 2d09 9589 2be1 f6d8 0116 968d
-  1.966902 <--  32: 919c 9117 9701 9617 969c 938e 9316 97ce  01df 91cf 911f 910f 9108 95fa 01aa 2728
-  1.969047 <--   2: 3010
-  
-  1.969248 -->   4: 5580 0320
-  1.972047 <--   2: 1410
-  
-  1.972246 -->   5: 7401 0046 20
-  1.975748 <--  32: 1451 f120 3181 f1e8 946f 936e 7f6e 5f7f  4f8f 4f9f 4faf 4fb1 e03e d0b4 e03c d067
-  1.978498 <--  32: 0f78 1f89 1f9a 1fa1 1d68 0f79 1f8a 1f91  1da1 1d6a 0f71 1d81 1d91 1da1 1d20 d009
-  1.981514 <--  32: f468 943f 912a e026 9f11 2430 1930 5d31  93de f6cf 0108 9546 2f47 7040 5d41 93b3
-  1.983891 <--  32: e00f d0c9 f7f6 cf46 2f4f 7040 5d4a 3318  f049 5d31 fd40 5241 9302 d0a9 f7ea cfb4
-  1.986799 <--  32: e0a6 9597 9587 9577 9567 95ba 95c9 f700  9761 0571 0508 959b 01ac 010a 2e06 9457
-  1.989512 <--  32: 9547 9537 9527 95ba 95c9 f762 0f73 1f84  1f95 1fa0 1d08 952f 923f 924f 925f 926f
-  1.992260 <--  32: 927f 928f 929f 92af 92bf 92cf 92df 92ef  92ff 920f 931f 93cf 93df 93cd b7de b7ca
-  1.995029 <--  32: 1bdb 0b0f b6f8 94de bf0f becd bf09 942a  8839 8848 885f 846e 847d 848c 849b 84aa
-  1.997163 <--   2: 8410
-  
-  1.997338 -->   4: 5500 0420
-  2.000161 <--   2: 1410
-  
-  2.000367 -->   5: 7401 0046 20
-  2.003803 <--  32: 14b9 84c8 84df 80ee 80fd 800c 811b 81aa  81b9 81ce 0fd1 1d0f b6f8 94de bf0f becd
-  2.006477 <--  32: bfed 0108 95f8 94ff cf20 2d3e 2058 0000  0000 0200 0000 005d 0000 0000 0000 0000
-  2.009429 <--  32: 0200 0000 005d 0000 0000 0053 5732 2070  7265 7373 6564 0025 3034 783a 2048 656c
-  2.012149 <--  32: 6c6f 2077 6f72 6c64 2573 2020 2531 3273  0d00 00ff ffff ffff ffff ffff ffff ffff
-  2.014971 <--  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
-  2.017659 <--  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
-  2.020387 <--  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
-  2.023167 <--  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
-  2.025368 <--   2: ff10
-  
-  2.025949 -->   6: 5650 0000 0020
-  2.028775 <--   3: 1400 10
-  2.028918 -->   6: 5650 0000 0020
-  2.031848 <--   3: 1400 10
-  2.031977 -->   6: 5650 0000 0020
-  2.034973 <--   3: 1400 10
-  2.035141 -->   6: 5658 0800 0020
-  2.038215 <--   3: 1400 10
-  2.038413 -->   6: 5658 0800 0020
-  2.041454 <--   3: 1400 10
-  2.041646 -->   6: 5658 0800 0020
-  2.044533 <--   3: 1400 10
-  2.044682 -->   6: 5650 0800 0020
-  2.047749 <--   3: 1400 10
-  2.047987 -->   6: 5650 0800 0020
-  2.050921 <--   3: 1400 10
-  2.051154 -->   6: 5650 0800 0020
-  2.054178 <--   3: 1400 10
-
-  2.054415 -->   2: 5120
-  2.056864 <--   2: 1410
diff --git a/software/bootloader-arduino/release/.gitkeep b/software/bootloader-arduino/release/.gitkeep
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/software/bootloader-arduino/src/main.c b/software/bootloader-arduino/src/main.c
deleted file mode 100644 (file)
index 08cebfe..0000000
+++ /dev/null
@@ -1,516 +0,0 @@
-/*************************************************************************************************/
-/* Serial Bootloader for Atmel megaAVR Controllers                                               */
-/*                                                                                               */
-/* Source-code taken from:                                                                       */
-/*    https://github.com/arduino/ArduinoCore-avr/blob/master/bootloaders/atmega/ATmegaBOOT_168.c */
-/*    Branch@hash: master@321fca0b                                                               */
-/*                                                                                               */
-/* Licence can be viewed at http://www.fsf.org/licenses/gpl.txt                                  */
-/*                                                                                               */
-/*************************************************************************************************/
-
-#include <inttypes.h>
-
-#include <avr/boot.h>
-#include <avr/io.h>
-#include <avr/pgmspace.h>
-#include <avr/interrupt.h>
-#include <avr/wdt.h>
-// #include <util/delay.h>
-
-// #define DEBUG_UART1
-#ifdef DEBUG_UART1
-   #include <stdio.h>
-#endif
-
-// after this many errors give up and launch application
-#define MAX_ERROR_COUNT 5
-
-#define HW_VER   0xF1
-#define SW_MAJOR 0x01
-#define SW_MINOR 0x10
-
-// onboard LED is used to indicate, that the bootloader was entered
-#define SET_LED_RED (PORTC |= (1 << PC2))
-#define CLR_LED_RED (PORTC &= ~(1 << PC2))
-#define SET_LED_ORANGE (PORTC |= (1 << PC3))
-#define CLR_LED_ORANGE (PORTC &= ~(1 << PC3))
-#define SET_LED_GREEN (PORTC |= (1 << PC4))
-#define CLR_LED_GREEN (PORTC &= ~(1 << PC4))
-
-// define various device id's
-// manufacturer byte is always the same
-#define SIG1  0x1E    // Yep, Atmel is the only manufacturer of AVR micros.  Single source :(
-#define SIG2  0x97
-#define SIG3  0x05
-#define PAGE_SIZE 0x80U   // 128 words
-
-// function prototypes
-void putch(char);
-char getch(void);
-void getNch(uint8_t);
-void byte_response(uint8_t);
-void nothing_response(void);
-char gethex(void);
-void puthex(char);
-void flash_led(uint8_t);
-
-#ifdef DEBUG_UART1
-   int uart_putchar(char c, FILE *stream) {
-      if (c == '\n') {
-         uart_putchar('\r', stream);
-      }
-      loop_until_bit_is_set(UCSR1A, UDRE1);
-      UDR1 = c;
-      return 0;
-   }
-
-   static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
-#endif
-
-// some variables
-union address_union {
-       uint16_t word;
-       uint8_t  byte[2];
-} address;
-
-union length_union {
-       uint16_t word;
-       uint8_t  byte[2];
-} length;
-
-struct flags_struct {
-       unsigned eeprom : 1;
-       unsigned rampz  : 1;
-} flags;
-
-uint8_t buff[SPM_PAGESIZE + 1];
-// uint8_t address_high;
-// uint8_t pagesz=0x80;
-
-uint16_t i;
-uint8_t bootuart = 0;
-
-uint8_t error_count = 0;
-
-void (*app_start)(void) = 0x0000;
-
-int main () {
-       uint8_t ch, ch2;
-       uint16_t w;
-
-       #ifdef WATCHDOG_MODS
-               ch = MCUSR;
-               MCUSR = 0;
-
-               WDTCSR |= _BV(WDCE) | _BV(WDE);
-               WDTCSR = 0;
-
-               // Check if the WDT was used to reset, in which case we dont bootload and skip straight to the code. woot.
-               if (! (ch &  _BV(EXTRF))) // if its a not an external reset...
-         app_start();  // skip bootloader
-       #else
-               asm volatile("nop\n\t");
-       #endif
-
-       // LED ports output and off, ensure that Q1 (battery power) on (PC7)
-       PORTC = 0;
-    DDRC = (1 << PC7) | (1 << PC4) | (1 << PC3) |(1 << PC2);
-       
-
-       #ifdef DOUBLE_SPEED
-               UCSR0A = (1 << U2X0); // Double speed mode USART0
-               UBRR0L = (uint8_t)(F_CPU / (BAUD_RATE *8L) - 1);
-               UBRR0H = (F_CPU / (BAUD_RATE * 8L) - 1) >> 8;
-      #ifdef DEBUG_UART1
-                  UCSR1A = (1 << U2X1); // Double speed mode USART0
-                  UBRR1L = (uint8_t)(F_CPU / (BAUD_RATE *8L) - 1);
-                  UBRR1H = (F_CPU / (BAUD_RATE * 8L) - 1) >> 8;
-      #endif
-       #else
-               UBRR0L = (uint8_t)(F_CPU / (BAUD_RATE * 16L) - 1);
-               UBRR0H = (F_CPU / (BAUD_RATE*16L)-1) >> 8;
-      #ifdef DEBUG_UART1
-                  UBRR1L = (uint8_t)(F_CPU / (BAUD_RATE * 16L) - 1);
-                  UBRR1H = (F_CPU / (BAUD_RATE*16L)-1) >> 8;
-      #endif
-       #endif
-
-       UCSR0B = (1<<RXEN0) | (1<<TXEN0);
-       UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
-       UCSR1B = (1<<TXEN1);
-       UCSR1C = (1<<UCSZ00) | (1<<UCSZ01);
-       
-   #ifdef DEBUG_UART1
-      stdout = &mystdout;
-          printf("\n\nArduino-Bootloader\n");
-   #endif
-       
-       // flash onboard LED to signal entering of bootloader */
-       flash_led(NUM_LED_FLASHES);
-
-       // forever loop
-       while (1) {
-
-               // get character from UART
-               ch = getch();
-
-               // A bunch of if...else if... gives smaller code than switch...case !
-
-               // Hello is anyone home ?
-               if(ch == '0') {
-                       nothing_response();
-
-               } else if (ch == '1') {
-                       // Request programmer ID
-                       // Not using PROGMEM string due to boot block in m128 being beyond 64kB boundary
-                       // Would need to selectively manipulate RAMPZ, and it's only 9 characters anyway so who cares.
-       
-                       if (getch() == ' ') {
-                               putch(0x14);
-                               putch('A');
-                               putch('V');
-                               putch('R');
-                               putch(' ');
-                               putch('I');
-                               putch('S');
-                               putch('P');
-                               putch(0x10);
-                       } else {
-                               if (++error_count == MAX_ERROR_COUNT) {
-               DDRC = 0; PORTC = 0;
-                                       app_start();
-                               }
-                       }
-
-               } else if (ch == '@') {
-                       // AVR ISP/STK500 board commands DON'T CARE so default nothing_response
-                       ch2 = getch();
-                       if (ch2 > 0x85) getch();
-                       nothing_response();
-
-               // *****************************
-               // AVR ISP/STK500 board requests
-               // *****************************
-
-               } else if (ch == 'A') { // 0x41
-                       ch2 = getch();
-                       if (ch2 == 0x80) {
-                               byte_response(HW_VER);     // Hardware version
-                       } else if (ch2 == 0x81) {
-                               byte_response(SW_MAJOR);   // Software major version
-                  } else if(ch2 == 0x82) {
-                               byte_response(SW_MINOR);   // Software minor version
-             } else if(ch2==0x98) {
-                               byte_response(0x03);       // Unknown but seems to be required by avr studio 3.56
-                       } else {
-                               byte_response(0x00);       // Covers various unnecessary responses we don't care about
-                       }
-
-               } else if (ch == 'B') { // B: 0x42
-                       // Device Parameters  DON'T CARE, DEVICE IS FIXED
-                       getNch(20);
-                       nothing_response();
-
-               
-               } else if (ch == 'E') { // E: 0x45
-                       // Parallel programming stuff  DON'T CARE
-                       getNch(5);
-                       nothing_response();
-
-               } else if (ch == 'P' || ch == 'R') { // P: 0x50, R: 0x52
-                       // P: Enter programming mode
-                  // R: Erase device, don't care as we will erase one page at a time anyway.
-                       nothing_response();
-
-               } else if (ch == 'Q') { // Q: 0x51
-                       // Leave programming mode
-                       nothing_response();
-                       #ifdef WATCHDOG_MODS
-                               // autoreset via watchdog (sneaky!)
-                               WDTCSR = _BV(WDE);
-                               while (1); // 16 ms
-                       #endif
-
-               } else if(ch == 'U') { // U: 0x55
-                       // Set address, little endian. EEPROM in bytes, FLASH in words
-                       // Perhaps extra address bytes may be added in future to support > 128kB FLASH.
-                       // This might explain why little endian was used here, big endian used everywhere else.
-                       address.byte[0] = getch();
-                       address.byte[1] = getch();
-                       nothing_response();
-
-
-               } else if (ch == 'V') { // V: 0x56
-                       // Universal SPI programming command, disabled.  Would be used for fuses and lock bits.
-                       if (getch() == 0x30) {
-                               getch();
-                               ch = getch();
-                               getch();
-                               if (ch == 0) {
-                                       byte_response(SIG1);
-                               } else if (ch == 1) {
-                                       byte_response(SIG2); 
-                               } else {
-                                       byte_response(SIG3);
-                               } 
-                       } else {
-                               getNch(3);
-                               byte_response(0x00);
-                       }
-
-               } else if (ch == 'd') { // d: 0x64
-                       // Write memory, length is big endian and is in bytes
-                       length.byte[1] = getch();
-                       length.byte[0] = getch();
-                       flags.eeprom = 0;
-                       if (getch() == 'E') {
-                               flags.eeprom = 1;
-                       }
-                       for (w = 0; w < length.word; w++) {
-                               // Store data in buffer, can't keep up with serial data stream whilst programming pages
-                               buff[w] = getch(); 
-                       }
-                       if (getch() == ' ') {
-                               if (flags.eeprom) {
-                                       // Write to EEPROM one byte at a time
-                                       address.word <<= 1;
-                                       for(w = 0; w < length.word; w++) {
-                                               while(EECR & (1<<EEPE));
-                                               EEAR = (uint16_t)address.word;
-                                               EEDR = buff[w];
-                                               EECR |= (1<<EEMPE);
-                                               EECR |= (1<<EEPE);
-                                               // SX
-                                               // eeprom_write_byte((void *)address.word,buff[w]);
-                                               address.word++;
-                                       }                       
-                               } else {
-                                       // Write to FLASH one page at a time
-                                       if (address.byte[1] > 127) {
-                                               //Only possible with m128, m256 will need 3rd address byte. FIXME
-                                               RAMPZ = 0x01;
-                                       } else {
-                                               RAMPZ = 0x00;
-                                       }
-
-                                       // address * 2 -> byte location
-                                       address.word = address.word << 1;               
-                                       if ((length.byte[0] & 0x01)) {
-                                               // Even up an odd number of bytes
-                                               length.word++;
-                                       }
-                                       cli();
-
-                                       uint16_t addr = address.word;
-                                       #ifdef DEBUG_UART1
-                  printf("Programming: address=0x%04x length=0x%04x\n", addr, length.word);
-                                          printf("  eeprom_busy_wait() ...");
-                                       #endif
-               eeprom_busy_wait();
-                                       boot_spm_busy_wait();
-                                       #ifdef DEBUG_UART1
-                                       printf("done\n");
-                  printf("  boot_page_erase(0x%04x)...", address.word);
-               #endif
-                                       boot_page_erase(addr);
-                                       boot_spm_busy_wait ();
-                                       #ifdef DEBUG_UART1
-                                       printf("done\n");
-                                       printf("  boot_page_fill(0x%04x, ...): ", address.word);
-               #endif
-                                       for (i = 0; i < SPM_PAGESIZE; i += 2) {
-                                               uint16_t w = buff[i] + (buff[i + 1] << 8);
-                                       #ifdef DEBUG_UART1
-                     printf(".");
-                  #endif
-                                               boot_page_fill(addr + i, w);
-                                       }
-                                       #ifdef DEBUG_UART1
-                  printf("\n  boot_page_write(0x%04x)...", address.word);
-               #endif
-                                       boot_page_write(addr);
-                                       boot_spm_busy_wait();
-                                       #ifdef DEBUG_UART1
-                  printf("done\n");
-                                  printf("  boot_rww_enable()\n");
-               #endif
-                                       boot_rww_enable();
-                               }
-                               putch(0x14);
-                               putch(0x10);
-
-                       } else {
-                               if (++error_count == MAX_ERROR_COUNT)
-               DDRC = 0; PORTC = 0;
-                                       app_start();
-                       }               
-
-               } else if (ch == 't') { // t: 0x74
-                       // Read memory block mode, length is big endian.  */
-                       length.byte[1] = getch();
-                       length.byte[0] = getch();
-                       // if (address.word>0x7FFF) flags.rampz = 1; // No go with m256, FIXME
-                       // else flags.rampz = 0;
-                       address.word = address.word << 1; // address * 2 -> byte location
-                       if (getch() == 'E') {
-                               flags.eeprom = 1;
-                       } else {
-                               flags.eeprom = 0;
-                       }
-                       if (getch() == ' ') {                           
-                               // Command terminator
-                               putch(0x14);
-                               for (w = 0; w < length.word; w++) {
-                                       // Can handle odd and even lengths okay
-                                       if (flags.eeprom) {                             // Byte access EEPROM read
-                                               while(EECR & (1<<EEPE));
-                                               EEAR = (uint32_t)address.word;
-                                               EECR |= (1<<EERE);
-                                               putch(EEDR);
-                                               // putch(eeprom_read_byte((void *)address.word));
-                                               address.word++;
-                                       }
-                                       else {
-                                               if (!flags.rampz) {
-                                                       putch(pgm_read_byte_near(address.word));
-                                               } else {
-                     putch(pgm_read_byte_far(address.word + 0x10000));
-                  }
-                                               address.word++;
-                                       }
-                               }
-                       }
-                       putch(0x10);
-
-               } else if(ch == 'u') { // u: 0x75
-                       // Get device signature bytes
-                       if (getch() == ' ') {
-                               putch(0x14);
-                               putch(SIG1);
-                               putch(SIG2);
-                               putch(SIG3);
-                               putch(0x10);
-                       } else {
-                               if (++error_count == MAX_ERROR_COUNT)
-               DDRC = 0; PORTC = 0;
-                                       app_start();
-                       }
-
-               } else if (ch == 'v') {
-                       // Read oscillator calibration byte
-                       byte_response(0x00);
-               }
-
-       }
-}
-
-char gethexnib () {
-       char a;
-       a = getch(); putch(a);
-       if (a >= 'a') {
-               return (a - 'a' + 0x0a);
-       } else if (a >= '0') {
-               return (a - '0');
-       }
-       return a;
-}
-
-
-char gethex () {
-       return (gethexnib() << 4) + gethexnib();
-}
-
-
-void puthex (char ch) {
-       char ah;
-
-       ah = ch >> 4;
-       if(ah >= 0x0a) {
-               ah = ah - 0x0a + 'a';
-       } else {
-               ah += '0';
-       }
-       
-       ch &= 0x0f;
-       if(ch >= 0x0a) {
-               ch = ch - 0x0a + 'a';
-       } else {
-               ch += '0';
-       }
-       
-       putch(ah);
-       putch(ch);
-}
-
-
-void putch (char ch) {
-       while (!(UCSR0A & _BV(UDRE0)));
-       UDR0 = ch;
-}
-
-
-char getch () {
-       uint32_t count = 0;
-       while( !(UCSR0A & _BV(RXC0)) ) {
-               count++;
-               if (count > MAX_TIME_COUNT) {
-         DDRC = 0; PORTC = 0;
-                       app_start();
-               }
-       }
-       return UDR0;
-}
-
-
-void getNch (uint8_t count) {
-       while(count--) {
-               getch();
-       }
-}
-
-
-void byte_response (uint8_t val) {
-       if (getch() == ' ') {
-               putch(0x14);
-               putch(val);
-               putch(0x10);
-       } else if (++error_count == MAX_ERROR_COUNT) {
-      DDRC = 0; PORTC = 0;
-       app_start();
-   }
-}
-
-void nothing_response () {
-       if (getch() == ' ') {
-               putch(0x14);
-               putch(0x10);
-       } else if (++error_count == MAX_ERROR_COUNT) {
-               DDRC = 0; PORTC = 0;
-               app_start();
-       }
-}
-
-void delay () {
-       // app. 200ms
-       for (volatile uint32_t timer = 0; timer < 0x12000; timer++) {
-               if (UCSR0A & _BV(RXC0)) {
-                       return;
-               }
-       }
-}
-
-void flash_led (uint8_t count) {
-       SET_LED_RED;
-   delay();
-   SET_LED_ORANGE;
-       delay();
-   PORTC = 0;
-   
-       while (count--) {
-      SET_LED_GREEN;
-               delay();
-               CLR_LED_GREEN;
-               delay();
-       }
-}
diff --git a/software/nano-1284/bootloader-arduino/.gdb_history b/software/nano-1284/bootloader-arduino/.gdb_history
new file mode 100644 (file)
index 0000000..3339046
--- /dev/null
@@ -0,0 +1,9 @@
+target remote :1234
+layout split
+stepi
+quit
+target remote :1234
+layout split
+stepi
+b *main+9
+quit
diff --git a/software/nano-1284/bootloader-arduino/.gdbinit b/software/nano-1284/bootloader-arduino/.gdbinit
new file mode 100644 (file)
index 0000000..a8c4b59
--- /dev/null
@@ -0,0 +1,5 @@
+set history save on
+set history size 1000
+set history remove-duplicates 2
+set history filename .gdb_history
+
diff --git a/software/nano-1284/bootloader-arduino/.gitignore b/software/nano-1284/bootloader-arduino/.gitignore
new file mode 100644 (file)
index 0000000..a959910
--- /dev/null
@@ -0,0 +1,4 @@
+.depend
+**/build
+**/dist
+**/sim
diff --git a/software/nano-1284/bootloader-arduino/.vscode/c_cpp_properties.json b/software/nano-1284/bootloader-arduino/.vscode/c_cpp_properties.json
new file mode 100644 (file)
index 0000000..773ff69
--- /dev/null
@@ -0,0 +1,26 @@
+{
+    "configurations": [
+        {
+            "name": "Linux AVR",
+            "includePath": [
+                "/usr/lib/avr/include/**",
+                "/usr/lib/gcc/avr/**"
+            ],
+            "defines": [],
+            "compilerPath": "/usr/bin/avr-gcc",
+            "compilerArgs": [
+                "-mmcu=atmega1284p",
+                "-Os",
+                "-DF_CPU=12000000",
+                "-DBAUD_RATE=115200",
+                "-DDOUBLE_SPEED",
+                "-DNUM_LED_FLASHES=4",
+                "-DMAX_TIME_COUNT=F_CPU>>4"
+            ],
+            "cStandard": "gnu11",
+            "cppStandard": "gnu++11",
+            "intelliSenseMode": "linux-gcc-x64"
+        }
+    ],
+    "version": 4
+}
diff --git a/software/nano-1284/bootloader-arduino/.vscode/launch.json b/software/nano-1284/bootloader-arduino/.vscode/launch.json
new file mode 100644 (file)
index 0000000..f29cf2e
--- /dev/null
@@ -0,0 +1,37 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "Build",
+            // "request": "launch",
+            "type": "node-terminal",
+            "preLaunchTask": "build"
+        },{
+            "name": "Flash",
+            // "request": "launch",
+            "type": "node-terminal",
+            "preLaunchTask": "flash"
+        },{
+            "name": "Clean",
+            // "request": "launch",
+            "type": "node-terminal",
+            "preLaunchTask": "clean"
+        },{
+            // es muss mit simuc --board arduino dist/programm.elf der Simulator 
+            // gestartet werden. Dessen gdb-stub öffnet auf localhost:1234 einen Port
+            "name": "Debug (simuc)",
+            "type": "cppdbg",
+            "request": "launch",
+            "program": "${workspaceFolder}/sim/atmega328p.elf",
+            "cwd": "${workspaceFolder}",
+            "externalConsole": false,
+            "MIMode": "gdb",
+            "miDebuggerPath": "/usr/bin/avr-gdb",
+            "miDebuggerServerAddress": ":1234",
+            "preLaunchTask": "build"
+        }
+    ]
+}
diff --git a/software/nano-1284/bootloader-arduino/.vscode/settings.json b/software/nano-1284/bootloader-arduino/.vscode/settings.json
new file mode 100644 (file)
index 0000000..1d7e197
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "[c]": {
+        "editor.insertSpaces": true,
+        "editor.tabSize": 3,
+        "editor.detectIndentation": false
+    },
+    "[h]": {
+        "editor.insertSpaces": true,
+        "editor.tabSize": 3,
+        "editor.detectIndentation": false
+    },
+    "cSpell.words": [],
+    "cSpell.ignorePaths": [
+        "**/*.json", "**/*.c", "**/*.h", "**/Makefile"
+    ]
+}
diff --git a/software/nano-1284/bootloader-arduino/.vscode/tasks.json b/software/nano-1284/bootloader-arduino/.vscode/tasks.json
new file mode 100644 (file)
index 0000000..74fb1c7
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    // See https://go.microsoft.com/fwlink/?LinkId=733558
+    // for the documentation about the tasks.json format
+    "version": "2.0.0",
+    "tasks": [{
+        "label": "build",
+        "type": "shell",
+        "command": "make",
+        "problemMatcher":[
+            "$gcc"
+        ]
+    },{
+        "label": "clean",
+        "type": "shell",
+        "command": "make",
+        "args": [ "clean" ],
+    },{
+        "label": "flash",
+        "type": "shell",
+        "command": "make",
+        "args": [ "flash" ],
+    }]
+}
\ No newline at end of file
diff --git a/software/nano-1284/bootloader-arduino/Makefile b/software/nano-1284/bootloader-arduino/Makefile
new file mode 100644 (file)
index 0000000..bd4e491
--- /dev/null
@@ -0,0 +1,124 @@
+.PHONY: all info flash picocom clean
+$(shell mkdir -p dist >/dev/null)
+$(shell mkdir -p build >/dev/null)
+$(shell mkdir -p sim >/dev/null)
+$(shell mkdir -p sim/build >/dev/null)
+
+NAME="bootloader-arduino_nano-1284"
+SRC= $(wildcard src/*.c src/*.cpp src/*/*.c src/*/*.cpp) 
+HDR= $(wildcard src/*.h src/*.hpp src/*/*.h src/*/*.hpp) 
+OBJ_CPP = $(SRC:src/%.cpp=build/%.o)
+OBJ = $(OBJ_CPP:src/%.c=build/%.o)
+OBJ_SIM_CPP = $(SRC:src/%.cpp=sim/build/%.o)
+OBJ_SIM = $(OBJ_SIM_CPP:src/%.c=sim/build/%.o)
+
+DEVICE=atmega1284p
+
+CC= avr-g++
+CFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000  -DBAUD_RATE=115200 -DDOUBLE_SPEED -DNUM_LED_FLASHES=4 '-DMAX_TIME_COUNT=F_CPU>>4' -c
+#LFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000 -Wl,-u,vfprintf -lprintf_flt -lm
+LFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000 -Wl,--section-start=.text=0x1e000
+
+CFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g  -DBAUD_RATE=115200 -DDOUBLE_SPEED -DNUM_LED_FLASHES=4 '-DMAX_TIME_COUNT=F_CPU>>4' -c
+#LFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g -Wl,-u,vfprintf -lprintf_flt -lm
+LFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g -Wl,--section-start=.text=0x1e000
+
+
+all: dist/$(NAME).elf dist/$(NAME).s dist/$(NAME).hex sim/$(NAME).elf sim/$(NAME).s info
+
+dbg:
+       @echo --HDR---------------------------------
+       @echo $(HDR)
+       @echo --SRC---------------------------------
+       @echo $(SRC)
+       @echo --OBJ---------------------------------
+       @echo $(OBJ)
+       @echo --OBJ_CPP-----------------------------
+       @echo $(OBJ_CPP)
+       @echo --OBJ---------------------------------
+       @echo $(OBJ)
+       @echo ===================================
+       @echo   
+
+info:
+       @avr-size --mcu=$(DEVICE) --format=avr dist/$(NAME).elf
+
+.depend: $(SRC) $(HDR)
+       $(CC) -mmcu=$(DEVICE) -MM $(SRC) | sed --regexp-extended 's/^(.*\.o)\: src\/(.*)(\.cpp|\.c) (.*)/build\/\2\.o\: src\/\2\3 \4/g' > .depend
+
+-include .depend
+
+# .depend solte auch auf Header Files achten!
+
+dist/$(NAME).elf: .depend $(OBJ)
+       $(CC) $(LFLAGS) -o $@ $(OBJ)
+
+dist/%.s: dist/%.elf
+       avr-objdump -d $< > $@
+
+dist/%.hex: dist/%.elf
+       #avr-objcopy -j .text -j .data -O ihex $< $@
+       avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@
+
+sim/$(NAME).elf: .depend $(OBJ_SIM)
+               $(CC) $(LFLAGS_SIM) -o $@ $(OBJ_SIM)
+
+
+build/%.o: src/%.c
+       @mkdir -p $(dir $@)
+       $(CC) $(CFLAGS) -o $@ $<
+
+build/%.o: src/%.cpp
+       @mkdir -p $(dir $@)
+       $(CC) $(CFLAGS) -o $@ $<
+
+sim/build/%.o: src/%.c
+       @mkdir -p $(dir $@)
+       $(CC) $(CFLAGS_SIM) -o $@ $<
+
+sim/build/%.o: src/%.cpp
+       @mkdir -p $(dir $@)
+       $(CC) $(CFLAGS_SIM) -o $@ $<
+
+sim/%.s: sim/%.elf
+       avr-objdump -d $< > $@
+
+simuc: sim/$(NAME).elf
+       simuc --board arduino $<
+
+gdb: sim/$(NAME).elf
+       avr-gdb $<
+
+isp-1284p:
+       avrdude -c usbasp -p m1284p
+
+isp-flash-1284p: dist/$(NAME).elf all
+       avrdude -c usbasp -p m1284p -e -U flash:w:$<
+
+isp-flash-1284p-latest-release:
+       avrdude -c usbasp -p m1284p -e -U flash:w:release/$(shell ls -A release | tail -n 1)/$(NAME).elf
+
+isp-read-flash-1284p:
+       avrdude -c usbasp -p m1284p -U flash:r:/tmp/flash-nano-1284__$(shell date +"%Y-%m-%d_%H%M%S")
+
+flash-1284p: dist/$(NAME).elf all
+       avrdude -c arduino -p m1284p -P /dev/ttyUSB0 -b 115200 -e -U flash:w:$<
+
+
+picocom:
+       # picocom sends CR for ENTER -> convert cr (\r) to lf (\n)
+       picocom -b 115200 --omap crlf /dev/ttyUSB0
+
+isp-erase-1284p:
+       avrdude -c usbasp -p m1284p -e
+
+isp-fuse-1284p:
+       # LFUSE=0xE7 -> startuptime 16K CLOCKS + 4.1ms -> 5.4ms
+       avrdude -c usbasp -p m1284p -U lfuse:w:0xEF:m -U hfuse:w:0xD8:m -U efuse:w:0xFE:m -U lock:w:0xEF:m
+
+clean:
+       @rm -r dist
+       @rm -r build
+       @rm -r sim
+       @find . -type f -name ".depend" -exec rm {} \;
+       @echo "clean done"
diff --git a/software/nano-1284/bootloader-arduino/README.md b/software/nano-1284/bootloader-arduino/README.md
new file mode 100644 (file)
index 0000000..64a8d3f
--- /dev/null
@@ -0,0 +1,111 @@
+# Arduino-Bootloader (STK500) für Nano-1284
+
+Dieser Bootloader ermöglicht die Programmierung über das "Arduino-System". Als Kommunikationsprotokoll kommt das [STK500 Protokoll]( https://www.microchip.com/content/dam/mchp/documents/OTH/ApplicationNotes/ApplicationNotes/doc2525.pdf) zur Anwendung (Kommunikationsablauf siehe Datei [protocol](protocol)).
+
+Beim Bootloader in [src/main.c](src/main.c) handelt es sich um eine Anpassung von [https://github.com/arduino/ArduinoCore-avr/blob/master/bootloaders/atmega/ATmegaBOOT_168.c](https://github.com/arduino/ArduinoCore-avr/blob/master/bootloaders/atmega/ATmegaBOOT_168.c) an die Hardware des Nano-1284 Boards.
+
+Diese Anpassung der Quelltext-Datei umfasst:
+* Microcontroller ATmega1284P (mit 128KiB Flash, davon die hinteren 8KiB für den Bootloader)
+* Frequenz 12MHz
+* 3 LEDs (rot, gelb, grün)
+* Assembler-Anweisungen durch Macros aus `avr/boot.h` ersetzt
+* Quelltextkorrekturen, damit der Bootloader auch bei einer Page-Size von 256 Byte funktioniert
+
+Der Bootloader kann entweder selbst aus der Quelltextdatei erzeugt werden (siehe [Übersetzung](#%C3%BCbersetzung)), oder es wird eine der bereits fertigen Dateien im Ordner [release](release) verwendet:
+* [release/2024-09-05_120945/bootloader-arduino_nano-1284.elf](release/2024-09-05_120945/bootloader-arduino_nano-1284.elf)
+* [release/2024-09-05_120945/bootloader-arduino_nano-1284.hex](release/2024-09-05_120945/bootloader-arduino_nano-1284.hex)
+
+## Übersetzung
+
+Folgende Tools sind erforderlich:
+* avr-gcc
+* avrdude
+
+Auf einem Linux-Debian System müssen daher folgende Pakete installiert sein:
+```sh
+sudo apt update
+sudo apt install gcc-avr avr-libc binutils-avr avrdude
+```
+
+Die Übersetzung erfolgt dann mit dem Kommando `make`.
+
+## Download auf den µC
+
+Die korrekte Programmierung der Fuses sowie der Download des Bootloaders in den Bootloader-Bereich des µC-Flash kann mit Hilfe eines [USBasp-Programmiergeräts](https://www.fischl.de/usbasp/) mit folgenden Kommandos erfolgen:
+
+... oder die aktuellste Version im UNterordner [release](release) ...
+
+```sh
+make isp-fuse-1284p
+make isp-flash-1284p-latest-release:
+```
+
+Nach der Programmierung sollten die drei LEDs den Start des Bootloader anzeigen (rot -> rot+orange -> grün -> grün blinken).
+
+
+## Download von Programmen mit Hilfe des Bootloaders
+
+Sobald sich am µC ein Bootloader befindet ist kein Programmiergerät mehr erforderlich. Das Programm wird über die serielle UART-Schnittstelle (via USB-Schnittstelle) in den Flash gespeichert.
+
+UART-Schnittstelle (Option `-P`) und Name der ELF-Programmdatei (nach `flash:w:`) sind anzupassen...
+
+```sh
+avrdude -c arduino -p m1284p -P /dev/ttyUSB0 -b 115200 -e -U flash:w:programm.elf
+```
+
+## Einbindung in die Arduino IDE
+
+Zunächst den Ordner mit der Arduino Installation finden. Unter Linux ist das der Pfad:
+```
+/usr/share/arduino/hardware/arduino/avr
+```
+
+Dort im Unterordner `bootloaders` einen Ordner `atmeg1284` anlegen und darin die Intel-Hex Datei des Bootloaders ablegen.
+
+```sh
+make
+sudo mkdir /usr/share/arduino/hardware/arduino/avr/bootloaders/atmega1284
+cp dist/bootloader-arduino_nano-1284.hex /usr/share/arduino/hardware/arduino/avr/bootloaders/atmega1284/
+```
+
+Danach in der Datei `/usr/share/arduino/hardware/arduino/avr/boards.txt` folgende Einträge ergänzen:
+```
+#########################################################
+
+nano1284.name=Nano-1284
+
+nano1284.vid.0=0x1a86
+nano1284.pid.0=0x7522
+nano1284.upload_port.0.vid=0x1a86
+nano1284.upload_port.0.pid=0x7522
+
+nano1284.upload.tool=avrdude
+nano1284.upload.tool.default=avrdude
+nano1284.upload.tool.network=arduino_ota
+nano1284.upload.protocol=arduino
+nano1284.upload.maximum_size=122880
+nano1284.upload.maximum_data_size=16384
+nano1284.upload.speed=115200
+
+nano1284.bootloader.tool=avrdude
+nano1284.bootloader.tool.default=avrdude
+nano1284.bootloader.low_fuses=0xEF
+nano1284.bootloader.high_fuses=0xD8
+nano1284.bootloader.extended_fuses=0xFE
+nano1284.bootloader.unlock_bits=0xFE
+nano1284.bootloader.lock_bits=0xEF
+nano1284.bootloader.file=atmega1284/bootloader-arduino_nano-1284.hex
+
+nano1284.build.mcu=atmega1284p
+nano1284.build.f_cpu=12000000L
+nano1284.build.board=AVR_NANO1284
+nano1284.build.core=arduino
+nano1284.build.variant=standard
+
+##############################################################
+```
+
+Nach dem Start der Arduino-IDE kann:
+* über das Menü *Werkzeuge->Board* das ***Nano-1284*** gewählt werden
+* über das Menü *Werkzeuge->Programmer* der ***ArduinoISP*** gewählt werden
+
diff --git a/software/nano-1284/bootloader-arduino/protocol b/software/nano-1284/bootloader-arduino/protocol
new file mode 100644 (file)
index 0000000..8c0ea61
--- /dev/null
@@ -0,0 +1,323 @@
+  0.552750 -->   2: 3020
+  0.555474 <--   2: 1410
+  0.803623 -->   2: 3020
+  0.806825 <--   2: 1410
+  1.054395 -->   2: 3020
+  1.057282 <--   2: 1410
+
+  1.057514 -->   3: 4181 20
+  1.060837 <--   3: 1401 10
+  1.061061 -->   3: 4182 20
+  1.063819 <--   3: 1410 10
+  1.064049 -->  22: 4282 0000 0101 0101 03ff ffff ff01 0008  0000 0100 0020
+  1.068274 <--   2: 1410
+  1.068436 -->   7: 4505 08d7 a000 20
+  1.071346 <--   2: 1410
+  1.071432 -->   2: 5020
+  1.074021 <--   2: 1410
+  1.084349 -->   2: 7520
+  1.087176 <--   5: 141e 960a 10
+  1.087341 -->   6: 5650 0000 0020
+  1.090435 <--   3: 1400 10
+  1.090608 -->   6: 5650 0000 0020
+  1.093517 <--   3: 1400 10
+  1.093662 -->   6: 5650 0000 0020
+  1.096678 <--   3: 1400 10
+  1.096838 -->   6: 5658 0800 0020
+  1.099974 <--   3: 1400 10
+  1.100216 -->   6: 5658 0800 0020
+  1.103433 <--   3: 1400 10
+  1.103621 -->   6: 5658 0800 0020
+  1.106596 <--   3: 1400 10
+  1.106798 -->   6: 5650 0800 0020
+  1.109878 <--   3: 1400 10
+  1.110108 -->   6: 5650 0800 0020
+  1.113015 <--   3: 1400 10
+  1.113141 -->   6: 5650 0800 0020
+  1.116120 <--   3: 1400 10
+  1.116256 -->   6: 56ac 8000 0020
+  1.119179 <--   3: 1400 10
+  1.174951 -->   3: 4181 20
+  1.177570 <--   3: 1401 10
+  1.177770 -->   3: 4182 20
+  1.180450 <--   3: 1410 10
+  1.180666 -->  22: 4282 0000 0101 0101 03ff ffff ff01 0008  0000 0100 0020
+  1.184868 <--   2: 1410
+  1.185056 -->   7: 4505 08d7 a000 20
+  1.187956 <--   2: 1410
+  1.188059 -->   2: 5020
+  1.190517 <--   2: 1410
+  
+  1.191326 -->   4: 5500 0020
+  1.193964 <--   2: 1410
+  
+  1.194133 -->  32: 6401 0046 0c94 3e00 0c94 5b00 0c94 5b00  0c94 5b00 0c94 5b00 0c94 5b00 0c94 5b00
+  1.194154 -->  32: 0c94 5b00 0c94 5b00 0c94 5b00 0c94 5b00  0c94 5b00 0c94 5b00 0c94 ad00 0c94 5b00
+  1.194285 -->  32: 0c94 5b00 0c94 5b00 0c94 5b00 0c94 5b00  0c94 5b00 0c94 7d00 0c94 5b00 0c94 5b00
+  1.194310 -->  32: 0c94 5b00 0c94 5b00 0c94 5b00 0c94 5b00  0c94 5b00 0c94 9c00 0c94 5b00 0c94 5b00
+  1.197469 -->  32: 1124 1fbe cfef d0e1 debf cdbf 11e0 a0e0  b1e0 e8e2 f8e0 02c0 0590 0d92 aa34 b107
+  1.199991 -->  32: d9f7 21e0 aae4 b1e0 01c0 1d92 a235 b207  e1f7 0e94 d100 0c94 1204 0c94 0000 0f93
+  1.202760 -->  32: 1f93 cf93 c82f 8b01 8a30 19f4 8de0 0e94  5d00 8091 c000 85ff fccf 8091 4e01 9091
+  1.205599 -->  32: 4f01 0817 1907 19f4 c093 c600 02c0 c093  ce00 80e0 90e0 cf91 1f91 0f91 0895 1f92
+  1.208326 -->   5: 0f92 0fb6 20
+  1.255493 <--   2: 1410
+  
+  1.255743 -->   4: 5580 0020
+  1.258608 <--   2: 1410
+  
+  1.258821 -->  32: 6401 0046 0f92 1124 8f93 9f93 ef93 ff93  98b1 88e0 8927 88b9 8091 c600 8093 ce00
+  1.258842 -->  32: e0e0 f1e0 90e2 9083 8483 ff91 ef91 9f91  8f91 0f90 0fbe 0f90 1f90 1895 1f92 0f92
+  1.258964 -->  32: 0fb6 0f92 1124 8f93 8091 ce00 8032 09f4  429a 8f91 0f90 0fbe 0f90 1f90 1895 1f92
+  1.258995 -->  32: 0f92 0fb6 0f92 1124 2f93 8f93 9f93 8091  4a01 9091 4b01 0196 9093 4b01 8093 4a01
+  1.262021 -->  32: 883e 9340 40f0 98b1 80e1 8927 88b9 1092  4b01 1092 4a01 9f91 8f91 2f91 0f90 0fbe
+  1.264633 -->  32: 0f90 1f90 1895 8ce1 87b9 8ce3 88b9 8ae0  8093 8100 8ced 95e0 9093 8900 8093 8800
+  1.267379 -->  32: 82e0 8093 6f00 8093 c000 38e9 3093 c100  26e0 2093 c200 1092 c500 9ce0 9093 c400
+  1.270166 -->  32: 8093 c800 3093 c900 2093 ca00 1092 cd00  9093 cc00 84e1 91e0 9093 4f01 8093 4e01
+  1.272904 -->   5: 86e0 91e0 20
+  1.320139 <--   2: 1410
+  
+  1.320378 -->   4: 5500 0120
+  1.323002 <--   2: 1410
+  
+  1.323205 -->  32: 6401 0046 9093 5101 8093 5001 1092 0001  7894 80e0 90e0 c0e0 d1e0 0ee2 11e0 359b
+  1.323226 -->  32: 03c0 28e4 31e0 02c0 22e2 31e0 7c01 4fef  e41a f40a 3f93 2f93 df93 cf93 9f93 8f93
+  1.323364 -->  32: 1f93 0f93 0e94 3401 8db7 9eb7 0896 0fb6  f894 9ebf 0fbe 8dbf 359b 4298 8fe2 95e7
+  1.323390 -->  32: 0197 f1f7 00c0 0000 c701 d9cf a0e0 b0e0  eae3 f1e0 0c94 eb03 ae01 4b5f 5f4f fa01
+  1.326221 -->  32: 6191 7191 af01 8091 4e01 9091 4f01 0e94  4a01 e2e0 0c94 0704 abe0 b0e0 e0e5 f1e0
+  1.329091 -->  32: 0c94 db03 6c01 7b01 8a01 fc01 1782 1682  8381 81ff ccc1 ce01 0196 3c01 f601 9381
+  1.331759 -->  32: f701 93fd 8591 93ff 8191 7f01 8823 09f4  bac1 8532 39f4 93fd 8591 93ff 8191 7f01
+  1.334544 -->  32: 8532 29f4 b601 90e0 0e94 4103 e7cf 912c  212c 312c ffe1 f315 d8f0 8b32 79f0 38f4
+  1.337305 -->   5: 8032 79f0 20
+  1.384623 <--   2: 1410
+  
+  1.384878 -->   4: 5580 0120
+  1.387608 <--   2: 1410
+  
+  1.387773 -->  32: 6401 0046 8332 a1f4 232d 2061 1dc0 8d32  61f0 8033 69f4 232d 2160 16c0 832d 8260
+  1.387789 -->  32: 382e e32d e460 3e2e 2ac0 f32d f860 1dc0  37fc 2dc0 20ed 280f 2a30 40f0 8e32 b9f4
+  1.387862 -->  32: 36fc 81c1 232d 2064 322e 19c0 36fe 06c0  8ae0 989e 200d 1124 922e 11c0 eae0 2e9e
+  1.387921 -->  32: 200d 1124 222e f32d f062 3f2e 08c0 8c36  21f4 832d 8068 382e 02c0 8836 41f4 f701
+  1.390834 -->  32: 93fd 8591 93ff 8191 7f01 8111 b3cf 982f  9f7d 9554 9330 28f4 0c5f 1f4f 9fe3 9983
+  1.393604 -->  32: 0dc0 8336 31f0 8337 71f0 8335 09f0 59c0  21c0 f801 8081 8983 0e5f 1f4f 8824 8394
+  1.396338 -->  32: 912c 5301 13c0 2801 f2e0 4f0e 511c f801  a080 b180 36fe 03c0 692d 70e0 02c0 6fef
+  1.399072 -->  32: 7fef c501 0e94 3603 4c01 8201 f32d ff77  3f2e 16c0 2801 22e0 420e 511c f801 a080
+  1.401922 -->   5: b180 36fe 20
+  1.448945 <--   2: 1410
+  
+  1.449212 -->   4: 5500 0220
+  1.451904 <--   2: 1410
+  
+  1.452121 -->  32: 6401 0046 03c0 692d 70e0 02c0 6fef 7fef  c501 0e94 2b03 4c01 f32d f068 3f2e 8201
+  1.452143 -->  32: 33fc 1bc0 822d 90e0 8816 9906 b0f4 b601  80e2 90e0 0e94 4103 2a94 f4cf f501 37fc
+  1.452282 -->  32: 8591 37fe 8191 5f01 b601 90e0 0e94 4103  2110 2a94 21e0 821a 9108 8114 9104 71f7
+  1.452308 -->  32: e8c0 8436 11f0 8936 41f5 f801 37fe 07c0  6081 7181 8281 9381 0c5f 1f4f 08c0 6081
+  1.455454 -->  32: 7181 072e 000c 880b 990b 0e5f 1f4f f32d  ff76 3f2e 97ff 09c0 9095 8095 7095 6195
+  1.457980 -->  32: 7f4f 8f4f 9f4f f068 3f2e 2ae0 30e0 a301  0e94 7d03 882e 8618 45c0 8537 31f4 232d
+  1.460725 -->  32: 2f7e b22e 2ae0 30e0 25c0 932d 997f b92e  8f36 c1f0 18f4 8835 79f0 b5c0 8037 19f0
+  1.463464 -->  32: 8837 21f0 b0c0 e92f e061 be2e b4fe 0dc0  fb2d f460 bf2e 09c0 34fe 0ac0 292f 2660
+  1.466235 -->   5: b22e 06c0 20
+  1.513447 <--   2: 1410
+  
+  1.513715 -->   4: 5580 0220
+  1.516432 <--   2: 1410
+  
+  1.516636 -->  32: 6401 0046 28e0 30e0 05c0 20e1 30e0 02c0  20e1 32e0 f801 b7fe 07c0 6081 7181 8281
+  1.516663 -->  32: 9381 0c5f 1f4f 06c0 6081 7181 80e0 90e0  0e5f 1f4f a301 0e94 7d03 882e 8618 fb2d
+  1.516831 -->  32: ff77 3f2e 36fe 0dc0 232d 2e7f a22e 8914  58f4 34fe 0bc0 32fc 09c0 832d 8e7e a82e
+  1.516877 -->  32: 05c0 b82c a32c 03c0 b82c 01c0 b92c a4fe  0fc0 fe01 e80d f11d 8081 8033 21f4 9a2d
+  1.519644 -->  32: 997e a92e 09c0 a2fe 06c0 b394 b394 04c0  8a2d 8678 09f0 b394 a3fc 11c0 a0fe 06c0
+  1.522490 -->  32: b214 88f4 280c 922c 9b18 0ec0 b214 60f4  b601 80e2 90e0 0e94 4103 b394 f7cf b214
+  1.525257 -->  32: 18f4 2b18 02c0 982c 212c a4fe 10c0 b601  80e3 90e0 0e94 4103 a2fe 17c0 a1fc 03c0
+  1.527986 -->  32: 88e7 90e0 02c0 88e5 90e0 b601 0cc0 8a2d  8678 59f0 a1fe 02c0 8be2 01c0 80e2 a7fc
+  1.530784 -->   5: 8de2 b601 20
+  1.577915 <--   2: 1410
+  
+  1.578186 -->   4: 5500 0320
+  1.580952 <--   2: 1410
+  
+  1.581190 -->  32: 6401 0046 90e0 0e94 4103 8914 38f4 b601  80e3 90e0 0e94 4103 9a94 f7cf 8a94 f301
+  1.581212 -->  32: e80d f11d 8081 b601 90e0 0e94 4103 8110  f5cf 2220 09f4 42ce b601 80e2 90e0 0e94
+  1.581358 -->  32: 4103 2a94 f6cf f601 8681 9781 02c0 8fef  9fef 2b96 e2e1 0c94 f703 fc01 0590 6150
+  1.581385 -->  32: 7040 0110 d8f7 8095 9095 8e0f 9f1f 0895  fc01 6150 7040 0190 0110 d8f7 8095 9095
+  1.584265 -->  32: 8e0f 9f1f 0895 0f93 1f93 cf93 df93 fb01  2381 21fd 03c0 8fef 9fef 2cc0 22ff 16c0
+  1.587011 -->  32: 4681 5781 2481 3581 4217 5307 44f4 a081  b181 9d01 2f5f 3f4f 3183 2083 8c93 2681
+  1.589734 -->  32: 3781 2f5f 3f4f 3783 2683 14c0 8b01 ec01  fb01 0084 f185 e02d 0995 892b e1f6 d801
+  1.592493 -->  32: 1696 8d91 9c91 1797 0196 1796 9c93 8e93  1697 ce01 df91 cf91 1f91 0f91 0895 fa01
+  1.595249 -->   5: aa27 2830 20
+  1.642464 <--   2: 1410
+  
+  1.642718 -->   4: 5580 0320
+  1.645473 <--   2: 1410
+  
+  1.645679 -->  32: 6401 0046 51f1 2031 81f1 e894 6f93 6e7f  6e5f 7f4f 8f4f 9f4f af4f b1e0 3ed0 b4e0
+  1.645701 -->  32: 3cd0 670f 781f 891f 9a1f a11d 680f 791f  8a1f 911d a11d 6a0f 711d 811d 911d a11d
+  1.645848 -->  32: 20d0 09f4 6894 3f91 2ae0 269f 1124 3019  305d 3193 def6 cf01 0895 462f 4770 405d
+  1.645887 -->  32: 4193 b3e0 0fd0 c9f7 f6cf 462f 4f70 405d  4a33 18f0 495d 31fd 4052 4193 02d0 a9f7
+  1.648691 -->  32: eacf b4e0 a695 9795 8795 7795 6795 ba95  c9f7 0097 6105 7105 0895 9b01 ac01 0a2e
+  1.651486 -->  32: 0694 5795 4795 3795 2795 ba95 c9f7 620f  731f 841f 951f a01d 0895 2f92 3f92 4f92
+  1.654229 -->  32: 5f92 6f92 7f92 8f92 9f92 af92 bf92 cf92  df92 ef92 ff92 0f93 1f93 cf93 df93 cdb7
+  1.657068 -->  32: deb7 ca1b db0b 0fb6 f894 debf 0fbe cdbf  0994 2a88 3988 4888 5f84 6e84 7d84 8c84
+  1.659779 -->   5: 9b84 aa84 20
+  1.706941 <--   2: 1410
+  
+  1.707172 -->   4: 5500 0420
+  1.709845 <--   2: 1410
+  
+  1.710064 -->  32: 6401 0046 b984 c884 df80 ee80 fd80 0c81  1b81 aa81 b981 ce0f d11d 0fb6 f894 debf
+  1.710085 -->  32: 0fbe cdbf ed01 0895 f894 ffcf 202d 3e20  5800 0000 0002 0000 0000 5d00 0000 0000
+  1.710260 -->  32: 0000 0002 0000 0000 5d00 0000 0000 5357  3220 7072 6573 7365 6400 2530 3478 3a20
+  1.710304 -->  32: 4865 6c6c 6f20 776f 726c 6425 7320 2025  3132 730d 0000 ffff ffff ffff ffff ffff
+  1.713085 -->  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
+  1.715997 -->  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
+  1.718639 -->  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
+  1.721439 -->  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
+  1.724135 -->   5: ffff ffff 20
+  1.771467 <--   2: 1410
+  
+  1.772647 -->   4: 5500 0020
+  1.775440 <--   2: 1410
+  
+  1.775659 -->   5: 7401 0046 20
+  1.779386 <--  32: 140c 943e 000c 945b 000c 945b 000c 945b  000c 945b 000c 945b 000c 945b 000c 945b
+  1.781924 <--  32: 000c 945b 000c 945b 000c 945b 000c 945b  000c 945b 000c 94ad 000c 945b 000c 945b
+  1.784614 <--  32: 000c 945b 000c 945b 000c 945b 000c 945b  000c 947d 000c 945b 000c 945b 000c 945b
+  1.787364 <--  32: 000c 945b 000c 945b 000c 945b 000c 945b  000c 949c 000c 945b 000c 945b 0011 241f
+  1.790456 <--  32: becf efd0 e1de bfcd bf11 e0a0 e0b1 e0e8  e2f8 e002 c005 900d 92aa 34b1 07d9 f721
+  1.792965 <--  32: e0aa e4b1 e001 c01d 92a2 35b2 07e1 f70e  94d1 000c 9412 040c 9400 000f 931f 93cf
+  1.795688 <--  32: 93c8 2f8b 018a 3019 f48d e00e 945d 0080  91c0 0085 fffc cf80 914e 0190 914f 0108
+  1.798432 <--  32: 1719 0719 f4c0 93c6 0002 c0c0 93ce 0080  e090 e0cf 911f 910f 9108 951f 920f 920f
+  1.800632 <--   2: b610
+  
+  1.800878 -->   4: 5580 0020
+  1.803619 <--   2: 1410
+  
+  1.803814 -->   5: 7401 0046 20
+  1.807479 <--  32: 140f 9211 248f 939f 93ef 93ff 9398 b188  e089 2788 b980 91c6 0080 93ce 00e0 e0f1
+  1.809984 <--  32: e090 e290 8384 83ff 91ef 919f 918f 910f  900f be0f 901f 9018 951f 920f 920f b60f
+  1.812844 <--  32: 9211 248f 9380 91ce 0080 3209 f442 9a8f  910f 900f be0f 901f 9018 951f 920f 920f
+  1.815639 <--  32: b60f 9211 242f 938f 939f 9380 914a 0190  914b 0101 9690 934b 0180 934a 0188 3e93
+  1.818304 <--  32: 4040 f098 b180 e189 2788 b910 924b 0110  924a 019f 918f 912f 910f 900f be0f 901f
+  1.821082 <--  32: 9018 958c e187 b98c e388 b98a e080 9381  008c ed95 e090 9389 0080 9388 0082 e080
+  1.823911 <--  32: 936f 0080 93c0 0038 e930 93c1 0026 e020  93c2 0010 92c5 009c e090 93c4 0080 93c8
+  1.826612 <--  32: 0030 93c9 0020 93ca 0010 92cd 0090 93cc  0084 e191 e090 934f 0180 934e 0186 e091
+  1.828744 <--   2: e010
+  
+  1.828876 -->   4: 5500 0120
+  1.831444 <--   2: 1410
+  
+  1.831620 -->   5: 7401 0046 20
+  1.835129 <--  32: 1490 9351 0180 9350 0110 9200 0178 9480  e090 e0c0 e0d1 e00e e211 e035 9b03 c028
+  1.837845 <--  32: e431 e002 c022 e231 e07c 014f efe4 1af4  0a3f 932f 93df 93cf 939f 938f 931f 930f
+  1.840579 <--  32: 930e 9434 018d b79e b708 960f b6f8 949e  bf0f be8d bf35 9b42 988f e295 e701 97f1
+  1.843432 <--  32: f700 c000 00c7 01d9 cfa0 e0b0 e0ea e3f1  e00c 94eb 03ae 014b 5f5f 4ffa 0161 9171
+  1.846426 <--  32: 91af 0180 914e 0190 914f 010e 944a 01e2  e00c 9407 04ab e0b0 e0e0 e5f1 e00c 94db
+  1.848837 <--  32: 036c 017b 018a 01fc 0117 8216 8283 8181  ffcc c1ce 0101 963c 01f6 0193 81f7 0193
+  1.851649 <--  32: fd85 9193 ff81 917f 0188 2309 f4ba c185  3239 f493 fd85 9193 ff81 917f 0185 3229
+  1.854442 <--  32: f4b6 0190 e00e 9441 03e7 cf91 2c21 2c31  2cff e1f3 15d8 f08b 3279 f038 f480 3279
+  1.856623 <--   2: f010
+  
+  1.856748 -->   4: 5580 0120
+  1.859363 <--   2: 1410
+  
+  1.859447 -->   5: 7401 0046 20
+  1.862911 <--  32: 1483 32a1 f423 2d20 611d c08d 3261 f080  3369 f423 2d21 6016 c083 2d82 6038 2ee3
+  1.865610 <--  32: 2de4 603e 2e2a c0f3 2df8 601d c037 fc2d  c020 ed28 0f2a 3040 f08e 32b9 f436 fc81
+  1.868409 <--  32: c123 2d20 6432 2e19 c036 fe06 c08a e098  9e20 0d11 2492 2e11 c0ea e02e 9e20 0d11
+  1.871210 <--  32: 2422 2ef3 2df0 623f 2e08 c08c 3621 f483  2d80 6838 2e02 c088 3641 f4f7 0193 fd85
+  1.873963 <--  32: 9193 ff81 917f 0181 11b3 cf98 2f9f 7d95  5493 3028 f40c 5f1f 4f9f e399 830d c083
+  1.876709 <--  32: 3631 f083 3771 f083 3509 f059 c021 c0f8  0180 8189 830e 5f1f 4f88 2483 9491 2c53
+  1.879571 <--  32: 0113 c028 01f2 e04f 0e51 1cf8 01a0 80b1  8036 fe03 c069 2d70 e002 c06f ef7f efc5
+  1.882458 <--  32: 010e 9436 034c 0182 01f3 2dff 773f 2e16  c028 0122 e042 0e51 1cf8 01a0 80b1 8036
+  1.884340 <--   2: fe10
+  
+  1.884567 -->   4: 5500 0220
+  1.887255 <--   2: 1410
+  
+  1.887443 -->   5: 7401 0046 20
+  1.890818 <--  32: 1403 c069 2d70 e002 c06f ef7f efc5 010e  942b 034c 01f3 2df0 683f 2e82 0133 fc1b
+  1.893598 <--  32: c082 2d90 e088 1699 06b0 f4b6 0180 e290  e00e 9441 032a 94f4 cff5 0137 fc85 9137
+  1.896393 <--  32: fe81 915f 01b6 0190 e00e 9441 0321 102a  9421 e082 1a91 0881 1491 0471 f7e8 c084
+  1.899280 <--  32: 3611 f089 3641 f5f8 0137 fe07 c060 8171  8182 8193 810c 5f1f 4f08 c060 8171 8107
+  1.902001 <--  32: 2e00 0c88 0b99 0b0e 5f1f 4ff3 2dff 763f  2e97 ff09 c090 9580 9570 9561 957f 4f8f
+  1.904757 <--  32: 4f9f 4ff0 683f 2e2a e030 e0a3 010e 947d  0388 2e86 1845 c085 3731 f423 2d2f 7eb2
+  1.907577 <--  32: 2e2a e030 e025 c093 2d99 7fb9 2e8f 36c1  f018 f488 3579 f0b5 c080 3719 f088 3721
+  1.910469 <--  32: f0b0 c0e9 2fe0 61be 2eb4 fe0d c0fb 2df4  60bf 2e09 c034 fe0a c029 2f26 60b2 2e06
+  1.912524 <--   2: c010
+  
+  1.912815 -->   4: 5580 0220
+  1.915611 <--   2: 1410
+  
+  1.915811 -->   5: 7401 0046 20
+  1.919244 <--  32: 1428 e030 e005 c020 e130 e002 c020 e132  e0f8 01b7 fe07 c060 8171 8182 8193 810c
+  1.921988 <--  32: 5f1f 4f06 c060 8171 8180 e090 e00e 5f1f  4fa3 010e 947d 0388 2e86 18fb 2dff 773f
+  1.924734 <--  32: 2e36 fe0d c023 2d2e 7fa2 2e89 1458 f434  fe0b c032 fc09 c083 2d8e 7ea8 2e05 c0b8
+  1.927531 <--  32: 2ca3 2c03 c0b8 2c01 c0b9 2ca4 fe0f c0fe  01e8 0df1 1d80 8180 3321 f49a 2d99 7ea9
+  1.930309 <--  32: 2e09 c0a2 fe06 c0b3 94b3 9404 c08a 2d86  7809 f0b3 94a3 fc11 c0a0 fe06 c0b2 1488
+  1.933091 <--  32: f428 0c92 2c9b 180e c0b2 1460 f4b6 0180  e290 e00e 9441 03b3 94f7 cfb2 1418 f42b
+  1.935886 <--  32: 1802 c098 2c21 2ca4 fe10 c0b6 0180 e390  e00e 9441 03a2 fe17 c0a1 fc03 c088 e790
+  1.938647 <--  32: e002 c088 e590 e0b6 010c c08a 2d86 7859  f0a1 fe02 c08b e201 c080 e2a7 fc8d e2b6
+  1.940863 <--   2: 0110
+  
+  1.941071 -->   4: 5500 0320
+  1.943869 <--   2: 1410
+  
+  1.944088 -->   5: 7401 0046 20
+  1.947433 <--  32: 1490 e00e 9441 0389 1438 f4b6 0180 e390  e00e 9441 039a 94f7 cf8a 94f3 01e8 0df1
+  1.950256 <--  32: 1d80 81b6 0190 e00e 9441 0381 10f5 cf22  2009 f442 ceb6 0180 e290 e00e 9441 032a
+  1.953054 <--  32: 94f6 cff6 0186 8197 8102 c08f ef9f ef2b  96e2 e10c 94f7 03fc 0105 9061 5070 4001
+  1.955732 <--  32: 10d8 f780 9590 958e 0f9f 1f08 95fc 0161  5070 4001 9001 10d8 f780 9590 958e 0f9f
+  1.958565 <--  32: 1f08 950f 931f 93cf 93df 93fb 0123 8121  fd03 c08f ef9f ef2c c022 ff16 c046 8157
+  1.961369 <--  32: 8124 8135 8142 1753 0744 f4a0 81b1 819d  012f 5f3f 4f31 8320 838c 9326 8137 812f
+  1.964157 <--  32: 5f3f 4f37 8326 8314 c08b 01ec 01fb 0100  84f1 85e0 2d09 9589 2be1 f6d8 0116 968d
+  1.966902 <--  32: 919c 9117 9701 9617 969c 938e 9316 97ce  01df 91cf 911f 910f 9108 95fa 01aa 2728
+  1.969047 <--   2: 3010
+  
+  1.969248 -->   4: 5580 0320
+  1.972047 <--   2: 1410
+  
+  1.972246 -->   5: 7401 0046 20
+  1.975748 <--  32: 1451 f120 3181 f1e8 946f 936e 7f6e 5f7f  4f8f 4f9f 4faf 4fb1 e03e d0b4 e03c d067
+  1.978498 <--  32: 0f78 1f89 1f9a 1fa1 1d68 0f79 1f8a 1f91  1da1 1d6a 0f71 1d81 1d91 1da1 1d20 d009
+  1.981514 <--  32: f468 943f 912a e026 9f11 2430 1930 5d31  93de f6cf 0108 9546 2f47 7040 5d41 93b3
+  1.983891 <--  32: e00f d0c9 f7f6 cf46 2f4f 7040 5d4a 3318  f049 5d31 fd40 5241 9302 d0a9 f7ea cfb4
+  1.986799 <--  32: e0a6 9597 9587 9577 9567 95ba 95c9 f700  9761 0571 0508 959b 01ac 010a 2e06 9457
+  1.989512 <--  32: 9547 9537 9527 95ba 95c9 f762 0f73 1f84  1f95 1fa0 1d08 952f 923f 924f 925f 926f
+  1.992260 <--  32: 927f 928f 929f 92af 92bf 92cf 92df 92ef  92ff 920f 931f 93cf 93df 93cd b7de b7ca
+  1.995029 <--  32: 1bdb 0b0f b6f8 94de bf0f becd bf09 942a  8839 8848 885f 846e 847d 848c 849b 84aa
+  1.997163 <--   2: 8410
+  
+  1.997338 -->   4: 5500 0420
+  2.000161 <--   2: 1410
+  
+  2.000367 -->   5: 7401 0046 20
+  2.003803 <--  32: 14b9 84c8 84df 80ee 80fd 800c 811b 81aa  81b9 81ce 0fd1 1d0f b6f8 94de bf0f becd
+  2.006477 <--  32: bfed 0108 95f8 94ff cf20 2d3e 2058 0000  0000 0200 0000 005d 0000 0000 0000 0000
+  2.009429 <--  32: 0200 0000 005d 0000 0000 0053 5732 2070  7265 7373 6564 0025 3034 783a 2048 656c
+  2.012149 <--  32: 6c6f 2077 6f72 6c64 2573 2020 2531 3273  0d00 00ff ffff ffff ffff ffff ffff ffff
+  2.014971 <--  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
+  2.017659 <--  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
+  2.020387 <--  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
+  2.023167 <--  32: ffff ffff ffff ffff ffff ffff ffff ffff  ffff ffff ffff ffff ffff ffff ffff ffff
+  2.025368 <--   2: ff10
+  
+  2.025949 -->   6: 5650 0000 0020
+  2.028775 <--   3: 1400 10
+  2.028918 -->   6: 5650 0000 0020
+  2.031848 <--   3: 1400 10
+  2.031977 -->   6: 5650 0000 0020
+  2.034973 <--   3: 1400 10
+  2.035141 -->   6: 5658 0800 0020
+  2.038215 <--   3: 1400 10
+  2.038413 -->   6: 5658 0800 0020
+  2.041454 <--   3: 1400 10
+  2.041646 -->   6: 5658 0800 0020
+  2.044533 <--   3: 1400 10
+  2.044682 -->   6: 5650 0800 0020
+  2.047749 <--   3: 1400 10
+  2.047987 -->   6: 5650 0800 0020
+  2.050921 <--   3: 1400 10
+  2.051154 -->   6: 5650 0800 0020
+  2.054178 <--   3: 1400 10
+
+  2.054415 -->   2: 5120
+  2.056864 <--   2: 1410
diff --git a/software/nano-1284/bootloader-arduino/release/2024-09-05_120945/bootloader-arduino_nano-1284.elf b/software/nano-1284/bootloader-arduino/release/2024-09-05_120945/bootloader-arduino_nano-1284.elf
new file mode 100755 (executable)
index 0000000..955f52f
Binary files /dev/null and b/software/nano-1284/bootloader-arduino/release/2024-09-05_120945/bootloader-arduino_nano-1284.elf differ
diff --git a/software/nano-1284/bootloader-arduino/release/2024-09-05_120945/bootloader-arduino_nano-1284.hex b/software/nano-1284/bootloader-arduino/release/2024-09-05_120945/bootloader-arduino_nano-1284.hex
new file mode 100644 (file)
index 0000000..4db935b
--- /dev/null
@@ -0,0 +1,106 @@
+:020000021000EC\r
+:10E000000C9451F00C9463F00C9463F00C9463F056\r
+:10E010000C9463F00C9463F00C9463F00C9463F034\r
+:10E020000C9463F00C9463F00C9463F00C9463F024\r
+:10E030000C9463F00C9463F00C9463F00C9463F014\r
+:10E040000C9463F00C9463F00C9463F00C9463F004\r
+:10E050000C9463F00C9463F00C9463F00C9463F0F4\r
+:10E060000C9463F00C9463F00C9463F00C9463F0E4\r
+:10E070000C9463F00C9463F00C9463F00C9463F0D4\r
+:10E080000C9463F00C9463F00C9463F031323A30EA\r
+:10E09000393A34350053657020203520323032341F\r
+:10E0A000000011241FBECFEFD0E4DEBFCDBF22E0C1\r
+:10E0B000A0E0B1E001C01D92AC30B207E1F70E94D0\r
+:10E0C00048F10C9436F30C9400F09091C00095FF49\r
+:10E0D000FCCF8093C6000895CF93982F85958595A2\r
+:10E0E00085958595805D9F709A3014F0C7E501C0D5\r
+:10E0F000C0E3C90F0E9465F08C2FCF910C9465F09E\r
+:10E10000CF92DF92EF92FF92C12CD12C76018091B9\r
+:10E11000C00087FD15C08FEFC81AD80AE80AF80AB0\r
+:10E1200081EBC81681E7D8068BE0E806F10478F3A6\r
+:10E1300017B818B8E0910001F09101010995E7CFF7\r
+:10E140008091C600FF90EF90DF90CF900895CF931D\r
+:10E150000E9480F0C82F0E9465F0C13614F089EA51\r
+:10E1600003C0C0331CF080ED8C0F01C08C2FCF9109\r
+:10E170000895CF930E94A7F0C82F0E94A7F090E1C6\r
+:10E18000C99F800D1124CF910895CF93C82FCC2320\r
+:10E1900021F00E9480F0C150FACFCF910895CF9323\r
+:10E1A000C82F0E9480F0803251F484E10E9465F013\r
+:10E1B0008C2F0E9465F080E1CF910C9465F08091E6\r
+:10E1C00002018F5F80930201853041F417B818B8BF\r
+:10E1D000E0910001F0910101CF910994CF91089550\r
+:10E1E0000E9480F0803231F484E10E9465F080E189\r
+:10E1F0000C9465F0809102018F5F8093020185305D\r
+:10E2000039F417B818B8E0910001F09101010994B0\r
+:10E210000895CF93DF9300D000D0CDB7DEB7198239\r
+:10E220001A821B821C8289819A81AB81BC818115F3\r
+:10E230009042A140B10580F48091C00087FD0CC0E0\r
+:10E2400089819A81AB81BC810196A11DB11D898311\r
+:10E250009A83AB83BC83E7CF0F900F900F900F9002\r
+:10E26000DF91CF910895CF93C82F429A0E9409F170\r
+:10E27000439A0E9409F118B8CC2341F0449A0E94B5\r
+:10E2800009F144980E9409F1C150F6CFCF91089549\r
+:10E29000000018B88CE987B982E08093C0008CE058\r
+:10E2A0008093C4001092C50088E18093C10086E08D\r
+:10E2B0008093C20098E09093C9008093CA0084E0E4\r
+:10E2C0000E9433F103E011E0B1E1FB2E0E9480F0E7\r
+:10E2D000803309F447C0813319F50E9480F0803201\r
+:10E2E000B9F484E10E9465F081E40E9465F086E55E\r
+:10E2F0000E9465F082E50E9465F080E20E9465F070\r
+:10E3000089E40E9465F083E50E9465F080E595C18F\r
+:10E31000809102018F5F809302018530B9F69AC126\r
+:10E32000803439F40E9480F08638E0F00E9480F05A\r
+:10E3300019C0813491F40E9480F0803811F481EF8B\r
+:10E3400044C0813811F481E040C0823811F480E18A\r
+:10E350003CC08839C9F583E038C0823431F484E1A7\r
+:10E360000E94C5F00E94F0F0B1CF853411F485E031\r
+:10E37000F7CF982F9D7F9035A9F3813599F3853597\r
+:10E3800049F40E9480F080930A020E9480F08093FA\r
+:10E390000B02E8CF8635E1F40E9480F0803389F4E7\r
+:10E3A0000E9480F00E9480F0C82F0E9480F0C1116E\r
+:10E3B00002C08EE10AC0C13011F487E906C085E0D1\r
+:10E3C00004C083E00E94C5F080E00E94CFF07ECFC1\r
+:10E3D000843609F0C5C00E9480F0809309020E9433\r
+:10E3E00080F080930802809107028E7F809307025D\r
+:10E3F0000E9480F0853429F4809107028160809327\r
+:10E400000702C6E0D1E06E012091080230910902B6\r
+:10E41000C601865091408217930730F40E9480F025\r
+:10E42000F60181936F01F0CF0E9480F0803209F0F5\r
+:10E430000AC18091070280FF2DC080910A0290914D\r
+:10E440000B02880F991F90930B0280930A02E6E05B\r
+:10E45000F1E02091080230910902CF0186509140ED\r
+:10E460008217930708F07AC0F999FECF80910A02CB\r
+:10E4700090910B0292BD81BD819180BDFA9AF99A6B\r
+:10E4800080910A0290910B02019690930B02809367\r
+:10E490000A02DFCF80910B0287FF02C01BBF01C0C1\r
+:10E4A0001BBE80910A0290910B02880F991F9093D6\r
+:10E4B0000B0280930A028091080280FF09C08091BC\r
+:10E4C0000802909109020196909309028093080234\r
+:10E4D000F894A0910A02B0910B02F999FECF07B609\r
+:10E4E00000FCFDCF429A4D01A12CB12CF401A09269\r
+:10E4F0005B0000935700E89507B600FCFDCF4298FB\r
+:10E5000020E030E0AD01420F531F60E070E08981F0\r
+:10E5100090E0982F8827E8818E0F911D0C01FA0159\r
+:10E5200060935B0010935700E89511242E5F3F4FD6\r
+:10E5300022962115F1E03F0729F73093050120933A\r
+:10E54000040185E0F401A0925B0080935700E895F8\r
+:10E5500007B600FCFDCFF0925700E89584E16DC04E\r
+:10E56000843709F05AC00E9480F0809309020E940B\r
+:10E5700080F08093080280910A0290910B02880F2C\r
+:10E58000991F90930B0280930A020E9480F0909151\r
+:10E590000702853411F4916001C09E7F90930702B9\r
+:10E5A0000E9480F0803209F04AC084E10E9465F048\r
+:10E5B000C0E0D0E08091080290910902C817D90705\r
+:10E5C00008F03DC08091070280FF0BC0F999FECF93\r
+:10E5D00080910A0290910B0292BD81BDF89A80B59C\r
+:10E5E0000FC0E0910A02F0910B0281FD02C08491FC\r
+:10E5F00007C0CF01A0E0B0E01196ABBFFC0187914E\r
+:10E600000E9465F080910A0290910B02019690930E\r
+:10E610000B0280930A022196CDCF853719F50E940F\r
+:10E6200080F0803281F484E10E9465F08EE10E94E6\r
+:10E6300065F087E90E9465F085E00E9465F080E161\r
+:10E640000E9465F043CE809102018F5F80930201AA\r
+:10E65000853009F417B818B8E0910001F091010174\r
+:10E66000099534CE863709F031CEAECEF894FFCF7F\r
+:040000031000E00009\r
+:00000001FF\r
diff --git a/software/nano-1284/bootloader-arduino/src/main.c b/software/nano-1284/bootloader-arduino/src/main.c
new file mode 100644 (file)
index 0000000..3162adc
--- /dev/null
@@ -0,0 +1,520 @@
+/*************************************************************************************************/
+/* Serial Bootloader for Atmel megaAVR Controllers                                               */
+/*                                                                                               */
+/* Source-code taken from:                                                                       */
+/*    https://github.com/arduino/ArduinoCore-avr/blob/master/bootloaders/atmega/ATmegaBOOT_168.c */
+/*    Branch@hash: master@321fca0b                                                               */
+/*                                                                                               */
+/* Licence can be viewed at http://www.fsf.org/licenses/gpl.txt                                  */
+/*                                                                                               */
+/*************************************************************************************************/
+
+#include <inttypes.h>
+
+#include <avr/boot.h>
+#include <avr/io.h>
+#include <avr/pgmspace.h>
+#include <avr/interrupt.h>
+#include <avr/wdt.h>
+// #include <util/delay.h>
+
+// #define DEBUG_UART1
+#ifdef DEBUG_UART1
+   #include <stdio.h>
+#endif
+
+// after this many errors give up and launch application
+#define MAX_ERROR_COUNT 5
+
+#define HW_VER   0xF1
+#define SW_MAJOR 0x01
+#define SW_MINOR 0x10
+
+// onboard LED is used to indicate, that the bootloader was entered
+#define SET_LED_RED (PORTC |= (1 << PC2))
+#define CLR_LED_RED (PORTC &= ~(1 << PC2))
+#define SET_LED_ORANGE (PORTC |= (1 << PC3))
+#define CLR_LED_ORANGE (PORTC &= ~(1 << PC3))
+#define SET_LED_GREEN (PORTC |= (1 << PC4))
+#define CLR_LED_GREEN (PORTC &= ~(1 << PC4))
+
+// function prototypes
+void putch(char);
+char getch(void);
+void getNch(uint8_t);
+void byte_response(uint8_t);
+void nothing_response(void);
+char gethex(void);
+void puthex(char);
+void flash_led(uint8_t);
+
+volatile const char DATE [] PROGMEM = __DATE__;
+volatile const char TIME [] PROGMEM = __TIME__;
+
+#ifdef DEBUG_UART1
+   int uart_putchar(char c, FILE *stream) {
+      if (c == '\n') {
+         uart_putchar('\r', stream);
+      }
+      loop_until_bit_is_set(UCSR1A, UDRE1);
+      UDR1 = c;
+      return 0;
+   }
+
+   static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
+#endif
+
+// some variables
+union address_union {
+       uint16_t word;
+       uint8_t  byte[2];
+} address;
+
+union length_union {
+       uint16_t word;
+       uint8_t  byte[2];
+} length;
+
+struct flags_struct {
+       unsigned eeprom : 1;
+       unsigned rampz  : 1;
+} flags;
+
+uint8_t buff[SPM_PAGESIZE + 1];
+// uint8_t address_high;
+// uint8_t pagesz=0x80;
+
+uint16_t i;
+uint8_t bootuart = 0;
+
+uint8_t error_count = 0;
+
+void (*app_start)(void) = 0x0000;
+
+int main () {
+       uint8_t ch, ch2;
+       uint16_t w;
+
+       #ifdef WATCHDOG_MODS
+               ch = MCUSR;
+               MCUSR = 0;
+
+               WDTCSR |= _BV(WDCE) | _BV(WDE);
+               WDTCSR = 0;
+
+               // Check if the WDT was used to reset, in which case we dont bootload and skip straight to the code. woot.
+               if (! (ch &  _BV(EXTRF))) // if its a not an external reset...
+         app_start();  // skip bootloader
+       #else
+               asm volatile("nop\n\t");
+       #endif
+
+       // LED ports output and off, ensure that Q1 (battery power) on (PC7)
+       PORTC = 0;
+   DDRC = (1 << PC7) | (1 << PC4) | (1 << PC3) |(1 << PC2);
+       
+
+       #ifdef DOUBLE_SPEED
+               UCSR0A = (1 << U2X0); // Double speed mode USART0
+               UBRR0L = (uint8_t)(F_CPU / (BAUD_RATE *8L) - 1);
+               UBRR0H = (F_CPU / (BAUD_RATE * 8L) - 1) >> 8;
+      #ifdef DEBUG_UART1
+                  UCSR1A = (1 << U2X1); // Double speed mode USART0
+                  UBRR1L = (uint8_t)(F_CPU / (BAUD_RATE *8L) - 1);
+                  UBRR1H = (F_CPU / (BAUD_RATE * 8L) - 1) >> 8;
+      #endif
+       #else
+               UBRR0L = (uint8_t)(F_CPU / (BAUD_RATE * 16L) - 1);
+               UBRR0H = (F_CPU / (BAUD_RATE*16L)-1) >> 8;
+      #ifdef DEBUG_UART1
+                  UBRR1L = (uint8_t)(F_CPU / (BAUD_RATE * 16L) - 1);
+                  UBRR1H = (F_CPU / (BAUD_RATE*16L)-1) >> 8;
+      #endif
+       #endif
+
+       UCSR0B = (1<<RXEN0) | (1<<TXEN0);
+       UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
+       UCSR1B = (1<<TXEN1);
+       UCSR1C = (1<<UCSZ00) | (1<<UCSZ01);
+       
+   #ifdef DEBUG_UART1
+      stdout = &mystdout;
+          printf("\n\nArduino-Bootloader\n");
+   #endif
+       
+       // flash onboard LED to signal entering of bootloader */
+       flash_led(NUM_LED_FLASHES);
+
+       // forever loop
+       while (1) {
+
+               // get character from UART
+               ch = getch();
+
+               // A bunch of if...else if... gives smaller code than switch...case !
+
+               // Hello is anyone home ?
+               if(ch == '0') {
+                       nothing_response();
+
+               } else if (ch == '1') {
+                       // Request programmer ID
+                       // Not using PROGMEM string due to boot block in m128 being beyond 64kB boundary
+                       // Would need to selectively manipulate RAMPZ, and it's only 9 characters anyway so who cares.
+       
+                       if (getch() == ' ') {
+                               putch(0x14);
+                               putch('A');
+                               putch('V');
+                               putch('R');
+                               putch(' ');
+                               putch('I');
+                               putch('S');
+                               putch('P');
+                               putch(0x10);
+                       } else {
+                               if (++error_count == MAX_ERROR_COUNT) {
+               DDRC = 0; PORTC = 0;
+                                       app_start();
+                               }
+                       }
+
+               } else if (ch == '@') {
+                       // AVR ISP/STK500 board commands DON'T CARE so default nothing_response
+                       ch2 = getch();
+                       if (ch2 > 0x85) getch();
+                       nothing_response();
+
+               // *****************************
+               // AVR ISP/STK500 board requests
+               // *****************************
+
+               } else if (ch == 'A') { // 0x41
+                       ch2 = getch();
+                       if (ch2 == 0x80) {
+                               byte_response(HW_VER);     // Hardware version
+                       } else if (ch2 == 0x81) {
+                               byte_response(SW_MAJOR);   // Software major version
+                  } else if(ch2 == 0x82) {
+                               byte_response(SW_MINOR);   // Software minor version
+             } else if(ch2==0x98) {
+                               byte_response(0x03);       // Unknown but seems to be required by avr studio 3.56
+                       } else {
+                               byte_response(0x00);       // Covers various unnecessary responses we don't care about
+                       }
+
+               } else if (ch == 'B') { // B: 0x42
+                       // Device Parameters  DON'T CARE, DEVICE IS FIXED
+                       getNch(20);
+                       nothing_response();
+
+               
+               } else if (ch == 'E') { // E: 0x45
+                       // Parallel programming stuff  DON'T CARE
+                       getNch(5);
+                       nothing_response();
+
+               } else if (ch == 'P' || ch == 'R') { // P: 0x50, R: 0x52
+                       // P: Enter programming mode
+                  // R: Erase device, don't care as we will erase one page at a time anyway.
+                       nothing_response();
+
+               } else if (ch == 'Q') { // Q: 0x51
+                       // Leave programming mode
+                       nothing_response();
+                       #ifdef WATCHDOG_MODS
+                               // autoreset via watchdog (sneaky!)
+                               WDTCSR = _BV(WDE);
+                               while (1); // 16 ms
+                       #endif
+
+               } else if(ch == 'U') { // U: 0x55
+                       // Set address, little endian. EEPROM in bytes, FLASH in words
+                       // Perhaps extra address bytes may be added in future to support > 128kB FLASH.
+                       // This might explain why little endian was used here, big endian used everywhere else.
+                       address.byte[0] = getch();
+                       address.byte[1] = getch();
+                       nothing_response();
+
+
+               } else if (ch == 'V') { // V: 0x56
+                       // Universal SPI programming command, disabled.  Would be used for fuses and lock bits.
+                       if (getch() == 0x30) {
+                               getch();
+                               ch = getch();
+                               getch();
+                               if (ch == 0) {
+                                       byte_response(SIGNATURE_0);
+                               } else if (ch == 1) {
+                                       byte_response(SIGNATURE_1); 
+                               } else {
+                                       byte_response(SIGNATURE_2);
+                               } 
+                       } else {
+                               getNch(3);
+                               byte_response(0x00);
+                       }
+
+               } else if (ch == 'd') { // d: 0x64
+                       // Write memory, length is big endian and is in bytes
+                       length.byte[1] = getch();
+                       length.byte[0] = getch();
+                       flags.eeprom = 0;
+                       if (getch() == 'E') {
+                               flags.eeprom = 1;
+                       }
+                       for (w = 0; w < length.word; w++) {
+                               // Store data in buffer, can't keep up with serial data stream whilst programming pages
+                               buff[w] = getch(); 
+                       }
+                       if (getch() == ' ') {
+                               if (flags.eeprom) {
+                                       // Write to EEPROM one byte at a time
+                                       address.word <<= 1;
+                                       for(w = 0; w < length.word; w++) {
+                                               while(EECR & (1<<EEPE));
+                                               EEAR = (uint16_t)address.word;
+                                               EEDR = buff[w];
+                                               EECR |= (1<<EEMPE);
+                                               EECR |= (1<<EEPE);
+                                               // SX
+                                               // eeprom_write_byte((void *)address.word,buff[w]);
+                                               address.word++;
+                                       }                       
+                               } else {
+                                       // Write to FLASH one page at a time
+                                       #ifdef RAMPZ
+                  if (address.byte[1] > 127) {
+                     //Only possible with m128, m256 will need 3rd address byte. FIXME
+                     RAMPZ = 0x01;
+                  } else {
+                     RAMPZ = 0x00;
+                  }
+                  #endif
+
+                                       // address * 2 -> byte location
+                                       address.word = address.word << 1;               
+                                       if ((length.byte[0] & 0x01)) {
+                                               // Even up an odd number of bytes
+                                               length.word++;
+                                       }
+                                       cli();
+
+                                       uint16_t addr = address.word;
+                                       #ifdef DEBUG_UART1
+                  printf("Programming: address=0x%04x length=0x%04x\n", addr, length.word);
+                                          printf("  eeprom_busy_wait() ...");
+                                       #endif
+               eeprom_busy_wait();
+                                       boot_spm_busy_wait();
+                                       #ifdef DEBUG_UART1
+                                       printf("done\n");
+                  printf("  boot_page_erase(0x%04x)...", address.word);
+               #endif
+               SET_LED_RED;
+                                       boot_page_erase(addr);
+                                       boot_spm_busy_wait ();
+               CLR_LED_RED;
+                                       #ifdef DEBUG_UART1
+                                       printf("done\n");
+                                       printf("  boot_page_fill(0x%04x, ...): ", address.word);
+               #endif
+                                       for (i = 0; i < SPM_PAGESIZE; i += 2) {
+                                               uint16_t w = buff[i] + (buff[i + 1] << 8);
+                                       #ifdef DEBUG_UART1
+                     printf(".");
+                  #endif
+                                               boot_page_fill(addr + i, w);
+                                       }
+                                       #ifdef DEBUG_UART1
+                  printf("\n  boot_page_write(0x%04x)...", address.word);
+               #endif
+                                       boot_page_write(addr);
+                                       boot_spm_busy_wait();
+                                       #ifdef DEBUG_UART1
+                  printf("done\n");
+                                  printf("  boot_rww_enable()\n");
+               #endif
+                                       boot_rww_enable();
+                               }
+                               putch(0x14);
+                               putch(0x10);
+
+                       } else {
+                               if (++error_count == MAX_ERROR_COUNT)
+               DDRC = 0; PORTC = 0;
+                                       app_start();
+                       }               
+
+               } else if (ch == 't') { // t: 0x74
+                       // Read memory block mode, length is big endian.  */
+                       length.byte[1] = getch();
+                       length.byte[0] = getch();
+                       // if (address.word>0x7FFF) flags.rampz = 1; // No go with m256, FIXME
+                       // else flags.rampz = 0;
+                       address.word = address.word << 1; // address * 2 -> byte location
+                       if (getch() == 'E') {
+                               flags.eeprom = 1;
+                       } else {
+                               flags.eeprom = 0;
+                       }
+                       if (getch() == ' ') {                           
+                               // Command terminator
+                               putch(0x14);
+                               for (w = 0; w < length.word; w++) {
+                                       // Can handle odd and even lengths okay
+                                       if (flags.eeprom) {                             // Byte access EEPROM read
+                                               while(EECR & (1<<EEPE));
+                                               EEAR = (uint32_t)address.word;
+                                               EECR |= (1<<EERE);
+                                               putch(EEDR);
+                                               // putch(eeprom_read_byte((void *)address.word));
+                                               address.word++;
+                                       }
+                                       else {
+                  #ifdef RAMPZ
+                     if (!flags.rampz) {
+                        putch(pgm_read_byte_near(address.word));
+                     } else {
+                        putch(pgm_read_byte_far(address.word + 0x10000));
+                     }
+                  #else
+                     putch(pgm_read_byte_near(address.word));
+                  #endif
+                                               address.word++;
+                                       }
+                               }
+                       }
+                       putch(0x10);
+
+               } else if(ch == 'u') { // u: 0x75
+                       // Get device signature bytes
+                       if (getch() == ' ') {
+                               putch(0x14);
+                               putch(SIGNATURE_0);
+                               putch(SIGNATURE_1);
+                               putch(SIGNATURE_2);
+                               putch(0x10);
+                       } else {
+                               if (++error_count == MAX_ERROR_COUNT)
+               DDRC = 0; PORTC = 0;
+                                       app_start();
+                       }
+
+               } else if (ch == 'v') {
+                       // Read oscillator calibration byte
+                       byte_response(0x00);
+               }
+
+       }
+}
+
+char gethexnib () {
+       char a;
+       a = getch(); putch(a);
+       if (a >= 'a') {
+               return (a - 'a' + 0x0a);
+       } else if (a >= '0') {
+               return (a - '0');
+       }
+       return a;
+}
+
+
+char gethex () {
+       return (gethexnib() << 4) + gethexnib();
+}
+
+
+void puthex (char ch) {
+       char ah;
+
+       ah = ch >> 4;
+       if(ah >= 0x0a) {
+               ah = ah - 0x0a + 'a';
+       } else {
+               ah += '0';
+       }
+       
+       ch &= 0x0f;
+       if(ch >= 0x0a) {
+               ch = ch - 0x0a + 'a';
+       } else {
+               ch += '0';
+       }
+       
+       putch(ah);
+       putch(ch);
+}
+
+
+void putch (char ch) {
+       while (!(UCSR0A & _BV(UDRE0)));
+       UDR0 = ch;
+}
+
+
+char getch () {
+       uint32_t count = 0;
+       while( !(UCSR0A & _BV(RXC0)) ) {
+               count++;
+               if (count > MAX_TIME_COUNT) {
+         DDRC = 0; PORTC = 0;
+                       app_start();
+               }
+       }
+       return UDR0;
+}
+
+
+void getNch (uint8_t count) {
+       while(count--) {
+               getch();
+       }
+}
+
+
+void byte_response (uint8_t val) {
+       if (getch() == ' ') {
+               putch(0x14);
+               putch(val);
+               putch(0x10);
+       } else if (++error_count == MAX_ERROR_COUNT) {
+      DDRC = 0; PORTC = 0;
+       app_start();
+   }
+}
+
+void nothing_response () {
+       if (getch() == ' ') {
+               putch(0x14);
+               putch(0x10);
+       } else if (++error_count == MAX_ERROR_COUNT) {
+               DDRC = 0; PORTC = 0;
+               app_start();
+       }
+}
+
+void delay () {
+       // app. 200ms
+       for (volatile uint32_t timer = 0; timer < 0x12000; timer++) {
+               if (UCSR0A & _BV(RXC0)) {
+                       return;
+               }
+       }
+}
+
+void flash_led (uint8_t count) {
+       SET_LED_RED;
+   delay();
+   SET_LED_ORANGE;
+       delay();
+   PORTC = 0;
+   
+       while (count--) {
+      SET_LED_GREEN;
+               delay();
+               CLR_LED_GREEN;
+               delay();
+       }
+}