├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .gitignore ├── LICENSE ├── PCB_with_gerber ├── Gerber_2in1.zip ├── Lite │ ├── BOM_Project Dial Lite.csv │ ├── Gerber_Project Dial Lite.zip │ └── Project Dial Lite.json ├── Pro │ ├── Project Dial MLB Gerber.zip │ ├── Project Dial MLB LCEDA.json │ ├── Project Dial MLB attiny.PcbDoc │ ├── Project Dial attiny v2 github smt │ │ ├── BOM check.xlsx │ │ ├── BOM.csv │ │ ├── PickAndPlace.csv │ │ ├── PickAndPlace_BottomMirrored.csv │ │ └── Project Dial MLB_Gerber.zip │ └── Project Dial attiny v2 github.zip └── README.md ├── README.md ├── bom.xlsx ├── lib └── TrinketHidCombo │ ├── License.txt │ ├── TrinketHidCombo.cpp │ ├── TrinketHidCombo.h │ ├── TrinketHidCombo.zip │ ├── TrinketHidComboC.c │ ├── TrinketHidComboC.h │ ├── cmdline_defs.h │ ├── examples │ ├── TrinketVolumeKnob │ │ ├── Tinket Volume Knob Fritzing Sketch.fzz │ │ ├── TrinketVolumeKnob.ino │ │ └── trinket volume knob wiring.png │ └── TrinketVolumeKnobPlus │ │ ├── Tinket Volume Knob Plus Fritzing Sketch.fzz │ │ ├── TrinketVolumeKnobPlus.ino │ │ └── trinket volume knob with button wiring.png │ ├── readme.txt │ ├── usbconfig.h │ ├── usbdrv │ ├── Changelog.txt │ ├── CommercialLicense.txt │ ├── License.txt │ ├── Readme.txt │ ├── USB-ID-FAQ.txt │ ├── USB-IDs-for-free.txt │ ├── asmcommon.inc │ ├── oddebug.c │ ├── oddebug.h │ ├── usbdrv.c │ ├── usbdrv.h │ ├── usbdrvasm.S │ ├── usbdrvasm.asm │ ├── usbdrvasm165.inc │ └── usbportability.h │ ├── usbdrv_includer.c │ └── usbdrvasm_includer.S ├── src ├── Surface_Dial_attiny │ ├── .vscode │ │ └── arduino.json │ ├── Surface_Dial_attiny.ino │ ├── Surface_Dial_attiny_Lite.ino │ └── micronucleus-1.11 │ │ ├── Contributing.txt │ │ ├── License.txt │ │ ├── Readme.txt │ │ ├── Style Guide.txt │ │ ├── commandline │ │ ├── 49-micronucleus.rules │ │ ├── Makefile │ │ ├── Readme │ │ ├── builds │ │ │ ├── OSX │ │ │ │ └── micronucleus │ │ │ └── Windows │ │ │ │ └── micronucleus.exe │ │ ├── library │ │ │ ├── littleWire_util.c │ │ │ ├── littleWire_util.h │ │ │ ├── micronucleus_lib.c │ │ │ └── micronucleus_lib.h │ │ └── micronucleus.c │ │ ├── firmware │ │ ├── Makefile │ │ ├── bootloaderconfig.h │ │ ├── crt1.S │ │ ├── main.c │ │ ├── osccalASM.S │ │ ├── releases │ │ │ ├── 49-micronucleus.rules │ │ │ ├── Makefile │ │ │ ├── Readme │ │ │ ├── builds │ │ │ │ ├── OSX │ │ │ │ │ └── micronucleus │ │ │ │ └── Windows │ │ │ │ │ └── micronucleus.exe │ │ │ ├── library │ │ │ │ ├── littleWire_util.c │ │ │ │ ├── littleWire_util.h │ │ │ │ ├── micronucleus_lib.c │ │ │ │ └── micronucleus_lib.h │ │ │ ├── micronucleus-1.02.hex │ │ │ ├── micronucleus-1.03-2secs.hex │ │ │ ├── micronucleus-1.03-5secs.hex │ │ │ ├── micronucleus-1.04-low-power.hex │ │ │ ├── micronucleus-1.04.hex │ │ │ ├── micronucleus-1.05-jumper.hex │ │ │ ├── micronucleus-1.05.hex │ │ │ ├── micronucleus-1.06-jumper-v2.hex │ │ │ ├── micronucleus-1.06.hex │ │ │ ├── micronucleus-1.10-ledpb1.hex │ │ │ ├── micronucleus-1.10.hex │ │ │ ├── micronucleus-1.11-entry_ext_reset.hex │ │ │ ├── micronucleus-1.11-entry_jumper_pb0.hex │ │ │ ├── micronucleus-1.11-ledpb1.hex │ │ │ ├── micronucleus-1.11.hex │ │ │ ├── micronucleus.c │ │ │ ├── micronucleus.exe │ │ │ └── release notes.txt │ │ ├── usbconfig.h │ │ └── usbdrv │ │ │ ├── Changelog.txt │ │ │ ├── CommercialLicense.txt │ │ │ ├── License.txt │ │ │ ├── Readme.txt │ │ │ ├── USB-ID-FAQ.txt │ │ │ ├── USB-IDs-for-free.txt │ │ │ ├── asmcommon.inc │ │ │ ├── oddebug.c │ │ │ ├── oddebug.h │ │ │ ├── usbconfig-prototype.h │ │ │ ├── usbdrv.c │ │ │ ├── usbdrv.h │ │ │ ├── usbdrvasm.S │ │ │ ├── usbdrvasm.asm │ │ │ ├── usbdrvasm12.inc │ │ │ ├── usbdrvasm128.inc │ │ │ ├── usbdrvasm15.inc │ │ │ ├── usbdrvasm16.inc │ │ │ ├── usbdrvasm165.inc │ │ │ ├── usbdrvasm18-crc.inc │ │ │ ├── usbdrvasm20.inc │ │ │ └── usbportability.h │ │ ├── micronucleus-t85_winDriver.zip │ │ ├── ruby │ │ ├── dump.rb │ │ ├── hex-to-bin.rb │ │ ├── micronucleus.rb │ │ └── upload.rb │ │ └── upgrade │ │ ├── Makefile │ │ ├── bootloader_data.c │ │ ├── generate-data.rb │ │ ├── readme.txt │ │ ├── releases │ │ ├── micronucleus-1.03-upgrade.hex │ │ ├── micronucleus-1.04-upgrade.hex │ │ ├── micronucleus-1.05-jumper-upgrade.hex │ │ ├── micronucleus-1.05-upgrade.hex │ │ ├── micronucleus-1.06-jumper-v2-upgrade.hex │ │ ├── micronucleus-1.06-upgrade.hex │ │ ├── micronucleus-1.10-ledpb1-upgrade.hex │ │ ├── micronucleus-1.10-upgrade.hex │ │ ├── micronucleus-1.11-entry-ext-reset-upgrade.hex │ │ ├── micronucleus-1.11-entry-jumper-pb0-upgrade.hex │ │ ├── micronucleus-1.11-ledpb1-upgrade.hex │ │ └── micronucleus-1.11-upgrade.hex │ │ ├── technical details.txt │ │ ├── upgrade-prefix.hex │ │ ├── upgrade.c │ │ └── utils.h └── attiny_fuse_2 │ └── attiny_fuse_2.ino ├── stl model ├── surface dial t v2.3.STL └── surface dial v2.3.STL └── tools └── avrdudess_20191012 ├── Changelog.txt ├── Credits.txt ├── Languages ├── chinese-zh_CN.xml ├── english - 副本.xml ├── english.xml ├── french.xml ├── german.xml ├── polish.xml └── russian.xml ├── License.txt ├── README.md ├── TODO.txt ├── avr-size.exe ├── avrdude.conf ├── avrdude.exe ├── avrdudess.exe ├── bits.xml ├── config.xml ├── libusb0.dll └── presets.xml /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | #------------------------------------------------------------------------------------------------------------- 2 | # Copyright (c) Microsoft Corporation. All rights reserved. 3 | # Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. 4 | #------------------------------------------------------------------------------------------------------------- 5 | 6 | FROM mcr.microsoft.com/vscode/devcontainers/base:debian-9 7 | 8 | # This Dockerfile's base image has a non-root user with sudo access. Use the "remoteUser" 9 | # property in devcontainer.json to use it. On Linux, the container user's GID/UIDs 10 | # will be updated to match your local UID/GID (when using the dockerFile property). 11 | # See https://aka.ms/vscode-remote/containers/non-root-user for details. 12 | ARG USERNAME=vscode 13 | ARG USER_UID=1000 14 | ARG USER_GID=$USER_UID 15 | 16 | # Configure apt and install packages 17 | RUN apt-get update \ 18 | && export DEBIAN_FRONTEND=noninteractive \ 19 | # 20 | # Install C++ tools 21 | && apt-get -y install build-essential cmake cppcheck valgrind \ 22 | # 23 | # [Optional] Update UID/GID if needed 24 | && if [ "$USER_GID" != "1000" ] || [ "$USER_UID" != "1000" ]; then \ 25 | groupmod --gid $USER_GID $USERNAME \ 26 | && usermod --uid $USER_UID --gid $USER_GID $USERNAME \ 27 | && chown -R $USER_UID:$USER_GID /home/$USERNAME; \ 28 | fi \ 29 | # 30 | # Clean up 31 | && apt-get autoremove -y \ 32 | && apt-get clean -y \ 33 | && rm -rf /var/lib/apt/lists/* 34 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "C++", 3 | "dockerFile": "Dockerfile", 4 | "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined"], 5 | 6 | // Set *default* container specific settings.json values on container create. 7 | "settings": { 8 | "terminal.integrated.shell.linux": "/bin/bash" 9 | }, 10 | 11 | // Add the IDs of extensions you want installed when the container is created. 12 | "extensions": [ 13 | "ms-vscode.cpptools" 14 | ] 15 | 16 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 17 | // "forwardPorts": [], 18 | 19 | // Use 'postCreateCommand' to run commands after the container is created. 20 | // "postCreateCommand": "gcc -v", 21 | 22 | // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. 23 | // "remoteUser": "vscode" 24 | 25 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | *.hex 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | -------------------------------------------------------------------------------- /PCB_with_gerber/Gerber_2in1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Gerber_2in1.zip -------------------------------------------------------------------------------- /PCB_with_gerber/Lite/BOM_Project Dial Lite.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Lite/BOM_Project Dial Lite.csv -------------------------------------------------------------------------------- /PCB_with_gerber/Lite/Gerber_Project Dial Lite.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Lite/Gerber_Project Dial Lite.zip -------------------------------------------------------------------------------- /PCB_with_gerber/Pro/Project Dial MLB Gerber.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Pro/Project Dial MLB Gerber.zip -------------------------------------------------------------------------------- /PCB_with_gerber/Pro/Project Dial attiny v2 github smt/BOM check.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Pro/Project Dial attiny v2 github smt/BOM check.xlsx -------------------------------------------------------------------------------- /PCB_with_gerber/Pro/Project Dial attiny v2 github smt/BOM.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Pro/Project Dial attiny v2 github smt/BOM.csv -------------------------------------------------------------------------------- /PCB_with_gerber/Pro/Project Dial attiny v2 github smt/PickAndPlace.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Pro/Project Dial attiny v2 github smt/PickAndPlace.csv -------------------------------------------------------------------------------- /PCB_with_gerber/Pro/Project Dial attiny v2 github smt/PickAndPlace_BottomMirrored.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Pro/Project Dial attiny v2 github smt/PickAndPlace_BottomMirrored.csv -------------------------------------------------------------------------------- /PCB_with_gerber/Pro/Project Dial attiny v2 github smt/Project Dial MLB_Gerber.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Pro/Project Dial attiny v2 github smt/Project Dial MLB_Gerber.zip -------------------------------------------------------------------------------- /PCB_with_gerber/Pro/Project Dial attiny v2 github.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/PCB_with_gerber/Pro/Project Dial attiny v2 github.zip -------------------------------------------------------------------------------- /PCB_with_gerber/README.md: -------------------------------------------------------------------------------- 1 | # 二合一版本未经本人测试 2 | 3 | # 关于版本选择和焊接 Version Choice & Soldering 4 | 5 | ## **!建议使用/PCB_with_gerber/Pro/...attiny v2 github.zip!** 6 | 7 | ## 版本选择 Version Chioce 8 | 9 | | | Pro | Lite | 10 | | ---------------------------- | ------------------------------------ | --------------------------------- | 11 | | **O&M** | @Eddddddddy | @Eddddddddy, @leostudiooo | 12 | | **Basic Functions** | Y | Y | 13 | | **Cost** | Higher | Lower | 14 | | **Vibration(Taptic Engine)** | Y | N | 15 | | **Encoder** | EC11E1834403 _(ALPS, without detent)_ | EC11*(With detent)* | 16 | | **Arduino File** | /src/Surface_Dial_attiny.ino | /src/Surface_Dial_attiny_Lite.ino | 17 | | **PCB File** _(Now All-in-One)_ | /PCB_with_gerber/Pro | /PCB_with_gerber/Lite | 18 | | **Fuse Reset** | Needed | Unnecessary | 19 | 20 | ## PCB 21 | 22 | 你可以选择原版Pro或Lite,也可以尝试新出来的二合一版本。 23 | You can choose the original Pro or Lite, or the 2 in 1 ver. 24 | 25 | ## 焊接 Soldering (for 2 in 1 ver.) 26 | 27 | 如果你选择二合一版本,那么你有升级的机会。 28 | If you choose the 2 in 1(AIO) version, you have a chance to upgrade to Pro. 29 | 30 | - 如果你选择Pro,请连接板子背面标注SW Pro的两个焊盘。 31 | If you choose Pro, plz connect the two solders with "SW Pro" on the bottom. 32 | 33 | - 如果你选择Lite,请连接板子正面标注SW Lite的两个焊盘。 34 | If you choose Lite, plz connect the two solders with "SW Lite" on the top. 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Surface_Dial_Arduino 2 | 3 | Use attiny85 to achieve surface dial function 4 | 5 | ## **!注意!建议使用/PCB_with_gerber/Pro/...attiny v2 github.zip!其他pcb工程(包含立创EDA的开源工程)未经本人测试,不做可靠性保证。** 6 | 7 | 将这个添加到你的Arduino IDE开发板中:http://digistump.com/package_digistump_index.json 8 | 9 | /bom.xlsx :元器件清单 10 | 11 | /lib :arduino库 12 | 13 | /src :arduino代码(包含融丝恢复器代码) 14 | 15 | /tools :编程器上位机软件 16 | 17 | /stl model :3D打印模型 18 | 19 | /PCB_with_gerber :pcb文件 20 | 21 | 立创EDA开源文件在[这里](https://oshwhub.com/Lingling0408/project-dial-pcb) 22 | 23 | 【点个Star!】谢谢! 24 | 25 | 在[这里](https://www.bilibili.com/video/BV17K411W78w/)可以查看视频介绍 26 | 27 | ------ 28 | 29 | | | Pro | Lite | 30 | | ---------------------------- | ------------------------------------ | --------------------------------- | 31 | | **O&M** | @Eddddddddy | @Eddddddddy, @leostudiooo | 32 | | **Basic Functions** | Y | Y | 33 | | **Cost** | Higher | Lower | 34 | | **Vibration(Taptic Engine)** | Y | N | 35 | | **Encoder** | EC11E1834403 _(ALPS, without detent)_ | EC11*(With detent)* | 36 | | **Arduino File** | /src/Surface_Dial_attiny.ino | /src/Surface_Dial_attiny_Lite.ino | 37 | | **PCB File** _(Now All-in-One)_ | /PCB_with_gerber/Pro | /PCB_with_gerber/Lite | 38 | | **Fuse Reset** | Needed | Unnecessary | 39 | 40 | ------ 41 | 42 | 你需要做什么? 43 | 44 | - 想好购买的元器件是Pro还是Lite *(虽然后期也可以升级)* 45 | 46 | - 在你信任的地方购买所需元器件 47 | 48 | - 焊接(见/PCB_with_Gerber/README.md) 49 | 50 | - 刷入程序 51 | 52 | - 开始你的Dial之旅 53 | -------------------------------------------------------------------------------- /bom.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/bom.xlsx -------------------------------------------------------------------------------- /lib/TrinketHidCombo/TrinketHidCombo.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/lib/TrinketHidCombo/TrinketHidCombo.zip -------------------------------------------------------------------------------- /lib/TrinketHidCombo/TrinketHidComboC.h: -------------------------------------------------------------------------------- 1 | /* 2 | Header file for TrinketHidComboC.c 3 | 4 | Copyright (c) 2013 Adafruit Industries 5 | All rights reserved. 6 | 7 | TrinketHidCombo is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU Lesser General Public License as 9 | published by the Free Software Foundation, either version 3 of 10 | the License, or (at your option) any later version. 11 | 12 | TrinketHidCombo is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU Lesser General Public License for more details. 16 | 17 | You should have received a copy of the GNU Lesser General Public 18 | License along with TrinketHidCombo. If not, see 19 | . 20 | */ 21 | 22 | #ifndef _TRINKETHIDCOMBOC_H_ 23 | #define _TRINKETHIDCOMBOC_H_ 24 | 25 | #ifdef __cplusplus 26 | extern "C" { 27 | #endif 28 | 29 | #include 30 | 31 | extern char usb_hasCommed; 32 | extern uint8_t led_state; 33 | extern uint8_t report_buffer[8]; 34 | 35 | void usbBegin(); 36 | void usbPollWrapper(); 37 | void usbReportSend(uint8_t sz); 38 | 39 | #define REPID_MOUSE 1 40 | #define REPID_KEYBOARD 2 41 | #define REPID_MMKEY 10 42 | #define REPID_SYSCTRLKEY 4 43 | #define REPSIZE_MOUSE 4 44 | #define REPSIZE_KEYBOARD 8 45 | #define REPSIZE_MMKEY 3 46 | #define REPSIZE_SYSCTRLKEY 2 47 | 48 | #ifdef __cplusplus 49 | } 50 | #endif 51 | 52 | #endif -------------------------------------------------------------------------------- /lib/TrinketHidCombo/cmdline_defs.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The purpose of this file is to provide the compiler any definitions that would usually go in the command line options, since Arduino IDE does not allow such additions 3 | 4 | Copyright (c) 2013 Adafruit Industries 5 | All rights reserved. 6 | 7 | TrinketHidCombo is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU Lesser General Public License as 9 | published by the Free Software Foundation, either version 3 of 10 | the License, or (at your option) any later version. 11 | 12 | TrinketHidCombo is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU Lesser General Public License for more details. 16 | 17 | You should have received a copy of the GNU Lesser General Public 18 | License along with TrinketHidCombo. If not, see 19 | . 20 | 21 | */ 22 | 23 | #ifndef _CMDLINE_DEFS_H_ 24 | #define _CMDLINE_DEFS_H_ 25 | 26 | #include 27 | 28 | #if defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny25__) 29 | // the oscillator calibration will cause the F_CPU to change 30 | #undef F_CPU 31 | #define F_CPU 16500000UL 32 | 33 | #endif 34 | 35 | #endif -------------------------------------------------------------------------------- /lib/TrinketHidCombo/examples/TrinketVolumeKnob/Tinket Volume Knob Fritzing Sketch.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/lib/TrinketHidCombo/examples/TrinketVolumeKnob/Tinket Volume Knob Fritzing Sketch.fzz -------------------------------------------------------------------------------- /lib/TrinketHidCombo/examples/TrinketVolumeKnob/TrinketVolumeKnob.ino: -------------------------------------------------------------------------------- 1 | // see tutorial at http://learn.adafruit.com/trinket-usb-volume-knob 2 | 3 | #include "TrinketHidCombo.h" 4 | 5 | #define PIN_ENCODER_A 0 6 | #define PIN_ENCODER_B 2 7 | #define TRINKET_PINx PINB 8 | 9 | static uint8_t enc_prev_pos = 0; 10 | static uint8_t enc_flags = 0; 11 | 12 | void setup() 13 | { 14 | // set pins as input with internal pull-up resistors enabled 15 | pinMode(PIN_ENCODER_A, INPUT); 16 | pinMode(PIN_ENCODER_B, INPUT); 17 | digitalWrite(PIN_ENCODER_A, HIGH); 18 | digitalWrite(PIN_ENCODER_B, HIGH); 19 | 20 | TrinketHidCombo.begin(); // start the USB device engine and enumerate 21 | 22 | // get an initial reading on the encoder pins 23 | if (digitalRead(PIN_ENCODER_A) == LOW) { 24 | enc_prev_pos |= (1 << 0); 25 | } 26 | if (digitalRead(PIN_ENCODER_B) == LOW) { 27 | enc_prev_pos |= (1 << 1); 28 | } 29 | } 30 | 31 | void loop() 32 | { 33 | int8_t enc_action = 0; // 1 or -1 if moved, sign is direction 34 | 35 | // note: for better performance, the code will now use 36 | // direct port access techniques 37 | // http://www.arduino.cc/en/Reference/PortManipulation 38 | uint8_t enc_cur_pos = 0; 39 | // read in the encoder state first 40 | if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_A)) { 41 | enc_cur_pos |= (1 << 0); 42 | } 43 | if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_B)) { 44 | enc_cur_pos |= (1 << 1); 45 | } 46 | 47 | // if any rotation at all 48 | if (enc_cur_pos != enc_prev_pos) 49 | { 50 | if (enc_prev_pos == 0x00) 51 | { 52 | // this is the first edge 53 | if (enc_cur_pos == 0x01) { 54 | enc_flags |= (1 << 0); 55 | } 56 | else if (enc_cur_pos == 0x02) { 57 | enc_flags |= (1 << 1); 58 | } 59 | } 60 | 61 | if (enc_cur_pos == 0x03) 62 | { 63 | // this is when the encoder is in the middle of a "step" 64 | enc_flags |= (1 << 4); 65 | } 66 | else if (enc_cur_pos == 0x00) 67 | { 68 | // this is the final edge 69 | if (enc_prev_pos == 0x02) { 70 | enc_flags |= (1 << 2); 71 | } 72 | else if (enc_prev_pos == 0x01) { 73 | enc_flags |= (1 << 3); 74 | } 75 | 76 | // check the first and last edge 77 | // or maybe one edge is missing, if missing then require the middle state 78 | // this will reject bounces and false movements 79 | if (bit_is_set(enc_flags, 0) && (bit_is_set(enc_flags, 2) || bit_is_set(enc_flags, 4))) { 80 | enc_action = 1; 81 | } 82 | else if (bit_is_set(enc_flags, 2) && (bit_is_set(enc_flags, 0) || bit_is_set(enc_flags, 4))) { 83 | enc_action = 1; 84 | } 85 | else if (bit_is_set(enc_flags, 1) && (bit_is_set(enc_flags, 3) || bit_is_set(enc_flags, 4))) { 86 | enc_action = -1; 87 | } 88 | else if (bit_is_set(enc_flags, 3) && (bit_is_set(enc_flags, 1) || bit_is_set(enc_flags, 4))) { 89 | enc_action = -1; 90 | } 91 | 92 | enc_flags = 0; // reset for next time 93 | } 94 | } 95 | 96 | enc_prev_pos = enc_cur_pos; 97 | 98 | if (enc_action > 0) { 99 | TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP); 100 | } 101 | else if (enc_action < 0) { 102 | TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN); 103 | } 104 | else { 105 | TrinketHidCombo.poll(); // do nothing, check if USB needs anything done 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /lib/TrinketHidCombo/examples/TrinketVolumeKnob/trinket volume knob wiring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/lib/TrinketHidCombo/examples/TrinketVolumeKnob/trinket volume knob wiring.png -------------------------------------------------------------------------------- /lib/TrinketHidCombo/examples/TrinketVolumeKnobPlus/Tinket Volume Knob Plus Fritzing Sketch.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/lib/TrinketHidCombo/examples/TrinketVolumeKnobPlus/Tinket Volume Knob Plus Fritzing Sketch.fzz -------------------------------------------------------------------------------- /lib/TrinketHidCombo/examples/TrinketVolumeKnobPlus/TrinketVolumeKnobPlus.ino: -------------------------------------------------------------------------------- 1 | // see tutorial at http://learn.adafruit.com/trinket-usb-volume-knob 2 | 3 | #include "TrinketHidCombo.h" 4 | 5 | #define PIN_ENCODER_A 0 6 | #define PIN_ENCODER_B 2 7 | #define TRINKET_PINx PINB 8 | #define PIN_ENCODER_SWITCH 1 9 | 10 | static uint8_t enc_prev_pos = 0; 11 | static uint8_t enc_flags = 0; 12 | static char sw_was_pressed = 0; 13 | 14 | void setup() 15 | { 16 | // set pins as input with internal pull-up resistors enabled 17 | pinMode(PIN_ENCODER_A, INPUT); 18 | pinMode(PIN_ENCODER_B, INPUT); 19 | digitalWrite(PIN_ENCODER_A, HIGH); 20 | digitalWrite(PIN_ENCODER_B, HIGH); 21 | 22 | pinMode(PIN_ENCODER_SWITCH, INPUT); 23 | // the switch is active-high, not active-low 24 | // since it shares the pin with Trinket's built-in LED 25 | // the LED acts as a pull-down resistor 26 | digitalWrite(PIN_ENCODER_SWITCH, LOW); 27 | 28 | TrinketHidCombo.begin(); // start the USB device engine and enumerate 29 | 30 | // get an initial reading on the encoder pins 31 | if (digitalRead(PIN_ENCODER_A) == LOW) { 32 | enc_prev_pos |= (1 << 0); 33 | } 34 | if (digitalRead(PIN_ENCODER_B) == LOW) { 35 | enc_prev_pos |= (1 << 1); 36 | } 37 | } 38 | 39 | void loop() 40 | { 41 | int8_t enc_action = 0; // 1 or -1 if moved, sign is direction 42 | 43 | // note: for better performance, the code will now use 44 | // direct port access techniques 45 | // http://www.arduino.cc/en/Reference/PortManipulation 46 | uint8_t enc_cur_pos = 0; 47 | // read in the encoder state first 48 | if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_A)) { 49 | enc_cur_pos |= (1 << 0); 50 | } 51 | if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_B)) { 52 | enc_cur_pos |= (1 << 1); 53 | } 54 | 55 | // if any rotation at all 56 | if (enc_cur_pos != enc_prev_pos) 57 | { 58 | if (enc_prev_pos == 0x00) 59 | { 60 | // this is the first edge 61 | if (enc_cur_pos == 0x01) { 62 | enc_flags |= (1 << 0); 63 | } 64 | else if (enc_cur_pos == 0x02) { 65 | enc_flags |= (1 << 1); 66 | } 67 | } 68 | 69 | if (enc_cur_pos == 0x03) 70 | { 71 | // this is when the encoder is in the middle of a "step" 72 | enc_flags |= (1 << 4); 73 | } 74 | else if (enc_cur_pos == 0x00) 75 | { 76 | // this is the final edge 77 | if (enc_prev_pos == 0x02) { 78 | enc_flags |= (1 << 2); 79 | } 80 | else if (enc_prev_pos == 0x01) { 81 | enc_flags |= (1 << 3); 82 | } 83 | 84 | // check the first and last edge 85 | // or maybe one edge is missing, if missing then require the middle state 86 | // this will reject bounces and false movements 87 | if (bit_is_set(enc_flags, 0) && (bit_is_set(enc_flags, 2) || bit_is_set(enc_flags, 4))) { 88 | enc_action = 1; 89 | } 90 | else if (bit_is_set(enc_flags, 2) && (bit_is_set(enc_flags, 0) || bit_is_set(enc_flags, 4))) { 91 | enc_action = 1; 92 | } 93 | else if (bit_is_set(enc_flags, 1) && (bit_is_set(enc_flags, 3) || bit_is_set(enc_flags, 4))) { 94 | enc_action = -1; 95 | } 96 | else if (bit_is_set(enc_flags, 3) && (bit_is_set(enc_flags, 1) || bit_is_set(enc_flags, 4))) { 97 | enc_action = -1; 98 | } 99 | 100 | enc_flags = 0; // reset for next time 101 | } 102 | } 103 | 104 | enc_prev_pos = enc_cur_pos; 105 | 106 | if (enc_action > 0) { 107 | TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP); 108 | } 109 | else if (enc_action < 0) { 110 | TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN); 111 | } 112 | 113 | // remember that the switch is active-high 114 | if (bit_is_set(TRINKET_PINx, PIN_ENCODER_SWITCH)) 115 | { 116 | if (sw_was_pressed == 0) // only on initial press, so the keystroke is not repeated while the button is held down 117 | { 118 | TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE); 119 | delay(5); // debounce delay 120 | } 121 | sw_was_pressed = 1; 122 | } 123 | else 124 | { 125 | if (sw_was_pressed != 0) { 126 | delay(5); // debounce delay 127 | } 128 | sw_was_pressed = 0; 129 | } 130 | 131 | TrinketHidCombo.poll(); // check if USB needs anything done 132 | } 133 | -------------------------------------------------------------------------------- /lib/TrinketHidCombo/examples/TrinketVolumeKnobPlus/trinket volume knob with button wiring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/lib/TrinketHidCombo/examples/TrinketVolumeKnobPlus/trinket volume knob with button wiring.png -------------------------------------------------------------------------------- /lib/TrinketHidCombo/readme.txt: -------------------------------------------------------------------------------- 1 | TrinketHidCombo is a part of Adafruit's Trinket/Gemma USB HID Arduino Library 2 | 3 | TrinketHidCombo allows the user to implement a simple USB keyboard inside the Arduino environment 4 | 5 | Please see TrinketHidCombo.h for usage documentation, an example is also included 6 | 7 | TrinketHidCombo uses V-USB (http://www.obdev.at/products/vusb/) to implement USB with a bitbang technique. See the folder "usbdrv" for V-USB files. 8 | 9 | Adafruit's Trinket and Gemma can do almost anything that V-USB can do, including USB mouse, keyboards, joysticks, gamepads, MIDI devices, and much more (including custom devices that do not fit any existing category). 10 | 11 | Copyright (c) 2013 Adafruit Industries 12 | All rights reserved. 13 | 14 | TrinketHidCombo is free software: you can redistribute it and/or modify 15 | it under the terms of the GNU Lesser General Public License as 16 | published by the Free Software Foundation, either version 3 of 17 | the License, or (at your option) any later version. 18 | 19 | TrinketHidCombo is distributed in the hope that it will be useful, 20 | but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | GNU Lesser General Public License for more details. 23 | 24 | You should have received a copy of the GNU Lesser General Public 25 | License along with TrinketHidCombo. If not, see 26 | . -------------------------------------------------------------------------------- /lib/TrinketHidCombo/usbdrv/USB-ID-FAQ.txt: -------------------------------------------------------------------------------- 1 | Version 2012-07-09 2 | 3 | ========================== 4 | WHY DO WE NEED THESE IDs? 5 | ========================== 6 | 7 | USB is more than a low level protocol for data transport. It also defines a 8 | common set of requests which must be understood by all devices. And as part 9 | of these common requests, the specification defines data structures, the 10 | USB Descriptors, which are used to describe the properties of the device. 11 | 12 | From the perspective of an operating system, it is therefore possible to find 13 | out basic properties of a device (such as e.g. the manufacturer and the name 14 | of the device) without a device-specific driver. This is essential because 15 | the operating system can choose a driver to load based on this information 16 | (Plug-And-Play). 17 | 18 | Among the most important properties in the Device Descriptor are the USB 19 | Vendor- and Product-ID. Both are 16 bit integers. The most simple form of 20 | driver matching is based on these IDs. The driver announces the Vendor- and 21 | Product-IDs of the devices it can handle and the operating system loads the 22 | appropriate driver when the device is connected. 23 | 24 | It is obvious that this technique only works if the pair Vendor- plus 25 | Product-ID is unique: Only devices which require the same driver can have the 26 | same pair of IDs. 27 | 28 | 29 | ===================================================== 30 | HOW DOES THE USB STANDARD ENSURE THAT IDs ARE UNIQUE? 31 | ===================================================== 32 | 33 | Since it is so important that USB IDs are unique, the USB Implementers Forum, 34 | Inc. (usb.org) needs a way to enforce this legally. It is not forbidden by 35 | law to build a device and assign it any random numbers as IDs. Usb.org 36 | therefore needs an agreement to regulate the use of USB IDs. The agreement 37 | binds only parties who agreed to it, of course. Everybody else is free to use 38 | any numbers for their IDs. 39 | 40 | So how can usb.org ensure that every manufacturer of USB devices enters into 41 | an agreement with them? They do it via trademark licensing. Usb.org has 42 | registered the trademark "USB", all associated logos and related terms. If 43 | you want to put an USB logo on your product or claim that it is USB 44 | compliant, you must license these trademarks from usb.org. And this is where 45 | you enter into an agreement. See the "USB-IF Trademark License Agreement and 46 | Usage Guidelines for the USB-IF Logo" at 47 | http://www.usb.org/developers/logo_license/. 48 | 49 | Licensing the USB trademarks requires that you buy a USB Vendor-ID from 50 | usb.org (one-time fee of ca. 2,000 USD), that you become a member of usb.org 51 | (yearly fee of ca. 4,000 USD) and that you meet all the technical 52 | specifications from the USB spec. 53 | 54 | This means that most hobbyists and small companies will never be able to 55 | become USB compliant, just because membership is so expensive. And you can't 56 | be compliant with a driver based on V-USB anyway, because the AVR's port pins 57 | don't meet the electrical specifications for USB. So, in principle, all 58 | hobbyists and small companies are free to choose any random numbers for their 59 | IDs. They have nothing to lose... 60 | 61 | There is one exception worth noting, though: If you use a sub-component which 62 | implements USB, the vendor of the sub-components may guarantee USB 63 | compliance. This might apply to some or all of FTDI's solutions. 64 | 65 | 66 | ======================================================================= 67 | WHY SHOULD YOU OBTAIN USB IDs EVEN IF YOU DON'T LICENSE USB TRADEMARKS? 68 | ======================================================================= 69 | 70 | You have learned in the previous section that you are free to choose any 71 | numbers for your IDs anyway. So why not do exactly this? There is still the 72 | technical issue. If you choose IDs which are already in use by somebody else, 73 | operating systems will load the wrong drivers and your device won't work. 74 | Even if you choose IDs which are not currently in use, they may be in use in 75 | the next version of the operating system or even after an automatic update. 76 | 77 | So what you need is a pair of Vendor- and Product-IDs for which you have the 78 | guarantee that no USB compliant product uses them. This implies that no 79 | operating system will ever ship with drivers responsible for these IDs. 80 | 81 | 82 | ============================================== 83 | HOW DOES OBJECTIVE DEVELOPMENT HANDLE USB IDs? 84 | ============================================== 85 | 86 | Objective Development gives away pairs of USB-IDs with their V-USB licenses. 87 | In order to ensure that these IDs are unique, Objective Development has an 88 | agreement with the company/person who has bought the USB Vendor-ID from 89 | usb.org. This agreement ensures that a range of USB Product-IDs is reserved 90 | for assignment by Objective Development and that the owner of the Vendor-ID 91 | won't give it to anybody else. 92 | 93 | This means that you have to trust three parties to ensure uniqueness of 94 | your IDs: 95 | 96 | - Objective Development, that they don't give the same PID to more than 97 | one person. 98 | - The owner of the Vendor-ID that they don't assign PIDs from the range 99 | assigned to Objective Development to anybody else. 100 | - Usb.org that they don't assign the same Vendor-ID a second time. 101 | 102 | 103 | ================================== 104 | WHO IS THE OWNER OF THE VENDOR-ID? 105 | ================================== 106 | 107 | Objective Development has obtained ranges of USB Product-IDs under two 108 | Vendor-IDs: Under Vendor-ID 5824 from Wouter van Ooijen (Van Ooijen 109 | Technische Informatica, www.voti.nl) and under Vendor-ID 8352 from Jason 110 | Kotzin (now flirc.tv, Inc.). Both VID owners have received their Vendor-ID 111 | directly from usb.org. 112 | 113 | 114 | ========================================================================= 115 | CAN I USE USB-IDs FROM OBJECTIVE DEVELOPMENT WITH OTHER DRIVERS/HARDWARE? 116 | ========================================================================= 117 | 118 | The short answer is: Yes. All you get is a guarantee that the IDs are never 119 | assigned to anybody else. What more do you need? 120 | 121 | 122 | ============================ 123 | WHAT ABOUT SHARED ID PAIRS? 124 | ============================ 125 | 126 | Objective Development has reserved some PID/VID pairs for shared use. You 127 | have no guarantee of uniqueness for them, except that no USB compliant device 128 | uses them. In order to avoid technical problems, we must ensure that all 129 | devices with the same pair of IDs use the same driver on kernel level. For 130 | details, see the file USB-IDs-for-free.txt. 131 | 132 | 133 | ====================================================== 134 | I HAVE HEARD THAT SUB-LICENSING OF USB-IDs IS ILLEGAL? 135 | ====================================================== 136 | 137 | A 16 bit integer number cannot be protected by copyright laws. It is not 138 | sufficiently complex. And since none of the parties involved entered into the 139 | USB-IF Trademark License Agreement, we are not bound by this agreement. So 140 | there is no reason why it should be illegal to sub-license USB-IDs. 141 | 142 | 143 | ============================================= 144 | WHO IS LIABLE IF THERE ARE INCOMPATIBILITIES? 145 | ============================================= 146 | 147 | Objective Development disclaims all liabilities which might arise from the 148 | assignment of IDs. If you guarantee product features to your customers 149 | without proper disclaimer, YOU are liable for that. 150 | -------------------------------------------------------------------------------- /lib/TrinketHidCombo/usbdrv/oddebug.c: -------------------------------------------------------------------------------- 1 | /* Name: oddebug.c 2 | * Project: AVR library 3 | * Author: Christian Starkjohann 4 | * Creation Date: 2005-01-16 5 | * Tabsize: 4 6 | * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH 7 | * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) 8 | */ 9 | 10 | #include "oddebug.h" 11 | 12 | #if DEBUG_LEVEL > 0 13 | 14 | #warning "Never compile production devices with debugging enabled" 15 | 16 | static void uartPutc(char c) 17 | { 18 | while(!(ODDBG_USR & (1 << ODDBG_UDRE))); /* wait for data register empty */ 19 | ODDBG_UDR = c; 20 | } 21 | 22 | static uchar hexAscii(uchar h) 23 | { 24 | h &= 0xf; 25 | if(h >= 10) 26 | h += 'a' - (uchar)10 - '0'; 27 | h += '0'; 28 | return h; 29 | } 30 | 31 | static void printHex(uchar c) 32 | { 33 | uartPutc(hexAscii(c >> 4)); 34 | uartPutc(hexAscii(c)); 35 | } 36 | 37 | void odDebug(uchar prefix, uchar *data, uchar len) 38 | { 39 | printHex(prefix); 40 | uartPutc(':'); 41 | while(len--){ 42 | uartPutc(' '); 43 | printHex(*data++); 44 | } 45 | uartPutc('\r'); 46 | uartPutc('\n'); 47 | } 48 | 49 | #endif 50 | -------------------------------------------------------------------------------- /lib/TrinketHidCombo/usbdrv/oddebug.h: -------------------------------------------------------------------------------- 1 | /* Name: oddebug.h 2 | * Project: AVR library 3 | * Author: Christian Starkjohann 4 | * Creation Date: 2005-01-16 5 | * Tabsize: 4 6 | * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH 7 | * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) 8 | */ 9 | 10 | #ifndef __oddebug_h_included__ 11 | #define __oddebug_h_included__ 12 | 13 | /* 14 | General Description: 15 | This module implements a function for debug logs on the serial line of the 16 | AVR microcontroller. Debugging can be configured with the define 17 | 'DEBUG_LEVEL'. If this macro is not defined or defined to 0, all debugging 18 | calls are no-ops. If it is 1, DBG1 logs will appear, but not DBG2. If it is 19 | 2, DBG1 and DBG2 logs will be printed. 20 | 21 | A debug log consists of a label ('prefix') to indicate which debug log created 22 | the output and a memory block to dump in hex ('data' and 'len'). 23 | */ 24 | 25 | 26 | #ifndef F_CPU 27 | # define F_CPU 12000000 /* 12 MHz */ 28 | #endif 29 | 30 | /* make sure we have the UART defines: */ 31 | #include "usbportability.h" 32 | 33 | #ifndef uchar 34 | # define uchar unsigned char 35 | #endif 36 | 37 | #if DEBUG_LEVEL > 0 && !(defined TXEN || defined TXEN0) /* no UART in device */ 38 | # warning "Debugging disabled because device has no UART" 39 | # undef DEBUG_LEVEL 40 | #endif 41 | 42 | #ifndef DEBUG_LEVEL 43 | # define DEBUG_LEVEL 0 44 | #endif 45 | 46 | /* ------------------------------------------------------------------------- */ 47 | 48 | #if DEBUG_LEVEL > 0 49 | # define DBG1(prefix, data, len) odDebug(prefix, data, len) 50 | #else 51 | # define DBG1(prefix, data, len) 52 | #endif 53 | 54 | #if DEBUG_LEVEL > 1 55 | # define DBG2(prefix, data, len) odDebug(prefix, data, len) 56 | #else 57 | # define DBG2(prefix, data, len) 58 | #endif 59 | 60 | /* ------------------------------------------------------------------------- */ 61 | 62 | #if DEBUG_LEVEL > 0 63 | extern void odDebug(uchar prefix, uchar *data, uchar len); 64 | 65 | /* Try to find our control registers; ATMEL likes to rename these */ 66 | 67 | #if defined UBRR 68 | # define ODDBG_UBRR UBRR 69 | #elif defined UBRRL 70 | # define ODDBG_UBRR UBRRL 71 | #elif defined UBRR0 72 | # define ODDBG_UBRR UBRR0 73 | #elif defined UBRR0L 74 | # define ODDBG_UBRR UBRR0L 75 | #endif 76 | 77 | #if defined UCR 78 | # define ODDBG_UCR UCR 79 | #elif defined UCSRB 80 | # define ODDBG_UCR UCSRB 81 | #elif defined UCSR0B 82 | # define ODDBG_UCR UCSR0B 83 | #endif 84 | 85 | #if defined TXEN 86 | # define ODDBG_TXEN TXEN 87 | #else 88 | # define ODDBG_TXEN TXEN0 89 | #endif 90 | 91 | #if defined USR 92 | # define ODDBG_USR USR 93 | #elif defined UCSRA 94 | # define ODDBG_USR UCSRA 95 | #elif defined UCSR0A 96 | # define ODDBG_USR UCSR0A 97 | #endif 98 | 99 | #if defined UDRE 100 | # define ODDBG_UDRE UDRE 101 | #else 102 | # define ODDBG_UDRE UDRE0 103 | #endif 104 | 105 | #if defined UDR 106 | # define ODDBG_UDR UDR 107 | #elif defined UDR0 108 | # define ODDBG_UDR UDR0 109 | #endif 110 | 111 | static inline void odDebugInit(void) 112 | { 113 | ODDBG_UCR |= (1< 38 | #ifndef __IAR_SYSTEMS_ASM__ 39 | # include 40 | #endif 41 | 42 | #define __attribute__(arg) /* not supported on IAR */ 43 | 44 | #ifdef __IAR_SYSTEMS_ASM__ 45 | # define __ASSEMBLER__ /* IAR does not define standard macro for asm */ 46 | #endif 47 | 48 | #ifdef __HAS_ELPM__ 49 | # define PROGMEM __farflash 50 | #else 51 | # define PROGMEM __flash 52 | #endif 53 | 54 | #define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) 55 | 56 | /* The following definitions are not needed by the driver, but may be of some 57 | * help if you port a gcc based project to IAR. 58 | */ 59 | #define cli() __disable_interrupt() 60 | #define sei() __enable_interrupt() 61 | #define wdt_reset() __watchdog_reset() 62 | #define _BV(x) (1 << (x)) 63 | 64 | /* assembler compatibility macros */ 65 | #define nop2 rjmp $+2 /* jump to next instruction */ 66 | #define XL r26 67 | #define XH r27 68 | #define YL r28 69 | #define YH r29 70 | #define ZL r30 71 | #define ZH r31 72 | #define lo8(x) LOW(x) 73 | #define hi8(x) (((x)>>8) & 0xff) /* not HIGH to allow XLINK to make a proper range check */ 74 | 75 | /* Depending on the device you use, you may get problems with the way usbdrv.h 76 | * handles the differences between devices. Since IAR does not use #defines 77 | * for MCU registers, we can't check for the existence of a particular 78 | * register with an #ifdef. If the autodetection mechanism fails, include 79 | * definitions for the required USB_INTR_* macros in your usbconfig.h. See 80 | * usbconfig-prototype.h and usbdrv.h for details. 81 | */ 82 | 83 | /* ------------------------------------------------------------------------- */ 84 | #elif __CODEVISIONAVR__ /* check for CodeVision AVR */ 85 | /* ------------------------------------------------------------------------- */ 86 | /* This port is not working (yet) */ 87 | 88 | /* #define F_CPU _MCU_CLOCK_FREQUENCY_ seems to be defined automatically */ 89 | 90 | #include 91 | #include 92 | 93 | #define __attribute__(arg) /* not supported on IAR */ 94 | 95 | #define PROGMEM __flash 96 | #define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) 97 | 98 | #ifndef __ASSEMBLER__ 99 | static inline void cli(void) 100 | { 101 | #asm("cli"); 102 | } 103 | static inline void sei(void) 104 | { 105 | #asm("sei"); 106 | } 107 | #endif 108 | #define _delay_ms(t) delay_ms(t) 109 | #define _BV(x) (1 << (x)) 110 | #define USB_CFG_USE_SWITCH_STATEMENT 1 /* macro for if() cascase fails for unknown reason */ 111 | 112 | #define macro .macro 113 | #define endm .endmacro 114 | #define nop2 rjmp .+0 /* jump to next instruction */ 115 | 116 | /* ------------------------------------------------------------------------- */ 117 | #else /* default development environment is avr-gcc/avr-libc */ 118 | /* ------------------------------------------------------------------------- */ 119 | 120 | #include 121 | #ifdef __ASSEMBLER__ 122 | # define _VECTOR(N) __vector_ ## N /* io.h does not define this for asm */ 123 | #else 124 | # include 125 | #endif 126 | 127 | #if USB_CFG_DRIVER_FLASH_PAGE 128 | # define USB_READ_FLASH(addr) pgm_read_byte_far(((long)USB_CFG_DRIVER_FLASH_PAGE << 16) | (long)(addr)) 129 | #else 130 | # define USB_READ_FLASH(addr) pgm_read_byte(addr) 131 | #endif 132 | 133 | #define macro .macro 134 | #define endm .endm 135 | #define nop2 rjmp .+0 /* jump to next instruction */ 136 | 137 | #endif /* development environment */ 138 | 139 | /* for conveniecne, ensure that PRG_RDB exists */ 140 | #ifndef PRG_RDB 141 | # define PRG_RDB(addr) USB_READ_FLASH(addr) 142 | #endif 143 | #endif /* __usbportability_h_INCLUDED__ */ 144 | -------------------------------------------------------------------------------- /lib/TrinketHidCombo/usbdrv_includer.c: -------------------------------------------------------------------------------- 1 | /* 2 | this file's purpose is to trick the Arduino IDE into including a file for compilation 3 | 4 | Copyright (c) 2013 Adafruit Industries 5 | All rights reserved. 6 | 7 | TrinketHidCombo is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU Lesser General Public License as 9 | published by the Free Software Foundation, either version 3 of 10 | the License, or (at your option) any later version. 11 | 12 | TrinketHidCombo is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU Lesser General Public License for more details. 16 | 17 | You should have received a copy of the GNU Lesser General Public 18 | License along with TrinketHidCombo. If not, see 19 | . 20 | */ 21 | 22 | #include "cmdline_defs.h" 23 | #include "usbconfig.h" 24 | #include "usbdrv/usbdrv.c" -------------------------------------------------------------------------------- /lib/TrinketHidCombo/usbdrvasm_includer.S: -------------------------------------------------------------------------------- 1 | /* 2 | this file's purpose is to trick the Arduino IDE into including a file for compilation 3 | 4 | Copyright (c) 2013 Adafruit Industries 5 | All rights reserved. 6 | 7 | TrinketHidCombo is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU Lesser General Public License as 9 | published by the Free Software Foundation, either version 3 of 10 | the License, or (at your option) any later version. 11 | 12 | TrinketHidCombo is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU Lesser General Public License for more details. 16 | 17 | You should have received a copy of the GNU Lesser General Public 18 | License along with TrinketHidCombo. If not, see 19 | . 20 | */ 21 | 22 | #include "cmdline_defs.h" 23 | #include "usbconfig.h" 24 | #include "usbdrv/usbdrvasm.S" -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/.vscode/arduino.json: -------------------------------------------------------------------------------- 1 | { 2 | "programmer": "AVR ISP" 3 | } -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/Surface_Dial_attiny.ino: -------------------------------------------------------------------------------- 1 | #include "TrinketHidCombo.h" 2 | 3 | #define PIN_ENCODER_A 2 4 | #define PIN_ENCODER_B 1 5 | #define TRINKET_PINx PINB 6 | #define PIN_ENCODER_SWITCH 5 7 | #define TAPTIC 0 8 | 9 | static uint8_t enc_prev_pos = 0; 10 | static uint8_t enc_flags = 0; 11 | static char sw_was_pressed = 0; 12 | 13 | 14 | int speed_r = 3; 15 | uint8_t rotate_r_R = DIAL_R; 16 | uint8_t rotate_r_L = DIAL_L; 17 | int Taptic_r = 3; 18 | 19 | volatile bool previousButtonValue = false, lastButtonValue = false; 20 | 21 | volatile int previous = 0; 22 | volatile int counter = 0; 23 | 24 | long debounceDelay = 50; 25 | long lastDebounceTime = 0; 26 | 27 | long lastDouble = 0; 28 | long nowDouble = 0; 29 | long ddlDouble=500; 30 | 31 | 32 | 33 | void setup() 34 | { 35 | // set pins as input with internal pull-up resistors enabled 36 | pinMode(PIN_ENCODER_A, INPUT); 37 | pinMode(PIN_ENCODER_B, INPUT); 38 | // digitalWrite(PIN_ENCODER_A, HIGH); 39 | // digitalWrite(PIN_ENCODER_B, HIGH); 40 | 41 | pinMode(TAPTIC, OUTPUT); 42 | 43 | pinMode(PIN_ENCODER_SWITCH, INPUT); 44 | // the switch is active-high, not active-low 45 | // since it shares the pin with Trinket's built-in LED 46 | // the LED acts as a pull-down resistor 47 | // digitalWrite(PIN_ENCODER_SWITCH, LOW); 48 | 49 | TrinketHidCombo.begin(); // start the USB device engine and enumerate 50 | 51 | // get an initial reading on the encoder pins 52 | if (digitalRead(PIN_ENCODER_A) == LOW) { 53 | enc_prev_pos |= (1 << 0); 54 | } 55 | if (digitalRead(PIN_ENCODER_B) == LOW) { 56 | enc_prev_pos |= (1 << 1); 57 | } 58 | } 59 | 60 | 61 | void doubleClick() { 62 | if (rotate_r_R == DIAL_R) { 63 | rotate_r_R = DIAL_R_F; 64 | rotate_r_L = DIAL_L_F; 65 | speed_r = 1; 66 | Taptic_r = 1; 67 | digitalWrite(TAPTIC, HIGH); 68 | delay(3); 69 | digitalWrite(TAPTIC, LOW); 70 | delay(200); 71 | digitalWrite(TAPTIC, HIGH); 72 | delay(3); 73 | digitalWrite(TAPTIC, LOW); 74 | } else if (rotate_r_R == DIAL_R_F) { 75 | rotate_r_R = DIAL_R; 76 | rotate_r_L = DIAL_L; 77 | speed_r = 3; 78 | Taptic_r = 3; 79 | digitalWrite(TAPTIC, HIGH); 80 | delay(3); 81 | digitalWrite(TAPTIC, LOW); 82 | delay(200); 83 | digitalWrite(TAPTIC, HIGH); 84 | delay(3); 85 | digitalWrite(TAPTIC, LOW); 86 | } 87 | } 88 | 89 | void loop() 90 | { 91 | int8_t enc_action = 0; // 1 or -1 if moved, sign is direction 92 | 93 | // note: for better performance, the code will now use 94 | // direct port access techniques 95 | // http://www.arduino.cc/en/Reference/PortManipulation 96 | uint8_t enc_cur_pos = 0; 97 | // read in the encoder state first 98 | if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_A)) { 99 | enc_cur_pos |= (1 << 0); 100 | } 101 | if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_B)) { 102 | enc_cur_pos |= (1 << 1); 103 | } 104 | 105 | // if any rotation at all 106 | if (enc_cur_pos != enc_prev_pos) 107 | { 108 | if (enc_prev_pos == 0x00) 109 | { 110 | // this is the first edge 111 | if (enc_cur_pos == 0x01) { 112 | enc_flags |= (1 << 0); 113 | } 114 | else if (enc_cur_pos == 0x02) { 115 | enc_flags |= (1 << 1); 116 | } 117 | } 118 | 119 | if (enc_cur_pos == 0x03) 120 | { 121 | // this is when the encoder is in the middle of a "step" 122 | enc_flags |= (1 << 4); 123 | } 124 | else if (enc_cur_pos == 0x00) 125 | { 126 | // this is the final edge 127 | if (enc_prev_pos == 0x02) { 128 | enc_flags |= (1 << 2); 129 | } 130 | else if (enc_prev_pos == 0x01) { 131 | enc_flags |= (1 << 3); 132 | } 133 | 134 | // check the first and last edge 135 | // or maybe one edge is missing, if missing then require the middle state 136 | // this will reject bounces and false movements 137 | if (bit_is_set(enc_flags, 0) && (bit_is_set(enc_flags, 2) || bit_is_set(enc_flags, 4))) { 138 | enc_action = 1; 139 | } 140 | else if (bit_is_set(enc_flags, 2) && (bit_is_set(enc_flags, 0) || bit_is_set(enc_flags, 4))) { 141 | enc_action = 1; 142 | } 143 | else if (bit_is_set(enc_flags, 1) && (bit_is_set(enc_flags, 3) || bit_is_set(enc_flags, 4))) { 144 | enc_action = -1; 145 | } 146 | else if (bit_is_set(enc_flags, 3) && (bit_is_set(enc_flags, 1) || bit_is_set(enc_flags, 4))) { 147 | enc_action = -1; 148 | } 149 | 150 | enc_flags = 0; // reset for next time 151 | } 152 | } 153 | 154 | enc_prev_pos = enc_cur_pos; 155 | 156 | if (enc_action > 0) { 157 | TrinketHidCombo.pressMultimediaKey(rotate_r_R); 158 | //Serial.println("R"); 159 | //counter -= speed_r; 160 | digitalWrite(TAPTIC, HIGH); 161 | delay(Taptic_r); 162 | digitalWrite(TAPTIC, LOW); 163 | } 164 | else if (enc_action < 0) { 165 | TrinketHidCombo.pressMultimediaKey(rotate_r_L); 166 | //Serial.println("L"); 167 | //counter += speed_r; 168 | digitalWrite(TAPTIC, HIGH); 169 | delay(Taptic_r); 170 | digitalWrite(TAPTIC, LOW); 171 | } 172 | 173 | // // remember that the switch is active-high 174 | if (bit_is_set(TRINKET_PINx, PIN_ENCODER_SWITCH)) 175 | { 176 | if (sw_was_pressed == 0) // only on initial press, so the keystroke is not repeated while the button is held down 177 | { 178 | TrinketHidCombo.pressMultimediaKey(DIAL_RELEASE); 179 | delay(50); // debounce delay 180 | } 181 | sw_was_pressed = 1; 182 | } 183 | else 184 | { 185 | if (sw_was_pressed != 0) { 186 | TrinketHidCombo.pressMultimediaKey(DIAL_PRESS); 187 | delay(50); // debounce delay 188 | lastDouble = nowDouble; 189 | nowDouble = millis(); 190 | if((nowDouble-lastDouble) debounceDelay) { 204 | // if (buttonValue != previousButtonValue) { 205 | // previousButtonValue = buttonValue; 206 | // if (buttonValue) { 207 | // TrinketHidCombo.pressMultimediaKey(DIAL_PRESS); 208 | // digitalWrite(TAPTIC,HIGH); 209 | // delay(Taptic_r); 210 | // digitalWrite(TAPTIC,LOW); 211 | // lastDouble = nowDouble; 212 | // nowDouble = millis(); 213 | // if((nowDouble-lastDouble) 0) { 137 | TrinketHidCombo.pressMultimediaKey(rotate_r_R); 138 | //Serial.println("R"); 139 | //counter -= speed_r; 140 | } 141 | else if (enc_action < 0) { 142 | TrinketHidCombo.pressMultimediaKey(rotate_r_L); 143 | //Serial.println("L"); 144 | //counter += speed_r; 145 | } 146 | 147 | // // remember that the switch is active-high 148 | if (bit_is_set(TRINKET_PINx, PIN_ENCODER_SWITCH)) 149 | { 150 | if (sw_was_pressed == 0) // only on initial press, so the keystroke is not repeated while the button is held down 151 | { 152 | TrinketHidCombo.pressMultimediaKey(DIAL_RELEASE); 153 | delay(50); // debounce delay 154 | } 155 | sw_was_pressed = 1; 156 | } 157 | else 158 | { 159 | if (sw_was_pressed != 0) { 160 | TrinketHidCombo.pressMultimediaKey(DIAL_PRESS); 161 | delay(50); // debounce delay 162 | lastDouble = nowDouble; 163 | nowDouble = millis(); 164 | if((nowDouble-lastDouble) debounceDelay) { 178 | // if (buttonValue != previousButtonValue) { 179 | // previousButtonValue = buttonValue; 180 | // if (buttonValue) { 181 | // TrinketHidCombo.pressMultimediaKey(DIAL_PRESS); 182 | // digitalWrite(TAPTIC,HIGH); 183 | // delay(Taptic_r); 184 | // digitalWrite(TAPTIC,LOW); 185 | // lastDouble = nowDouble; 186 | // nowDouble = millis(); 187 | // if((nowDouble-lastDouble) it follows Objective Development's V-USB style. 23 | -> you probably shouldn't be changing stuff in there anyway! 24 | -> our usbdrv is hacked with some stuff to handle redirecting PCINT0 25 | 26 | On use of Ruby: 27 | 28 | Micronucleus uses ruby code for some little tasks, especially to aid in testing 29 | and building data for /upgrade/. The stuff in /ruby/ is out of date and doesn't 30 | work very well for uploading programs to devices. It isn't as good at recovering 31 | from errors as the commandline tool. It is mainly a legacy thing. 32 | 33 | The Ruby community has a long established style and all Ruby code in this 34 | repository should be styled in conformance with that. We use 2-space intents. 35 | 36 | We currently write for and use Ruby 2.0, but all the code should work fine with 37 | Ruby 1.9.2 and above, at the time of writing. -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/commandline/49-micronucleus.rules: -------------------------------------------------------------------------------- 1 | # UDEV Rules for Micronucleus boards including the Digispark. 2 | # This file must be placed at: 3 | # 4 | # /etc/udev/rules.d/49-micronucleus.rules (preferred location) 5 | # or 6 | # /lib/udev/rules.d/49-micronucleus.rules (req'd on some broken systems) 7 | # 8 | # After this file is copied, physically unplug and reconnect the board. 9 | # 10 | SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666" 11 | KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1" 12 | # 13 | # If you share your linux system with other users, or just don't like the 14 | # idea of write permission for everybody, you can replace MODE:="0666" with 15 | # OWNER:="yourusername" to create the device owned by you, or with 16 | # GROUP:="somegroupname" and mange access using standard unix groups. 17 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/commandline/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile initially writen for Little-Wire by Omer Kilic 2 | # Later on modified by ihsan Kehribar for Micronucleus bootloader application. 3 | 4 | CC=gcc 5 | 6 | ifeq ($(shell uname), Linux) 7 | USBFLAGS=$(shell libusb-config --cflags) 8 | USBLIBS=$(shell libusb-config --libs) 9 | EXE_SUFFIX = 10 | OSFLAG = -D LINUX 11 | else ifeq ($(shell uname), Darwin) 12 | USBFLAGS=$(shell libusb-config --cflags || libusb-legacy-config --cflags) 13 | USBLIBS=$(shell libusb-config --libs || libusb-legacy-config --libs) 14 | EXE_SUFFIX = 15 | OSFLAG = -D MAC_OS 16 | # Uncomment these to create a static binary: 17 | # USBLIBS = /opt/local/lib/libusb-legacy/libusb-legacy.a 18 | # USBLIBS += -mmacosx-version-min=10.5 19 | # USBLIBS += -framework CoreFoundation 20 | # USBLIBS += -framework IOKit 21 | # Uncomment these to create a dual architecture binary: 22 | # OSFLAG += -arch x86_64 -arch i386 23 | else 24 | USBFLAGS = -I C:\MinGW\include 25 | USBLIBS = -L C:\MinGW\lib -lusb 26 | EXE_SUFFIX = .exe 27 | OSFLAG = -D WIN 28 | endif 29 | 30 | LIBS = $(USBLIBS) 31 | INCLUDE = library 32 | CFLAGS = $(USBFLAGS) $(LIBS) -I$(INCLUDE) -O -g $(OSFLAG) 33 | 34 | LWLIBS = micronucleus_lib littleWire_util 35 | EXAMPLES = micronucleus 36 | 37 | .PHONY: clean library 38 | 39 | all: library $(EXAMPLES) 40 | 41 | library: $(LWLIBS) 42 | 43 | $(LWLIBS): 44 | @echo Building library: $@... 45 | $(CC) $(CFLAGS) -c library/$@.c 46 | 47 | $(EXAMPLES): $(addsuffix .o, $(LWLIBS)) 48 | @echo Building command line tool: $@... 49 | $(CC) $(CFLAGS) -o $@$(EXE_SUFFIX) $@.c $^ $(LIBS) 50 | 51 | clean: 52 | rm -f $(EXAMPLES)$(EXE_SUFFIX) *.o *.exe 53 | 54 | install: all 55 | cp micronucleus /usr/local/bin 56 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/commandline/Readme: -------------------------------------------------------------------------------- 1 | This commandline application for the Micronucleus bootloader is written by 2 | ihsan Kehribar and Bluebie 3 | 4 | It's been tested casually on Mac, Windows, and Linux, and aught to work on all 5 | three. To make and install, do the regular 'make; sudo make install' on unixes. 6 | On windows just 'make' with mingw and do whatever people do with windows exes. 7 | 8 | Usage on Ubuntu: 9 | sudo micronucleus --run name_of_the_file.hex 10 | Usage on Mac: 11 | micronucleus --run name_of_the_file.hex 12 | Usage on Windows 13 | micronucleus.exe --run name_of_the_file.hex 14 | 15 | Raw binary file writing hasn't been tested as much as hex files. 16 | 17 | Every now and then the program fails once it reaches the Writing stage - this is 18 | a known bug - but if you simply rerun the micronucleus command immediately, it 19 | will succeed the second time usually. Most of the time this issue is not present. 20 | 21 | To linux users: sudo is used above because the default configuration under most 22 | modern linux distributions is to not allow userspace apps to communicate 23 | directly to unknown USB devices. You can fix this by installing some config 24 | files, or you can just use sudo. Either way you're going to need root. To 25 | configure your system to allow micronucleus access from non-root users, copy 26 | 49-micronucleus.rules from this folder to /etc/udev/rules.d/ 27 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/commandline/builds/OSX/micronucleus: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/src/Surface_Dial_attiny/micronucleus-1.11/commandline/builds/OSX/micronucleus -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/commandline/builds/Windows/micronucleus.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/src/Surface_Dial_attiny/micronucleus-1.11/commandline/builds/Windows/micronucleus.exe -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/commandline/library/littleWire_util.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | /* Delay in miliseconds */ 4 | void delay(unsigned int duration) { 5 | #if defined _WIN32 || defined _WIN64 6 | // use windows sleep api with milliseconds 7 | // * 2 to make it run at half speed, because windows seems to have some trouble with this... 8 | Sleep(duration * 2); 9 | #else 10 | // use standard unix api with microseconds 11 | usleep(duration*1000); 12 | #endif 13 | } 14 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/commandline/library/littleWire_util.h: -------------------------------------------------------------------------------- 1 | #ifndef LITTLEWIRE_UTIL_H 2 | #define LITTLEWIRE_UTIL_H 3 | 4 | #if defined WIN 5 | #include 6 | #else 7 | #include 8 | #endif 9 | 10 | /* Delay in miliseconds */ 11 | void delay(unsigned int duration); 12 | 13 | // end LITTLEWIRE_UTIL_H section: 14 | #endif 15 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/commandline/library/micronucleus_lib.h: -------------------------------------------------------------------------------- 1 | #ifndef MICRONUCLEUS_LIB_H 2 | #define MICRONUCLEUS_LIB_H 3 | 4 | /* 5 | Created: September 2012 6 | by ihsan Kehribar 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy of 9 | this software and associated documentation files (the "Software"), to deal in 10 | the Software without restriction, including without limitation the rights to 11 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 12 | of the Software, and to permit persons to whom the Software is furnished to do 13 | so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | SOFTWARE. 25 | */ 26 | 27 | /******************************************************************************** 28 | * Header files 29 | ********************************************************************************/ 30 | #if defined WIN 31 | #include // this is libusb, see http://libusb.sourceforge.net/ 32 | #else 33 | #include // this is libusb, see http://libusb.sourceforge.net/ 34 | #endif 35 | //#include "opendevice.h" // common code moved to separate module 36 | #include 37 | #include 38 | #include 39 | /*******************************************************************************/ 40 | 41 | /******************************************************************************** 42 | * USB details 43 | ********************************************************************************/ 44 | #define MICRONUCLEUS_VENDOR_ID 0x16D0 45 | #define MICRONUCLEUS_PRODUCT_ID 0x0753 46 | #define MICRONUCLEUS_USB_TIMEOUT 0xFFFF 47 | #define MICRONUCLEUS_MAX_MAJOR_VERSION 1 48 | /*******************************************************************************/ 49 | 50 | /******************************************************************************** 51 | * Declearations 52 | ********************************************************************************/ 53 | //typedef usb_dev_handle micronucleus; 54 | // representing version number of micronucleus device 55 | typedef struct _micronucleus_version { 56 | unsigned char major; 57 | unsigned char minor; 58 | } micronucleus_version; 59 | 60 | // handle representing one micronucleus device 61 | typedef struct _micronucleus { 62 | usb_dev_handle *device; 63 | // general information about device 64 | micronucleus_version version; 65 | unsigned int flash_size; // programmable size (in bytes) of progmem 66 | unsigned int page_size; // size (in bytes) of page 67 | unsigned int pages; // total number of pages to program 68 | unsigned int write_sleep; // milliseconds 69 | unsigned int erase_sleep; // milliseconds 70 | } micronucleus; 71 | 72 | typedef void (*micronucleus_callback)(float progress); 73 | 74 | /*******************************************************************************/ 75 | 76 | /******************************************************************************** 77 | * Try to connect to the device 78 | * Returns: device handle for success, NULL for fail 79 | ********************************************************************************/ 80 | micronucleus* micronucleus_connect(); 81 | /*******************************************************************************/ 82 | 83 | /******************************************************************************** 84 | * Erase the flash memory 85 | ********************************************************************************/ 86 | int micronucleus_eraseFlash(micronucleus* deviceHandle, micronucleus_callback progress); 87 | /*******************************************************************************/ 88 | 89 | /******************************************************************************** 90 | * Write the flash memory 91 | ********************************************************************************/ 92 | int micronucleus_writeFlash(micronucleus* deviceHandle, unsigned int program_length, 93 | unsigned char* program, micronucleus_callback progress); 94 | /*******************************************************************************/ 95 | 96 | /******************************************************************************** 97 | * Starts the user application 98 | ********************************************************************************/ 99 | int micronucleus_startApp(micronucleus* deviceHandle); 100 | /*******************************************************************************/ 101 | 102 | #endif 103 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/crt1.S: -------------------------------------------------------------------------------- 1 | 2 | /* Copyright (c) 2002, Marek Michalkiewicz 3 | Copyright (c) 2007, 2008 Eric B. Weddington 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright 10 | notice, this list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright 13 | notice, this list of conditions and the following disclaimer in 14 | the documentation and/or other materials provided with the 15 | distribution. 16 | 17 | * Neither the name of the copyright holders nor the names of 18 | contributors may be used to endorse or promote products derived 19 | from this software without specific prior written permission. 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 25 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 | POSSIBILITY OF SUCH DAMAGE. */ 32 | 33 | /* $Id$ */ 34 | 35 | #if (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 3) 36 | #error "GCC version >= 3.3 required" 37 | #endif 38 | 39 | /* 40 | #include IOSYMFILE 41 | #include "macros.inc" 42 | */ 43 | #include 44 | //#include 45 | 46 | #define XJMP rjmp 47 | #define XCALL rcall 48 | 49 | .macro vector name 50 | .weak \name 51 | .set \name, __init 52 | XJMP \name 53 | .endm 54 | 55 | .section .vectors,"ax",@progbits 56 | .global __vectors 57 | .global __bad_interrupt 58 | .func __vectors 59 | __bad_interrupt: 60 | __vectors: 61 | XJMP __init 62 | vector __vector_1 63 | vector __vector_2 64 | vector __vector_3 65 | .endfunc 66 | 67 | /* Handle unexpected interrupts (enabled and no handler), which 68 | usually indicate a bug. Jump to the __vector_default function 69 | if defined by the user, otherwise jump to the reset address. 70 | 71 | This must be in a different section, otherwise the assembler 72 | will resolve "rjmp" offsets and there will be no relocs. */ 73 | 74 | .section .init0,"ax",@progbits 75 | .weak __init 76 | ; .func __init 77 | __init: 78 | 79 | .weak __stack 80 | .set __stack, RAMEND 81 | /* By default, malloc() uses the current value of the stack pointer 82 | minus __malloc_margin as the highest available address. 83 | 84 | In some applications with external SRAM, the stack can be below 85 | the data section (in the internal SRAM - faster), and __heap_end 86 | should be set to the highest address available for malloc(). */ 87 | .weak __heap_end 88 | .set __heap_end, 0 89 | 90 | .section .init2,"ax",@progbits 91 | clr R1 92 | out 0x3f,r1 93 | ldi r28,lo8(__stack) 94 | ldi r29,hi8(__stack) 95 | out 0x3d, r28 96 | out 0x3e, r29 97 | .section .init9,"ax",@progbits 98 | XJMP main 99 | ; .endfunc 100 | 101 | 102 | .section .zerotable,"ax",@progbits 103 | zerovectors: 104 | XJMP __init 105 | XJMP __vector_1 106 | XJMP __vector_2 107 | XJMP __vector_3 108 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/osccalASM.S: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/src/Surface_Dial_attiny/micronucleus-1.11/firmware/osccalASM.S -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/49-micronucleus.rules: -------------------------------------------------------------------------------- 1 | # UDEV Rules for Micronucleus boards including the Digispark. 2 | # This file must be placed at: 3 | # 4 | # /etc/udev/rules.d/49-micronucleus.rules (preferred location) 5 | # or 6 | # /lib/udev/rules.d/49-micronucleus.rules (req'd on some broken systems) 7 | # 8 | # After this file is copied, physically unplug and reconnect the board. 9 | # 10 | SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666" 11 | KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1" 12 | # 13 | # If you share your linux system with other users, or just don't like the 14 | # idea of write permission for everybody, you can replace MODE:="0666" with 15 | # OWNER:="yourusername" to create the device owned by you, or with 16 | # GROUP:="somegroupname" and mange access using standard unix groups. 17 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile initially writen for Little-Wire by Omer Kilic 2 | # Later on modified by ihsan Kehribar for Micronucleus bootloader application. 3 | 4 | CC=gcc 5 | 6 | ifeq ($(shell uname), Linux) 7 | USBFLAGS=$(shell libusb-config --cflags) 8 | USBLIBS=$(shell libusb-config --libs) 9 | EXE_SUFFIX = 10 | OSFLAG = -D LINUX 11 | else ifeq ($(shell uname), Darwin) 12 | USBFLAGS=$(shell libusb-config --cflags || libusb-legacy-config --cflags) 13 | USBLIBS=$(shell libusb-config --libs || libusb-legacy-config --libs) 14 | EXE_SUFFIX = 15 | OSFLAG = -D MAC_OS 16 | # Uncomment these to create a static binary: 17 | # USBLIBS = /opt/local/lib/libusb-legacy/libusb-legacy.a 18 | # USBLIBS += -mmacosx-version-min=10.5 19 | # USBLIBS += -framework CoreFoundation 20 | # USBLIBS += -framework IOKit 21 | # Uncomment these to create a dual architecture binary: 22 | # OSFLAG += -arch x86_64 -arch i386 23 | else 24 | USBFLAGS = -I C:\MinGW\include 25 | USBLIBS = -L C:\MinGW\lib -lusb 26 | EXE_SUFFIX = .exe 27 | OSFLAG = -D WIN 28 | endif 29 | 30 | LIBS = $(USBLIBS) 31 | INCLUDE = library 32 | CFLAGS = $(USBFLAGS) $(LIBS) -I$(INCLUDE) -O -g $(OSFLAG) 33 | 34 | LWLIBS = micronucleus_lib littleWire_util 35 | EXAMPLES = micronucleus 36 | 37 | .PHONY: clean library 38 | 39 | all: library $(EXAMPLES) 40 | 41 | library: $(LWLIBS) 42 | 43 | $(LWLIBS): 44 | @echo Building library: $@... 45 | $(CC) $(CFLAGS) -c library/$@.c 46 | 47 | $(EXAMPLES): $(addsuffix .o, $(LWLIBS)) 48 | @echo Building command line tool: $@... 49 | $(CC) $(CFLAGS) -o $@$(EXE_SUFFIX) $@.c $^ $(LIBS) 50 | 51 | clean: 52 | rm -f $(EXAMPLES)$(EXE_SUFFIX) *.o *.exe 53 | 54 | install: all 55 | cp micronucleus /usr/local/bin 56 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/Readme: -------------------------------------------------------------------------------- 1 | This commandline application for the Micronucleus bootloader is written by 2 | ihsan Kehribar and Bluebie 3 | 4 | It's been tested casually on Mac, Windows, and Linux, and aught to work on all 5 | three. To make and install, do the regular 'make; sudo make install' on unixes. 6 | On windows just 'make' with mingw and do whatever people do with windows exes. 7 | 8 | Usage on Ubuntu: 9 | sudo micronucleus --run name_of_the_file.hex 10 | Usage on Mac: 11 | micronucleus --run name_of_the_file.hex 12 | Usage on Windows 13 | micronucleus.exe --run name_of_the_file.hex 14 | 15 | Raw binary file writing hasn't been tested as much as hex files. 16 | 17 | Every now and then the program fails once it reaches the Writing stage - this is 18 | a known bug - but if you simply rerun the micronucleus command immediately, it 19 | will succeed the second time usually. Most of the time this issue is not present. 20 | 21 | To linux users: sudo is used above because the default configuration under most 22 | modern linux distributions is to not allow userspace apps to communicate 23 | directly to unknown USB devices. You can fix this by installing some config 24 | files, or you can just use sudo. Either way you're going to need root. To 25 | configure your system to allow micronucleus access from non-root users, copy 26 | 49-micronucleus.rules from this folder to /etc/udev/rules.d/ 27 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/builds/OSX/micronucleus: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/builds/OSX/micronucleus -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/builds/Windows/micronucleus.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/builds/Windows/micronucleus.exe -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/library/littleWire_util.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | /* Delay in miliseconds */ 4 | void delay(unsigned int duration) { 5 | #if defined _WIN32 || defined _WIN64 6 | // use windows sleep api with milliseconds 7 | // * 2 to make it run at half speed, because windows seems to have some trouble with this... 8 | Sleep(duration * 2); 9 | #else 10 | // use standard unix api with microseconds 11 | usleep(duration*1000); 12 | #endif 13 | } 14 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/library/littleWire_util.h: -------------------------------------------------------------------------------- 1 | #ifndef LITTLEWIRE_UTIL_H 2 | #define LITTLEWIRE_UTIL_H 3 | 4 | #if defined WIN 5 | #include 6 | #else 7 | #include 8 | #endif 9 | 10 | /* Delay in miliseconds */ 11 | void delay(unsigned int duration); 12 | 13 | // end LITTLEWIRE_UTIL_H section: 14 | #endif 15 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/library/micronucleus_lib.h: -------------------------------------------------------------------------------- 1 | #ifndef MICRONUCLEUS_LIB_H 2 | #define MICRONUCLEUS_LIB_H 3 | 4 | /* 5 | Created: September 2012 6 | by ihsan Kehribar 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy of 9 | this software and associated documentation files (the "Software"), to deal in 10 | the Software without restriction, including without limitation the rights to 11 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 12 | of the Software, and to permit persons to whom the Software is furnished to do 13 | so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | SOFTWARE. 25 | */ 26 | 27 | /******************************************************************************** 28 | * Header files 29 | ********************************************************************************/ 30 | #if defined WIN 31 | #include // this is libusb, see http://libusb.sourceforge.net/ 32 | #else 33 | #include // this is libusb, see http://libusb.sourceforge.net/ 34 | #endif 35 | //#include "opendevice.h" // common code moved to separate module 36 | #include 37 | #include 38 | #include 39 | /*******************************************************************************/ 40 | 41 | /******************************************************************************** 42 | * USB details 43 | ********************************************************************************/ 44 | #define MICRONUCLEUS_VENDOR_ID 0x16D0 45 | #define MICRONUCLEUS_PRODUCT_ID 0x0753 46 | #define MICRONUCLEUS_USB_TIMEOUT 0xFFFF 47 | #define MICRONUCLEUS_MAX_MAJOR_VERSION 1 48 | /*******************************************************************************/ 49 | 50 | /******************************************************************************** 51 | * Declearations 52 | ********************************************************************************/ 53 | //typedef usb_dev_handle micronucleus; 54 | // representing version number of micronucleus device 55 | typedef struct _micronucleus_version { 56 | unsigned char major; 57 | unsigned char minor; 58 | } micronucleus_version; 59 | 60 | // handle representing one micronucleus device 61 | typedef struct _micronucleus { 62 | usb_dev_handle *device; 63 | // general information about device 64 | micronucleus_version version; 65 | unsigned int flash_size; // programmable size (in bytes) of progmem 66 | unsigned int page_size; // size (in bytes) of page 67 | unsigned int pages; // total number of pages to program 68 | unsigned int write_sleep; // milliseconds 69 | unsigned int erase_sleep; // milliseconds 70 | } micronucleus; 71 | 72 | typedef void (*micronucleus_callback)(float progress); 73 | 74 | /*******************************************************************************/ 75 | 76 | /******************************************************************************** 77 | * Try to connect to the device 78 | * Returns: device handle for success, NULL for fail 79 | ********************************************************************************/ 80 | micronucleus* micronucleus_connect(); 81 | /*******************************************************************************/ 82 | 83 | /******************************************************************************** 84 | * Erase the flash memory 85 | ********************************************************************************/ 86 | int micronucleus_eraseFlash(micronucleus* deviceHandle, micronucleus_callback progress); 87 | /*******************************************************************************/ 88 | 89 | /******************************************************************************** 90 | * Write the flash memory 91 | ********************************************************************************/ 92 | int micronucleus_writeFlash(micronucleus* deviceHandle, unsigned int program_length, 93 | unsigned char* program, micronucleus_callback progress); 94 | /*******************************************************************************/ 95 | 96 | /******************************************************************************** 97 | * Starts the user application 98 | ********************************************************************************/ 99 | int micronucleus_startApp(micronucleus* deviceHandle); 100 | /*******************************************************************************/ 101 | 102 | #endif 103 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.03-2secs.hex: -------------------------------------------------------------------------------- 1 | :1017C00022C040C06CC03EC03DC03CC03BC03AC01F 2 | :1017D00039C038C037C036C035C034C033C0040348 3 | :1017E000090412011001FF000008D016530703017D 4 | :1017F000000000010902120001010080320904000A 5 | :1018000000000000000011241FBECFE5D2E0DEBFC3 6 | :10181000CDBF00EB0F9307E00F9310E0A0E6B0E020 7 | :10182000EAECFFE102C005900D92A636B107D9F7A8 8 | :1018300010E0A6E6B0E001C01D92AA39B107E1F7B9 9 | :10184000DFD1C1C3BDCFA82FB92F80E090E041E028 10 | :1018500050EA609530E009C02D91822797958795D1 11 | :1018600010F084279527305EC8F36F5FA8F30895C2 12 | :10187000EADF8D939D930895A6E088279927AA957E 13 | :1018800069F00197E1F3B399FCCFB39BFECF81E000 14 | :101890009927A6B3019611F0A871D9F70895CF93AF 15 | :1018A000CFB7CF93C0915F02C03B21F4C0915E02DD 16 | :1018B000C73021F0CF91CFBFCF9181CFCC27C39537 17 | :1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5 18 | :1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1 19 | :1018E000DF93C0917D00DD27CC57DF4F012EB39BE6 20 | :1018F00003C0DF910F90E6CF2F930F931F934F9369 21 | :101900002FEF4F6F06B303FB20F95F933F9350E037 22 | :101910003BE065C016B30126502953FDC89556B368 23 | :10192000012703FB25F92F7306B3B1F050271027C9 24 | :1019300013FB26F906B22230F0F000C016B30127DF 25 | :1019400003FB27F90126502906B22430E8F54F772A 26 | :10195000206816B30000F6CF50274F7D206206B2F4 27 | :10196000102F000000C006B300265029102713FBDB 28 | :1019700026F906B2E2CF4F7B06B3206400C0DACF6F 29 | :1019800001265029187106B269F14E7F2160012F9E 30 | :1019900016B328C0002650294D7F06B22260102FB2 31 | :1019A00029C0012650294B7F06B22460012F2DC08B 32 | :1019B00016B301265029477F2860000006B22EC0CA 33 | :1019C0004F7E06B3206130C0422706B349930026FC 34 | :1019D0005029102706B24FEF13FB20F9297F16B3C9 35 | :1019E00079F2187159F10126502906B2012703FB3B 36 | :1019F00021F9237F06B371F2002650293150D0F02F 37 | :101A000006B2102713FB22F9277E16B351F20126E6 38 | :101A10005029012703FB06B223F92F7C49F200006D 39 | :101A200006B3102713FB24F90026502906B22F799C 40 | :101A300039F270CF10E21ABF002717C03B50319522 41 | :101A4000C31BD04010E21ABF0881033CF9F00B34ED 42 | :101A5000E9F020917B001981110F1213EDCF0936A7 43 | :101A600051F10D3211F0013E39F7009382003F91A0 44 | :101A70005F914F911F910F912F91DF910F90CAB7F6 45 | :101A8000C5FD1DCFCF91CFBFCF911895209182007A 46 | :101A9000222369F310918000112321F5343022F1C3 47 | :101AA0003093800020937C0010917D003BE0311B3F 48 | :101AB00030937D0019C00091800001309CF40AE54C 49 | :101AC0003091600034FD11C000936000C0E7D0E0A9 50 | :101AD00010C0052710E000C021C0052710E0C89500 51 | :101AE00008BB14C03AE501C032ED032EC0E0D0E0DF 52 | :101AF00032E017B31861C39A08B317BB58E120E866 53 | :101B00004FEF20FF052708BB279517951C3F28F7A7 54 | :101B100000004552B0F720FF0527279508BB179511 55 | :101B20001C3FB8F629913A9561F7077E1091810024 56 | :101B3000110F08BBC250D04011F010937B0010E28F 57 | :101B40001ABF086017B3177E402F477E54E05A959E 58 | :101B5000F1F708BB17BB48BB8ACF81E080936700D1 59 | :101B6000F894E0916E00F0916F00329785E08093D9 60 | :101B70005700E89507B600FCFDCF789408959C01C6 61 | :101B8000E0916E00F0916F00309749F1E430F1057B 62 | :101B9000B1F087E1EC3BF80739F420916A0030910D 63 | :101BA0006B002E5D3B4F0DC087E1EE3BF80749F41B 64 | :101BB00020916C0030916D002D5D3B4F02C02FEDE8 65 | :101BC0003BECF89481E0090180935700E8951124DB 66 | :101BD00078943296F0936F00E0936E00089581E15F 67 | :101BE00080935700E895EBCF8FEF9FEFC8DF809190 68 | :101BF0006E0090916F008F739070892BA9F7ADCF15 69 | :101C000088E10FB6F89481BD11BC0FBEE0E0F0E0B2 70 | :101C1000859194918F5D9B4C39F4E4E0F0E08591DF 71 | :101C200094918F5D9B4C09F0DFDF10926F00109252 72 | :101C30006E00AC9A8BB780628BBFBB9A88E893E149 73 | :101C4000ECE9F1E03197F1F70197D1F7BB9878947F 74 | :101C5000EE24FF2410918000135017FDD0C0809116 75 | :101C60007D00CCE0D0E0C81BD109CC57DF4F80917C 76 | :101C70007C008D3209F08DC0183009F0BEC083ECB5 77 | :101C8000809370008AE5809360001092690028813B 78 | :101C9000822F80769981882309F1992341F482E685 79 | :101CA00090E090937F0080937E0024E068C09130A4 80 | :101CB00051F48C819D8190936F0080936E0027FD7D 81 | :101CC00059C09FEF58C080916600923011F4816036 82 | :101CD00001C084608093660020E051C08A81109228 83 | :101CE0007900992331F410927A0089E790E022E09C 84 | :101CF0003CC0953019F48093810034C0963011F5C2 85 | :101D00008B81813019F482EE97E104C0823041F476 86 | :101D100084EF97E190937F0080937E0022E10EC0D4 87 | :101D2000833059F48A81882341F48EED97E19093B2 88 | :101D30007F0080937E0024E001C020E080E4809357 89 | :101D400069001DC0983019F483E890E009C099300B 90 | :101D500019F48093830006C09A3021F489E790E05B 91 | :101D600021E003C089E790E020E090937F0080931A 92 | :101D70007E0005C09E8180E88093690007C08F8146 93 | :101D8000882319F49E81921708F0922F9093610096 94 | :101D900034C08091690087FF30C080916E009091BF 95 | :101DA0006F00009739F48881998190936B0080933C 96 | :101DB0006A000DC08430910539F48881998190932F 97 | :101DC0006D0080936C0003C0805C974138F488817B 98 | :101DD0009981D5DE125011F02296DFCF80916E00EE 99 | :101DE00090916F008F739070892B39F48091660009 100 | :101DF0008260809366001092610010928000809152 101 | :101E0000600084FF3CC0809161008F3FC1F1182FBA 102 | :101E1000893008F018E0811B809361008091700088 103 | :101E200098E88927809370001123E1F0E0917E000B 104 | :101E3000F0917F008091690086FF09C0912FA1E792 105 | :101E4000B0E084918D9331969150D9F707C0912FCE 106 | :101E5000A1E7B0E081918D939150E1F7F0937F007D 107 | :101E6000E0937E0081E790E0612F02DD612F6C5FDF 108 | :101E70006C3019F08FEF809361006093600094E103 109 | :101E800086B3887131F49150D9F710928100109285 110 | :101E90007B0010E0992309F411E08091680081171C 111 | :101EA00039F0112319F4F8944FD078941093680006 112 | :101EB0008CE991E00197F1F780916600882319F091 113 | :101EC000EE24FF2403C00894E11CF11C182F80FFAE 114 | :101ED00014C0F894E0ECF7E1E054F04083E0809324 115 | :101EE0005700E89507B600FCFDCF3097A9F7109290 116 | :101EF0006F0010926E0078DE789411FF0FC08AE3B5 117 | :101F000090E20197F1F780916E0090916F008F73CE 118 | :101F10009070892B11F068DE01C01FDE12FD08C031 119 | :101F20001092660080E2E8168EE4F80608F492CE7D 120 | :101F300082E291EA0197F1F7F8941BBE15BA10926C 121 | :101F40005F0210925E023ACCFF920F931F93CF93E1 122 | :101F5000DF9380E8F82E00E0C0E0D0E0102F1F0DE6 123 | :101F600011BF8ADC29E0843392070CF0102FF6941D 124 | :101F70002196C830D10511F0012FF0CF115011BFBB 125 | :101F80001F5F012FEC0110C077DC8453994097FF4D 126 | :101F900003C0909581959F4F8C179D0714F401B74E 127 | :101FA000EC0181B78F5F81BF21B730E0812F90E0D6 128 | :101FB00001968217930744F701BFDF91CF911F91DC 129 | :0A1FC0000F91FF900895F894FFCFF1 130 | :061FCA005AFF17BC40089D 131 | :04000003000017C022 132 | :00000001FF 133 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.03-5secs.hex: -------------------------------------------------------------------------------- 1 | :1017C00022C040C06CC03EC03DC03CC03BC03AC01F 2 | :1017D00039C038C037C036C035C034C033C0040348 3 | :1017E000090412011001FF000008D016530703017D 4 | :1017F000000000010902120001010080320904000A 5 | :1018000000000000000011241FBECFE5D2E0DEBFC3 6 | :10181000CDBF00EB0F9307E00F9310E0A0E6B0E020 7 | :10182000EAECFFE102C005900D92A636B107D9F7A8 8 | :1018300010E0A6E6B0E001C01D92AA39B107E1F7B9 9 | :10184000DFD1C1C3BDCFA82FB92F80E090E041E028 10 | :1018500050EA609530E009C02D91822797958795D1 11 | :1018600010F084279527305EC8F36F5FA8F30895C2 12 | :10187000EADF8D939D930895A6E088279927AA957E 13 | :1018800069F00197E1F3B399FCCFB39BFECF81E000 14 | :101890009927A6B3019611F0A871D9F70895CF93AF 15 | :1018A000CFB7CF93C0915F02C03B21F4C0915E02DD 16 | :1018B000C73021F0CF91CFBFCF9181CFCC27C39537 17 | :1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5 18 | :1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1 19 | :1018E000DF93C0917D00DD27CC57DF4F012EB39BE6 20 | :1018F00003C0DF910F90E6CF2F930F931F934F9369 21 | :101900002FEF4F6F06B303FB20F95F933F9350E037 22 | :101910003BE065C016B30126502953FDC89556B368 23 | :10192000012703FB25F92F7306B3B1F050271027C9 24 | :1019300013FB26F906B22230F0F000C016B30127DF 25 | :1019400003FB27F90126502906B22430E8F54F772A 26 | :10195000206816B30000F6CF50274F7D206206B2F4 27 | :10196000102F000000C006B300265029102713FBDB 28 | :1019700026F906B2E2CF4F7B06B3206400C0DACF6F 29 | :1019800001265029187106B269F14E7F2160012F9E 30 | :1019900016B328C0002650294D7F06B22260102FB2 31 | :1019A00029C0012650294B7F06B22460012F2DC08B 32 | :1019B00016B301265029477F2860000006B22EC0CA 33 | :1019C0004F7E06B3206130C0422706B349930026FC 34 | :1019D0005029102706B24FEF13FB20F9297F16B3C9 35 | :1019E00079F2187159F10126502906B2012703FB3B 36 | :1019F00021F9237F06B371F2002650293150D0F02F 37 | :101A000006B2102713FB22F9277E16B351F20126E6 38 | :101A10005029012703FB06B223F92F7C49F200006D 39 | :101A200006B3102713FB24F90026502906B22F799C 40 | :101A300039F270CF10E21ABF002717C03B50319522 41 | :101A4000C31BD04010E21ABF0881033CF9F00B34ED 42 | :101A5000E9F020917B001981110F1213EDCF0936A7 43 | :101A600051F10D3211F0013E39F7009382003F91A0 44 | :101A70005F914F911F910F912F91DF910F90CAB7F6 45 | :101A8000C5FD1DCFCF91CFBFCF911895209182007A 46 | :101A9000222369F310918000112321F5343022F1C3 47 | :101AA0003093800020937C0010917D003BE0311B3F 48 | :101AB00030937D0019C00091800001309CF40AE54C 49 | :101AC0003091600034FD11C000936000C0E7D0E0A9 50 | :101AD00010C0052710E000C021C0052710E0C89500 51 | :101AE00008BB14C03AE501C032ED032EC0E0D0E0DF 52 | :101AF00032E017B31861C39A08B317BB58E120E866 53 | :101B00004FEF20FF052708BB279517951C3F28F7A7 54 | :101B100000004552B0F720FF0527279508BB179511 55 | :101B20001C3FB8F629913A9561F7077E1091810024 56 | :101B3000110F08BBC250D04011F010937B0010E28F 57 | :101B40001ABF086017B3177E402F477E54E05A959E 58 | :101B5000F1F708BB17BB48BB8ACF81E080936700D1 59 | :101B6000F894E0916E00F0916F00329785E08093D9 60 | :101B70005700E89507B600FCFDCF789408959C01C6 61 | :101B8000E0916E00F0916F00309749F1E430F1057B 62 | :101B9000B1F087E1EC3BF80739F420916A0030910D 63 | :101BA0006B002E5D3B4F0DC087E1EE3BF80749F41B 64 | :101BB00020916C0030916D002D5D3B4F02C02FEDE8 65 | :101BC0003BECF89481E0090180935700E8951124DB 66 | :101BD00078943296F0936F00E0936E00089581E15F 67 | :101BE00080935700E895EBCF8FEF9FEFC8DF809190 68 | :101BF0006E0090916F008F739070892BA9F7ADCF15 69 | :101C000088E10FB6F89481BD11BC0FBEE0E0F0E0B2 70 | :101C1000859194918F5D9B4C39F4E4E0F0E08591DF 71 | :101C200094918F5D9B4C09F0DFDF10926F00109252 72 | :101C30006E00AC9A8BB780628BBFBB9A88E893E149 73 | :101C4000ECE9F1E03197F1F70197D1F7BB9878947F 74 | :101C5000EE24FF2410918000135017FDD0C0809116 75 | :101C60007D00CCE0D0E0C81BD109CC57DF4F80917C 76 | :101C70007C008D3209F08DC0183009F0BEC083ECB5 77 | :101C8000809370008AE5809360001092690028813B 78 | :101C9000822F80769981882309F1992341F482E685 79 | :101CA00090E090937F0080937E0024E068C09130A4 80 | :101CB00051F48C819D8190936F0080936E0027FD7D 81 | :101CC00059C09FEF58C080916600923011F4816036 82 | :101CD00001C084608093660020E051C08A81109228 83 | :101CE0007900992331F410927A0089E790E022E09C 84 | :101CF0003CC0953019F48093810034C0963011F5C2 85 | :101D00008B81813019F482EE97E104C0823041F476 86 | :101D100084EF97E190937F0080937E0022E10EC0D4 87 | :101D2000833059F48A81882341F48EED97E19093B2 88 | :101D30007F0080937E0024E001C020E080E4809357 89 | :101D400069001DC0983019F483E890E009C099300B 90 | :101D500019F48093830006C09A3021F489E790E05B 91 | :101D600021E003C089E790E020E090937F0080931A 92 | :101D70007E0005C09E8180E88093690007C08F8146 93 | :101D8000882319F49E81921708F0922F9093610096 94 | :101D900034C08091690087FF30C080916E009091BF 95 | :101DA0006F00009739F48881998190936B0080933C 96 | :101DB0006A000DC08430910539F48881998190932F 97 | :101DC0006D0080936C0003C0805C974138F488817B 98 | :101DD0009981D5DE125011F02296DFCF80916E00EE 99 | :101DE00090916F008F739070892B39F48091660009 100 | :101DF0008260809366001092610010928000809152 101 | :101E0000600084FF3CC0809161008F3FC1F1182FBA 102 | :101E1000893008F018E0811B809361008091700088 103 | :101E200098E88927809370001123E1F0E0917E000B 104 | :101E3000F0917F008091690086FF09C0912FA1E792 105 | :101E4000B0E084918D9331969150D9F707C0912FCE 106 | :101E5000A1E7B0E081918D939150E1F7F0937F007D 107 | :101E6000E0937E0081E790E0612F02DD612F6C5FDF 108 | :101E70006C3019F08FEF809361006093600094E103 109 | :101E800086B3887131F49150D9F710928100109285 110 | :101E90007B0010E0992309F411E08091680081171C 111 | :101EA00039F0112319F4F8944FD078941093680006 112 | :101EB0008CE991E00197F1F780916600882319F091 113 | :101EC000EE24FF2403C00894E11CF11C182F80FFAE 114 | :101ED00014C0F894E0ECF7E1E054F04083E0809324 115 | :101EE0005700E89507B600FCFDCF3097A9F7109290 116 | :101EF0006F0010926E0078DE789411FF0FC08AE3B5 117 | :101F000090E20197F1F780916E0090916F008F73CE 118 | :101F10009070892B11F068DE01C01FDE12FD08C031 119 | :101F20001092660080E5E81683ECF80608F492CE7D 120 | :101F300082E291EA0197F1F7F8941BBE15BA10926C 121 | :101F40005F0210925E023ACCFF920F931F93CF93E1 122 | :101F5000DF9380E8F82E00E0C0E0D0E0102F1F0DE6 123 | :101F600011BF8ADC29E0843392070CF0102FF6941D 124 | :101F70002196C830D10511F0012FF0CF115011BFBB 125 | :101F80001F5F012FEC0110C077DC8453994097FF4D 126 | :101F900003C0909581959F4F8C179D0714F401B74E 127 | :101FA000EC0181B78F5F81BF21B730E0812F90E0D6 128 | :101FB00001968217930744F701BFDF91CF911F91DC 129 | :0A1FC0000F91FF900895F894FFCFF1 130 | :061FCA005AFF17BC40089D 131 | :04000003000017C022 132 | :00000001FF 133 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.04-low-power.hex: -------------------------------------------------------------------------------- 1 | :1017C00022C040C06CC03EC03DC03CC03BC03AC01F 2 | :1017D00039C038C037C036C035C034C033C0040348 3 | :1017E000090412011001FF000008D016530704017C 4 | :1017F000000000010902120001010080320904000A 5 | :1018000000000000000011241FBECFE5D2E0DEBFC3 6 | :10181000CDBF00EB0F9307E00F9310E0A0E6B0E020 7 | :10182000E6EFFFE102C005900D92A636B107D9F7A9 8 | :1018300010E0A6E6B0E001C01D92AC39B107E1F7B7 9 | :10184000DFD1D7C3BDCFA82FB92F80E090E041E012 10 | :1018500050EA609530E009C02D91822797958795D1 11 | :1018600010F084279527305EC8F36F5FA8F30895C2 12 | :10187000EADF8D939D930895A6E088279927AA957E 13 | :1018800069F00197E1F3B399FCCFB39BFECF81E000 14 | :101890009927A6B3019611F0A871D9F70895CF93AF 15 | :1018A000CFB7CF93C0915F02C03B21F4C0915E02DD 16 | :1018B000C73021F0CF91CFBFCF9181CFCC27C39537 17 | :1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5 18 | :1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1 19 | :1018E000DF93C0917F00DD27CA57DF4F012EB39BE6 20 | :1018F00003C0DF910F90E6CF2F930F931F934F9369 21 | :101900002FEF4F6F06B303FB20F95F933F9350E037 22 | :101910003BE065C016B30126502953FDC89556B368 23 | :10192000012703FB25F92F7306B3B1F050271027C9 24 | :1019300013FB26F906B22230F0F000C016B30127DF 25 | :1019400003FB27F90126502906B22430E8F54F772A 26 | :10195000206816B30000F6CF50274F7D206206B2F4 27 | :10196000102F000000C006B300265029102713FBDB 28 | :1019700026F906B2E2CF4F7B06B3206400C0DACF6F 29 | :1019800001265029187106B269F14E7F2160012F9E 30 | :1019900016B328C0002650294D7F06B22260102FB2 31 | :1019A00029C0012650294B7F06B22460012F2DC08B 32 | :1019B00016B301265029477F2860000006B22EC0CA 33 | :1019C0004F7E06B3206130C0422706B349930026FC 34 | :1019D0005029102706B24FEF13FB20F9297F16B3C9 35 | :1019E00079F2187159F10126502906B2012703FB3B 36 | :1019F00021F9237F06B371F2002650293150D0F02F 37 | :101A000006B2102713FB22F9277E16B351F20126E6 38 | :101A10005029012703FB06B223F92F7C49F200006D 39 | :101A200006B3102713FB24F90026502906B22F799C 40 | :101A300039F270CF10E21ABF002717C03B50319522 41 | :101A4000C31BD04010E21ABF0881033CF9F00B34ED 42 | :101A5000E9F020917D001981110F1213EDCF0936A5 43 | :101A600051F10D3211F0013E39F7009384003F919E 44 | :101A70005F914F911F910F912F91DF910F90CAB7F6 45 | :101A8000C5FD1DCFCF91CFBFCF9118952091840078 46 | :101A9000222369F310918200112321F5343022F1C1 47 | :101AA0003093820020937E0010917F003BE0311B39 48 | :101AB00030937F0019C00091820001309CF40AE548 49 | :101AC0003091600034FD11C000936000C2E7D0E0A7 50 | :101AD00010C0052710E000C021C0052710E0C89500 51 | :101AE00008BB14C03AE501C032ED032EC0E0D0E0DF 52 | :101AF00032E017B31861C39A08B317BB58E120E866 53 | :101B00004FEF20FF052708BB279517951C3F28F7A7 54 | :101B100000004552B0F720FF0527279508BB179511 55 | :101B20001C3FB8F629913A9561F7077E1091830022 56 | :101B3000110F08BBC250D04011F010937D0010E28D 57 | :101B40001ABF086017B3177E402F477E54E05A959E 58 | :101B5000F1F708BB17BB48BB8ACF81E080936900CF 59 | :101B6000F894E0917000F0917100329785E08093D5 60 | :101B70005700E89507B600FCFDCF789408959C01C6 61 | :101B8000E0917000F0917100309749F1E430F10577 62 | :101B9000B1F087E1EC3BF80739F420916C0030910B 63 | :101BA0006D002E5D3B4F0DC087E1EE3BF80749F419 64 | :101BB00020916E0030916F002D5D3B4F02C02FEDE4 65 | :101BC0003BECF89481E0090180935700E8951124DB 66 | :101BD00078943296F0937100E0937000089581E15B 67 | :101BE00080935700E895EBCF8FEF9FEFC8DF809190 68 | :101BF0007000909171008F739070892BA9F7ADCF11 69 | :101C000001B788E10FB6F89481BD11BC0FBEE0E0CA 70 | :101C1000F0E0859194918F5D9B4C39F4E4E0F0E025 71 | :101C2000859194918F5D9B4C09F0DEDF10927100DD 72 | :101C300010927000B39B87C180E886BD16BCAC9A39 73 | :101C40008BB780628BBFBB9A88E893E1ECE9F1E047 74 | :101C50003197F1F70197D1F7BB98789410918200F2 75 | :101C6000135017FDD4C080917F00CCE0D0E0C81B9A 76 | :101C7000D109CA57DF4F80917E008D3209F091C0A3 77 | :101C8000183009F0C2C083EC809372008AE580931B 78 | :101C9000600010926B002881822F807699818823C2 79 | :101CA00029F11092670010926600992341F482E6B0 80 | :101CB00090E0909381008093800024E068C0913090 81 | :101CC00051F48C819D81909371008093700027FD69 82 | :101CD00059C09FEF58C080916800923011F4816024 83 | :101CE00001C084608093680020E051C08A81109216 84 | :101CF0007B00992331F410927C008BE790E022E086 85 | :101D00003CC0953019F48093830034C0963011F5AF 86 | :101D10008B81813019F482EE97E104C0823041F466 87 | :101D200084EF97E1909381008093800022E10EC0C0 88 | :101D3000833059F48A81882341F48EED97E19093A2 89 | :101D400081008093800024E001C020E080E4809343 90 | :101D50006B001DC0983019F485E890E009C09930F7 91 | :101D600019F48093850006C09A3021F48BE790E047 92 | :101D700021E003C08BE790E020E090938100809306 93 | :101D8000800005C09E8180E880936B0007C08F8132 94 | :101D9000882319F49E81921708F0922F9093610086 95 | :101DA00034C080916B0087FF30C0809170009091AB 96 | :101DB0007100009739F48881998190936D00809328 97 | :101DC0006C000DC08430910539F48881998190931D 98 | :101DD0006F0080936E0003C0805C974138F4888167 99 | :101DE0009981CDDE125011F02296DFCF80917000E4 100 | :101DF000909171008F739070892B39F480916800F5 101 | :101E0000826080936800109261001092820080913D 102 | :101E1000600084FF3CC0809161008F3FC1F1182FAA 103 | :101E2000893008F018E0811B809361008091720076 104 | :101E300098E88927809372001123E1F0E0918000F7 105 | :101E4000F091810080916B0086FF09C0912FA3E77C 106 | :101E5000B0E084918D9331969150D9F707C0912FBE 107 | :101E6000A3E7B0E081918D939150E1F7F093810069 108 | :101E7000E093800083E790E0612FFADC612F6C5FD4 109 | :101E80006C3019F08FEF809361006093600094E1F3 110 | :101E900086B3887131F49150D9F710928300109273 111 | :101EA0007D0010E0992309F411E080916A00811708 112 | :101EB00039F0112319F4F8945DD0789410936A00E6 113 | :101EC0008CE991E00197F1F78091660090916700AD 114 | :101ED0000196909367008093660080916800182FA8 115 | :101EE00080FF14C0F894E0ECF7E1E054F04083E0A8 116 | :101EF00080935700E89507B600FCFDCF3097A9F70F 117 | :101F000010927100109270006FDE789411FF0FC074 118 | :101F10008AE390E20197F1F780917000909171004F 119 | :101F20008F739070892B11F05FDE01C016DE12FDF9 120 | :101F30000AC0109268008091660090916700885AEC 121 | :101F4000914608F48BCE80E886BD81E086BD03C053 122 | :101F500081B7815081BF81B70817D0F382E291EA3F 123 | :101F60000197F1F7F8941BBE15BA10925F02109218 124 | :101F70005E0224CCFF920F931F93CF93DF9380E8F0 125 | :101F8000F82E00E0C0E0D0E0102F1F0D11BF74DC70 126 | :101F900029E0843392070CF0102FF6942196C83074 127 | :101FA000D10511F0012FF0CF115011BF1F5F012F8C 128 | :101FB000EC0110C061DC8453994097FF03C09095F9 129 | :101FC00081959F4F8C179D0714F401B7EC0181B7E1 130 | :101FD0008F5F81BF21B730E0812F90E0019682179B 131 | :101FE000930744F701BFDF91CF911F910F91FF90AD 132 | :061FF0000895F894FFCFF4 133 | :061FF6005AFF17BC400673 134 | :04000003000017C022 135 | :00000001FF 136 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.04.hex: -------------------------------------------------------------------------------- 1 | :1017C00022C040C06CC03EC03DC03CC03BC03AC01F 2 | :1017D00039C038C037C036C035C034C033C0040348 3 | :1017E000090412011001FF000008D016530704017C 4 | :1017F000000000010902120001010080320904000A 5 | :1018000000000000000011241FBECFE5D2E0DEBFC3 6 | :10181000CDBF00EB0F9307E00F9310E0A0E6B0E020 7 | :10182000E4EDFFE102C005900D92A636B107D9F7AD 8 | :1018300010E0A6E6B0E001C01D92AC39B107E1F7B7 9 | :10184000DFD1C6C3BDCFA82FB92F80E090E041E023 10 | :1018500050EA609530E009C02D91822797958795D1 11 | :1018600010F084279527305EC8F36F5FA8F30895C2 12 | :10187000EADF8D939D930895A6E088279927AA957E 13 | :1018800069F00197E1F3B399FCCFB39BFECF81E000 14 | :101890009927A6B3019611F0A871D9F70895CF93AF 15 | :1018A000CFB7CF93C0915F02C03B21F4C0915E02DD 16 | :1018B000C73021F0CF91CFBFCF9181CFCC27C39537 17 | :1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5 18 | :1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1 19 | :1018E000DF93C0917F00DD27CA57DF4F012EB39BE6 20 | :1018F00003C0DF910F90E6CF2F930F931F934F9369 21 | :101900002FEF4F6F06B303FB20F95F933F9350E037 22 | :101910003BE065C016B30126502953FDC89556B368 23 | :10192000012703FB25F92F7306B3B1F050271027C9 24 | :1019300013FB26F906B22230F0F000C016B30127DF 25 | :1019400003FB27F90126502906B22430E8F54F772A 26 | :10195000206816B30000F6CF50274F7D206206B2F4 27 | :10196000102F000000C006B300265029102713FBDB 28 | :1019700026F906B2E2CF4F7B06B3206400C0DACF6F 29 | :1019800001265029187106B269F14E7F2160012F9E 30 | :1019900016B328C0002650294D7F06B22260102FB2 31 | :1019A00029C0012650294B7F06B22460012F2DC08B 32 | :1019B00016B301265029477F2860000006B22EC0CA 33 | :1019C0004F7E06B3206130C0422706B349930026FC 34 | :1019D0005029102706B24FEF13FB20F9297F16B3C9 35 | :1019E00079F2187159F10126502906B2012703FB3B 36 | :1019F00021F9237F06B371F2002650293150D0F02F 37 | :101A000006B2102713FB22F9277E16B351F20126E6 38 | :101A10005029012703FB06B223F92F7C49F200006D 39 | :101A200006B3102713FB24F90026502906B22F799C 40 | :101A300039F270CF10E21ABF002717C03B50319522 41 | :101A4000C31BD04010E21ABF0881033CF9F00B34ED 42 | :101A5000E9F020917D001981110F1213EDCF0936A5 43 | :101A600051F10D3211F0013E39F7009384003F919E 44 | :101A70005F914F911F910F912F91DF910F90CAB7F6 45 | :101A8000C5FD1DCFCF91CFBFCF9118952091840078 46 | :101A9000222369F310918200112321F5343022F1C1 47 | :101AA0003093820020937E0010917F003BE0311B39 48 | :101AB00030937F0019C00091820001309CF40AE548 49 | :101AC0003091600034FD11C000936000C2E7D0E0A7 50 | :101AD00010C0052710E000C021C0052710E0C89500 51 | :101AE00008BB14C03AE501C032ED032EC0E0D0E0DF 52 | :101AF00032E017B31861C39A08B317BB58E120E866 53 | :101B00004FEF20FF052708BB279517951C3F28F7A7 54 | :101B100000004552B0F720FF0527279508BB179511 55 | :101B20001C3FB8F629913A9561F7077E1091830022 56 | :101B3000110F08BBC250D04011F010937D0010E28D 57 | :101B40001ABF086017B3177E402F477E54E05A959E 58 | :101B5000F1F708BB17BB48BB8ACF81E080936900CF 59 | :101B6000F894E0917000F0917100329785E08093D5 60 | :101B70005700E89507B600FCFDCF789408959C01C6 61 | :101B8000E0917000F0917100309749F1E430F10577 62 | :101B9000B1F087E1EC3BF80739F420916C0030910B 63 | :101BA0006D002E5D3B4F0DC087E1EE3BF80749F419 64 | :101BB00020916E0030916F002D5D3B4F02C02FEDE4 65 | :101BC0003BECF89481E0090180935700E8951124DB 66 | :101BD00078943296F0937100E0937000089581E15B 67 | :101BE00080935700E895EBCF8FEF9FEFC8DF809190 68 | :101BF0007000909171008F739070892BA9F7ADCF11 69 | :101C000088E10FB6F89481BD11BC0FBEE0E0F0E0B2 70 | :101C1000859194918F5D9B4C39F4E4E0F0E08591DF 71 | :101C200094918F5D9B4C09F0DFDF10927100109250 72 | :101C30007000AC9A8BB780628BBFBB9A88E893E147 73 | :101C4000ECE9F1E03197F1F70197D1F7BB9878947F 74 | :101C500010918200135017FDD4C080917F00CCE01A 75 | :101C6000D0E0C81BD109CA57DF4F80917E008D326A 76 | :101C700009F091C0183009F0C2C083EC8093720063 77 | :101C80008AE58093600010926B002881822F807615 78 | :101C90009981882329F11092670010926600992398 79 | :101CA00041F482E690E0909381008093800024E0EC 80 | :101CB00068C0913051F48C819D8190937100809324 81 | :101CC000700027FD59C09FEF58C080916800923086 82 | :101CD00011F4816001C084608093680020E051C0ED 83 | :101CE0008A8110927B00992331F410927C008BE75B 84 | :101CF00090E022E03CC0953019F48093830034C01A 85 | :101D0000963011F58B81813019F482EE97E104C091 86 | :101D1000823041F484EF97E19093810080938000BA 87 | :101D200022E10EC0833059F48A81882341F48EED7C 88 | :101D300097E1909381008093800024E001C020E02F 89 | :101D400080E480936B001DC0983019F485E890E022 90 | :101D500009C0993019F48093850006C09A3021F4A7 91 | :101D60008BE790E021E003C08BE790E020E09093C8 92 | :101D700081008093800005C09E8180E880936B0085 93 | :101D800007C08F81882319F49E81921708F0922F43 94 | :101D90009093610034C080916B0087FF30C08091C8 95 | :101DA000700090917100009739F488819981909327 96 | :101DB0006D0080936C000DC08430910539F48881EA 97 | :101DC000998190936F0080936E0003C0805C97416F 98 | :101DD00038F488819981D3DE125011F02296DFCF3A 99 | :101DE00080917000909171008F739070892B39F4FD 100 | :101DF0008091680082608093680010926100109268 101 | :101E000082008091600084FF3CC0809161008F3F20 102 | :101E1000C1F1182F893008F018E0811B8093610010 103 | :101E20008091720098E88927809372001123E1F075 104 | :101E3000E0918000F091810080916B0086FF09C0E5 105 | :101E4000912FA3E7B0E084918D9331969150D9F70B 106 | :101E500007C0912FA3E7B0E081918D939150E1F7F6 107 | :101E6000F0938100E093800083E790E0612F00DD34 108 | :101E7000612F6C5F6C3019F08FEF8093610060937D 109 | :101E8000600094E186B3887131F49150D9F71092D3 110 | :101E9000830010927D0010E0992309F411E08091F5 111 | :101EA0006A00811739F0112319F4F89452D078940C 112 | :101EB00010936A008CE991E00197F1F78091660038 113 | :101EC00090916700019690936700809366008091DF 114 | :101ED0006800182F80FF14C0F894E0ECF7E1E0549C 115 | :101EE000F04083E080935700E89507B600FCFDCFF3 116 | :101EF0003097A9F7109271001092700075DE7894F7 117 | :101F000011FF0FC08AE390E20197F1F78091700012 118 | :101F1000909171008F739070892B11F065DE01C074 119 | :101F20001CDE12FD0AC0109268008091660090913C 120 | :101F30006700885A914608F48BCE82E291EA0197B5 121 | :101F4000F1F7F8941BBE15BA10925F0210925E0270 122 | :101F500035CCFF920F931F93CF93DF9380E8F82E39 123 | :101F600000E0C0E0D0E0102F1F0D11BF85DC29E09C 124 | :101F7000843392070CF0102FF6942196C830D105C7 125 | :101F800011F0012FF0CF115011BF1F5F012FEC0195 126 | :101F900010C072DC8453994097FF03C090958195DF 127 | :101FA0009F4F8C179D0714F401B7EC0181B78F5F29 128 | :101FB00081BF21B730E0812F90E00196821793070F 129 | :101FC00044F701BFDF91CF911F910F91FF900895CA 130 | :041FD000F894FFCFB3 131 | :061FD4005AFF17BC400695 132 | :04000003000017C022 133 | :00000001FF 134 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.05-jumper.hex: -------------------------------------------------------------------------------- 1 | :1017C00022C040C06CC03EC03DC03CC03BC03AC01F 2 | :1017D00039C038C037C036C035C034C033C0040348 3 | :1017E000090412011001FF000008D016530705017B 4 | :1017F000000000010902120001010080320904000A 5 | :1018000000000000000011241FBECFE5D2E0DEBFC3 6 | :10181000CDBF00EB0F9307E00F9310E0A0E6B0E020 7 | :10182000E0EFFFE102C005900D92A636B107D9F7AF 8 | :1018300010E0A6E6B0E001C01D92AC39B107E1F7B7 9 | :10184000DFD1D4C3BDCFA82FB92F80E090E041E015 10 | :1018500050EA609530E009C02D91822797958795D1 11 | :1018600010F084279527305EC8F36F5FA8F30895C2 12 | :10187000EADF8D939D930895A6E088279927AA957E 13 | :1018800069F00197E1F3B399FCCFB39BFECF81E000 14 | :101890009927A6B3019611F0A871D9F70895CF93AF 15 | :1018A000CFB7CF93C0915F02C03B21F4C0915E02DD 16 | :1018B000C73021F0CF91CFBFCF9181CFCC27C39537 17 | :1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5 18 | :1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1 19 | :1018E000DF93C0917F00DD27CA57DF4F012EB39BE6 20 | :1018F00003C0DF910F90E6CF2F930F931F934F9369 21 | :101900002FEF4F6F06B303FB20F95F933F9350E037 22 | :101910003BE065C016B30126502953FDC89556B368 23 | :10192000012703FB25F92F7306B3B1F050271027C9 24 | :1019300013FB26F906B22230F0F000C016B30127DF 25 | :1019400003FB27F90126502906B22430E8F54F772A 26 | :10195000206816B30000F6CF50274F7D206206B2F4 27 | :10196000102F000000C006B300265029102713FBDB 28 | :1019700026F906B2E2CF4F7B06B3206400C0DACF6F 29 | :1019800001265029187106B269F14E7F2160012F9E 30 | :1019900016B328C0002650294D7F06B22260102FB2 31 | :1019A00029C0012650294B7F06B22460012F2DC08B 32 | :1019B00016B301265029477F2860000006B22EC0CA 33 | :1019C0004F7E06B3206130C0422706B349930026FC 34 | :1019D0005029102706B24FEF13FB20F9297F16B3C9 35 | :1019E00079F2187159F10126502906B2012703FB3B 36 | :1019F00021F9237F06B371F2002650293150D0F02F 37 | :101A000006B2102713FB22F9277E16B351F20126E6 38 | :101A10005029012703FB06B223F92F7C49F200006D 39 | :101A200006B3102713FB24F90026502906B22F799C 40 | :101A300039F270CF10E21ABF002717C03B50319522 41 | :101A4000C31BD04010E21ABF0881033CF9F00B34ED 42 | :101A5000E9F020917D001981110F1213EDCF0936A5 43 | :101A600051F10D3211F0013E39F7009384003F919E 44 | :101A70005F914F911F910F912F91DF910F90CAB7F6 45 | :101A8000C5FD1DCFCF91CFBFCF9118952091840078 46 | :101A9000222369F310918200112321F5343022F1C1 47 | :101AA0003093820020937E0010917F003BE0311B39 48 | :101AB00030937F0019C00091820001309CF40AE548 49 | :101AC0003091600034FD11C000936000C2E7D0E0A7 50 | :101AD00010C0052710E000C021C0052710E0C89500 51 | :101AE00008BB14C03AE501C032ED032EC0E0D0E0DF 52 | :101AF00032E017B31861C39A08B317BB58E120E866 53 | :101B00004FEF20FF052708BB279517951C3F28F7A7 54 | :101B100000004552B0F720FF0527279508BB179511 55 | :101B20001C3FB8F629913A9561F7077E1091830022 56 | :101B3000110F08BBC250D04011F010937D0010E28D 57 | :101B40001ABF086017B3177E402F477E54E05A959E 58 | :101B5000F1F708BB17BB48BB8ACF81E080936900CF 59 | :101B6000F894E0917000F0917100329785E08093D5 60 | :101B70005700E89507B600FCFDCF789408959C01C6 61 | :101B8000E0917000F0917100309749F1E430F10577 62 | :101B9000B1F087E1EC3BF80739F420916C0030910B 63 | :101BA0006D002E5D3B4F0DC087E1EE3BF80749F419 64 | :101BB00020916E0030916F002D5D3B4F02C02FEDE4 65 | :101BC0003BECF89481E0090180935700E8951124DB 66 | :101BD00078943296F0937100E0937000089581E15B 67 | :101BE00080935700E895EBCF8FEF9FEFC8DF809190 68 | :101BF0007000909171008F739070892BA9F7ADCF11 69 | :101C00001F93CF93DF9388E10FB6F89481BD11BC89 70 | :101C10000FBEE0E0F0E0859194918F5D9B4C39F42C 71 | :101C2000E4E0F0E0859194918F5D9B4C09F0DCDF5E 72 | :101C30001092710010927000BD9AC59A82E291EAEA 73 | :101C40000197F1F786B382958695877080FD7DC1F7 74 | :101C5000AC9A8BB780628BBFBB9A88E893E1ECE9C2 75 | :101C6000F1E03197F1F70197D1F7BB987894109193 76 | :101C70008200135017FDD4C080917F00CCE0D0E0EB 77 | :101C8000C81BD109CA57DF4F80917E008D3209F001 78 | :101C900091C0183009F0C2C083EC809372008AE5CD 79 | :101CA0008093600010926B002881822F807699814A 80 | :101CB000882329F11092670010926600992341F45D 81 | :101CC00082E690E0909381008093800024E068C0D9 82 | :101CD000913051F48C819D819093710080937000BC 83 | :101CE00027FD59C09FEF58C080916800923011F4D1 84 | :101CF000816001C084608093680020E051C08A81C7 85 | :101D000010927B00992331F410927C008BE790E0D5 86 | :101D100022E03CC0953019F48093830034C09630A3 87 | :101D200011F58B81813019F482EE97E104C0823085 88 | :101D300041F484EF97E1909381008093800022E149 89 | :101D40000EC0833059F48A81882341F48EED97E1E7 90 | :101D5000909381008093800024E001C020E080E423 91 | :101D600080936B001DC0983019F485E890E009C09D 92 | :101D7000993019F48093850006C09A3021F48BE7DE 93 | :101D800090E021E003C08BE790E020E09093810099 94 | :101D90008093800005C09E8180E880936B0007C01F 95 | :101DA0008F81882319F49E81921708F0922F9093C7 96 | :101DB000610034C080916B0087FF30C0809170005B 97 | :101DC00090917100009739F48881998190936D000A 98 | :101DD00080936C000DC08430910539F4888199811D 99 | :101DE00090936F0080936E0003C0805C974138F43D 100 | :101DF00088819981C4DE125011F02296DFCF809144 101 | :101E00007000909171008F739070892B39F48091DC 102 | :101E100068008260809368001092610010928200D6 103 | :101E20008091600084FF3CC0809161008F3FC1F1D0 104 | :101E3000182F893008F018E0811B80936100809191 105 | :101E4000720098E88927809372001123E1F0E091F5 106 | :101E50008000F091810080916B0086FF09C0912F76 107 | :101E6000A3E7B0E084918D9331969150D9F707C0E4 108 | :101E7000912FA3E7B0E081918D939150E1F7F0931A 109 | :101E80008100E093800083E790E0612FF1DC612F17 110 | :101E90006C5F6C3019F08FEF80936100609360008D 111 | :101EA00094E186B3887131F49150D9F71092830090 112 | :101EB00010927D0010E0992309F411E080916A00EE 113 | :101EC000811739F0112319F4F89451D078941093B4 114 | :101ED0006A008CE991E00197F1F78091660090919A 115 | :101EE0006700019690936700809366008091680078 116 | :101EF000182F80FF14C0F894E0ECF7E1E054F040B4 117 | :101F000083E080935700E89507B600FCFDCF30973B 118 | :101F1000A9F7109271001092700066DE789411FF9C 119 | :101F20000FC08AE390E20197F1F7809170009091E1 120 | :101F300071008F739070892B11F056DE01C00DDE99 121 | :101F400012FD03C01092680092CE82E291EA0197DE 122 | :101F5000F1F718BA17BAF8941BBE15BA10925F02BF 123 | :101F600010925E022BCCDF91CF911F910895FF92CA 124 | :101F70000F931F93CF93DF9380E8F82E00E0C0E02B 125 | :101F8000D0E0102F1F0D11BF77DC29E084339207BA 126 | :101F90000CF0102FF6942196C830D10511F0012FC6 127 | :101FA000F0CF115011BF1F5F012FEC0110C064DC96 128 | :101FB0008453994097FF03C0909581959F4F8C174C 129 | :101FC0009D0714F401B7EC0181B78F5F81BF21B782 130 | :101FD00030E0812F90E001968217930744F701BF0C 131 | :101FE000DF91CF911F910F91FF900895F894FFCF4B 132 | :061FF0005AFF17BC400877 133 | :04000003000017C022 134 | :00000001FF 135 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.05.hex: -------------------------------------------------------------------------------- 1 | :1017C00022C040C06CC03EC03DC03CC03BC03AC01F 2 | :1017D00039C038C037C036C035C034C033C0040348 3 | :1017E000090412011001FF000008D016530705017B 4 | :1017F000000000010902120001010080320904000A 5 | :1018000000000000000011241FBECFE5D2E0DEBFC3 6 | :10181000CDBF00EB0F9307E00F9310E0A0E6B0E020 7 | :10182000E2EEFFE102C005900D92A636B107D9F7AE 8 | :1018300010E0A6E6B0E001C01D92AC39B107E1F7B7 9 | :10184000DFD1CDC3BDCFA82FB92F80E090E041E01C 10 | :1018500050EA609530E009C02D91822797958795D1 11 | :1018600010F084279527305EC8F36F5FA8F30895C2 12 | :10187000EADF8D939D930895A6E088279927AA957E 13 | :1018800069F00197E1F3B399FCCFB39BFECF81E000 14 | :101890009927A6B3019611F0A871D9F70895CF93AF 15 | :1018A000CFB7CF93C0915F02C03B21F4C0915E02DD 16 | :1018B000C73021F0CF91CFBFCF9181CFCC27C39537 17 | :1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5 18 | :1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1 19 | :1018E000DF93C0917F00DD27CA57DF4F012EB39BE6 20 | :1018F00003C0DF910F90E6CF2F930F931F934F9369 21 | :101900002FEF4F6F06B303FB20F95F933F9350E037 22 | :101910003BE065C016B30126502953FDC89556B368 23 | :10192000012703FB25F92F7306B3B1F050271027C9 24 | :1019300013FB26F906B22230F0F000C016B30127DF 25 | :1019400003FB27F90126502906B22430E8F54F772A 26 | :10195000206816B30000F6CF50274F7D206206B2F4 27 | :10196000102F000000C006B300265029102713FBDB 28 | :1019700026F906B2E2CF4F7B06B3206400C0DACF6F 29 | :1019800001265029187106B269F14E7F2160012F9E 30 | :1019900016B328C0002650294D7F06B22260102FB2 31 | :1019A00029C0012650294B7F06B22460012F2DC08B 32 | :1019B00016B301265029477F2860000006B22EC0CA 33 | :1019C0004F7E06B3206130C0422706B349930026FC 34 | :1019D0005029102706B24FEF13FB20F9297F16B3C9 35 | :1019E00079F2187159F10126502906B2012703FB3B 36 | :1019F00021F9237F06B371F2002650293150D0F02F 37 | :101A000006B2102713FB22F9277E16B351F20126E6 38 | :101A10005029012703FB06B223F92F7C49F200006D 39 | :101A200006B3102713FB24F90026502906B22F799C 40 | :101A300039F270CF10E21ABF002717C03B50319522 41 | :101A4000C31BD04010E21ABF0881033CF9F00B34ED 42 | :101A5000E9F020917D001981110F1213EDCF0936A5 43 | :101A600051F10D3211F0013E39F7009384003F919E 44 | :101A70005F914F911F910F912F91DF910F90CAB7F6 45 | :101A8000C5FD1DCFCF91CFBFCF9118952091840078 46 | :101A9000222369F310918200112321F5343022F1C1 47 | :101AA0003093820020937E0010917F003BE0311B39 48 | :101AB00030937F0019C00091820001309CF40AE548 49 | :101AC0003091600034FD11C000936000C2E7D0E0A7 50 | :101AD00010C0052710E000C021C0052710E0C89500 51 | :101AE00008BB14C03AE501C032ED032EC0E0D0E0DF 52 | :101AF00032E017B31861C39A08B317BB58E120E866 53 | :101B00004FEF20FF052708BB279517951C3F28F7A7 54 | :101B100000004552B0F720FF0527279508BB179511 55 | :101B20001C3FB8F629913A9561F7077E1091830022 56 | :101B3000110F08BBC250D04011F010937D0010E28D 57 | :101B40001ABF086017B3177E402F477E54E05A959E 58 | :101B5000F1F708BB17BB48BB8ACF81E080936900CF 59 | :101B6000F894E0917000F0917100329785E08093D5 60 | :101B70005700E89507B600FCFDCF789408959C01C6 61 | :101B8000E0917000F0917100309749F1E430F10577 62 | :101B9000B1F087E1EC3BF80739F420916C0030910B 63 | :101BA0006D002E5D3B4F0DC087E1EE3BF80749F419 64 | :101BB00020916E0030916F002D5D3B4F02C02FEDE4 65 | :101BC0003BECF89481E0090180935700E8951124DB 66 | :101BD00078943296F0937100E0937000089581E15B 67 | :101BE00080935700E895EBCF8FEF9FEFC8DF809190 68 | :101BF0007000909171008F739070892BA9F7ADCF11 69 | :101C00001F93CF93DF9388E10FB6F89481BD11BC89 70 | :101C10000FBEE0E0F0E0859194918F5D9B4C39F42C 71 | :101C2000E4E0F0E0859194918F5D9B4C09F0DCDF5E 72 | :101C30001092710010927000AC9A8BB780628BBFCB 73 | :101C4000BB9A88E893E1ECE9F1E03197F1F701976D 74 | :101C5000D1F7BB98789410918200135017FDD4C02F 75 | :101C600080917F00CCE0D0E0C81BD109CA57DF4F7C 76 | :101C700080917E008D3209F091C0183009F0C2C009 77 | :101C800083EC809372008AE58093600010926B0071 78 | :101C90002881822F80769981882329F1109267000C 79 | :101CA00010926600992341F482E690E090938100BF 80 | :101CB0008093800024E068C0913051F48C819D8134 81 | :101CC000909371008093700027FD59C09FEF58C01A 82 | :101CD00080916800923011F4816001C0846080932B 83 | :101CE000680020E051C08A8110927B00992331F472 84 | :101CF00010927C008BE790E022E03CC0953019F414 85 | :101D00008093830034C0963011F58B81813019F4B3 86 | :101D100082EE97E104C0823041F484EF97E1909322 87 | :101D200081008093800022E10EC0833059F48A81C3 88 | :101D3000882341F48EED97E1909381008093800099 89 | :101D400024E001C020E080E480936B001DC0983047 90 | :101D500019F485E890E009C0993019F48093850062 91 | :101D600006C09A3021F48BE790E021E003C08BE7B6 92 | :101D700090E020E0909381008093800005C09E81D8 93 | :101D800080E880936B0007C08F81882319F49E81BF 94 | :101D9000921708F0922F9093610034C080916B00ED 95 | :101DA00087FF30C08091700090917100009739F4E6 96 | :101DB0008881998190936D0080936C000DC0843070 97 | :101DC000910539F48881998190936F0080936E001A 98 | :101DD00003C0805C974138F488819981D0DE12502D 99 | :101DE00011F02296DFCF80917000909171008F7377 100 | :101DF0009070892B39F4809168008260809368002C 101 | :101E000010926100109282008091600084FF3CC0BB 102 | :101E1000809161008F3FC1F1182F893008F018E0E0 103 | :101E2000811B809361008091720098E889278093DC 104 | :101E300072001123E1F0E0918000F0918100809127 105 | :101E40006B0086FF09C0912FA3E7B0E084918D93CA 106 | :101E500031969150D9F707C0912FA3E7B0E0819157 107 | :101E60008D939150E1F7F0938100E093800083E738 108 | :101E700090E0612FFDDC612F6C5F6C3019F08FEF0B 109 | :101E8000809361006093600094E186B3887131F4BF 110 | :101E90009150D9F71092830010927D0010E09923A1 111 | :101EA00009F411E080916A00811739F0112319F4C7 112 | :101EB000F89456D0789410936A008CE991E00197D9 113 | :101EC000F1F780916600909167000196909367000A 114 | :101ED0008093660080916800182F80FF14C0F894EA 115 | :101EE000E0ECF7E1E054F04083E080935700E895A0 116 | :101EF00007B600FCFDCF3097A9F710927100109241 117 | :101F0000700072DE789411FF0FC08AE390E20197AF 118 | :101F1000F1F780917000909171008F739070892B10 119 | :101F200011F062DE01C019DE12FD0AC010926800D5 120 | :101F300080916600909167008055934C08F48BCE99 121 | :101F400082E291EA0197F1F7F8941BBE15BA10925C 122 | :101F50005F0210925E0232CCDF91CF911F91089503 123 | :101F6000FF920F931F93CF93DF9380E8F82E00E04A 124 | :101F7000C0E0D0E0102F1F0D11BF7EDC29E08433BC 125 | :101F800092070CF0102FF6942196C830D10511F06D 126 | :101F9000012FF0CF115011BF1F5F012FEC0110C0B6 127 | :101FA0006BDC8453994097FF03C0909581959F4FB8 128 | :101FB0008C179D0714F401B7EC0181B78F5F81BFC7 129 | :101FC00021B730E0812F90E001968217930744F704 130 | :101FD00001BFDF91CF911F910F91FF900895F89469 131 | :021FE000FFCF31 132 | :061FE2005AFF17BC400885 133 | :04000003000017C022 134 | :00000001FF 135 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.06-jumper-v2.hex: -------------------------------------------------------------------------------- 1 | :1017800022C040C06CC03EC03DC03CC03BC03AC05F 2 | :1017900039C038C037C036C035C034C033C0040388 3 | :1017A000090412011001FF000008D01653070601BA 4 | :1017B000000000010902120001010080320904004A 5 | :1017C00000000000000011241FBECFE5D2E0DEBF04 6 | :1017D000CDBF00EB0F9307E00F9310E0A0E6B0E061 7 | :1017E000EEEDFFE102C005900D92A636B107D9F7E4 8 | :1017F00010E0A6E6B0E001C01D92AC39B107E1F7F8 9 | :10180000E7D1EBC3BDCFA82FB92F80E090E041E036 10 | :1018100050EA609530E009C02D9182279795879511 11 | :1018200010F084279527305EC8F36F5FA8F3089502 12 | :10183000EADF8D939D930895A6E088279927AA95BE 13 | :1018400069F00197E1F3B399FCCFB39BFECF81E040 14 | :101850009927A6B3019611F0A871D9F70895CF93EF 15 | :10186000CFB7CF93C0915F02C03B21F4C0915E021D 16 | :10187000C73021F0CF91CFBFCF9181CFCC27C39577 17 | :10188000B39BE9F7B39B0BC0B39B09C0B39B07C0E5 18 | :10189000B39B05C0B39B03C0B39B01C0D3C00F92E1 19 | :1018A000DF93C0917F00DD27CA57DF4F012EB39B26 20 | :1018B00003C0DF910F90E6CF2F930F931F934F93A9 21 | :1018C0002FEF4F6F06B303FB20F95F933F9350E078 22 | :1018D0003BE065C016B30126502953FDC89556B3A9 23 | :1018E000012703FB25F92F7306B3B1F0502710270A 24 | :1018F00013FB26F906B22230F0F000C016B3012720 25 | :1019000003FB27F90126502906B22430E8F54F776A 26 | :10191000206816B30000F6CF50274F7D206206B234 27 | :10192000102F000000C006B300265029102713FB1B 28 | :1019300026F906B2E2CF4F7B06B3206400C0DACFAF 29 | :1019400001265029187106B269F14E7F2160012FDE 30 | :1019500016B328C0002650294D7F06B22260102FF2 31 | :1019600029C0012650294B7F06B22460012F2DC0CB 32 | :1019700016B301265029477F2860000006B22EC00A 33 | :101980004F7E06B3206130C0422706B3499300263C 34 | :101990005029102706B24FEF13FB20F9297F16B309 35 | :1019A00079F2187159F10126502906B2012703FB7B 36 | :1019B00021F9237F06B371F2002650293150D0F06F 37 | :1019C00006B2102713FB22F9277E16B351F2012627 38 | :1019D0005029012703FB06B223F92F7C49F20000AE 39 | :1019E00006B3102713FB24F90026502906B22F79DD 40 | :1019F00039F270CF10E21ABF002717C03B50319563 41 | :101A0000C31BD04010E21ABF0881033CF9F00B342D 42 | :101A1000E9F020917D001981110F1213EDCF0936E5 43 | :101A200051F10D3211F0013E39F7009384003F91DE 44 | :101A30005F914F911F910F912F91DF910F90CAB736 45 | :101A4000C5FD1DCFCF91CFBFCF91189520918400B8 46 | :101A5000222369F310918200112321F5343022F101 47 | :101A60003093820020937E0010917F003BE0311B79 48 | :101A700030937F0019C00091820001309CF40AE588 49 | :101A80003091600034FD11C000936000C2E7D0E0E7 50 | :101A900010C0052710E000C021C0052710E0C89540 51 | :101AA00008BB14C03AE501C032ED032EC0E0D0E01F 52 | :101AB00032E017B31861C39A08B317BB58E120E8A6 53 | :101AC0004FEF20FF052708BB279517951C3F28F7E8 54 | :101AD00000004552B0F720FF0527279508BB179552 55 | :101AE0001C3FB8F629913A9561F7077E1091830063 56 | :101AF000110F08BBC250D04011F010937D0010E2CE 57 | :101B00001ABF086017B3177E402F477E54E05A95DE 58 | :101B1000F1F708BB17BB48BB8ACF81E0809369000F 59 | :101B2000F894E0917000F0917100329785E0809315 60 | :101B30005700E89507B600FCFDCF789408959C0106 61 | :101B4000E0917000F0917100309789F1E430F10577 62 | :101B5000F1F087E1EC37F80739F420916C0030910F 63 | :101B60006D002E5B3B4F15C087E1EE37F80739F467 64 | :101B700020916E0030916F002D5B3B4F0AC087E1D2 65 | :101B8000EA37F80731F481B7282F30E002C02FEB95 66 | :101B90003BECF89481E0090180935700E89511240B 67 | :101BA00078943296F0937100E0937000089581E18B 68 | :101BB00080935700E895EBCF8FEF9FEFC0DF8091C8 69 | :101BC0007000909171008F739070892BA9F7A5CF49 70 | :101BD0001F93CF93DF9388E10FB6F89481BD11BCBA 71 | :101BE0000FBEE0E0F0E0859194918F5B9B4C39F45F 72 | :101BF000E4E0F0E0859194918F5B9B4C09F0DCDF91 73 | :101C00001092710010927000C59A82E291EA0197D9 74 | :101C1000F1F7B5997DC1AC9A8BB780628BBFBB9A47 75 | :101C200088E893E1ECE9F1E03197F1F70197D1F71A 76 | :101C3000BB98789410918200135017FDD4C0809106 77 | :101C40007F00CCE0D0E0C81BD109CA57DF4F80919C 78 | :101C50007E008D3209F091C0183009F0C2C083ECCB 79 | :101C6000809372008AE58093600010926B00288157 80 | :101C7000822F80769981882329F110926700109233 81 | :101C80006600992341F482E690E09093810080936E 82 | :101C9000800024E068C0913051F48C819D81909344 83 | :101CA00071008093700027FD59C09FEF58C080914C 84 | :101CB0006800923011F4816001C0846080936800F4 85 | :101CC00020E051C08A8110927B00992331F4109258 86 | :101CD0007C008BE790E022E03CC0953019F48093C3 87 | :101CE000830034C0963011F58B81813019F482EA7B 88 | :101CF00097E104C0823041F484EB97E19093810036 89 | :101D00008093800022E10EC0833059F48A818823B9 90 | :101D100041F48EE997E1909381008093800024E064 91 | :101D200001C020E080E480936B001DC0983019F45E 92 | :101D300085E890E009C0993019F48093850006C0C9 93 | :101D40009A3021F48BE790E021E003C08BE790E02C 94 | :101D500020E0909381008093800005C09E8180E800 95 | :101D600080936B0007C08F81882319F49E8192179E 96 | :101D700008F0922F9093610034C080916B0087FF30 97 | :101D800030C08091700090917100009739F4888183 98 | :101D9000998190936D0080936C000DC08430910503 99 | :101DA00039F48881998190936F0080936E0003C00D 100 | :101DB0008058974138F488819981C1DE125011F022 101 | :101DC0002296DFCF80917000909171008F73907098 102 | :101DD000892B39F4809168008260809368001092AA 103 | :101DE0006100109282008091600084FF3CC080916D 104 | :101DF00061008F3FC1F1182F893008F018E0811B76 105 | :101E0000809361008091720098E889278093720026 106 | :101E10001123E1F0E0918000F091810080916B004E 107 | :101E200086FF09C0912FA3E7B0E084918D9331968E 108 | :101E30009150D9F707C0912FA3E7B0E081918D931E 109 | :101E40009150E1F7F0938100E093800083E790E008 110 | :101E5000612FEEDC612F6C5F6C3019F08FEF809397 111 | :101E600061006093600094E186B3887131F4915011 112 | :101E7000D9F71092830010927D0010E0992309F4A5 113 | :101E800011E080916A00811739F0112319F4F89458 114 | :101E900065D0789410936A008CE991E00197F1F78E 115 | :101EA00080916600909167000196909367008093FF 116 | :101EB000660080916800182F80FF14C0F894E0E855 117 | :101EC000F7E1E054F04083E080935700E89507B6CF 118 | :101ED00000FCFDCF3097A9F71092710010927000AE 119 | :101EE0006BDE789411FF0FC08AE390E20197F1F75F 120 | :101EF00080917000909171008F739070892B11F018 121 | :101F00005BDE01C00ADE12FD03C01092680092CEB3 122 | :101F100082E291EA0197F1F718BAF8941BBE15BA5C 123 | :101F200010925F0210925E02EAE7F7E19491892F26 124 | :101F300081508E3F20F00DC081B7815081BF81B7A5 125 | :101F40009817D0F303C081B78F5F81BF81B789171E 126 | :101F5000D0F314CCDF91CF911F910895FF920F938E 127 | :101F60001F93CF93DF9380E8F82E00E0C0E0D0E02D 128 | :101F7000102F1F0D11BF60DC29E0843392070CF095 129 | :101F8000102FF6942196C830D10511F0012FF0CF13 130 | :101F9000115011BF1F5F012FEC0110C04DDC8453A5 131 | :101FA000994097FF03C0909581959F4F8C179D078F 132 | :101FB00014F401B7EC0181B78F5F81BF21B730E026 133 | :101FC000812F90E001968217930744F701BFDF91BC 134 | :0E1FD000CF911F910F91FF900895F894FFCFCD 135 | :061FDE005AFF177C4008C9 136 | :040000030000178062 137 | :00000001FF 138 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.06.hex: -------------------------------------------------------------------------------- 1 | :1017800022C040C06CC03EC03DC03CC03BC03AC05F 2 | :1017900039C038C037C036C035C034C033C0040388 3 | :1017A000090412011001FF000008D01653070601BA 4 | :1017B000000000010902120001010080320904004A 5 | :1017C00000000000000011241FBECFE5D2E0DEBF04 6 | :1017D000CDBF00EB0F9307E00F9310E0A0E6B0E061 7 | :1017E000ECEDFFE102C005900D92A636B107D9F7E6 8 | :1017F00010E0A6E6B0E001C01D92AC39B107E1F7F8 9 | :10180000E7D1EAC3BDCFA82FB92F80E090E041E037 10 | :1018100050EA609530E009C02D9182279795879511 11 | :1018200010F084279527305EC8F36F5FA8F3089502 12 | :10183000EADF8D939D930895A6E088279927AA95BE 13 | :1018400069F00197E1F3B399FCCFB39BFECF81E040 14 | :101850009927A6B3019611F0A871D9F70895CF93EF 15 | :10186000CFB7CF93C0915F02C03B21F4C0915E021D 16 | :10187000C73021F0CF91CFBFCF9181CFCC27C39577 17 | :10188000B39BE9F7B39B0BC0B39B09C0B39B07C0E5 18 | :10189000B39B05C0B39B03C0B39B01C0D3C00F92E1 19 | :1018A000DF93C0917F00DD27CA57DF4F012EB39B26 20 | :1018B00003C0DF910F90E6CF2F930F931F934F93A9 21 | :1018C0002FEF4F6F06B303FB20F95F933F9350E078 22 | :1018D0003BE065C016B30126502953FDC89556B3A9 23 | :1018E000012703FB25F92F7306B3B1F0502710270A 24 | :1018F00013FB26F906B22230F0F000C016B3012720 25 | :1019000003FB27F90126502906B22430E8F54F776A 26 | :10191000206816B30000F6CF50274F7D206206B234 27 | :10192000102F000000C006B300265029102713FB1B 28 | :1019300026F906B2E2CF4F7B06B3206400C0DACFAF 29 | :1019400001265029187106B269F14E7F2160012FDE 30 | :1019500016B328C0002650294D7F06B22260102FF2 31 | :1019600029C0012650294B7F06B22460012F2DC0CB 32 | :1019700016B301265029477F2860000006B22EC00A 33 | :101980004F7E06B3206130C0422706B3499300263C 34 | :101990005029102706B24FEF13FB20F9297F16B309 35 | :1019A00079F2187159F10126502906B2012703FB7B 36 | :1019B00021F9237F06B371F2002650293150D0F06F 37 | :1019C00006B2102713FB22F9277E16B351F2012627 38 | :1019D0005029012703FB06B223F92F7C49F20000AE 39 | :1019E00006B3102713FB24F90026502906B22F79DD 40 | :1019F00039F270CF10E21ABF002717C03B50319563 41 | :101A0000C31BD04010E21ABF0881033CF9F00B342D 42 | :101A1000E9F020917D001981110F1213EDCF0936E5 43 | :101A200051F10D3211F0013E39F7009384003F91DE 44 | :101A30005F914F911F910F912F91DF910F90CAB736 45 | :101A4000C5FD1DCFCF91CFBFCF91189520918400B8 46 | :101A5000222369F310918200112321F5343022F101 47 | :101A60003093820020937E0010917F003BE0311B79 48 | :101A700030937F0019C00091820001309CF40AE588 49 | :101A80003091600034FD11C000936000C2E7D0E0E7 50 | :101A900010C0052710E000C021C0052710E0C89540 51 | :101AA00008BB14C03AE501C032ED032EC0E0D0E01F 52 | :101AB00032E017B31861C39A08B317BB58E120E8A6 53 | :101AC0004FEF20FF052708BB279517951C3F28F7E8 54 | :101AD00000004552B0F720FF0527279508BB179552 55 | :101AE0001C3FB8F629913A9561F7077E1091830063 56 | :101AF000110F08BBC250D04011F010937D0010E2CE 57 | :101B00001ABF086017B3177E402F477E54E05A95DE 58 | :101B1000F1F708BB17BB48BB8ACF81E0809369000F 59 | :101B2000F894E0917000F0917100329785E0809315 60 | :101B30005700E89507B600FCFDCF789408959C0106 61 | :101B4000E0917000F0917100309789F1E430F10577 62 | :101B5000F1F087E1EC37F80739F420916C0030910F 63 | :101B60006D002E5B3B4F15C087E1EE37F80739F467 64 | :101B700020916E0030916F002D5B3B4F0AC087E1D2 65 | :101B8000EA37F80731F481B7282F30E002C02FEB95 66 | :101B90003BECF89481E0090180935700E89511240B 67 | :101BA00078943296F0937100E0937000089581E18B 68 | :101BB00080935700E895EBCF8FEF9FEFC0DF8091C8 69 | :101BC0007000909171008F739070892BA9F7A5CF49 70 | :101BD0001F93CF93DF9388E10FB6F89481BD11BCBA 71 | :101BE0000FBEE0E0F0E0859194918F5B9B4C39F45F 72 | :101BF000E4E0F0E0859194918F5B9B4C09F0DCDF91 73 | :101C00001092710010927000AC9A8BB780628BBFFB 74 | :101C1000BB9A88E893E1ECE9F1E03197F1F701979D 75 | :101C2000D1F7BB98789410918200135017FDD4C05F 76 | :101C300080917F00CCE0D0E0C81BD109CA57DF4FAC 77 | :101C400080917E008D3209F091C0183009F0C2C039 78 | :101C500083EC809372008AE58093600010926B00A1 79 | :101C60002881822F80769981882329F1109267003C 80 | :101C700010926600992341F482E690E090938100EF 81 | :101C80008093800024E068C0913051F48C819D8164 82 | :101C9000909371008093700027FD59C09FEF58C04A 83 | :101CA00080916800923011F4816001C0846080935B 84 | :101CB000680020E051C08A8110927B00992331F4A2 85 | :101CC00010927C008BE790E022E03CC0953019F444 86 | :101CD0008093830034C0963011F58B81813019F4E4 87 | :101CE00082EA97E104C0823041F484EB97E190935B 88 | :101CF00081008093800022E10EC0833059F48A81F4 89 | :101D0000882341F48EE997E19093810080938000CD 90 | :101D100024E001C020E080E480936B001DC0983077 91 | :101D200019F485E890E009C0993019F48093850092 92 | :101D300006C09A3021F48BE790E021E003C08BE7E6 93 | :101D400090E020E0909381008093800005C09E8108 94 | :101D500080E880936B0007C08F81882319F49E81EF 95 | :101D6000921708F0922F9093610034C080916B001D 96 | :101D700087FF30C08091700090917100009739F416 97 | :101D80008881998190936D0080936C000DC08430A0 98 | :101D9000910539F48881998190936F0080936E004A 99 | :101DA00003C08058974138F488819981C8DE125069 100 | :101DB00011F02296DFCF80917000909171008F73A7 101 | :101DC0009070892B39F4809168008260809368005C 102 | :101DD00010926100109282008091600084FF3CC0EC 103 | :101DE000809161008F3FC1F1182F893008F018E011 104 | :101DF000811B809361008091720098E8892780930D 105 | :101E000072001123E1F0E0918000F0918100809157 106 | :101E10006B0086FF09C0912FA3E7B0E084918D93FA 107 | :101E200031969150D9F707C0912FA3E7B0E0819187 108 | :101E30008D939150E1F7F0938100E093800083E768 109 | :101E400090E0612FF5DC612F6C5F6C3019F08FEF43 110 | :101E5000809361006093600094E186B3887131F4EF 111 | :101E60009150D9F71092830010927D0010E09923D1 112 | :101E700009F411E080916A00811739F0112319F4F7 113 | :101E8000F8946BD0789410936A008CE991E00197F4 114 | :101E9000F1F780916600909167000196909367003A 115 | :101EA0008093660080916800182F80FF14C0F8941A 116 | :101EB000E0E8F7E1E054F04083E080935700E895D4 117 | :101EC00007B600FCFDCF3097A9F710927100109271 118 | :101ED000700072DE789411FF0FC08AE390E20197E0 119 | :101EE000F1F780917000909171008F739070892B41 120 | :101EF00011F062DE01C011DE12FD0AC0109268000E 121 | :101F000080916600909167008055934C08F48BCEC9 122 | :101F100082E291EA0197F1F7F8941BBE15BA10928C 123 | :101F20005F0210925E02EAE7F7E19491892F8150F7 124 | :101F30008E3F20F00DC081B7815081BF81B79817C7 125 | :101F4000D0F303C081B78F5F81BF81B78917D0F30A 126 | :101F500015CCDF91CF911F910895FF920F931F939E 127 | :101F6000CF93DF9380E8F82E00E0C0E0D0E0102FA0 128 | :101F70001F0D11BF61DC29E0843392070CF0102F94 129 | :101F8000F6942196C830D10511F0012FF0CF1150F1 130 | :101F900011BF1F5F012FEC0110C04EDC845399402C 131 | :101FA00097FF03C0909581959F4F8C179D0714F460 132 | :101FB00001B7EC0181B78F5F81BF21B730E0812F7E 133 | :101FC00090E001968217930744F701BFDF91CF910C 134 | :0C1FD0001F910F91FF900895F894FFCF2F 135 | :061FDC005AFF177C4008CB 136 | :040000030000178062 137 | :00000001FF 138 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.10-ledpb1.hex: -------------------------------------------------------------------------------- 1 | :0800000057CC56CC8CCC54CC3B 2 | :1018800017C016C04CC014C009021200010100802C 3 | :101890003209040000000000000012011001FF00E6 4 | :1018A0000008D01653070A010000000104030904D0 5 | :1018B00011241FBECFE5D2E0CDBFDEBF00EB0F93FA 6 | :1018C00007E00F9310E0A0E6B0E0EAEDFFE102C010 7 | :1018D00005900D92A636B107D9F720E0A6E6B0E054 8 | :1018E00001C01D92AB39B207E1F7ECC1A82FB92FA7 9 | :1018F00080E090E041E050EA609530E009C02D9131 10 | :1019000082279795879510F084279527305EC8F336 11 | :101910006F5FA8F30895EADF8D939D930895CF93A9 12 | :10192000CFB7CF93C0915F02C03B21F4C0915E025C 13 | :10193000C73021F0CF91CFBFCF91A1CFCC27C39596 14 | :10194000B39BE9F7B39B0BC0B39B09C0B39B07C024 15 | :10195000B39B05C0B39B03C0B39B01C0D3C00F9220 16 | :10196000DF93C0917E00DD27CB57DF4F012EB39B65 17 | :1019700003C0DF910F90E6CF2F930F931F934F93E8 18 | :101980002FEF4F6F06B303FB20F95F933F9350E0B7 19 | :101990003BE065C016B30126502953FDC89556B3E8 20 | :1019A000012703FB25F92F7306B3B1F05027102749 21 | :1019B00013FB26F906B22230F0F000C016B301275F 22 | :1019C00003FB27F90126502906B22430E8F54F77AA 23 | :1019D000206816B30000F6CF50274F7D206206B274 24 | :1019E000102F000000C006B300265029102713FB5B 25 | :1019F00026F906B2E2CF4F7B06B3206400C0DACFEF 26 | :101A000001265029187106B269F14E7F2160012F1D 27 | :101A100016B328C0002650294D7F06B22260102F31 28 | :101A200029C0012650294B7F06B22460012F2DC00A 29 | :101A300016B301265029477F2860000006B22EC049 30 | :101A40004F7E06B3206130C0422706B3499300267B 31 | :101A50005029102706B24FEF13FB20F9297F16B348 32 | :101A600079F2187159F10126502906B2012703FBBA 33 | :101A700021F9237F06B371F2002650293150D0F0AE 34 | :101A800006B2102713FB22F9277E16B351F2012666 35 | :101A90005029012703FB06B223F92F7C49F20000ED 36 | :101AA00006B3102713FB24F90026502906B22F791C 37 | :101AB00039F270CF10E21ABF002717C03B503195A2 38 | :101AC000C31BD04010E21ABF0881033CF9F00B346D 39 | :101AD000E9F020917C001981110F1213EDCF093626 40 | :101AE00051F10D3211F0013E39F7009383003F911F 41 | :101AF0005F914F911F910F912F91DF910F90CAB776 42 | :101B0000C5FD1DCFCF91CFBFCF91189520918300F8 43 | :101B1000222369F310918100112321F5343022F141 44 | :101B20003093810020937D0010917E003BE0311BBB 45 | :101B300030937E0019C00091810001309CF40AE5C9 46 | :101B40003091600034FD11C000936000C1E7D0E027 47 | :101B500010C0052710E000C021C0052710E0C8957F 48 | :101B600008BB14C03AE501C032ED032EC0E0D0E05E 49 | :101B700032E017B31861C39A08B317BB58E120E8E5 50 | :101B80004FEF20FF052708BB279517951C3F28F727 51 | :101B900000004552B0F720FF0527279508BB179591 52 | :101BA0001C3FB8F629913A9561F7077E10918200A3 53 | :101BB000110F08BBC250D04011F010937C0010E20E 54 | :101BC0001ABF086017B3177E402F477E54E05A951E 55 | :101BD000F1F708BB17BB48BB8ACFF8942FEFB0E8EA 56 | :101BE000A0E44AE0B1BF000081EE9CE0B399FECFD3 57 | :101BF000B39BFECF0197B399FDCF97FF03C0BA1BEC 58 | :101C0000819501C0BA0FA69529F4281710F031B7B5 59 | :101C1000282FA1E0415031F731BF0000789408959A 60 | :101C2000F894E0916A00F0916B00329785E0809320 61 | :101C30005700E89578940895E0916A00F0916B0060 62 | :101C4000309729F490936D0080936C0007C0E430C6 63 | :101C5000F10539F490936F0080936E008FE39CEC54 64 | :101C60001CC0EC3728E1F20739F480916C009091A8 65 | :101C70006D008E539C4F11C0EE3728E1F20739F406 66 | :101C800080916E0090916F008D539C4F06C0EA3793 67 | :101C900028E1F20711F481B790E02FB7F89430975C 68 | :101CA00021F431E130935700E89531E00C01309395 69 | :101CB0005700E89511243296F0936B00E0936A0088 70 | :101CC0002FBF089514BE88E10FB6F89481BD11BCF2 71 | :101CD0000FBEC198BB9A88E893E1ECE9F1E0319737 72 | :101CE000F1F70197D1F7BB98AC9A8BB780628BBFA5 73 | :101CF000789400918100035007FDBAC080917E0066 74 | :101D0000CCE0D0E0C81BD109CB57DF4F80917D00DC 75 | :101D10008D3209F08EC0083009F0A8C083EC8093A2 76 | :101D200071008AE580936000109269002881922FEB 77 | :101D300090768981992319F110926700811108C06A 78 | :101D400082E690E09093800080937F0014E067C06B 79 | :101D5000813051F48C819D8190936B0080936A0057 80 | :101D600027FD58C01FEF57C090916800823011F4D2 81 | :101D7000916001C094609093680010E050C09A8117 82 | :101D800010927A00811106C010927B008AE790E0E1 83 | :101D900012E03BC0853019F4909382002CC086304D 84 | :101DA00009F58B81813019F48AE998E104C0823009 85 | :101DB00041F488E898E19093800080937F0012E1DD 86 | :101DC0000DC0833051F4911108C08CEA98E19093D2 87 | :101DD000800080937F0014E001C010E080E48093D5 88 | :101DE00069001DC0883059F0893019F4909384003F 89 | :101DF00002C08A3039F08AE790E010E006C084E83B 90 | :101E000090E002C08AE790E011E090938000809318 91 | :101E10007F0005C01E8180E88093690007C08F8124 92 | :101E2000811104C08E81811708F4182F109361006E 93 | :101E30001DC08091690087FF19C080916A00909150 94 | :101E40006B008038984128F080916A008F7339F0D8 95 | :101E50000DC089919991F0DE025079F7F5CF80910C 96 | :101E60006800826080936800109261001092810087 97 | :101E70008091600084FF43C0809161008F3F09F42E 98 | :101E80003EC0082F893008F008E0801B8093610075 99 | :101E90008091710098E8892780937100002319F1DF 100 | :101EA000E0917F00F09180008091690086FF0BC077 101 | :101EB000A2E7B0E084918D93319682E790E0800FA5 102 | :101EC0008A13F8CF0CC0CF01A2E7B0E0FC0121914A 103 | :101ED000CF012D9322E730E0200F2A13F7CFF093A4 104 | :101EE0008000E0937F00602F82E790E014DD0C5FBC 105 | :101EF0000C3019F08FEF809361000093600084E153 106 | :101F000096B3987131F48150D9F7109282001092F3 107 | :101F10007C0001E0811100E080917000801739F0B1 108 | :101F2000011103C01092670058DE009370008CE925 109 | :101F300091E00197F1F70091680000FF17C0F89455 110 | :101F4000E0E8F8E1E054F10983E080935700E89578 111 | :101F50003097C1F710926B0010926A0088E0F82E5B 112 | :101F60008FEF9FEF69DEFA94D9F75ADE01FF05C0C3 113 | :101F70008AE390E20197F1F753DE02FF13C0B998AC 114 | :101F800082E291EA0197F1F7F894BB9A1BBE15BA69 115 | :101F900010925F02EAE7F8E1E4918E2F81508E3FC4 116 | :101FA000C0F019C010926800809167008D7011F028 117 | :101FB000B99801C0B99A8091660090916700019626 118 | :101FC000909367008093660080369A4E08F491CE15 119 | :0A1FD000D6CFE1BF000052CC22CFB3 120 | :061FDA005AFF187A4008CE 121 | :040000030000188061 122 | :00000001FF 123 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.10.hex: -------------------------------------------------------------------------------- 1 | :0800000057CC56CC8CCC54CC3B 2 | :1018800017C016C04CC014C009021200010100802C 3 | :101890003209040000000000000012011001FF00E6 4 | :1018A0000008D01653070A010000000104030904D0 5 | :1018B00011241FBECFE5D2E0CDBFDEBF00EB0F93FA 6 | :1018C00007E00F9310E0A0E6B0E0E8ECFFE102C013 7 | :1018D00005900D92A636B107D9F720E0A6E6B0E054 8 | :1018E00001C01D92AB39B207E1F7ECC1A82FB92FA7 9 | :1018F00080E090E041E050EA609530E009C02D9131 10 | :1019000082279795879510F084279527305EC8F336 11 | :101910006F5FA8F30895EADF8D939D930895CF93A9 12 | :10192000CFB7CF93C0915F02C03B21F4C0915E025C 13 | :10193000C73021F0CF91CFBFCF91A1CFCC27C39596 14 | :10194000B39BE9F7B39B0BC0B39B09C0B39B07C024 15 | :10195000B39B05C0B39B03C0B39B01C0D3C00F9220 16 | :10196000DF93C0917E00DD27CB57DF4F012EB39B65 17 | :1019700003C0DF910F90E6CF2F930F931F934F93E8 18 | :101980002FEF4F6F06B303FB20F95F933F9350E0B7 19 | :101990003BE065C016B30126502953FDC89556B3E8 20 | :1019A000012703FB25F92F7306B3B1F05027102749 21 | :1019B00013FB26F906B22230F0F000C016B301275F 22 | :1019C00003FB27F90126502906B22430E8F54F77AA 23 | :1019D000206816B30000F6CF50274F7D206206B274 24 | :1019E000102F000000C006B300265029102713FB5B 25 | :1019F00026F906B2E2CF4F7B06B3206400C0DACFEF 26 | :101A000001265029187106B269F14E7F2160012F1D 27 | :101A100016B328C0002650294D7F06B22260102F31 28 | :101A200029C0012650294B7F06B22460012F2DC00A 29 | :101A300016B301265029477F2860000006B22EC049 30 | :101A40004F7E06B3206130C0422706B3499300267B 31 | :101A50005029102706B24FEF13FB20F9297F16B348 32 | :101A600079F2187159F10126502906B2012703FBBA 33 | :101A700021F9237F06B371F2002650293150D0F0AE 34 | :101A800006B2102713FB22F9277E16B351F2012666 35 | :101A90005029012703FB06B223F92F7C49F20000ED 36 | :101AA00006B3102713FB24F90026502906B22F791C 37 | :101AB00039F270CF10E21ABF002717C03B503195A2 38 | :101AC000C31BD04010E21ABF0881033CF9F00B346D 39 | :101AD000E9F020917C001981110F1213EDCF093626 40 | :101AE00051F10D3211F0013E39F7009383003F911F 41 | :101AF0005F914F911F910F912F91DF910F90CAB776 42 | :101B0000C5FD1DCFCF91CFBFCF91189520918300F8 43 | :101B1000222369F310918100112321F5343022F141 44 | :101B20003093810020937D0010917E003BE0311BBB 45 | :101B300030937E0019C00091810001309CF40AE5C9 46 | :101B40003091600034FD11C000936000C1E7D0E027 47 | :101B500010C0052710E000C021C0052710E0C8957F 48 | :101B600008BB14C03AE501C032ED032EC0E0D0E05E 49 | :101B700032E017B31861C39A08B317BB58E120E8E5 50 | :101B80004FEF20FF052708BB279517951C3F28F727 51 | :101B900000004552B0F720FF0527279508BB179591 52 | :101BA0001C3FB8F629913A9561F7077E10918200A3 53 | :101BB000110F08BBC250D04011F010937C0010E20E 54 | :101BC0001ABF086017B3177E402F477E54E05A951E 55 | :101BD000F1F708BB17BB48BB8ACFF8942FEFB0E8EA 56 | :101BE000A0E44AE0B1BF000081EE9CE0B399FECFD3 57 | :101BF000B39BFECF0197B399FDCF97FF03C0BA1BEC 58 | :101C0000819501C0BA0FA69529F4281710F031B7B5 59 | :101C1000282FA1E0415031F731BF0000789408959A 60 | :101C2000F894E0916A00F0916B00329785E0809320 61 | :101C30005700E89578940895E0916A00F0916B0060 62 | :101C4000309729F490936D0080936C0007C0E430C6 63 | :101C5000F10539F490936F0080936E008FE39CEC54 64 | :101C60001CC0EC3728E1F20739F480916C009091A8 65 | :101C70006D008E539C4F11C0EE3728E1F20739F406 66 | :101C800080916E0090916F008D539C4F06C0EA3793 67 | :101C900028E1F20711F481B790E02FB7F89430975C 68 | :101CA00021F431E130935700E89531E00C01309395 69 | :101CB0005700E89511243296F0936B00E0936A0088 70 | :101CC0002FBF089514BE88E10FB6F89481BD11BCF2 71 | :101CD0000FBEBB9A88E893E1ECE9F1E03197F1F7A8 72 | :101CE0000197D1F7BB98AC9A8BB780628BBF789481 73 | :101CF00000918100035007FDBAC080917E00CCE0C6 74 | :101D0000D0E0C81BD109CB57DF4F80917D008D32C9 75 | :101D100009F08EC0083009F0A8C083EC80937100F0 76 | :101D20008AE580936000109269002881922F907656 77 | :101D30008981992319F110926700811108C082E608 78 | :101D400090E09093800080937F0014E067C0813022 79 | :101D500051F48C819D8190936B0080936A0027FDE4 80 | :101D600058C01FEF57C090916800823011F4916005 81 | :101D700001C094609093680010E050C09A81109266 82 | :101D80007A00811106C010927B008AE790E012E091 83 | :101D90003BC0853019F4909382002CC0863009F541 84 | :101DA0008B81813019F48AE998E104C0823041F4D2 85 | :101DB00088E898E19093800080937F0012E10DC045 86 | :101DC000833051F4911108C08CEA98E1909380001F 87 | :101DD00080937F0014E001C010E080E480936900EC 88 | :101DE0001DC0883059F0893019F49093840002C0E6 89 | :101DF0008A3039F08AE790E010E006C084E890E08D 90 | :101E000002C08AE790E011E09093800080937F0009 91 | :101E100005C01E8180E88093690007C08F81811111 92 | :101E200004C08E81811708F4182F109361001DC023 93 | :101E30008091690087FF19C080916A0090916B00C2 94 | :101E40008038984128F080916A008F7339F00DC076 95 | :101E500089919991F1DE025079F7F5CF8091680070 96 | :101E600082608093680010926100109281008091DE 97 | :101E7000600084FF43C0809161008F3F09F43EC041 98 | :101E8000082F893008F008E0801B80936100809162 99 | :101E9000710098E8892780937100002319F1E0917F 100 | :101EA0007F00F09180008091690086FF0BC0A2E75F 101 | :101EB000B0E084918D93319682E790E0800F8A1391 102 | :101EC000F8CF0CC0CF01A2E7B0E0FC012191CF0117 103 | :101ED0002D9322E730E0200F2A13F7CFF0938000F4 104 | :101EE000E0937F00602F82E790E015DD0C5F0C30FF 105 | :101EF00019F08FEF809361000093600084E196B346 106 | :101F0000987131F48150D9F71092820010927C00C0 107 | :101F100001E0811100E080917000801739F001111B 108 | :101F200003C01092670059DE009370008CE991E0C5 109 | :101F30000197F1F70091680000FF17C0F894E0E8FE 110 | :101F4000F8E1E054F10983E080935700E895309779 111 | :101F5000C1F710926B0010926A0088E0F82E8FEFA4 112 | :101F60009FEF6ADEFA94D9F75BDE01FF05C08AE3D2 113 | :101F700090E20197F1F754DE02FF12C082E291EA8B 114 | :101F80000197F1F7F894BB9A1BBE15BA10925F0245 115 | :101F9000EAE7F8E1E4918E2F81508E3F88F012C07D 116 | :101FA000109268008091660090916700019690936E 117 | :101FB00067008093660080369A4E08F499CEDECF93 118 | :081FC000E1BF00005BCC2ACF59 119 | :061FC8005AFF187A4008E0 120 | :040000030000188061 121 | :00000001FF 122 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.11-entry_ext_reset.hex: -------------------------------------------------------------------------------- 1 | :0800000077CC76CCACCC74CCBB 2 | :1018C00017C016C04CC014C00902120001010080EC 3 | :1018D0003209040000000000000012011001FF00A6 4 | :1018E0000008D01653070B0100000001040309048F 5 | :1018F00011241FBECFE5D2E0CDBFDEBF00EB0F93BA 6 | :1019000007E00F9310E0A0E6B0E0E8EEFFE102C0D0 7 | :1019100005900D92A636B107D9F720E0A6E6B0E013 8 | :1019200001C01D92A639B207E1F7E2C1A82FB92F75 9 | :1019300080E090E041E050EA609530E009C02D91F0 10 | :1019400082279795879510F084279527305EC8F3F6 11 | :101950006F5FA8F30895EADF8D939D930895CF9369 12 | :10196000CFB7CF93C0915F02C03B21F4C0915E021C 13 | :10197000C73021F0CF91CFBFCF91A1CFCC27C39556 14 | :10198000B39BE9F7B39B0BC0B39B09C0B39B07C0E4 15 | :10199000B39B05C0B39B03C0B39B01C0D3C00F92E0 16 | :1019A000DF93C0917900DD27C058DF4F012EB39B34 17 | :1019B00003C0DF910F90E6CF2F930F931F934F93A8 18 | :1019C0002FEF4F6F06B303FB20F95F933F9350E077 19 | :1019D0003BE065C016B30126502953FDC89556B3A8 20 | :1019E000012703FB25F92F7306B3B1F05027102709 21 | :1019F00013FB26F906B22230F0F000C016B301271F 22 | :101A000003FB27F90126502906B22430E8F54F7769 23 | :101A1000206816B30000F6CF50274F7D206206B233 24 | :101A2000102F000000C006B300265029102713FB1A 25 | :101A300026F906B2E2CF4F7B06B3206400C0DACFAE 26 | :101A400001265029187106B269F14E7F2160012FDD 27 | :101A500016B328C0002650294D7F06B22260102FF1 28 | :101A600029C0012650294B7F06B22460012F2DC0CA 29 | :101A700016B301265029477F2860000006B22EC009 30 | :101A80004F7E06B3206130C0422706B3499300263B 31 | :101A90005029102706B24FEF13FB20F9297F16B308 32 | :101AA00079F2187159F10126502906B2012703FB7A 33 | :101AB00021F9237F06B371F2002650293150D0F06E 34 | :101AC00006B2102713FB22F9277E16B351F2012626 35 | :101AD0005029012703FB06B223F92F7C49F20000AD 36 | :101AE00006B3102713FB24F90026502906B22F79DC 37 | :101AF00039F270CF10E21ABF002717C03B50319562 38 | :101B0000C31BD04010E21ABF0881033CF9F00B342C 39 | :101B1000E9F0209177001981110F1213EDCF0936EA 40 | :101B200051F10D3211F0013E39F700937E003F91E3 41 | :101B30005F914F911F910F912F91DF910F90CAB735 42 | :101B4000C5FD1DCFCF91CFBFCF91189520917E00BD 43 | :101B5000222369F310917C00112321F5343022F106 44 | :101B600030937C0020937800109179003BE0311B8A 45 | :101B70003093790019C000917C0001309CF40AE593 46 | :101B80003091600034FD11C000936000CCE6D0E0DD 47 | :101B900010C0052710E000C021C0052710E0C8953F 48 | :101BA00008BB14C03AE501C032ED032EC0E0D0E01E 49 | :101BB00032E017B31861C39A08B317BB58E120E8A5 50 | :101BC0004FEF20FF052708BB279517951C3F28F7E7 51 | :101BD00000004552B0F720FF0527279508BB179551 52 | :101BE0001C3FB8F629913A9561F7077E10917D0068 53 | :101BF000110F08BBC250D04011F01093770010E2D3 54 | :101C00001ABF086017B3177E402F477E54E05A95DD 55 | :101C1000F1F708BB17BB48BB8ACFF8942FEFB0E8A9 56 | :101C2000A0E44AE0B1BF000081EE9CE0B399FECF92 57 | :101C3000B39BFECF0197B399FDCF97FF03C0BA1BAB 58 | :101C4000819501C0BA0FA69529F4281710F031B775 59 | :101C5000282FA1E0415031F731BF0000789408955A 60 | :101C6000F894F201329785E080935700E8957894D4 61 | :101C70000895F201309729F49093680080936700EB 62 | :101C800007C0E430F10539F490936A00809369004D 63 | :101C90008FE59CEC1FC02CEB421628E1520639F46C 64 | :101CA00080916700909168008E559C4F13C02EEB79 65 | :101CB000421628E1520639F48091690090916A0039 66 | :101CC0008D559C4F07C02AEB421628E1520611F4AD 67 | :101CD00081B790E02FB7F89431E00C0130935700B2 68 | :101CE000E89511242F0182E0480E511C2FBF089562 69 | :101CF00004B601FC14C0EDEBF8E1E491EF3F79F09C 70 | :101D0000F894BB9A1BBE15BA10925F02EAEBF8E199 71 | :101D1000E4918E2F81508E3F08F462C163C114BEDE 72 | :101D200088E181BD87E081BDBB9A88E893E1ECE959 73 | :101D3000F1E03197F1F70197D1F7BB98AC9A8BB7E7 74 | :101D400080628BBF7894712C8CE991E00197F1F758 75 | :101D5000A895312C60917C00162F135017FDB2C04E 76 | :101D600080917900CCE0D0E0C81BD109C058DF4F8A 77 | :101D70006150CE01DBDD8E3F9F4409F0A1C0809110 78 | :101D800078008D3209F085C0183009F099C083ECD5 79 | :101D900080936C008AE580936000109266009881C1 80 | :101DA000292F207689812223D1F0712C811108C03E 81 | :101DB00082E690E090937B0080937A0024E05FC0FD 82 | :101DC000813051F481E180935700E8954C805D802B 83 | :101DD00097FD50C02FEF4FC0382E20E050C09A81A1 84 | :101DE00010927500811106C01092760085E790E090 85 | :101DF00022E03BC0853019F490937D002CC08630E2 86 | :101E000009F58B81813019F48AED98E104C08230A4 87 | :101E100041F488EC98E190937B0080937A0022E172 88 | :101E20000DC0833051F4911108C08CEE98E190936D 89 | :101E30007B0080937A0024E001C020E080E480935E 90 | :101E400066001DC0883059F0893019F490937F00E6 91 | :101E500002C08A3039F085E790E020E006C08FE7C5 92 | :101E600090E002C085E790E021E090937B008093B2 93 | :101E70007A0005C02E8180E88093660007C08F81BC 94 | :101E8000811104C08E81821708F4282F20936100ED 95 | :101E900017C08091660087FF13C080EC481688E168 96 | :101EA000580620F0842D8F7339F00AC089919991DA 97 | :101EB000E0DE125091F7F6CF95E0392E10926100D6 98 | :101EC00010927C008091600084FF42C0809161008C 99 | :101ED0008F3F09F43DC0182F893008F018E0811BAE 100 | :101EE0008093610080916C0098E8892780936C0052 101 | :101EF000112311F1E0917A00F0917B00809166004E 102 | :101F000086FF0BC0ADE6B0E084918D9331968DE6EF 103 | :101F100090E0810F8A13F8CF0BC0EF01ADE6B0E07F 104 | :101F200089918D93FE018DE690E0810F8A13F8CFA1 105 | :101F3000F0937B00E0937A00612F8DE690E00BDD5B 106 | :101F40001C5F1C3019F08FEF8093610010936000CC 107 | :101F500084E196B3987131F48150D9F710927D00E5 108 | :101F600010927700C1E08111C0E080916B008C1766 109 | :101F700029F0C11101C051DEC0936B00C30101966D 110 | :101F80003C018035934C11F484E0382E232D33200E 111 | :101F9000E9F08AE390E20197F1F72230A9F4F8948E 112 | :101FA000E0ECF8E1E054F10983E080935700E89514 113 | :101FB0003097C1F7412C512CC8E08FEF9FEF59DECD 114 | :101FC000C150D9F74DDE02C02530E1F384E038126C 115 | :101FD000BBCEEDEBF8E1E491EF3F09F4B5CE90CE46 116 | :081FE000E1BF00006BCCFFCF54 117 | :061FE8005AFF18BA400880 118 | :04000003000018C021 119 | :00000001FF 120 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.11-entry_jumper_pb0.hex: -------------------------------------------------------------------------------- 1 | :0800000077CC76CCACCC74CCBB 2 | :1018C00017C016C04CC014C00902120001010080EC 3 | :1018D0003209040000000000000012011001FF00A6 4 | :1018E0000008D01653070B0100000001040309048F 5 | :1018F00011241FBECFE5D2E0CDBFDEBF00EB0F93BA 6 | :1019000007E00F9310E0A0E6B0E0E4EFFFE102C0D3 7 | :1019100005900D92A636B107D9F720E0A6E6B0E013 8 | :1019200001C01D92A639B207E1F7E2C1A82FB92F75 9 | :1019300080E090E041E050EA609530E009C02D91F0 10 | :1019400082279795879510F084279527305EC8F3F6 11 | :101950006F5FA8F30895EADF8D939D930895CF9369 12 | :10196000CFB7CF93C0915F02C03B21F4C0915E021C 13 | :10197000C73021F0CF91CFBFCF91A1CFCC27C39556 14 | :10198000B39BE9F7B39B0BC0B39B09C0B39B07C0E4 15 | :10199000B39B05C0B39B03C0B39B01C0D3C00F92E0 16 | :1019A000DF93C0917900DD27C058DF4F012EB39B34 17 | :1019B00003C0DF910F90E6CF2F930F931F934F93A8 18 | :1019C0002FEF4F6F06B303FB20F95F933F9350E077 19 | :1019D0003BE065C016B30126502953FDC89556B3A8 20 | :1019E000012703FB25F92F7306B3B1F05027102709 21 | :1019F00013FB26F906B22230F0F000C016B301271F 22 | :101A000003FB27F90126502906B22430E8F54F7769 23 | :101A1000206816B30000F6CF50274F7D206206B233 24 | :101A2000102F000000C006B300265029102713FB1A 25 | :101A300026F906B2E2CF4F7B06B3206400C0DACFAE 26 | :101A400001265029187106B269F14E7F2160012FDD 27 | :101A500016B328C0002650294D7F06B22260102FF1 28 | :101A600029C0012650294B7F06B22460012F2DC0CA 29 | :101A700016B301265029477F2860000006B22EC009 30 | :101A80004F7E06B3206130C0422706B3499300263B 31 | :101A90005029102706B24FEF13FB20F9297F16B308 32 | :101AA00079F2187159F10126502906B2012703FB7A 33 | :101AB00021F9237F06B371F2002650293150D0F06E 34 | :101AC00006B2102713FB22F9277E16B351F2012626 35 | :101AD0005029012703FB06B223F92F7C49F20000AD 36 | :101AE00006B3102713FB24F90026502906B22F79DC 37 | :101AF00039F270CF10E21ABF002717C03B50319562 38 | :101B0000C31BD04010E21ABF0881033CF9F00B342C 39 | :101B1000E9F0209177001981110F1213EDCF0936EA 40 | :101B200051F10D3211F0013E39F700937E003F91E3 41 | :101B30005F914F911F910F912F91DF910F90CAB735 42 | :101B4000C5FD1DCFCF91CFBFCF91189520917E00BD 43 | :101B5000222369F310917C00112321F5343022F106 44 | :101B600030937C0020937800109179003BE0311B8A 45 | :101B70003093790019C000917C0001309CF40AE593 46 | :101B80003091600034FD11C000936000CCE6D0E0DD 47 | :101B900010C0052710E000C021C0052710E0C8953F 48 | :101BA00008BB14C03AE501C032ED032EC0E0D0E01E 49 | :101BB00032E017B31861C39A08B317BB58E120E8A5 50 | :101BC0004FEF20FF052708BB279517951C3F28F7E7 51 | :101BD00000004552B0F720FF0527279508BB179551 52 | :101BE0001C3FB8F629913A9561F7077E10917D0068 53 | :101BF000110F08BBC250D04011F01093770010E2D3 54 | :101C00001ABF086017B3177E402F477E54E05A95DD 55 | :101C1000F1F708BB17BB48BB8ACFF8942FEFB0E8A9 56 | :101C2000A0E44AE0B1BF000081EE9CE0B399FECF92 57 | :101C3000B39BFECF0197B399FDCF97FF03C0BA1BAB 58 | :101C4000819501C0BA0FA69529F4281710F031B775 59 | :101C5000282FA1E0415031F731BF0000789408955A 60 | :101C6000F894F201329785E080935700E8957894D4 61 | :101C70000895F201309729F49093680080936700EB 62 | :101C800007C0E430F10539F490936A00809369004D 63 | :101C90008FE59CEC1FC02CEB421628E1520639F46C 64 | :101CA00080916700909168008E559C4F13C02EEB79 65 | :101CB000421628E1520639F48091690090916A0039 66 | :101CC0008D559C4F07C02AEB421628E1520611F4AD 67 | :101CD00081B790E02FB7F89431E00C0130935700B2 68 | :101CE000E89511242F0182E0480E511C2FBF089562 69 | :101CF000B898C09A8DE190E10197F1F7B09B15C0BB 70 | :101D0000EDEBF8E1E491EF3F81F0C098F894BB9AD5 71 | :101D10001BBE15BA10925F02EAEBF8E1E4918E2F38 72 | :101D200081508E3F08F462C163C114BE88E181BD59 73 | :101D300087E081BDBB9A88E893E1ECE9F1E0319757 74 | :101D4000F1F70197D1F7BB98AC9A8BB780628BBF44 75 | :101D50007894712C8CE991E00197F1F7A895312CDA 76 | :101D600060917C00162F135017FDB2C0809179004E 77 | :101D7000CCE0D0E0C81BD109C058DF4F6150CE0184 78 | :101D8000D5DD8E3F9F4409F0A1C0809178008D324F 79 | :101D900009F085C0183009F099C083EC80936C007D 80 | :101DA0008AE580936000109266009881292F207642 81 | :101DB00089812223D1F0712C811108C082E690E044 82 | :101DC00090937B0080937A0024E05FC0813051F4CF 83 | :101DD00081E180935700E8954C805D8097FD50C06D 84 | :101DE0002FEF4FC0382E20E050C09A81109275001E 85 | :101DF000811106C01092760085E790E022E03BC09A 86 | :101E0000853019F490937D002CC0863009F58B81C4 87 | :101E1000813019F48AED98E104C0823041F488ECF5 88 | :101E200098E190937B0080937A0022E10DC083308B 89 | :101E300051F4911108C08CEE98E190937B0080934F 90 | :101E40007A0024E001C020E080E4809366001DC099 91 | :101E5000883059F0893019F490937F0002C08A309D 92 | :101E600039F085E790E020E006C08FE790E002C0FF 93 | :101E700085E790E021E090937B0080937A0005C095 94 | :101E80002E8180E88093660007C08F81811104C095 95 | :101E90008E81821708F4282F2093610017C080914B 96 | :101EA000660087FF13C080EC481688E1580620F0D2 97 | :101EB000842D8F7339F00AC089919991DADE12501E 98 | :101EC00091F7F6CF95E0392E1092610010927C00C8 99 | :101ED0008091600084FF42C0809161008F3F09F4CF 100 | :101EE0003DC0182F893008F018E0811B80936100F5 101 | :101EF00080916C0098E8892780936C00112311F180 102 | :101F0000E0917A00F0917B008091660086FF0BC023 103 | :101F1000ADE6B0E084918D9331968DE690E0810F2F 104 | :101F20008A13F8CF0BC0EF01ADE6B0E089918D9335 105 | :101F3000FE018DE690E0810F8A13F8CFF0937B00CD 106 | :101F4000E0937A00612F8DE690E005DD1C5F1C3088 107 | :101F500019F08FEF809361001093600084E196B3D5 108 | :101F6000987131F48150D9F710927D00109277006A 109 | :101F7000C1E08111C0E080916B008C1729F0C11184 110 | :101F800001C04BDEC0936B00C30101963C0180355C 111 | :101F9000934C11F484E0382E232D3320E9F08AE3AA 112 | :101FA00090E20197F1F72230A9F4F894E0ECF8E11F 113 | :101FB000E054F10983E080935700E8953097C1F72A 114 | :101FC000412C512CC8E08FEF9FEF53DEC150D9F761 115 | :101FD00047DE02C02530E1F384E03812BBCEEDEBE2 116 | :101FE000F8E1E491EF3F09F4B5CE8FCEE1BF0000F8 117 | :041FF00065CCFFCFEE 118 | :061FF4005AFF18BA400874 119 | :04000003000018C021 120 | :00000001FF 121 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.11-ledpb1.hex: -------------------------------------------------------------------------------- 1 | :0800000077CC76CCACCC74CCBB 2 | :1018C00017C016C04CC014C00902120001010080EC 3 | :1018D0003209040000000000000012011001FF00A6 4 | :1018E0000008D01653070B0100000001040309048F 5 | :1018F00011241FBECFE5D2E0CDBFDEBF00EB0F93BA 6 | :1019000007E00F9310E0A0E6B0E0E2EEFFE102C0D6 7 | :1019100005900D92A636B107D9F720E0A6E6B0E013 8 | :1019200001C01D92A639B207E1F7E2C1A82FB92F75 9 | :1019300080E090E041E050EA609530E009C02D91F0 10 | :1019400082279795879510F084279527305EC8F3F6 11 | :101950006F5FA8F30895EADF8D939D930895CF9369 12 | :10196000CFB7CF93C0915F02C03B21F4C0915E021C 13 | :10197000C73021F0CF91CFBFCF91A1CFCC27C39556 14 | :10198000B39BE9F7B39B0BC0B39B09C0B39B07C0E4 15 | :10199000B39B05C0B39B03C0B39B01C0D3C00F92E0 16 | :1019A000DF93C0917900DD27C058DF4F012EB39B34 17 | :1019B00003C0DF910F90E6CF2F930F931F934F93A8 18 | :1019C0002FEF4F6F06B303FB20F95F933F9350E077 19 | :1019D0003BE065C016B30126502953FDC89556B3A8 20 | :1019E000012703FB25F92F7306B3B1F05027102709 21 | :1019F00013FB26F906B22230F0F000C016B301271F 22 | :101A000003FB27F90126502906B22430E8F54F7769 23 | :101A1000206816B30000F6CF50274F7D206206B233 24 | :101A2000102F000000C006B300265029102713FB1A 25 | :101A300026F906B2E2CF4F7B06B3206400C0DACFAE 26 | :101A400001265029187106B269F14E7F2160012FDD 27 | :101A500016B328C0002650294D7F06B22260102FF1 28 | :101A600029C0012650294B7F06B22460012F2DC0CA 29 | :101A700016B301265029477F2860000006B22EC009 30 | :101A80004F7E06B3206130C0422706B3499300263B 31 | :101A90005029102706B24FEF13FB20F9297F16B308 32 | :101AA00079F2187159F10126502906B2012703FB7A 33 | :101AB00021F9237F06B371F2002650293150D0F06E 34 | :101AC00006B2102713FB22F9277E16B351F2012626 35 | :101AD0005029012703FB06B223F92F7C49F20000AD 36 | :101AE00006B3102713FB24F90026502906B22F79DC 37 | :101AF00039F270CF10E21ABF002717C03B50319562 38 | :101B0000C31BD04010E21ABF0881033CF9F00B342C 39 | :101B1000E9F0209177001981110F1213EDCF0936EA 40 | :101B200051F10D3211F0013E39F700937E003F91E3 41 | :101B30005F914F911F910F912F91DF910F90CAB735 42 | :101B4000C5FD1DCFCF91CFBFCF91189520917E00BD 43 | :101B5000222369F310917C00112321F5343022F106 44 | :101B600030937C0020937800109179003BE0311B8A 45 | :101B70003093790019C000917C0001309CF40AE593 46 | :101B80003091600034FD11C000936000CCE6D0E0DD 47 | :101B900010C0052710E000C021C0052710E0C8953F 48 | :101BA00008BB14C03AE501C032ED032EC0E0D0E01E 49 | :101BB00032E017B31861C39A08B317BB58E120E8A5 50 | :101BC0004FEF20FF052708BB279517951C3F28F7E7 51 | :101BD00000004552B0F720FF0527279508BB179551 52 | :101BE0001C3FB8F629913A9561F7077E10917D0068 53 | :101BF000110F08BBC250D04011F01093770010E2D3 54 | :101C00001ABF086017B3177E402F477E54E05A95DD 55 | :101C1000F1F708BB17BB48BB8ACFF8942FEFB0E8A9 56 | :101C2000A0E44AE0B1BF000081EE9CE0B399FECF92 57 | :101C3000B39BFECF0197B399FDCF97FF03C0BA1BAB 58 | :101C4000819501C0BA0FA69529F4281710F031B775 59 | :101C5000282FA1E0415031F731BF0000789408955A 60 | :101C6000F894F201329785E080935700E8957894D4 61 | :101C70000895F201309729F49093680080936700EB 62 | :101C800007C0E430F10539F490936A00809369004D 63 | :101C90008FE59CEC1FC02CEB421628E1520639F46C 64 | :101CA00080916700909168008E559C4F13C02EEB79 65 | :101CB000421628E1520639F48091690090916A0039 66 | :101CC0008D559C4F07C02AEB421628E1520611F4AD 67 | :101CD00081B790E02FB7F89431E00C0130935700B2 68 | :101CE000E89511242F0182E0480E511C2FBF089562 69 | :101CF00014BE88E181BD87E081BDBB9A88E893E18D 70 | :101D0000ECE9F1E03197F1F70197D1F7BB98AC9A84 71 | :101D10008BB780628BBF7894C198712C8CE991E06D 72 | :101D20000197F1F7A895312C60917C00162F135084 73 | :101D300017FDB2C080917900CCE0D0E0C81BD1097A 74 | :101D4000C058DF4F6150CE01F1DD8E3F9F4409F056 75 | :101D5000A1C0809178008D3209F085C0183009F05B 76 | :101D600099C083EC80936C008AE5809360001092A8 77 | :101D700066009881292F207689812223D1F0712C49 78 | :101D8000811108C082E690E090937B0080937A00F6 79 | :101D900024E05FC0813051F481E180935700E895E1 80 | :101DA0004C805D8097FD50C02FEF4FC0382E20E053 81 | :101DB00050C09A8110927500811106C01092760071 82 | :101DC00085E790E022E03BC0853019F490937D00D8 83 | :101DD0002CC0863009F58B81813019F48AED98E1A9 84 | :101DE00004C0823041F488EC98E190937B008093AA 85 | :101DF0007A0022E10DC0833051F4911108C08CEEBD 86 | :101E000098E190937B0080937A0024E001C020E069 87 | :101E100080E4809366001DC0883059F0893019F441 88 | :101E200090937F0002C08A3039F085E790E020E08F 89 | :101E300006C08FE790E002C085E790E021E0909334 90 | :101E40007B0080937A0005C02E8180E88093660035 91 | :101E500007C08F81811104C08E81821708F4282F5A 92 | :101E60002093610017C08091660087FF13C080EC4B 93 | :101E7000481688E1580620F0842D8F7339F00AC087 94 | :101E800089919991F6DE125091F7F6CF95E0392EAF 95 | :101E90001092610010927C008091600084FF42C02B 96 | :101EA000809161008F3F09F43DC0182F893008F000 97 | :101EB00018E0811B8093610080916C0098E889276D 98 | :101EC00080936C00112311F1E0917A00F0917B0076 99 | :101ED0008091660086FF0BC0ADE6B0E084918D93E3 100 | :101EE00031968DE690E0810F8A13F8CF0BC0EF0199 101 | :101EF000ADE6B0E089918D93FE018DE690E0810F13 102 | :101F00008A13F8CFF0937B00E0937A00612F8DE67F 103 | :101F100090E021DD1C5F1C3019F08FEF8093610091 104 | :101F20001093600084E196B3987131F48150D9F731 105 | :101F300010927D0010927700C1E08111C0E0809185 106 | :101F40006B008C1729F0C11101C067DEC0936B00D4 107 | :101F5000C30101963C018035934C11F484E0382E86 108 | :101F6000872D8D7011F0B99801C0B99A232D3320B7 109 | :101F7000E9F08AE390E20197F1F72230A9F4F894AE 110 | :101F8000E0ECF8E1E054F10983E080935700E89534 111 | :101F90003097C1F7412C512CC8E08FEF9FEF69DEDD 112 | :101FA000C150D9F75DDE02C02530E1F384E038127C 113 | :101FB000B5CEEDEBF8E1E491EF3F09F4AFCEB9987F 114 | :101FC000F894BB9A1BBE15BA10925F02EAEBF8E1D7 115 | :101FD000E4918E2F81508E3F10F4E1BF00006ECC53 116 | :021FE000FFCF31 117 | :061FE2005AFF18BA400886 118 | :04000003000018C021 119 | :00000001FF 120 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus-1.11.hex: -------------------------------------------------------------------------------- 1 | :0800000077CC76CCACCC74CCBB 2 | :1018C00017C016C04CC014C00902120001010080EC 3 | :1018D0003209040000000000000012011001FF00A6 4 | :1018E0000008D01653070B0100000001040309048F 5 | :1018F00011241FBECFE5D2E0CDBFDEBF00EB0F93BA 6 | :1019000007E00F9310E0A0E6B0E0E2EDFFE102C0D7 7 | :1019100005900D92A636B107D9F720E0A6E6B0E013 8 | :1019200001C01D92A639B207E1F7E2C1A82FB92F75 9 | :1019300080E090E041E050EA609530E009C02D91F0 10 | :1019400082279795879510F084279527305EC8F3F6 11 | :101950006F5FA8F30895EADF8D939D930895CF9369 12 | :10196000CFB7CF93C0915F02C03B21F4C0915E021C 13 | :10197000C73021F0CF91CFBFCF91A1CFCC27C39556 14 | :10198000B39BE9F7B39B0BC0B39B09C0B39B07C0E4 15 | :10199000B39B05C0B39B03C0B39B01C0D3C00F92E0 16 | :1019A000DF93C0917900DD27C058DF4F012EB39B34 17 | :1019B00003C0DF910F90E6CF2F930F931F934F93A8 18 | :1019C0002FEF4F6F06B303FB20F95F933F9350E077 19 | :1019D0003BE065C016B30126502953FDC89556B3A8 20 | :1019E000012703FB25F92F7306B3B1F05027102709 21 | :1019F00013FB26F906B22230F0F000C016B301271F 22 | :101A000003FB27F90126502906B22430E8F54F7769 23 | :101A1000206816B30000F6CF50274F7D206206B233 24 | :101A2000102F000000C006B300265029102713FB1A 25 | :101A300026F906B2E2CF4F7B06B3206400C0DACFAE 26 | :101A400001265029187106B269F14E7F2160012FDD 27 | :101A500016B328C0002650294D7F06B22260102FF1 28 | :101A600029C0012650294B7F06B22460012F2DC0CA 29 | :101A700016B301265029477F2860000006B22EC009 30 | :101A80004F7E06B3206130C0422706B3499300263B 31 | :101A90005029102706B24FEF13FB20F9297F16B308 32 | :101AA00079F2187159F10126502906B2012703FB7A 33 | :101AB00021F9237F06B371F2002650293150D0F06E 34 | :101AC00006B2102713FB22F9277E16B351F2012626 35 | :101AD0005029012703FB06B223F92F7C49F20000AD 36 | :101AE00006B3102713FB24F90026502906B22F79DC 37 | :101AF00039F270CF10E21ABF002717C03B50319562 38 | :101B0000C31BD04010E21ABF0881033CF9F00B342C 39 | :101B1000E9F0209177001981110F1213EDCF0936EA 40 | :101B200051F10D3211F0013E39F700937E003F91E3 41 | :101B30005F914F911F910F912F91DF910F90CAB735 42 | :101B4000C5FD1DCFCF91CFBFCF91189520917E00BD 43 | :101B5000222369F310917C00112321F5343022F106 44 | :101B600030937C0020937800109179003BE0311B8A 45 | :101B70003093790019C000917C0001309CF40AE593 46 | :101B80003091600034FD11C000936000CCE6D0E0DD 47 | :101B900010C0052710E000C021C0052710E0C8953F 48 | :101BA00008BB14C03AE501C032ED032EC0E0D0E01E 49 | :101BB00032E017B31861C39A08B317BB58E120E8A5 50 | :101BC0004FEF20FF052708BB279517951C3F28F7E7 51 | :101BD00000004552B0F720FF0527279508BB179551 52 | :101BE0001C3FB8F629913A9561F7077E10917D0068 53 | :101BF000110F08BBC250D04011F01093770010E2D3 54 | :101C00001ABF086017B3177E402F477E54E05A95DD 55 | :101C1000F1F708BB17BB48BB8ACFF8942FEFB0E8A9 56 | :101C2000A0E44AE0B1BF000081EE9CE0B399FECF92 57 | :101C3000B39BFECF0197B399FDCF97FF03C0BA1BAB 58 | :101C4000819501C0BA0FA69529F4281710F031B775 59 | :101C5000282FA1E0415031F731BF0000789408955A 60 | :101C6000F894F201329785E080935700E8957894D4 61 | :101C70000895F201309729F49093680080936700EB 62 | :101C800007C0E430F10539F490936A00809369004D 63 | :101C90008FE59CEC1FC02CEB421628E1520639F46C 64 | :101CA00080916700909168008E559C4F13C02EEB79 65 | :101CB000421628E1520639F48091690090916A0039 66 | :101CC0008D559C4F07C02AEB421628E1520611F4AD 67 | :101CD00081B790E02FB7F89431E00C0130935700B2 68 | :101CE000E89511242F0182E0480E511C2FBF089562 69 | :101CF00014BE88E181BD87E081BDBB9A88E893E18D 70 | :101D0000ECE9F1E03197F1F70197D1F7BB98AC9A84 71 | :101D10008BB780628BBF7894712C8CE991E001972E 72 | :101D2000F1F7A895312C60917C00162F135017FD08 73 | :101D3000B2C080917900CCE0D0E0C81BD109C05876 74 | :101D4000DF4F6150CE01F2DD8E3F9F4409F0A1C00C 75 | :101D5000809178008D3209F085C0183009F099C063 76 | :101D600083EC80936C008AE580936000109266009B 77 | :101D70009881292F207689812223D1F0712C81111D 78 | :101D800008C082E690E090937B0080937A0024E084 79 | :101D90005FC0813051F481E180935700E8954C8019 80 | :101DA0005D8097FD50C02FEF4FC0382E20E050C00F 81 | :101DB0009A8110927500811106C01092760085E715 82 | :101DC00090E022E03BC0853019F490937D002CC058 83 | :101DD000863009F58B81813019F48AED98E104C0D1 84 | :101DE000823041F488EC98E190937B0080937A00F4 85 | :101DF00022E10DC0833051F4911108C08CEE98E1BE 86 | :101E000090937B0080937A0024E001C020E080E47E 87 | :101E1000809366001DC0883059F0893019F4909382 88 | :101E20007F0002C08A3039F085E790E020E006C0EC 89 | :101E30008FE790E002C085E790E021E090937B007F 90 | :101E400080937A0005C02E8180E88093660007C0E9 91 | :101E50008F81811104C08E81821708F4282F20936E 92 | :101E6000610017C08091660087FF13C080EC4816A0 93 | :101E700088E1580620F0842D8F7339F00AC08991CB 94 | :101E80009991F7DE125091F7F6CF95E0392E109226 95 | :101E9000610010927C008091600084FF42C08091BC 96 | :101EA00061008F3F09F43DC0182F893008F018E019 97 | :101EB000811B8093610080916C0098E88927809352 98 | :101EC0006C00112311F1E0917A00F0917B00809178 99 | :101ED000660086FF0BC0ADE6B0E084918D9331962D 100 | :101EE0008DE690E0810F8A13F8CF0BC0EF01ADE6CD 101 | :101EF000B0E089918D93FE018DE690E0810F8A1309 102 | :101F0000F8CFF0937B00E0937A00612F8DE690E0AC 103 | :101F100022DD1C5F1C3019F08FEF8093610010935D 104 | :101F2000600084E196B3987131F48150D9F7109232 105 | :101F30007D0010927700C1E08111C0E080916B00BC 106 | :101F40008C1729F0C11101C068DEC0936B00C3017A 107 | :101F500001963C018035934C11F484E0382E232DFA 108 | :101F60003320E9F08AE390E20197F1F72230A9F4F7 109 | :101F7000F894E0ECF8E1E054F10983E08093570035 110 | :101F8000E8953097C1F7412C512CC8E08FEF9FEFB7 111 | :101F900070DEC150D9F764DE02C02530E1F384E081 112 | :101FA0003812BBCEEDEBF8E1E491EF3F09F4B5CE8A 113 | :101FB000F894BB9A1BBE15BA10925F02EAEBF8E1E7 114 | :101FC000E4918E2F81508E3F10F4E1BF000076CC5B 115 | :021FD000FFCF41 116 | :061FD2005AFF18BA400896 117 | :04000003000018C021 118 | :00000001FF 119 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/src/Surface_Dial_attiny/micronucleus-1.11/firmware/releases/micronucleus.exe -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/usbdrv/oddebug.c: -------------------------------------------------------------------------------- 1 | /* Name: oddebug.c 2 | * Project: AVR library 3 | * Author: Christian Starkjohann 4 | * Creation Date: 2005-01-16 5 | * Tabsize: 4 6 | * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH 7 | * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) 8 | */ 9 | 10 | #include "oddebug.h" 11 | 12 | #if DEBUG_LEVEL > 0 13 | 14 | #warning "Never compile production devices with debugging enabled" 15 | 16 | static void uartPutc(char c) 17 | { 18 | while(!(ODDBG_USR & (1 << ODDBG_UDRE))); /* wait for data register empty */ 19 | ODDBG_UDR = c; 20 | } 21 | 22 | static uchar hexAscii(uchar h) 23 | { 24 | h &= 0xf; 25 | if(h >= 10) 26 | h += 'a' - (uchar)10 - '0'; 27 | h += '0'; 28 | return h; 29 | } 30 | 31 | static void printHex(uchar c) 32 | { 33 | uartPutc(hexAscii(c >> 4)); 34 | uartPutc(hexAscii(c)); 35 | } 36 | 37 | void odDebug(uchar prefix, uchar *data, uchar len) 38 | { 39 | printHex(prefix); 40 | uartPutc(':'); 41 | while(len--){ 42 | uartPutc(' '); 43 | printHex(*data++); 44 | } 45 | uartPutc('\r'); 46 | uartPutc('\n'); 47 | } 48 | 49 | #endif 50 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/firmware/usbdrv/oddebug.h: -------------------------------------------------------------------------------- 1 | /* Name: oddebug.h 2 | * Project: AVR library 3 | * Author: Christian Starkjohann 4 | * Creation Date: 2005-01-16 5 | * Tabsize: 4 6 | * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH 7 | * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) 8 | */ 9 | 10 | #ifndef __oddebug_h_included__ 11 | #define __oddebug_h_included__ 12 | 13 | /* 14 | General Description: 15 | This module implements a function for debug logs on the serial line of the 16 | AVR microcontroller. Debugging can be configured with the define 17 | 'DEBUG_LEVEL'. If this macro is not defined or defined to 0, all debugging 18 | calls are no-ops. If it is 1, DBG1 logs will appear, but not DBG2. If it is 19 | 2, DBG1 and DBG2 logs will be printed. 20 | 21 | A debug log consists of a label ('prefix') to indicate which debug log created 22 | the output and a memory block to dump in hex ('data' and 'len'). 23 | */ 24 | 25 | 26 | #ifndef F_CPU 27 | # define F_CPU 12000000 /* 12 MHz */ 28 | #endif 29 | 30 | /* make sure we have the UART defines: */ 31 | #include "usbportability.h" 32 | 33 | #ifndef uchar 34 | # define uchar unsigned char 35 | #endif 36 | 37 | #if DEBUG_LEVEL > 0 && !(defined TXEN || defined TXEN0) /* no UART in device */ 38 | # warning "Debugging disabled because device has no UART" 39 | # undef DEBUG_LEVEL 40 | #endif 41 | 42 | #ifndef DEBUG_LEVEL 43 | # define DEBUG_LEVEL 0 44 | #endif 45 | 46 | /* ------------------------------------------------------------------------- */ 47 | 48 | #if DEBUG_LEVEL > 0 49 | # define DBG1(prefix, data, len) odDebug(prefix, data, len) 50 | #else 51 | # define DBG1(prefix, data, len) 52 | #endif 53 | 54 | #if DEBUG_LEVEL > 1 55 | # define DBG2(prefix, data, len) odDebug(prefix, data, len) 56 | #else 57 | # define DBG2(prefix, data, len) 58 | #endif 59 | 60 | /* ------------------------------------------------------------------------- */ 61 | 62 | #if DEBUG_LEVEL > 0 63 | extern void odDebug(uchar prefix, uchar *data, uchar len); 64 | 65 | /* Try to find our control registers; ATMEL likes to rename these */ 66 | 67 | #if defined UBRR 68 | # define ODDBG_UBRR UBRR 69 | #elif defined UBRRL 70 | # define ODDBG_UBRR UBRRL 71 | #elif defined UBRR0 72 | # define ODDBG_UBRR UBRR0 73 | #elif defined UBRR0L 74 | # define ODDBG_UBRR UBRR0L 75 | #endif 76 | 77 | #if defined UCR 78 | # define ODDBG_UCR UCR 79 | #elif defined UCSRB 80 | # define ODDBG_UCR UCSRB 81 | #elif defined UCSR0B 82 | # define ODDBG_UCR UCSR0B 83 | #endif 84 | 85 | #if defined TXEN 86 | # define ODDBG_TXEN TXEN 87 | #else 88 | # define ODDBG_TXEN TXEN0 89 | #endif 90 | 91 | #if defined USR 92 | # define ODDBG_USR USR 93 | #elif defined UCSRA 94 | # define ODDBG_USR UCSRA 95 | #elif defined UCSR0A 96 | # define ODDBG_USR UCSR0A 97 | #endif 98 | 99 | #if defined UDRE 100 | # define ODDBG_UDRE UDRE 101 | #else 102 | # define ODDBG_UDRE UDRE0 103 | #endif 104 | 105 | #if defined UDR 106 | # define ODDBG_UDR UDR 107 | #elif defined UDR0 108 | # define ODDBG_UDR UDR0 109 | #endif 110 | 111 | static inline void odDebugInit(void) 112 | { 113 | ODDBG_UCR |= (1< 38 | #ifndef __IAR_SYSTEMS_ASM__ 39 | # include 40 | #endif 41 | 42 | #define __attribute__(arg) /* not supported on IAR */ 43 | 44 | #ifdef __IAR_SYSTEMS_ASM__ 45 | # define __ASSEMBLER__ /* IAR does not define standard macro for asm */ 46 | #endif 47 | 48 | #ifdef __HAS_ELPM__ 49 | # define PROGMEM __farflash 50 | #else 51 | # define PROGMEM __flash 52 | #endif 53 | 54 | #define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) 55 | 56 | /* The following definitions are not needed by the driver, but may be of some 57 | * help if you port a gcc based project to IAR. 58 | */ 59 | #define cli() __disable_interrupt() 60 | #define sei() __enable_interrupt() 61 | #define wdt_reset() __watchdog_reset() 62 | #define _BV(x) (1 << (x)) 63 | 64 | /* assembler compatibility macros */ 65 | #define nop2 rjmp $+2 /* jump to next instruction */ 66 | #define XL r26 67 | #define XH r27 68 | #define YL r28 69 | #define YH r29 70 | #define ZL r30 71 | #define ZH r31 72 | #define lo8(x) LOW(x) 73 | #define hi8(x) (((x)>>8) & 0xff) /* not HIGH to allow XLINK to make a proper range check */ 74 | 75 | /* Depending on the device you use, you may get problems with the way usbdrv.h 76 | * handles the differences between devices. Since IAR does not use #defines 77 | * for MCU registers, we can't check for the existence of a particular 78 | * register with an #ifdef. If the autodetection mechanism fails, include 79 | * definitions for the required USB_INTR_* macros in your usbconfig.h. See 80 | * usbconfig-prototype.h and usbdrv.h for details. 81 | */ 82 | 83 | /* ------------------------------------------------------------------------- */ 84 | #elif __CODEVISIONAVR__ /* check for CodeVision AVR */ 85 | /* ------------------------------------------------------------------------- */ 86 | /* This port is not working (yet) */ 87 | 88 | /* #define F_CPU _MCU_CLOCK_FREQUENCY_ seems to be defined automatically */ 89 | 90 | #include 91 | #include 92 | 93 | #define __attribute__(arg) /* not supported on IAR */ 94 | 95 | #define PROGMEM __flash 96 | #define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) 97 | 98 | #ifndef __ASSEMBLER__ 99 | static inline void cli(void) 100 | { 101 | #asm("cli"); 102 | } 103 | static inline void sei(void) 104 | { 105 | #asm("sei"); 106 | } 107 | #endif 108 | #define _delay_ms(t) delay_ms(t) 109 | #define _BV(x) (1 << (x)) 110 | #define USB_CFG_USE_SWITCH_STATEMENT 1 /* macro for if() cascase fails for unknown reason */ 111 | 112 | #define macro .macro 113 | #define endm .endmacro 114 | #define nop2 rjmp .+0 /* jump to next instruction */ 115 | 116 | /* ------------------------------------------------------------------------- */ 117 | #else /* default development environment is avr-gcc/avr-libc */ 118 | /* ------------------------------------------------------------------------- */ 119 | 120 | #include 121 | #ifdef __ASSEMBLER__ 122 | # define _VECTOR(N) __vector_ ## N /* io.h does not define this for asm */ 123 | #else 124 | # include 125 | #endif 126 | 127 | #if USB_CFG_DRIVER_FLASH_PAGE 128 | # define USB_READ_FLASH(addr) pgm_read_byte_far(((long)USB_CFG_DRIVER_FLASH_PAGE << 16) | (long)(addr)) 129 | #else 130 | # define USB_READ_FLASH(addr) pgm_read_byte(addr) 131 | #endif 132 | 133 | #define macro .macro 134 | #define endm .endm 135 | #define nop2 rjmp .+0 /* jump to next instruction */ 136 | 137 | #endif /* development environment */ 138 | 139 | /* for conveniecne, ensure that PRG_RDB exists */ 140 | #ifndef PRG_RDB 141 | # define PRG_RDB(addr) USB_READ_FLASH(addr) 142 | #endif 143 | #endif /* __usbportability_h_INCLUDED__ */ 144 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/micronucleus-t85_winDriver.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/src/Surface_Dial_attiny/micronucleus-1.11/micronucleus-t85_winDriver.zip -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/ruby/dump.rb: -------------------------------------------------------------------------------- 1 | `rm temp-dump.bin` 2 | `avrdude -c usbtiny -p t85 -U flash:r:temp-dump.bin:r` 3 | puts open('temp-dump.bin').read(30).bytes.to_a.map { |x| x.to_s(16) }.join(' ') 4 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/ruby/hex-to-bin.rb: -------------------------------------------------------------------------------- 1 | require_relative "../ruby/micronucleus.rb" 2 | 3 | # just converts a hex file to a binary file 4 | program = HexProgram.new open ARGV.first 5 | 6 | File.open ARGV.first.split('/').last.sub(/\.hex$/, '') + '.raw', 'w' do |file| 7 | file.write program.binary 8 | file.close 9 | end 10 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/ruby/micronucleus.rb: -------------------------------------------------------------------------------- 1 | require 'libusb' 2 | 3 | # Abstracts access to micronucleus avr tiny85 bootloader - can be used only to erase and upload bytes 4 | class Micronucleus 5 | Functions = [ 6 | :get_info, 7 | :write_page, 8 | :erase_application, 9 | :run_program 10 | ] 11 | 12 | # return all micronucleus devices connected to computer 13 | def self.all 14 | usb = LIBUSB::Context.new 15 | usb.devices.select { |device| 16 | device.idVendor == 0x16d0 && device.idProduct == 0x0753 17 | }.map { |device| 18 | self.new(device) 19 | } 20 | end 21 | 22 | def initialize devref 23 | @device = devref 24 | end 25 | 26 | def info 27 | unless @info 28 | result = control_transfer(function: :get_info, dataIn: 4) 29 | flash_length, page_size, write_sleep = result.unpack('S>CC') 30 | 31 | @info = { 32 | flash_length: flash_length, 33 | page_size: page_size, 34 | pages: (flash_length.to_f / page_size).ceil, 35 | write_sleep: write_sleep.to_f / 1000.0, 36 | version: "#{@device.bcdDevice >> 8}.#{@device.bcdDevice & 0xFF}", 37 | version_numeric: @device.bcdDevice 38 | } 39 | end 40 | 41 | @info 42 | end 43 | 44 | def erase! 45 | puts "erasing" 46 | info = self.info 47 | control_transfer(function: :erase_application) 48 | info[:pages].times do 49 | sleep(info[:write_sleep]) # sleep for as many pages as the chip has to erase 50 | end 51 | puts "erased chip" 52 | end 53 | 54 | # upload a new program 55 | def program= bytestring 56 | info = self.info 57 | raise "Program too long!" if bytestring.bytesize > info[:flash_length] 58 | bytes = bytestring.bytes.to_a 59 | bytes.push(0xFF) while bytes.length < info[:flash_length] 60 | 61 | erase! 62 | 63 | address = 0 64 | bytes.each_slice(info[:page_size]) do |slice| 65 | slice.push(0xFF) while slice.length < info[:page_size] # ensure every slice is one page_size long - pad out if needed 66 | 67 | puts "uploading @ #{address} of #{bytes.length}" 68 | control_transfer(function: :write_page, wIndex: address, wValue: slice.length, dataOut: slice.pack('C*')) 69 | sleep(info[:write_sleep]) 70 | address += slice.length 71 | end 72 | end 73 | 74 | def finished 75 | info = self.info 76 | 77 | puts "asking device to finish writing" 78 | control_transfer(function: :run_program) 79 | puts "waiting for device to finish" 80 | 81 | # sleep for as many pages as the chip could potentially need to write - this could be smarter 82 | info[:pages].times do 83 | sleep(info[:write_sleep]) 84 | end 85 | 86 | @io.close 87 | @io = nil 88 | end 89 | 90 | def inspect 91 | "" 92 | end 93 | 94 | protected 95 | # raw opened device 96 | def io 97 | unless @io 98 | @io = @device.open 99 | end 100 | 101 | @io 102 | end 103 | 104 | def control_transfer(opts = {}) 105 | opts[:bRequest] = Functions.index(opts.delete(:function)) if opts[:function] 106 | io.control_transfer({ 107 | wIndex: 0, 108 | wValue: 0, 109 | bmRequestType: usb_request_type(opts), 110 | timeout: 5000 111 | }.merge opts) 112 | end 113 | 114 | # calculate usb request type 115 | def usb_request_type opts #:nodoc: 116 | value = LIBUSB::REQUEST_TYPE_VENDOR | LIBUSB::RECIPIENT_DEVICE 117 | value |= LIBUSB::ENDPOINT_OUT if opts.has_key? :dataOut 118 | value |= LIBUSB::ENDPOINT_IN if opts.has_key? :dataIn 119 | return value 120 | end 121 | end 122 | 123 | class HexProgram 124 | def initialize input 125 | @bytes = Hash.new(0xFF) 126 | input = input.read if input.is_a? IO 127 | parse input 128 | end 129 | 130 | def binary 131 | bytes.pack('C*') 132 | end 133 | 134 | def bytes 135 | highest_address = @bytes.keys.max 136 | 137 | bytes = Array.new(highest_address + 1) { |index| 138 | @bytes[index] 139 | } 140 | end 141 | 142 | protected 143 | 144 | def parse input_text 145 | input_text.each_line do |line| 146 | next unless line.start_with? ':' 147 | line.chomp! 148 | length = line[1..2].to_i(16) # usually 16 or 32 149 | address = line[3..6].to_i(16) # 16-bit start address 150 | record_type = line[7..8].to_i(16) 151 | data = line[9... 9 + (length * 2)] 152 | checksum = line[9 + (length * 2).. 10 + (length * 2)].to_i(16) 153 | checksum_section = line[1...9 + (length * 2)] 154 | 155 | checksum_calculated = checksum_section.chars.to_a.each_slice(2).map { |slice| 156 | slice.join('').to_i(16) 157 | }.reduce(0, &:+) 158 | 159 | checksum_calculated = (((checksum_calculated % 256) ^ 0xFF) + 1) % 256 160 | 161 | raise "Hex file checksum mismatch @ #{line} should be #{checksum_calculated.to_s(16)}" unless checksum == checksum_calculated 162 | 163 | if record_type == 0 # data record 164 | data_bytes = data.chars.each_slice(2).map { |slice| slice.join('').to_i(16) } 165 | data_bytes.each_with_index do |byte, index| 166 | @bytes[address + index] = byte 167 | end 168 | end 169 | end 170 | end 171 | end -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/ruby/upload.rb: -------------------------------------------------------------------------------- 1 | require_relative './micronucleus' 2 | 3 | if ARGV[0] 4 | if ARGV[0].end_with? '.hex' 5 | puts "parsing input file as intel hex" 6 | test_data = HexProgram.new(open ARGV[0]).binary 7 | else 8 | puts "parsing input file as raw binary" 9 | test_data = open(ARGV[0]).read 10 | end 11 | else 12 | raise "Pass intel hex or raw binary as argument to script" 13 | end 14 | 15 | #test_data += ("\xFF" * 64) 16 | 17 | puts "Plug in programmable device now: (waiting)" 18 | sleep 0.25 while Micronucleus.all.length == 0 19 | 20 | nucleus = Micronucleus.all.first 21 | puts "Attached to device: #{nucleus.inspect}" 22 | 23 | #puts "Attempting to write '#{test_data.inspect}' to first thinklet's program memory" 24 | #puts "Bytes: #{test_data.bytes.to_a.inspect}" 25 | sleep(0.25) # some time to think? 26 | puts "Attempting to write supplied program in to device's memory" 27 | nucleus.program = test_data 28 | 29 | puts "Great! Starting program..." 30 | 31 | 32 | nucleus.finished # let thinklet know it can go do other things now if it likes 33 | puts "All done!" 34 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/upgrade/generate-data.rb: -------------------------------------------------------------------------------- 1 | require_relative "../ruby/micronucleus.rb" 2 | 3 | data = HexProgram.new(open ARGV.first) 4 | 5 | puts data.instance_variable_get(:@bytes).inspect 6 | 7 | data = data.bytes 8 | 9 | # find start address 10 | start_address = 16 # skip past baked in trampoline - upgrade firmware generates one anyway! 11 | # TODO: Verify jump table? or store it in the upgrade firmware for verbatim installation? 12 | start_address += 1 while data[start_address] == 0xFF 13 | 14 | raise "Seems to be junk data quite early in the bootloader" unless start_address > 100 15 | 16 | # trim blank padding data from start of data 17 | start_address.times { data.shift } 18 | 19 | # if data is an odd number of bytes make it even 20 | data.push 0xFF while (data.length % 2) != 0 21 | 22 | puts "Length: #{data.length}" 23 | puts "Start address: #{start_address}" 24 | 25 | File.open "bootloader_data.c", "w" do |file| 26 | file.puts "// This file contains the bootloader data itself and the address to" 27 | file.puts "// install the bootloader" 28 | file.puts "// Use generate-data.rb with ruby 1.9 or 2.0 to generate these" 29 | file.puts "// values from a hex file" 30 | file.puts "// Generated from #{ARGV.first} at #{Time.now} by #{ENV['USER']}" 31 | file.puts "" 32 | file.puts "const uint16_t bootloader_data[#{data.length / 2}] PROGMEM = {" 33 | file.puts data.each_slice(2).map { |big_end, little_end| 34 | "0x#{ ((little_end * 256) + big_end).to_s(16).rjust(4, '0') }" 35 | }.join(', ') 36 | file.puts "};" 37 | file.puts "" 38 | file.puts "uint16_t bootloader_address = #{start_address};" 39 | end -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/upgrade/readme.txt: -------------------------------------------------------------------------------- 1 | Micronucleus Upgrade 2 | ==================== 3 | 4 | Upgrade is a virus-like payload you can upload via micronucleus (or other bootloaders!) to install a new version of micronucleus on the target chip. The upgrade program works by compiling the binary contents of a bootloader hex file in to a progmem array, then running on the chip bricking the device so it doesn't enter any existing bootloader anymore but instead runs the upgrade program exclusively. Next it erases and rewrites the bootloader in place at the same address the hex file specifies (BOOTLOADER_ADDRESS in the case of micronucleus). Once the bootloader has been rewritten, upgrade rewrites it's own interrupt vector table to point every interrupt including reset straight at the newly uploaded bootloader's interrupt vector table at whichever address it was installed. 5 | 6 | The program then emits a beep if a piezo speaker is connected between PB0 and PB1. If you have no speaker, use an LED with positive on PB0 (requires resistor). Premade upgrades are included in releases/ for micronucleus builds. Just upload one in the usual way and wait for the beep. Once you hear the beep, the chip will automatically reboot and should enumerate over USB as a micronucleus device, ready to accept a new program. 7 | 8 | Upgrade has only been tested with micronucleus - use it to upload other bootloaders at your own risk! 9 | 10 | Prerequesits 11 | ============ 12 | 13 | You'll need a few dependencies to start with: 14 | 15 | gem install libusb 16 | 17 | Also, you'll need avr-gcc. For OS X, it can be obtained from http://www.obdev.at/products/crosspack/download.html 18 | 19 | 20 | Creating an Upgrade 21 | =================== 22 | 23 | ruby generate-data.rb my_new_bootloader.hex 24 | make clean; make 25 | 26 | Next upload the 'upgrade.hex' file generated in this folder, via whichever bootloader you're using, or an ISP or whatever - everything should work. If you're using micronucleus and have the command line tool installed: micronucleus --run upgrade.hex 27 | 28 | The generate-data.rb script requires Ruby 1.9 or newer to be installed. If you're using an older version of Mac OS X (before Mavericks), use homebrew to install ruby with 'brew install ruby' to get a recent version. On linuxes you can usually find a package called ruby1.9 in whichever installing thingy. On windows you're on your own! 29 | 30 | 31 | License 32 | ======= 33 | 34 | Released under BSD license. Have fun! 35 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/upgrade/technical details.txt: -------------------------------------------------------------------------------- 1 | Technical Details 2 | ================= 3 | 4 | A summary of how 'upgrade' works 5 | 6 | 7 | -- build process: 8 | 9 | 1) Manually run the generate-data.rb ruby script with the new bootloader's hex file: 10 | ruby generate-data.rb new_firmware.hex 11 | If you have trouble running it, make sure you're using ruby version 1.9. 1.8 is too old! 12 | 13 | generate-data.rb creates the bootloader_data.c file, which defines some variables containing 14 | the entire raw byte data of the bootloader as an array stored in flash memory. It also 15 | calculates and writes in the start address of the bootloader. The hex file supplied can be any 16 | bootloader which works similarly to USBaspLoader-tiny85 - which is most (all?) tiny85 bootloaders 17 | and likely some for other avr chips which lack hardware bootloader stuff. 18 | 19 | 2) Generate the hex file using make: 20 | make clean; make 21 | 22 | The upgrader hex file is built in the usual way, then combined with upgrade-prefix.hex (which 23 | I wrote by hand) to prefix a fake interrupt vector table in the start of the upgrader. This is 24 | necessary because bootloaders like micronucleus and Fast Tiny & Mega Bootloader only work with 25 | firmwares which begin with an interrupt vector table, because of the way they mangle the table 26 | to forward some interrupts to themselves. 27 | 28 | 3) Upload the resulting upgrade.hex file to a chip you have some means of recovering. If all works 29 | correctly, consider now uploading it to other chips which maybe more difficult to recover but are 30 | otherwise identical. 31 | 32 | 33 | -- how it works: 34 | 35 | Taking inspiration from computer viruses, when upgrade runs it goes through this process: 36 | 37 | 1) Brick the chip: 38 | The first thing upgrade does is erase the ISR vector table. Erasing it sets the first page to 39 | 0xFF bytes - creating a NOP sled. If the chip looses power or otherwise resets, it wont enter 40 | the bootloader, sliding in to the upgrader restarting the process. 41 | 42 | 2) erase and write bootloader: 43 | The flash pages for the new bootloader are erased and rewritten from start to finish. 44 | 45 | 3) install the trampoline: 46 | The fake ISR table which was erased in step one is now written to - a trampoline is added, simply 47 | forwarding any requests to the new bootloader's interrupt vector table. At this point the viral 48 | upgrader has completed it's life cycle and has disabled itself. It should never run again, booting 49 | directly in to the bootloader instead. 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/upgrade/upgrade-prefix.hex: -------------------------------------------------------------------------------- 1 | :1000000003C003C003C003C003C003C003C003C0D8 2 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/upgrade/upgrade.c: -------------------------------------------------------------------------------- 1 | // Upgrade is an in-place firmware upgrader for tiny85 chips - just fill in the 2 | // 'bootloaderAddress' variable in bootloader_data.h, and the bootloaderData 3 | // progmem array with the bootloader data, and you're ready to go. 4 | // 5 | // Upgrade will firstly rewrite the interrupt vector table to disable the bootloader, 6 | // rewriting it to just run the upgrade app. Next it erases and writes each page of the 7 | // bootloader in sequence, erasing over any remaining pages leaving them set to 0xFFFF 8 | // Finally upgrader erases it's interrupt table again and fills it with RJMPs to 9 | // bootloaderAddress, effectively bridging the interrupts in to the new bootloader's 10 | // interrupts table. 11 | // 12 | // While upgrade has been written with attiny85 and micronucleus in mind, it should 13 | // work with other bootloaders and other chips with flash self program but no hardware 14 | // bootloader protection, where the bootloader exists at the end of flash 15 | // 16 | // Be very careful to not power down the AVR while upgrader is running. 17 | // If you connect a piezo between pb0 and pb1 you'll hear a bleep when the update 18 | // is complete. You can also connect an LED with pb0 positive and pb1 or gnd negative and 19 | // it will blink 20 | 21 | #include "./utils.h" 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include "./bootloader_data.c" 28 | 29 | void secure_interrupt_vector_table(void); 30 | void write_new_bootloader(void); 31 | void forward_interrupt_vector_table(void); 32 | void beep(void); 33 | void reboot(void); 34 | 35 | void load_table(uint16_t address, uint16_t words[SPM_PAGESIZE / 2]); 36 | void erase_page(uint16_t address); 37 | void write_page(uint16_t address, uint16_t words[SPM_PAGESIZE / 2]); 38 | 39 | 40 | int main(void) { 41 | pinsOff(0xFF); // pull down all pins 42 | outputs(0xFF); // all to ground - force usb disconnect 43 | delay(250); // milliseconds 44 | inputs(0xFF); // let them float 45 | delay(250); 46 | cli(); 47 | 48 | secure_interrupt_vector_table(); // reset our vector table to it's original state 49 | write_new_bootloader(); 50 | forward_interrupt_vector_table(); 51 | 52 | beep(); 53 | 54 | reboot(); 55 | 56 | return 0; 57 | } 58 | 59 | // erase first page, removing any interrupt table hooks the bootloader added when 60 | // upgrade was uploaded 61 | void secure_interrupt_vector_table(void) { 62 | uint16_t table[SPM_PAGESIZE / 2]; 63 | 64 | load_table(0, table); 65 | 66 | // wipe out any interrupt hooks the bootloader rewrote 67 | int i = 0; 68 | while (i < SPM_PAGESIZE / 2) { 69 | table[0] = 0xFFFF; 70 | i++; 71 | } 72 | 73 | erase_page(0); 74 | write_page(0, table); 75 | } 76 | 77 | // erase bootloader's section and write over it with new bootloader code 78 | void write_new_bootloader(void) { 79 | uint16_t outgoing_page[SPM_PAGESIZE / 2]; 80 | int iter = 0; 81 | while (iter < sizeof(bootloader_data)) { 82 | 83 | // read in one page's worth of data from progmem 84 | int word_addr = 0; 85 | while (word_addr < SPM_PAGESIZE) { 86 | int subaddress = ((int) bootloader_data) + iter + word_addr; 87 | if (subaddress >= ((int) bootloader_data) + sizeof(bootloader_data)) { 88 | outgoing_page[word_addr / 2] = 0xFFFF; 89 | } else { 90 | outgoing_page[word_addr / 2] = pgm_read_word(subaddress); 91 | } 92 | 93 | word_addr += 2; 94 | } 95 | 96 | // erase page in destination 97 | erase_page(bootloader_address + iter); 98 | // write updated page 99 | write_page(bootloader_address + iter, outgoing_page); 100 | 101 | iter += 64; 102 | } 103 | } 104 | 105 | // write in forwarding interrupt vector table 106 | void forward_interrupt_vector_table(void) { 107 | uint16_t vector_table[SPM_PAGESIZE / 2]; 108 | 109 | int iter = 0; 110 | while (iter < SPM_PAGESIZE / 2) { 111 | // rjmp to bootloader_address's interrupt table 112 | vector_table[iter] = 0xC000 + (bootloader_address / 2) - 1; 113 | iter++; 114 | } 115 | 116 | erase_page(0); 117 | write_page(0, vector_table); 118 | } 119 | 120 | void load_table(uint16_t address, uint16_t words[SPM_PAGESIZE / 2]) { 121 | uint16_t subaddress = 0; 122 | address -= address % SPM_PAGESIZE; // round down to nearest page start 123 | 124 | while (subaddress < SPM_PAGESIZE) { 125 | words[subaddress / 2] = pgm_read_word(address + subaddress); 126 | subaddress += 2; 127 | } 128 | } 129 | 130 | void erase_page(uint16_t address) { 131 | boot_page_erase(address - (address % SPM_PAGESIZE)); 132 | boot_spm_busy_wait(); 133 | } 134 | 135 | void write_page(uint16_t address, uint16_t words[SPM_PAGESIZE / 2]) { 136 | // fill buffer 137 | uint16_t iter = 0; 138 | while (iter < SPM_PAGESIZE / 2) { 139 | boot_page_fill(address + (iter * 2), words[iter]); 140 | iter++; 141 | } 142 | 143 | boot_page_write(address); 144 | boot_spm_busy_wait(); // Wait until the memory is written. 145 | } 146 | 147 | // beep for a quarter of a second 148 | void beep(void) { 149 | outputs(pin(0) | pin(1)); 150 | pinOff(1); 151 | 152 | byte i = 0; 153 | while (i < 250) { 154 | delay(1); 155 | pinOn(pin(0)); 156 | delay(1); 157 | pinOff(pin(0)); 158 | i++; 159 | } 160 | } 161 | 162 | void reboot(void) { 163 | void (*ptrToFunction)(); // pointer to a function 164 | ptrToFunction = 0x0000; 165 | (*ptrToFunction)(); // reset! 166 | } 167 | 168 | 169 | ////////////// Add padding to start of program so no program code could reasonably be erased while program is running 170 | // this never needs to be called - avr-gcc stuff happening: http://www.nongnu.org/avr-libc/user-manual/mem_sections.html 171 | volatile void FakeISR (void) __attribute__ ((naked)) __attribute__ ((section (".init0"))); 172 | volatile void FakeISR (void) { 173 | // 16 nops to pad out first section of program 174 | asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); 175 | asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); 176 | } 177 | -------------------------------------------------------------------------------- /src/Surface_Dial_attiny/micronucleus-1.11/upgrade/utils.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | // For the niceness 5 | typedef unsigned char byte; 6 | typedef unsigned char boolean; 7 | 8 | // make bit & value, eg bit(5) #=> 0b00010000 9 | #define bit(number) _BV(number) 10 | #define pin(number) _BV(number) 11 | 12 | // USI serial aliases 13 | #define USIOutputPort PORTE 14 | #define USIInputPort PINE 15 | #define USIDirectionPort DDRE 16 | #define USIClockPin PE4 17 | #define USIDataInPin PE5 18 | #define USIDataOutPin PE6 19 | 20 | // booleans 21 | #define on 255 22 | #define off 0 23 | #define true 1 24 | #define false 0 25 | #define yes true 26 | #define no false 27 | 28 | // ensure a value is within the bounds of a minimum and maximum (inclusive) 29 | #define constrainUpper(value, max) (value > max ? max : value) 30 | #define constrainLower(value, min) (value < min ? min : value) 31 | #define constrain(value, min, max) constrainLower(constrainUpper(value, max), min) 32 | #define multiplyDecimal(a,b) (((a) * (b)) / 256) 33 | 34 | // set a pin on DDRB to be an input or an output - i.e. becomeOutput(pin(3)); 35 | #define inputs(pinmap) DDRB &= ~(pinmap) 36 | #define outputs(pinmap) DDRB |= (pinmap) 37 | 38 | // turn some pins on or off 39 | #define pinsOn(pinmap) PORTB |= (pinmap) 40 | #define pinsOff(pinmap) PORTB &= ~(pinmap) 41 | #define pinsToggle(pinmap) PORTB ^= pinmap 42 | 43 | // turn a single pin on or off 44 | #define pinOn(pin) pinsOn(bit(pin)) 45 | #define pinOff(pin) pinsOff(bit(pin)) 46 | // TODO: Should be called pinToggle 47 | #define toggle(pin) pinsToggle(bit(pin)) 48 | 49 | // delay a number of microseconds - or as close as we can get 50 | #if F_CPU == 16500000 51 | // special version to deal with half-mhz speed. in a resolution of 2us increments, rounded up 52 | // this loop has been tuned empirically with an oscilloscope and works in avr-gcc 4.5.1 53 | static inline void microdelay(int microseconds) { 54 | while (microseconds > 1) { 55 | // 16 nops 56 | asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP"); 57 | asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP"); 58 | // 16 nops 59 | asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP"); 60 | asm("NOP");asm("NOP");asm("NOP"); 61 | 62 | 63 | microseconds -= 2; 64 | } 65 | } 66 | #else 67 | #define microdelay(microseconds) _delay_loop_2(((microseconds) * (F_CPU / 100000)) / 40) 68 | #endif 69 | 70 | // delay in milliseconds - a custom implementation to avoid util/delay's tendancy to import floating point math libraries 71 | inline void delay(unsigned int ms) { 72 | while (ms > 0) { 73 | // delay for one millisecond (250*4 cycles, multiplied by cpu mhz) 74 | // subtract number of time taken in while loop and decrement and other bits 75 | _delay_loop_2((25 * F_CPU / 100000)); 76 | ms--; 77 | } 78 | } 79 | 80 | 81 | 82 | // digital read returns 0 or 1 83 | #define get(pin) ((PINB >> pin) & 0b00000001) 84 | #define getBitmap(bitmap) (PINB & bitmap) 85 | static inline void set(byte pin, byte state) { 86 | if (state) { pinOn(pin); } else { pinOff(pin); } 87 | // alternatly: 88 | // PORTB = (PORTB & ~(bit(pin)) | ((state & 1) << pin); 89 | } 90 | 91 | -------------------------------------------------------------------------------- /stl model/surface dial t v2.3.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/stl model/surface dial t v2.3.STL -------------------------------------------------------------------------------- /stl model/surface dial v2.3.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/stl model/surface dial v2.3.STL -------------------------------------------------------------------------------- /tools/avrdudess_20191012/Changelog.txt: -------------------------------------------------------------------------------- 1 | 2019-10-12 (v2.11): 2 | - Fixed null exception if no MCU selected and "Set fuses" ticked 3 | - Updated Polish translation 4 | 5 | 2019-10-02 (v2.10): 6 | - Fix fuse read issue with MCUs that don't have all low, high and extended fuses 7 | - Update avrdude.conf to allow setting the CFD bit (Disable Clock Failure Detection) in the extended fuse for the ATmega328PB 8 | - Update URLs to HTTPS 9 | 10 | 2019-09-06 (v2.9): 11 | - Added French translation 12 | - Added Russian translation 13 | - Now shows full command line arguments in console output whenever avrdude is invoked 14 | - Fixed breaking click and drag anywhere to move window 15 | - Window title now shows "avrdude version UNKNOWN" instead of "?" if unable to find avrdude version 16 | 17 | 2019-02-09 (v2.8): 18 | - Added .NET 4.0+ to the list of supported runtimes, no longer need to install old .NET versions onto newer systems 19 | - Language selection box has been widened 20 | - New "About" box, now with clickable link 21 | - No longer creates temporary files when reading fuses and lock bits 22 | - LPT parallel port names in the port drop down box are now lower case 23 | - When resizing the main window, the controls on the right side are now also resized 24 | 25 | 2019-01-22 (v2.7): 26 | - Added Polish translation 27 | - Added Chinese translation 28 | - Added AVRDUDE support for ATmega328PB 29 | - Added displaying MCU signature near to the flash and EEPROM sizes 30 | - Fixed being unable to load xml file in the fuse bit selector window in Linux 31 | - Fixed flash and EEPROM file operation only being able to verify when a language other than English is chosen 32 | - All configuration settings are now saved across sessions instead of only the last selected preset 33 | - Window size is now saved across sessions 34 | - Use save file dialog when appropriate instead of only using an open file dialog 35 | 36 | 2018-09-20 (v2.6): 37 | - Fetch a different XML file when checking for updates as older versions of AVRDUDESS don't like the new format 38 | 39 | 2018-09-20 (v2.5): 40 | - Updated AVRDUDE to v6.3 41 | - libusb0.dll now included 42 | - Added a preset manager, you can export and import presets and manage existing presets much easier now 43 | - Added options to hide programmers and MCUs from their drop-down menus 44 | - Added support for different languages, translations go into an xml file in the Languages folder 45 | - Added avrdude support for ATtiny841, ATtiny441 and ATmega16U4 46 | - Added persistent window location, AVRDUDESS will now open in the same location that it was last closed 47 | - Added a preset for Arduino as ISP 48 | - Fixed flash and EEPROM usage bars not working if there is a space in the file path 49 | - Fixed form tab indexes, pressing tab will now go through form controls in order 50 | - When clicking the 'Fuse settings' link it will now automatically load up the selected MCU and fuse values 51 | - Most errors and warnings are now printed to the output console (in pretty colours!) instead of having a million pop-up boxes 52 | - Main window can now be properly resized 53 | - Improved avrdude.conf file parsing 54 | - Various other little fixes and improvements 55 | 56 | 2014-08-05 (v2.4): 57 | - For some reason antivirus software falsely detects AVRDUDESS as malware when using HttpWebRequest to check for updates, using raw sockets seems to fix it 58 | 59 | 2014-07-13 (v2.3): 60 | - Updated AVRDUDE to v6.1 61 | - USB option in port drop down list is now lower case 62 | - Automatically prepend 0x to fuse hex values 63 | - Fixed issue with spaces when setting avrdude.conf location 64 | 65 | 2014-01-02 (v2.2): 66 | - Fixed USBasp frequency not loading from presets for some users 67 | - Fixed incorrect fuse bits for ATmega328(P) 68 | - Flash and EEPROM sizes of selected MCU is shown 69 | - Flash and EEPROM space used is shown as a little usage bar above .hex/.eep file locations and in console 70 | - Fuse bit names have been moved to an external file (bits.xml) 71 | - Added options window 72 | - Now shows log if MCU autodetect failed 73 | 74 | 2013-11-20 (v2.1): 75 | - No longer need to run as administrator to have the config and presets save correctly 76 | - Fixed some typos 77 | - Some more under the hood improvements 78 | 79 | 2013-11-19 (v2.0): 80 | - Updated AVRDUDE to v6.0.1 81 | - Window title shows AVRDUDE version 82 | - AVRDUDE output console moved to main window 83 | - Preset to load at startup can be specified in the command line 84 | - Sticky presets (load last used preset at startup, if one hasn't been specified in the command line) 85 | - Auto detect MCU 86 | - Fuse selector 87 | - USBasp programmer frequency options 88 | - Tool tips setting now saves 89 | - "Update available" window now shows a change log 90 | - "Update available" window now has "Skip version" instead of "Don't ask again" 91 | - "Set fuses" checkbox now defaults to unchecked 92 | - Port selection in Linux now shows ttyS*, ttyUSB*, ttyACM* and lp* devices instead of just ttyS* 93 | - Buttons to separately write/read/verify the flash/EEPROM/fuses 94 | - Popups for saving and deleting presets have been removed, now you type the name into the presets box and save or select the preset to delete and delete it. 95 | - GUI redesign 96 | - Various under the hood improvements 97 | 98 | 2013-02-26 (v1.2): 99 | - ATmega328 non-P added back to avrdude.conf 100 | - Fixed reading high and low fuses the wrong way around 101 | - Fixed if a textbox is full, selecting its contents and typing to replace text didn't work 102 | - Fixed wonky console window in Linux 103 | - Added right click options to console window (only seems to work in Windows) 104 | 105 | 2013-02-25 (v1.1): 106 | - Now only requires .NET Framework 2.0 SP1 instead of 4.0 107 | - Updated AVRDUDE to v5.11.1 from MHV AVR Tools (http://www.makehackvoid.com/project/mhvavrtools) 108 | - Fixed having to copy avrdude binary in Linux/OSX 109 | - Added verbosity level option 110 | 111 | 2013-02-17 (v1.0): 112 | - Initial release 113 | -------------------------------------------------------------------------------- /tools/avrdudess_20191012/Credits.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/tools/avrdudess_20191012/Credits.txt -------------------------------------------------------------------------------- /tools/avrdudess_20191012/README.md: -------------------------------------------------------------------------------- 1 | AVRDUDESS - A GUI for AVRDUDE 2 | ============================= 3 | 4 | This is a GUI for AVRDUDE ([http://savannah.nongnu.org/projects/avrdude](http://savannah.nongnu.org/projects/avrdude)). 5 | 6 | [https://blog.zakkemble.net/avrdudess-a-gui-for-avrdude/](https://blog.zakkemble.net/avrdudess-a-gui-for-avrdude/) 7 | 8 | ![AVRDUDESS pic](https://github.com/zkemble/AVRDUDESS/raw/master/images/avrdudess.png "") 9 | 10 | Windows: 11 | -------- 12 | Requires .NET Framework 2.0 SP1 or newer. All systems since Windows Vista will have the required version already installed. 13 | 14 | Linux & macOS: 15 | ----------------- 16 | Can be ran using Mono ([http://www.mono-project.com](http://www.mono-project.com)).\ 17 | Has not been tested on macOS, but should work. Might need the `--arch=32` argument. 18 | 19 | mono --arch=32 avrdudess.exe 20 | 21 | Installing on Ubuntu 18.04: 22 | --------------------------- 23 | Install Mono (this is the minimum required, you can use `mono-complete` for a full install): 24 | 25 | sudo apt-get install libmono-system-windows-forms4.0-cil 26 | 27 | On older versions of Ubuntu you might need to use `libmono-winforms2.0-cil` instead. 28 | 29 | Install AVRDUDE and AVR-GCC (for avr-size): 30 | 31 | sudo apt-get install avrdude gcc-avr 32 | 33 | Run AVRDUDESS with mono, you might have to run as root (sudo) so that AVRDUDE can access ports if you haven't changed any permissions or rules.d stuff: 34 | 35 | mono avrdudess.exe 36 | 37 | Building: 38 | --------- 39 | You will need Microsoft Visual Studio 2015 or newer installed (older might work too). Open `./src/avrdudess.sln` and click the 'Start' button at the top and it will build and run AVRDUDESS.\ 40 | You can find the output in `./src/avrdudess/bin/Debug/`, or `./src/avrdudess/bin/Release/` if you chose to build for Release (the drop down box second from the left of the Start button is where you can choose the configuration). 41 | 42 | Making the Installer: 43 | --------------------- 44 | You will need [Inno Setup](http://www.jrsoftware.org/isinfo.php) installed. Once you've used Visual Studio to build the Release version of AVRDUDESS, run `./installer/installer.bat` and the installer exe will appear in the same directory. 45 | 46 | -------- 47 | 48 | Zak Kemble 49 | 50 | contact@zakkemble.net 51 | -------------------------------------------------------------------------------- /tools/avrdudess_20191012/TODO.txt: -------------------------------------------------------------------------------- 1 | Add: Better support for ATxmega devices (They have fuses 0-5 instead of low/high/extended and a few other things) 2 | Add: Better fuse selector 3 | Add: Compile avrdude with libftdi support 4 | Add: Simple UI mode 5 | Add: Options to run external programs before and after running AVRDUDE 6 | Add: Accept the same command line arguments as AVRDUDE, which will then be applied to the UI 7 | Fix: High verbosity level resulting in slow programming caused by slow console output 8 | Fix: When auto-detecting MCU have a better guess at what programming interface to use (at the moment it only uses ISP or bootloader) 9 | -------------------------------------------------------------------------------- /tools/avrdudess_20191012/avr-size.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/tools/avrdudess_20191012/avr-size.exe -------------------------------------------------------------------------------- /tools/avrdudess_20191012/avrdude.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/tools/avrdudess_20191012/avrdude.exe -------------------------------------------------------------------------------- /tools/avrdudess_20191012/avrdudess.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/tools/avrdudess_20191012/avrdudess.exe -------------------------------------------------------------------------------- /tools/avrdudess_20191012/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1 4 | 0 5 | 6 | 0 7 | 0 8 | 9 | true 10 | 11 | 12 | 13 | 14 | 0 15 | 0 16 | 17 | chinese-zh_CN 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | a 28 | w 29 | 30 | a 31 | w 32 | false 33 | false 34 | false 35 | false 36 | false 37 | 38 | 39 | 40 | false 41 | 42 | false 43 | 44 | 0 45 | 46 | 47 | true 48 | 49 | 0 50 | 0 51 | 52 | -------------------------------------------------------------------------------- /tools/avrdudess_20191012/libusb0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Eddddddddy/Surface_Dial_Arduino/a981019ab3bb6065ff2f4ae199197c2b65d60c7a/tools/avrdudess_20191012/libusb0.dll --------------------------------------------------------------------------------