From da7b6e47c7cc78b40077c343c33c931cb090424c Mon Sep 17 00:00:00 2001 From: Stefan Beller Date: Sat, 19 May 2012 16:27:27 +0200 Subject: [PATCH] Initial commit. This includes the files as of wget http://www.fischl.de/usbasp/usbasp.2011-05-28.tar.gz tar -xf usbasp.2011.05-28.tar.gz --- Changelog.txt | 53 ++ Readme.txt | 142 +++ bin/firmware/Makefile | 11 + bin/firmware/Makefile48 | 11 + bin/firmware/Makefile88 | 11 + bin/firmware/usbasp.atmega48.2009-02-28.hex | 242 +++++ bin/firmware/usbasp.atmega8.2011-05-28.hex | 296 ++++++ bin/firmware/usbasp.atmega88.2011-05-28.hex | 297 ++++++ bin/linux-nonroot/99-USBasp.rules | 4 + bin/linux-nonroot/install_rule | 2 + bin/win-driver/Readme.txt | 1 + bin/win-driver/libusb_0.1.12.1/libusb0.dll | Bin 0 -> 43520 bytes bin/win-driver/libusb_0.1.12.1/libusb0.sys | Bin 0 -> 28672 bytes .../libusb_0.1.12.1/libusb0_x64.dll | Bin 0 -> 43008 bytes .../libusb_0.1.12.1/libusb0_x64.sys | Bin 0 -> 16896 bytes .../libusb_0.1.12.1/testlibusb-win.exe | Bin 0 -> 13824 bytes bin/win-driver/libusb_0.1.12.1/testlibusb.exe | Bin 0 -> 8192 bytes bin/win-driver/libusb_0.1.12.1/usbasp.cat | 3 + bin/win-driver/libusb_0.1.12.1/usbasp.inf | 136 +++ bin/win-driver/libusb_0.1.12.1/usbasp_x64.cat | 3 + .../libusb_1.2.4.0/amd64/libusb0.dll | Bin 0 -> 75200 bytes .../libusb_1.2.4.0/amd64/libusb0.sys | Bin 0 -> 44480 bytes .../libusb_1.2.4.0/ia64/libusb0.dll | Bin 0 -> 157120 bytes .../libusb_1.2.4.0/ia64/libusb0.sys | Bin 0 -> 90048 bytes .../libusb_1.2.4.0/installer_x64.exe | Bin 0 -> 22528 bytes .../libusb_1.2.4.0/installer_x86.exe | Bin 0 -> 20992 bytes .../libusb-win32-bin-README.txt | 27 + .../libusb-win32/installer_license.txt | 851 ++++++++++++++++++ bin/win-driver/libusb_1.2.4.0/usbasp.cat | 3 + bin/win-driver/libusb_1.2.4.0/usbasp.inf | Bin 0 -> 8034 bytes bin/win-driver/libusb_1.2.4.0/x86/libusb0.sys | Bin 0 -> 35776 bytes .../libusb_1.2.4.0/x86/libusb0_x86.dll | Bin 0 -> 67008 bytes circuit/USBasp.sch | Bin 0 -> 263720 bytes circuit/USBasp_schematics.pdf | Bin 0 -> 14649 bytes firmware/Makefile | 135 +++ firmware/clock.c | 24 + firmware/clock.h | 28 + firmware/isp.c | 336 +++++++ firmware/isp.h | 65 ++ firmware/main.c | 340 +++++++ firmware/tpi.S | 258 ++++++ firmware/tpi.h | 47 + firmware/tpi_defs.h | 59 ++ firmware/usbasp.h | 70 ++ firmware/usbconfig.h | 240 +++++ firmware/usbdrv/Changelog.txt | 308 +++++++ firmware/usbdrv/CommercialLicense.txt | 166 ++++ firmware/usbdrv/License.txt | 361 ++++++++ firmware/usbdrv/Readme.txt | 172 ++++ firmware/usbdrv/USB-ID-FAQ.txt | 149 +++ firmware/usbdrv/USB-IDs-for-free.txt | 148 +++ firmware/usbdrv/asmcommon.inc | 188 ++++ firmware/usbdrv/oddebug.c | 50 + firmware/usbdrv/oddebug.h | 123 +++ firmware/usbdrv/usbconfig-prototype.h | 376 ++++++++ firmware/usbdrv/usbdrv.c | 625 +++++++++++++ firmware/usbdrv/usbdrv.h | 735 +++++++++++++++ firmware/usbdrv/usbdrvasm.S | 393 ++++++++ firmware/usbdrv/usbdrvasm.asm | 21 + firmware/usbdrv/usbdrvasm12.inc | 393 ++++++++ firmware/usbdrv/usbdrvasm128.inc | 750 +++++++++++++++ firmware/usbdrv/usbdrvasm15.inc | 423 +++++++++ firmware/usbdrv/usbdrvasm16.inc | 346 +++++++ firmware/usbdrv/usbdrvasm165.inc | 453 ++++++++++ firmware/usbdrv/usbdrvasm18-crc.inc | 707 +++++++++++++++ firmware/usbdrv/usbdrvasm20.inc | 360 ++++++++ firmware/usbdrv/usbportability.h | 144 +++ 67 files changed, 11086 insertions(+) create mode 100755 Changelog.txt create mode 100755 Readme.txt create mode 100755 bin/firmware/Makefile create mode 100755 bin/firmware/Makefile48 create mode 100755 bin/firmware/Makefile88 create mode 100644 bin/firmware/usbasp.atmega48.2009-02-28.hex create mode 100644 bin/firmware/usbasp.atmega8.2011-05-28.hex create mode 100644 bin/firmware/usbasp.atmega88.2011-05-28.hex create mode 100755 bin/linux-nonroot/99-USBasp.rules create mode 100755 bin/linux-nonroot/install_rule create mode 100644 bin/win-driver/Readme.txt create mode 100644 bin/win-driver/libusb_0.1.12.1/libusb0.dll create mode 100644 bin/win-driver/libusb_0.1.12.1/libusb0.sys create mode 100644 bin/win-driver/libusb_0.1.12.1/libusb0_x64.dll create mode 100644 bin/win-driver/libusb_0.1.12.1/libusb0_x64.sys create mode 100644 bin/win-driver/libusb_0.1.12.1/testlibusb-win.exe create mode 100644 bin/win-driver/libusb_0.1.12.1/testlibusb.exe create mode 100644 bin/win-driver/libusb_0.1.12.1/usbasp.cat create mode 100644 bin/win-driver/libusb_0.1.12.1/usbasp.inf create mode 100644 bin/win-driver/libusb_0.1.12.1/usbasp_x64.cat create mode 100644 bin/win-driver/libusb_1.2.4.0/amd64/libusb0.dll create mode 100644 bin/win-driver/libusb_1.2.4.0/amd64/libusb0.sys create mode 100644 bin/win-driver/libusb_1.2.4.0/ia64/libusb0.dll create mode 100644 bin/win-driver/libusb_1.2.4.0/ia64/libusb0.sys create mode 100644 bin/win-driver/libusb_1.2.4.0/installer_x64.exe create mode 100644 bin/win-driver/libusb_1.2.4.0/installer_x86.exe create mode 100644 bin/win-driver/libusb_1.2.4.0/libusb-win32-bin-README.txt create mode 100644 bin/win-driver/libusb_1.2.4.0/license/libusb-win32/installer_license.txt create mode 100644 bin/win-driver/libusb_1.2.4.0/usbasp.cat create mode 100644 bin/win-driver/libusb_1.2.4.0/usbasp.inf create mode 100644 bin/win-driver/libusb_1.2.4.0/x86/libusb0.sys create mode 100644 bin/win-driver/libusb_1.2.4.0/x86/libusb0_x86.dll create mode 100755 circuit/USBasp.sch create mode 100755 circuit/USBasp_schematics.pdf create mode 100755 firmware/Makefile create mode 100755 firmware/clock.c create mode 100755 firmware/clock.h create mode 100755 firmware/isp.c create mode 100755 firmware/isp.h create mode 100755 firmware/main.c create mode 100644 firmware/tpi.S create mode 100644 firmware/tpi.h create mode 100644 firmware/tpi_defs.h create mode 100644 firmware/usbasp.h create mode 100755 firmware/usbconfig.h create mode 100644 firmware/usbdrv/Changelog.txt create mode 100644 firmware/usbdrv/CommercialLicense.txt create mode 100644 firmware/usbdrv/License.txt create mode 100644 firmware/usbdrv/Readme.txt create mode 100644 firmware/usbdrv/USB-ID-FAQ.txt create mode 100644 firmware/usbdrv/USB-IDs-for-free.txt create mode 100644 firmware/usbdrv/asmcommon.inc create mode 100644 firmware/usbdrv/oddebug.c create mode 100644 firmware/usbdrv/oddebug.h create mode 100644 firmware/usbdrv/usbconfig-prototype.h create mode 100644 firmware/usbdrv/usbdrv.c create mode 100644 firmware/usbdrv/usbdrv.h create mode 100644 firmware/usbdrv/usbdrvasm.S create mode 100644 firmware/usbdrv/usbdrvasm.asm create mode 100644 firmware/usbdrv/usbdrvasm12.inc create mode 100644 firmware/usbdrv/usbdrvasm128.inc create mode 100644 firmware/usbdrv/usbdrvasm15.inc create mode 100644 firmware/usbdrv/usbdrvasm16.inc create mode 100644 firmware/usbdrv/usbdrvasm165.inc create mode 100644 firmware/usbdrv/usbdrvasm18-crc.inc create mode 100644 firmware/usbdrv/usbdrvasm20.inc create mode 100644 firmware/usbdrv/usbportability.h diff --git a/Changelog.txt b/Changelog.txt new file mode 100755 index 0000000..b94a441 --- /dev/null +++ b/Changelog.txt @@ -0,0 +1,53 @@ +usbasp.2011-05-28 (v1.4) +------------------------ +- added TPI support for ATTiny4/5/6/10 (by Slawomir FraÅ›) +- added support for controllers with flash >128kb (by Slawomir FraÅ›) +- fixed resync after program enable signal to pulse RST (based on patch by Marco S) +- updated usb driver to V-USB Release 2010-07-15 + + +usbasp.2009-02-28 (v1.3) +------------------------ +- added support for software control of ISP speed (based on patch by Jurgis Brigmanis) +- included new AVRUSB driver version (Release 2008-11-26) +- added libusb 0.1.12.1 windows drivers (needed for WinAVR version 20080512 or greater) + +usbasp.2007-10-23 (v1.2) +------------------------ +- red LED turns on before connecting to target device: this signal can be used to control external tri-state buffers (by Pawel Szramowski) + +usbasp.2007-07-23 +----------------- +- changed licence to GNU GPL v2 +- included new AVRUSB driver version (Release 2007-07-07); AVRUSB licence was changed to GNU GPL v2 +- fixed long addressing for Mega128 (by BoskiDialer) + +usbasp.2006-12-29 +----------------- +- fixed returnvalue in usbWriteFunction (by Jeroen Koeter) +- changed clock.h: adaptation for newer MCUs like ATMega48 (by Hanns-Konrad Unger) +- improved Makefile to select target (by Hanns-Konrad Unger) +- circuit diagram: added zener diodes to USB data lines + +usbasp.2006-09-16 +----------------- +- add usb reset on startup +- included new AVRUSB driver version (Release 2006-07-18) +- changed VID and PID to OBDEV's shared IDs to meet new licence conditions +- removed avrdude patch from this package. USBasp is supported in latest avrdude CVS version + +usbasp.2005-11-14 +----------------- +- fixed blocksize restriction (programming the Mega128 now works) + by Thomas Pfeifer (TP) +- update patch for avrdude-5.0 + +usbasp.2005-07-03 +----------------- +- set USB_CFG_SAMPLE_EXACT in usbconfig.h to reduce problems with long cables +- corrected vendor string +- added notes on setting fuse bits + +usbasp.2005-04-21 +----------------- +- first public version diff --git a/Readme.txt b/Readme.txt new file mode 100755 index 0000000..120db46 --- /dev/null +++ b/Readme.txt @@ -0,0 +1,142 @@ +This is the README file for USBasp. + +USBasp is a USB in-circuit programmer for Atmel AVR controllers. It simply +consists of an ATMega88 or an ATMega8 and a couple of passive components. +The programmer uses a firmware-only USB driver, no special USB controller +is needed. + +Features: +- Works under multiple platforms. Linux, Mac OS X and Windows are tested. +- No special controllers or smd components are needed. +- Programming speed is up to 5kBytes/sec. +- SCK option to support targets with low clock speed (< 1,5MHz). +- Planned: serial interface to target (e.g. for debugging). + + +LICENSE + +USBasp is distributed under the terms and conditions of the GNU GPL version +2 (see "firmware/usbdrv/License.txt" for details). + +USBasp is built with V-USB driver by OBJECTIVE DEVELOPMENT GmbH. See +"firmware/usbdrv/" for further information. + + +LIMITATIONS + +Hardware: +This package includes a circuit diagram. This circuit can only be used for +programming 5V target systems. For other systems a level converter is needed. + +Firmware: +The firmware dosn't support USB Suspend Mode. A bidirectional serial +interface to slave exists in hardware but the firmware doesn't support it yet. + + +USE PRECOMPILED VERSION + +Firmware: +Flash "bin/firmware/usbasp.atmega88.xxxx-xx-xx.hex" or +"bin/firmware/usbasp.atmega8.xxxx-xx-xx.hex" to the used controller with a +working programmer (e.g. with avrdude, uisp, ...). Set jumper J2 to activate +USBasp firmware update function. +You have to change the fuse bits for external crystal (see "make fuses"). +# TARGET=atmega8 HFUSE=0xc9 LFUSE=0xef +# TARGET=atmega48 HFUSE=0xdd LFUSE=0xff +# TARGET=atmega88 HFUSE=0xdd LFUSE=0xff + +Windows: +Start Windows and connect USBasp to the system. When Windows asks for a +driver, choose "bin/win-driver". On Win2k and WinXP systems, Windows will +warn that the driver is is not 'digitally signed'. Ignore this message and +continue with the installation. +Now you can run avrdude. Examples: +1. Enter terminal mode with an AT90S2313 connected to the programmer: + avrdude -c usbasp -p at90s2313 -t +2. Write main.hex to the flash of an ATmega8: + avrdude -c usbasp -p atmega8 -U flash:w:main.hex + +Setting jumpers: +J1 Power target + Supply target with 5V (USB voltage). Be careful with this option, the + circuit isn't protected against short circuit! +J2 Jumper for firmware upgrade (not self-upgradable) + Set this jumper for flashing the ATMega(4)8 of USBasp with another working + programmer. +J3 SCK option + If the target clock is lower than 1,5 MHz, you have to set this jumper. + Then SCK is scaled down from 375 kHz to about 8 kHz. + + +BUILDING AND INSTALLING FROM SOURCE CODE + +Firmware: +To compile the firmware +1. install the GNU toolchain for AVR microcontrollers (avr-gcc, avr-libc), +2. change directory to firmware/ +3. run "make main.hex" +4. flash "main.hex" to the ATMega(4)8. E.g. with uisp or avrdude (check +the Makefile option "make flash"). To flash the firmware you have +to set jumper J2 and connect USBasp to a working programmer. +You have to change the fuse bits for external crystal, (check the Makefile +option "make fuses"). + +Software (avrdude): +AVRDUDE supports USBasp since version 5.2. +1. install libusb: http://libusb.sourceforge.net/ +2. get latest avrdude release: http://download.savannah.gnu.org/releases/avrdude/ +3. cd avrdude-X.X.X +5. configure to your environment: + ./bootstrap (I had to comment out the two if-blocks which verify the + installed versions of autoconf and automake) + ./configure +6. compile and install it: + make + make install + +Notes on Windows (Cygwin): +Download libusb-win32-device-bin-x.x.x.x.tar.gz from +http://libusb-win32.sourceforge.net/ and unpack it. +-> copy lib/gcc/libusb.a to lib-path +-> copy include/usb.h to include-path +cd avrdude +./configure LDFLAGS="-static" --enable-versioned-doc=no +make + +Notes on Darwin/MacOS X: +after "./configure" I had to edit Makefile: +change "avrdude_CPPFLAGS" to "AM_CPPFLAGS" +(why is this needed only on mac? bug in configure.ac?) + +Notes on Linux: +To use USBasp as non-root, you have to define some device rules. See +bin/linux-nonroot for an example. + +FILES IN THE DISTRIBUTION + +Readme.txt ...................... The file you are currently reading +firmware ........................ Source code of the controller firmware +firmware/usbdrv ................. AVR USB driver by Objective Development +firmware/usbdrv/License.txt ..... Public license for AVR USB driver and USBasp +circuit ......................... Circuit diagram in PDF and EAGLE format +bin ............................. Precompiled programs +bin/win-driver .................. Windows driver +bin/firmware .................... Precompiled firmware +bin/linux-nonroot ............... Linux device rule file + + +MORE INFORMATION + +For more information on USBasp and it's components please visit the +following URLs: + +USBasp .......................... http://www.fischl.de/usbasp/ + +Firmware-only V-USB driver ...... http://www.obdev.at/products/vusb/ +avrdude ......................... http://www.nongnu.org/avrdude/ +libusb .......................... http://libusb.sourceforge.net/ +libusb-win32 .................... http://libusb-win32.sourceforge.net/ + + +2011-05-28 Thomas Fischl +http://www.fischl.de diff --git a/bin/firmware/Makefile b/bin/firmware/Makefile new file mode 100755 index 0000000..5fd3b38 --- /dev/null +++ b/bin/firmware/Makefile @@ -0,0 +1,11 @@ +MCU_TARGET = atmega8 +FLASHER = avrdude -c usbasp -p $(MCU_TARGET) + +usbasp: fuses + $(FLASHER) -B 1 -U flash:w:usbasp.atmega8.2011-05-28.hex + +fuses: + $(FLASHER) -B 200 -U hfuse:w:0xC9:m -U lfuse:w:0xEF:m +shell: + $(FLASHER) -t + diff --git a/bin/firmware/Makefile48 b/bin/firmware/Makefile48 new file mode 100755 index 0000000..2d2b466 --- /dev/null +++ b/bin/firmware/Makefile48 @@ -0,0 +1,11 @@ +MCU_TARGET = atmega48 +FLASHER = avrdude -c usbasp -p $(MCU_TARGET) + +usbasp: fuses + $(FLASHER) -B 1 -U flash:w:usbasp.atmega48.2009-02-28.hex + +fuses: + $(FLASHER) -B 200 -U hfuse:w:0xdd:m -U lfuse:w:0xff:m +shell: + $(FLASHER) -t + diff --git a/bin/firmware/Makefile88 b/bin/firmware/Makefile88 new file mode 100755 index 0000000..ca9eb48 --- /dev/null +++ b/bin/firmware/Makefile88 @@ -0,0 +1,11 @@ +MCU_TARGET = atmega88 +FLASHER = avrdude -c usbasp -p $(MCU_TARGET) + +usbasp: fuses + $(FLASHER) -B 1 -U flash:w:usbasp.atmega88.2011-05-28.hex + +fuses: + $(FLASHER) -B 300 -U lfuse:w:0xff:m -U hfuse:w:0xdd:m +shell: + $(FLASHER) -B 200 -t + diff --git a/bin/firmware/usbasp.atmega48.2009-02-28.hex b/bin/firmware/usbasp.atmega48.2009-02-28.hex new file mode 100644 index 0000000..81b09c2 --- /dev/null +++ b/bin/firmware/usbasp.atmega48.2009-02-28.hex @@ -0,0 +1,242 @@ +:1000000042C0ADC15BC05AC059C058C057C056C0ED +:1000100055C054C053C052C051C050C04FC04EC054 +:100020004DC04CC04BC04AC049C048C047C046C084 +:1000300045C044C0040309041C037700770077001F +:100040002E00660069007300630068006C002E00DB +:10005000640065000E035500530042006100730008 +:10006000700012011001FF000008C016DC0503013A +:1000700001020001090212000101008019090400B7 +:1000800000000000000011241FBECFEFD2E0DEBF51 +:10009000CDBF11E0A0E0B1E0E0E0FFE002C00590DC +:1000A0000D92A230B107D9F711E0A2E0B1E001C092 +:1000B0001D92A734B107E1F7C4D420C7A1CFE9E668 +:1000C000F0E0808183608083E89A08951F93CF9346 +:1000D000DF9360912801635067FD13C08091250173 +:1000E000CCE0D0E0C81BD109C45DDE4F8091240173 +:1000F0008D3209F462C08091020187FD84C01092A4 +:1001000028018091000184FF4AC0609101016F3F86 +:1001100009F445C0693070F1685060930101809125 +:10012000180198E889278093180168E080910201FE +:1001300087FD8BC0209126013091270186FF6DC07D +:10014000A9E1B1E080E090E0F901E80FF91FE49146 +:10015000ED9301966817C1F76150862F90E06F5FAD +:100160000196820F931F9093270180932601162FEB +:100170001C5F0BC0109201018091180198E889273B +:1001800080931801662391F614E089E191E0E3D0B1 +:100190001C3019F08FEF809301011093000194E15E +:1001A00083B1837031F49150D9F7109229011092E4 +:1001B0002301DF91CF911F910895683009F09FCFFF +:1001C00083EC809318018AE580930001109202016C +:1001D0008881807659F59A8110922101898188233E +:1001E00009F043C01092220122E081E291E0909355 +:1001F0002701809326018F81882319F49E8192170D +:1002000008F1922F1FC0CE012DD48F3F51F18823CA +:1002100009F475CF1092010172CF962FD901E9E14F +:10022000F1E08D9181939150E1F796CFCE010CD5FD +:10023000282F8F3F01F7888187FD25C09FEF80E839 +:1002400080930201909301015ACF89E191E0ACD4EF +:10025000682F893008F453C08FEF809301011EE1AD +:100260009CCF8EE1809300014ACF853071F08630BB +:1002700091F0883031F1893061F18A3031F120E03C +:1002800081E291E0B4CF9E81DACF9093290120E002 +:1002900081E291E0ACCF8B81813049F18230F9F07D +:1002A000833029F020E080E480930201A4CF9923D9 +:1002B00049F584E390E0909327018093260124E0A0 +:1002C000F2CF21E08BE291E092CF21E081E291E058 +:1002D0008ECF90932B0120E081E291E088CF84E7DC +:1002E00090E0909327018093260122E1DCCF82E603 +:1002F00090E0909327018093260122E1D4CF182F1C +:100300001C5F43CF913051F0923061F684E590E06C +:1003100090932701809326012EE0C5CF88E390E0DB +:1003200090932701809326012CE1BDCFA82FB92FF0 +:1003300080E090E041E050EA60956F5F58F42D91C5 +:1003400038EF82279795879510F0842795273F5F90 +:10035000C8F3F3CF0895EADF8D939D930895CF936B +:10036000CFB7CF93C395189BE9F7189B09C0189B8B +:1003700007C0189B05C0189B03C0189B01C0A1C0F3 +:10038000DF93C0912501DD27C45DDE4F189B02C0BD +:10039000DF91EBCF2F930F931F9303B12FEF00FB50 +:1003A00020F94F933F9313B14FEF012700FB21F941 +:1003B0003BE031C04E7F012F13B1216028C0102FC8 +:1003C0004D7F2260000003B129C04B7F2460012FC4 +:1003D000000013B12BC013B1477F28602AC04F7EA5 +:1003E00003B120612CC04F7D13B120622FC04F7B21 +:1003F00003B1206432C0422703B149934FEF00009C +:10040000102710FB20F913B11370C9F1297F91F265 +:10041000012700FB21F903B1237F89F2315058F104 +:10042000102710FB22F913B1277E79F2012700FB78 +:1004300023F92F7C81F203B1102710FB24F92F79C7 +:1004400071F200C013B1012700FB25F92F7359F297 +:1004500000C003B1102710FB26F9223040F200C083 +:1004600013B1012700FB27F9243028F64F772068C5 +:1004700013B10000F9CF11E01CBB002717C03B509F +:100480003195C31BD04011E01CBB0881033CE9F04F +:100490000B34D9F0209123011981110F1213EDCFE4 +:1004A000093641F10D3211F0013E39F700932A016E +:1004B0003F914F911F910F912F91DF91CCB3C0FDD0 +:1004C00051CFCF91CFBFCF91189520912A012223F0 +:1004D00079F310912801112311F5343012F1309382 +:1004E000280120932401109125013BE0311B30931A +:1004F000250117C00091280101308CF40AE53091E4 +:10050000000134FD10C000930001C8E1D1E00FC02C +:100510002795A8F45150A9F4220F0000F9CF4AE51D +:1005200003C042ED01C0432FC4E1D0E032E014B17A +:100530001360289A14B905B120E413E05F930127F2 +:1005400056E005B9279520F4515021F4220FF9CF38 +:10055000012756E000003B5A05B9D0F2279528F450 +:10056000515029F4220F0000F9CF012756E02795BA +:1005700005B920F4515021F4220FF9CF012756E09C +:100580002991332305B921F60C7F10912901110F10 +:10059000C651D04005B911F01093230111E01CBBE6 +:1005A000016014B11C7F402F4C7F5F9100C000C0E0 +:1005B00005B914B945B97CCF809145018CBD8091B6 +:1005C00042018DBD0895282F8823A1F0883008F0BE +:1005D0003FC08CE793E09093440180934301243023 +:1005E00001F12530A0F0263081F1263050F127307E +:1005F000E1F008958DE993E09093440180934301E5 +:1006000082E58093450181E0809342010895223084 +:10061000A1F0233070F4213061F780EC8093460123 +:10062000089588E180934601089583E08093460110 +:10063000089580E380934601089580E68093460103 +:1006400008958CE080934601089520934601089513 +:100650008DE993E09093440180934301109242010D +:10066000293041F02A3050F4283051F683E5809348 +:100670004501089582E58093450108952B3031F0BE +:100680002C3009F0BDCF81E08093420181E5809359 +:100690004501089526B59091460186B5821B8917BC +:1006A000E0F3089584B18C6284B92A982D9896B5A8 +:1006B0002091460186B5891B8217E0F32A9A96B5E8 +:1006C00086B5891B8217E0F32A98809143019091A7 +:1006D00044018D59934009F00895809145018CBDE6 +:1006E000809142018DBD089584B1837D84B985B127 +:1006F000837D85B91CBC0895582F2091460140E0A8 +:1007000030E057FD16C02B98440F1C994F5F2D9A6F +:1007100096B586B5891B8217E0F32D9896B586B5F8 +:10072000891B8217E0F33F5F383029F0550F57FFE0 +:10073000EACF2B9AE9CF842F08958EBD0DB407FE22 +:10074000FDCF8EB508950F931F930FE1E091430104 +:10075000F09144018CEA0995E0914301F091440144 +:1007600083E50995E0914301F091440180E009950A +:10077000182FE0914301F091440180E00995133571 +:1007800039F11CBC2D9A96B52091460186B5891B7E +:100790008217E0F32D9896B586B5891B8217E0F392 +:1007A000E0914301F091440183E0ED39F80721F035 +:1007B000002351F00150CECF809145018CBD809136 +:1007C00042018DBD0023B1F781E01F910F91089583 +:1007D00080E01F910F910895EF92FF920F931F9366 +:1007E0007B018C01862F8170880F880F880FE09124 +:1007F0004301F091440180620995D801C70129E0C5 +:10080000B695A795979587952A95D1F7E0914301DD +:10081000F0914401099516950795F794E794E091B6 +:100820004301F09144018E2D0995E0914301F0912F +:10083000440180E009951F910F91FF90EF9008957A +:100840000F931F938C01E0914301F091440180EAE2 +:100850000995E0914301F0914401812F0995E091C0 +:100860004301F0914401802F0995E0914301F091FB +:10087000440180E009951F910F910895FF920F9315 +:100880001F938C01F62EE0914301F091440180EC1E +:100890000995E0914301F0914401812F0995E09180 +:1008A0004301F0914401802F0995E0914301F091BB +:1008B00044018F2D09958EE1B7D080E01F910F91F3 +:1008C000FF900895CF92DF92EF92FF920F931F93C4 +:1008D0006B017C01142FE0914301F09144018CE401 +:1008E0000995D701C60149E0B695A79597958795D3 +:1008F0004A95D1F7E0914301F09144010995D70160 +:10090000C601B695A79597958795E0914301F0911B +:1009100044010995E0914301F091440180E009957B +:100920001F3FF1F016B50EE1C701B60155DF8F3F4D +:1009300079F486B5811B8D33B8F316B50150A1F754 +:1009400081E01F910F91FF90EF90DF90CF9008957D +:1009500080E01F910F91FF90EF90DF90CF9008956E +:100960008FE062D080E01F910F91FF90EF90DF90B9 +:10097000CF900895CF92DF92EF92FF920F931F9343 +:100980006B017C01042F122F862F8170880F880F36 +:10099000880FE0914301F091440180640995D701EB +:1009A000C60169E0B695A795979587956A95D1F7A1 +:1009B000E0914301F09144010995D701C601B69534 +:1009C000A79597958795E0914301F091440109958A +:1009D000E0914301F0914401802F09951123C1F06A +:1009E0000F37F1F016B50EE1C701B601F5DE8F370E +:1009F00079F486B5811B8D33B8F316B50150A1F794 +:100A000081E01F910F91FF90EF90DF90CF900895BC +:100A100080E01F910F91FF90EF90DF90CF900895AD +:100A20008FE002D080E0F5CF382F882349F020E016 +:100A300096B586B5891B8C33E0F32F5F2317C0F37F +:100A400008951BB815B88BEF8AB98FEF84B914B825 +:100A500093E097B98EEF88B995BD31DB789436DB9A +:100A600035DBFDCFFF920F931F93CF93DF93F82ECB +:100A7000292F062F40910301413051F0443041F0BD +:100A80001FEF812FDF91CF911F910F91FF9008955C +:100A9000002309F487C08F2D922F9C01E90110E0FB +:100AA00053C08091140190911501892B09F058C011 +:100AB00060911001709111018091120190911301C8 +:100AC00021E0488157DF8091040190910501019751 +:100AD0009093050180930401892BD9F410920301AE +:100AE0008091160181FF3AC08091170190E020911A +:100AF0001401309115018217930781F16091100163 +:100B00007091110180911201909113014881DADEF8 +:100B100011E08091100190911101A0911201B0910A +:100B200013010196A11DB11D809310019093110135 +:100B3000A0931201B093130121969E012F19201743 +:100B400008F09FCF40910301413009F4AACF68819A +:100B5000809110019091110191DEB5CF11E0D9CFB4 +:100B60006091100170911101809112019091130117 +:100B700020E04881FFDE80911701815080931701AA +:100B8000882309F0A0CF609110017091110180912C +:100B9000120190911301488195DE80911401809398 +:100BA000170191CF10E06DCF0F931F93CF93DF9379 +:100BB000082F162F40910301842F8250823038F085 +:100BC0001FEF812FDF91CF911F910F910895662321 +:100BD00099F1802F9C01E90120C080911001909132 +:100BE00011012EDE88838091100190911101A09156 +:100BF0001201B09113010196A11DB11D8093100146 +:100C000090931101A0931201B093130121969E01BC +:100C1000201B211778F4409103014230F1F66091D6 +:100C20001001709111018091120190911301D4DD96 +:100C30008883D9CF183028F610920301812FDF91D5 +:100C4000CF911F910F9108950F931F93CF93DF932F +:100C50008C01EC0189818130F1F0823009F4B0C05F +:100C6000833031F1843009F482C0873009F456C0F2 +:100C7000853009F41EC1863009F4D7C0883009F4E4 +:100C8000A5C0893009F41CC18A3009F42DC180E067 +:100C9000C8E0D1E037C0329B3EC08091060193DCB2 +:100CA000109207014198FEDC80E0C8E0D1E02AC044 +:100CB000E0914301F0914401E8018A810995C8E07F +:100CC000D1E0809308012091430130914401F80163 +:100CD0008381F901099580930901209143013091A5 +:100CE0004401F8018481F901099580930A0120915A +:100CF000430130914401F8018581F9010995809300 +:100D00000B0184E0D0932701C0932601DF91CF919E +:100D10001F910F91089585E056DCC2CF80910701A5 +:100D2000882399F4E8019B8180E02A8130E0822BBE +:100D3000932BAA2797FDA095BA2F8093100190932B +:100D40001101A0931201B0931301F801978180E083 +:100D5000268130E0822B932B909305018093040130 +:100D600083E0809303018FEFC8E0D1E0CBCF809187 +:100D70000701882399F4E8019B8180E02A8130E013 +:100D8000822B932BAA2797FDA095BA2F8093100151 +:100D900090931101A0931201B0931301F801978170 +:100DA00080E0268130E0822B932B90930501809385 +:100DB000040182E0809303018FEFC8E0D1E0A2CF6D +:100DC00093DC419A80E0C8E0D1E09CCF809107019C +:100DD000882399F4F801938180E0228130E0822B0E +:100DE000932BAA2797FDA095BA2F8093100190937B +:100DF0001101A0931201B0931301109215011092EA +:100E0000140110921601E8019F8180E02E8130E0EC +:100E1000822B932B909305018093040184E08093AF +:100E200003018FEFC8E0D1E06DCF809107018823E7 +:100E300099F4E8019B8180E02A8130E0822B932B9A +:100E4000AA2797FDA095BA2F8093100190931101C6 +:100E5000A0931201B0931301F80184819581292F89 +:100E60002F7020931601492F50E0407F507042951B +:100E70005295507F5427407F5427480F511D50935F +:100E800015014093140120FF02C040931701E801AF +:100E90009F8180E02E8130E0822B932B909305017F +:100EA0008093040181E0809303018FEFC8E0D1E0DB +:100EB00029CF49DCC8E0D1E08093080181E022CF4E +:100EC00081E080930701F80182819381A481B5813B +:100ED0008093100190931101A0931201B09313011C +:100EE00080E0C8E0D1E00ECFE8018A81809306015E +:100EF000C8E0D1E01092080181E004CFF894FFCF60 +:020F00005AFF96 +:00000001FF diff --git a/bin/firmware/usbasp.atmega8.2011-05-28.hex b/bin/firmware/usbasp.atmega8.2011-05-28.hex new file mode 100644 index 0000000..dc54506 --- /dev/null +++ b/bin/firmware/usbasp.atmega8.2011-05-28.hex @@ -0,0 +1,296 @@ +:100000003BC0A6C154C053C052C051C050C04FC025 +:100010004EC04DC04CC04BC04AC049C048C047C08C +:1000200046C045C044C0040309041C0377007700A0 +:1000300077002E00660069007300630068006C00A2 +:100040002E00640065000E0355005300420061005D +:100050007300700012011001FF000008C016DC05DB +:1000600004010102000109021200010100801909C6 +:10007000040000000000000011241FBECFE5D4E002 +:10008000DEBFCDBF10E0A0E6B0E0EAE5F2E102C0DD +:1000900005900D92A236B107D9F710E0A2E6B0E0C4 +:1000A00001C01D92AA3AB107E1F766D5D4C8A8CF1E +:1000B00085B7836085BF8BB780648BBF08951F931E +:1000C000CF93DF9360918800635067FD13C08091E8 +:1000D0008500CCE0D0E0C81BD109C457DF4F809128 +:1000E00084008D3209F462C08091620087FD84C073 +:1000F000109288008091600084FF4AC06091610086 +:100100006F3F09F445C0693070F168506093610039 +:100110008091780098E889278093780068E0809142 +:10012000620087FD8BC0209186003091870086FF9A +:100130006DC0A9E7B0E080E090E0F901E80FF91F99 +:10014000E491ED9301966817C1F76150862F90E016 +:100150006F5F0196820F931F9093870080938600B4 +:10016000162F1C5F0BC0109261008091780098E8F8 +:10017000892780937800662391F614E089E790E060 +:10018000E3D01C3019F08FEF809361001093600072 +:1001900094E186B3837031F49150D9F710928900BD +:1001A00010928300DF91CF911F910895683009F07C +:1001B0009FCF83EC809378008AE580936000109253 +:1001C00062008881807659F59A8110928100898138 +:1001D000882309F043C01092820022E081E890E079 +:1001E00090938700809386008F81882319F49E81E5 +:1001F000921708F1922F1FC0CE01CFD48F3F51F13B +:10020000882309F475CF1092610072CF962FD9011F +:10021000E9E7F0E08D9181939150E1F796CFCE011F +:1002200004D6282F8F3F01F7888187FD25C09FEFD7 +:1002300080E880936200909361005ACF89E790E054 +:1002400082D5682F893008F453C08FEF8093610006 +:100250001EE19CCF8EE1809360004ACF853071F023 +:10026000863091F0883031F1893061F18A3031F196 +:1002700020E081E890E0B4CF9E81DACF90938900AE +:1002800020E081E890E0ACCF8B81813049F1823071 +:10029000F9F0833029F020E080E480936200A4CF5D +:1002A000992349F586E290E0909387008093860039 +:1002B00024E0F2CF21E08BE890E092CF21E081E8CA +:1002C00090E08ECF90938B0020E081E890E088CF83 +:1002D00086E690E0909387008093860022E1DCCF51 +:1002E00084E590E0909387008093860022E1D4CF4C +:1002F000182F1C5F43CF913051F0923061F686E4A5 +:1003000090E090938700809386002EE0C5CF8AE22C +:1003100090E090938700809386002CE1BDCFA82FBA +:10032000B92F80E090E041E050EA609530E009C0EC +:100330002D9182279795879510F084279527305E19 +:10034000C8F36F5FA8F30895EADF8D939D93089536 +:10035000CF93CFB7CF93C395B09BE9F7B09B09C0BC +:10036000B09B07C0B09B05C0B09B03C0B09B01C051 +:10037000A1C0DF93C0918500DD27C457DF4FB09B3C +:1003800002C0DF91EBCF2F930F931F9306B32FEF94 +:1003900000FB20F94F933F9316B34FEF012700FB6B +:1003A00021F93BE031C04E7F012F16B3216028C0F8 +:1003B000102F4D7F2260000006B329C04B7F2460C0 +:1003C000012F000016B32BC016B3477F28602AC048 +:1003D0004F7E06B320612CC04F7D16B320622FC024 +:1003E0004F7B06B3206432C0422706B349934FEFD8 +:1003F0000000102710FB20F916B31370C9F1297FF4 +:1004000091F2012700FB21F906B3237F89F23150D5 +:1004100058F1102710FB22F916B3277E79F2012735 +:1004200000FB23F92F7C81F206B3102710FB24F97F +:100430002F7971F200C016B3012700FB25F92F7345 +:1004400059F200C006B3102710FB26F9223040F203 +:1004500000C016B3012700FB27F9243028F64F7798 +:10046000206816B30000F9CF10E41ABF002717C0A8 +:100470003B503195C31BD04010E41ABF0881033CA8 +:10048000E9F00B34D9F0209183001981110F121378 +:10049000EDCF093641F10D3211F0013E39F70093ED +:1004A0008A003F914F911F910F912F91DF91CAB711 +:1004B000C6FD51CFCF91CFBFCF91189520918A0023 +:1004C000222379F310918800112311F5343012F1B1 +:1004D0003093880020938400109185003BE0311B0D +:1004E0003093850017C00091880001308CF40AE534 +:1004F0003091600034FD10C000936000C8E7D0E088 +:100500000FC02795A8F45150A9F4220F0000F9CF8D +:100510004AE503C042ED01C0432FC4E1D0E032E020 +:1005200017B31360C09A17BB08B320E413E05F93BE +:10053000012756E008BB279520F4515021F4220FE3 +:10054000F9CF012756E000003B5A08BBD0F22795AF +:1005500028F4515029F4220F0000F9CF012756E06A +:10056000279508BB20F4515021F4220FF9CF012721 +:1005700056E02991332308BB21F60C7F10918900A6 +:10058000110FC651D04008BB11F01093830010E446 +:100590001ABF016017B31C7F402F4C7F5F9100C0D2 +:1005A00000C008BB17BB48BB7CCF8091A5008DB9AC +:1005B0008091A2008EB90895282F8823A1F0883059 +:1005C00008F042C08EE793E09093A4008093A300CC +:1005D000243019F12530B8F0263099F1263068F131 +:1005E0002730F9F008958FE993E09093A400809369 +:1005F000A30081E08093A70082E58093A50081E0BD +:100600008093A20008952230A1F0233070F42130AD +:1006100049F780EC8093A700089588E18093A700B4 +:10062000089583E08093A700089580E38093A70056 +:10063000089580E68093A70008958CE08093A7003A +:1006400008952093A70008958FE993E09093A40064 +:100650008093A3001092A20081E08093A70029302C +:1006600041F02A3050F4283039F683E58093A50014 +:10067000089582E58093A50008952B3029F02C3051 +:1006800009F0BACF8093A20081E58093A500089578 +:1006900022B79091A70082B7821B8917E0F30895D3 +:1006A00087B38C6287BBC298C59892B72091A70088 +:1006B00082B7891B8217E0F3C29A92B782B7891B6F +:1006C0008217E0F3C2988091A3009091A4008F5903 +:1006D000934019F01092A60008958091A5008DB95D +:1006E0008091A2008EB91092A600089587B3837DF1 +:1006F00087BB88B3837D88BB1DB80895582F209190 +:10070000A70040E030E057FD16C0C398440FB499ED +:100710004F5FC59A92B782B7891B8217E0F3C598DD +:1007200092B782B7891B8217E0F33F5F383029F018 +:10073000550F57FFEACFC39AE9CF842F08958FB999 +:10074000779BFECF8FB108950F931F930FE1E09138 +:10075000A300F091A4008CEA0995E091A300F09128 +:10076000A40083E50995E091A300F091A40080E046 +:100770000995182FE091A300F091A40080E009955D +:10078000133561F11DB822B79091A70082B7821B83 +:100790008917E0F3C29A22B782B7821B8917E0F368 +:1007A000C29822B782B7821B8917E0F3E091A300B9 +:1007B000F091A40083E0EF39F80721F0002351F015 +:1007C0000150C9CF8091A5008DB98091A2008EB94A +:1007D0000023B1F781E01F910F91089580E01F91F0 +:1007E0000F9108959B01AC0181E15695479537958E +:1007F00027958A95D1F78091A6008217D9F020938A +:10080000A600E091A300F091A4008DE40995E09189 +:10081000A300F091A40080E00995E091A300F0917D +:10082000A4008091A6000995E091A300F091A40096 +:1008300080E009950895EF92FF920F931F937B013B +:100840008C01D0DF8E2D8170880F880F880FE0918A +:10085000A300F091A40080620995D801C70129E0A6 +:10086000B695A795979587952A95D1F7E091A3001E +:10087000F091A400099516950795F794E794E091F7 +:10088000A300F091A4008E2D0995E091A300F091B2 +:10089000A40080E009951F910F91FF90EF900895BB +:1008A0000F931F938C01E091A300F091A40080EAC4 +:1008B0000995E091A300F091A400812F0995E091A2 +:1008C000A300F091A400802F0995E091A300F0917E +:1008D000A40080E009951F910F910895FF920F9356 +:1008E0001F938C01F62EE091A300F091A40080EC00 +:1008F0000995E091A300F091A400812F0995E09162 +:10090000A300F091A400802F0995E091A300F0913D +:10091000A4008F2D09958EE1B9D080E01F910F9131 +:10092000FF900895CF92DF92EF92FF920F931F9363 +:100930006B017C01142F56DFE091A300F091A4001D +:100940008CE40995D701C60149E0B695A79597951E +:1009500087954A95D1F7E091A300F091A4000995FD +:10096000D701C601B695A79597958795E091A30005 +:10097000F091A4000995E091A300F091A40080E01B +:1009800009951F3FF1F012B70EE1C701B60153DF21 +:100990008F3F79F482B7811B8D33B8F312B70150C2 +:1009A000A1F781E01F910F91FF90EF90DF90CF9022 +:1009B000089580E01F910F91FF90EF90DF90CF900E +:1009C00008958FE063D080E01F910F91FF90EF902A +:1009D000DF90CF900895CF92DF92EF92FF920F9326 +:1009E0001F936B017C01042F122FFCDE8C2D817074 +:1009F000880F880F880FE091A300F091A400806415 +:100A00000995D701C60169E0B695A7959795879591 +:100A10006A95D1F7E091A300F091A4000995D70160 +:100A2000C601B695A79597958795E091A300F0919B +:100A3000A4000995E091A300F091A400802F0995EE +:100A40001123C1F00F37F1F012B70EE1C701B60163 +:100A5000F2DE8F3779F482B7811B8D33B8F312B78A +:100A60000150A1F781E01F910F91FF90EF90DF906F +:100A7000CF90089580E01F910F91FF90EF90DF904D +:100A8000CF9008958FE002D080E0F5CF382F8823F3 +:100A900049F020E092B782B7891B8C33E0F32F5FD7 +:100AA0002317C0F30895BD9ABB98C39A50E217D09C +:100AB0005A95E9F70895AC0188E605D0842F03D054 +:100AC00089E601D0852F0FD028E030E0382780FB61 +:100AD000869506D02A95D1F730FB02D000D06894D5 +:100AE000BB98C39A16F0C398BB9AE091A800F09106 +:100AF000A9003197F0F7C59AE6B3E3FBE091A800AF +:100B0000F091A9003197F0F7C598089520ECE7DF40 +:100B100046F42A95E1F780E02AE1E5DF2A95E9F736 +:100B2000DECF28E030E0DBDF869587F938272A958D +:100B3000D1F7D5DF27F9322772F3D1DFD0CFDB0130 +:100B4000742FB9DF84E2BFDFE1DF8D937A95D1F7AF +:100B50000895DB01742FAFDF83EFB5DF8DE1B3DFE5 +:100B600084E6B1DF8D91AFDF82E7ADDFCFDF807844 +:100B7000D9F77A9589F7089512BA18BA8BEF81BB25 +:100B80008FEF87BB17BA93E094BB8EEF85BB93BF03 +:100B90008FDA789494DA93DAFDCFFF920F931F9354 +:100BA000CF93DF93082F792FF62E409163004130C9 +:100BB00069F0443059F0463009F492C01FEF812F9C +:100BC000DF91CF911F910F91FF900895FF2009F4BD +:100BD000B2C0802F972F9C01E90110E053C0809193 +:100BE000740090917500892B09F058C060917000D5 +:100BF000709171008091720090917300488121E0A2 +:100C0000EADE809164009091650001979093650001 +:100C100080936400892BD9F4109263008091760050 +:100C200081FF3AC08091770090E02091740030916C +:100C300075008217930781F16091700070917100C7 +:100C4000809172009091730048816CDE11E0809178 +:100C5000700090917100A0917200B09173000196A4 +:100C6000A11DB11D8093700090937100A09372003C +:100C7000B093730021969E01201B2F1508F09FCF83 +:100C800040916300413009F4AACF809170009091A7 +:100C90007100688123DEB5CF11E0D9CF609170007B +:100CA000709171008091720090917300488120E0F2 +:100CB00092DE80917700815080937700882309F03D +:100CC000A0CF60917000709171008091720090913E +:100CD0007300488127DE809174008093770091CF64 +:100CE0008091700090917100602F4F2D32DF8091C4 +:100CF000700090917100A0917200B09173008F0DFF +:100D0000911DA11DB11D8093700090937100A0935F +:100D10007200B093730080916400909165008F1908 +:100D200091099093650080936400892B21F41092BF +:100D3000630011E044CF10E0812FDF91CF911F912C +:100D40000F91FF9008950F931F93CF93DF93082F78 +:100D5000792F162F40916300842F8250823050F0FB +:100D6000453009F446C01FEF812FDF91CF911F91CD +:100D70000F9108954530E9F1662399F1802F9C0188 +:100D8000E90120C0809170009091710089DD888315 +:100D90008091700090917100A0917200B0917300E9 +:100DA0000196A11DB11D8093700090937100A093D6 +:100DB0007200B093730021969E01201B211778F4D6 +:100DC000409163004230F1F66091700070917100C3 +:100DD00080917200909173002EDD8883D9CF1830F6 +:100DE00018F610926300812FDF91CF911F910F9120 +:100DF00008958091700090917100602F412F9FDEC7 +:100E00008091700090917100A0917200B091730078 +:100E1000810F911DA11DB11D8093700090937100F1 +:100E2000A0937200B09373009FCF0F931F93CF9343 +:100E3000DF938C01DC0111968C91813009F44EC056 +:100E4000823009F4E7C0833009F455C0843009F4D6 +:100E5000B5C0873009F486C0853009F45AC18630A0 +:100E600009F410C1883009F4DBC0893009F458C195 +:100E70008A3009F469C18B3009F49CC18C3009F4C3 +:100E8000B7C18D3009F4CBC18E3009F4CFC18F309A +:100E900009F065C1F801938180E0228130E0822B66 +:100EA000932BAA2797FDA095BA2F8093700090935B +:100EB0007100A0937200B0937300978180E0268147 +:100EC00030E0822B932B909365008093640085E043 +:100ED000809363008FEFC8E6D0E038C09A9B3FC094 +:100EE0008091660069DB10926700A998D9DB80E0E9 +:100EF000C8E6D0E02BC0E091A300F091A400D80197 +:100F000012968C910995C8E6D0E080936800E09134 +:100F1000A300F091A400D80113968C9109958093B9 +:100F20006900E091A300F091A400D80114968C917F +:100F3000099580936A00E091A300F091A400D80184 +:100F400015968C91099580936B0084E0D09387006F +:100F5000C0938600DF91CF911F910F91089585E096 +:100F60002BDBC1CF80916700882399F4F80193812E +:100F700080E0228130E0822B932BAA2797FDA09559 +:100F8000BA2F8093700090937100A0937200B09379 +:100F90007300D80117969C91179780E016962C91B4 +:100FA00030E0822B932B909365008093640083E064 +:100FB000809363008FEFC8E6D0E0C8CF80916700D0 +:100FC000882399F4F801938180E0228130E0822B1C +:100FD000932BAA2797FDA095BA2F8093700090932A +:100FE0007100A0937200B0937300D80117969C9182 +:100FF000179780E016962C9130E0822B932B9093DC +:1010000065008093640082E0809363008FEFC8E600 +:10101000D0E09CCF6BDBA99A80E0C8E6D0E096CF09 +:10102000809167008823B1F4D80113969C9113979F +:1010300080E012962C9130E0822B932BAA2797FD0B +:10104000A095BA2F8093700090937100A0937200C6 +:10105000B093730010927500109274001092760095 +:10106000F801978180E0268130E0822B932B9093CA +:1010700065008093640084E0809363008FEFC8E68E +:10108000D0E064CF80916700882399F4F8019381C0 +:1010900080E0228130E0822B932BAA2797FDA09538 +:1010A000BA2F8093700090937100A0937200B09358 +:1010B0007300D80114968C91149715969C91292F42 +:1010C0002F7020937600492F50E0407F507042955A +:1010D0005295507F5427407F5427480F511D5093FD +:1010E00075004093740020FF02C040937700F80120 +:1010F000978180E0268130E0822B932B90936500CE +:101100008093640081E0809363008FEFC8E6D0E0B5 +:101110001DCF1ADBC8E6D0E08093680081E016CFCF +:1011200081E080936700F80182819381A481B58179 +:101130008093700090937100A0937200B09373003D +:1011400080E0C8E6D0E002CFD80112968C9180935F +:101150006600C8E6D0E01092680081E0F7CE8031EA +:1011600009F040C0D80113969C91139780E0129625 +:101170002C9130E0822B932BAA2797FDA095BA2FB4 +:101180008093700090937100A0937200B0937300ED +:10119000F801978180E0268130E0822B932B909399 +:1011A00065008093640086E0809363008FEFC8E65B +:1011B000D0E0CCCEF801938180E0228130E0822B18 +:1011C000932B9093A9008093A800C29ABA9A83E0C7 +:1011D0005DDCC298A99880E159DC65DC80E0C8E656 +:1011E000D0E0B4CE8F3751F180E0C8E6D0E0AECE8B +:1011F00080EC69DC80E067DC8AE048DCC29A85E04C +:1012000045DCC29885E042DC87B3837D87BB88B329 +:10121000837D88BBA99A80E0C8E6D0E097CE76DCD3 +:10122000C8E6D0E08093680081E090CED8011296A5 +:101230008C9149DC80E0C8E6D0E088CEC8E6D0E0FA +:1012400081E0809368001092690010926A00109209 +:0A1250006B0084E07BCEF894FFCF22 +:02125A005AFF39 +:00000001FF diff --git a/bin/firmware/usbasp.atmega88.2011-05-28.hex b/bin/firmware/usbasp.atmega88.2011-05-28.hex new file mode 100644 index 0000000..cb3a64c --- /dev/null +++ b/bin/firmware/usbasp.atmega88.2011-05-28.hex @@ -0,0 +1,297 @@ +:1000000042C0ADC15BC05AC059C058C057C056C0ED +:1000100055C054C053C052C051C050C04FC04EC054 +:100020004DC04CC04BC04AC049C048C047C046C084 +:1000300045C044C0040309041C037700770077001F +:100040002E00660069007300630068006C002E00DB +:10005000640065000E035500530042006100730008 +:10006000700012011001FF000008C016DC05040139 +:1000700001020001090212000101008019090400B7 +:1000800000000000000011241FBECFEFD4E0DEBF4F +:10009000CDBF11E0A0E0B1E0EAE6F2E102C00590D8 +:1000A0000D92A230B107D9F711E0A2E0B1E001C092 +:1000B0001D92AA34B107E1F767D5D5C8A1CFE9E60B +:1000C000F0E0808183608083E89A08951F93CF9346 +:1000D000DF9360912801635067FD13C08091250173 +:1000E000CCE0D0E0C81BD109C45DDE4F8091240173 +:1000F0008D3209F462C08091020187FD84C01092A4 +:1001000028018091000184FF4AC0609101016F3F86 +:1001100009F445C0693070F1685060930101809125 +:10012000180198E889278093180168E080910201FE +:1001300087FD8BC0209126013091270186FF6DC07D +:10014000A9E1B1E080E090E0F901E80FF91FE49146 +:10015000ED9301966817C1F76150862F90E06F5FAD +:100160000196820F931F9093270180932601162FEB +:100170001C5F0BC0109201018091180198E889273B +:1001800080931801662391F614E089E191E0E3D0B1 +:100190001C3019F08FEF809301011093000194E15E +:1001A00083B1837031F49150D9F7109229011092E4 +:1001B0002301DF91CF911F910895683009F09FCFFF +:1001C00083EC809318018AE580930001109202016C +:1001D0008881807659F59A8110922101898188233E +:1001E00009F043C01092220122E081E291E0909355 +:1001F0002701809326018F81882319F49E8192170D +:1002000008F1922F1FC0CE01D0D48F3F51F1882327 +:1002100009F475CF1092010172CFD901962FE9E14F +:10022000F1E08D9181939150E1F796CFCE0105D603 +:10023000282F8F3F01F7888187FD25C09FEF80E839 +:1002400080930201909301015ACF89E191E083D517 +:10025000682F893008F453C08FEF809301011EE1AD +:100260009CCF8EE1809300014ACF853071F08630BB +:1002700091F0883031F1893061F18A3031F120E03C +:1002800081E291E0B4CF9E81DACF9093290120E002 +:1002900081E291E0ACCF8B81813049F18230F9F07D +:1002A000833029F020E080E480930201A4CF9923D9 +:1002B00049F584E390E0909327018093260124E0A0 +:1002C000F2CF21E08BE291E092CF21E081E291E058 +:1002D0008ECF90932B0120E081E291E088CF84E7DC +:1002E00090E0909327018093260122E1DCCF82E603 +:1002F00090E0909327018093260122E1D4CF182F1C +:100300001C5F43CF913051F0923061F684E590E06C +:1003100090932701809326012EE0C5CF88E390E0DB +:1003200090932701809326012CE1BDCFA82FB92FF0 +:1003300080E090E041E050EA609530E009C02D9106 +:1003400082279795879510F084279527305EC8F30C +:100350006F5FA8F30895EADF8D939D930895CF937F +:10036000CFB7CF93C395189BE9F7189B09C0189B8B +:1003700007C0189B05C0189B03C0189B01C0A1C0F3 +:10038000DF93C0912501DD27C45DDE4F189B02C0BD +:10039000DF91EBCF2F930F931F9303B12FEF00FB50 +:1003A00020F94F933F9313B14FEF012700FB21F941 +:1003B0003BE031C04E7F012F13B1216028C0102FC8 +:1003C0004D7F2260000003B129C04B7F2460012FC4 +:1003D000000013B12BC013B1477F28602AC04F7EA5 +:1003E00003B120612CC04F7D13B120622FC04F7B21 +:1003F00003B1206432C0422703B149934FEF00009C +:10040000102710FB20F913B11370C9F1297F91F265 +:10041000012700FB21F903B1237F89F2315058F104 +:10042000102710FB22F913B1277E79F2012700FB78 +:1004300023F92F7C81F203B1102710FB24F92F79C7 +:1004400071F200C013B1012700FB25F92F7359F297 +:1004500000C003B1102710FB26F9223040F200C083 +:1004600013B1012700FB27F9243028F64F772068C5 +:1004700013B10000F9CF11E01CBB002717C03B509F +:100480003195C31BD04011E01CBB0881033CE9F04F +:100490000B34D9F0209123011981110F1213EDCFE4 +:1004A000093641F10D3211F0013E39F700932A016E +:1004B0003F914F911F910F912F91DF91CCB3C0FDD0 +:1004C00051CFCF91CFBFCF91189520912A012223F0 +:1004D00079F310912801112311F5343012F1309382 +:1004E000280120932401109125013BE0311B30931A +:1004F000250117C00091280101308CF40AE53091E4 +:10050000000134FD10C000930001C8E1D1E00FC02C +:100510002795A8F45150A9F4220F0000F9CF4AE51D +:1005200003C042ED01C0432FC4E1D0E032E014B17A +:100530001360289A14B905B120E413E05F930127F2 +:1005400056E005B9279520F4515021F4220FF9CF38 +:10055000012756E000003B5A05B9D0F2279528F450 +:10056000515029F4220F0000F9CF012756E02795BA +:1005700005B920F4515021F4220FF9CF012756E09C +:100580002991332305B921F60C7F10912901110F10 +:10059000C651D04005B911F01093230111E01CBBE6 +:1005A000016014B11C7F402F4C7F5F9100C000C0E0 +:1005B00005B914B945B97CCF809145018CBD8091B6 +:1005C00042018DBD0895282F8823A1F0883008F0BE +:1005D00042C085E893E09093440180934301243026 +:1005E00019F12530B8F0263099F1263068F127301E +:1005F000F9F0089586EA93E09093440180934301D3 +:1006000081E08093470182E58093450181E08093FA +:10061000420108952230A1F0233070F4213049F7CF +:1006200080EC80934701089588E180934701089505 +:1006300083E080934701089580E380934701089504 +:1006400080E68093470108958CE0809347010895E8 +:1006500020934701089586EA93E0909344018093A4 +:1006600043011092420181E080934701293041F01B +:100670002A3050F4283039F683E5809345010895F7 +:1006800082E58093450108952B3029F02C3009F044 +:10069000BACF8093420181E580934501089526B544 +:1006A0009091470186B5821B8917E0F3089584B1C4 +:1006B0008C6284B92A982D9896B52091470186B509 +:1006C000891B8217E0F32A9A96B586B5891B821793 +:1006D000E0F32A988091430190914401865A934017 +:1006E00019F0109246010895809145018CBD8091CA +:1006F00042018DBD10924601089584B1837D84B975 +:1007000085B1837D85B91CBC0895582F2091470180 +:1007100040E030E057FD16C02B98440F1C994F5F06 +:100720002D9A96B586B5891B8217E0F32D9896B55C +:1007300086B5891B8217E0F33F5F383029F0550FEB +:1007400057FFEACF2B9AE9CF842F08958EBD0DB4C1 +:1007500007FEFDCF8EB508950F931F930FE1E09133 +:100760004301F09144018CEA0995E0914301F09135 +:10077000440183E50995E0914301F091440180E053 +:100780000995182FE0914301F091440180E009950B +:10079000133561F11CBC26B59091470186B5821BCB +:1007A0008917E0F32A9A26B586B5821B8917E0F3EC +:1007B0002A9826B586B5821B8917E0F3E09143019C +:1007C000F091440183E0E63AF80721F0002351F06C +:1007D0000150C9CF809145018CBD809142018DBDF2 +:1007E0000023B1F781E01F910F91089580E01F91E0 +:1007F0000F9108959B01AC0181E15695479537957E +:1008000027958A95D1F7809146018217D9F02093D8 +:100810004601E0914301F09144018DE40995E09196 +:100820004301F091440180E00995E0914301F0918A +:100830004401809146010995E0914301F091440102 +:1008400080E009950895EF92FF920F931F937B012B +:100850008C01D0DF8E2D8170880F880F880FE0917A +:100860004301F091440180620995D801C70129E054 +:10087000B695A795979587952A95D1F7E09143016D +:10088000F0914401099516950795F794E794E09146 +:100890004301F09144018E2D0995E0914301F091BF +:1008A000440180E009951F910F91FF90EF9008950A +:1008B0000F931F938C01E0914301F091440180EA72 +:1008C0000995E0914301F0914401812F0995E09150 +:1008D0004301F0914401802F0995E0914301F0918B +:1008E000440180E009951F910F910895FF920F93A5 +:1008F0001F938C01F62EE0914301F091440180ECAE +:100900000995E0914301F0914401812F0995E0910F +:100910004301F0914401802F0995E0914301F0914A +:1009200044018F2D09958EE1B9D080E01F910F9180 +:10093000FF900895CF92DF92EF92FF920F931F9353 +:100940006B017C01142F56DFE0914301F0914401CB +:100950008CE40995D701C60149E0B695A79597950E +:1009600087954A95D1F7E0914301F09144010995AB +:10097000D701C601B695A79597958795E091430154 +:10098000F09144010995E0914301F091440180E028 +:1009900009951F3FF1F016B50EE1C701B60153DF0F +:1009A0008F3F79F486B5811B8D33B8F316B50150AE +:1009B000A1F781E01F910F91FF90EF90DF90CF9012 +:1009C000089580E01F910F91FF90EF90DF90CF90FE +:1009D00008958FE063D080E01F910F91FF90EF901A +:1009E000DF90CF900895CF92DF92EF92FF920F9316 +:1009F0001F936B017C01042F122FFCDE8C2D817064 +:100A0000880F880F880FE0914301F09144018064C2 +:100A10000995D701C60169E0B695A7959795879581 +:100A20006A95D1F7E0914301F09144010995D7010E +:100A3000C601B695A79597958795E0914301F091EA +:100A400044010995E0914301F0914401802F0995FB +:100A50001123C1F00F37F1F016B50EE1C701B60151 +:100A6000F2DE8F3779F486B5811B8D33B8F316B576 +:100A70000150A1F781E01F910F91FF90EF90DF905F +:100A8000CF90089580E01F910F91FF90EF90DF903D +:100A9000CF9008958FE002D080E0F5CF382F8823E3 +:100AA00049F020E096B586B5891B8C33E0F32F5FC3 +:100AB0002317C0F30895259A23982B9A50E217D054 +:100AC0005A95E9F70895AC0188E605D0842F03D044 +:100AD00089E601D0852F0FD028E030E0382780FB51 +:100AE000869506D02A95D1F730FB02D000D06894C5 +:100AF00023982B9A16F02B98239AE0914801F091B5 +:100B000049013197F0F72D9AE3B1E3FBE0914801F9 +:100B1000F09149013197F0F72D98089520ECE7DF27 +:100B200046F42A95E1F780E02AE1E5DF2A95E9F726 +:100B3000DECF28E030E0DBDF869587F938272A957D +:100B4000D1F7D5DF27F9322772F3D1DFD0CFDB0120 +:100B5000742FB9DF84E2BFDFE1DF8D937A95D1F79F +:100B60000895DB01742FAFDF83EFB5DF8DE1B3DFD5 +:100B700084E6B1DF8D91AFDF82E7ADDFCFDF807834 +:100B8000D9F77A9589F708951BB815B88BEF8AB90C +:100B90008FEF84B914B893E097B98EEF88B995BDFB +:100BA0008EDA789493DA92DAFDCFFF920F931F9347 +:100BB000CF93DF93082F792FF62E40910301413018 +:100BC00069F0443059F0463009F492C01FEF812F8C +:100BD000DF91CF911F910F91FF900895FF2009F4AD +:100BE000B2C0802F972F9C01E90110E053C0809183 +:100BF000140190911501892B09F058C060911001E2 +:100C0000709111018091120190911301488121E0AE +:100C1000EADE80910401909105010197909305010E +:100C200080930401892BD9F410920301809116015D +:100C300081FF3AC08091170190E02091140130911A +:100C400015018217930781F16091100170911101D4 +:100C5000809112019091130148816CDE11E0809126 +:100C6000100190911101A0911201B0911301019610 +:100C7000A11DB11D8093100190931101A093120149 +:100C8000B093130121969E01201B2F1508F09FCFD2 +:100C900040910301413009F4AACF80911001909155 +:100CA0001101688123DEB5CF11E0D9CF6091100129 +:100CB000709111018091120190911301488120E0FF +:100CC00092DE80911701815080931701882309F0EB +:100CD000A0CF60911001709111018091120190914B +:100CE0001301488127DE809114018093170191CF71 +:100CF0008091100190911101602F4F2D32DF809172 +:100D0000100190911101A0911201B09113018F0D6A +:100D1000911DA11DB11D8093100190931101A0930D +:100D20001201B093130180910401909105018F1974 +:100D300091099093050180930401892B21F410926D +:100D4000030111E044CF10E0812FDF91CF911F917B +:100D50000F91FF9008950F931F93CF93DF93082F68 +:100D6000792F162F40910301842F8250823050F04A +:100D7000453009F446C01FEF812FDF91CF911F91BD +:100D80000F9108954530E9F1662399F1802F9C0178 +:100D9000E90120C0809110019091110189DD8883C3 +:100DA0008091100190911101A0911201B091130155 +:100DB0000196A11DB11D8093100190931101A09384 +:100DC0001201B093130121969E01201B211778F484 +:100DD000409103014230F1F66091100170911101D0 +:100DE00080911201909113012EDD8883D9CF1830A4 +:100DF00018F610920301812FDF91CF911F910F916F +:100E000008958091100190911101602F412F9FDE74 +:100E10008091100190911101A0911201B0911301E4 +:100E2000810F911DA11DB11D80931001909311019F +:100E3000A0931201B09313019FCF0F931F93CF93F1 +:100E4000DF938C01DC0111968C91813009F44EC046 +:100E5000823009F4E7C0833009F455C0843009F4C6 +:100E6000B5C0873009F486C0853009F45AC1863090 +:100E700009F410C1883009F4DBC0893009F458C185 +:100E80008A3009F469C18B3009F49CC18C3009F4B3 +:100E9000B7C18D3009F4CBC18E3009F4CFC18F308A +:100EA00009F065C1F801938180E0228130E0822B56 +:100EB000932BAA2797FDA095BA2F809310019093AA +:100EC0001101A0931201B0931301978180E0268154 +:100ED00030E0822B932B909305018093040185E0F1 +:100EE000809303018FEFC8E0D1E038C0329B3FC050 +:100EF0008091060168DB109207014198D8DB80E001 +:100F0000C8E0D1E02BC0E0914301F0914401D80149 +:100F100012968C910995C8E0D1E080930801E09188 +:100F20004301F0914401D80113968C910995809367 +:100F30000901E0914301F0914401D80114968C918C +:100F4000099580930A01E0914301F0914401D80191 +:100F500015968C91099580930B0184E0D09327011D +:100F6000C0932601DF91CF911F910F91089585E0E5 +:100F70002ADBC1CF80910701882399F4F80193817E +:100F800080E0228130E0822B932BAA2797FDA09549 +:100F9000BA2F8093100190931101A0931201B09386 +:100FA0001301D80117969C91179780E016962C9103 +:100FB00030E0822B932B909305018093040183E012 +:100FC000809303018FEFC8E0D1E0C8CF8091070183 +:100FD000882399F4F801938180E0228130E0822B0C +:100FE000932BAA2797FDA095BA2F80931001909379 +:100FF0001101A0931201B0931301D80117969C918F +:10100000179780E016962C9130E0822B932B9093CB +:1010100005018093040182E0809303018FEFC8E013 +:10102000D1E09CCF6ADB419A80E0C8E0D1E096CF66 +:10103000809107018823B1F4D80113969C911397EE +:1010400080E012962C9130E0822B932BAA2797FDFB +:10105000A095BA2F8093100190931101A0931201D3 +:10106000B093130110921501109214011092160101 +:10107000F801978180E0268130E0822B932B9093BA +:1010800005018093040184E0809303018FEFC8E0A1 +:10109000D1E064CF80910701882399F4F80193810E +:1010A00080E0228130E0822B932BAA2797FDA09528 +:1010B000BA2F8093100190931101A0931201B09365 +:1010C0001301D80114968C91149715969C91292F91 +:1010D0002F7020931601492F50E0407F50704295A9 +:1010E0005295507F5427407F5427480F511D5093ED +:1010F00015014093140120FF02C040931701F8012D +:10110000978180E0268130E0822B932B909305011C +:101110008093040181E0809303018FEFC8E0D1E068 +:101120001DCF1ADBC8E0D1E08093080181E016CF23 +:1011300081E080930701F80182819381A481B581C8 +:101140008093100190931101A0931201B0931301A9 +:1011500080E0C8E0D1E002CFD80112968C91809354 +:101160000601C8E0D1E01092080181E0F7CE80319D +:1011700009F040C0D80113969C91139780E0129615 +:101180002C9130E0822B932BAA2797FDA095BA2FA4 +:101190008093100190931101A0931201B093130159 +:1011A000F801978180E0268130E0822B932B909389 +:1011B00005018093040186E0809303018FEFC8E06E +:1011C000D1E0CCCEF801938180E0228130E0822B07 +:1011D000932B90934901809348012A9A229A83E0A5 +:1011E0005DDC2A98419880E159DC65DC80E0C8E04C +:1011F000D1E0B4CE8F3751F180E0C8E0D1E0AECE7F +:1012000080EC69DC80E067DC8AE048DC2A9A85E0D3 +:1012100045DC2A9885E042DC84B1837D84B985B1C0 +:10122000837D85B9419A80E0C8E0D1E097CE76DC35 +:10123000C8E0D1E08093080181E090CED8011296F9 +:101240008C9149DC80E0C8E0D1E088CEC8E0D1E0F4 +:1012500081E0809308011092090110920A01109216 +:0A1260000B0184E07BCEF894FFCF71 +:02126A005AFF29 +:00000001FF diff --git a/bin/linux-nonroot/99-USBasp.rules b/bin/linux-nonroot/99-USBasp.rules new file mode 100755 index 0000000..8d04b7e --- /dev/null +++ b/bin/linux-nonroot/99-USBasp.rules @@ -0,0 +1,4 @@ +# USBasp - USB programmer for Atmel AVR controllers +# Copy this file to /etc/udev/rules.d so + +SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", SYSFS{idVendor}=="16c0", SYSFS{idProduct}=="05dc", MODE="0666" diff --git a/bin/linux-nonroot/install_rule b/bin/linux-nonroot/install_rule new file mode 100755 index 0000000..04de5fe --- /dev/null +++ b/bin/linux-nonroot/install_rule @@ -0,0 +1,2 @@ +#!/bin/sh -x +sudo cp 99-USBasp.rules /etc/udev/rules.d/99-USBasp.rules diff --git a/bin/win-driver/Readme.txt b/bin/win-driver/Readme.txt new file mode 100644 index 0000000..ef4af85 --- /dev/null +++ b/bin/win-driver/Readme.txt @@ -0,0 +1 @@ +With WinAVR version 20100110 or older, please use libusb_0.1.12.1. diff --git a/bin/win-driver/libusb_0.1.12.1/libusb0.dll b/bin/win-driver/libusb_0.1.12.1/libusb0.dll new file mode 100644 index 0000000000000000000000000000000000000000..9387bedad1d4ec91bfb903486d1ed37abccab63e GIT binary patch literal 43520 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 J;QvoP{{uEZBLe^c literal 0 HcmV?d00001 diff --git a/bin/win-driver/libusb_0.1.12.1/libusb0.sys b/bin/win-driver/libusb_0.1.12.1/libusb0.sys new file mode 100644 index 0000000000000000000000000000000000000000..0a02d3ee3319b77949c890c206b02c824007bb49 GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/bin/win-driver/libusb_0.1.12.1/libusb0_x64.dll b/bin/win-driver/libusb_0.1.12.1/libusb0_x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..c89a59fe38b5cd1a9470b75deccb26b552ac1c7e GIT binary patch literal 43008 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 L7W$K?KkfNXdJ6SB literal 0 HcmV?d00001 diff --git a/bin/win-driver/libusb_0.1.12.1/testlibusb-win.exe b/bin/win-driver/libusb_0.1.12.1/testlibusb-win.exe new file mode 100644 index 0000000000000000000000000000000000000000..a0c3e31775db4ad6b4e364c94bb06482d886c86c GIT binary patch literal 13824 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 lLY{zdk~WH)8mWT7!v{f27JpYAM^_x$nJX zvnq8uosOOH4)@)AzRx}9-gEDg+ke={rZL9M=-Dh|{TQh^`1jJE9+2l;b9fFrF!Qwq z{igcY7BqGEqe3_mYL9q2g;q~67?K39C`4jG!5sBu`tbT=vClg4p1t+(I}zL(uXUh$<)?E`uv(c9-D2TlW&xZoaO*u4*1RV|1bj0 z@(1zJxpK>SrP)$FEXOV=1=ZsUtNAH%yWLrn#1Pr?BAu{7v)zKBdPr`vo7E;OWAXDQ z>7GPdnxm7lr;lXOMvIb)J~|S%ZTmo6pHx?KY)|RXLapTZpR#J{HnS zL01<*FePAy+9Sw4^UEL2Z^>JdIPuk_V>VwE|{QWVtjgaJwMJXX)Ddj10N;ccoD`zk! z52#DQBbVCMtKcSgfIFwGwh>P=Dd31qGli%tCqD5}3zkT6%$BTx&+5sG*=%3(z_k<_ zz8{HBbxx=6%cUztn;|2A(2{*ODP7B&m7;Y9+=mAFmdrtfngBE{AH_c zS_X2~x9QI6aqN*op6(IP&R319z>4n-1KxT75m2YdG@r z8UuF`J0CX4&zlU~M;ea&++^V103@) zI}sdP^{^7NSP!nD@I(zamvGnDP$(WUaPu@Ah2l2`Zia@VPz)NlPi9dl)=((kH*oK0 zI10tI)p{6T0j}phgrc;M_Ls6|X3~7dNdZ`ZjSLOum1lNk;wNld?rIrmqy4q%&c@xN ziwm&f@3qLQ?CMICv_x8d+1lGUjco3@3bfv|HPM4TZ#}rD7~qj>$lg{Q_&R&xA$q|i z6Dq<%HHvIKf*lOWd00KRvzR`0n?5(4@?#$9sAhi(Pi? zBU}7f0UJs_LPAGKas1EI%HJq|MSeqD&sUL$lUKkp8-gr3*uPMVj)h7H)t7P93EjkE zA~o4<@b+5B7;92msE*ZwXc{IdHHsA_#-%c)$c8$SI3-yjQ3?rK*>B+|h!%OdUHuD! zrj&4|A#3lAwB|imgO3V!08sUC^?1)q^U1&1>`dDP-8ANmzg$AW>;ESuY7em>SMTmV zLCL93^X&=?hbb!77t-*$F!`hkX5DGC8iZ}wc`yVHAPf69>I=_orsU+wKEh?GYEwN~ zs>}WgvRcmg{`o5LM!tCVC-QX+`8xL1^TmexH^Wh61dE}ZVP%I8>PC-NRu{szz z#J38z6WuG&ypuFk(W^q`fUg|FA6B}beBGca-dF! zzwvu5ru#}RD6Ybn_QKUe*e^^8n?HF*3aWp?93jD%sfXzEG<_bT&pr6a1BqejX1<@| zHXdAQmQusdNLE^<{N4iGNHNio82zQ={YN&d+>jWLjVkjJ!?Bl>;yL{c@Yl^=k{qb$}mYv(?z-0<2c*~ZJ<-wzQu-P+}|3V&J&4bV9!EB0r^P#X4 zY5f4JfuQOO6SZ%^D`+2SXObX#m3={kFrgQ<6an$7+I zH+*$EUUL8>HZsehlqP73u%8=w@eAIEc&$|-{GeaYEopDqBEpeTJ2yIq^7(mtpN(g; zoAd1zYxagtBF(9%pcIcHWt}K;IzH+{rLZKM_u+!Z3lI6v zmXsp=hpzz-_X&GAk&ew6sWF{e-#w>i=XLvPW9MeR0%*s_@tc}rGw_^mxo~O#!FY2u z1V4pfznL;-ltl&G9Ml!S9r+unqEN)7p*$VwLMU0%HhU60nH zrS`*C^4>=WT~81==z59<+0~yq0K%Z_X$`wi!yZlbbL_JkcE5&Ar;c*$0S!EnN&}Q# zCsQZ*_-g7TA5W)V<>Q;ygVRrA)+W2o;F8al%tf4d4DrITCVp(^uicHDI-a(}-0mX`;Dv5#~&G7N@GJ z;9TQerDQoxoTaI4oW2-OlC0b)$j++N3Q&}iRh+&&6$V{yT%nXmG;yv<^pUOuznB!1UjnYIh2Q|8(Sdaqjtk@Y)1 z;-QrjVVY7r<%C329?L{GO?fyIJ87y#v`3F~^KjF3^>xA0ah^oW)O+YUeOpMn7?K>!%|RuF8YMdGPW)xIPbFoCgQ;;Ep_aRUW)G z58jpsH|4>;Jh&kb7V_ZYJeUehZanB9<-)W9CSla?mdwJB@dHt7*e2PhaB!&6oKL>_ z{KpaaTnrskRi*V<=VA?+{4tm3oB97o1O(o^uAna*@&~0_pD!Xtqc;j=RZF`&@Kac) zch*W$#P5wsB52ffx<=l9yQjOs)A}P(YV_YD5<{797Sm|nTZ57q>GA|Lxv8{`VjIkL zOptQr8g~R+J0|?ek<&D`d0NE{u}-fT$+hRL4ZvE^BZ-ZoB>98wAR4}S!EUTmU&SPi zdr3N-0S~SJ3+*+=ygGS8=Y(8CBqW7eLs+Ik^H0$7*SEbXBzXe$Vz6EM+}g>@2|>e6 zU8mO>3by&%V-b(!4+Zb^1Y#6y&7OY>&9F!`CJ5fo<&Q5=%dsF(`a;{aND@J7BwJRs ze6vs?@R1pW+>w=4UKgzsyM*tS`LOgTM50^(e`OE^XDAl%1s6&}M8x(HyF|e!Mq4BP zuoQ|!xu^iS z%|^7mTv$*eR1xRbyESc_^lvj(rUKrXgX;#)=3(s79NcN(76bQXtsAsnl0knKJ&k?_ z{eAQ?^oizWtPs5veG&Q!bfay?yaT-({Q>kR(D$JqKtGCp68%l|_t8hu&!aQ=Rfs+p z-A+ED8|~}n(`76c^}1UFp{U4a@_Cy-=yQ8x(Wn?@9yV(d=M%g9tw6Fuj%ybsgAIJP z30xE>EZFXj`a8n`5r0l3{r;d|qCeZwJQNm#hzp-bp~EM7W9|5V6_i-o$+e6<&RpGo z355*S=#PZYu{H2XBfdRl$K&sZ1t_r1!46N*7Z81}?p85OHEE5X>Mvv$GPfI^c6$6l zPozD{RsjyX-D0rI9|^&an>DzN{vJ#@Y5+`LdBS10v?I)MA?8Lc79&^!+riweBD^Es z40HQK$oE|)cPOYMdrc&+Y5Rl8-4zXn5e})1_)7{r-Vn5u7T{jcb=*>bn+H}R1)ZKi zAjEgdJq4X&C$x~vu7XMV`wPM`2?6OVi2B=uo&eF=woCT_F3YI5s?rw-uwwA$_uE_> dH@NDTE#(YQwFo@_joumUYK=&SRw({A?O$|HF5CbB literal 0 HcmV?d00001 diff --git a/bin/win-driver/libusb_0.1.12.1/usbasp.cat b/bin/win-driver/libusb_0.1.12.1/usbasp.cat new file mode 100644 index 0000000..2ef39c5 --- /dev/null +++ b/bin/win-driver/libusb_0.1.12.1/usbasp.cat @@ -0,0 +1,3 @@ +This file will contain the digital signature of the files to be installed +on the system. +This file will be provided by Microsoft upon certification of your drivers. diff --git a/bin/win-driver/libusb_0.1.12.1/usbasp.inf b/bin/win-driver/libusb_0.1.12.1/usbasp.inf new file mode 100644 index 0000000..ba51881 --- /dev/null +++ b/bin/win-driver/libusb_0.1.12.1/usbasp.inf @@ -0,0 +1,136 @@ +[Version] +Signature = "$Chicago$" +provider = %manufacturer% +DriverVer = 03/20/2007,0.1.12.1 +CatalogFile = usbasp.cat +CatalogFile.NT = usbasp.cat +CatalogFile.NTAMD64 = usbasp_x64.cat + +Class = LibUsbDevices +ClassGUID = {EB781AAF-9C70-4523-A5DF-642A87ECA567} + +[ClassInstall] +AddReg=libusb_class_install_add_reg + +[ClassInstall32] +AddReg=libusb_class_install_add_reg + +[libusb_class_install_add_reg] +HKR,,,,"LibUSB-Win32 Devices" +HKR,,Icon,,"-20" + +[Manufacturer] +%manufacturer%=Devices,NT,NTAMD64 + +;-------------------------------------------------------------------------- +; Files +;-------------------------------------------------------------------------- + +[SourceDisksNames] +1 = "Libusb-Win32 Driver Installation Disk",, + +[SourceDisksFiles] +libusb0.sys = 1,, +libusb0.dll = 1,, +libusb0_x64.sys = 1,, +libusb0_x64.dll = 1,, + +[DestinationDirs] +libusb_files_sys = 10,system32\drivers +libusb_files_sys_x64 = 10,system32\drivers +libusb_files_dll = 10,system32 +libusb_files_dll_wow64 = 10,syswow64 +libusb_files_dll_x64 = 10,system32 + +[libusb_files_sys] +libusb0.sys + +[libusb_files_sys_x64] +libusb0.sys,libusb0_x64.sys + +[libusb_files_dll] +libusb0.dll + +[libusb_files_dll_wow64] +libusb0.dll + +[libusb_files_dll_x64] +libusb0.dll,libusb0_x64.dll + +;-------------------------------------------------------------------------- +; Device driver +;-------------------------------------------------------------------------- + +[LIBUSB_DEV] +CopyFiles = libusb_files_sys, libusb_files_dll +AddReg = libusb_add_reg + +[LIBUSB_DEV.NT] +CopyFiles = libusb_files_sys, libusb_files_dll + +[LIBUSB_DEV.NTAMD64] +CopyFiles = libusb_files_sys_x64, libusb_files_dll_wow64, libusb_files_dll_x64 + +[LIBUSB_DEV.HW] +DelReg = libusb_del_reg_hw +AddReg = libusb_add_reg_hw + +[LIBUSB_DEV.NT.HW] +DelReg = libusb_del_reg_hw +AddReg = libusb_add_reg_hw + +[LIBUSB_DEV.NTAMD64.HW] +DelReg = libusb_del_reg_hw +AddReg = libusb_add_reg_hw + +[LIBUSB_DEV.NT.Services] +AddService = libusb0, 0x00000002, libusb_add_service + +[LIBUSB_DEV.NTAMD64.Services] +AddService = libusb0, 0x00000002, libusb_add_service + +[libusb_add_reg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,libusb0.sys + +; Older versions of this .inf file installed filter drivers. They are not +; needed any more and must be removed +[libusb_del_reg_hw] +HKR,,LowerFilters +HKR,,UpperFilters + +; Device properties +[libusb_add_reg_hw] +HKR,,SurpriseRemovalOK, 0x00010001, 1 + +;-------------------------------------------------------------------------- +; Services +;-------------------------------------------------------------------------- + +[libusb_add_service] +DisplayName = "LibUsb-Win32 - Kernel Driver 03/20/2007, 0.1.12.1" +ServiceType = 1 +StartType = 3 +ErrorControl = 0 +ServiceBinary = %12%\libusb0.sys + +;-------------------------------------------------------------------------- +; Devices +;-------------------------------------------------------------------------- + +[Devices] +"USBasp"=LIBUSB_DEV, USB\VID_16c0&PID_05dc + +[Devices.NT] +"USBasp"=LIBUSB_DEV, USB\VID_16c0&PID_05dc + +[Devices.NTAMD64] +"USBasp"=LIBUSB_DEV, USB\VID_16c0&PID_05dc + + +;-------------------------------------------------------------------------- +; Strings +;-------------------------------------------------------------------------- + +[Strings] +manufacturer = "www.fischl.de" diff --git a/bin/win-driver/libusb_0.1.12.1/usbasp_x64.cat b/bin/win-driver/libusb_0.1.12.1/usbasp_x64.cat new file mode 100644 index 0000000..2ef39c5 --- /dev/null +++ b/bin/win-driver/libusb_0.1.12.1/usbasp_x64.cat @@ -0,0 +1,3 @@ +This file will contain the digital signature of the files to be installed +on the system. +This file will be provided by Microsoft upon certification of your drivers. diff --git a/bin/win-driver/libusb_1.2.4.0/amd64/libusb0.dll b/bin/win-driver/libusb_1.2.4.0/amd64/libusb0.dll new file mode 100644 index 0000000000000000000000000000000000000000..a8eb33854ac850f7df4c48b7fc3e05f23718d66a GIT binary patch literal 75200 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

1_pK%6W( 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 literal 0 HcmV?d00001 diff --git a/bin/win-driver/libusb_1.2.4.0/amd64/libusb0.sys b/bin/win-driver/libusb_1.2.4.0/amd64/libusb0.sys new file mode 100644 index 0000000000000000000000000000000000000000..50bce8d555bb6faab3078267a8269e6f4220bbbe GIT binary patch literal 44480 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%0DWnZSCQQzUo{kM@s6zE+}^s+H{QAq6Jhd^kt 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 literal 0 HcmV?d00001 diff --git a/bin/win-driver/libusb_1.2.4.0/ia64/libusb0.dll b/bin/win-driver/libusb_1.2.4.0/ia64/libusb0.dll new file mode 100644 index 0000000000000000000000000000000000000000..9a284238b3f89a9ea029694b8e43b5161e141e0f GIT binary patch literal 157120 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%0D^|rHt(*L-)(^1n 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

+KI(%ey?Rbn&E@X9vHJ_B9>V12 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 z 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 literal 0 HcmV?d00001 diff --git a/bin/win-driver/libusb_1.2.4.0/installer_x86.exe b/bin/win-driver/libusb_1.2.4.0/installer_x86.exe new file mode 100644 index 0000000000000000000000000000000000000000..90f53314df01d06f0e61223da84daa05e346714c GIT binary patch literal 20992 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 on)6c5)|>-5T{)+7dhlnAq$qepg!lRxn1TQN{= +Copyright (c) 2000-2004 Johannes Erdfelt, +Copyright (c) 2000-2004 Thomas Sailer, +Copyright (c) 2010 Travis Robinson, + +This software is distributed under the following licenses: +Driver: GNU General Public License (GPL) +Library, Test Files, Installer: GNU Lesser General Public License (LGPL) + +*********************************************************************** + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + diff --git a/bin/win-driver/libusb_1.2.4.0/usbasp.cat b/bin/win-driver/libusb_1.2.4.0/usbasp.cat new file mode 100644 index 0000000..adfc8cc --- /dev/null +++ b/bin/win-driver/libusb_1.2.4.0/usbasp.cat @@ -0,0 +1,3 @@ +This file will contain the digital signature of the files to be installed +on the system. +This file will be provided by Microsoft upon certification of your drivers. \ No newline at end of file diff --git a/bin/win-driver/libusb_1.2.4.0/usbasp.inf b/bin/win-driver/libusb_1.2.4.0/usbasp.inf new file mode 100644 index 0000000000000000000000000000000000000000..a8d427207d0b7f96156980201d136d7111406def GIT binary patch literal 8034 zcmdT}Yi}A?5S`DJ`X5$SNMfl_j2*{S+DbNlp*&R__k&Zd{J=H}2E^jxCdyxLd(NF5 z?p>B8(6|!TYGL<2=AL=nnYpw7{QW{Axs^oDI7`>nSL7fMnNE{Fu@S5jW5mxl0irWA3iRkkKaOSe3`%Ut6m3 z3_bNJG!DS0(oq_pF>VWdZ)5Zx?tLlaZPPuMWka6h-g9mHSmzm@IEt;$F>c4{Xa}?E z@+Do3+@A<#HvnI4$f27`zlpaiyq$tu%7(J%rAQvh@90-~k1#WW%#Y+zO0^Ez(1O?= zUOKnfKBy7Xc#@-a032;-&ExnC{&v9I7P#HUMS1+>IIiMp0}`moI-a(jgxR}^)*9Zo zFpIKb&nBL~I6HU;K6?%UkqpMzXX92Isyj*1E_#sLK9F{t%s4l@r_S9-N`4n>w6Px7 zQXP2SszCZ9>|_hSy0_Nk2hduB<<@X-;I2B3-UV>@KiU3;0xzp(bKj zziBOYy7hJ*12N~u>1?j3tNvFCis(>Y%5UI`R~7dP5ES{2X}00#H-MhDOG;%YFOTsx z(08GOOZ=aYt$C12rQ{?(={ZWNgu)%2fVSGX{cp=_=#VyLEe%){-);35K(l-o(b1n5 zOPijO_M13PmX`~)!q9)4M^463z~aeTs?*X`e_tBwjM2!)15eNPbb_6Chkd!3T2Ls( zD*6&c$k6lA190!^93sxnh|?ZMB#kQh8MF8daWP6>I1AJrmR+eBo1d4*=W&@YH+-{Z z-6vOV>|E}u#dxw=i*QstXMTR@Gw3@R9~nJ0s?v@aWAi-3E-%sD7U!&oGFN%iL#k~J zvBC`^TTMPd+dhWqZVh#wrET_QdYnyrQf|{|#mK9AxT&2yPTw~lE!`oCu9#=i;(e0Y zM_F_#r@XBF{+x%3%4<3m?VF#9+0QI$j3S}-s))EM6WfD}tmmbFKWi>;6qp^$!ptGc z>=#ONdATCG6P%G6$Z_?&6C>+xAg*!e$H+YPkh@e|=B*mG^O=tb)ABqY+s)fd+Ff=p zsim7GdJCKnna`2_e~k0-;rGR&yjXVk@Hwf-A#6$cV7%%e4=*|waQ}41xqpn)^T_#M zJx>(R%bpqhyhZHVThBv5Y&P;x@K%uR^8D$~-D(x8-E3dpn=mJdaCW=H9bPrp9>y|% zhDDxUv9r0qS?ka`gjIofg6SbMjgY}!BX{My)dQn( z#u~XS*H;Q!pk}?yQb{+Pp;pjx1d1)3k|N~CT3PC1tzmlBjF30Ca1j@&@$}BIHyER% z*}|S1S6N{d@(g1m*UM4l&6ekU*z!coWm+i1R0Z7H>Ii; zM*Wy4G9=ogHb(hSx3nTwW3%@85q-22R)Hx)S`zIl!rPsb2cL}xqUMQ=ZCX82K4{aN zOX(R}T~iTx8(^iajrlw^c2G@Z1xjfgk9jYW_Rm17Rffscz1)5cG_rhEr1E&bhJHR< z@uv)ZY*G0wD!p(oeO(7{VJ(;uHDCRm zto_=zi%`NxKtewfo}tNC6IM!JJB05IM;O+1r^`KzpeGunw#;ubJ%>&szt)?Z8J+IH z`dQ}~fUb@z!IRXagxW-C7x|O-@}9ir_uUVnK1yy5orW&pb1mZXyAr(|wZ|A6$rH4A z@0;LVeIUKH*0AWQ7<(<=a_(g8KXY~vYCiM`>H#!7-ReRez@xL z%K2yTi^VPG>KWGN)50wd7$Ty%M6I6RD?g>uA~y0)Zie8il6pM#6j^DhPbg(%Xg*enOXKV(L69$fzd DNV1L( literal 0 HcmV?d00001 diff --git a/bin/win-driver/libusb_1.2.4.0/x86/libusb0.sys b/bin/win-driver/libusb_1.2.4.0/x86/libusb0.sys new file mode 100644 index 0000000000000000000000000000000000000000..bf2e8bfe94f875e767daaa8084b36bbf2a00f1bc GIT binary patch literal 35776 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 literal 0 HcmV?d00001 diff --git a/bin/win-driver/libusb_1.2.4.0/x86/libusb0_x86.dll b/bin/win-driver/libusb_1.2.4.0/x86/libusb0_x86.dll new file mode 100644 index 0000000000000000000000000000000000000000..2710e9661efae2207838383d2e64fb66bae61218 GIT binary patch literal 67008 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 literal 0 HcmV?d00001 diff --git a/circuit/USBasp.sch b/circuit/USBasp.sch new file mode 100755 index 0000000000000000000000000000000000000000..f9ff4f3dbf5299802afc4fd10d57a53f7b249c16 GIT binary patch literal 263720 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 PF!J{wbv}RxS)Km}7Ezy{ literal 0 HcmV?d00001 diff --git a/circuit/USBasp_schematics.pdf b/circuit/USBasp_schematics.pdf new file mode 100755 index 0000000000000000000000000000000000000000..5cd53da50b67620f854f63a2e1ce61756bad631e GIT binary patch literal 14649 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 crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ BODEN (BrownOut Detector enabled) +# +-------------------- BODLEVEL (2.7V) +# +# Fuse atmega48 high byte hfuse: +# 0xdf = 1 1 0 1 1 1 1 1 factory setting +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL (Brown out disabled) +# | | | | + --------- EESAVE (don't preserve EEPROM over chip erase) +# | | | +-------------- WDTON (WDT not always on) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ DWEN (debug wire is disabled) +# +-------------------- RSTDISBL (reset pin is enabled) +# 0xdd = ext.reset, no DW, SPI, no watchdog, no save eeprom, BOD 2.7V +# Fuse atmega48 low byte lfuse: +# 0x62 = 0 1 1 0 0 0 1 0 factory setting +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (internal 8Mhz Oszillator) +# | | +--------------- SUT 1..0 (start-up time) +# | +------------------ CKOUT (no clock output) +# +-------------------- CKDIV8 (divide clock by 8) +# 0xdc = divide/1,no clock output,fast raising power,low Pw Oszil. 3..8 Mhz +# 0xe0 = divide/1,no clock output,fast raising power,external Oszil. +# 0xff = divide/1,no clock output,slow raising power,low Pw Oszil 8.. Mhz + + +SERIAL = `echo /dev/tty.USA19QI*` +UISP = uisp -dprog=$S -dserial=$(SERIAL) -dpart=auto +# The two lines above are for "uisp" and the AVR910 serial programmer connected +# to a Keyspan USB to serial converter to a Mac running Mac OS X. +# Choose your favorite programmer and interface. + +uisp: all + $(UISP) --erase + $(UISP) --upload --verify if=main.hex + diff --git a/firmware/clock.c b/firmware/clock.c new file mode 100755 index 0000000..2e9b833 --- /dev/null +++ b/firmware/clock.c @@ -0,0 +1,24 @@ +/* + * clock.c - part of USBasp + * + * Autor..........: Thomas Fischl + * Description....: Provides functions for timing/waiting + * Licence........: GNU GPL v2 (see Readme.txt) + * Creation Date..: 2005-02-23 + * Last change....: 2005-04-20 + */ + +#include +#include +#include "clock.h" + +/* wait time * 320 us */ +void clockWait(uint8_t time) { + + uint8_t i; + for (i = 0; i < time; i++) { + uint8_t starttime = TIMERVALUE; + while ((uint8_t) (TIMERVALUE - starttime) < CLOCK_T_320us) { + } + } +} diff --git a/firmware/clock.h b/firmware/clock.h new file mode 100755 index 0000000..ae60a1a --- /dev/null +++ b/firmware/clock.h @@ -0,0 +1,28 @@ +/* + * clock.h - part of USBasp + * + * Autor..........: Thomas Fischl + * Description....: Provides functions for timing/waiting + * Licence........: GNU GPL v2 (see Readme.txt) + * Creation Date..: 2005-02-23 + * Last change....: 2006-11-16 + */ + +#ifndef __clock_h_included__ +#define __clock_h_included__ + +#define F_CPU 12000000L /* 12MHz */ +#define TIMERVALUE TCNT0 +#define CLOCK_T_320us 60 + +#ifdef __AVR_ATmega8__ +#define TCCR0B TCCR0 +#endif + +/* set prescaler to 64 */ +#define clockInit() TCCR0B = (1 << CS01) | (1 << CS00); + +/* wait time * 320 us */ +void clockWait(uint8_t time); + +#endif /* __clock_h_included__ */ diff --git a/firmware/isp.c b/firmware/isp.c new file mode 100755 index 0000000..5e51bf0 --- /dev/null +++ b/firmware/isp.c @@ -0,0 +1,336 @@ +/* + * isp.c - part of USBasp + * + * Autor..........: Thomas Fischl + * Description....: Provides functions for communication/programming + * over ISP interface + * Licence........: GNU GPL v2 (see Readme.txt) + * Creation Date..: 2005-02-23 + * Last change....: 2010-01-19 + */ + +#include +#include "isp.h" +#include "clock.h" +#include "usbasp.h" + +#define spiHWdisable() SPCR = 0 + +uchar sck_sw_delay; +uchar sck_spcr; +uchar sck_spsr; +uchar isp_hiaddr; + +void spiHWenable() { + SPCR = sck_spcr; + SPSR = sck_spsr; +} + +void ispSetSCKOption(uchar option) { + + if (option == USBASP_ISP_SCK_AUTO) + option = USBASP_ISP_SCK_375; + + if (option >= USBASP_ISP_SCK_93_75) { + ispTransmit = ispTransmit_hw; + sck_spsr = 0; + sck_sw_delay = 1; /* force RST#/SCK pulse for 320us */ + + switch (option) { + + case USBASP_ISP_SCK_1500: + /* enable SPI, master, 1.5MHz, XTAL/8 */ + sck_spcr = (1 << SPE) | (1 << MSTR) | (1 << SPR0); + sck_spsr = (1 << SPI2X); + case USBASP_ISP_SCK_750: + /* enable SPI, master, 750kHz, XTAL/16 */ + sck_spcr = (1 << SPE) | (1 << MSTR) | (1 << SPR0); + break; + case USBASP_ISP_SCK_375: + default: + /* enable SPI, master, 375kHz, XTAL/32 (default) */ + sck_spcr = (1 << SPE) | (1 << MSTR) | (1 << SPR1); + sck_spsr = (1 << SPI2X); + break; + case USBASP_ISP_SCK_187_5: + /* enable SPI, master, 187.5kHz XTAL/64 */ + sck_spcr = (1 << SPE) | (1 << MSTR) | (1 << SPR1); + break; + case USBASP_ISP_SCK_93_75: + /* enable SPI, master, 93.75kHz XTAL/128 */ + sck_spcr = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); + break; + } + + } else { + ispTransmit = ispTransmit_sw; + switch (option) { + + case USBASP_ISP_SCK_32: + sck_sw_delay = 3; + + break; + case USBASP_ISP_SCK_16: + sck_sw_delay = 6; + + break; + case USBASP_ISP_SCK_8: + sck_sw_delay = 12; + + break; + case USBASP_ISP_SCK_4: + sck_sw_delay = 24; + + break; + case USBASP_ISP_SCK_2: + sck_sw_delay = 48; + + break; + case USBASP_ISP_SCK_1: + sck_sw_delay = 96; + + break; + case USBASP_ISP_SCK_0_5: + sck_sw_delay = 192; + + break; + } + } +} + +void ispDelay() { + + uint8_t starttime = TIMERVALUE; + while ((uint8_t) (TIMERVALUE - starttime) < sck_sw_delay) { + } +} + +void ispConnect() { + + /* all ISP pins are inputs before */ + /* now set output pins */ + ISP_DDR |= (1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI); + + /* reset device */ + ISP_OUT &= ~(1 << ISP_RST); /* RST low */ + ISP_OUT &= ~(1 << ISP_SCK); /* SCK low */ + + /* positive reset pulse > 2 SCK (target) */ + ispDelay(); + ISP_OUT |= (1 << ISP_RST); /* RST high */ + ispDelay(); + ISP_OUT &= ~(1 << ISP_RST); /* RST low */ + + if (ispTransmit == ispTransmit_hw) { + spiHWenable(); + } + + /* Initial extended address value */ + isp_hiaddr = 0; +} + +void ispDisconnect() { + + /* set all ISP pins inputs */ + ISP_DDR &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI)); + /* switch pullups off */ + ISP_OUT &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI)); + + /* disable hardware SPI */ + spiHWdisable(); +} + +uchar ispTransmit_sw(uchar send_byte) { + + uchar rec_byte = 0; + uchar i; + for (i = 0; i < 8; i++) { + + /* set MSB to MOSI-pin */ + if ((send_byte & 0x80) != 0) { + ISP_OUT |= (1 << ISP_MOSI); /* MOSI high */ + } else { + ISP_OUT &= ~(1 << ISP_MOSI); /* MOSI low */ + } + /* shift to next bit */ + send_byte = send_byte << 1; + + /* receive data */ + rec_byte = rec_byte << 1; + if ((ISP_IN & (1 << ISP_MISO)) != 0) { + rec_byte++; + } + + /* pulse SCK */ + ISP_OUT |= (1 << ISP_SCK); /* SCK high */ + ispDelay(); + ISP_OUT &= ~(1 << ISP_SCK); /* SCK low */ + ispDelay(); + } + + return rec_byte; +} + +uchar ispTransmit_hw(uchar send_byte) { + SPDR = send_byte; + + while (!(SPSR & (1 << SPIF))) + ; + return SPDR; +} + +uchar ispEnterProgrammingMode() { + uchar check; + uchar count = 32; + + while (count--) { + ispTransmit(0xAC); + ispTransmit(0x53); + check = ispTransmit(0); + ispTransmit(0); + + if (check == 0x53) { + return 0; + } + + spiHWdisable(); + + /* pulse RST */ + ispDelay(); + ISP_OUT |= (1 << ISP_RST); /* RST high */ + ispDelay(); + ISP_OUT &= ~(1 << ISP_RST); /* RST low */ + ispDelay(); + + if (ispTransmit == ispTransmit_hw) { + spiHWenable(); + } + + } + + return 1; /* error: device dosn't answer */ +} + +static void ispUpdateExtended(unsigned long address) +{ + uchar curr_hiaddr; + + curr_hiaddr = (address >> 17); + + /* check if extended address byte is changed */ + if(isp_hiaddr != curr_hiaddr) + { + isp_hiaddr = curr_hiaddr; + /* Load Extended Address byte */ + ispTransmit(0x4D); + ispTransmit(0x00); + ispTransmit(isp_hiaddr); + ispTransmit(0x00); + } +} + +uchar ispReadFlash(unsigned long address) { + + ispUpdateExtended(address); + + ispTransmit(0x20 | ((address & 1) << 3)); + ispTransmit(address >> 9); + ispTransmit(address >> 1); + return ispTransmit(0); +} + +uchar ispWriteFlash(unsigned long address, uchar data, uchar pollmode) { + + /* 0xFF is value after chip erase, so skip programming + if (data == 0xFF) { + return 0; + } + */ + + ispUpdateExtended(address); + + ispTransmit(0x40 | ((address & 1) << 3)); + ispTransmit(address >> 9); + ispTransmit(address >> 1); + ispTransmit(data); + + if (pollmode == 0) + return 0; + + if (data == 0x7F) { + clockWait(15); /* wait 4,8 ms */ + return 0; + } else { + + /* polling flash */ + uchar retries = 30; + uint8_t starttime = TIMERVALUE; + while (retries != 0) { + if (ispReadFlash(address) != 0x7F) { + return 0; + }; + + if ((uint8_t) (TIMERVALUE - starttime) > CLOCK_T_320us) { + starttime = TIMERVALUE; + retries--; + } + + } + return 1; /* error */ + } + +} + +uchar ispFlushPage(unsigned long address, uchar pollvalue) { + + ispUpdateExtended(address); + + ispTransmit(0x4C); + ispTransmit(address >> 9); + ispTransmit(address >> 1); + ispTransmit(0); + + if (pollvalue == 0xFF) { + clockWait(15); + return 0; + } else { + + /* polling flash */ + uchar retries = 30; + uint8_t starttime = TIMERVALUE; + + while (retries != 0) { + if (ispReadFlash(address) != 0xFF) { + return 0; + }; + + if ((uint8_t) (TIMERVALUE - starttime) > CLOCK_T_320us) { + starttime = TIMERVALUE; + retries--; + } + + } + + return 1; /* error */ + } + +} + +uchar ispReadEEPROM(unsigned int address) { + ispTransmit(0xA0); + ispTransmit(address >> 8); + ispTransmit(address); + return ispTransmit(0); +} + +uchar ispWriteEEPROM(unsigned int address, uchar data) { + + ispTransmit(0xC0); + ispTransmit(address >> 8); + ispTransmit(address); + ispTransmit(data); + + clockWait(30); // wait 9,6 ms + + return 0; +} diff --git a/firmware/isp.h b/firmware/isp.h new file mode 100755 index 0000000..2300a58 --- /dev/null +++ b/firmware/isp.h @@ -0,0 +1,65 @@ +/* + * isp.h - part of USBasp + * + * Autor..........: Thomas Fischl + * Description....: Provides functions for communication/programming + * over ISP interface + * Licence........: GNU GPL v2 (see Readme.txt) + * Creation Date..: 2005-02-23 + * Last change....: 2009-02-28 + */ + +#ifndef __isp_h_included__ +#define __isp_h_included__ + +#ifndef uchar +#define uchar unsigned char +#endif + +#define ISP_OUT PORTB +#define ISP_IN PINB +#define ISP_DDR DDRB +#define ISP_RST PB2 +#define ISP_MOSI PB3 +#define ISP_MISO PB4 +#define ISP_SCK PB5 + +/* Prepare connection to target device */ +void ispConnect(); + +/* Close connection to target device */ +void ispDisconnect(); + +/* read an write a byte from isp using software (slow) */ +uchar ispTransmit_sw(uchar send_byte); + +/* read an write a byte from isp using hardware (fast) */ +uchar ispTransmit_hw(uchar send_byte); + +/* enter programming mode */ +uchar ispEnterProgrammingMode(); + +/* read byte from eeprom at given address */ +uchar ispReadEEPROM(unsigned int address); + +/* write byte to flash at given address */ +uchar ispWriteFlash(unsigned long address, uchar data, uchar pollmode); + +uchar ispFlushPage(unsigned long address, uchar pollvalue); + +/* read byte from flash at given address */ +uchar ispReadFlash(unsigned long address); + +/* write byte to eeprom at given address */ +uchar ispWriteEEPROM(unsigned int address, uchar data); + +/* pointer to sw or hw transmit function */ +uchar (*ispTransmit)(uchar); + +/* set SCK speed. call before ispConnect! */ +void ispSetSCKOption(uchar sckoption); + +/* load extended address byte */ +void ispLoadExtendedAddressByte(unsigned long address); + +#endif /* __isp_h_included__ */ diff --git a/firmware/main.c b/firmware/main.c new file mode 100755 index 0000000..a225432 --- /dev/null +++ b/firmware/main.c @@ -0,0 +1,340 @@ +/* + * USBasp - USB in-circuit programmer for Atmel AVR controllers + * + * Thomas Fischl + * + * License........: GNU GPL v2 (see Readme.txt) + * Target.........: ATMega8 at 12 MHz + * Creation Date..: 2005-02-20 + * Last change....: 2009-02-28 + * + * PC2 SCK speed option. + * GND -> slow (8khz SCK), + * open -> software set speed (default is 375kHz SCK) + */ + +#include +#include +#include +#include + +#include "usbasp.h" +#include "usbdrv.h" +#include "isp.h" +#include "clock.h" +#include "tpi.h" +#include "tpi_defs.h" + +static uchar replyBuffer[8]; + +static uchar prog_state = PROG_STATE_IDLE; +static uchar prog_sck = USBASP_ISP_SCK_AUTO; + +static uchar prog_address_newmode = 0; +static unsigned long prog_address; +static unsigned int prog_nbytes = 0; +static unsigned int prog_pagesize; +static uchar prog_blockflags; +static uchar prog_pagecounter; + +uchar usbFunctionSetup(uchar data[8]) { + + uchar len = 0; + + if (data[1] == USBASP_FUNC_CONNECT) { + + /* set SCK speed */ + if ((PINC & (1 << PC2)) == 0) { + ispSetSCKOption(USBASP_ISP_SCK_8); + } else { + ispSetSCKOption(prog_sck); + } + + /* set compatibility mode of address delivering */ + prog_address_newmode = 0; + + ledRedOn(); + ispConnect(); + + } else if (data[1] == USBASP_FUNC_DISCONNECT) { + ispDisconnect(); + ledRedOff(); + + } else if (data[1] == USBASP_FUNC_TRANSMIT) { + replyBuffer[0] = ispTransmit(data[2]); + replyBuffer[1] = ispTransmit(data[3]); + replyBuffer[2] = ispTransmit(data[4]); + replyBuffer[3] = ispTransmit(data[5]); + len = 4; + + } else if (data[1] == USBASP_FUNC_READFLASH) { + + if (!prog_address_newmode) + prog_address = (data[3] << 8) | data[2]; + + prog_nbytes = (data[7] << 8) | data[6]; + prog_state = PROG_STATE_READFLASH; + len = 0xff; /* multiple in */ + + } else if (data[1] == USBASP_FUNC_READEEPROM) { + + if (!prog_address_newmode) + prog_address = (data[3] << 8) | data[2]; + + prog_nbytes = (data[7] << 8) | data[6]; + prog_state = PROG_STATE_READEEPROM; + len = 0xff; /* multiple in */ + + } else if (data[1] == USBASP_FUNC_ENABLEPROG) { + replyBuffer[0] = ispEnterProgrammingMode(); + len = 1; + + } else if (data[1] == USBASP_FUNC_WRITEFLASH) { + + if (!prog_address_newmode) + prog_address = (data[3] << 8) | data[2]; + + prog_pagesize = data[4]; + prog_blockflags = data[5] & 0x0F; + prog_pagesize += (((unsigned int) data[5] & 0xF0) << 4); + if (prog_blockflags & PROG_BLOCKFLAG_FIRST) { + prog_pagecounter = prog_pagesize; + } + prog_nbytes = (data[7] << 8) | data[6]; + prog_state = PROG_STATE_WRITEFLASH; + len = 0xff; /* multiple out */ + + } else if (data[1] == USBASP_FUNC_WRITEEEPROM) { + + if (!prog_address_newmode) + prog_address = (data[3] << 8) | data[2]; + + prog_pagesize = 0; + prog_blockflags = 0; + prog_nbytes = (data[7] << 8) | data[6]; + prog_state = PROG_STATE_WRITEEEPROM; + len = 0xff; /* multiple out */ + + } else if (data[1] == USBASP_FUNC_SETLONGADDRESS) { + + /* set new mode of address delivering (ignore address delivered in commands) */ + prog_address_newmode = 1; + /* set new address */ + prog_address = *((unsigned long*) &data[2]); + + } else if (data[1] == USBASP_FUNC_SETISPSCK) { + + /* set sck option */ + prog_sck = data[2]; + replyBuffer[0] = 0; + len = 1; + + } else if (data[1] == USBASP_FUNC_TPI_CONNECT) { + tpi_dly_cnt = data[2] | (data[3] << 8); + + /* RST high */ + ISP_OUT |= (1 << ISP_RST); + ISP_DDR |= (1 << ISP_RST); + + clockWait(3); + + /* RST low */ + ISP_OUT &= ~(1 << ISP_RST); + ledRedOn(); + + clockWait(16); + tpi_init(); + + } else if (data[1] == USBASP_FUNC_TPI_DISCONNECT) { + + tpi_send_byte(TPI_OP_SSTCS(TPISR)); + tpi_send_byte(0); + + clockWait(10); + + /* pulse RST */ + ISP_OUT |= (1 << ISP_RST); + clockWait(5); + ISP_OUT &= ~(1 << ISP_RST); + clockWait(5); + + /* set all ISP pins inputs */ + ISP_DDR &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI)); + /* switch pullups off */ + ISP_OUT &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI)); + + ledRedOff(); + + } else if (data[1] == USBASP_FUNC_TPI_RAWREAD) { + replyBuffer[0] = tpi_recv_byte(); + len = 1; + + } else if (data[1] == USBASP_FUNC_TPI_RAWWRITE) { + tpi_send_byte(data[2]); + + } else if (data[1] == USBASP_FUNC_TPI_READBLOCK) { + prog_address = (data[3] << 8) | data[2]; + prog_nbytes = (data[7] << 8) | data[6]; + prog_state = PROG_STATE_TPI_READ; + len = 0xff; /* multiple in */ + + } else if (data[1] == USBASP_FUNC_TPI_WRITEBLOCK) { + prog_address = (data[3] << 8) | data[2]; + prog_nbytes = (data[7] << 8) | data[6]; + prog_state = PROG_STATE_TPI_WRITE; + len = 0xff; /* multiple out */ + + } else if (data[1] == USBASP_FUNC_GETCAPABILITIES) { + replyBuffer[0] = USBASP_CAP_0_TPI; + replyBuffer[1] = 0; + replyBuffer[2] = 0; + replyBuffer[3] = 0; + len = 4; + } + + usbMsgPtr = replyBuffer; + + return len; +} + +uchar usbFunctionRead(uchar *data, uchar len) { + + uchar i; + + /* check if programmer is in correct read state */ + if ((prog_state != PROG_STATE_READFLASH) && (prog_state + != PROG_STATE_READEEPROM) && (prog_state != PROG_STATE_TPI_READ)) { + return 0xff; + } + + /* fill packet TPI mode */ + if(prog_state == PROG_STATE_TPI_READ) + { + tpi_read_block(prog_address, data, len); + prog_address += len; + return len; + } + + /* fill packet ISP mode */ + for (i = 0; i < len; i++) { + if (prog_state == PROG_STATE_READFLASH) { + data[i] = ispReadFlash(prog_address); + } else { + data[i] = ispReadEEPROM(prog_address); + } + prog_address++; + } + + /* last packet? */ + if (len < 8) { + prog_state = PROG_STATE_IDLE; + } + + return len; +} + +uchar usbFunctionWrite(uchar *data, uchar len) { + + uchar retVal = 0; + uchar i; + + /* check if programmer is in correct write state */ + if ((prog_state != PROG_STATE_WRITEFLASH) && (prog_state + != PROG_STATE_WRITEEEPROM) && (prog_state != PROG_STATE_TPI_WRITE)) { + return 0xff; + } + + if (prog_state == PROG_STATE_TPI_WRITE) + { + tpi_write_block(prog_address, data, len); + prog_address += len; + prog_nbytes -= len; + if(prog_nbytes <= 0) + { + prog_state = PROG_STATE_IDLE; + return 1; + } + return 0; + } + + for (i = 0; i < len; i++) { + + if (prog_state == PROG_STATE_WRITEFLASH) { + /* Flash */ + + if (prog_pagesize == 0) { + /* not paged */ + ispWriteFlash(prog_address, data[i], 1); + } else { + /* paged */ + ispWriteFlash(prog_address, data[i], 0); + prog_pagecounter--; + if (prog_pagecounter == 0) { + ispFlushPage(prog_address, data[i]); + prog_pagecounter = prog_pagesize; + } + } + + } else { + /* EEPROM */ + ispWriteEEPROM(prog_address, data[i]); + } + + prog_nbytes--; + + if (prog_nbytes == 0) { + prog_state = PROG_STATE_IDLE; + if ((prog_blockflags & PROG_BLOCKFLAG_LAST) && (prog_pagecounter + != prog_pagesize)) { + + /* last block and page flush pending, so flush it now */ + ispFlushPage(prog_address, data[i]); + } + + retVal = 1; // Need to return 1 when no more data is to be received + } + + prog_address++; + } + + return retVal; +} + +int main(void) { + uchar i, j; + + /* no pullups on USB and ISP pins */ + PORTD = 0; + PORTB = 0; + /* all outputs except PD2 = INT0 */ + DDRD = ~(1 << 2); + + /* output SE0 for USB reset */ + DDRB = ~0; + j = 0; + /* USB Reset by device only required on Watchdog Reset */ + while (--j) { + i = 0; + /* delay >10ms for USB reset */ + while (--i) + ; + } + /* all USB and ISP pins inputs */ + DDRB = 0; + + /* all inputs except PC0, PC1 */ + DDRC = 0x03; + PORTC = 0xfe; + + /* init timer */ + clockInit(); + + /* main event loop */ + usbInit(); + sei(); + for (;;) { + usbPoll(); + } + return 0; +} + diff --git a/firmware/tpi.S b/firmware/tpi.S new file mode 100644 index 0000000..d8dc4e1 --- /dev/null +++ b/firmware/tpi.S @@ -0,0 +1,258 @@ +/** + * \brief Size-optimized code for TPI + * \file tpi.s + * \author S³awomir Fraœ + */ +#include +#include "tpi_defs.h" + + +#define TPI_CLK_PORT PORTB +#define TPI_CLK_DDR DDRB +#define TPI_CLK_BIT 5 +#define TPI_DATAOUT_PORT PORTB +#define TPI_DATAOUT_DDR DDRB +#define TPI_DATAOUT_BIT 3 +#ifdef TPI_WITH_OPTO +# define TPI_DATAIN_PIN PINB +# define TPI_DATAIN_DDR DDRB +# define TPI_DATAIN_BIT 4 +#else +# define TPI_DATAIN_PIN PINB +# define TPI_DATAIN_BIT 3 +#endif + +.comm tpi_dly_cnt, 2 + + +/** + * TPI init + */ +.global tpi_init +tpi_init: + /* CLK <= out */ + sbi _SFR_IO_ADDR(TPI_CLK_DDR), TPI_CLK_BIT +#ifdef TPI_WITH_OPTO + /* DATAIN <= pull-up */ + cbi _SFR_IO_ADDR(TPI_DATAIN_DDR), TPI_DATAIN_BIT + sbi _SFR_IO_ADDR(TPI_DATAIN_PORT), TPI_DATAIN_BIT + /* DATAOUT <= high */ + sbi _SFR_IO_ADDR(TPI_DATAOUT_DDR), TPI_DATAOUT_BIT + sbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT +#else + /* DATA <= pull-up */ + cbi _SFR_IO_ADDR(TPI_DATAOUT_DDR), TPI_DATAOUT_BIT + sbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT +#endif + + /* 32 bits */ + ldi r21, 32 +1: + rcall tpi_bit_h + dec r21 + brne 1b + + ret + + +/** + * Update PR + * in: r25:r24 <= PR + * lost: r18-r21,r24,r30-r31 + */ +tpi_pr_update: + movw r20, r24 + ldi r24, TPI_OP_SSTPR(0) + rcall tpi_send_byte + mov r24, r20 + rcall tpi_send_byte + ldi r24, TPI_OP_SSTPR(1) + rcall tpi_send_byte + mov r24, r21 +// rjmp tpi_send_byte + + +/** + * Send one byte + * in: r24 <= byte + * lost: r18-r19,r30-r31 + */ +.global tpi_send_byte +tpi_send_byte: + /* start bit */ + rcall tpi_bit_l + /* 8 data bits */ + ldi r18, 8 + ldi r19, 0 +1: + // parity + eor r19, r24 + // get bit, shift + bst r24, 0 + lsr r24 + // send + rcall tpi_bit + dec r18 + brne 1b + /* parity bit */ + bst r19, 0 + rcall tpi_bit + /* 2 stop bits */ + rcall tpi_bit_h +// rjmp tpi_bit_h + + +/** + * Exchange of one bit + * in: T <= bit_in + * out: T => bit_out + * lost: r30-r31 + */ +tpi_bit_h: + set +tpi_bit: + /* TPIDATA = T */ +#ifdef TPI_WITH_OPTO + // DATAOUT = high (opto should allow TPIDATA to be pulled low by external device) + // if(T == 0) + // DATAOUT = low + sbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT + brts 1f +tpi_bit_l: + cbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT +1: +#else + // DATAOUT = pull-up + // if(T == 0) + // DATAOUT = low + cbi _SFR_IO_ADDR(TPI_DATAOUT_DDR), TPI_DATAOUT_BIT + sbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT + brts 1f +tpi_bit_l: + cbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT + sbi _SFR_IO_ADDR(TPI_DATAOUT_DDR), TPI_DATAOUT_BIT +1: +#endif + /* delay(); */ + lds r30, tpi_dly_cnt + lds r31, tpi_dly_cnt+1 +1: + sbiw r30, 1 + brsh 1b + /* TPICLK = 1 */ + sbi _SFR_IO_ADDR(TPI_CLK_PORT), TPI_CLK_BIT + /* T = TPIDATA */ + in r30, _SFR_IO_ADDR(TPI_DATAIN_PIN) + bst r30, TPI_DATAIN_BIT + /* delay(); */ + lds r30, tpi_dly_cnt + lds r31, tpi_dly_cnt+1 +1: + sbiw r30, 1 + brsh 1b + + /* TPICLK = 0 */ + cbi _SFR_IO_ADDR(TPI_CLK_PORT), TPI_CLK_BIT + ret + + +/** + * Receive one byte + * out: r24 => byte + * lost: r18-r19,r30-r31 + */ +.global tpi_recv_byte +tpi_recv_byte: + /* waitfor(start_bit, 192); */ + ldi r18, 192 +1: + rcall tpi_bit_h + brtc .tpi_recv_found_start + dec r18 + brne 1b + /* no start bit: set return value */ +.tpi_break_ret0: + ldi r24, 0 + /* send 2 breaks (24++ bits) */ + ldi r18, 26 +1: + rcall tpi_bit_l + dec r18 + brne 1b + /* send hi */ + rjmp tpi_bit_h + +// ---- +.tpi_recv_found_start: + /* recv 8bits(+calc.parity) */ + ldi r18, 8 + ldi r19, 0 +1: + rcall tpi_bit_h + lsr r24 + bld r24, 7 + eor r19, r24 + dec r18 + brne 1b + /* recv parity */ + rcall tpi_bit_h + bld r18, 7 + eor r19, r18 + brmi .tpi_break_ret0 + /* recv stop bits */ + rcall tpi_bit_h + rjmp tpi_bit_h + + +/** + * Read Block + */ +.global tpi_read_block +tpi_read_block: + // X <= dptr + movw XL, r22 + // r23 <= len + mov r23, r20 + /* set PR */ + rcall tpi_pr_update + /* read data */ +.tpi_read_loop: + ldi r24, TPI_OP_SLD_INC + rcall tpi_send_byte + rcall tpi_recv_byte + st X+, r24 + dec r23 + brne .tpi_read_loop + ret + + +/** + * Write block + */ +.global tpi_write_block +tpi_write_block: + // X <= sptr + movw XL, r22 + // r23 <= len + mov r23, r20 + /* set PR */ + rcall tpi_pr_update + /* write data */ +.tpi_write_loop: + ldi r24, TPI_OP_SOUT(NVMCMD) + rcall tpi_send_byte + ldi r24, NVMCMD_WORD_WRITE + rcall tpi_send_byte + ldi r24, TPI_OP_SST_INC + rcall tpi_send_byte + ld r24, X+ + rcall tpi_send_byte +.tpi_nvmbsy_wait: + ldi r24, TPI_OP_SIN(NVMCSR) + rcall tpi_send_byte + rcall tpi_recv_byte + andi r24, NVMCSR_BSY + brne .tpi_nvmbsy_wait + dec r23 + brne .tpi_write_loop + ret diff --git a/firmware/tpi.h b/firmware/tpi.h new file mode 100644 index 0000000..e39d0e8 --- /dev/null +++ b/firmware/tpi.h @@ -0,0 +1,47 @@ +/** + * \brief Header for tpi + * \file tpi.h + * \author S³awomir Fraœ + */ +#ifndef __TPI_H__ +#define __TPI_H__ +#include + + +/* Globals */ +/** Number of iterations in tpi_delay loop */ +extern uint16_t tpi_dly_cnt; + + +/* Functions */ +/** + * TPI init + */ +void tpi_init(void); +/** + * Send raw byte by TPI + * \param b Byte to send + */ +void tpi_send_byte(uint8_t b); +/** + * Receive one raw byte from TPI + * \return Received byte + */ +uint8_t tpi_recv_byte(void); +/** + * Read block + * \param addr Address of block + * \param dptr Pointer to dest memory block + * \param len Length of read + */ +void tpi_read_block(uint16_t addr, uint8_t* dptr, uint8_t len); +/** + * Write block + * \param addr Address to program + * \param sptr Pointer to source block + * \param len Length of write + */ +void tpi_write_block(uint16_t addr, const uint8_t* sptr, uint8_t len); + + +#endif /*__TPI_H__*/ diff --git a/firmware/tpi_defs.h b/firmware/tpi_defs.h new file mode 100644 index 0000000..9cf6ca1 --- /dev/null +++ b/firmware/tpi_defs.h @@ -0,0 +1,59 @@ +/** + * \brief Internal defs for tpi + * \file tpi_defs.h + * \author S³awomir Fraœ + */ +#ifndef __TPI_DEFS_H__ +#define __TPI_DEFS_H__ + +/* TPI instructions */ +#define TPI_OP_SLD 0x20 +#define TPI_OP_SLD_INC 0x24 +#define TPI_OP_SST 0x60 +#define TPI_OP_SST_INC 0x64 +#define TPI_OP_SSTPR(a) (0x68 | (a)) +#define TPI_OP_SIN(a) (0x10 | (((a)<<1)&0x60) | ((a)&0x0F) ) +#define TPI_OP_SOUT(a) (0x90 | (((a)<<1)&0x60) | ((a)&0x0F) ) +#define TPI_OP_SLDCS(a) (0x80 | ((a)&0x0F) ) +#define TPI_OP_SSTCS(a) (0xC0 | ((a)&0x0F) ) +#define TPI_OP_SKEY 0xE0 + +/* TPI control/status registers */ +#define TPIIR 0xF +#define TPIPCR 0x2 +#define TPISR 0x0 + +// TPIPCR bits +#define TPIPCR_GT_2 0x04 +#define TPIPCR_GT_1 0x02 +#define TPIPCR_GT_0 0x01 +#define TPIPCR_GT_128b 0x00 +#define TPIPCR_GT_64b 0x01 +#define TPIPCR_GT_32b 0x02 +#define TPIPCR_GT_16b 0x03 +#define TPIPCR_GT_8b 0x04 +#define TPIPCR_GT_4b 0x05 +#define TPIPCR_GT_2b 0x06 +#define TPIPCR_GT_0b 0x07 + +// TPISR bits +#define TPISR_NVMEN 0x02 + +/* NVM registers */ +#define NVMCSR 0x32 +#define NVMCMD 0x33 + +// NVMCSR bits +#define NVMCSR_BSY 0x80 + +// NVMCMD values +#define NVMCMD_NOP 0x00 +#define NVMCMD_CHIP_ERASE 0x10 +#define NVMCMD_SECTION_ERASE 0x14 +#define NVMCMD_WORD_WRITE 0x1D + + + + + +#endif /*__TPI_DEFS_H__*/ diff --git a/firmware/usbasp.h b/firmware/usbasp.h new file mode 100644 index 0000000..b60bd04 --- /dev/null +++ b/firmware/usbasp.h @@ -0,0 +1,70 @@ +/* + * usbasp.c - part of USBasp + * + * Autor..........: Thomas Fischl + * Description....: Definitions and macros for usbasp + * Licence........: GNU GPL v2 (see Readme.txt) + * Creation Date..: 2009-02-28 + * Last change....: 2009-02-28 + */ + +#ifndef USBASP_H_ +#define USBASP_H_ + +/* USB function call identifiers */ +#define USBASP_FUNC_CONNECT 1 +#define USBASP_FUNC_DISCONNECT 2 +#define USBASP_FUNC_TRANSMIT 3 +#define USBASP_FUNC_READFLASH 4 +#define USBASP_FUNC_ENABLEPROG 5 +#define USBASP_FUNC_WRITEFLASH 6 +#define USBASP_FUNC_READEEPROM 7 +#define USBASP_FUNC_WRITEEEPROM 8 +#define USBASP_FUNC_SETLONGADDRESS 9 +#define USBASP_FUNC_SETISPSCK 10 +#define USBASP_FUNC_TPI_CONNECT 11 +#define USBASP_FUNC_TPI_DISCONNECT 12 +#define USBASP_FUNC_TPI_RAWREAD 13 +#define USBASP_FUNC_TPI_RAWWRITE 14 +#define USBASP_FUNC_TPI_READBLOCK 15 +#define USBASP_FUNC_TPI_WRITEBLOCK 16 +#define USBASP_FUNC_GETCAPABILITIES 127 + +/* USBASP capabilities */ +#define USBASP_CAP_0_TPI 0x01 + +/* programming state */ +#define PROG_STATE_IDLE 0 +#define PROG_STATE_WRITEFLASH 1 +#define PROG_STATE_READFLASH 2 +#define PROG_STATE_READEEPROM 3 +#define PROG_STATE_WRITEEEPROM 4 +#define PROG_STATE_TPI_READ 5 +#define PROG_STATE_TPI_WRITE 6 + +/* Block mode flags */ +#define PROG_BLOCKFLAG_FIRST 1 +#define PROG_BLOCKFLAG_LAST 2 + +/* ISP SCK speed identifiers */ +#define USBASP_ISP_SCK_AUTO 0 +#define USBASP_ISP_SCK_0_5 1 /* 500 Hz */ +#define USBASP_ISP_SCK_1 2 /* 1 kHz */ +#define USBASP_ISP_SCK_2 3 /* 2 kHz */ +#define USBASP_ISP_SCK_4 4 /* 4 kHz */ +#define USBASP_ISP_SCK_8 5 /* 8 kHz */ +#define USBASP_ISP_SCK_16 6 /* 16 kHz */ +#define USBASP_ISP_SCK_32 7 /* 32 kHz */ +#define USBASP_ISP_SCK_93_75 8 /* 93.75 kHz */ +#define USBASP_ISP_SCK_187_5 9 /* 187.5 kHz */ +#define USBASP_ISP_SCK_375 10 /* 375 kHz */ +#define USBASP_ISP_SCK_750 11 /* 750 kHz */ +#define USBASP_ISP_SCK_1500 12 /* 1.5 MHz */ + +/* macros for gpio functions */ +#define ledRedOn() PORTC &= ~(1 << PC1) +#define ledRedOff() PORTC |= (1 << PC1) +#define ledGreenOn() PORTC &= ~(1 << PC0) +#define ledGreenOff() PORTC |= (1 << PC0) + +#endif /* USBASP_H_ */ diff --git a/firmware/usbconfig.h b/firmware/usbconfig.h new file mode 100755 index 0000000..203239e --- /dev/null +++ b/firmware/usbconfig.h @@ -0,0 +1,240 @@ +/* Name: usbconfig.h + * Project: AVR USB driver + * Author: Christian Starkjohann, Thomas Fischl + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt) or proprietary (CommercialLicense.txt) + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +/* +General Description: +This file contains parts of the USB driver which can be configured and can or +must be adapted to your hardware. + +Please note that the usbdrv contains a usbconfig-prototype.h file now. We +recommend that you use that file as a template because it will always list +the newest features and options. +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME B +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 0 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 1 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! + */ +#define USB_CFG_CLOCK_KHZ 12000 +/* Clock rate of the AVR in MHz. Legal values are 12000, 16000 or 16500. + * The 16.5 MHz version of the code requires no crystal, it tolerates +/- 1% + * deviation from the nominal frequency. All other rates require a precision + * of 2000 ppm and thus a crystal! + * Default if not specified: 12 MHz + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 0 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint 1. + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 0 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 1 and an interrupt-in + * endpoint 3. You must also enable endpoint 1 above. + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_INTR_POLL_INTERVAL 10 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 50 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 1 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoint 1. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to endpoint 1. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID 0xc0, 0x16 /* 5824 in dec, stands for VOTI */ +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you use obdev's free shared + * VID/PID pair. Be sure to read USBID-License.txt for rules! + */ +#define USB_CFG_DEVICE_ID 0xdc, 0x05 /* 1500 in dec, obdev's free PID */ +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you use obdev's free shared VID/PID pair. Be sure to read the rules in + * USBID-License.txt! + */ +#define USB_CFG_DEVICE_VERSION 0x04, 0x01 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'w', 'w', 'w', '.', 'f', 'i', 's', 'c', 'h', 'l', '.', 'd', 'e' +#define USB_CFG_VENDOR_NAME_LEN 13 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USBID-License.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'U', 'S', 'B', 'a', 's', 'p' +#define USB_CFG_DEVICE_NAME_LEN 6 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USBID-License.txt before you assign a name. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0xff +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + */ +#define USB_CFG_INTERFACE_CLASS 0 +#define USB_CFG_INTERFACE_SUBCLASS 0 +#define USB_CFG_INTERFACE_PROTOCOL 0 +/* See USB specification if you want to conform to an existing device class or + * protocol. + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 /* total length of report descriptor */ +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ + +#endif /* __usbconfig_h_included__ */ diff --git a/firmware/usbdrv/Changelog.txt b/firmware/usbdrv/Changelog.txt new file mode 100644 index 0000000..5c6354a --- /dev/null +++ b/firmware/usbdrv/Changelog.txt @@ -0,0 +1,308 @@ +This file documents changes in the firmware-only USB driver for atmel's AVR +microcontrollers. New entries are always appended to the end of the file. +Scroll down to the bottom to see the most recent changes. + +2005-04-01: + - Implemented endpoint 1 as interrupt-in endpoint. + - Moved all configuration options to usbconfig.h which is not part of the + driver. + - Changed interface for usbVendorSetup(). + - Fixed compatibility with ATMega8 device. + - Various minor optimizations. + +2005-04-11: + - Changed interface to application: Use usbFunctionSetup(), usbFunctionRead() + and usbFunctionWrite() now. Added configuration options to choose which + of these functions to compile in. + - Assembler module delivers receive data non-inverted now. + - Made register and bit names compatible with more AVR devices. + +2005-05-03: + - Allow address of usbRxBuf on any memory page as long as the buffer does + not cross 256 byte page boundaries. + - Better device compatibility: works with Mega88 now. + - Code optimization in debugging module. + - Documentation updates. + +2006-01-02: + - Added (free) default Vendor- and Product-IDs bought from voti.nl. + - Added USBID-License.txt file which defines the rules for using the free + shared VID/PID pair. + - Added Readme.txt to the usbdrv directory which clarifies administrative + issues. + +2006-01-25: + - Added "configured state" to become more standards compliant. + - Added "HALT" state for interrupt endpoint. + - Driver passes the "USB Command Verifier" test from usb.org now. + - Made "serial number" a configuration option. + - Minor optimizations, we now recommend compiler option "-Os" for best + results. + - Added a version number to usbdrv.h + +2006-02-03: + - New configuration variable USB_BUFFER_SECTION for the memory section where + the USB rx buffer will go. This defaults to ".bss" if not defined. Since + this buffer MUST NOT cross 256 byte pages (not even touch a page at the + end), the user may want to pass a linker option similar to + "-Wl,--section-start=.mybuffer=0x800060". + - Provide structure for usbRequest_t. + - New defines for USB constants. + - Prepared for HID implementations. + - Increased data size limit for interrupt transfers to 8 bytes. + - New macro usbInterruptIsReady() to query interrupt buffer state. + +2006-02-18: + - Ensure that the data token which is sent as an ack to an OUT transfer is + always zero sized. This fixes a bug where the host reports an error after + sending an out transfer to the device, although all data arrived at the + device. + - Updated docs in usbdrv.h to reflect changed API in usbFunctionWrite(). + +* Release 2006-02-20 + + - Give a compiler warning when compiling with debugging turned on. + - Added Oleg Semyonov's changes for IAR-cc compatibility. + - Added new (optional) functions usbDeviceConnect() and usbDeviceDisconnect() + (also thanks to Oleg!). + - Rearranged tests in usbPoll() to save a couple of instructions in the most + likely case that no actions are pending. + - We need a delay between the SET ADDRESS request until the new address + becomes active. This delay was handled in usbPoll() until now. Since the + spec says that the delay must not exceed 2ms, previous versions required + aggressive polling during the enumeration phase. We have now moved the + handling of the delay into the interrupt routine. + - We must not reply with NAK to a SETUP transaction. We can only achieve this + by making sure that the rx buffer is empty when SETUP tokens are expected. + We therefore don't pass zero sized data packets from the status phase of + a transfer to usbPoll(). This change MAY cause troubles if you rely on + receiving a less than 8 bytes long packet in usbFunctionWrite() to + identify the end of a transfer. usbFunctionWrite() will NEVER be called + with a zero length. + +* Release 2006-03-14 + + - Improved IAR C support: tiny memory model, more devices + - Added template usbconfig.h file under the name usbconfig-prototype.h + +* Release 2006-03-26 + + - Added provision for one more interrupt-in endpoint (endpoint 3). + - Added provision for one interrupt-out endpoint (endpoint 1). + - Added flowcontrol macros for USB. + - Added provision for custom configuration descriptor. + - Allow ANY two port bits for D+ and D-. + - Merged (optional) receive endpoint number into global usbRxToken variable. + - Use USB_CFG_IOPORTNAME instead of USB_CFG_IOPORT. We now construct the + variable name from the single port letter instead of computing the address + of related ports from the output-port address. + +* Release 2006-06-26 + + - Updated documentation in usbdrv.h and usbconfig-prototype.h to reflect the + new features. + - Removed "#warning" directives because IAR does not understand them. Use + unused static variables instead to generate a warning. + - Do not include when compiling with IAR. + - Introduced USB_CFG_DESCR_PROPS_* in usbconfig.h to configure how each + USB descriptor should be handled. It is now possible to provide descriptor + data in Flash, RAM or dynamically at runtime. + - STALL is now a status in usbTxLen* instead of a message. We can now conform + to the spec and leave the stall status pending until it is cleared. + - Made usbTxPacketCnt1 and usbTxPacketCnt3 public. This allows the + application code to reset data toggling on interrupt pipes. + +* Release 2006-07-18 + + - Added an #if !defined __ASSEMBLER__ to the warning in usbdrv.h. This fixes + an assembler error. + - usbDeviceDisconnect() takes pull-up resistor to high impedance now. + +* Release 2007-02-01 + + - Merged in some code size improvements from usbtiny (thanks to Dick + Streefland for these optimizations!) + - Special alignment requirement for usbRxBuf not required any more. Thanks + again to Dick Streefland for this hint! + - Reverted to "#warning" instead of unused static variables -- new versions + of IAR CC should handle this directive. + - Changed Open Source license to GNU GPL v2 in order to make linking against + other free libraries easier. We no longer require publication of the + circuit diagrams, but we STRONGLY encourage it. If you improve the driver + itself, PLEASE grant us a royalty free license to your changes for our + commercial license. + +* Release 2007-03-29 + + - New configuration option "USB_PUBLIC" in usbconfig.h. + - Set USB version number to 1.10 instead of 1.01. + - Code used USB_CFG_DESCR_PROPS_STRING_DEVICE and + USB_CFG_DESCR_PROPS_STRING_PRODUCT inconsistently. Changed all occurrences + to USB_CFG_DESCR_PROPS_STRING_PRODUCT. + - New assembler module for 16.5 MHz RC oscillator clock with PLL in receiver + code. + - New assembler module for 16 MHz crystal. + - usbdrvasm.S contains common code only, clock-specific parts have been moved + to usbdrvasm12.S, usbdrvasm16.S and usbdrvasm165.S respectively. + +* Release 2007-06-25 + + - 16 MHz module: Do SE0 check in stuffed bits as well. + +* Release 2007-07-07 + + - Define hi8(x) for IAR compiler to limit result to 8 bits. This is necessary + for negative values. + - Added 15 MHz module contributed by V. Bosch. + - Interrupt vector name can now be configured. This is useful if somebody + wants to use a different hardware interrupt than INT0. + +* Release 2007-08-07 + + - Moved handleIn3 routine in usbdrvasm16.S so that relative jump range is + not exceeded. + - More config options: USB_RX_USER_HOOK(), USB_INITIAL_DATATOKEN, + USB_COUNT_SOF + - USB_INTR_PENDING can now be a memory address, not just I/O + +* Release 2007-09-19 + + - Split out common parts of assembler modules into separate include file + - Made endpoint numbers configurable so that given interface definitions + can be matched. See USB_CFG_EP3_NUMBER in usbconfig-prototype.h. + - Store endpoint number for interrupt/bulk-out so that usbFunctionWriteOut() + can handle any number of endpoints. + - Define usbDeviceConnect() and usbDeviceDisconnect() even if no + USB_CFG_PULLUP_IOPORTNAME is defined. Directly set D+ and D- to 0 in this + case. + +* Release 2007-12-01 + + - Optimize usbDeviceConnect() and usbDeviceDisconnect() for less code size + when USB_CFG_PULLUP_IOPORTNAME is not defined. + +* Release 2007-12-13 + + - Renamed all include-only assembler modules from *.S to *.inc so that + people don't add them to their project sources. + - Distribute leap bits in tx loop more evenly for 16 MHz module. + - Use "macro" and "endm" instead of ".macro" and ".endm" for IAR + - Avoid compiler warnings for constant expr range by casting some values in + USB descriptors. + +* Release 2008-01-21 + + - Fixed bug in 15 and 16 MHz module where the new address set with + SET_ADDRESS was already accepted at the next NAK or ACK we send, not at + the next data packet we send. This caused problems when the host polled + too fast. Thanks to Alexander Neumann for his help and patience debugging + this issue! + +* Release 2008-02-05 + + - Fixed bug in 16.5 MHz module where a register was used in the interrupt + handler before it was pushed. This bug was introduced with version + 2007-09-19 when common parts were moved to a separate file. + - Optimized CRC routine (thanks to Reimar Doeffinger). + +* Release 2008-02-16 + + - Removed outdated IAR compatibility stuff (code sections). + - Added hook macros for USB_RESET_HOOK() and USB_SET_ADDRESS_HOOK(). + - Added optional routine usbMeasureFrameLength() for calibration of the + internal RC oscillator. + +* Release 2008-02-28 + + - USB_INITIAL_DATATOKEN defaults to USBPID_DATA1 now, which means that we + start with sending USBPID_DATA0. + - Changed defaults in usbconfig-prototype.h + - Added free USB VID/PID pair for MIDI class devices + - Restructured AVR-USB as separate package, not part of PowerSwitch any more. + +* Release 2008-04-18 + + - Restructured usbdrv.c so that it is easier to read and understand. + - Better code optimization with gcc 4. + - If a second interrupt in endpoint is enabled, also add it to config + descriptor. + - Added config option for long transfers (above 254 bytes), see + USB_CFG_LONG_TRANSFERS in usbconfig.h. + - Added 20 MHz module contributed by Jeroen Benschop. + +* Release 2008-05-13 + + - Fixed bug in libs-host/hiddata.c function usbhidGetReport(): length + was not incremented, pointer to length was incremented instead. + - Added code to command line tool(s) which claims an interface. This code + is disabled by default, but may be necessary on newer Linux kernels. + - Added usbconfig.h option "USB_CFG_CHECK_DATA_TOGGLING". + - New header "usbportability.h" prepares ports to other development + environments. + - Long transfers (above 254 bytes) did not work when usbFunctionRead() was + used to supply the data. Fixed this bug. [Thanks to Alexander Neumann!] + - In hiddata.c (example code for sending/receiving data over HID), use + USB_RECIP_DEVICE instead of USB_RECIP_INTERFACE for control transfers so + that we need not claim the interface. + - in usbPoll() loop 20 times polling for RESET state instead of 10 times. + This accounts for the higher clock rates we now support. + - Added a module for 12.8 MHz RC oscillator with PLL in receiver loop. + - Added hook to SOF code so that oscillator can be tuned to USB frame clock. + - Added timeout to waitForJ loop. Helps preventing unexpected hangs. + - Added example code for oscillator tuning to libs-device (thanks to + Henrik Haftmann for the idea to this routine). + - Implemented option USB_CFG_SUPPRESS_INTR_CODE. + +* Release 2008-10-22 + + - Fixed libs-device/osctune.h: OSCCAL is memory address on ATMega88 and + similar, not offset of 0x20 needs to be added. + - Allow distribution under GPLv3 for those who have to link against other + code distributed under GPLv3. + +* Release 2008-11-26 + + - Removed libusb-win32 dependency for hid-data example in Makefile.windows. + It was never required and confused many people. + - Added extern uchar usbRxToken to usbdrv.h. + - Integrated a module with CRC checks at 18 MHz by Lukas Schrittwieser. + +* Release 2009-03-23 + + - Hid-mouse example used settings from hid-data example, fixed that. + - Renamed project to V-USB due to a trademark issue with Atmel(r). + - Changed CommercialLicense.txt and USBID-License.txt to make the + background of USB ID registration clearer. + +* Release 2009-04-15 + + - Changed CommercialLicense.txt to reflect the new range of PIDs from + Jason Kotzin. + - Removed USBID-License.txt in favor of USB-IDs-for-free.txt and + USB-ID-FAQ.txt + - Fixed a bug in the 12.8 MHz module: End Of Packet decection was made in + the center between bit 0 and 1 of each byte. This is where the data lines + are expected to change and the sampled data may therefore be nonsense. + We therefore check EOP ONLY if bits 0 AND 1 have both been read as 0 on D-. + - Fixed a bitstuffing problem in the 16 MHz module: If bit 6 was stuffed, + the unstuffing code in the receiver routine was 1 cycle too long. If + multiple bytes had the unstuffing in bit 6, the error summed up until the + receiver was out of sync. + - Included option for faster CRC routine. + Thanks to Slawomir Fras (BoskiDialer) for this code! + - Updated bits in Configuration Descriptor's bmAttributes according to + USB 1.1 (in particular bit 7, it is a must-be-set bit now). + +* Release 2009-08-22 + + - Moved first DBG1() after odDebugInit() in all examples. + - Use vector INT0_vect instead of SIG_INTERRUPT0 if defined. This makes + V-USB compatible with the new "p" suffix devices (e.g. ATMega328p). + - USB_CFG_CLOCK_KHZ setting is now required in usbconfig.h (no default any + more). + - New option USB_CFG_DRIVER_FLASH_PAGE allows boot loaders on devices with + more than 64 kB flash. + - Built-in configuration descriptor allows custom definition for second + endpoint now. + +* Release 2010-07-15 diff --git a/firmware/usbdrv/CommercialLicense.txt b/firmware/usbdrv/CommercialLicense.txt new file mode 100644 index 0000000..11d07d9 --- /dev/null +++ b/firmware/usbdrv/CommercialLicense.txt @@ -0,0 +1,166 @@ +V-USB Driver Software License Agreement +Version 2009-08-03 + +THIS LICENSE AGREEMENT GRANTS YOU CERTAIN RIGHTS IN A SOFTWARE. YOU CAN +ENTER INTO THIS AGREEMENT AND ACQUIRE THE RIGHTS OUTLINED BELOW BY PAYING +THE AMOUNT ACCORDING TO SECTION 4 ("PAYMENT") TO OBJECTIVE DEVELOPMENT. + + +1 DEFINITIONS + +1.1 "OBJECTIVE DEVELOPMENT" shall mean OBJECTIVE DEVELOPMENT Software GmbH, +Grosse Schiffgasse 1A/7, 1020 Wien, AUSTRIA. + +1.2 "You" shall mean the Licensee. + +1.3 "V-USB" shall mean all files included in the package distributed under +the name "vusb" by OBJECTIVE DEVELOPMENT (http://www.obdev.at/vusb/) +unless otherwise noted. This includes the firmware-only USB device +implementation for Atmel AVR microcontrollers, some simple device examples +and host side software examples and libraries. + + +2 LICENSE GRANTS + +2.1 Source Code. OBJECTIVE DEVELOPMENT shall furnish you with the source +code of V-USB. + +2.2 Distribution and Use. OBJECTIVE DEVELOPMENT grants you the +non-exclusive right to use, copy and distribute V-USB with your hardware +product(s), restricted by the limitations in section 3 below. + +2.3 Modifications. OBJECTIVE DEVELOPMENT grants you the right to modify +the source code and your copy of V-USB according to your needs. + +2.4 USB IDs. OBJECTIVE DEVELOPMENT furnishes you with one or two USB +Product ID(s), sent to you in e-mail. These Product IDs are reserved +exclusively for you. OBJECTIVE DEVELOPMENT has obtained USB Product ID +ranges under the Vendor ID 5824 from Wouter van Ooijen (Van Ooijen +Technische Informatica, www.voti.nl) and under the Vendor ID 8352 from +Jason Kotzin (Clay Logic, www.claylogic.com). Both owners of the Vendor IDs +have obtained these IDs from the USB Implementers Forum, Inc. +(www.usb.org). OBJECTIVE DEVELOPMENT disclaims all liability which might +arise from the assignment of USB IDs. + +2.5 USB Certification. Although not part of this agreement, we want to make +it clear that you cannot become USB certified when you use V-USB or a USB +Product ID assigned by OBJECTIVE DEVELOPMENT. AVR microcontrollers don't +meet the electrical specifications required by the USB specification and +the USB Implementers Forum certifies only members who bought a Vendor ID of +their own. + + +3 LICENSE RESTRICTIONS + +3.1 Number of Units. Only one of the following three definitions is +applicable. Which one is determined by the amount you pay to OBJECTIVE +DEVELOPMENT, see section 4 ("Payment") below. + +Hobby License: You may use V-USB according to section 2 above in no more +than 5 hardware units. These units must not be sold for profit. + +Entry Level License: You may use V-USB according to section 2 above in no +more than 150 hardware units. + +Professional License: You may use V-USB according to section 2 above in +any number of hardware units, except for large scale production ("unlimited +fair use"). Quantities below 10,000 units are not considered large scale +production. If your reach quantities which are obviously large scale +production, you must pay a license fee of 0.10 EUR per unit for all units +above 10,000. + +3.2 Rental. You may not rent, lease, or lend V-USB or otherwise encumber +any copy of V-USB, or any of the rights granted herein. + +3.3 Transfer. You may not transfer your rights under this Agreement to +another party without OBJECTIVE DEVELOPMENT's prior written consent. If +such consent is obtained, you may permanently transfer this License to +another party. The recipient of such transfer must agree to all terms and +conditions of this Agreement. + +3.4 Reservation of Rights. OBJECTIVE DEVELOPMENT retains all rights not +expressly granted. + +3.5 Non-Exclusive Rights. Your license rights under this Agreement are +non-exclusive. + +3.6 Third Party Rights. This Agreement cannot grant you rights controlled +by third parties. In particular, you are not allowed to use the USB logo or +other trademarks owned by the USB Implementers Forum, Inc. without their +consent. Since such consent depends on USB certification, it should be +noted that V-USB will not pass certification because it does not +implement checksum verification and the microcontroller ports do not meet +the electrical specifications. + + +4 PAYMENT + +The payment amount depends on the variation of this agreement (according to +section 3.1) into which you want to enter. Concrete prices are listed on +OBJECTIVE DEVELOPMENT's web site, usually at +http://www.obdev.at/vusb/license.html. You agree to pay the amount listed +there to OBJECTIVE DEVELOPMENT or OBJECTIVE DEVELOPMENT's payment processor +or reseller. + + +5 COPYRIGHT AND OWNERSHIP + +V-USB is protected by copyright laws and international copyright +treaties, as well as other intellectual property laws and treaties. V-USB +is licensed, not sold. + + +6 TERM AND TERMINATION + +6.1 Term. This Agreement shall continue indefinitely. However, OBJECTIVE +DEVELOPMENT may terminate this Agreement and revoke the granted license and +USB-IDs if you fail to comply with any of its terms and conditions. + +6.2 Survival of Terms. All provisions regarding secrecy, confidentiality +and limitation of liability shall survive termination of this agreement. + + +7 DISCLAIMER OF WARRANTY AND LIABILITY + +LIMITED WARRANTY. V-USB IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, OBJECTIVE +DEVELOPMENT AND ITS SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND +NON-INFRINGEMENT, WITH REGARD TO V-USB, AND THE PROVISION OF OR FAILURE +TO PROVIDE SUPPORT SERVICES. THIS LIMITED WARRANTY GIVES YOU SPECIFIC LEGAL +RIGHTS. YOU MAY HAVE OTHERS, WHICH VARY FROM STATE/JURISDICTION TO +STATE/JURISDICTION. + +LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, +IN NO EVENT SHALL OBJECTIVE DEVELOPMENT OR ITS SUPPLIERS BE LIABLE FOR ANY +SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER +(INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, +BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY +LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE V-USB OR THE +PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, EVEN IF OBJECTIVE +DEVELOPMENT HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ANY +CASE, OBJECTIVE DEVELOPMENT'S ENTIRE LIABILITY UNDER ANY PROVISION OF THIS +AGREEMENT SHALL BE LIMITED TO THE AMOUNT ACTUALLY PAID BY YOU FOR V-USB. + + +8 MISCELLANEOUS TERMS + +8.1 Marketing. OBJECTIVE DEVELOPMENT has the right to mention for marketing +purposes that you entered into this agreement. + +8.2 Entire Agreement. This document represents the entire agreement between +OBJECTIVE DEVELOPMENT and you. It may only be modified in writing signed by +an authorized representative of both, OBJECTIVE DEVELOPMENT and you. + +8.3 Severability. In case a provision of these terms and conditions should +be or become partly or entirely invalid, ineffective, or not executable, +the validity of all other provisions shall not be affected. + +8.4 Applicable Law. This agreement is governed by the laws of the Republic +of Austria. + +8.5 Responsible Courts. The responsible courts in Vienna/Austria will have +exclusive jurisdiction regarding all disputes in connection with this +agreement. + diff --git a/firmware/usbdrv/License.txt b/firmware/usbdrv/License.txt new file mode 100644 index 0000000..4460cfb --- /dev/null +++ b/firmware/usbdrv/License.txt @@ -0,0 +1,361 @@ +OBJECTIVE DEVELOPMENT GmbH's V-USB driver software is distributed under the +terms and conditions of the GNU GPL version 2 or the GNU GPL version 3. It is +your choice whether you apply the terms of version 2 or version 3. The full +text of GPLv2 is included below. In addition to the requirements in the GPL, +we STRONGLY ENCOURAGE you to do the following: + +(1) Publish your entire project on a web site and drop us a note with the URL. +Use the form at http://www.obdev.at/vusb/feedback.html for your submission. + +(2) Adhere to minimum publication standards. Please include AT LEAST: + - a circuit diagram in PDF, PNG or GIF format + - full source code for the host software + - a Readme.txt file in ASCII format which describes the purpose of the + project and what can be found in which directories and which files + - a reference to http://www.obdev.at/vusb/ + +(3) If you improve the driver firmware itself, please give us a free license +to your modifications for our commercial license offerings. + + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/firmware/usbdrv/Readme.txt b/firmware/usbdrv/Readme.txt new file mode 100644 index 0000000..970dc66 --- /dev/null +++ b/firmware/usbdrv/Readme.txt @@ -0,0 +1,172 @@ +This is the Readme file to Objective Development's firmware-only USB driver +for Atmel AVR microcontrollers. For more information please visit +http://www.obdev.at/vusb/ + +This directory contains the USB firmware only. Copy it as-is to your own +project and add all .c and .S files to your project (these files are marked +with an asterisk in the list below). Then copy usbconfig-prototype.h as +usbconfig.h to your project and edit it according to your configuration. + + +TECHNICAL DOCUMENTATION +======================= +The technical documentation (API) for the firmware driver is contained in the +file "usbdrv.h". Please read all of it carefully! Configuration options are +documented in "usbconfig-prototype.h". + +The driver consists of the following files: + Readme.txt ............. The file you are currently reading. + Changelog.txt .......... Release notes for all versions of the driver. + usbdrv.h ............... Driver interface definitions and technical docs. +* usbdrv.c ............... High level language part of the driver. Link this + module to your code! +* usbdrvasm.S ............ Assembler part of the driver. This module is mostly + a stub and includes one of the usbdrvasm*.S files + depending on processor clock. Link this module to + your code! + usbdrvasm*.inc ......... Assembler routines for particular clock frequencies. + Included by usbdrvasm.S, don't link it directly! + asmcommon.inc .......... Common assembler routines. Included by + usbdrvasm*.inc, don't link it directly! + usbconfig-prototype.h .. Prototype for your own usbdrv.h file. +* oddebug.c .............. Debug functions. Only used when DEBUG_LEVEL is + defined to a value greater than 0. Link this module + to your code! + oddebug.h .............. Interface definitions of the debug module. + usbportability.h ....... Header with compiler-dependent stuff. + usbdrvasm.asm .......... Compatibility stub for IAR-C-compiler. Use this + module instead of usbdrvasm.S when you assembler + with IAR's tools. + License.txt ............ Open Source license for this driver. + CommercialLicense.txt .. Optional commercial license for this driver. + USB-ID-FAQ.txt ......... General infos about USB Product- and Vendor-IDs. + USB-IDs-for-free.txt ... List and terms of use for free shared PIDs. + +(*) ... These files should be linked to your project. + + +CPU CORE CLOCK FREQUENCY +======================== +We supply assembler modules for clock frequencies of 12 MHz, 12.8 MHz, 15 MHz, +16 MHz, 16.5 MHz 18 MHz and 20 MHz. Other clock rates are not supported. The +actual clock rate must be configured in usbconfig.h. + +12 MHz Clock +This is the traditional clock rate of V-USB because it's the lowest clock +rate where the timing constraints of the USB spec can be met. + +15 MHz Clock +Similar to 12 MHz, but some NOPs inserted. On the other hand, the higher clock +rate allows for some loops which make the resulting code size somewhat smaller +than the 12 MHz version. + +16 MHz Clock +This clock rate has been added for users of the Arduino board and other +ready-made boards which come with a fixed 16 MHz crystal. It's also an option +if you need the slightly higher clock rate for performance reasons. Since +16 MHz is not divisible by the USB low speed bit clock of 1.5 MHz, the code +is somewhat tricky and has to insert a leap cycle every third byte. + +12.8 MHz and 16.5 MHz Clock +The assembler modules for these clock rates differ from the other modules +because they have been built for an RC oscillator with only 1% precision. The +receiver code inserts leap cycles to compensate for clock deviations. 1% is +also the precision which can be achieved by calibrating the internal RC +oscillator of the AVR. Please note that only AVRs with internal 64 MHz PLL +oscillator can reach 16.5 MHz with the RC oscillator. This includes the very +popular ATTiny25, ATTiny45, ATTiny85 series as well as the ATTiny26. Almost +all AVRs can reach 12.8 MHz, although this is outside the specified range. + +See the EasyLogger example at http://www.obdev.at/vusb/easylogger.html for +code which calibrates the RC oscillator based on the USB frame clock. + +18 MHz Clock +This module is closer to the USB specification because it performs an on the +fly CRC check for incoming packets. Packets with invalid checksum are +discarded as required by the spec. If you also implement checks for data +PID toggling on application level (see option USB_CFG_CHECK_DATA_TOGGLING +in usbconfig.h for more info), this ensures data integrity. Due to the CRC +tables and alignment requirements, this code is bigger than modules for other +clock rates. To activate this module, you must define USB_CFG_CHECK_CRC to 1 +and USB_CFG_CLOCK_KHZ to 18000 in usbconfig.h. + +20 MHz Clock +This module is for people who won't do it with less than the maximum. Since +20 MHz is not divisible by the USB low speed bit clock of 1.5 MHz, the code +uses similar tricks as the 16 MHz module to insert leap cycles. + + +USB IDENTIFIERS +=============== +Every USB device needs a vendor- and a product-identifier (VID and PID). VIDs +are obtained from usb.org for a price of 1,500 USD. Once you have a VID, you +can assign PIDs at will. + +Since an entry level cost of 1,500 USD is too high for most small companies +and hobbyists, we provide some VID/PID pairs for free. See the file +USB-IDs-for-free.txt for details. + +Objective Development also has some license offerings which include product +IDs. See http://www.obdev.at/vusb/ for details. + + +DEVELOPMENT SYSTEM +================== +This driver has been developed and optimized for the GNU compiler version 3 +and 4. We recommend that you use the GNU compiler suite because it is freely +available. V-USB has also been ported to the IAR compiler and assembler. It +has been tested with IAR 4.10B/W32 and 4.12A/W32 on an ATmega8 with the +"small" and "tiny" memory model. Not every release is tested with IAR CC and +the driver may therefore fail to compile with IAR. Please note that gcc is +more efficient for usbdrv.c because this module has been deliberately +optimized for gcc. + +Gcc version 3 produces smaller code than version 4 due to new optimizing +capabilities which don't always improve things on 8 bit CPUs. The code size +generated by gcc 4 can be reduced with the compiler options +-fno-move-loop-invariants, -fno-tree-scev-cprop and +-fno-inline-small-functions in addition to -Os. On devices with more than +8k of flash memory, we also recommend the linker option --relax (written as +-Wl,--relax for gcc) to convert absolute calls into relative where possible. + +For more information about optimizing options see: + + http://www.tty1.net/blog/2008-04-29-avr-gcc-optimisations_en.html + +These optimizations are good for gcc 4.x. Version 3.x of gcc does not support +most of these options and produces good code anyway. + + +USING V-USB FOR FREE +==================== +The AVR firmware driver is published under the GNU General Public License +Version 2 (GPL2) and the GNU General Public License Version 3 (GPL3). It is +your choice whether you apply the terms of version 2 or version 3. + +If you decide for the free GPL2 or GPL3, we STRONGLY ENCOURAGE you to do the +following things IN ADDITION to the obligations from the GPL: + +(1) Publish your entire project on a web site and drop us a note with the URL. +Use the form at http://www.obdev.at/vusb/feedback.html for your submission. +If you don't have a web site, you can publish the project in obdev's +documentation wiki at +http://www.obdev.at/goto.php?t=vusb-wiki&p=hosted-projects. + +(2) Adhere to minimum publication standards. Please include AT LEAST: + - a circuit diagram in PDF, PNG or GIF format + - full source code for the host software + - a Readme.txt file in ASCII format which describes the purpose of the + project and what can be found in which directories and which files + - a reference to http://www.obdev.at/vusb/ + +(3) If you improve the driver firmware itself, please give us a free license +to your modifications for our commercial license offerings. + + +COMMERCIAL LICENSES FOR V-USB +============================= +If you don't want to publish your source code under the terms of the GPL, +you can simply pay money for V-USB. As an additional benefit you get +USB PIDs for free, reserved exclusively to you. See the file +"CommercialLicense.txt" for details. + diff --git a/firmware/usbdrv/USB-ID-FAQ.txt b/firmware/usbdrv/USB-ID-FAQ.txt new file mode 100644 index 0000000..d1de8fb --- /dev/null +++ b/firmware/usbdrv/USB-ID-FAQ.txt @@ -0,0 +1,149 @@ +Version 2009-08-22 + +========================== +WHY DO WE NEED THESE IDs? +========================== + +USB is more than a low level protocol for data transport. It also defines a +common set of requests which must be understood by all devices. And as part +of these common requests, the specification defines data structures, the +USB Descriptors, which are used to describe the properties of the device. + +From the perspective of an operating system, it is therefore possible to find +out basic properties of a device (such as e.g. the manufacturer and the name +of the device) without a device-specific driver. This is essential because +the operating system can choose a driver to load based on this information +(Plug-And-Play). + +Among the most important properties in the Device Descriptor are the USB +Vendor- and Product-ID. Both are 16 bit integers. The most simple form of +driver matching is based on these IDs. The driver announces the Vendor- and +Product-IDs of the devices it can handle and the operating system loads the +appropriate driver when the device is connected. + +It is obvious that this technique only works if the pair Vendor- plus +Product-ID is unique: Only devices which require the same driver can have the +same pair of IDs. + + +===================================================== +HOW DOES THE USB STANDARD ENSURE THAT IDs ARE UNIQUE? +===================================================== + +Since it is so important that USB IDs are unique, the USB Implementers Forum, +Inc. (usb.org) needs a way to enforce this legally. It is not forbidden by +law to build a device and assign it any random numbers as IDs. Usb.org +therefore needs an agreement to regulate the use of USB IDs. The agreement +binds only parties who agreed to it, of course. Everybody else is free to use +any numbers for their IDs. + +So how can usb.org ensure that every manufacturer of USB devices enters into +an agreement with them? They do it via trademark licensing. Usb.org has +registered the trademark "USB", all associated logos and related terms. If +you want to put an USB logo on your product or claim that it is USB +compliant, you must license these trademarks from usb.org. And this is where +you enter into an agreement. See the "USB-IF Trademark License Agreement and +Usage Guidelines for the USB-IF Logo" at +http://www.usb.org/developers/logo_license/. + +Licensing the USB trademarks requires that you buy a USB Vendor-ID from +usb.org (one-time fee of ca. 2,000 USD), that you become a member of usb.org +(yearly fee of ca. 4,000 USD) and that you meet all the technical +specifications from the USB spec. + +This means that most hobbyists and small companies will never be able to +become USB compliant, just because membership is so expensive. And you can't +be compliant with a driver based on V-USB anyway, because the AVR's port pins +don't meet the electrical specifications for USB. So, in principle, all +hobbyists and small companies are free to choose any random numbers for their +IDs. They have nothing to lose... + +There is one exception worth noting, though: If you use a sub-component which +implements USB, the vendor of the sub-components may guarantee USB +compliance. This might apply to some or all of FTDI's solutions. + + +======================================================================= +WHY SHOULD YOU OBTAIN USB IDs EVEN IF YOU DON'T LICENSE USB TRADEMARKS? +======================================================================= + +You have learned in the previous section that you are free to choose any +numbers for your IDs anyway. So why not do exactly this? There is still the +technical issue. If you choose IDs which are already in use by somebody else, +operating systems will load the wrong drivers and your device won't work. +Even if you choose IDs which are not currently in use, they may be in use in +the next version of the operating system or even after an automatic update. + +So what you need is a pair of Vendor- and Product-IDs for which you have the +guarantee that no USB compliant product uses them. This implies that no +operating system will ever ship with drivers responsible for these IDs. + + +============================================== +HOW DOES OBJECTIVE DEVELOPMENT HANDLE USB IDs? +============================================== + +Objective Development gives away pairs of USB-IDs with their V-USB licenses. +In order to ensure that these IDs are unique, Objective Development has an +agreement with the company/person who has bought the USB Vendor-ID from +usb.org. This agreement ensures that a range of USB Product-IDs is reserved +for assignment by Objective Development and that the owner of the Vendor-ID +won't give it to anybody else. + +This means that you have to trust three parties to ensure uniqueness of +your IDs: + + - Objective Development, that they don't give the same PID to more than + one person. + - The owner of the Vendor-ID that they don't assign PIDs from the range + assigned to Objective Development to anybody else. + - Usb.org that they don't assign the same Vendor-ID a second time. + + +================================== +WHO IS THE OWNER OF THE VENDOR-ID? +================================== + +Objective Development has obtained ranges of USB Product-IDs under two +Vendor-IDs: Under Vendor-ID 5824 from Wouter van Ooijen (Van Ooijen +Technische Informatica, www.voti.nl) and under Vendor-ID 8352 from Jason +Kotzin (Clay Logic, www.claylogic.com). Both VID owners have received their +Vendor-ID directly from usb.org. + + +========================================================================= +CAN I USE USB-IDs FROM OBJECTIVE DEVELOPMENT WITH OTHER DRIVERS/HARDWARE? +========================================================================= + +The short answer is: Yes. All you get is a guarantee that the IDs are never +assigned to anybody else. What more do you need? + + +============================ +WHAT ABOUT SHARED ID PAIRS? +============================ + +Objective Development has reserved some PID/VID pairs for shared use. You +have no guarantee of uniqueness for them, except that no USB compliant device +uses them. In order to avoid technical problems, we must ensure that all +devices with the same pair of IDs use the same driver on kernel level. For +details, see the file USB-IDs-for-free.txt. + + +====================================================== +I HAVE HEARD THAT SUB-LICENSING OF USB-IDs IS ILLEGAL? +====================================================== + +A 16 bit integer number cannot be protected by copyright laws. It is not +sufficiently complex. And since none of the parties involved entered into the +USB-IF Trademark License Agreement, we are not bound by this agreement. So +there is no reason why it should be illegal to sub-license USB-IDs. + + +============================================= +WHO IS LIABLE IF THERE ARE INCOMPATIBILITIES? +============================================= + +Objective Development disclaims all liabilities which might arise from the +assignment of IDs. If you guarantee product features to your customers +without proper disclaimer, YOU are liable for that. diff --git a/firmware/usbdrv/USB-IDs-for-free.txt b/firmware/usbdrv/USB-IDs-for-free.txt new file mode 100644 index 0000000..2f4d59a --- /dev/null +++ b/firmware/usbdrv/USB-IDs-for-free.txt @@ -0,0 +1,148 @@ +Version 2009-08-22 + +=========================== +FREE USB-IDs FOR SHARED USE +=========================== + +Objective Development has reserved a set of USB Product-IDs for use according +to the guidelines outlined below. For more information about the concept of +USB IDs please see the file USB-ID-FAQ.txt. Objective Development guarantees +that the IDs listed below are not used by any USB compliant devices. + + +==================== +MECHANISM OF SHARING +==================== + +From a technical point of view, two different devices can share the same USB +Vendor- and Product-ID if they require the same driver on operating system +level. We make use of this fact by assigning separate IDs for various device +classes. On application layer, devices must be distinguished by their textual +name or serial number. We offer separate sets of IDs for discrimination by +textual name and for serial number. + +Examples for shared use of USB IDs are included with V-USB in the "examples" +subdirectory. + + +====================================== +IDs FOR DISCRIMINATION BY TEXTUAL NAME +====================================== + +If you use one of the IDs listed below, your device and host-side software +must conform to these rules: + +(1) The USB device MUST provide a textual representation of the manufacturer +and product identification. The manufacturer identification MUST be available +at least in USB language 0x0409 (English/US). + +(2) The textual manufacturer identification MUST contain either an Internet +domain name (e.g. "mycompany.com") registered and owned by you, or an e-mail +address under your control (e.g. "myname@gmx.net"). You can embed the domain +name or e-mail address in any string you like, e.g. "Objective Development +http://www.obdev.at/vusb/". + +(3) You are responsible for retaining ownership of the domain or e-mail +address for as long as any of your products are in use. + +(4) You may choose any string for the textual product identification, as long +as this string is unique within the scope of your textual manufacturer +identification. + +(5) Application side device look-up MUST be based on the textual manufacturer +and product identification in addition to VID/PID matching. The driver +matching MUST be a comparison of the entire strings, NOT a sub-string match. + +(6) For devices which implement a particular USB device class (e.g. HID), the +operating system's default class driver MUST be used. If an operating system +driver for Vendor Class devices is needed, this driver must be libusb or +libusb-win32 (see http://libusb.org/ and +http://libusb-win32.sourceforge.net/). + +Table if IDs for discrimination by textual name: + +PID dec (hex) | VID dec (hex) | Description of use +==============+===============+============================================ +1500 (0x05dc) | 5824 (0x16c0) | For Vendor Class devices with libusb +--------------+---------------+-------------------------------------------- +1503 (0x05df) | 5824 (0x16c0) | For generic HID class devices (which are + | | NOT mice, keyboards or joysticks) +--------------+---------------+-------------------------------------------- +1505 (0x05e1) | 5824 (0x16c0) | For CDC-ACM class devices (modems) +--------------+---------------+-------------------------------------------- +1508 (0x05e4) | 5824 (0x16c0) | For MIDI class devices +--------------+---------------+-------------------------------------------- + +Note that Windows caches the textual product- and vendor-description for +mice, keyboards and joysticks. Name-bsed discrimination is therefore not +recommended for these device classes. + + +======================================= +IDs FOR DISCRIMINATION BY SERIAL NUMBER +======================================= + +If you use one of the IDs listed below, your device and host-side software +must conform to these rules: + +(1) The USB device MUST provide a textual representation of the serial +number. The serial number string MUST be available at least in USB language +0x0409 (English/US). + +(2) The serial number MUST start with either an Internet domain name (e.g. +"mycompany.com") registered and owned by you, or an e-mail address under your +control (e.g. "myname@gmx.net"), both terminated with a colon (":") character. +You MAY append any string you like for further discrimination of your devices. + +(3) You are responsible for retaining ownership of the domain or e-mail +address for as long as any of your products are in use. + +(5) Application side device look-up MUST be based on the serial number string +in addition to VID/PID matching. The matching must start at the first +character of the serial number string and include the colon character +terminating your domain or e-mail address. It MAY stop anywhere after that. + +(6) For devices which implement a particular USB device class (e.g. HID), the +operating system's default class driver MUST be used. If an operating system +driver for Vendor Class devices is needed, this driver must be libusb or +libusb-win32 (see http://libusb.org/ and +http://libusb-win32.sourceforge.net/). + +Table if IDs for discrimination by serial number string: + +PID dec (hex) | VID dec (hex) | Description of use +===============+===============+=========================================== +10200 (0x27d8) | 5824 (0x16c0) | For Vendor Class devices with libusb +---------------+---------------+------------------------------------------- +10201 (0x27d9) | 5824 (0x16c0) | For generic HID class devices (which are + | | NOT mice, keyboards or joysticks) +---------------+---------------+------------------------------------------- +10202 (0x27da) | 5824 (0x16c0) | For USB Mice +---------------+---------------+------------------------------------------- +10203 (0x27db) | 5824 (0x16c0) | For USB Keyboards +---------------+---------------+------------------------------------------- +10204 (0x27db) | 5824 (0x16c0) | For USB Joysticks +---------------+---------------+------------------------------------------- +10205 (0x27dc) | 5824 (0x16c0) | For CDC-ACM class devices (modems) +---------------+---------------+------------------------------------------- +10206 (0x27dd) | 5824 (0x16c0) | For MIDI class devices +---------------+---------------+------------------------------------------- + + +================= +ORIGIN OF USB-IDs +================= + +OBJECTIVE DEVELOPMENT Software GmbH has obtained all VID/PID pairs listed +here from Wouter van Ooijen (see www.voti.nl) for exclusive disposition. +Wouter van Ooijen has obtained the VID from the USB Implementers Forum, Inc. +(see www.usb.org). The VID is registered for the company name "Van Ooijen +Technische Informatica". + + +========== +DISCLAIMER +========== + +OBJECTIVE DEVELOPMENT Software GmbH disclaims all liability for any +problems which are caused by the shared use of these VID/PID pairs. diff --git a/firmware/usbdrv/asmcommon.inc b/firmware/usbdrv/asmcommon.inc new file mode 100644 index 0000000..07d692b --- /dev/null +++ b/firmware/usbdrv/asmcommon.inc @@ -0,0 +1,188 @@ +/* Name: asmcommon.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2007-11-05 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id$ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file contains assembler code which is shared among the USB driver +implementations for different CPU cocks. Since the code must be inserted +in the middle of the module, it's split out into this file and #included. + +Jump destinations called from outside: + sofError: Called when no start sequence was found. + se0: Called when a package has been successfully received. + overflow: Called when receive buffer overflows. + doReturn: Called after sending data. + +Outside jump destinations used by this module: + waitForJ: Called to receive an already arriving packet. + sendAckAndReti: + sendNakAndReti: + sendCntAndReti: + usbSendAndReti: + +The following macros must be defined before this file is included: + .macro POP_STANDARD + .endm + .macro POP_RETI + .endm +*/ + +#define token x1 + +overflow: + ldi x2, 1< 0 + +#warning "Never compile production devices with debugging enabled" + +static void uartPutc(char c) +{ + while(!(ODDBG_USR & (1 << ODDBG_UDRE))); /* wait for data register empty */ + ODDBG_UDR = c; +} + +static uchar hexAscii(uchar h) +{ + h &= 0xf; + if(h >= 10) + h += 'a' - (uchar)10 - '0'; + h += '0'; + return h; +} + +static void printHex(uchar c) +{ + uartPutc(hexAscii(c >> 4)); + uartPutc(hexAscii(c)); +} + +void odDebug(uchar prefix, uchar *data, uchar len) +{ + printHex(prefix); + uartPutc(':'); + while(len--){ + uartPutc(' '); + printHex(*data++); + } + uartPutc('\r'); + uartPutc('\n'); +} + +#endif diff --git a/firmware/usbdrv/oddebug.h b/firmware/usbdrv/oddebug.h new file mode 100644 index 0000000..d61309d --- /dev/null +++ b/firmware/usbdrv/oddebug.h @@ -0,0 +1,123 @@ +/* Name: oddebug.h + * Project: AVR library + * Author: Christian Starkjohann + * Creation Date: 2005-01-16 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: oddebug.h 692 2008-11-07 15:07:40Z cs $ + */ + +#ifndef __oddebug_h_included__ +#define __oddebug_h_included__ + +/* +General Description: +This module implements a function for debug logs on the serial line of the +AVR microcontroller. Debugging can be configured with the define +'DEBUG_LEVEL'. If this macro is not defined or defined to 0, all debugging +calls are no-ops. If it is 1, DBG1 logs will appear, but not DBG2. If it is +2, DBG1 and DBG2 logs will be printed. + +A debug log consists of a label ('prefix') to indicate which debug log created +the output and a memory block to dump in hex ('data' and 'len'). +*/ + + +#ifndef F_CPU +# define F_CPU 12000000 /* 12 MHz */ +#endif + +/* make sure we have the UART defines: */ +#include "usbportability.h" + +#ifndef uchar +# define uchar unsigned char +#endif + +#if DEBUG_LEVEL > 0 && !(defined TXEN || defined TXEN0) /* no UART in device */ +# warning "Debugging disabled because device has no UART" +# undef DEBUG_LEVEL +#endif + +#ifndef DEBUG_LEVEL +# define DEBUG_LEVEL 0 +#endif + +/* ------------------------------------------------------------------------- */ + +#if DEBUG_LEVEL > 0 +# define DBG1(prefix, data, len) odDebug(prefix, data, len) +#else +# define DBG1(prefix, data, len) +#endif + +#if DEBUG_LEVEL > 1 +# define DBG2(prefix, data, len) odDebug(prefix, data, len) +#else +# define DBG2(prefix, data, len) +#endif + +/* ------------------------------------------------------------------------- */ + +#if DEBUG_LEVEL > 0 +extern void odDebug(uchar prefix, uchar *data, uchar len); + +/* Try to find our control registers; ATMEL likes to rename these */ + +#if defined UBRR +# define ODDBG_UBRR UBRR +#elif defined UBRRL +# define ODDBG_UBRR UBRRL +#elif defined UBRR0 +# define ODDBG_UBRR UBRR0 +#elif defined UBRR0L +# define ODDBG_UBRR UBRR0L +#endif + +#if defined UCR +# define ODDBG_UCR UCR +#elif defined UCSRB +# define ODDBG_UCR UCSRB +#elif defined UCSR0B +# define ODDBG_UCR UCSR0B +#endif + +#if defined TXEN +# define ODDBG_TXEN TXEN +#else +# define ODDBG_TXEN TXEN0 +#endif + +#if defined USR +# define ODDBG_USR USR +#elif defined UCSRA +# define ODDBG_USR UCSRA +#elif defined UCSR0A +# define ODDBG_USR UCSR0A +#endif + +#if defined UDRE +# define ODDBG_UDRE UDRE +#else +# define ODDBG_UDRE UDRE0 +#endif + +#if defined UDR +# define ODDBG_UDR UDR +#elif defined UDR0 +# define ODDBG_UDR UDR0 +#endif + +static inline void odDebugInit(void) +{ + ODDBG_UCR |= (1<len & 0x10){ /* packet buffer was empty */ + txStatus->buffer[0] ^= USBPID_DATA0 ^ USBPID_DATA1; /* toggle token */ + }else{ + txStatus->len = USBPID_NAK; /* avoid sending outdated (overwritten) interrupt data */ + } + p = txStatus->buffer + 1; + i = len; + do{ /* if len == 0, we still copy 1 byte, but that's no problem */ + *p++ = *data++; + }while(--i > 0); /* loop control at the end is 2 bytes shorter than at beginning */ + usbCrc16Append(&txStatus->buffer[1], len); + txStatus->len = len + 4; /* len must be given including sync byte */ + DBG2(0x21 + (((int)txStatus >> 3) & 3), txStatus->buffer, len + 3); +} + +USB_PUBLIC void usbSetInterrupt(uchar *data, uchar len) +{ + usbGenericSetInterrupt(data, len, &usbTxStatus1); +} +#endif + +#if USB_CFG_HAVE_INTRIN_ENDPOINT3 +USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len) +{ + usbGenericSetInterrupt(data, len, &usbTxStatus3); +} +#endif +#endif /* USB_CFG_SUPPRESS_INTR_CODE */ + +/* ------------------ utilities for code following below ------------------- */ + +/* Use defines for the switch statement so that we can choose between an + * if()else if() and a switch/case based implementation. switch() is more + * efficient for a LARGE set of sequential choices, if() is better in all other + * cases. + */ +#if USB_CFG_USE_SWITCH_STATEMENT +# define SWITCH_START(cmd) switch(cmd){{ +# define SWITCH_CASE(value) }break; case (value):{ +# define SWITCH_CASE2(v1,v2) }break; case (v1): case(v2):{ +# define SWITCH_CASE3(v1,v2,v3) }break; case (v1): case(v2): case(v3):{ +# define SWITCH_DEFAULT }break; default:{ +# define SWITCH_END }} +#else +# define SWITCH_START(cmd) {uchar _cmd = cmd; if(0){ +# define SWITCH_CASE(value) }else if(_cmd == (value)){ +# define SWITCH_CASE2(v1,v2) }else if(_cmd == (v1) || _cmd == (v2)){ +# define SWITCH_CASE3(v1,v2,v3) }else if(_cmd == (v1) || _cmd == (v2) || (_cmd == v3)){ +# define SWITCH_DEFAULT }else{ +# define SWITCH_END }} +#endif + +#ifndef USB_RX_USER_HOOK +#define USB_RX_USER_HOOK(data, len) +#endif +#ifndef USB_SET_ADDRESS_HOOK +#define USB_SET_ADDRESS_HOOK() +#endif + +/* ------------------------------------------------------------------------- */ + +/* We use if() instead of #if in the macro below because #if can't be used + * in macros and the compiler optimizes constant conditions anyway. + * This may cause problems with undefined symbols if compiled without + * optimizing! + */ +#define GET_DESCRIPTOR(cfgProp, staticName) \ + if(cfgProp){ \ + if((cfgProp) & USB_PROP_IS_RAM) \ + flags = 0; \ + if((cfgProp) & USB_PROP_IS_DYNAMIC){ \ + len = usbFunctionDescriptor(rq); \ + }else{ \ + len = USB_PROP_LENGTH(cfgProp); \ + usbMsgPtr = (uchar *)(staticName); \ + } \ + } + +/* usbDriverDescriptor() is similar to usbFunctionDescriptor(), but used + * internally for all types of descriptors. + */ +static inline usbMsgLen_t usbDriverDescriptor(usbRequest_t *rq) +{ +usbMsgLen_t len = 0; +uchar flags = USB_FLG_MSGPTR_IS_ROM; + + SWITCH_START(rq->wValue.bytes[1]) + SWITCH_CASE(USBDESCR_DEVICE) /* 1 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_DEVICE, usbDescriptorDevice) + SWITCH_CASE(USBDESCR_CONFIG) /* 2 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_CONFIGURATION, usbDescriptorConfiguration) + SWITCH_CASE(USBDESCR_STRING) /* 3 */ +#if USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC + if(USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_RAM) + flags = 0; + len = usbFunctionDescriptor(rq); +#else /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */ + SWITCH_START(rq->wValue.bytes[0]) + SWITCH_CASE(0) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_0, usbDescriptorString0) + SWITCH_CASE(1) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_VENDOR, usbDescriptorStringVendor) + SWITCH_CASE(2) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_PRODUCT, usbDescriptorStringDevice) + SWITCH_CASE(3) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER, usbDescriptorStringSerialNumber) + SWITCH_DEFAULT + if(USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC){ + len = usbFunctionDescriptor(rq); + } + SWITCH_END +#endif /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */ +#if USB_CFG_DESCR_PROPS_HID_REPORT /* only support HID descriptors if enabled */ + SWITCH_CASE(USBDESCR_HID) /* 0x21 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID, usbDescriptorConfiguration + 18) + SWITCH_CASE(USBDESCR_HID_REPORT)/* 0x22 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID_REPORT, usbDescriptorHidReport) +#endif + SWITCH_DEFAULT + if(USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC){ + len = usbFunctionDescriptor(rq); + } + SWITCH_END + usbMsgFlags = flags; + return len; +} + +/* ------------------------------------------------------------------------- */ + +/* usbDriverSetup() is similar to usbFunctionSetup(), but it's used for + * standard requests instead of class and custom requests. + */ +static inline usbMsgLen_t usbDriverSetup(usbRequest_t *rq) +{ +uchar len = 0, *dataPtr = usbTxBuf + 9; /* there are 2 bytes free space at the end of the buffer */ +uchar value = rq->wValue.bytes[0]; +#if USB_CFG_IMPLEMENT_HALT +uchar index = rq->wIndex.bytes[0]; +#endif + + dataPtr[0] = 0; /* default reply common to USBRQ_GET_STATUS and USBRQ_GET_INTERFACE */ + SWITCH_START(rq->bRequest) + SWITCH_CASE(USBRQ_GET_STATUS) /* 0 */ + uchar recipient = rq->bmRequestType & USBRQ_RCPT_MASK; /* assign arith ops to variables to enforce byte size */ + if(USB_CFG_IS_SELF_POWERED && recipient == USBRQ_RCPT_DEVICE) + dataPtr[0] = USB_CFG_IS_SELF_POWERED; +#if USB_CFG_IMPLEMENT_HALT + if(recipient == USBRQ_RCPT_ENDPOINT && index == 0x81) /* request status for endpoint 1 */ + dataPtr[0] = usbTxLen1 == USBPID_STALL; +#endif + dataPtr[1] = 0; + len = 2; +#if USB_CFG_IMPLEMENT_HALT + SWITCH_CASE2(USBRQ_CLEAR_FEATURE, USBRQ_SET_FEATURE) /* 1, 3 */ + if(value == 0 && index == 0x81){ /* feature 0 == HALT for endpoint == 1 */ + usbTxLen1 = rq->bRequest == USBRQ_CLEAR_FEATURE ? USBPID_NAK : USBPID_STALL; + usbResetDataToggling(); + } +#endif + SWITCH_CASE(USBRQ_SET_ADDRESS) /* 5 */ + usbNewDeviceAddr = value; + USB_SET_ADDRESS_HOOK(); + SWITCH_CASE(USBRQ_GET_DESCRIPTOR) /* 6 */ + len = usbDriverDescriptor(rq); + goto skipMsgPtrAssignment; + SWITCH_CASE(USBRQ_GET_CONFIGURATION) /* 8 */ + dataPtr = &usbConfiguration; /* send current configuration value */ + len = 1; + SWITCH_CASE(USBRQ_SET_CONFIGURATION) /* 9 */ + usbConfiguration = value; + usbResetStall(); + SWITCH_CASE(USBRQ_GET_INTERFACE) /* 10 */ + len = 1; +#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE + SWITCH_CASE(USBRQ_SET_INTERFACE) /* 11 */ + usbResetDataToggling(); + usbResetStall(); +#endif + SWITCH_DEFAULT /* 7=SET_DESCRIPTOR, 12=SYNC_FRAME */ + /* Should we add an optional hook here? */ + SWITCH_END + usbMsgPtr = dataPtr; +skipMsgPtrAssignment: + return len; +} + +/* ------------------------------------------------------------------------- */ + +/* usbProcessRx() is called for every message received by the interrupt + * routine. It distinguishes between SETUP and DATA packets and processes + * them accordingly. + */ +static inline void usbProcessRx(uchar *data, uchar len) +{ +usbRequest_t *rq = (void *)data; + +/* usbRxToken can be: + * 0x2d 00101101 (USBPID_SETUP for setup data) + * 0xe1 11100001 (USBPID_OUT: data phase of setup transfer) + * 0...0x0f for OUT on endpoint X + */ + DBG2(0x10 + (usbRxToken & 0xf), data, len + 2); /* SETUP=1d, SETUP-DATA=11, OUTx=1x */ + USB_RX_USER_HOOK(data, len) +#if USB_CFG_IMPLEMENT_FN_WRITEOUT + if(usbRxToken < 0x10){ /* OUT to endpoint != 0: endpoint number in usbRxToken */ + usbFunctionWriteOut(data, len); + return; + } +#endif + if(usbRxToken == (uchar)USBPID_SETUP){ + if(len != 8) /* Setup size must be always 8 bytes. Ignore otherwise. */ + return; + usbMsgLen_t replyLen; + usbTxBuf[0] = USBPID_DATA0; /* initialize data toggling */ + usbTxLen = USBPID_NAK; /* abort pending transmit */ + usbMsgFlags = 0; + uchar type = rq->bmRequestType & USBRQ_TYPE_MASK; + if(type != USBRQ_TYPE_STANDARD){ /* standard requests are handled by driver */ + replyLen = usbFunctionSetup(data); + }else{ + replyLen = usbDriverSetup(rq); + } +#if USB_CFG_IMPLEMENT_FN_READ || USB_CFG_IMPLEMENT_FN_WRITE + if(replyLen == USB_NO_MSG){ /* use user-supplied read/write function */ + /* do some conditioning on replyLen, but on IN transfers only */ + if((rq->bmRequestType & USBRQ_DIR_MASK) != USBRQ_DIR_HOST_TO_DEVICE){ + if(sizeof(replyLen) < sizeof(rq->wLength.word)){ /* help compiler with optimizing */ + replyLen = rq->wLength.bytes[0]; + }else{ + replyLen = rq->wLength.word; + } + } + usbMsgFlags = USB_FLG_USE_USER_RW; + }else /* The 'else' prevents that we limit a replyLen of USB_NO_MSG to the maximum transfer len. */ +#endif + if(sizeof(replyLen) < sizeof(rq->wLength.word)){ /* help compiler with optimizing */ + if(!rq->wLength.bytes[1] && replyLen > rq->wLength.bytes[0]) /* limit length to max */ + replyLen = rq->wLength.bytes[0]; + }else{ + if(replyLen > rq->wLength.word) /* limit length to max */ + replyLen = rq->wLength.word; + } + usbMsgLen = replyLen; + }else{ /* usbRxToken must be USBPID_OUT, which means data phase of setup (control-out) */ +#if USB_CFG_IMPLEMENT_FN_WRITE + if(usbMsgFlags & USB_FLG_USE_USER_RW){ + uchar rval = usbFunctionWrite(data, len); + if(rval == 0xff){ /* an error occurred */ + usbTxLen = USBPID_STALL; + }else if(rval != 0){ /* This was the final package */ + usbMsgLen = 0; /* answer with a zero-sized data packet */ + } + } +#endif + } +} + +/* ------------------------------------------------------------------------- */ + +/* This function is similar to usbFunctionRead(), but it's also called for + * data handled automatically by the driver (e.g. descriptor reads). + */ +static uchar usbDeviceRead(uchar *data, uchar len) +{ + if(len > 0){ /* don't bother app with 0 sized reads */ +#if USB_CFG_IMPLEMENT_FN_READ + if(usbMsgFlags & USB_FLG_USE_USER_RW){ + len = usbFunctionRead(data, len); + }else +#endif + { + uchar i = len, *r = usbMsgPtr; + if(usbMsgFlags & USB_FLG_MSGPTR_IS_ROM){ /* ROM data */ + do{ + uchar c = USB_READ_FLASH(r); /* assign to char size variable to enforce byte ops */ + *data++ = c; + r++; + }while(--i); + }else{ /* RAM data */ + do{ + *data++ = *r++; + }while(--i); + } + usbMsgPtr = r; + } + } + return len; +} + +/* ------------------------------------------------------------------------- */ + +/* usbBuildTxBlock() is called when we have data to transmit and the + * interrupt routine's transmit buffer is empty. + */ +static inline void usbBuildTxBlock(void) +{ +usbMsgLen_t wantLen; +uchar len; + + wantLen = usbMsgLen; + if(wantLen > 8) + wantLen = 8; + usbMsgLen -= wantLen; + usbTxBuf[0] ^= USBPID_DATA0 ^ USBPID_DATA1; /* DATA toggling */ + len = usbDeviceRead(usbTxBuf + 1, wantLen); + if(len <= 8){ /* valid data packet */ + usbCrc16Append(&usbTxBuf[1], len); + len += 4; /* length including sync byte */ + if(len < 12) /* a partial package identifies end of message */ + usbMsgLen = USB_NO_MSG; + }else{ + len = USBPID_STALL; /* stall the endpoint */ + usbMsgLen = USB_NO_MSG; + } + usbTxLen = len; + DBG2(0x20, usbTxBuf, len-1); +} + +/* ------------------------------------------------------------------------- */ + +static inline void usbHandleResetHook(uchar notResetState) +{ +#ifdef USB_RESET_HOOK +static uchar wasReset; +uchar isReset = !notResetState; + + if(wasReset != isReset){ + USB_RESET_HOOK(isReset); + wasReset = isReset; + } +#endif +} + +/* ------------------------------------------------------------------------- */ + +USB_PUBLIC void usbPoll(void) +{ +schar len; +uchar i; + + len = usbRxLen - 3; + if(len >= 0){ +/* We could check CRC16 here -- but ACK has already been sent anyway. If you + * need data integrity checks with this driver, check the CRC in your app + * code and report errors back to the host. Since the ACK was already sent, + * retries must be handled on application level. + * unsigned crc = usbCrc16(buffer + 1, usbRxLen - 3); + */ + usbProcessRx(usbRxBuf + USB_BUFSIZE + 1 - usbInputBufOffset, len); +#if USB_CFG_HAVE_FLOWCONTROL + if(usbRxLen > 0) /* only mark as available if not inactivated */ + usbRxLen = 0; +#else + usbRxLen = 0; /* mark rx buffer as available */ +#endif + } + if(usbTxLen & 0x10){ /* transmit system idle */ + if(usbMsgLen != USB_NO_MSG){ /* transmit data pending? */ + usbBuildTxBlock(); + } + } + for(i = 20; i > 0; i--){ + uchar usbLineStatus = USBIN & USBMASK; + if(usbLineStatus != 0) /* SE0 has ended */ + goto isNotReset; + } + /* RESET condition, called multiple times during reset */ + usbNewDeviceAddr = 0; + usbDeviceAddr = 0; + usbResetStall(); + DBG1(0xff, 0, 0); +isNotReset: + usbHandleResetHook(i); +} + +/* ------------------------------------------------------------------------- */ + +USB_PUBLIC void usbInit(void) +{ +#if USB_INTR_CFG_SET != 0 + USB_INTR_CFG |= USB_INTR_CFG_SET; +#endif +#if USB_INTR_CFG_CLR != 0 + USB_INTR_CFG &= ~(USB_INTR_CFG_CLR); +#endif + USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT); + usbResetDataToggling(); +#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE + usbTxLen1 = USBPID_NAK; +#if USB_CFG_HAVE_INTRIN_ENDPOINT3 + usbTxLen3 = USBPID_NAK; +#endif +#endif +} + +/* ------------------------------------------------------------------------- */ diff --git a/firmware/usbdrv/usbdrv.h b/firmware/usbdrv/usbdrv.h new file mode 100644 index 0000000..3a78f30 --- /dev/null +++ b/firmware/usbdrv/usbdrv.h @@ -0,0 +1,735 @@ +/* Name: usbdrv.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2004-12-29 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbdrv.h 793 2010-07-15 15:58:11Z cs $ + */ + +#ifndef __usbdrv_h_included__ +#define __usbdrv_h_included__ +#include "usbconfig.h" +#include "usbportability.h" + +/* +Hardware Prerequisites: +======================= +USB lines D+ and D- MUST be wired to the same I/O port. We recommend that D+ +triggers the interrupt (best achieved by using INT0 for D+), but it is also +possible to trigger the interrupt from D-. If D- is used, interrupts are also +triggered by SOF packets. D- requires a pull-up of 1.5k to +3.5V (and the +device must be powered at 3.5V) to identify as low-speed USB device. A +pull-down or pull-up of 1M SHOULD be connected from D+ to +3.5V to prevent +interference when no USB master is connected. If you use Zener diodes to limit +the voltage on D+ and D-, you MUST use a pull-down resistor, not a pull-up. +We use D+ as interrupt source and not D- because it does not trigger on +keep-alive and RESET states. If you want to count keep-alive events with +USB_COUNT_SOF, you MUST use D- as an interrupt source. + +As a compile time option, the 1.5k pull-up resistor on D- can be made +switchable to allow the device to disconnect at will. See the definition of +usbDeviceConnect() and usbDeviceDisconnect() further down in this file. + +Please adapt the values in usbconfig.h according to your hardware! + +The device MUST be clocked at exactly 12 MHz, 15 MHz, 16 MHz or 20 MHz +or at 12.8 MHz resp. 16.5 MHz +/- 1%. See usbconfig-prototype.h for details. + + +Limitations: +============ +Robustness with respect to communication errors: +The driver assumes error-free communication. It DOES check for errors in +the PID, but does NOT check bit stuffing errors, SE0 in middle of a byte, +token CRC (5 bit) and data CRC (16 bit). CRC checks can not be performed due +to timing constraints: We must start sending a reply within 7 bit times. +Bit stuffing and misplaced SE0 would have to be checked in real-time, but CPU +performance does not permit that. The driver does not check Data0/Data1 +toggling, but application software can implement the check. + +Input characteristics: +Since no differential receiver circuit is used, electrical interference +robustness may suffer. The driver samples only one of the data lines with +an ordinary I/O pin's input characteristics. However, since this is only a +low speed USB implementation and the specification allows for 8 times the +bit rate over the same hardware, we should be on the safe side. Even the spec +requires detection of asymmetric states at high bit rate for SE0 detection. + +Number of endpoints: +The driver supports the following endpoints: + +- Endpoint 0, the default control endpoint. +- Any number of interrupt- or bulk-out endpoints. The data is sent to + usbFunctionWriteOut() and USB_CFG_IMPLEMENT_FN_WRITEOUT must be defined + to 1 to activate this feature. The endpoint number can be found in the + global variable 'usbRxToken'. +- One default interrupt- or bulk-in endpoint. This endpoint is used for + interrupt- or bulk-in transfers which are not handled by any other endpoint. + You must define USB_CFG_HAVE_INTRIN_ENDPOINT in order to activate this + feature and call usbSetInterrupt() to send interrupt/bulk data. +- One additional interrupt- or bulk-in endpoint. This was endpoint 3 in + previous versions of this driver but can now be configured to any endpoint + number. You must define USB_CFG_HAVE_INTRIN_ENDPOINT3 in order to activate + this feature and call usbSetInterrupt3() to send interrupt/bulk data. The + endpoint number can be set with USB_CFG_EP3_NUMBER. + +Please note that the USB standard forbids bulk endpoints for low speed devices! +Most operating systems allow them anyway, but the AVR will spend 90% of the CPU +time in the USB interrupt polling for bulk data. + +Maximum data payload: +Data payload of control in and out transfers may be up to 254 bytes. In order +to accept payload data of out transfers, you need to implement +'usbFunctionWrite()'. + +USB Suspend Mode supply current: +The USB standard limits power consumption to 500uA when the bus is in suspend +mode. This is not a problem for self-powered devices since they don't need +bus power anyway. Bus-powered devices can achieve this only by putting the +CPU in sleep mode. The driver does not implement suspend handling by itself. +However, the application may implement activity monitoring and wakeup from +sleep. The host sends regular SE0 states on the bus to keep it active. These +SE0 states can be detected by using D- as the interrupt source. Define +USB_COUNT_SOF to 1 and use the global variable usbSofCount to check for bus +activity. + +Operation without an USB master: +The driver behaves neutral without connection to an USB master if D- reads +as 1. To avoid spurious interrupts, we recommend a high impedance (e.g. 1M) +pull-down or pull-up resistor on D+ (interrupt). If Zener diodes are used, +use a pull-down. If D- becomes statically 0, the driver may block in the +interrupt routine. + +Interrupt latency: +The application must ensure that the USB interrupt is not disabled for more +than 25 cycles (this is for 12 MHz, faster clocks allow longer latency). +This implies that all interrupt routines must either have the "ISR_NOBLOCK" +attribute set (see "avr/interrupt.h") or be written in assembler with "sei" +as the first instruction. + +Maximum interrupt duration / CPU cycle consumption: +The driver handles all USB communication during the interrupt service +routine. The routine will not return before an entire USB message is received +and the reply is sent. This may be up to ca. 1200 cycles @ 12 MHz (= 100us) if +the host conforms to the standard. The driver will consume CPU cycles for all +USB messages, even if they address another (low-speed) device on the same bus. + +*/ + +/* ------------------------------------------------------------------------- */ +/* --------------------------- Module Interface ---------------------------- */ +/* ------------------------------------------------------------------------- */ + +#define USBDRV_VERSION 20100715 +/* This define uniquely identifies a driver version. It is a decimal number + * constructed from the driver's release date in the form YYYYMMDD. If the + * driver's behavior or interface changes, you can use this constant to + * distinguish versions. If it is not defined, the driver's release date is + * older than 2006-01-25. + */ + + +#ifndef USB_PUBLIC +#define USB_PUBLIC +#endif +/* USB_PUBLIC is used as declaration attribute for all functions exported by + * the USB driver. The default is no attribute (see above). You may define it + * to static either in usbconfig.h or from the command line if you include + * usbdrv.c instead of linking against it. Including the C module of the driver + * directly in your code saves a couple of bytes in flash memory. + */ + +#ifndef __ASSEMBLER__ +#ifndef uchar +#define uchar unsigned char +#endif +#ifndef schar +#define schar signed char +#endif +/* shortcuts for well defined 8 bit integer types */ + +#if USB_CFG_LONG_TRANSFERS /* if more than 254 bytes transfer size required */ +# define usbMsgLen_t unsigned +#else +# define usbMsgLen_t uchar +#endif +/* usbMsgLen_t is the data type used for transfer lengths. By default, it is + * defined to uchar, allowing a maximum of 254 bytes (255 is reserved for + * USB_NO_MSG below). If the usbconfig.h defines USB_CFG_LONG_TRANSFERS to 1, + * a 16 bit data type is used, allowing up to 16384 bytes (the rest is used + * for flags in the descriptor configuration). + */ +#define USB_NO_MSG ((usbMsgLen_t)-1) /* constant meaning "no message" */ + +struct usbRequest; /* forward declaration */ + +USB_PUBLIC void usbInit(void); +/* This function must be called before interrupts are enabled and the main + * loop is entered. We exepct that the PORT and DDR bits for D+ and D- have + * not been changed from their default status (which is 0). If you have changed + * them, set both back to 0 (configure them as input with no internal pull-up). + */ +USB_PUBLIC void usbPoll(void); +/* This function must be called at regular intervals from the main loop. + * Maximum delay between calls is somewhat less than 50ms (USB timeout for + * accepting a Setup message). Otherwise the device will not be recognized. + * Please note that debug outputs through the UART take ~ 0.5ms per byte + * at 19200 bps. + */ +extern uchar *usbMsgPtr; +/* This variable may be used to pass transmit data to the driver from the + * implementation of usbFunctionWrite(). It is also used internally by the + * driver for standard control requests. + */ +USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]); +/* This function is called when the driver receives a SETUP transaction from + * the host which is not answered by the driver itself (in practice: class and + * vendor requests). All control transfers start with a SETUP transaction where + * the host communicates the parameters of the following (optional) data + * transfer. The SETUP data is available in the 'data' parameter which can + * (and should) be casted to 'usbRequest_t *' for a more user-friendly access + * to parameters. + * + * If the SETUP indicates a control-in transfer, you should provide the + * requested data to the driver. There are two ways to transfer this data: + * (1) Set the global pointer 'usbMsgPtr' to the base of the static RAM data + * block and return the length of the data in 'usbFunctionSetup()'. The driver + * will handle the rest. Or (2) return USB_NO_MSG in 'usbFunctionSetup()'. The + * driver will then call 'usbFunctionRead()' when data is needed. See the + * documentation for usbFunctionRead() for details. + * + * If the SETUP indicates a control-out transfer, the only way to receive the + * data from the host is through the 'usbFunctionWrite()' call. If you + * implement this function, you must return USB_NO_MSG in 'usbFunctionSetup()' + * to indicate that 'usbFunctionWrite()' should be used. See the documentation + * of this function for more information. If you just want to ignore the data + * sent by the host, return 0 in 'usbFunctionSetup()'. + * + * Note that calls to the functions usbFunctionRead() and usbFunctionWrite() + * are only done if enabled by the configuration in usbconfig.h. + */ +USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq); +/* You need to implement this function ONLY if you provide USB descriptors at + * runtime (which is an expert feature). It is very similar to + * usbFunctionSetup() above, but it is called only to request USB descriptor + * data. See the documentation of usbFunctionSetup() above for more info. + */ +#if USB_CFG_HAVE_INTRIN_ENDPOINT +USB_PUBLIC void usbSetInterrupt(uchar *data, uchar len); +/* This function sets the message which will be sent during the next interrupt + * IN transfer. The message is copied to an internal buffer and must not exceed + * a length of 8 bytes. The message may be 0 bytes long just to indicate the + * interrupt status to the host. + * If you need to transfer more bytes, use a control read after the interrupt. + */ +#define usbInterruptIsReady() (usbTxLen1 & 0x10) +/* This macro indicates whether the last interrupt message has already been + * sent. If you set a new interrupt message before the old was sent, the + * message already buffered will be lost. + */ +#if USB_CFG_HAVE_INTRIN_ENDPOINT3 +USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len); +#define usbInterruptIsReady3() (usbTxLen3 & 0x10) +/* Same as above for endpoint 3 */ +#endif +#endif /* USB_CFG_HAVE_INTRIN_ENDPOINT */ +#if USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH /* simplified interface for backward compatibility */ +#define usbHidReportDescriptor usbDescriptorHidReport +/* should be declared as: PROGMEM char usbHidReportDescriptor[]; */ +/* If you implement an HID device, you need to provide a report descriptor. + * The HID report descriptor syntax is a bit complex. If you understand how + * report descriptors are constructed, we recommend that you use the HID + * Descriptor Tool from usb.org, see http://www.usb.org/developers/hidpage/. + * Otherwise you should probably start with a working example. + */ +#endif /* USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH */ +#if USB_CFG_IMPLEMENT_FN_WRITE +USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len); +/* This function is called by the driver to provide a control transfer's + * payload data (control-out). It is called in chunks of up to 8 bytes. The + * total count provided in the current control transfer can be obtained from + * the 'length' property in the setup data. If an error occurred during + * processing, return 0xff (== -1). The driver will answer the entire transfer + * with a STALL token in this case. If you have received the entire payload + * successfully, return 1. If you expect more data, return 0. If you don't + * know whether the host will send more data (you should know, the total is + * provided in the usbFunctionSetup() call!), return 1. + * NOTE: If you return 0xff for STALL, 'usbFunctionWrite()' may still be called + * for the remaining data. You must continue to return 0xff for STALL in these + * calls. + * In order to get usbFunctionWrite() called, define USB_CFG_IMPLEMENT_FN_WRITE + * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. + */ +#endif /* USB_CFG_IMPLEMENT_FN_WRITE */ +#if USB_CFG_IMPLEMENT_FN_READ +USB_PUBLIC uchar usbFunctionRead(uchar *data, uchar len); +/* This function is called by the driver to ask the application for a control + * transfer's payload data (control-in). It is called in chunks of up to 8 + * bytes each. You should copy the data to the location given by 'data' and + * return the actual number of bytes copied. If you return less than requested, + * the control-in transfer is terminated. If you return 0xff, the driver aborts + * the transfer with a STALL token. + * In order to get usbFunctionRead() called, define USB_CFG_IMPLEMENT_FN_READ + * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. + */ +#endif /* USB_CFG_IMPLEMENT_FN_READ */ + +extern uchar usbRxToken; /* may be used in usbFunctionWriteOut() below */ +#if USB_CFG_IMPLEMENT_FN_WRITEOUT +USB_PUBLIC void usbFunctionWriteOut(uchar *data, uchar len); +/* This function is called by the driver when data is received on an interrupt- + * or bulk-out endpoint. The endpoint number can be found in the global + * variable usbRxToken. You must define USB_CFG_IMPLEMENT_FN_WRITEOUT to 1 in + * usbconfig.h to get this function called. + */ +#endif /* USB_CFG_IMPLEMENT_FN_WRITEOUT */ +#ifdef USB_CFG_PULLUP_IOPORTNAME +#define usbDeviceConnect() ((USB_PULLUP_DDR |= (1<device, 1=device->host + * t ..... type: 0=standard, 1=class, 2=vendor, 3=reserved + * r ..... recipient: 0=device, 1=interface, 2=endpoint, 3=other + */ + +/* USB setup recipient values */ +#define USBRQ_RCPT_MASK 0x1f +#define USBRQ_RCPT_DEVICE 0 +#define USBRQ_RCPT_INTERFACE 1 +#define USBRQ_RCPT_ENDPOINT 2 + +/* USB request type values */ +#define USBRQ_TYPE_MASK 0x60 +#define USBRQ_TYPE_STANDARD (0<<5) +#define USBRQ_TYPE_CLASS (1<<5) +#define USBRQ_TYPE_VENDOR (2<<5) + +/* USB direction values: */ +#define USBRQ_DIR_MASK 0x80 +#define USBRQ_DIR_HOST_TO_DEVICE (0<<7) +#define USBRQ_DIR_DEVICE_TO_HOST (1<<7) + +/* USB Standard Requests */ +#define USBRQ_GET_STATUS 0 +#define USBRQ_CLEAR_FEATURE 1 +#define USBRQ_SET_FEATURE 3 +#define USBRQ_SET_ADDRESS 5 +#define USBRQ_GET_DESCRIPTOR 6 +#define USBRQ_SET_DESCRIPTOR 7 +#define USBRQ_GET_CONFIGURATION 8 +#define USBRQ_SET_CONFIGURATION 9 +#define USBRQ_GET_INTERFACE 10 +#define USBRQ_SET_INTERFACE 11 +#define USBRQ_SYNCH_FRAME 12 + +/* USB descriptor constants */ +#define USBDESCR_DEVICE 1 +#define USBDESCR_CONFIG 2 +#define USBDESCR_STRING 3 +#define USBDESCR_INTERFACE 4 +#define USBDESCR_ENDPOINT 5 +#define USBDESCR_HID 0x21 +#define USBDESCR_HID_REPORT 0x22 +#define USBDESCR_HID_PHYS 0x23 + +//#define USBATTR_BUSPOWER 0x80 // USB 1.1 does not define this value any more +#define USBATTR_SELFPOWER 0x40 +#define USBATTR_REMOTEWAKE 0x20 + +/* USB HID Requests */ +#define USBRQ_HID_GET_REPORT 0x01 +#define USBRQ_HID_GET_IDLE 0x02 +#define USBRQ_HID_GET_PROTOCOL 0x03 +#define USBRQ_HID_SET_REPORT 0x09 +#define USBRQ_HID_SET_IDLE 0x0a +#define USBRQ_HID_SET_PROTOCOL 0x0b + +/* ------------------------------------------------------------------------- */ + +#endif /* __usbdrv_h_included__ */ diff --git a/firmware/usbdrv/usbdrvasm.S b/firmware/usbdrv/usbdrvasm.S new file mode 100644 index 0000000..45fcf18 --- /dev/null +++ b/firmware/usbdrv/usbdrvasm.S @@ -0,0 +1,393 @@ +/* Name: usbdrvasm.S + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2007-06-13 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id: usbdrvasm.S 785 2010-05-30 17:57:07Z cs $ + */ + +/* +General Description: +This module is the assembler part of the USB driver. This file contains +general code (preprocessor acrobatics and CRC computation) and then includes +the file appropriate for the given clock rate. +*/ + +#define __SFR_OFFSET 0 /* used by avr-libc's register definitions */ +#include "usbportability.h" +#include "usbdrv.h" /* for common defs */ + +/* register names */ +#define x1 r16 +#define x2 r17 +#define shift r18 +#define cnt r19 +#define x3 r20 +#define x4 r21 +#define x5 r22 +#define bitcnt x5 +#define phase x4 +#define leap x4 + +/* Some assembler dependent definitions and declarations: */ + +#ifdef __IAR_SYSTEMS_ASM__ + extern usbRxBuf, usbDeviceAddr, usbNewDeviceAddr, usbInputBufOffset + extern usbCurrentTok, usbRxLen, usbRxToken, usbTxLen + extern usbTxBuf, usbTxStatus1, usbTxStatus3 +# if USB_COUNT_SOF + extern usbSofCount +# endif + public usbCrc16 + public usbCrc16Append + + COMMON INTVEC +# ifndef USB_INTR_VECTOR + ORG INT0_vect +# else /* USB_INTR_VECTOR */ + ORG USB_INTR_VECTOR +# undef USB_INTR_VECTOR +# endif /* USB_INTR_VECTOR */ +# define USB_INTR_VECTOR usbInterruptHandler + rjmp USB_INTR_VECTOR + RSEG CODE + +#else /* __IAR_SYSTEMS_ASM__ */ + +# ifndef USB_INTR_VECTOR /* default to hardware interrupt INT0 */ +# ifdef INT0_vect +# define USB_INTR_VECTOR INT0_vect // this is the "new" define for the vector +# else +# define USB_INTR_VECTOR SIG_INTERRUPT0 // this is the "old" vector +# endif +# endif + .text + .global USB_INTR_VECTOR + .type USB_INTR_VECTOR, @function + .global usbCrc16 + .global usbCrc16Append +#endif /* __IAR_SYSTEMS_ASM__ */ + + +#if USB_INTR_PENDING < 0x40 /* This is an I/O address, use in and out */ +# define USB_LOAD_PENDING(reg) in reg, USB_INTR_PENDING +# define USB_STORE_PENDING(reg) out USB_INTR_PENDING, reg +#else /* It's a memory address, use lds and sts */ +# define USB_LOAD_PENDING(reg) lds reg, USB_INTR_PENDING +# define USB_STORE_PENDING(reg) sts USB_INTR_PENDING, reg +#endif + +#define usbTxLen1 usbTxStatus1 +#define usbTxBuf1 (usbTxStatus1 + 1) +#define usbTxLen3 usbTxStatus3 +#define usbTxBuf3 (usbTxStatus3 + 1) + + +;---------------------------------------------------------------------------- +; Utility functions +;---------------------------------------------------------------------------- + +#ifdef __IAR_SYSTEMS_ASM__ +/* Register assignments for usbCrc16 on IAR cc */ +/* Calling conventions on IAR: + * First parameter passed in r16/r17, second in r18/r19 and so on. + * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer) + * Result is passed in r16/r17 + * In case of the "tiny" memory model, pointers are only 8 bit with no + * padding. We therefore pass argument 1 as "16 bit unsigned". + */ +RTMODEL "__rt_version", "3" +/* The line above will generate an error if cc calling conventions change. + * The value "3" above is valid for IAR 4.10B/W32 + */ +# define argLen r18 /* argument 2 */ +# define argPtrL r16 /* argument 1 */ +# define argPtrH r17 /* argument 1 */ + +# define resCrcL r16 /* result */ +# define resCrcH r17 /* result */ + +# define ptrL ZL +# define ptrH ZH +# define ptr Z +# define byte r22 +# define bitCnt r19 +# define polyL r20 +# define polyH r21 +# define scratch r23 + +#else /* __IAR_SYSTEMS_ASM__ */ +/* Register assignments for usbCrc16 on gcc */ +/* Calling conventions on gcc: + * First parameter passed in r24/r25, second in r22/23 and so on. + * Callee must preserve r1-r17, r28/r29 + * Result is passed in r24/r25 + */ +# define argLen r22 /* argument 2 */ +# define argPtrL r24 /* argument 1 */ +# define argPtrH r25 /* argument 1 */ + +# define resCrcL r24 /* result */ +# define resCrcH r25 /* result */ + +# define ptrL XL +# define ptrH XH +# define ptr x +# define byte r18 +# define bitCnt r19 +# define polyL r20 +# define polyH r21 +# define scratch r23 + +#endif + +#if USB_USE_FAST_CRC + +; This implementation is faster, but has bigger code size +; Thanks to Slawomir Fras (BoskiDialer) for this code! +; It implements the following C pseudo-code: +; unsigned table(unsigned char x) +; { +; unsigned value; +; +; value = (unsigned)x << 6; +; value ^= (unsigned)x << 7; +; if(parity(x)) +; value ^= 0xc001; +; return value; +; } +; unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen) +; { +; unsigned crc = 0xffff; +; +; while(argLen--) +; crc = table(lo8(crc) ^ *argPtr++) ^ hi8(crc); +; return ~crc; +; } + +; extern unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen); +; argPtr r24+25 / r16+r17 +; argLen r22 / r18 +; temp variables: +; byte r18 / r22 +; scratch r23 +; resCrc r24+r25 / r16+r17 +; ptr X / Z +usbCrc16: + mov ptrL, argPtrL + mov ptrH, argPtrH + ldi resCrcL, 0xFF + ldi resCrcH, 0xFF + rjmp usbCrc16LoopTest +usbCrc16ByteLoop: + ld byte, ptr+ + eor resCrcL, byte ; resCrcL is now 'x' in table() + mov byte, resCrcL ; compute parity of 'x' + swap byte + eor byte, resCrcL + mov scratch, byte + lsr byte + lsr byte + eor byte, scratch + inc byte + lsr byte + andi byte, 1 ; byte is now parity(x) + mov scratch, resCrcL + mov resCrcL, resCrcH + eor resCrcL, byte ; low byte of if(parity(x)) value ^= 0xc001; + neg byte + andi byte, 0xc0 + mov resCrcH, byte ; high byte of if(parity(x)) value ^= 0xc001; + clr byte + lsr scratch + ror byte + eor resCrcH, scratch + eor resCrcL, byte + lsr scratch + ror byte + eor resCrcH, scratch + eor resCrcL, byte +usbCrc16LoopTest: + subi argLen, 1 + brsh usbCrc16ByteLoop + com resCrcL + com resCrcH + ret + +#else /* USB_USE_FAST_CRC */ + +; This implementation is slower, but has less code size +; +; extern unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen); +; argPtr r24+25 / r16+r17 +; argLen r22 / r18 +; temp variables: +; byte r18 / r22 +; bitCnt r19 +; poly r20+r21 +; scratch r23 +; resCrc r24+r25 / r16+r17 +; ptr X / Z +usbCrc16: + mov ptrL, argPtrL + mov ptrH, argPtrH + ldi resCrcL, 0 + ldi resCrcH, 0 + ldi polyL, lo8(0xa001) + ldi polyH, hi8(0xa001) + com argLen ; argLen = -argLen - 1: modified loop to ensure that carry is set + ldi bitCnt, 0 ; loop counter with starnd condition = end condition + rjmp usbCrcLoopEntry +usbCrcByteLoop: + ld byte, ptr+ + eor resCrcL, byte +usbCrcBitLoop: + ror resCrcH ; carry is always set here (see brcs jumps to here) + ror resCrcL + brcs usbCrcNoXor + eor resCrcL, polyL + eor resCrcH, polyH +usbCrcNoXor: + subi bitCnt, 224 ; (8 * 224) % 256 = 0; this loop iterates 8 times + brcs usbCrcBitLoop +usbCrcLoopEntry: + subi argLen, -1 + brcs usbCrcByteLoop +usbCrcReady: + ret +; Thanks to Reimar Doeffinger for optimizing this CRC routine! + +#endif /* USB_USE_FAST_CRC */ + +; extern unsigned usbCrc16Append(unsigned char *data, unsigned char len); +usbCrc16Append: + rcall usbCrc16 + st ptr+, resCrcL + st ptr+, resCrcH + ret + +#undef argLen +#undef argPtrL +#undef argPtrH +#undef resCrcL +#undef resCrcH +#undef ptrL +#undef ptrH +#undef ptr +#undef byte +#undef bitCnt +#undef polyL +#undef polyH +#undef scratch + + +#if USB_CFG_HAVE_MEASURE_FRAME_LENGTH +#ifdef __IAR_SYSTEMS_ASM__ +/* Register assignments for usbMeasureFrameLength on IAR cc */ +/* Calling conventions on IAR: + * First parameter passed in r16/r17, second in r18/r19 and so on. + * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer) + * Result is passed in r16/r17 + * In case of the "tiny" memory model, pointers are only 8 bit with no + * padding. We therefore pass argument 1 as "16 bit unsigned". + */ +# define resL r16 +# define resH r17 +# define cnt16L r30 +# define cnt16H r31 +# define cntH r18 + +#else /* __IAR_SYSTEMS_ASM__ */ +/* Register assignments for usbMeasureFrameLength on gcc */ +/* Calling conventions on gcc: + * First parameter passed in r24/r25, second in r22/23 and so on. + * Callee must preserve r1-r17, r28/r29 + * Result is passed in r24/r25 + */ +# define resL r24 +# define resH r25 +# define cnt16L r24 +# define cnt16H r25 +# define cntH r26 +#endif +# define cnt16 cnt16L + +; extern unsigned usbMeasurePacketLength(void); +; returns time between two idle strobes in multiples of 7 CPU clocks +.global usbMeasureFrameLength +usbMeasureFrameLength: + ldi cntH, 6 ; wait ~ 10 ms for D- == 0 + clr cnt16L + clr cnt16H +usbMFTime16: + dec cntH + breq usbMFTimeout +usbMFWaitStrobe: ; first wait for D- == 0 (idle strobe) + sbiw cnt16, 1 ;[0] [6] + breq usbMFTime16 ;[2] + sbic USBIN, USBMINUS ;[3] + rjmp usbMFWaitStrobe ;[4] +usbMFWaitIdle: ; then wait until idle again + sbis USBIN, USBMINUS ;1 wait for D- == 1 + rjmp usbMFWaitIdle ;2 + ldi cnt16L, 1 ;1 represents cycles so far + clr cnt16H ;1 +usbMFWaitLoop: + in cntH, USBIN ;[0] [7] + adiw cnt16, 1 ;[1] + breq usbMFTimeout ;[3] + andi cntH, USBMASK ;[4] + brne usbMFWaitLoop ;[5] +usbMFTimeout: +#if resL != cnt16L + mov resL, cnt16L + mov resH, cnt16H +#endif + ret + +#undef resL +#undef resH +#undef cnt16 +#undef cnt16L +#undef cnt16H +#undef cntH + +#endif /* USB_CFG_HAVE_MEASURE_FRAME_LENGTH */ + +;---------------------------------------------------------------------------- +; Now include the clock rate specific code +;---------------------------------------------------------------------------- + +#ifndef USB_CFG_CLOCK_KHZ +# ifdef F_CPU +# define USB_CFG_CLOCK_KHZ (F_CPU/1000) +# else +# error "USB_CFG_CLOCK_KHZ not defined in usbconfig.h and no F_CPU set!" +# endif +#endif + +#if USB_CFG_CHECK_CRC /* separate dispatcher for CRC type modules */ +# if USB_CFG_CLOCK_KHZ == 18000 +# include "usbdrvasm18-crc.inc" +# else +# error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!" +# endif +#else /* USB_CFG_CHECK_CRC */ +# if USB_CFG_CLOCK_KHZ == 12000 +# include "usbdrvasm12.inc" +# elif USB_CFG_CLOCK_KHZ == 12800 +# include "usbdrvasm128.inc" +# elif USB_CFG_CLOCK_KHZ == 15000 +# include "usbdrvasm15.inc" +# elif USB_CFG_CLOCK_KHZ == 16000 +# include "usbdrvasm16.inc" +# elif USB_CFG_CLOCK_KHZ == 16500 +# include "usbdrvasm165.inc" +# elif USB_CFG_CLOCK_KHZ == 20000 +# include "usbdrvasm20.inc" +# else +# error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!" +# endif +#endif /* USB_CFG_CHECK_CRC */ diff --git a/firmware/usbdrv/usbdrvasm.asm b/firmware/usbdrv/usbdrvasm.asm new file mode 100644 index 0000000..9cc4e4d --- /dev/null +++ b/firmware/usbdrv/usbdrvasm.asm @@ -0,0 +1,21 @@ +/* Name: usbdrvasm.asm + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2006-03-01 + * Tabsize: 4 + * Copyright: (c) 2006 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id$ + */ + +/* +General Description: +The IAR compiler/assembler system prefers assembler files with file extension +".asm". We simply provide this file as an alias for usbdrvasm.S. + +Thanks to Oleg Semyonov for his help with the IAR tools port! +*/ + +#include "usbdrvasm.S" + +end diff --git a/firmware/usbdrv/usbdrvasm12.inc b/firmware/usbdrv/usbdrvasm12.inc new file mode 100644 index 0000000..c116758 --- /dev/null +++ b/firmware/usbdrv/usbdrvasm12.inc @@ -0,0 +1,393 @@ +/* Name: usbdrvasm12.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2004-12-29 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbdrvasm12.inc 740 2009-04-13 18:23:31Z cs $ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file is the 12 MHz version of the asssembler part of the USB driver. It +requires a 12 MHz crystal (not a ceramic resonator and not a calibrated RC +oscillator). + +See usbdrv.h for a description of the entire driver. + +Since almost all of this code is timing critical, don't change unless you +really know what you are doing! Many parts require not only a maximum number +of CPU cycles, but even an exact number of cycles! + + +Timing constraints according to spec (in bit times): +timing subject min max CPUcycles +--------------------------------------------------------------------------- +EOP of OUT/SETUP to sync pattern of DATA0 (both rx) 2 16 16-128 +EOP of IN to sync pattern of DATA0 (rx, then tx) 2 7.5 16-60 +DATAx (rx) to ACK/NAK/STALL (tx) 2 7.5 16-60 +*/ + +;Software-receiver engine. Strict timing! Don't change unless you can preserve timing! +;interrupt response time: 4 cycles + insn running = 7 max if interrupts always enabled +;max allowable interrupt latency: 34 cycles -> max 25 cycles interrupt disable +;max stack usage: [ret(2), YL, SREG, YH, shift, x1, x2, x3, cnt, x4] = 11 bytes +;Numbers in brackets are maximum cycles since SOF. +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt + push YL ;2 [35] push only what is necessary to sync with edge ASAP + in YL, SREG ;1 [37] + push YL ;2 [39] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of 1/4 bit which meets the spec. + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push YH ;2 [2] + lds YL, usbInputBufOffset;2 [4] + clr YH ;1 [5] + subi YL, lo8(-(usbRxBuf));1 [6] + sbci YH, hi8(-(usbRxBuf));1 [7] + + sbis USBIN, USBMINUS ;1 [8] we want two bits K [sample 1 cycle too early] + rjmp haveTwoBitsK ;2 [10] + pop YH ;2 [11] undo the push from before + rjmp waitForK ;2 [13] this was not the end of sync, retry +haveTwoBitsK: +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- + push shift ;2 [16] + push x1 ;2 [12] + push x2 ;2 [14] + + in x1, USBIN ;1 [17] <-- sample bit 0 + ldi shift, 0xff ;1 [18] + bst x1, USBMINUS ;1 [19] + bld shift, 0 ;1 [20] + push x3 ;2 [22] + push cnt ;2 [24] + + in x2, USBIN ;1 [25] <-- sample bit 1 + ser x3 ;1 [26] [inserted init instruction] + eor x1, x2 ;1 [27] + bst x1, USBMINUS ;1 [28] + bld shift, 1 ;1 [29] + ldi cnt, USB_BUFSIZE;1 [30] [inserted init instruction] + rjmp rxbit2 ;2 [32] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- + +unstuff0: ;1 (branch taken) + andi x3, ~0x01 ;1 [15] + mov x1, x2 ;1 [16] x2 contains last sampled (stuffed) bit + in x2, USBIN ;1 [17] <-- sample bit 1 again + ori shift, 0x01 ;1 [18] + rjmp didUnstuff0 ;2 [20] + +unstuff1: ;1 (branch taken) + mov x2, x1 ;1 [21] x1 contains last sampled (stuffed) bit + andi x3, ~0x02 ;1 [22] + ori shift, 0x02 ;1 [23] + nop ;1 [24] + in x1, USBIN ;1 [25] <-- sample bit 2 again + rjmp didUnstuff1 ;2 [27] + +unstuff2: ;1 (branch taken) + andi x3, ~0x04 ;1 [29] + ori shift, 0x04 ;1 [30] + mov x1, x2 ;1 [31] x2 contains last sampled (stuffed) bit + nop ;1 [32] + in x2, USBIN ;1 [33] <-- sample bit 3 + rjmp didUnstuff2 ;2 [35] + +unstuff3: ;1 (branch taken) + in x2, USBIN ;1 [34] <-- sample stuffed bit 3 [one cycle too late] + andi x3, ~0x08 ;1 [35] + ori shift, 0x08 ;1 [36] + rjmp didUnstuff3 ;2 [38] + +unstuff4: ;1 (branch taken) + andi x3, ~0x10 ;1 [40] + in x1, USBIN ;1 [41] <-- sample stuffed bit 4 + ori shift, 0x10 ;1 [42] + rjmp didUnstuff4 ;2 [44] + +unstuff5: ;1 (branch taken) + andi x3, ~0x20 ;1 [48] + in x2, USBIN ;1 [49] <-- sample stuffed bit 5 + ori shift, 0x20 ;1 [50] + rjmp didUnstuff5 ;2 [52] + +unstuff6: ;1 (branch taken) + andi x3, ~0x40 ;1 [56] + in x1, USBIN ;1 [57] <-- sample stuffed bit 6 + ori shift, 0x40 ;1 [58] + rjmp didUnstuff6 ;2 [60] + +; extra jobs done during bit interval: +; bit 0: store, clear [SE0 is unreliable here due to bit dribbling in hubs] +; bit 1: se0 check +; bit 2: overflow check +; bit 3: recovery from delay [bit 0 tasks took too long] +; bit 4: none +; bit 5: none +; bit 6: none +; bit 7: jump, eor +rxLoop: + eor x3, shift ;1 [0] reconstruct: x3 is 0 at bit locations we changed, 1 at others + in x1, USBIN ;1 [1] <-- sample bit 0 + st y+, x3 ;2 [3] store data + ser x3 ;1 [4] + nop ;1 [5] + eor x2, x1 ;1 [6] + bst x2, USBMINUS;1 [7] + bld shift, 0 ;1 [8] + in x2, USBIN ;1 [9] <-- sample bit 1 (or possibly bit 0 stuffed) + andi x2, USBMASK ;1 [10] + breq se0 ;1 [11] SE0 check for bit 1 + andi shift, 0xf9 ;1 [12] +didUnstuff0: + breq unstuff0 ;1 [13] + eor x1, x2 ;1 [14] + bst x1, USBMINUS;1 [15] + bld shift, 1 ;1 [16] +rxbit2: + in x1, USBIN ;1 [17] <-- sample bit 2 (or possibly bit 1 stuffed) + andi shift, 0xf3 ;1 [18] + breq unstuff1 ;1 [19] do remaining work for bit 1 +didUnstuff1: + subi cnt, 1 ;1 [20] + brcs overflow ;1 [21] loop control + eor x2, x1 ;1 [22] + bst x2, USBMINUS;1 [23] + bld shift, 2 ;1 [24] + in x2, USBIN ;1 [25] <-- sample bit 3 (or possibly bit 2 stuffed) + andi shift, 0xe7 ;1 [26] + breq unstuff2 ;1 [27] +didUnstuff2: + eor x1, x2 ;1 [28] + bst x1, USBMINUS;1 [29] + bld shift, 3 ;1 [30] +didUnstuff3: + andi shift, 0xcf ;1 [31] + breq unstuff3 ;1 [32] + in x1, USBIN ;1 [33] <-- sample bit 4 + eor x2, x1 ;1 [34] + bst x2, USBMINUS;1 [35] + bld shift, 4 ;1 [36] +didUnstuff4: + andi shift, 0x9f ;1 [37] + breq unstuff4 ;1 [38] + nop2 ;2 [40] + in x2, USBIN ;1 [41] <-- sample bit 5 + eor x1, x2 ;1 [42] + bst x1, USBMINUS;1 [43] + bld shift, 5 ;1 [44] +didUnstuff5: + andi shift, 0x3f ;1 [45] + breq unstuff5 ;1 [46] + nop2 ;2 [48] + in x1, USBIN ;1 [49] <-- sample bit 6 + eor x2, x1 ;1 [50] + bst x2, USBMINUS;1 [51] + bld shift, 6 ;1 [52] +didUnstuff6: + cpi shift, 0x02 ;1 [53] + brlo unstuff6 ;1 [54] + nop2 ;2 [56] + in x2, USBIN ;1 [57] <-- sample bit 7 + eor x1, x2 ;1 [58] + bst x1, USBMINUS;1 [59] + bld shift, 7 ;1 [60] +didUnstuff7: + cpi shift, 0x04 ;1 [61] + brsh rxLoop ;2 [63] loop control +unstuff7: + andi x3, ~0x80 ;1 [63] + ori shift, 0x80 ;1 [64] + in x2, USBIN ;1 [65] <-- sample stuffed bit 7 + nop ;1 [66] + rjmp didUnstuff7 ;2 [68] + +macro POP_STANDARD ; 12 cycles + pop cnt + pop x3 + pop x2 + pop x1 + pop shift + pop YH + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +;---------------------------------------------------------------------------- +; Transmitting data +;---------------------------------------------------------------------------- + +txByteLoop: +txBitloop: +stuffN1Delay: ; [03] + ror shift ;[-5] [11] [59] + brcc doExorN1 ;[-4] [60] + subi x4, 1 ;[-3] + brne commonN1 ;[-2] + lsl shift ;[-1] compensate ror after rjmp stuffDelay + nop ;[00] stuffing consists of just waiting 8 cycles + rjmp stuffN1Delay ;[01] after ror, C bit is reliably clear + +sendNakAndReti: ;0 [-19] 19 cycles until SOP + ldi x3, USBPID_NAK ;1 [-18] + rjmp usbSendX3 ;2 [-16] +sendAckAndReti: ;0 [-19] 19 cycles until SOP + ldi x3, USBPID_ACK ;1 [-18] + rjmp usbSendX3 ;2 [-16] +sendCntAndReti: ;0 [-17] 17 cycles until SOP + mov x3, cnt ;1 [-16] +usbSendX3: ;0 [-16] + ldi YL, 20 ;1 [-15] 'x3' is R20 + ldi YH, 0 ;1 [-14] + ldi cnt, 2 ;1 [-13] +; rjmp usbSendAndReti fallthrough + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) or USBOUT = 0x01 +; K = (D+ = 1), (D- = 0) or USBOUT = 0x02 +; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles) + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte +;uses: x1...x2, x4, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x4 = bitstuff cnt] +;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction) +usbSendAndReti: + in x2, USBDDR ;[-12] 12 cycles until SOP + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS ;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + out USBDDR, x2 ;[-8] <--- acquire bus + in x1, USBOUT ;[-7] port mirror for tx loop + ldi shift, 0x40 ;[-6] sync byte is first byte sent (we enter loop after ror) + ldi x2, USBMASK ;[-5] + push x4 ;[-4] +doExorN1: + eor x1, x2 ;[-2] [06] [62] + ldi x4, 6 ;[-1] [07] [63] +commonN1: +stuffN2Delay: + out USBOUT, x1 ;[00] [08] [64] <--- set bit + ror shift ;[01] + brcc doExorN2 ;[02] + subi x4, 1 ;[03] + brne commonN2 ;[04] + lsl shift ;[05] compensate ror after rjmp stuffDelay + rjmp stuffN2Delay ;[06] after ror, C bit is reliably clear +doExorN2: + eor x1, x2 ;[04] [12] + ldi x4, 6 ;[05] [13] +commonN2: + nop ;[06] [14] + subi cnt, 171 ;[07] [15] trick: (3 * 171) & 0xff = 1 + out USBOUT, x1 ;[08] [16] <--- set bit + brcs txBitloop ;[09] [25] [41] + +stuff6Delay: + ror shift ;[42] [50] + brcc doExor6 ;[43] + subi x4, 1 ;[44] + brne common6 ;[45] + lsl shift ;[46] compensate ror after rjmp stuffDelay + nop ;[47] stuffing consists of just waiting 8 cycles + rjmp stuff6Delay ;[48] after ror, C bit is reliably clear +doExor6: + eor x1, x2 ;[45] [53] + ldi x4, 6 ;[46] +common6: +stuff7Delay: + ror shift ;[47] [55] + out USBOUT, x1 ;[48] <--- set bit + brcc doExor7 ;[49] + subi x4, 1 ;[50] + brne common7 ;[51] + lsl shift ;[52] compensate ror after rjmp stuffDelay + rjmp stuff7Delay ;[53] after ror, C bit is reliably clear +doExor7: + eor x1, x2 ;[51] [59] + ldi x4, 6 ;[52] +common7: + ld shift, y+ ;[53] + tst cnt ;[55] + out USBOUT, x1 ;[56] <--- set bit + brne txByteLoop ;[57] + +;make SE0: + cbr x1, USBMASK ;[58] prepare SE0 [spec says EOP may be 15 to 18 cycles] + lds x2, usbNewDeviceAddr;[59] + lsl x2 ;[61] we compare with left shifted address + subi YL, 2 + 20 ;[62] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;[63] + out USBOUT, x1 ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[01] + sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< 12.5625 MHz +max frequency: 69.286 cycles for 8 bit -> 12.99 MHz +nominal frequency: 12.77 MHz ( = sqrt(min * max)) + +sampling positions: (next even number in range [+/- 0.5]) +cycle index range: 0 ... 66 +bits: +.5, 8.875, 17.25, 25.625, 34, 42.375, 50.75, 59.125 +[0/1], [9], [17], [25/+26], [34], [+42/43], [51], [59] + +bit number: 0 1 2 3 4 5 6 7 +spare cycles 1 2 1 2 1 1 1 0 + +operations to perform: duration cycle + ---------------- + eor fix, shift 1 -> 00 + andi phase, USBMASK 1 -> 08 + breq se0 1 -> 16 (moved to 11) + st y+, data 2 -> 24, 25 + mov data, fix 1 -> 33 + ser data 1 -> 41 + subi cnt, 1 1 -> 49 + brcs overflow 1 -> 50 + +layout of samples and operations: +[##] = sample bit +<##> = sample phase +*##* = operation + +0: *00* [01] 02 03 04 <05> 06 07 +1: *08* [09] 10 11 12 <13> 14 15 *16* +2: [17] 18 19 20 <21> 22 23 +3: *24* *25* [26] 27 28 29 <30> 31 32 +4: *33* [34] 35 36 37 <38> 39 40 +5: *41* [42] 43 44 45 <46> 47 48 +6: *49* *50* [51] 52 53 54 <55> 56 57 58 +7: [59] 60 61 62 <63> 64 65 66 +*****************************************************************************/ + +/* we prefer positive expressions (do if condition) instead of negative + * (skip if condition), therefore use defines for skip instructions: + */ +#define ifioclr sbis +#define ifioset sbic +#define ifrclr sbrs +#define ifrset sbrc + +/* The registers "fix" and "data" swap their meaning during the loop. Use + * defines to keep their name constant. + */ +#define fix x2 +#define data x1 +#undef phase /* phase has a default definition to x4 */ +#define phase x3 + + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt, r0 + push YL ;2 push only what is necessary to sync with edge ASAP + in YL, SREG ;1 + push YL ;2 +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of 1/4 bit which meets the spec. + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS ;[0] + rjmp foundK ;[1] +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError + +foundK: +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push YH ;[2] + lds YL, usbInputBufOffset;[4] + clr YH ;[6] + subi YL, lo8(-(usbRxBuf));[7] + sbci YH, hi8(-(usbRxBuf));[8] + + sbis USBIN, USBMINUS ;[9] we want two bits K [we want to sample at 8 + 4 - 1.5 = 10.5] + rjmp haveTwoBitsK ;[10] + pop YH ;[11] undo the push from before + rjmp waitForK ;[13] this was not the end of sync, retry +haveTwoBitsK: +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +#define fix x2 +#define data x1 + + push shift ;[12] + push x1 ;[14] + push x2 ;[16] + ldi shift, 0x80 ;[18] prevent bit-unstuffing but init low bits to 0 + ifioset USBIN, USBMINUS ;[19] [01] <--- bit 0 [10.5 + 8 = 18.5] + ori shift, 1<<0 ;[02] + push x3 ;[03] + push cnt ;[05] + push r0 ;[07] + ifioset USBIN, USBMINUS ;[09] <--- bit 1 + ori shift, 1<<1 ;[10] + ser fix ;[11] + ldi cnt, USB_BUFSIZE ;[12] + mov data, shift ;[13] + lsl shift ;[14] + nop2 ;[15] + ifioset USBIN, USBMINUS ;[17] <--- bit 2 + ori data, 3<<2 ;[18] store in bit 2 AND bit 3 + eor shift, data ;[19] do nrzi decoding + andi data, 1<<3 ;[20] + in phase, USBIN ;[21] <- phase + brne jumpToEntryAfterSet ;[22] if USBMINS at bit 3 was 1 + nop ;[23] + rjmp entryAfterClr ;[24] +jumpToEntryAfterSet: + rjmp entryAfterSet ;[24] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- +#undef fix +#define fix x1 +#undef data +#define data x2 + +bit7IsSet: + ifrclr phase, USBMINUS ;[62] check phase only if D- changed + lpm ;[63] + in phase, USBIN ;[64] <- phase (one cycle too late) + ori shift, 1 << 7 ;[65] + nop ;[66] +;;;;rjmp bit0AfterSet ; -> [00] == [67] moved block up to save jump +bit0AfterSet: + eor fix, shift ;[00] +#undef fix +#define fix x2 +#undef data +#define data x1 /* we now have result in data, fix is reset to 0xff */ + ifioclr USBIN, USBMINUS ;[01] <--- sample 0 + rjmp bit0IsClr ;[02] + andi shift, ~(7 << 0) ;[03] + breq unstuff0s ;[04] + in phase, USBIN ;[05] <- phase + rjmp bit1AfterSet ;[06] +unstuff0s: + in phase, USBIN ;[06] <- phase (one cycle too late) + andi fix, ~(1 << 0) ;[07] + ifioclr USBIN, USBMINUS ;[00] + ifioset USBIN, USBPLUS ;[01] + rjmp bit0IsClr ;[02] executed if first expr false or second true +se0AndStore: ; executed only if both bits 0 + st y+, x1 ;[15/17] cycles after start of byte + rjmp se0 ;[17/19] + +bit0IsClr: + ifrset phase, USBMINUS ;[04] check phase only if D- changed + lpm ;[05] + in phase, USBIN ;[06] <- phase (one cycle too late) + ori shift, 1 << 0 ;[07] +bit1AfterClr: + andi phase, USBMASK ;[08] + ifioset USBIN, USBMINUS ;[09] <--- sample 1 + rjmp bit1IsSet ;[10] + breq se0AndStore ;[11] if D- was 0 in bits 0 AND 1 and D+ was 0 in between, we have SE0 + andi shift, ~(7 << 1) ;[12] + in phase, USBIN ;[13] <- phase + breq unstuff1c ;[14] + rjmp bit2AfterClr ;[15] +unstuff1c: + andi fix, ~(1 << 1) ;[16] + nop2 ;[08] + nop2 ;[10] +bit1IsSet: + ifrclr phase, USBMINUS ;[12] check phase only if D- changed + lpm ;[13] + in phase, USBIN ;[14] <- phase (one cycle too late) + ori shift, 1 << 1 ;[15] + nop ;[16] +bit2AfterSet: + ifioclr USBIN, USBMINUS ;[17] <--- sample 2 + rjmp bit2IsClr ;[18] + andi shift, ~(7 << 2) ;[19] + breq unstuff2s ;[20] + in phase, USBIN ;[21] <- phase + rjmp bit3AfterSet ;[22] +unstuff2s: + in phase, USBIN ;[22] <- phase (one cycle too late) + andi fix, ~(1 << 2) ;[23] + nop2 ;[16] + nop2 ;[18] +bit2IsClr: + ifrset phase, USBMINUS ;[20] check phase only if D- changed + lpm ;[21] + in phase, USBIN ;[22] <- phase (one cycle too late) + ori shift, 1 << 2 ;[23] +bit3AfterClr: + st y+, data ;[24] +entryAfterClr: + ifioset USBIN, USBMINUS ;[26] <--- sample 3 + rjmp bit3IsSet ;[27] + andi shift, ~(7 << 3) ;[28] + breq unstuff3c ;[29] + in phase, USBIN ;[30] <- phase + rjmp bit4AfterClr ;[31] +unstuff3c: + in phase, USBIN ;[31] <- phase (one cycle too late) + andi fix, ~(1 << 3) ;[32] + nop2 ;[25] + nop2 ;[27] +bit3IsSet: + ifrclr phase, USBMINUS ;[29] check phase only if D- changed + lpm ;[30] + in phase, USBIN ;[31] <- phase (one cycle too late) + ori shift, 1 << 3 ;[32] +bit4AfterSet: + mov data, fix ;[33] undo this move by swapping defines +#undef fix +#define fix x1 +#undef data +#define data x2 + ifioclr USBIN, USBMINUS ;[34] <--- sample 4 + rjmp bit4IsClr ;[35] + andi shift, ~(7 << 4) ;[36] + breq unstuff4s ;[37] + in phase, USBIN ;[38] <- phase + rjmp bit5AfterSet ;[39] +unstuff4s: + in phase, USBIN ;[39] <- phase (one cycle too late) + andi fix, ~(1 << 4) ;[40] + nop2 ;[33] + nop2 ;[35] +bit4IsClr: + ifrset phase, USBMINUS ;[37] check phase only if D- changed + lpm ;[38] + in phase, USBIN ;[39] <- phase (one cycle too late) + ori shift, 1 << 4 ;[40] +bit5AfterClr: + ser data ;[41] + ifioset USBIN, USBMINUS ;[42] <--- sample 5 + rjmp bit5IsSet ;[43] + andi shift, ~(7 << 5) ;[44] + breq unstuff5c ;[45] + in phase, USBIN ;[46] <- phase + rjmp bit6AfterClr ;[47] +unstuff5c: + in phase, USBIN ;[47] <- phase (one cycle too late) + andi fix, ~(1 << 5) ;[48] + nop2 ;[41] + nop2 ;[43] +bit5IsSet: + ifrclr phase, USBMINUS ;[45] check phase only if D- changed + lpm ;[46] + in phase, USBIN ;[47] <- phase (one cycle too late) + ori shift, 1 << 5 ;[48] +bit6AfterSet: + subi cnt, 1 ;[49] + brcs jumpToOverflow ;[50] + ifioclr USBIN, USBMINUS ;[51] <--- sample 6 + rjmp bit6IsClr ;[52] + andi shift, ~(3 << 6) ;[53] + cpi shift, 2 ;[54] + in phase, USBIN ;[55] <- phase + brlt unstuff6s ;[56] + rjmp bit7AfterSet ;[57] + +jumpToOverflow: + rjmp overflow + +unstuff6s: + andi fix, ~(1 << 6) ;[50] + lpm ;[51] +bit6IsClr: + ifrset phase, USBMINUS ;[54] check phase only if D- changed + lpm ;[55] + in phase, USBIN ;[56] <- phase (one cycle too late) + ori shift, 1 << 6 ;[57] + nop ;[58] +bit7AfterClr: + ifioset USBIN, USBMINUS ;[59] <--- sample 7 + rjmp bit7IsSet ;[60] + andi shift, ~(1 << 7) ;[61] + cpi shift, 4 ;[62] + in phase, USBIN ;[63] <- phase + brlt unstuff7c ;[64] + rjmp bit0AfterClr ;[65] -> [00] == [67] +unstuff7c: + andi fix, ~(1 << 7) ;[58] + nop ;[59] + rjmp bit7IsSet ;[60] + +bit7IsClr: + ifrset phase, USBMINUS ;[62] check phase only if D- changed + lpm ;[63] + in phase, USBIN ;[64] <- phase (one cycle too late) + ori shift, 1 << 7 ;[65] + nop ;[66] +;;;;rjmp bit0AfterClr ; -> [00] == [67] moved block up to save jump +bit0AfterClr: + eor fix, shift ;[00] +#undef fix +#define fix x2 +#undef data +#define data x1 /* we now have result in data, fix is reset to 0xff */ + ifioset USBIN, USBMINUS ;[01] <--- sample 0 + rjmp bit0IsSet ;[02] + andi shift, ~(7 << 0) ;[03] + breq unstuff0c ;[04] + in phase, USBIN ;[05] <- phase + rjmp bit1AfterClr ;[06] +unstuff0c: + in phase, USBIN ;[06] <- phase (one cycle too late) + andi fix, ~(1 << 0) ;[07] + ifioclr USBIN, USBMINUS ;[00] + ifioset USBIN, USBPLUS ;[01] + rjmp bit0IsSet ;[02] executed if first expr false or second true + rjmp se0AndStore ;[03] executed only if both bits 0 +bit0IsSet: + ifrclr phase, USBMINUS ;[04] check phase only if D- changed + lpm ;[05] + in phase, USBIN ;[06] <- phase (one cycle too late) + ori shift, 1 << 0 ;[07] +bit1AfterSet: + andi shift, ~(7 << 1) ;[08] compensated by "ori shift, 1<<1" if bit1IsClr + ifioclr USBIN, USBMINUS ;[09] <--- sample 1 + rjmp bit1IsClr ;[10] + breq unstuff1s ;[11] + nop2 ;[12] do not check for SE0 if bit 0 was 1 + in phase, USBIN ;[14] <- phase (one cycle too late) + rjmp bit2AfterSet ;[15] +unstuff1s: + in phase, USBIN ;[13] <- phase + andi fix, ~(1 << 1) ;[14] + lpm ;[07] + nop2 ;[10] +bit1IsClr: + ifrset phase, USBMINUS ;[12] check phase only if D- changed + lpm ;[13] + in phase, USBIN ;[14] <- phase (one cycle too late) + ori shift, 1 << 1 ;[15] + nop ;[16] +bit2AfterClr: + ifioset USBIN, USBMINUS ;[17] <--- sample 2 + rjmp bit2IsSet ;[18] + andi shift, ~(7 << 2) ;[19] + breq unstuff2c ;[20] + in phase, USBIN ;[21] <- phase + rjmp bit3AfterClr ;[22] +unstuff2c: + in phase, USBIN ;[22] <- phase (one cycle too late) + andi fix, ~(1 << 2) ;[23] + nop2 ;[16] + nop2 ;[18] +bit2IsSet: + ifrclr phase, USBMINUS ;[20] check phase only if D- changed + lpm ;[21] + in phase, USBIN ;[22] <- phase (one cycle too late) + ori shift, 1 << 2 ;[23] +bit3AfterSet: + st y+, data ;[24] +entryAfterSet: + ifioclr USBIN, USBMINUS ;[26] <--- sample 3 + rjmp bit3IsClr ;[27] + andi shift, ~(7 << 3) ;[28] + breq unstuff3s ;[29] + in phase, USBIN ;[30] <- phase + rjmp bit4AfterSet ;[31] +unstuff3s: + in phase, USBIN ;[31] <- phase (one cycle too late) + andi fix, ~(1 << 3) ;[32] + nop2 ;[25] + nop2 ;[27] +bit3IsClr: + ifrset phase, USBMINUS ;[29] check phase only if D- changed + lpm ;[30] + in phase, USBIN ;[31] <- phase (one cycle too late) + ori shift, 1 << 3 ;[32] +bit4AfterClr: + mov data, fix ;[33] undo this move by swapping defines +#undef fix +#define fix x1 +#undef data +#define data x2 + ifioset USBIN, USBMINUS ;[34] <--- sample 4 + rjmp bit4IsSet ;[35] + andi shift, ~(7 << 4) ;[36] + breq unstuff4c ;[37] + in phase, USBIN ;[38] <- phase + rjmp bit5AfterClr ;[39] +unstuff4c: + in phase, USBIN ;[39] <- phase (one cycle too late) + andi fix, ~(1 << 4) ;[40] + nop2 ;[33] + nop2 ;[35] +bit4IsSet: + ifrclr phase, USBMINUS ;[37] check phase only if D- changed + lpm ;[38] + in phase, USBIN ;[39] <- phase (one cycle too late) + ori shift, 1 << 4 ;[40] +bit5AfterSet: + ser data ;[41] + ifioclr USBIN, USBMINUS ;[42] <--- sample 5 + rjmp bit5IsClr ;[43] + andi shift, ~(7 << 5) ;[44] + breq unstuff5s ;[45] + in phase, USBIN ;[46] <- phase + rjmp bit6AfterSet ;[47] +unstuff5s: + in phase, USBIN ;[47] <- phase (one cycle too late) + andi fix, ~(1 << 5) ;[48] + nop2 ;[41] + nop2 ;[43] +bit5IsClr: + ifrset phase, USBMINUS ;[45] check phase only if D- changed + lpm ;[46] + in phase, USBIN ;[47] <- phase (one cycle too late) + ori shift, 1 << 5 ;[48] +bit6AfterClr: + subi cnt, 1 ;[49] + brcs overflow ;[50] + ifioset USBIN, USBMINUS ;[51] <--- sample 6 + rjmp bit6IsSet ;[52] + andi shift, ~(3 << 6) ;[53] + cpi shift, 2 ;[54] + in phase, USBIN ;[55] <- phase + brlt unstuff6c ;[56] + rjmp bit7AfterClr ;[57] +unstuff6c: + andi fix, ~(1 << 6) ;[50] + lpm ;[51] +bit6IsSet: + ifrclr phase, USBMINUS ;[54] check phase only if D- changed + lpm ;[55] + in phase, USBIN ;[56] <- phase (one cycle too late) + ori shift, 1 << 6 ;[57] +bit7AfterSet: + ifioclr USBIN, USBMINUS ;[59] <--- sample 7 + rjmp bit7IsClr ;[60] + andi shift, ~(1 << 7) ;[61] + cpi shift, 4 ;[62] + in phase, USBIN ;[63] <- phase + brlt unstuff7s ;[64] + rjmp bit0AfterSet ;[65] -> [00] == [67] +unstuff7s: + andi fix, ~(1 << 7) ;[58] + nop ;[59] + rjmp bit7IsClr ;[60] + +macro POP_STANDARD ; 14 cycles + pop r0 + pop cnt + pop x3 + pop x2 + pop x1 + pop shift + pop YH + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +;---------------------------------------------------------------------------- +; Transmitting data +;---------------------------------------------------------------------------- + +txByteLoop: +txBitloop: +stuffN1Delay: ; [03] + ror shift ;[-5] [11] [63] + brcc doExorN1 ;[-4] [64] + subi x3, 1 ;[-3] + brne commonN1 ;[-2] + lsl shift ;[-1] compensate ror after rjmp stuffDelay + nop ;[00] stuffing consists of just waiting 8 cycles + rjmp stuffN1Delay ;[01] after ror, C bit is reliably clear + +sendNakAndReti: + ldi cnt, USBPID_NAK ;[-19] + rjmp sendCntAndReti ;[-18] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov r0, cnt ;[-16] + ldi YL, 0 ;[-15] R0 address is 0 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) or USBOUT = 0x01 +; K = (D+ = 1), (D- = 0) or USBOUT = 0x02 +; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles) + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte +;uses: x1...x3, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x3 = bitstuff cnt] +;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction) +usbSendAndReti: + in x2, USBDDR ;[-10] 10 cycles until SOP + ori x2, USBMASK ;[-9] + sbi USBOUT, USBMINUS ;[-8] prepare idle state; D+ and D- must have been 0 (no pullups) + out USBDDR, x2 ;[-6] <--- acquire bus + in x1, USBOUT ;[-5] port mirror for tx loop + ldi shift, 0x40 ;[-4] sync byte is first byte sent (we enter loop after ror) + ldi x2, USBMASK ;[-3] +doExorN1: + eor x1, x2 ;[-2] [06] [62] + ldi x3, 6 ;[-1] [07] [63] +commonN1: +stuffN2Delay: + out USBOUT, x1 ;[00] [08] [64] <--- set bit + ror shift ;[01] + brcc doExorN2 ;[02] + subi x3, 1 ;[03] + brne commonN2 ;[04] + lsl shift ;[05] compensate ror after rjmp stuffDelay + rjmp stuffN2Delay ;[06] after ror, C bit is reliably clear +doExorN2: + eor x1, x2 ;[04] [12] + ldi x3, 6 ;[05] [13] +commonN2: + nop2 ;[06] [14] + subi cnt, 171 ;[08] [16] trick: (3 * 171) & 0xff = 1 + out USBOUT, x1 ;[09] [17] <--- set bit + brcs txBitloop ;[10] [27] [44] + +stuff6Delay: + ror shift ;[45] [53] + brcc doExor6 ;[46] + subi x3, 1 ;[47] + brne common6 ;[48] + lsl shift ;[49] compensate ror after rjmp stuffDelay + nop ;[50] stuffing consists of just waiting 8 cycles + rjmp stuff6Delay ;[51] after ror, C bit is reliably clear +doExor6: + eor x1, x2 ;[48] [56] + ldi x3, 6 ;[49] +common6: +stuff7Delay: + ror shift ;[50] [58] + out USBOUT, x1 ;[51] <--- set bit + brcc doExor7 ;[52] + subi x3, 1 ;[53] + brne common7 ;[54] + lsl shift ;[55] compensate ror after rjmp stuffDelay + rjmp stuff7Delay ;[56] after ror, C bit is reliably clear +doExor7: + eor x1, x2 ;[54] [62] + ldi x3, 6 ;[55] +common7: + ld shift, y+ ;[56] + nop ;[58] + tst cnt ;[59] + out USBOUT, x1 ;[60] [00]<--- set bit + brne txByteLoop ;[61] [01] +;make SE0: + cbr x1, USBMASK ;[02] prepare SE0 [spec says EOP may be 15 to 18 cycles] + lds x2, usbNewDeviceAddr;[03] + lsl x2 ;[05] we compare with left shifted address + subi YL, 2 + 0 ;[06] Only assign address on data packets, not ACK/NAK in r0 + sbci YH, 0 ;[07] + out USBOUT, x1 ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[01] + sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< 0) + echo "$s\n"; + } +} + +function printBit($isAfterSet, $bitNum) +{ + ob_start(); + if($isAfterSet){ +?> + ifioclr USBIN, USBMINUS ;[00] <--- sample + rjmp bit#IsClr ;[01] + andi shift, ~(7 << #) ;[02] + breq unstuff#s ;[03] + in phase, USBIN ;[04] <- phase + rjmp bit@AfterSet ;[05] +unstuff#s: + in phase, USBIN ;[05] <- phase (one cycle too late) + andi fix, ~(1 << #) ;[06] + nop2 ;[-1] + nop2 ;[01] +bit#IsClr: + ifrset phase, USBMINUS ;[03] check phase only if D- changed + lpm ;[04] + in phase, USBIN ;[05] <- phase (one cycle too late) + ori shift, 1 << # ;[06] + + ifioset USBIN, USBMINUS ;[00] <--- sample + rjmp bit#IsSet ;[01] + andi shift, ~(7 << #) ;[02] + breq unstuff#c ;[03] + in phase, USBIN ;[04] <- phase + rjmp bit@AfterClr ;[05] +unstuff#c: + in phase, USBIN ;[05] <- phase (one cycle too late) + andi fix, ~(1 << #) ;[06] + nop2 ;[-1] + nop2 ;[01] +bit#IsSet: + ifrclr phase, USBMINUS ;[03] check phase only if D- changed + lpm ;[04] + in phase, USBIN ;[05] <- phase (one cycle too late) + ori shift, 1 << # ;[06] + +*****************************************************************************/ diff --git a/firmware/usbdrv/usbdrvasm15.inc b/firmware/usbdrv/usbdrvasm15.inc new file mode 100644 index 0000000..401b7f8 --- /dev/null +++ b/firmware/usbdrv/usbdrvasm15.inc @@ -0,0 +1,423 @@ +/* Name: usbdrvasm15.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: contributed by V. Bosch + * Creation Date: 2007-08-06 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id: usbdrvasm15.inc 740 2009-04-13 18:23:31Z cs $ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file is the 15 MHz version of the asssembler part of the USB driver. It +requires a 15 MHz crystal (not a ceramic resonator and not a calibrated RC +oscillator). + +See usbdrv.h for a description of the entire driver. + +Since almost all of this code is timing critical, don't change unless you +really know what you are doing! Many parts require not only a maximum number +of CPU cycles, but even an exact number of cycles! +*/ + +;max stack usage: [ret(2), YL, SREG, YH, bitcnt, shift, x1, x2, x3, x4, cnt] = 12 bytes +;nominal frequency: 15 MHz -> 10.0 cycles per bit, 80.0 cycles per byte +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts + +;---------------------------------------------------------------------------- +; order of registers pushed: +; YL, SREG [sofError] YH, shift, x1, x2, x3, bitcnt, cnt, x4 +;---------------------------------------------------------------------------- +USB_INTR_VECTOR: + push YL ;2 push only what is necessary to sync with edge ASAP + in YL, SREG ;1 + push YL ;2 +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +; +; sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +; sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +;------------------------------------------------------------------------------- +; The following code results in a sampling window of < 1/4 bit +; which meets the spec. +;------------------------------------------------------------------------------- +waitForK: ;- + sbis USBIN, USBMINUS ;1 [00] <-- sample + rjmp foundK ;2 [01] + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +;------------------------------------------------------------------------------ +; {3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for +; center sampling] +; we have 1 bit time for setup purposes, then sample again. +; Numbers in brackets are cycles from center of first sync (double K) +; bit after the instruction +;------------------------------------------------------------------------------ +foundK: ;- [02] + lds YL, usbInputBufOffset;2 [03+04] tx loop + push YH ;2 [05+06] + clr YH ;1 [07] + subi YL, lo8(-(usbRxBuf)) ;1 [08] [rx loop init] + sbci YH, hi8(-(usbRxBuf)) ;1 [09] [rx loop init] + push shift ;2 [10+11] + ser shift ;1 [12] + sbis USBIN, USBMINUS ;1 [-1] [13] <--sample:we want two bits K (sample 1 cycle too early) + rjmp haveTwoBitsK ;2 [00] [14] + pop shift ;2 [15+16] undo the push from before + pop YH ;2 [17+18] undo the push from before + rjmp waitForK ;2 [19+20] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 20 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: ;- [01] + push x1 ;2 [02+03] + push x2 ;2 [04+05] + push x3 ;2 [06+07] + push bitcnt ;2 [08+09] + in x1, USBIN ;1 [00] [10] <-- sample bit 0 + bst x1, USBMINUS ;1 [01] + bld shift, 0 ;1 [02] + push cnt ;2 [03+04] + ldi cnt, USB_BUFSIZE ;1 [05] + push x4 ;2 [06+07] tx loop + rjmp rxLoop ;2 [08] +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- +unstuff0: ;- [07] (branch taken) + andi x3, ~0x01 ;1 [08] + mov x1, x2 ;1 [09] x2 contains last sampled (stuffed) bit + in x2, USBIN ;1 [00] [10] <-- sample bit 1 again + andi x2, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 1 + ori shift, 0x01 ;1 [03] 0b00000001 + nop ;1 [04] + rjmp didUnstuff0 ;2 [05] +;----------------------------------------------------- +unstuff1: ;- [05] (branch taken) + mov x2, x1 ;1 [06] x1 contains last sampled (stuffed) bit + andi x3, ~0x02 ;1 [07] + ori shift, 0x02 ;1 [08] 0b00000010 + nop ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 2 again + andi x1, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 2 + rjmp didUnstuff1 ;2 [03] +;----------------------------------------------------- +unstuff2: ;- [05] (branch taken) + andi x3, ~0x04 ;1 [06] + ori shift, 0x04 ;1 [07] 0b00000100 + mov x1, x2 ;1 [08] x2 contains last sampled (stuffed) bit + nop ;1 [09] + in x2, USBIN ;1 [00] [10] <-- sample bit 3 + andi x2, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 3 + rjmp didUnstuff2 ;2 [03] +;----------------------------------------------------- +unstuff3: ;- [00] [10] (branch taken) + in x2, USBIN ;1 [01] [11] <-- sample stuffed bit 3 one cycle too late + andi x2, USBMASK ;1 [02] + breq se0Hop ;1 [03] SE0 check for stuffed bit 3 + andi x3, ~0x08 ;1 [04] + ori shift, 0x08 ;1 [05] 0b00001000 + rjmp didUnstuff3 ;2 [06] +;---------------------------------------------------------------------------- +; extra jobs done during bit interval: +; +; bit 0: store, clear [SE0 is unreliable here due to bit dribbling in hubs], +; overflow check, jump to the head of rxLoop +; bit 1: SE0 check +; bit 2: SE0 check, recovery from delay [bit 0 tasks took too long] +; bit 3: SE0 check, recovery from delay [bit 0 tasks took too long] +; bit 4: SE0 check, none +; bit 5: SE0 check, none +; bit 6: SE0 check, none +; bit 7: SE0 check, reconstruct: x3 is 0 at bit locations we changed, 1 at others +;---------------------------------------------------------------------------- +rxLoop: ;- [09] + in x2, USBIN ;1 [00] [10] <-- sample bit 1 (or possibly bit 0 stuffed) + andi x2, USBMASK ;1 [01] + brne SkipSe0Hop ;1 [02] +se0Hop: ;- [02] + rjmp se0 ;2 [03] SE0 check for bit 1 +SkipSe0Hop: ;- [03] + ser x3 ;1 [04] + andi shift, 0xf9 ;1 [05] 0b11111001 + breq unstuff0 ;1 [06] +didUnstuff0: ;- [06] + eor x1, x2 ;1 [07] + bst x1, USBMINUS ;1 [08] + bld shift, 1 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 2 (or possibly bit 1 stuffed) + andi x1, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 2 + andi shift, 0xf3 ;1 [03] 0b11110011 + breq unstuff1 ;1 [04] do remaining work for bit 1 +didUnstuff1: ;- [04] + eor x2, x1 ;1 [05] + bst x2, USBMINUS ;1 [06] + bld shift, 2 ;1 [07] + nop2 ;2 [08+09] + in x2, USBIN ;1 [00] [10] <-- sample bit 3 (or possibly bit 2 stuffed) + andi x2, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 3 + andi shift, 0xe7 ;1 [03] 0b11100111 + breq unstuff2 ;1 [04] +didUnstuff2: ;- [04] + eor x1, x2 ;1 [05] + bst x1, USBMINUS ;1 [06] + bld shift, 3 ;1 [07] +didUnstuff3: ;- [07] + andi shift, 0xcf ;1 [08] 0b11001111 + breq unstuff3 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 4 + andi x1, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 4 + eor x2, x1 ;1 [03] + bst x2, USBMINUS ;1 [04] + bld shift, 4 ;1 [05] +didUnstuff4: ;- [05] + andi shift, 0x9f ;1 [06] 0b10011111 + breq unstuff4 ;1 [07] + nop2 ;2 [08+09] + in x2, USBIN ;1 [00] [10] <-- sample bit 5 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for bit 5 + eor x1, x2 ;1 [03] + bst x1, USBMINUS ;1 [04] + bld shift, 5 ;1 [05] +didUnstuff5: ;- [05] + andi shift, 0x3f ;1 [06] 0b00111111 + breq unstuff5 ;1 [07] + nop2 ;2 [08+09] + in x1, USBIN ;1 [00] [10] <-- sample bit 6 + andi x1, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for bit 6 + eor x2, x1 ;1 [03] + bst x2, USBMINUS ;1 [04] + bld shift, 6 ;1 [05] +didUnstuff6: ;- [05] + cpi shift, 0x02 ;1 [06] 0b00000010 + brlo unstuff6 ;1 [07] + nop2 ;2 [08+09] + in x2, USBIN ;1 [00] [10] <-- sample bit 7 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for bit 7 + eor x1, x2 ;1 [03] + bst x1, USBMINUS ;1 [04] + bld shift, 7 ;1 [05] +didUnstuff7: ;- [05] + cpi shift, 0x04 ;1 [06] 0b00000100 + brlo unstuff7 ;1 [07] + eor x3, shift ;1 [08] reconstruct: x3 is 0 at bit locations we changed, 1 at others + nop ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 0 + st y+, x3 ;2 [01+02] store data + eor x2, x1 ;1 [03] + bst x2, USBMINUS ;1 [04] + bld shift, 0 ;1 [05] + subi cnt, 1 ;1 [06] + brcs overflow ;1 [07] + rjmp rxLoop ;2 [08] +;----------------------------------------------------- +unstuff4: ;- [08] + andi x3, ~0x10 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample stuffed bit 4 + andi x1, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 4 + ori shift, 0x10 ;1 [03] + rjmp didUnstuff4 ;2 [04] +;----------------------------------------------------- +unstuff5: ;- [08] + ori shift, 0x20 ;1 [09] + in x2, USBIN ;1 [00] [10] <-- sample stuffed bit 5 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 5 + andi x3, ~0x20 ;1 [03] + rjmp didUnstuff5 ;2 [04] +;----------------------------------------------------- +unstuff6: ;- [08] + andi x3, ~0x40 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample stuffed bit 6 + andi x1, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 6 + ori shift, 0x40 ;1 [03] + rjmp didUnstuff6 ;2 [04] +;----------------------------------------------------- +unstuff7: ;- [08] + andi x3, ~0x80 ;1 [09] + in x2, USBIN ;1 [00] [10] <-- sample stuffed bit 7 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 7 + ori shift, 0x80 ;1 [03] + rjmp didUnstuff7 ;2 [04] + +macro POP_STANDARD ; 16 cycles + pop x4 + pop cnt + pop bitcnt + pop x3 + pop x2 + pop x1 + pop shift + pop YH + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +;--------------------------------------------------------------------------- +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies +;--------------------------------------------------------------------------- +bitstuffN: ;- [04] + eor x1, x4 ;1 [05] + clr x2 ;1 [06] + nop ;1 [07] + rjmp didStuffN ;1 [08] +;--------------------------------------------------------------------------- +bitstuff6: ;- [04] + eor x1, x4 ;1 [05] + clr x2 ;1 [06] + rjmp didStuff6 ;1 [07] +;--------------------------------------------------------------------------- +bitstuff7: ;- [02] + eor x1, x4 ;1 [03] + clr x2 ;1 [06] + nop ;1 [05] + rjmp didStuff7 ;1 [06] +;--------------------------------------------------------------------------- +sendNakAndReti: ;- [-19] + ldi x3, USBPID_NAK ;1 [-18] + rjmp sendX3AndReti ;1 [-17] +;--------------------------------------------------------------------------- +sendAckAndReti: ;- [-17] + ldi cnt, USBPID_ACK ;1 [-16] +sendCntAndReti: ;- [-16] + mov x3, cnt ;1 [-15] +sendX3AndReti: ;- [-15] + ldi YL, 20 ;1 [-14] x3==r20 address is 20 + ldi YH, 0 ;1 [-13] + ldi cnt, 2 ;1 [-12] +; rjmp usbSendAndReti fallthrough +;--------------------------------------------------------------------------- +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, btcnt, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent +;We need not to match the transfer rate exactly because the spec demands +;only 1.5% precision anyway. +usbSendAndReti: ;- [-13] 13 cycles until SOP + in x2, USBDDR ;1 [-12] + ori x2, USBMASK ;1 [-11] + sbi USBOUT, USBMINUS ;2 [-09-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;1 [-08] port mirror for tx loop + out USBDDR, x2 ;1 [-07] <- acquire bus + ; need not init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;1 [-06] exor mask + ldi shift, 0x80 ;1 [-05] sync byte is first byte sent + ldi bitcnt, 6 ;1 [-04] +txBitLoop: ;- [-04] [06] + sbrs shift, 0 ;1 [-03] [07] + eor x1, x4 ;1 [-02] [08] + ror shift ;1 [-01] [09] +didStuffN: ;- [09] + out USBOUT, x1 ;1 [00] [10] <-- out N + ror x2 ;1 [01] + cpi x2, 0xfc ;1 [02] + brcc bitstuffN ;1 [03] + dec bitcnt ;1 [04] + brne txBitLoop ;1 [05] + sbrs shift, 0 ;1 [06] + eor x1, x4 ;1 [07] + ror shift ;1 [08] +didStuff6: ;- [08] + nop ;1 [09] + out USBOUT, x1 ;1 [00] [10] <-- out 6 + ror x2 ;1 [01] + cpi x2, 0xfc ;1 [02] + brcc bitstuff6 ;1 [03] + sbrs shift, 0 ;1 [04] + eor x1, x4 ;1 [05] + ror shift ;1 [06] + ror x2 ;1 [07] +didStuff7: ;- [07] + ldi bitcnt, 6 ;1 [08] + cpi x2, 0xfc ;1 [09] + out USBOUT, x1 ;1 [00] [10] <-- out 7 + brcc bitstuff7 ;1 [01] + ld shift, y+ ;2 [02+03] + dec cnt ;1 [04] + brne txBitLoop ;1 [05] +makeSE0: + cbr x1, USBMASK ;1 [06] prepare SE0 [spec says EOP may be 19 to 23 cycles] + lds x2, usbNewDeviceAddr;2 [07+08] + lsl x2 ;1 [09] we compare with left shifted address +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + out USBOUT, x1 ;1 [00] [10] <-- out SE0-- from now 2 bits==20 cycl. until bus idle + subi YL, 20 + 2 ;1 [01] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;1 [02] + breq skipAddrAssign ;1 [03] + sts usbDeviceAddr, x2 ;2 [04+05] if not skipped: SE0 is one cycle longer +;---------------------------------------------------------------------------- +;end of usbDeviceAddress transfer +skipAddrAssign: ;- [03/04] + ldi x2, 1< 10.6666666 cycles per bit, 85.333333333 cycles per byte +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG YH, [sofError], bitcnt, shift, x1, x2, x3, x4, cnt + push YL ;[-25] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-23] + push YL ;[-22] + push YH ;[-20] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-15] + rjmp foundK ;[-14] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-12] +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push bitcnt ;[-12] +; [---] ;[-11] + lds YL, usbInputBufOffset;[-10] +; [---] ;[-9] + clr YH ;[-8] + subi YL, lo8(-(usbRxBuf));[-7] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-6] [rx loop init] + push shift ;[-5] +; [---] ;[-4] + ldi bitcnt, 0x55 ;[-3] [rx loop init] + sbis USBIN, USBMINUS ;[-2] we want two bits K (sample 2 cycles too early) + rjmp haveTwoBitsK ;[-1] + pop shift ;[0] undo the push from before + pop bitcnt ;[2] undo the push from before + rjmp waitForK ;[4] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 21 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: + push x1 ;[1] + push x2 ;[3] + push x3 ;[5] + ldi shift, 0 ;[7] + ldi x3, 1<<4 ;[8] [rx loop init] first sample is inverse bit, compensate that + push x4 ;[9] == leap + + in x1, USBIN ;[11] <-- sample bit 0 + andi x1, USBMASK ;[12] + bst x1, USBMINUS ;[13] + bld shift, 7 ;[14] + push cnt ;[15] + ldi leap, 0 ;[17] [rx loop init] + ldi cnt, USB_BUFSIZE;[18] [rx loop init] + rjmp rxbit1 ;[19] arrives at [21] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- + +; duration of unstuffing code should be 10.66666667 cycles. We adjust "leap" +; accordingly to approximate this value in the long run. + +unstuff6: + andi x2, USBMASK ;[03] + ori x3, 1<<6 ;[04] will not be shifted any more + andi shift, ~0x80;[05] + mov x1, x2 ;[06] sampled bit 7 is actually re-sampled bit 6 + subi leap, -1 ;[07] total duration = 11 bits -> subtract 1/3 + rjmp didUnstuff6 ;[08] + +unstuff7: + ori x3, 1<<7 ;[09] will not be shifted any more + in x2, USBIN ;[00] [10] re-sample bit 7 + andi x2, USBMASK ;[01] + andi shift, ~0x80;[02] + subi leap, 2 ;[03] total duration = 10 bits -> add 1/3 + rjmp didUnstuff7 ;[04] + +unstuffEven: + ori x3, 1<<6 ;[09] will be shifted right 6 times for bit 0 + in x1, USBIN ;[00] [10] + andi shift, ~0x80;[01] + andi x1, USBMASK ;[02] + breq se0 ;[03] + subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3 + nop2 ;[05] + rjmp didUnstuffE ;[06] + +unstuffOdd: + ori x3, 1<<5 ;[09] will be shifted right 4 times for bit 1 + in x2, USBIN ;[00] [10] + andi shift, ~0x80;[01] + andi x2, USBMASK ;[02] + breq se0 ;[03] + subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3 + nop2 ;[05] + rjmp didUnstuffO ;[06] + +rxByteLoop: + andi x1, USBMASK ;[03] + eor x2, x1 ;[04] + subi leap, 1 ;[05] + brpl skipLeap ;[06] + subi leap, -3 ;1 one leap cycle every 3rd byte -> 85 + 1/3 cycles per byte + nop ;1 +skipLeap: + subi x2, 1 ;[08] + ror shift ;[09] +didUnstuff6: + cpi shift, 0xfc ;[10] + in x2, USBIN ;[00] [11] <-- sample bit 7 + brcc unstuff6 ;[01] + andi x2, USBMASK ;[02] + eor x1, x2 ;[03] + subi x1, 1 ;[04] + ror shift ;[05] +didUnstuff7: + cpi shift, 0xfc ;[06] + brcc unstuff7 ;[07] + eor x3, shift ;[08] reconstruct: x3 is 1 at bit locations we changed, 0 at others + st y+, x3 ;[09] store data +rxBitLoop: + in x1, USBIN ;[00] [11] <-- sample bit 0/2/4 + andi x1, USBMASK ;[01] + eor x2, x1 ;[02] + andi x3, 0x3f ;[03] topmost two bits reserved for 6 and 7 + subi x2, 1 ;[04] + ror shift ;[05] + cpi shift, 0xfc ;[06] + brcc unstuffEven ;[07] +didUnstuffE: + lsr x3 ;[08] + lsr x3 ;[09] +rxbit1: + in x2, USBIN ;[00] [10] <-- sample bit 1/3/5 + andi x2, USBMASK ;[01] + breq se0 ;[02] + eor x1, x2 ;[03] + subi x1, 1 ;[04] + ror shift ;[05] + cpi shift, 0xfc ;[06] + brcc unstuffOdd ;[07] +didUnstuffO: + subi bitcnt, 0xab;[08] == addi 0x55, 0x55 = 0x100/3 + brcs rxBitLoop ;[09] + + subi cnt, 1 ;[10] + in x1, USBIN ;[00] [11] <-- sample bit 6 + brcc rxByteLoop ;[01] + rjmp overflow + +macro POP_STANDARD ; 14 cycles + pop cnt + pop x4 + pop x3 + pop x2 + pop x1 + pop shift + pop bitcnt + endm +macro POP_RETI ; 7 cycles + pop YH + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies + +bitstuffN: + eor x1, x4 ;[5] + ldi x2, 0 ;[6] + nop2 ;[7] + nop ;[9] + out USBOUT, x1 ;[10] <-- out + rjmp didStuffN ;[0] + +bitstuff6: + eor x1, x4 ;[5] + ldi x2, 0 ;[6] Carry is zero due to brcc + rol shift ;[7] compensate for ror shift at branch destination + rjmp didStuff6 ;[8] + +bitstuff7: + ldi x2, 0 ;[2] Carry is zero due to brcc + rjmp didStuff7 ;[3] + + +sendNakAndReti: + ldi x3, USBPID_NAK ;[-18] + rjmp sendX3AndReti ;[-17] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov x3, cnt ;[-16] +sendX3AndReti: + ldi YL, 20 ;[-15] x3==r20 address is 20 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, btcnt, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent +;We don't match the transfer rate exactly (don't insert leap cycles every third +;byte) because the spec demands only 1.5% precision anyway. +usbSendAndReti: ; 12 cycles until SOP + in x2, USBDDR ;[-12] + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;[-8] port mirror for tx loop + out USBDDR, x2 ;[-7] <- acquire bus +; need not init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;[-6] exor mask + ldi shift, 0x80 ;[-5] sync byte is first byte sent +txByteLoop: + ldi bitcnt, 0x35 ;[-4] [6] binary 0011 0101 +txBitLoop: + sbrs shift, 0 ;[-3] [7] + eor x1, x4 ;[-2] [8] + out USBOUT, x1 ;[-1] [9] <-- out N + ror shift ;[0] [10] + ror x2 ;[1] +didStuffN: + cpi x2, 0xfc ;[2] + brcc bitstuffN ;[3] + lsr bitcnt ;[4] + brcc txBitLoop ;[5] + brne txBitLoop ;[6] + + sbrs shift, 0 ;[7] + eor x1, x4 ;[8] +didStuff6: + out USBOUT, x1 ;[-1] [9] <-- out 6 + ror shift ;[0] [10] + ror x2 ;[1] + cpi x2, 0xfc ;[2] + brcc bitstuff6 ;[3] + ror shift ;[4] +didStuff7: + ror x2 ;[5] + sbrs x2, 7 ;[6] + eor x1, x4 ;[7] + nop ;[8] + cpi x2, 0xfc ;[9] + out USBOUT, x1 ;[-1][10] <-- out 7 + brcc bitstuff7 ;[0] [11] + ld shift, y+ ;[1] + dec cnt ;[3] + brne txByteLoop ;[4] +;make SE0: + cbr x1, USBMASK ;[5] prepare SE0 [spec says EOP may be 21 to 25 cycles] + lds x2, usbNewDeviceAddr;[6] + lsl x2 ;[8] we compare with left shifted address + subi YL, 20 + 2 ;[9] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;[10] + out USBOUT, x1 ;[11] <-- out SE0 -- from now 2 bits = 22 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[0] + sts usbDeviceAddr, x2; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< max 52 cycles interrupt disable +;max stack usage: [ret(2), r0, SREG, YL, YH, shift, x1, x2, x3, x4, cnt] = 12 bytes +;nominal frequency: 16.5 MHz -> 11 cycles per bit +; 16.3125 MHz < F_CPU < 16.6875 MHz (+/- 1.1%) +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts + + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG [sofError], r0, YH, shift, x1, x2, x3, x4, cnt + push YL ;[-23] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-21] + push YL ;[-20] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-15] + rjmp foundK ;[-14] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-12] +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push r0 ;[-12] +; [---] ;[-11] + push YH ;[-10] +; [---] ;[-9] + lds YL, usbInputBufOffset;[-8] +; [---] ;[-7] + clr YH ;[-6] + subi YL, lo8(-(usbRxBuf));[-5] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-4] [rx loop init] + mov r0, x2 ;[-3] [rx loop init] + sbis USBIN, USBMINUS ;[-2] we want two bits K (sample 2 cycles too early) + rjmp haveTwoBitsK ;[-1] + pop YH ;[0] undo the pushes from before + pop r0 ;[2] + rjmp waitForK ;[4] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 22 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: ;[1] + push shift ;[1] + push x1 ;[3] + push x2 ;[5] + push x3 ;[7] + ldi shift, 0xff ;[9] [rx loop init] + ori x3, 0xff ;[10] [rx loop init] == ser x3, clear zero flag + + in x1, USBIN ;[11] <-- sample bit 0 + bst x1, USBMINUS ;[12] + bld shift, 0 ;[13] + push x4 ;[14] == phase +; [---] ;[15] + push cnt ;[16] +; [---] ;[17] + ldi phase, 0 ;[18] [rx loop init] + ldi cnt, USB_BUFSIZE;[19] [rx loop init] + rjmp rxbit1 ;[20] +; [---] ;[21] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- +/* +byte oriented operations done during loop: +bit 0: store data +bit 1: SE0 check +bit 2: overflow check +bit 3: catch up +bit 4: rjmp to achieve conditional jump range +bit 5: PLL +bit 6: catch up +bit 7: jump, fixup bitstuff +; 87 [+ 2] cycles +------------------------------------------------------------------ +*/ +continueWithBit5: + in x2, USBIN ;[055] <-- bit 5 + eor r0, x2 ;[056] + or phase, r0 ;[057] + sbrc phase, USBMINUS ;[058] + lpm ;[059] optional nop3; modifies r0 + in phase, USBIN ;[060] <-- phase + eor x1, x2 ;[061] + bst x1, USBMINUS ;[062] + bld shift, 5 ;[063] + andi shift, 0x3f ;[064] + in x1, USBIN ;[065] <-- bit 6 + breq unstuff5 ;[066] *** unstuff escape + eor phase, x1 ;[067] + eor x2, x1 ;[068] + bst x2, USBMINUS ;[069] + bld shift, 6 ;[070] +didUnstuff6: ;[ ] + in r0, USBIN ;[071] <-- phase + cpi shift, 0x02 ;[072] + brlo unstuff6 ;[073] *** unstuff escape +didUnstuff5: ;[ ] + nop2 ;[074] +; [---] ;[075] + in x2, USBIN ;[076] <-- bit 7 + eor x1, x2 ;[077] + bst x1, USBMINUS ;[078] + bld shift, 7 ;[079] +didUnstuff7: ;[ ] + eor r0, x2 ;[080] + or phase, r0 ;[081] + in r0, USBIN ;[082] <-- phase + cpi shift, 0x04 ;[083] + brsh rxLoop ;[084] +; [---] ;[085] +unstuff7: ;[ ] + andi x3, ~0x80 ;[085] + ori shift, 0x80 ;[086] + in x2, USBIN ;[087] <-- sample stuffed bit 7 + nop ;[088] + rjmp didUnstuff7 ;[089] +; [---] ;[090] + ;[080] + +unstuff5: ;[067] + eor phase, x1 ;[068] + andi x3, ~0x20 ;[069] + ori shift, 0x20 ;[070] + in r0, USBIN ;[071] <-- phase + mov x2, x1 ;[072] + nop ;[073] + nop2 ;[074] +; [---] ;[075] + in x1, USBIN ;[076] <-- bit 6 + eor r0, x1 ;[077] + or phase, r0 ;[078] + eor x2, x1 ;[079] + bst x2, USBMINUS ;[080] + bld shift, 6 ;[081] no need to check bitstuffing, we just had one + in r0, USBIN ;[082] <-- phase + rjmp didUnstuff5 ;[083] +; [---] ;[084] + ;[074] + +unstuff6: ;[074] + andi x3, ~0x40 ;[075] + in x1, USBIN ;[076] <-- bit 6 again + ori shift, 0x40 ;[077] + nop2 ;[078] +; [---] ;[079] + rjmp didUnstuff6 ;[080] +; [---] ;[081] + ;[071] + +unstuff0: ;[013] + eor r0, x2 ;[014] + or phase, r0 ;[015] + andi x2, USBMASK ;[016] check for SE0 + in r0, USBIN ;[017] <-- phase + breq didUnstuff0 ;[018] direct jump to se0 would be too long + andi x3, ~0x01 ;[019] + ori shift, 0x01 ;[020] + mov x1, x2 ;[021] mov existing sample + in x2, USBIN ;[022] <-- bit 1 again + rjmp didUnstuff0 ;[023] +; [---] ;[024] + ;[014] + +unstuff1: ;[024] + eor r0, x1 ;[025] + or phase, r0 ;[026] + andi x3, ~0x02 ;[027] + in r0, USBIN ;[028] <-- phase + ori shift, 0x02 ;[029] + mov x2, x1 ;[030] + rjmp didUnstuff1 ;[031] +; [---] ;[032] + ;[022] + +unstuff2: ;[035] + eor r0, x2 ;[036] + or phase, r0 ;[037] + andi x3, ~0x04 ;[038] + in r0, USBIN ;[039] <-- phase + ori shift, 0x04 ;[040] + mov x1, x2 ;[041] + rjmp didUnstuff2 ;[042] +; [---] ;[043] + ;[033] + +unstuff3: ;[043] + in x2, USBIN ;[044] <-- bit 3 again + eor r0, x2 ;[045] + or phase, r0 ;[046] + andi x3, ~0x08 ;[047] + ori shift, 0x08 ;[048] + nop ;[049] + in r0, USBIN ;[050] <-- phase + rjmp didUnstuff3 ;[051] +; [---] ;[052] + ;[042] + +unstuff4: ;[053] + andi x3, ~0x10 ;[054] + in x1, USBIN ;[055] <-- bit 4 again + ori shift, 0x10 ;[056] + rjmp didUnstuff4 ;[057] +; [---] ;[058] + ;[048] + +rxLoop: ;[085] + eor x3, shift ;[086] reconstruct: x3 is 0 at bit locations we changed, 1 at others + in x1, USBIN ;[000] <-- bit 0 + st y+, x3 ;[001] +; [---] ;[002] + eor r0, x1 ;[003] + or phase, r0 ;[004] + eor x2, x1 ;[005] + in r0, USBIN ;[006] <-- phase + ser x3 ;[007] + bst x2, USBMINUS ;[008] + bld shift, 0 ;[009] + andi shift, 0xf9 ;[010] +rxbit1: ;[ ] + in x2, USBIN ;[011] <-- bit 1 + breq unstuff0 ;[012] *** unstuff escape + andi x2, USBMASK ;[013] SE0 check for bit 1 +didUnstuff0: ;[ ] Z only set if we detected SE0 in bitstuff + breq se0 ;[014] + eor r0, x2 ;[015] + or phase, r0 ;[016] + in r0, USBIN ;[017] <-- phase + eor x1, x2 ;[018] + bst x1, USBMINUS ;[019] + bld shift, 1 ;[020] + andi shift, 0xf3 ;[021] +didUnstuff1: ;[ ] + in x1, USBIN ;[022] <-- bit 2 + breq unstuff1 ;[023] *** unstuff escape + eor r0, x1 ;[024] + or phase, r0 ;[025] + subi cnt, 1 ;[026] overflow check + brcs overflow ;[027] + in r0, USBIN ;[028] <-- phase + eor x2, x1 ;[029] + bst x2, USBMINUS ;[030] + bld shift, 2 ;[031] + andi shift, 0xe7 ;[032] +didUnstuff2: ;[ ] + in x2, USBIN ;[033] <-- bit 3 + breq unstuff2 ;[034] *** unstuff escape + eor r0, x2 ;[035] + or phase, r0 ;[036] + eor x1, x2 ;[037] + bst x1, USBMINUS ;[038] + in r0, USBIN ;[039] <-- phase + bld shift, 3 ;[040] + andi shift, 0xcf ;[041] +didUnstuff3: ;[ ] + breq unstuff3 ;[042] *** unstuff escape + nop ;[043] + in x1, USBIN ;[044] <-- bit 4 + eor x2, x1 ;[045] + bst x2, USBMINUS ;[046] + bld shift, 4 ;[047] +didUnstuff4: ;[ ] + eor r0, x1 ;[048] + or phase, r0 ;[049] + in r0, USBIN ;[050] <-- phase + andi shift, 0x9f ;[051] + breq unstuff4 ;[052] *** unstuff escape + rjmp continueWithBit5;[053] +; [---] ;[054] + +macro POP_STANDARD ; 16 cycles + pop cnt + pop x4 + pop x3 + pop x2 + pop x1 + pop shift + pop YH + pop r0 + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies + +bitstuff7: + eor x1, x4 ;[4] + ldi x2, 0 ;[5] + nop2 ;[6] C is zero (brcc) + rjmp didStuff7 ;[8] + +bitstuffN: + eor x1, x4 ;[5] + ldi x2, 0 ;[6] + lpm ;[7] 3 cycle NOP, modifies r0 + out USBOUT, x1 ;[10] <-- out + rjmp didStuffN ;[0] + +#define bitStatus x3 + +sendNakAndReti: + ldi cnt, USBPID_NAK ;[-19] + rjmp sendCntAndReti ;[-18] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov r0, cnt ;[-16] + ldi YL, 0 ;[-15] R0 address is 0 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent +usbSendAndReti: ; 12 cycles until SOP + in x2, USBDDR ;[-12] + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;[-8] port mirror for tx loop + out USBDDR, x2 ;[-7] <- acquire bus +; need not init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;[-6] exor mask + ldi shift, 0x80 ;[-5] sync byte is first byte sent + ldi bitStatus, 0xff ;[-4] init bit loop counter, works for up to 12 bytes +byteloop: +bitloop: + sbrs shift, 0 ;[8] [-3] + eor x1, x4 ;[9] [-2] + out USBOUT, x1 ;[10] [-1] <-- out + ror shift ;[0] + ror x2 ;[1] +didStuffN: + cpi x2, 0xfc ;[2] + brcc bitstuffN ;[3] + nop ;[4] + subi bitStatus, 37 ;[5] 256 / 7 ~=~ 37 + brcc bitloop ;[6] when we leave the loop, bitStatus has almost the initial value + sbrs shift, 0 ;[7] + eor x1, x4 ;[8] + ror shift ;[9] +didStuff7: + out USBOUT, x1 ;[10] <-- out + ror x2 ;[0] + cpi x2, 0xfc ;[1] + brcc bitstuff7 ;[2] + ld shift, y+ ;[3] + dec cnt ;[5] + brne byteloop ;[6] +;make SE0: + cbr x1, USBMASK ;[7] prepare SE0 [spec says EOP may be 21 to 25 cycles] + lds x2, usbNewDeviceAddr;[8] + lsl x2 ;[10] we compare with left shifted address + out USBOUT, x1 ;[11] <-- out SE0 -- from now 2 bits = 22 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + subi YL, 2 ;[0] Only assign address on data packets, not ACK/NAK in r0 + sbci YH, 0 ;[1] + breq skipAddrAssign ;[2] + sts usbDeviceAddr, x2; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< 12 cycles per bit +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts +;register use in receive loop to receive the data bytes: +; shift assembles the byte currently being received +; x1 holds the D+ and D- line state +; x2 holds the previous line state +; cnt holds the number of bytes left in the receive buffer +; x3 holds the higher crc byte (see algorithm below) +; x4 is used as temporary register for the crc algorithm +; x5 is used for unstuffing: when unstuffing the last received bit is inverted in shift (to prevent further +; unstuffing calls. In the same time the corresponding bit in x5 is cleared to mark the bit as beening iverted +; zl lower crc value and crc table index +; zh used for crc table accesses + +;-------------------------------------------------------------------------------------------------------------- +; CRC mods: +; table driven crc checker, Z points to table in prog space +; ZL is the lower crc byte, x3 is the higher crc byte +; x4 is used as temp register to store different results +; the initialization of the crc register is not 0xFFFF but 0xFE54. This is because during the receipt of the +; first data byte an virtual zero data byte is added to the crc register, this results in the correct initial +; value of 0xFFFF at beginning of the second data byte before the first data byte is added to the crc. +; The magic number 0xFE54 results form the crc table: At tabH[0x54] = 0xFF = crcH (required) and +; tabL[0x54] = 0x01 -> crcL = 0x01 xor 0xFE = 0xFF +; bitcnt is renamed to x5 and is used for unstuffing purposes, the unstuffing works like in the 12MHz version +;-------------------------------------------------------------------------------------------------------------- +; CRC algorithm: +; The crc register is formed by x3 (higher byte) and ZL (lower byte). The algorithm uses a 'reversed' form +; i.e. that it takes the least significant bit first and shifts to the right. So in fact the highest order +; bit seen from the polynomial devision point of view is the lsb of ZL. (If this sounds strange to you i +; propose a research on CRC :-) ) +; Each data byte received is xored to ZL, the lower crc byte. This byte now builds the crc +; table index. Next the new high byte is loaded from the table and stored in x4 until we have space in x3 +; (its destination). +; Afterwards the lower table is loaded from the table and stored in ZL (the old index is overwritten as +; we don't need it anymore. In fact this is a right shift by 8 bits.) Now the old crc high value is xored +; to ZL, this is the second shift of the old crc value. Now x4 (the temp reg) is moved to x3 and the crc +; calculation is done. +; Prior to the first byte the two CRC register have to be initialized to 0xFFFF (as defined in usb spec) +; however the crc engine also runs during the receipt of the first byte, therefore x3 and zl are initialized +; to a magic number which results in a crc value of 0xFFFF after the first complete byte. +; +; This algorithm is split into the extra cycles of the different bits: +; bit7: XOR the received byte to ZL +; bit5: load the new high byte to x4 +; bit6: load the lower xor byte from the table, xor zl and x3, store result in zl (=the new crc low value) +; move x4 (the new high byte) to x3, the crc value is ready +; + + +macro POP_STANDARD ; 18 cycles + pop ZH + pop ZL + pop cnt + pop x5 + pop x3 + pop x2 + pop x1 + pop shift + pop x4 + endm +macro POP_RETI ; 7 cycles + pop YH + pop YL + out SREG, YL + pop YL + endm + +macro CRC_CLEANUP_AND_CHECK + ; the last byte has already been xored with the lower crc byte, we have to do the table lookup and xor + ; x3 is the higher crc byte, zl the lower one + ldi ZH, hi8(usbCrcTableHigh);[+1] get the new high byte from the table + lpm x2, Z ;[+2][+3][+4] + ldi ZH, hi8(usbCrcTableLow);[+5] get the new low xor byte from the table + lpm ZL, Z ;[+6][+7][+8] + eor ZL, x3 ;[+7] xor the old high byte with the value from the table, x2:ZL now holds the crc value + cpi ZL, 0x01 ;[+8] if the crc is ok we have a fixed remainder value of 0xb001 in x2:ZL (see usb spec) + brne ignorePacket ;[+9] detected a crc fault -> paket is ignored and retransmitted by the host + cpi x2, 0xb0 ;[+10] + brne ignorePacket ;[+11] detected a crc fault -> paket is ignored and retransmitted by the host + endm + + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG, YH, [sofError], x4, shift, x1, x2, x3, x5, cnt, ZL, ZH + push YL ;[-28] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-26] + push YL ;[-25] + push YH ;[-23] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-17] + rjmp foundK ;[-16] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-15] +;{3, 5} after falling D- edge, average delay: 4 cycles +;bit0 should be at 30 (2.5 bits) for center sampling. Currently at 4 so 26 cylces till bit 0 sample +;use 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push x4 ;[-14] +; [---] ;[-13] + lds YL, usbInputBufOffset;[-12] used to toggle the two usb receive buffers +; [---] ;[-11] + clr YH ;[-10] + subi YL, lo8(-(usbRxBuf));[-9] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-8] [rx loop init] + push shift ;[-7] +; [---] ;[-6] + ldi shift, 0x80 ;[-5] the last bit is the end of byte marker for the pid receiver loop + clc ;[-4] the carry has to be clear for receipt of pid bit 0 + sbis USBIN, USBMINUS ;[-3] we want two bits K (sample 3 cycles too early) + rjmp haveTwoBitsK ;[-2] + pop shift ;[-1] undo the push from before + pop x4 ;[1] + rjmp waitForK ;[3] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 24 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: + push x1 ;[0] + push x2 ;[2] + push x3 ;[4] crc high byte + ldi x2, 1< jump back and store the byte + ori shift, 0x01 ;[11] invert the last received bit to prevent furhter unstuffing + in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + andi x5, 0xFE ;[1] mark this bit as inverted (will be corrected before storing shift) + eor x1, x2 ;[2] x1 and x2 have to be different because the stuff bit is always a zero + andi x1, USBMASK ;[3] mask the interesting bits + breq stuffErr ;[4] if the stuff bit is a 1-bit something went wrong + mov x1, x2 ;[5] the next bit expects the last state to be in x1 + rjmp didunstuff0 ;[6] + ;[7] jump delay of rjmp didunstuffX + +unstuff1: ;[11] this is the jump delay of breq unstuffX + in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + ori shift, 0x02 ;[1] invert the last received bit to prevent furhter unstuffing + andi x5, 0xFD ;[2] mark this bit as inverted (will be corrected before storing shift) + eor x2, x1 ;[3] x1 and x2 have to be different because the stuff bit is always a zero + andi x2, USBMASK ;[4] mask the interesting bits + breq stuffErr ;[5] if the stuff bit is a 1-bit something went wrong + mov x2, x1 ;[6] the next bit expects the last state to be in x2 + nop2 ;[7] + ;[8] + rjmp didunstuff1 ;[9] + ;[10] jump delay of rjmp didunstuffX + +unstuff2: ;[9] this is the jump delay of breq unstuffX + ori shift, 0x04 ;[10] invert the last received bit to prevent furhter unstuffing + andi x5, 0xFB ;[11] mark this bit as inverted (will be corrected before storing shift) + in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + eor x1, x2 ;[1] x1 and x2 have to be different because the stuff bit is always a zero + andi x1, USBMASK ;[2] mask the interesting bits + breq stuffErr ;[3] if the stuff bit is a 1-bit something went wrong + mov x1, x2 ;[4] the next bit expects the last state to be in x1 + nop2 ;[5] + ;[6] + rjmp didunstuff2 ;[7] + ;[8] jump delay of rjmp didunstuffX + +unstuff3: ;[9] this is the jump delay of breq unstuffX + ori shift, 0x08 ;[10] invert the last received bit to prevent furhter unstuffing + andi x5, 0xF7 ;[11] mark this bit as inverted (will be corrected before storing shift) + in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + eor x2, x1 ;[1] x1 and x2 have to be different because the stuff bit is always a zero + andi x2, USBMASK ;[2] mask the interesting bits + breq stuffErr ;[3] if the stuff bit is a 1-bit something went wrong + mov x2, x1 ;[4] the next bit expects the last state to be in x2 + nop2 ;[5] + ;[6] + rjmp didunstuff3 ;[7] + ;[8] jump delay of rjmp didunstuffX + + + +; the include has to be here due to branch distance restirctions +#define __USE_CRC__ +#include "asmcommon.inc" + + + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies +; 7.5 bit times is 90 cycles. ...there is plenty of time + + +sendNakAndReti: + ldi x3, USBPID_NAK ;[-18] + rjmp sendX3AndReti ;[-17] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov x3, cnt ;[-16] +sendX3AndReti: + ldi YL, 20 ;[-15] x3==r20 address is 20 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, btcnt, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent + +usbSendAndReti: ; 12 cycles until SOP + in x2, USBDDR ;[-12] + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;[-8] port mirror for tx loop + out USBDDR, x2 ;[-6] <- acquire bus + ldi x2, 0 ;[-6] init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;[-5] exor mask + ldi shift, 0x80 ;[-4] sync byte is first byte sent +txByteLoop: + ldi bitcnt, 0x40 ;[-3]=[9] binary 01000000 +txBitLoop: ; the loop sends the first 7 bits of the byte + sbrs shift, 0 ;[-2]=[10] if we have to send a 1 don't change the line state + eor x1, x4 ;[-1]=[11] + out USBOUT, x1 ;[0] + ror shift ;[1] + ror x2 ;[2] transfers the last sent bit to the stuffing history +didStuffN: + nop ;[3] + nop ;[4] + cpi x2, 0xfc ;[5] if we sent six consecutive ones + brcc bitstuffN ;[6] + lsr bitcnt ;[7] + brne txBitLoop ;[8] restart the loop while the 1 is still in the bitcount + +; transmit bit 7 + sbrs shift, 0 ;[9] + eor x1, x4 ;[10] +didStuff7: + ror shift ;[11] + out USBOUT, x1 ;[0] transfer bit 7 to the pins + ror x2 ;[1] move the bit into the stuffing history + cpi x2, 0xfc ;[2] + brcc bitstuff7 ;[3] + ld shift, y+ ;[4] get next byte to transmit + dec cnt ;[5] decrement byte counter + brne txByteLoop ;[7] if we have more bytes start next one + ;[8] branch delay + +;make SE0: + cbr x1, USBMASK ;[8] prepare SE0 [spec says EOP may be 25 to 30 cycles] + lds x2, usbNewDeviceAddr;[9] + lsl x2 ;[11] we compare with left shifted address + out USBOUT, x1 ;[0] <-- out SE0 -- from now 2 bits = 24 cycles until bus idle + subi YL, 20 + 2 ;[1] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;[2] +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[3] + sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< +int main (int argc, char **argv) +{ + int i, j; + for (i=0; i<512; i++){ + unsigned short crc = i & 0xff; + for(j=0; j<8; j++) crc = (crc >> 1) ^ ((crc & 1) ? 0xa001 : 0); + if((i & 7) == 0) printf("\n.byte "); + printf("0x%02x, ", (i > 0xff ? (crc >> 8) : crc) & 0xff); + if(i == 255) printf("\n"); + } + return 0; +} + +// Use the following algorithm to compute CRC values: +ushort computeCrc(uchar *msg, uchar msgLen) +{ + uchar i; + ushort crc = 0xffff; + for(i = 0; i < msgLen; i++) + crc = usbCrcTable16[lo8(crc) ^ msg[i]] ^ hi8(crc); + return crc; +} +*/ + +.balign 256 +usbCrcTableLow: +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 + +; .balign 256 +usbCrcTableHigh: +.byte 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2 +.byte 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04 +.byte 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E +.byte 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8 +.byte 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A +.byte 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC +.byte 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6 +.byte 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10 +.byte 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32 +.byte 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4 +.byte 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE +.byte 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38 +.byte 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA +.byte 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C +.byte 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26 +.byte 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0 +.byte 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62 +.byte 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4 +.byte 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE +.byte 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68 +.byte 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA +.byte 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C +.byte 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76 +.byte 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0 +.byte 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92 +.byte 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54 +.byte 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E +.byte 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98 +.byte 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A +.byte 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C +.byte 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86 +.byte 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 + diff --git a/firmware/usbdrv/usbdrvasm20.inc b/firmware/usbdrv/usbdrvasm20.inc new file mode 100644 index 0000000..303abaf --- /dev/null +++ b/firmware/usbdrv/usbdrvasm20.inc @@ -0,0 +1,360 @@ +/* Name: usbdrvasm20.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Jeroen Benschop + * Based on usbdrvasm16.inc from Christian Starkjohann + * Creation Date: 2008-03-05 + * Tabsize: 4 + * Copyright: (c) 2008 by Jeroen Benschop and OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id: usbdrvasm20.inc 740 2009-04-13 18:23:31Z cs $ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file is the 20 MHz version of the asssembler part of the USB driver. It +requires a 20 MHz crystal (not a ceramic resonator and not a calibrated RC +oscillator). + +See usbdrv.h for a description of the entire driver. + +Since almost all of this code is timing critical, don't change unless you +really know what you are doing! Many parts require not only a maximum number +of CPU cycles, but even an exact number of cycles! +*/ + +#define leap2 x3 +#ifdef __IAR_SYSTEMS_ASM__ +#define nextInst $+2 +#else +#define nextInst .+0 +#endif + +;max stack usage: [ret(2), YL, SREG, YH, bitcnt, shift, x1, x2, x3, x4, cnt] = 12 bytes +;nominal frequency: 20 MHz -> 13.333333 cycles per bit, 106.666667 cycles per byte +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts +;register use in receive loop: +; shift assembles the byte currently being received +; x1 holds the D+ and D- line state +; x2 holds the previous line state +; x4 (leap) is used to add a leap cycle once every three bytes received +; X3 (leap2) is used to add a leap cycle once every three stuff bits received +; bitcnt is used to determine when a stuff bit is due +; cnt holds the number of bytes left in the receive buffer + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG YH, [sofError], bitcnt, shift, x1, x2, x3, x4, cnt + push YL ;[-28] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-26] + push YL ;[-25] + push YH ;[-23] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-19] + rjmp foundK ;[-18] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-16] +;{3, 5} after falling D- edge, average delay: 4 cycles +;bit0 should be at 34 for center sampling. Currently at 4 so 30 cylces till bit 0 sample +;use 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push bitcnt ;[-16] +; [---] ;[-15] + lds YL, usbInputBufOffset;[-14] +; [---] ;[-13] + clr YH ;[-12] + subi YL, lo8(-(usbRxBuf));[-11] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-10] [rx loop init] + push shift ;[-9] +; [---] ;[-8] + ldi shift,0x40 ;[-7] set msb to "1" so processing bit7 can be detected + nop2 ;[-6] +; [---] ;[-5] + ldi bitcnt, 5 ;[-4] [rx loop init] + sbis USBIN, USBMINUS ;[-3] we want two bits K (sample 3 cycles too early) + rjmp haveTwoBitsK ;[-2] + pop shift ;[-1] undo the push from before + pop bitcnt ;[1] + rjmp waitForK ;[3] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 27 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: + push x1 ;[0] + push x2 ;[2] + push x3 ;[4] (leap2) + ldi leap2, 0x55 ;[6] add leap cycle on 2nd,5th,8th,... stuff bit + push x4 ;[7] == leap + ldi leap, 0x55 ;[9] skip leap cycle on 2nd,5th,8th,... byte received + push cnt ;[10] + ldi cnt, USB_BUFSIZE ;[12] [rx loop init] + ldi x2, 1< +#ifndef __IAR_SYSTEMS_ASM__ +# include +#endif + +#define __attribute__(arg) /* not supported on IAR */ + +#ifdef __IAR_SYSTEMS_ASM__ +# define __ASSEMBLER__ /* IAR does not define standard macro for asm */ +#endif + +#ifdef __HAS_ELPM__ +# define PROGMEM __farflash +#else +# define PROGMEM __flash +#endif + +#define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) + +/* The following definitions are not needed by the driver, but may be of some + * help if you port a gcc based project to IAR. + */ +#define cli() __disable_interrupt() +#define sei() __enable_interrupt() +#define wdt_reset() __watchdog_reset() +#define _BV(x) (1 << (x)) + +/* assembler compatibility macros */ +#define nop2 rjmp $+2 /* jump to next instruction */ +#define XL r26 +#define XH r27 +#define YL r28 +#define YH r29 +#define ZL r30 +#define ZH r31 +#define lo8(x) LOW(x) +#define hi8(x) (((x)>>8) & 0xff) /* not HIGH to allow XLINK to make a proper range check */ + +/* Depending on the device you use, you may get problems with the way usbdrv.h + * handles the differences between devices. Since IAR does not use #defines + * for MCU registers, we can't check for the existence of a particular + * register with an #ifdef. If the autodetection mechanism fails, include + * definitions for the required USB_INTR_* macros in your usbconfig.h. See + * usbconfig-prototype.h and usbdrv.h for details. + */ + +/* ------------------------------------------------------------------------- */ +#elif __CODEVISIONAVR__ /* check for CodeVision AVR */ +/* ------------------------------------------------------------------------- */ +/* This port is not working (yet) */ + +/* #define F_CPU _MCU_CLOCK_FREQUENCY_ seems to be defined automatically */ + +#include +#include + +#define __attribute__(arg) /* not supported on IAR */ + +#define PROGMEM __flash +#define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) + +#ifndef __ASSEMBLER__ +static inline void cli(void) +{ + #asm("cli"); +} +static inline void sei(void) +{ + #asm("sei"); +} +#endif +#define _delay_ms(t) delay_ms(t) +#define _BV(x) (1 << (x)) +#define USB_CFG_USE_SWITCH_STATEMENT 1 /* macro for if() cascase fails for unknown reason */ + +#define macro .macro +#define endm .endmacro +#define nop2 rjmp .+0 /* jump to next instruction */ + +/* ------------------------------------------------------------------------- */ +#else /* default development environment is avr-gcc/avr-libc */ +/* ------------------------------------------------------------------------- */ + +#include +#ifdef __ASSEMBLER__ +# define _VECTOR(N) __vector_ ## N /* io.h does not define this for asm */ +#else +# include +#endif + +#if USB_CFG_DRIVER_FLASH_PAGE +# define USB_READ_FLASH(addr) pgm_read_byte_far(((long)USB_CFG_DRIVER_FLASH_PAGE << 16) | (long)(addr)) +#else +# define USB_READ_FLASH(addr) pgm_read_byte(addr) +#endif + +#define macro .macro +#define endm .endm +#define nop2 rjmp .+0 /* jump to next instruction */ + +#endif /* development environment */ + +/* for conveniecne, ensure that PRG_RDB exists */ +#ifndef PRG_RDB +# define PRG_RDB(addr) USB_READ_FLASH(addr) +#endif +#endif /* __usbportability_h_INCLUDED__ */