Add support for 18 MHz Clock
authorPeter Henn <Peter.Henn@web.de>
Fri, 30 May 2014 20:45:33 +0000 (20:45 +0000)
committerPeter Henn <Peter.Henn@web.de>
Fri, 30 May 2014 20:45:33 +0000 (20:45 +0000)
- integrate usbdrv from 2012-07-09, which support also 18 MHz clock
- add ATmega328p with 18 MHz

25 files changed:
Makefile
bin/firmware/Makefile328
bin/firmware/usbasp.atmega328p-18MHz.hex [new file with mode: 0644]
firmware/Makefile
firmware/usbdrv/Changelog.txt
firmware/usbdrv/CommercialLicense.txt
firmware/usbdrv/USB-ID-FAQ.txt
firmware/usbdrv/USB-IDs-for-free.txt
firmware/usbdrv/asmcommon.inc
firmware/usbdrv/oddebug.c
firmware/usbdrv/oddebug.h
firmware/usbdrv/usbconfig-prototype.h
firmware/usbdrv/usbdrv.c
firmware/usbdrv/usbdrv.h
firmware/usbdrv/usbdrvasm.S
firmware/usbdrv/usbdrvasm.asm
firmware/usbdrv/usbdrvasm12.inc
firmware/usbdrv/usbdrvasm128.inc
firmware/usbdrv/usbdrvasm15.inc
firmware/usbdrv/usbdrvasm16.inc
firmware/usbdrv/usbdrvasm165.inc
firmware/usbdrv/usbdrvasm18-crc.inc
firmware/usbdrv/usbdrvasm18.inc [new file with mode: 0644]
firmware/usbdrv/usbdrvasm20.inc
firmware/usbdrv/usbportability.h

index 64bb087..1dbe4b8 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -20,6 +20,7 @@ all:
        $(MAKE) F_CPU=12000000 DEVICE=atmega88 do_firmware
        $(MAKE) F_CPU=12000000 DEVICE=atmega328p do_firmware
        $(MAKE) F_CPU=16000000 DEVICE=atmega328p do_firmware
+       $(MAKE) F_CPU=18000000 DEVICE=atmega328p do_firmware
 
 help:
        @echo "Usage:"
index ff05ef8..3a71530 100644 (file)
@@ -7,11 +7,18 @@ ifeq ($(F_CPU), 12000000)
        $(FLASHER) -B 1 -U flash:w:usbasp.atmega328p-12MHz.hex
 else ifeq ($(F_CPU), 16000000)
        $(FLASHER) -B 1 -U flash:w:usbasp.atmega328p-16MHz.hex
+else ifeq ($(F_CPU), 18000000)
+       $(FLASHER) -B 1 -U flash:w:usbasp.atmega328p-18MHz.hex
 else
        $(error setting of F_CPU is not supported.)
 endif
 
 fuses:
+ifeq ($(F_CPU), 18000000)
+       $(FLASHER) -B 300 -U lfuse:w:0xe7:m -U hfuse:w:0xd9:m -U efuse:w:0x05:m
+else
        $(FLASHER) -B 300 -U lfuse:w:0xef:m -U hfuse:w:0xd9:m -U efuse:w:0x05:m
+endif
+
 shell:
        $(FLASHER) -B 200 -t
diff --git a/bin/firmware/usbasp.atmega328p-18MHz.hex b/bin/firmware/usbasp.atmega328p-18MHz.hex
new file mode 100644 (file)
index 0000000..6a1889e
--- /dev/null
@@ -0,0 +1,305 @@
+:100000000C945D000C94CA010C947A000C947A0054
+:100010000C947A000C947A000C947A000C947A0078
+:100020000C947A000C947A000C947A000C947A0068
+:100030000C947A000C947A000C947A000C947A0058
+:100040000C947A000C947A000C947A000C947A0048
+:100050000C947A000C947A000C947A000C947A0038
+:100060000C947A000C947A000902120001010080BD
+:100070001909040000000000000012011001FF0037
+:100080000008C016DC050401010200010E03550042
+:10009000530042006100730070001C03770077007A
+:1000A00077002E00660069007300630068006C0032
+:1000B0002E00640065000403090411241FBECFEF65
+:1000C000D8E0DEBFCDBF11E0A0E0B1E0E0EFF2E1AB
+:1000D00002C005900D92A230B107D9F711E0A2E05D
+:1000E000B1E001C01D92AC34B107E1F70E94640990
+:1000F0000C9476090C940000CF93DF936091280153
+:10010000635067FD13C080912501CCE0D0E0C81B8F
+:10011000D109C45DDE4F809124018D3209F458C0AD
+:100120008091020187FD9DC01092280180910001FD
+:1001300084FF41C0609101016F3F09F43CC0693008
+:1001400008F470C06850609301018091180198E82C
+:1001500089278093180168E08091020187FD1DC006
+:10016000409126015091270186FF72C0FA01862F27
+:10017000A9E1B1E094919D9331968150D9F7262F52
+:10018000215030E02F5F3F4F240F351F3093270160
+:1001900020932601C62FCC5F50C089E191E00E94D8
+:1001A0002408682F893008F4A4C08FEF80930101E0
+:1001B000CEE1C093000194E183B1837031F491509A
+:1001C000D9F71092290110922301DF91CF91089560
+:1001D000683009F0A9CF83EC809318018AE58093F9
+:1001E0000001109202018881807609F045C09A8151
+:1001F00010922101898181114AC01092220121E2CD
+:1002000031E082E030932701209326018F3FC1F136
+:100210009F81911104C09E81981708F4892F8093C3
+:10022000010182CF109201018091180198E889277D
+:1002300080931801611190CFC4E089E191E00E94A0
+:10024000C601CC3009F4B5CF8FEF80930101B1CF57
+:10025000DA01862FE9E1F1E09D9191938150E1F778
+:100260008ECFCE010E9494088F3FF9F0882309F4C5
+:100270005BCF1092010158CFCE010E947006C6CF0D
+:10028000988197FD16C090E890930201C8CF853001
+:1002900091F0863001F18830D1F0893091F021E27F
+:1002A00031E08A3021F180E0ADCF8EE18093000112
+:1002B0003BCF8E81E8CF9093290121E231E080E0AD
+:1002C000A1CF90932B0121E231E080E09BCF2BE284
+:1002D00031E081E097CF8B81813001F18230B1F044
+:1002E000833051F080E090E4909302018FCF81E061
+:1002F00089CFC82FCC5FA1CF911118C086EB90E0B9
+:10030000909327018093260184E0EDCF88E690E06A
+:10031000909327018093260182E1E5CF8AE790E060
+:10032000909327018093260182E1DDCF913051F037
+:100330009230C1F68CE890E09093270180932601DB
+:100340008EE0D1CF8AE990E0909327018093260137
+:100350008CE1C9CFE9E6F0E0808183608083E89A90
+:100360000895A82FB92F80E090E041E050EA609511
+:1003700030E009C02D9182279795879510F084274A
+:100380009527305EC8F36F5FA8F30895EADF8D9379
+:100390009D930895CF93CFB7CF93DF93C395189BC9
+:1003A000E9F7189B11C0189B0FC0189B0DC0189B34
+:1003B0000BC0189B09C0189B07C0189B05C0189B51
+:1003C00003C0189B01C09CC05F93C0912501DD272D
+:1003D000C45DDE4F2F9320E88894189B03C02F91B3
+:1003E0005F91DFCF0F931F934F9312E06F933F9373
+:1003F0003BE003B10370B1F1102710FD089427957D
+:1004000000005FEF102FA8F7522703B14FEF10271E
+:1004100010FB20F9122F197F39F1315020F1599337
+:1004200013B10370F9F01370E9F0012700FB21F913
+:10043000022F037F19F1000003B10370A1F0102710
+:1004400010FB22F9122F177E11F100C0000013B12A
+:10045000137049F0012700FB23F9022F0F7C01F1F3
+:100460000000BEC02AC025C00370B9F2216013B1DC
+:100470004E7F01270370B9F3012FCFCF03B1226064
+:100480004D7F1027137079F3102F00C0D4CF246054
+:100490004B7F13B10127037031F3012F00C0D5CF7B
+:1004A0002860477F03B110271370E9F2102F00C0B6
+:1004B000D7CF11E01CBB002717C03B503195C31BA1
+:1004C000D04011E01CBB0881033CF9F00B34E9F08B
+:1004D000209123011981110F1213EDCF093651F12B
+:1004E0000D3211F0013E39F700932A013F916F91CF
+:1004F0004F911F910F912F915F91CCB3C0FD4ECFC3
+:10050000DF91CF91CFBFCF91189520912A0122235F
+:1005100069F3109128011123D9F43430DAF03093C3
+:10052000280120932401109125013BE0311B3093D9
+:10053000250110C000912801013054F40AE53091E2
+:10054000000134FD08C000930001C8E1D1E007C0FC
+:100550004AE502C032ED432FC4E1D0E032E014B1ED
+:100560001360289A05B114B910E053E020E860E464
+:1005700020FF052705B927951795000000001C3FAF
+:1005800020F56695A9F720FF0527279505B917954A
+:100590001C3F00F529913A9551F70C7F10912901E4
+:1005A000110F05B9C651D04011F01093230111E08D
+:1005B0001CBB016014B11C7F402F4C7F54E05A9546
+:1005C000F1F705B914B945B991CF052710E000C07E
+:1005D00005B9D3CF052710E08894221FD6CF69CF65
+:1005E00003B10370E1F3102710FB24F9122F1F79D8
+:1005F00019F100C0000013B10000012700FB25F92C
+:10060000022F0F7311F100C00000000003B110278A
+:1006100010FB26F9122F1E7711F100C00000000018
+:10062000000013B1012700FB27F9022F0C7F01F115
+:100630004227542F0000E9CE20614F7E13B10127DD
+:10064000037001F1012F00C0D4CF000020624F7D64
+:1006500003B110271370B1F0102F0000D4CF00C0E9
+:1006600020644F7B13B10127037061F0012FD5CFB8
+:100670000000000020684F7703B11027137011F0BD
+:10068000102FD6CFF0CE682F58E080E0709148014F
+:100690002091470167FD1EC02B98660F880F1C999B
+:1006A0008F5F2D9A36B5472F415030F096B5931B8A
+:1006B0009217E0F34150D0F72D9836B5472F4150AF
+:1006C00030F096B5931B9217E0F34150D0F751509C
+:1006D00009F708952B9AE1CF8EBD0DB407FEFDCF2B
+:1006E0008EB5089521E196958795779567952A951A
+:1006F000D1F7209146012617D9F060934601E09189
+:100700004301F09144018DE40995E0914301F0919A
+:10071000440180E00995E0914301F091440180910A
+:1007200046010995E0914301F091440180E009946C
+:100730000895809145018CBD809142018DBD089541
+:100740008823B1F0893008F04AC023E433E03093C5
+:1007500044012093430191E090934801853001F1D9
+:10076000C0F08730A1F168F589E0809347010895D2
+:100770008CE693E0909344018093430110924201F0
+:1007800081E0809347018093480182E58093450191
+:100790000895833001F140F084E280934701089589
+:1007A00082E1809347010895823039F080E9809397
+:1007B000470182E080934801089580E980934701D2
+:1007C0000895883099F782E080934701089585E085
+:1007D00080934701089588E48093470108952CE6AB
+:1007E00033E030934401209343011092420191E0A1
+:1007F0009093470190934801893049F030F28B3053
+:1008000051F08C3011F681E580934501089583E520
+:1008100080934501089582E58093450190934201BC
+:10082000089526B53091480190914701315030F03C
+:1008300086B5821B8917E0F33150D0F7089584B153
+:100840008C6284B92A982D9826B530914801432F9F
+:1008500090914701415030F086B5821B8917E0F333
+:100860004150D0F72A9A26B5315030F086B5821B18
+:100870008917E0F33150D0F72A9880914301909185
+:1008800044018C56934019F01092460108958091CE
+:1008900045018CBD809142018DBD109246010895A5
+:1008A00084B1837D84B985B1837D85B91CBC0895ED
+:1008B000CF93DF93C0E2E0914301F09144018CEAD1
+:1008C0000995E0914301F091440183E50995E09198
+:1008D0004301F091440180E00995D82FE091430154
+:1008E000F091440180E00995D33509F43AC01CBC6D
+:1008F00026B530914801432F90914701415030F087
+:1009000086B5821B8917E0F34150D0F72A9A26B5A5
+:10091000432F415030F086B5821B8917E0F34150D8
+:10092000D0F72A9826B5315030F086B5821B89174A
+:10093000E0F33150D0F7E0914301F091440183E0BE
+:10094000EC36F80739F0C15009F0B9CF81E0DF91FA
+:10095000CF910895809145018CBD809142018DBD5C
+:10096000F2CF80E0DF91CF910895CF92DF92EF92A6
+:10097000FF926B017C010E947203D701C601817056
+:100980009927AA27BB27880F880F880FE09143017A
+:10099000F091440180620995D701C60139E0B6950E
+:1009A000A795979587953A95D1F7E0914301F091F6
+:1009B00044010995D701C601B695A79597958795E6
+:1009C000E0914301F09144010995E0914301F091D8
+:1009D000440180E0FF90EF90DF90CF900994CF9298
+:1009E000DF92EF92FF920F931F93CF93DF936B01F0
+:1009F0007C01C42FD22F0E947203970186010170DF
+:100A0000112722273327802F880F880F880FE09126
+:100A10004301F091440180640995D701C60159E072
+:100A2000B695A795979587955A95D1F7E09143018B
+:100A3000F09144010995D701C601B695A795979500
+:100A40008795E0914301F09144010995E0914301BC
+:100A5000F09144018C2F0995DD23B9F0CF3791F047
+:100A6000D6B5CEE1C701B6010E94B5048F3769F44F
+:100A700086B58D1B8B3510F0D6B5C150C111F2CFA4
+:100A800081E004C08FE00E94FB0580E0DF91CF9100
+:100A90001F910F91FF90EF90DF90CF900895CF922C
+:100AA000DF92EF92FF920F931F93CF93DF931F92EA
+:100AB000CDB7DEB76B017C0149830E947203E091E0
+:100AC0004301F09144018CE40995D701C60179E016
+:100AD000B695A795979587957A95D1F7E0914301BB
+:100AE000F09144010995D701C601B695A795979550
+:100AF0008795E0914301F09144010995E09143010C
+:100B0000F091440180E0099549814F3FE9F006B535
+:100B10001EE1C701B6010E94B5048F3F99F486B566
+:100B2000801B8B3510F006B511501111F2CF81E00A
+:100B30000F90DF91CF911F910F91FF90EF90DF9079
+:100B4000CF90089580E0F4CF8FE00E94FB0580E015
+:100B5000EFCF1F93CF93DF931F92CDB7DEB7182F40
+:100B6000E0914301F091440180EA99830995E09175
+:100B70004301F09144019981892F0995E091430146
+:100B8000F0914401812F0995E0914301F0914401D6
+:100B900080E00F90DF91CF911F9109941F93CF9325
+:100BA000DF9300D0CDB7DEB7182FE0914301F0916D
+:100BB000440180EC6A8399830995E0914301F091A7
+:100BC00044019981892F0995E0914301F0914401F5
+:100BD000812F0995E0914301F09144016A81862FAC
+:100BE00009958EE10E94FB0580E00F900F90DF9148
+:100BF000CF911F910895882349F030E026B596B52E
+:100C0000921B9A35E0F33F5F3813F8CF0895259A89
+:100C100023982B9A50E217D05A95E9F70895AC0122
+:100C200088E605D0842F03D089E601D0852F0FD028
+:100C300028E030E0382780FB869506D02A95D1F74A
+:100C400030FB02D000D0689423982B9A16F02B9892
+:100C5000239AE0914A01F0914B013197F0F72D9AD8
+:100C6000E3B1E3FBE0914A01F0914B013197F0F7DA
+:100C70002D98089520ECE7DF46F42A95E1F780E00F
+:100C80002AE1E5DF2A95E9F7DECF28E030E0DBDF77
+:100C9000869587F938272A95D1F7D5DF27F93227A6
+:100CA00072F3D1DFD0CFDB01742FB9DF84E2BFDF75
+:100CB000E1DF8D937A95D1F70895DB01742FAFDFD3
+:100CC00083EFB5DF8DE1B3DF84E6B1DF8D91AFDF78
+:100CD00082E7ADDFCFDF8078D9F77A9589F708957D
+:100CE000CF93DF93EC018981813089F1823009F45F
+:100CF000ABC0833009F461C08430B1F1873009F4AE
+:100D000082C0853009F402C1863009F4A2C088305F
+:100D100009F4D5C0893009F4FFC08A3009F42AC12A
+:100D20008B3009F456C18C3009F469C18D3009F457
+:100D300080C18E3009F483C18F3009F4FEC0803148
+:100D400009F41FC18F3709F439C180E02DC0329BEF
+:100D500056C0809103010E94A003109204014198A3
+:100D60000E941F0480E020C080910401811110C006
+:100D70005B8140E08A81482B662757FD6095762F7E
+:100D800040930D0150930E0160930F017093100179
+:100D90009F8180E02E81822B90931201809311011C
+:100DA00082E0809313018FEF25E031E0309327013B
+:100DB00020932601DF91CF910895E0914301F091B6
+:100DC00044018A81099580930501E0914301F091E6
+:100DD00044018B81099580930601E0914301F091D4
+:100DE00044018C81099580930701E0914301F091C2
+:100DF00044018D8109958093080184E0D5CF85E079
+:100E00000E94A003AACF80910401811110C05B81D0
+:100E100040E08A81482B662757FD6095762F4093E6
+:100E20000D0150930E0160930F01709310019F818B
+:100E300080E02E81822B909312018093110183E038
+:100E4000809313018FEFB0CF0E945004419A80E04D
+:100E5000ABCF80910401811110C09B8180E02A8179
+:100E6000822BAA2797FDA095BA2F80930D0190930E
+:100E70000E01A0930F01B09310013C812D81822FB0
+:100E80008F7080931601822F807F40E1849FC00184
+:100E90001124830F911D909315018093140120FD5F
+:100EA000809317019F8180E02E81822B9093120105
+:100EB0008093110181E0809313018FEF75CF8091B2
+:100EC0000401811110C09B8180E02A81822BAA2716
+:100ED00097FDA095BA2F80930D0190930E01A093DA
+:100EE0000F01B0931001109215011092140110928D
+:100EF00016019F8180E02E81822B909312018093B6
+:100F0000110184E0809313018FEF4ECF0E945804AB
+:100F10008093050181E048CF81E0809304018A81BC
+:100F20009B81AC81BD8180930D0190930E01A093B4
+:100F30000F01B093100180E037CF9B8180E02A81C0
+:100F4000822BAA2797FDA095BA2F80930D0190932D
+:100F50000E01A0930F01B09310019F8180E02E81BC
+:100F6000822B909312018093110185E080931301ED
+:100F70008FEF1ACF8A81809303011092050181E0DF
+:100F800013CF9B8180E02A81822BAA2797FDA09511
+:100F9000BA2F80930D0190930E01A0930F01B0938F
+:100FA00010019F8180E02E81822B9093120180930B
+:100FB000110186E0809313018FEFF6CE81E08093DC
+:100FC000050110920601109207011092080184E0B9
+:100FD000EBCE9B8180E02A81822B90934B01809302
+:100FE0004A012A9A229A83E00E94FB052A98419896
+:100FF00080E10E94FB050E94070680E0D5CE80ECD0
+:101000000E94170680E00E9417068AE00E94FB05F6
+:101010002A9A85E00E94FB052A9885E00E94FB053C
+:1010200084B1837D84B985B1837D85B9419A80E09F
+:10103000BBCE0E943A068093050181E0B5CE8A813D
+:101040000E94170680E0B0CE0F931F93CF93DF93DB
+:10105000582F792F062F20911301322F3250323022
+:1010600050F0253009F443C00FEF802FDF91CF916E
+:101070001F910F910895662391F180910D01909138
+:101080000E01A0910F01B0911001C52FD72F10E0D4
+:101090001CC00E94A905888380910D0190910E01CA
+:1010A000A0910F01B09110010196A11DB11D809377
+:1010B0000D0190930E01A0930F01B09310011F5FDB
+:1010C0002196101751F020911301223011F7BC0125
+:1010D000CD010E94B5048883DFCF083030F610922E
+:1010E0001301802FDF91CF911F910F910895462F0B
+:1010F000682F80910D0190910E010E9453068091FE
+:101100000D0190910E01A0910F01B0911001800F7F
+:10111000911DA11DB11D80930D0190930E01A0930F
+:101120000F01B0931001A1CFFF920F931F93CF93A4
+:10113000DF93382F792F162F20911301213071F072
+:10114000243061F0263009F490C0FF24FA948F2DEA
+:10115000DF91CF911F910F91FF900895112309F412
+:10116000B1C080910D0190910E01A0910F01B0913D
+:101170001001C32FD72F00E0F12C50C02091140193
+:1011800030911501232B09F053C021E04881BC01A7
+:10119000CD010E94EF0420911101309112012150E4
+:1011A00031093093120120931101232BE9F410929D
+:1011B00013018091160181FF38C02091170130E0A2
+:1011C00080911401909115012817390771F16091F0
+:1011D0000D0170910E0180910F01909110014881D5
+:1011E0000E944F05FF24F39480910D0190910E0110
+:1011F000A0910F01B09110010196A11DB11D809326
+:101200000D0190930E01A0930F01B09310010F5F99
+:101210002196011709F49BCF20911301213009F485
+:10122000ADCF68810E94CE05B6CFFF24F394DCCF0A
+:1012300020E04881BC01CD010E94EF04809117019C
+:101240008150809317018111A6CF60910D0170919B
+:101250000E0180910F019091100148810E944F056D
+:10126000809114018093170196CF462F682F8091AB
+:101270000D0190910E010E945D0680910D019091EB
+:101280000E01A0910F01B0911001810F911DA11DC0
+:10129000B11D80930D0190930E01A0930F01B093A7
+:1012A00010018091110190911201811B910990937D
+:1012B000120180931101892B29F410921301FF244C
+:1012C000F39445CFF12C43CF1BB815B88BEF8AB9F7
+:1012D0008FEF84B914B883E087B99EEF98B985BDC4
+:1012E0000E94AA0178940E947C00FDCFF894FFCF61
+:0212F0005AFFA3
+:00000001FF
index fd422b1..cdf9d0b 100755 (executable)
@@ -6,16 +6,17 @@
 #   20140329   Peter Henn           F_CPU parameter added
 #
 
-# TARGET=atmega8    HFUSE=0xc9  LFUSE=0xef
+# TARGET=atmega8    HFUSE=0xc9  LFUSE=0xef F_CPU=12000000
+# TARGET=atmega8    HFUSE=0xc9  LFUSE=0xef F_CPU=16000000
 # TARGET=atmega48   HFUSE=0xdd  LFUSE=0xff
 # TARGET=atmega328  HFUSE=0xd9  LFUSE=0xef EFUSE=0x05 F_CPU=12000000
 # TARGET=atmega328  HFUSE=0xd9  LFUSE=0xef EFUSE=0x05 F_CPU=16000000
+# TARGET=atmega328  HFUSE=0xd9  LFUSE=0xe7 EFUSE=0x05 F_CPU=18000000
 # TARGET=at90s2313
-TARGET=atmega328p
-HFUSE=0xd9
+TARGET=atmega8
+HFUSE=0xc9
 LFUSE=0xef
-EFUSE=0x05
-F_CPU=16000000
+F_CPU=12000000
 
 # ISP=bsd      PORT=/dev/parport0
 # ISP=ponyser  PORT=/dev/ttyS1
index 5c6354a..79b5215 100644 (file)
@@ -306,3 +306,24 @@ Scroll down to the bottom to see the most recent changes.
     endpoint now.
 
 * Release 2010-07-15
+
+  - Fixed bug in usbDriverSetup() which prevented descriptor sizes above 255
+    bytes.
+  - Avoid a compiler warning for unused parameter in usbHandleResetHook() when
+    compiler option -Wextra is enabled.
+  - Fixed wrong hex value for some IDs in USB-IDs-for-free.txt.
+  - Keep a define for USBATTR_BUSPOWER, although the flag does not exist
+    in USB 1.1 any more. Set it to 0. This is for backward compatibility.
+
+* Release 2012-01-09
+
+  - Define a separate (defined) type for usbMsgPtr so that projects using a
+    tiny memory model can define it to an 8 bit type in usbconfig.h. This
+    change also saves a couple of bytes when using a scalar 16 bit type.
+  - Inserted "const" keyword for all PROGMEM declarations because new GCC
+    requires it.
+  - Fixed problem with dependence of usbportability.h on usbconfig.h. This
+    problem occurred with IAR CC only.
+  - Prepared repository for github.com.
+
+* Release 2012-12-06
\ No newline at end of file
index 65bdb4e..8bd853d 100644 (file)
@@ -1,5 +1,5 @@
 V-USB Driver Software License Agreement
-Version 2009-08-03
+Version 2012-07-09
 
 THIS LICENSE AGREEMENT GRANTS YOU CERTAIN RIGHTS IN A SOFTWARE. YOU CAN
 ENTER INTO THIS AGREEMENT AND ACQUIRE THE RIGHTS OUTLINED BELOW BY PAYING
@@ -37,10 +37,10 @@ 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.
+Jason Kotzin (now flirc.tv, Inc.). 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
index d1de8fb..a4a6bd6 100644 (file)
@@ -1,4 +1,4 @@
-Version 2009-08-22
+Version 2012-07-09
 
 ==========================
 WHY DO WE NEED THESE IDs?
@@ -107,8 +107,8 @@ 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.
+Kotzin (now flirc.tv, Inc.). Both VID owners have received their Vendor-ID
+directly from usb.org.
 
 
 =========================================================================
index 2f4d59a..d46517d 100644 (file)
@@ -86,8 +86,9 @@ 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).
+number, unless ONLY the operating system's default class driver is used.
+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
@@ -108,6 +109,11 @@ 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/).
 
+(7) If ONLY the operating system's default class driver is used, e.g. for
+mice, keyboards, joysticks, CDC or MIDI devices and no discrimination by an
+application is needed, the serial number may be omitted.
+
+
 Table if IDs for discrimination by serial number string:
 
 PID dec (hex)  | VID dec (hex) | Description of use
@@ -121,11 +127,11 @@ PID dec (hex)  | VID dec (hex) | Description of use
 ---------------+---------------+-------------------------------------------
 10203 (0x27db) | 5824 (0x16c0) | For USB Keyboards
 ---------------+---------------+-------------------------------------------
-10204 (0x27db) | 5824 (0x16c0) | For USB Joysticks
+10204 (0x27dc) | 5824 (0x16c0) | For USB Joysticks
 ---------------+---------------+-------------------------------------------
-10205 (0x27dc) | 5824 (0x16c0) | For CDC-ACM class devices (modems)
+10205 (0x27dd) | 5824 (0x16c0) | For CDC-ACM class devices (modems)
 ---------------+---------------+-------------------------------------------
-10206 (0x27dd) | 5824 (0x16c0) | For MIDI class devices
+10206 (0x27de) | 5824 (0x16c0) | For MIDI class devices
 ---------------+---------------+-------------------------------------------
 
 
index 07d692b..d2a4f7c 100644 (file)
@@ -5,7 +5,6 @@
  * 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
index 945457c..19bf142 100644 (file)
@@ -5,7 +5,6 @@
  * 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.c 692 2008-11-07 15:07:40Z cs $
  */
 
 #include "oddebug.h"
index d61309d..851f84d 100644 (file)
@@ -5,7 +5,6 @@
  * 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__
index 847710e..22dd9e8 100644 (file)
@@ -5,7 +5,6 @@
  * 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: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
  */
 
 #ifndef __usbconfig_h_included__
@@ -356,6 +355,15 @@ section at the end of this file).
 #define USB_CFG_DESCR_PROPS_HID_REPORT              0
 #define USB_CFG_DESCR_PROPS_UNKNOWN                 0
 
+
+//#define usbMsgPtr_t unsigned short
+/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We may define it to
+ * a scalar type here because gcc generates slightly shorter code for scalar
+ * arithmetics than for pointer arithmetics. Remove this define for backward
+ * type compatibility or define it to an 8 bit type if you use data in RAM only
+ * and all RAM is below 256 bytes (tiny memory model in IAR CC).
+ */
+
 /* ----------------------- Optional MCU Description ------------------------ */
 
 /* The following configurations have working defaults in usbdrv.h. You
index e37727c..6c61e3b 100644 (file)
@@ -5,10 +5,8 @@
  * 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.c 791 2010-07-15 15:56:13Z cs $
  */
 
-#include "usbportability.h"
 #include "usbdrv.h"
 #include "oddebug.h"
 
@@ -45,7 +43,7 @@ uchar       usbCurrentDataToken;/* when we check data toggling to ignore duplica
 #endif
 
 /* USB status registers / not shared with asm code */
-uchar               *usbMsgPtr;     /* data to transmit next -- ROM or RAM address */
+usbMsgPtr_t         usbMsgPtr;      /* data to transmit next -- ROM or RAM address */
 static usbMsgLen_t  usbMsgLen = USB_NO_MSG; /* remaining number of bytes */
 static uchar        usbMsgFlags;    /* flag values see below */
 
@@ -221,7 +219,7 @@ static inline void  usbResetStall(void)
 static void usbGenericSetInterrupt(uchar *data, uchar len, usbTxStatus_t *txStatus)
 {
 uchar   *p;
-char    i;
+schar   i;
 
 #if USB_CFG_IMPLEMENT_HALT
     if(usbTxLen1 == USBPID_STALL)
@@ -301,7 +299,7 @@ USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len)
             len = usbFunctionDescriptor(rq);        \
         }else{                                      \
             len = USB_PROP_LENGTH(cfgProp);         \
-            usbMsgPtr = (uchar *)(staticName);      \
+            usbMsgPtr = (usbMsgPtr_t)(staticName);  \
         }                                           \
     }
 
@@ -361,7 +359,8 @@ uchar       flags = USB_FLG_MSGPTR_IS_ROM;
  */
 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 */
+usbMsgLen_t len = 0;
+uchar   *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];
@@ -408,7 +407,7 @@ uchar   index = rq->wIndex.bytes[0];
     SWITCH_DEFAULT                          /* 7=SET_DESCRIPTOR, 12=SYNC_FRAME */
         /* Should we add an optional hook here? */
     SWITCH_END
-    usbMsgPtr = dataPtr;
+    usbMsgPtr = (usbMsgPtr_t)dataPtr;
 skipMsgPtrAssignment:
     return len;
 }
@@ -498,7 +497,8 @@ static uchar usbDeviceRead(uchar *data, uchar len)
         }else
 #endif
         {
-            uchar i = len, *r = usbMsgPtr;
+            uchar i = len;
+            usbMsgPtr_t 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 */
@@ -507,7 +507,8 @@ static uchar usbDeviceRead(uchar *data, uchar len)
                 }while(--i);
             }else{  /* RAM data */
                 do{
-                    *data++ = *r++;
+                    *data++ = *((uchar *)r);
+                    r++;
                 }while(--i);
             }
             usbMsgPtr = r;
@@ -557,6 +558,8 @@ uchar           isReset = !notResetState;
         USB_RESET_HOOK(isReset);
         wasReset = isReset;
     }
+#else
+    notResetState = notResetState;  // avoid compiler warning
 #endif
 }
 
index e8cc4b3..113854e 100644 (file)
@@ -5,13 +5,10 @@
  * 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:
@@ -118,11 +115,28 @@ USB messages, even if they address another (low-speed) device on the same bus.
 
 */
 
+
+#ifdef __cplusplus
+// This header should be included as C-header from C++ code. However if usbdrv.c
+// is incorporated into a C++ module with an include, function names are mangled
+// and this header must be parsed as C++ header, too. External modules should be
+// treated as C, though, because they are compiled separately as C code.
+extern "C" {
+#endif
+
+#include "usbconfig.h"
+#include "usbportability.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+
 /* ------------------------------------------------------------------------- */
 /* --------------------------- Module Interface ---------------------------- */
 /* ------------------------------------------------------------------------- */
 
-#define USBDRV_VERSION  20100715
+#define USBDRV_VERSION  20121206
 /* 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
@@ -163,6 +177,17 @@ USB messages, even if they address another (low-speed) device on the same bus.
  */
 #define USB_NO_MSG  ((usbMsgLen_t)-1)   /* constant meaning "no message" */
 
+#ifndef usbMsgPtr_t
+#define usbMsgPtr_t uchar *
+#endif
+/* Making usbMsgPtr_t a define allows the user of this library to define it to
+ * an 8 bit type on tiny devices. This reduces code size, especially if the
+ * compiler supports a tiny memory model.
+ * The type can be a pointer or scalar type, casts are made where necessary.
+ * Although it's paradoxical, Gcc 4 generates slightly better code for scalar
+ * types than for pointers.
+ */
+
 struct usbRequest;  /* forward declaration */
 
 USB_PUBLIC void usbInit(void);
@@ -178,7 +203,7 @@ USB_PUBLIC void usbPoll(void);
  * Please note that debug outputs through the UART take ~ 0.5ms per byte
  * at 19200 bps.
  */
-extern uchar *usbMsgPtr;
+extern usbMsgPtr_t 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.
@@ -390,13 +415,13 @@ extern volatile schar   usbRxLen;
  * about the various methods to define USB descriptors. If you do nothing,
  * the default descriptors will be used.
  */
-#define USB_PROP_IS_DYNAMIC     (1 << 14)
+#define USB_PROP_IS_DYNAMIC     (1u << 14)
 /* If this property is set for a descriptor, usbFunctionDescriptor() will be
  * used to obtain the particular descriptor. Data directly returned via
  * usbMsgPtr are FLASH data by default, combine (OR) with USB_PROP_IS_RAM to
  * return RAM data.
  */
-#define USB_PROP_IS_RAM         (1 << 15)
+#define USB_PROP_IS_RAM         (1u << 15)
 /* If this property is set for a descriptor, the data is read from RAM
  * memory instead of Flash. The property is used for all methods to provide
  * external descriptors.
@@ -719,6 +744,7 @@ typedef struct usbRequest{
 #define USBDESCR_HID_PHYS       0x23
 
 //#define USBATTR_BUSPOWER        0x80  // USB 1.1 does not define this value any more
+#define USBATTR_BUSPOWER        0
 #define USBATTR_SELFPOWER       0x40
 #define USBATTR_REMOTEWAKE      0x20
 
index 2e8097d..80f4970 100644 (file)
@@ -5,7 +5,6 @@
  * 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 $
  */
 
 /*
@@ -146,7 +145,8 @@ RTMODEL "__rt_version", "3"
 #if USB_USE_FAST_CRC
 
 ; This implementation is faster, but has bigger code size
-; Thanks to Slawomir Fras (BoskiDialer) for this code!
+; Thanks to Slawomir Fras (BoskiDialer) for this code and to Shay Green for
+; even further optimizations!
 ; It implements the following C pseudo-code:
 ; unsigned table(unsigned char x)
 ; {
@@ -176,35 +176,29 @@ RTMODEL "__rt_version", "3"
 ;   resCrc  r24+r25 / r16+r17
 ;   ptr     X / Z
 usbCrc16:
-    mov     ptrL, argPtrL
-    mov     ptrH, argPtrH
+    movw    ptrL, argPtrL
     ldi     resCrcL, 0xFF
     ldi     resCrcH, 0xFF
+    clr     bitCnt          ; zero reg
     rjmp    usbCrc16LoopTest
 usbCrc16ByteLoop:
     ld      byte, ptr+
-    eor     resCrcL, byte   ; resCrcL is now 'x' in table()
-    mov     byte, resCrcL   ; compute parity of 'x'
+    eor     byte, resCrcL   ; scratch is now 'x' in table()
+    mov     scratch, byte   ; compute parity of 'x'
     swap    byte
-    eor     byte, resCrcL
-    mov     scratch, byte
+    eor     byte, scratch
+    mov     resCrcL, byte
     lsr     byte
     lsr     byte
-    eor     byte, scratch
+    eor     byte, resCrcL
     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
+    andi    byte, 2        ; byte is now parity(x) << 1
+    cp      bitCnt, byte   ; c = (byte != 0), then put in high bit
+    ror     scratch        ; so that after xoring, shifting, and xoring, it gives
+    ror     byte           ; the desired 0xC0 with resCrcH
+    mov     resCrcL, byte
+    eor     resCrcL, resCrcH
+    mov     resCrcH, scratch
     lsr     scratch
     ror     byte
     eor     resCrcH, scratch
@@ -372,7 +366,7 @@ usbMFTimeout:
 #   if USB_CFG_CLOCK_KHZ == 18000
 #       include "usbdrvasm18-crc.inc"
 #   else
-#       error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!"
+#       error "USB_CFG_CLOCK_KHZ is not one of the supported rates for USB_CFG_CHECK_CRC!"
 #   endif
 #else   /* USB_CFG_CHECK_CRC */
 #   if USB_CFG_CLOCK_KHZ == 12000
@@ -385,9 +379,11 @@ usbMFTimeout:
 #       include "usbdrvasm16.inc"
 #   elif USB_CFG_CLOCK_KHZ == 16500
 #       include "usbdrvasm165.inc"
+#   elif USB_CFG_CLOCK_KHZ == 18000
+#       include "usbdrvasm18.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!"
+#       error "USB_CFG_CLOCK_KHZ is not one of the supported rates!"
 #   endif
 #endif /* USB_CFG_CHECK_CRC */
index 9cc4e4d..fb66934 100644 (file)
@@ -5,7 +5,6 @@
  * 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$
  */
 
 /*
index d720f7e..a8e475c 100644 (file)
@@ -5,7 +5,6 @@
  * 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
index bcd6621..8f67bcc 100644 (file)
@@ -5,7 +5,6 @@
  * Tabsize: 4
  * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
  * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbdrvasm128.inc 758 2009-08-06 10:12:54Z cs $
  */
 
 /* Do not link this file! Link usbdrvasm.S instead, which includes the
index c13bd91..05d16f3 100644 (file)
@@ -5,7 +5,6 @@
  * 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
index a30e194..3559f4a 100644 (file)
@@ -5,7 +5,6 @@
  * 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: usbdrvasm16.inc 760 2009-08-09 18:59:43Z cs $
  */
 
 /* Do not link this file! Link usbdrvasm.S instead, which includes the
index d29139a..30b09ac 100644 (file)
@@ -5,7 +5,6 @@
  * 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: usbdrvasm165.inc 740 2009-04-13 18:23:31Z cs $
  */
 
 /* Do not link this file! Link usbdrvasm.S instead, which includes the
index ad0269e..bf72501 100644 (file)
@@ -5,7 +5,6 @@
  * Tabsize: 4
  * Copyright: (c) 2008 by Lukas Schrittwieser and OBJECTIVE DEVELOPMENT Software GmbH
  * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id: usbdrvasm18-crc.inc 740 2009-04-13 18:23:31Z cs $
  */
 
 /* Do not link this file! Link usbdrvasm.S instead, which includes the
@@ -79,44 +78,44 @@ of CPU cycles, but even an exact number of cycles!
 
 
 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
+       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)
+       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]
+       cpi     x2, 0xb0                ;[+10]
        brne    ignorePacket            ;[+11] detected a crc fault -> paket is ignored and retransmitted by the host
-    endm
+       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]
+       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:
 ;----------------------------------------------------------------------------
@@ -126,59 +125,59 @@ USB_INTR_VECTOR:
 ;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
+       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
+       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
+       lds     YL, usbSofCount
+       inc     YL
+       sts     usbSofCount, YL
 #endif  /* USB_COUNT_SOF */
 #ifdef USB_SOF_HOOK
-    USB_SOF_HOOK
+       USB_SOF_HOOK
 #endif
-    rjmp    sofError
+       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
+       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).
 
@@ -186,13 +185,13 @@ foundK:                         ;[-15]
 ; 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<<USBPLUS      ;[6] [rx loop init] current line state is K state. D+=="1", D-=="0"
-    push    x5                  ;[7]
-    push    cnt                 ;[9]
-    ldi     cnt, USB_BUFSIZE    ;[11]
+       push    x1                      ;[0]
+       push    x2                      ;[2]
+       push    x3                      ;[4] crc high byte
+       ldi     x2, 1<<USBPLUS          ;[6] [rx loop init] current line state is K state. D+=="1", D-=="0"
+       push    x5                      ;[7]
+       push    cnt                     ;[9]
+       ldi     cnt, USB_BUFSIZE        ;[11]
 
 
 ;--------------------------------------------------------------------------------------------------------------
@@ -204,34 +203,34 @@ haveTwoBitsK:
 ;--------------------------------------------------------------------------------------------------------------
 
 ; pid bit 0 - used for even more register saving (we need the z pointer)
-       in      x1, USBIN           ;[0] sample line state
-    andi    x1, USBMASK         ;[1] filter only D+ and D- bits
-    eor                x2, x1                          ;[2] generate inverted of actual bit
+       in      x1, USBIN               ;[0] sample line state
+       andi    x1, USBMASK             ;[1] filter only D+ and D- bits
+       eor     x2, x1                  ;[2] generate inverted of actual bit
        sbrc    x2, USBMINUS            ;[3] if the bit is set we received a zero
-       sec                                                     ;[4]
-       ror             shift                           ;[5] we perform no unstuffing check here as this is the first bit
-       mov             x2, x1                          ;[6]
-       push    ZL                                      ;[7]
-                                                               ;[8]
-       push    ZH                                      ;[9]
-                                                               ;[10]
-       ldi             x3, 0xFE                        ;[11] x3 is the high order crc value
+       sec                             ;[4]
+       ror     shift                   ;[5] we perform no unstuffing check here as this is the first bit
+       mov     x2, x1                  ;[6]
+       push    ZL                      ;[7]
+                                       ;[8]
+       push    ZH                      ;[9]
+                                       ;[10]
+       ldi     x3, 0xFE                ;[11] x3 is the high order crc value
 
 
 bitloopPid:
-       in      x1, USBIN           ;[0] sample line state
-       andi    x1, USBMASK         ;[1] filter only D+ and D- bits
-    breq    nse0                ;[2] both lines are low so handle se0
-       eor             x2, x1                          ;[3] generate inverted of actual bit
+       in      x1, USBIN               ;[0] sample line state
+       andi    x1, USBMASK             ;[1] filter only D+ and D- bits
+       breq    nse0                    ;[2] both lines are low so handle se0
+       eor     x2, x1                  ;[3] generate inverted of actual bit
        sbrc    x2, USBMINUS            ;[4] set the carry if we received a zero
-       sec                                                     ;[5]
-       ror             shift                           ;[6]
-       ldi             ZL, 0x54                        ;[7] ZL is the low order crc value
-       ser             x4                                      ;[8] the is no bit stuffing check here as the pid bit can't be stuffed. if so
-                                                               ; some error occured. In this case the paket is discarded later on anyway.
-       mov             x2, x1                          ;[9] prepare for the next cycle
-       brcc    bitloopPid                      ;[10] while 0s drop out of shift we get the next bit
-       eor             x4, shift                       ;[11] invert all bits in shift and store result in x4
+       sec                             ;[5]
+       ror     shift                   ;[6]
+       ldi     ZL, 0x54                ;[7] ZL is the low order crc value
+       ser     x4                      ;[8] the is no bit stuffing check here as the pid bit can't be stuffed. if so
+                                       ; some error occured. In this case the paket is discarded later on anyway.
+       mov     x2, x1                  ;[9] prepare for the next cycle
+       brcc    bitloopPid              ;[10] while 0s drop out of shift we get the next bit
+       eor     x4, shift               ;[11] invert all bits in shift and store result in x4
 
 ;--------------------------------------------------------------------------------------------------------------
 ; receives data bytes and calculates the crc
@@ -241,127 +240,127 @@ bitloopPid:
 ;--------------------------------------------------------------------------------------------------------------
 
 rxDataStart:
-    in      x1, USBIN           ;[0] sample line state (note: a se0 check is not useful due to bit dribbling)
-    ser                x5                                      ;[1] prepare the unstuff marker register
-    eor                x2, x1                  ;[2] generates the inverted of the actual bit
-    bst                x2, USBMINUS            ;[3] copy the bit from x2
-    bld                shift, 0                ;[4] and store it in shift
-    mov                x2, shift               ;[5] make a copy of shift for unstuffing check
-    andi       x2, 0xF9                ;[6] mask the last six bits, if we got six zeros (which are six ones in fact)
-    breq       unstuff0                ;[7] then Z is set now and we branch to the unstuffing handler
+       in      x1, USBIN               ;[0] sample line state (note: a se0 check is not useful due to bit dribbling)
+       ser     x5                      ;[1] prepare the unstuff marker register
+       eor     x2, x1                  ;[2] generates the inverted of the actual bit
+       bst     x2, USBMINUS            ;[3] copy the bit from x2
+       bld     shift, 0                ;[4] and store it in shift
+       mov     x2, shift               ;[5] make a copy of shift for unstuffing check
+       andi    x2, 0xF9                ;[6] mask the last six bits, if we got six zeros (which are six ones in fact)
+       breq    unstuff0                ;[7] then Z is set now and we branch to the unstuffing handler
 didunstuff0:
        subi    cnt, 1                  ;[8] cannot use dec because it doesn't affect the carry flag
-    brcs    nOverflow                  ;[9] Too many bytes received. Ignore packet
-    st         Y+, x4                          ;[10] store the last received byte
-                                                               ;[11] st needs two cycles
+       brcs    nOverflow               ;[9] Too many bytes received. Ignore packet
+       st      Y+, x4                  ;[10] store the last received byte
+                                       ;[11] st needs two cycles
 
 ; bit1
-       in              x2, USBIN                       ;[0] sample line state
-    andi       x1, USBMASK                     ;[1] check for se0 during bit 0
-    breq       nse0                            ;[2]
-    andi       x2, USBMASK                     ;[3] check se0 during bit 1
-    breq       nse0                            ;[4]
-       eor             x1, x2                          ;[5]
-    bst                x1, USBMINUS            ;[6]
-    bld        shift, 1                        ;[7]
-    mov                x1, shift                       ;[8]
-    andi       x1, 0xF3                        ;[9]
-    breq       unstuff1                        ;[10]
+       in      x2, USBIN               ;[0] sample line state
+       andi    x1, USBMASK             ;[1] check for se0 during bit 0
+       breq    nse0                    ;[2]
+       andi    x2, USBMASK             ;[3] check se0 during bit 1
+       breq    nse0                    ;[4]
+       eor     x1, x2                  ;[5]
+       bst     x1, USBMINUS            ;[6]
+       bld     shift, 1                ;[7]
+       mov     x1, shift               ;[8]
+       andi    x1, 0xF3                ;[9]
+       breq    unstuff1                ;[10]
 didunstuff1:
-       nop                                                     ;[11]
+       nop                             ;[11]
 
 ; bit2
-       in      x1, USBIN           ;[0] sample line state
-    andi       x1, USBMASK                     ;[1] check for se0 (as there is nothing else to do here
-       breq    nOverflow                       ;[2]
-    eor                x2, x1              ;[3] generates the inverted of the actual bit
-    bst                x2, USBMINUS            ;[4]
-    bld                shift, 2                        ;[5] store the bit
-    mov                x2, shift                       ;[6]
-    andi       x2, 0xE7                        ;[7] if we have six zeros here (which means six 1 in the stream)
-    breq       unstuff2                        ;[8] the next bit is a stuffing bit
+       in      x1, USBIN               ;[0] sample line state
+       andi    x1, USBMASK             ;[1] check for se0 (as there is nothing else to do here
+       breq    nOverflow               ;[2]
+       eor     x2, x1                  ;[3] generates the inverted of the actual bit
+       bst     x2, USBMINUS            ;[4]
+       bld     shift, 2                ;[5] store the bit
+       mov     x2, shift               ;[6]
+       andi    x2, 0xE7                ;[7] if we have six zeros here (which means six 1 in the stream)
+       breq    unstuff2                ;[8] the next bit is a stuffing bit
 didunstuff2:
-       nop2                                            ;[9]
-                                                               ;[10]
-       nop                                                     ;[11]
+       nop2                            ;[9]
+                                       ;[10]
+       nop                             ;[11]
 
 ; bit3
-       in              x2, USBIN                       ;[0] sample line state
-    andi       x2, USBMASK                     ;[1] check for se0
-    breq       nOverflow           ;[2]
-    eor                x1, x2                          ;[3]
-    bst                x1, USBMINUS            ;[4]
-    bld        shift, 3                        ;[5]
-    mov                x1, shift                       ;[6]
-    andi       x1, 0xCF                        ;[7]
-    breq       unstuff3                        ;[8]
+       in      x2, USBIN               ;[0] sample line state
+       andi    x2, USBMASK             ;[1] check for se0
+       breq    nOverflow               ;[2]
+       eor     x1, x2                  ;[3]
+       bst     x1, USBMINUS            ;[4]
+       bld     shift, 3                ;[5]
+       mov     x1, shift               ;[6]
+       andi    x1, 0xCF                ;[7]
+       breq    unstuff3                ;[8]
 didunstuff3:
-       nop                                                     ;[9]
-       rjmp    rxDataBit4                      ;[10]
-                                                               ;[11]
+       nop                             ;[9]
+       rjmp    rxDataBit4              ;[10]
+                                       ;[11]
 
 ; the avr branch instructions allow an offset of +63 insturction only, so we need this
 ; 'local copy' of se0
 nse0:
-       rjmp    se0                                     ;[4]
-                                                               ;[5]
+       rjmp    se0                     ;[4]
+                                       ;[5]
 ; the same same as for se0 is needed for overflow and StuffErr
 nOverflow:
 stuffErr:
        rjmp    overflow
 
 
-unstuff0:                                              ;[8] this is the branch delay of breq unstuffX
-       andi    x1, USBMASK                     ;[9] do an se0 check here (if the last crc byte ends with 5 one's we might end up here
-       breq    didunstuff0                     ;[10] event tough the message is complete -> 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
+unstuff0:                              ;[8] this is the branch delay of breq unstuffX
+       andi    x1, USBMASK             ;[9] do an se0 check here (if the last crc byte ends with 5 one's we might end up here
+       breq    didunstuff0             ;[10] event tough the message is complete -> 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
 
 
 
@@ -380,17 +379,17 @@ unstuff3:                                         ;[9] this is the jump delay of breq unstuffX
 
 
 sendNakAndReti:
-    ldi     x3, USBPID_NAK  ;[-18]
-    rjmp    sendX3AndReti   ;[-17]
+       ldi     x3, USBPID_NAK          ;[-18]
+       rjmp    sendX3AndReti           ;[-17]
 sendAckAndReti:
-    ldi     cnt, USBPID_ACK ;[-17]
+       ldi     cnt, USBPID_ACK         ;[-17]
 sendCntAndReti:
-    mov     x3, cnt         ;[-16]
+       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
+       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'
@@ -398,88 +397,88 @@ sendX3AndReti:
 ;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
+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
+       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
+       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]
+       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
+       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]
+       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
+       breq    skipAddrAssign          ;[3]
+       sts     usbDeviceAddr, x2       ; if not skipped: SE0 is one cycle longer
 skipAddrAssign:
 ;end of usbDeviceAddress transfer
-    ldi     x2, 1<<USB_INTR_PENDING_BIT;[5] int0 occurred during TX -- clear pending flag
-    USB_STORE_PENDING(x2)   ;[6]
-    ori     x1, USBIDLE     ;[7]
-    in      x2, USBDDR      ;[8]
-    cbr     x2, USBMASK     ;[9] set both pins to input
-    mov     x3, x1          ;[10]
-    cbr     x3, USBMASK     ;[11] configure no pullup on both pins
-    ldi     x4, 4           ;[12]
+       ldi     x2, 1<<USB_INTR_PENDING_BIT;[5] int0 occurred during TX -- clear pending flag
+       USB_STORE_PENDING(x2)           ;[6]
+       ori     x1, USBIDLE             ;[7]
+       in      x2, USBDDR              ;[8]
+       cbr     x2, USBMASK             ;[9] set both pins to input
+       mov     x3, x1                  ;[10]
+       cbr     x3, USBMASK             ;[11] configure no pullup on both pins
+       ldi     x4, 4                   ;[12]
 se0Delay:
-    dec     x4              ;[13] [16] [19] [22]
-    brne    se0Delay        ;[14] [17] [20] [23]
-    out     USBOUT, x1      ;[24] <-- out J (idle) -- end of SE0 (EOP signal)
-    out     USBDDR, x2      ;[25] <-- release bus now
-    out     USBOUT, x3      ;[26] <-- ensure no pull-up resistors are active
-    rjmp    doReturn
+       dec     x4                      ;[13] [16] [19] [22]
+       brne    se0Delay                ;[14] [17] [20] [23]
+       out     USBOUT, x1              ;[24] <-- out J (idle) -- end of SE0 (EOP signal)
+       out     USBDDR, x2              ;[25] <-- release bus now
+       out     USBOUT, x3              ;[26] <-- ensure no pull-up resistors are active
+       rjmp    doReturn
 
 bitstuffN:
-    eor     x1, x4          ;[8] generate a zero
-    ldi     x2, 0           ;[9] reset the bit stuffing history
-    nop2                    ;[10]
-    out     USBOUT, x1      ;[0] <-- send the stuffing bit
-    rjmp    didStuffN       ;[1]
+       eor     x1, x4                  ;[8] generate a zero
+       ldi     x2, 0                   ;[9] reset the bit stuffing history
+       nop2                            ;[10]
+       out     USBOUT, x1              ;[0] <-- send the stuffing bit
+       rjmp    didStuffN               ;[1]
 
 bitstuff7:
-    eor     x1, x4          ;[5]
-    ldi     x2, 0           ;[6] reset bit stuffing history
-    clc                                                ;[7] fill a zero into the shift register
-    rol     shift           ;[8] compensate for ror shift at branch destination
-    rjmp    didStuff7       ;[9]
-                                               ;[10] jump delay
+       eor     x1, x4                  ;[5]
+       ldi     x2, 0                   ;[6] reset bit stuffing history
+       clc                             ;[7] fill a zero into the shift register
+       rol     shift                   ;[8] compensate for ror shift at branch destination
+       rjmp    didStuff7               ;[9]
+                                       ;[10] jump delay
 
 ;--------------------------------------------------------------------------------------------------------------
 ; receives data bytes and calculates the crc
@@ -488,118 +487,118 @@ bitstuff7:
 ;--------------------------------------------------------------------------------------------------------------
 
 nOverflow2:
-       rjmp overflow
+       rjmp    overflow
 
 rxDataBit4:
-       in      x1, USBIN           ;[0] sample line state
-    andi       x1, USBMASK                     ;[1] check for se0
-    breq       nOverflow2                      ;[2]
-    eor                x2, x1              ;[3]
-    bst                x2, USBMINUS            ;[4]
-    bld                shift, 4                        ;[5]
-    mov                x2, shift                       ;[6]
-    andi       x2, 0x9F                        ;[7]
-    breq       unstuff4                        ;[8]
+       in      x1, USBIN               ;[0] sample line state
+       andi    x1, USBMASK             ;[1] check for se0
+       breq    nOverflow2              ;[2]
+       eor     x2, x1                  ;[3]
+       bst     x2, USBMINUS            ;[4]
+       bld     shift, 4                ;[5]
+       mov     x2, shift               ;[6]
+       andi    x2, 0x9F                ;[7]
+       breq    unstuff4                ;[8]
 didunstuff4:
-       nop2                                            ;[9][10]
-       nop                                                     ;[11]
+       nop2                            ;[9][10]
+       nop                             ;[11]
 
 ; bit5
-       in              x2, USBIN                       ;[0] sample line state
-    ldi                ZH, hi8(usbCrcTableHigh);[1] use the table for the higher byte
-    eor                x1, x2                          ;[2]
-    bst                x1, USBMINUS            ;[3]
-    bld        shift, 5                        ;[4]
-    mov                x1, shift                       ;[5]
-    andi       x1, 0x3F                        ;[6]
-    breq       unstuff5                        ;[7]
+       in      x2, USBIN               ;[0] sample line state
+       ldi     ZH, hi8(usbCrcTableHigh);[1] use the table for the higher byte
+       eor     x1, x2                  ;[2]
+       bst     x1, USBMINUS            ;[3]
+       bld     shift, 5                ;[4]
+       mov     x1, shift               ;[5]
+       andi    x1, 0x3F                ;[6]
+       breq    unstuff5                ;[7]
 didunstuff5:
-       lpm             x4, Z                           ;[8] load the higher crc xor-byte and store it for later use
-                                                               ;[9] lpm needs 3 cycles
-                                                               ;[10]
-       ldi             ZH, hi8(usbCrcTableLow);[11] load the lower crc xor byte adress
+       lpm     x4, Z                   ;[8] load the higher crc xor-byte and store it for later use
+                                       ;[9] lpm needs 3 cycles
+                                       ;[10]
+       ldi     ZH, hi8(usbCrcTableLow) ;[11] load the lower crc xor byte adress
 
 ; bit6
-       in      x1, USBIN           ;[0] sample line state
-    eor                x2, x1              ;[1]
-    bst                x2, USBMINUS            ;[2]
-    bld                shift, 6                        ;[3]
-    mov                x2, shift                       ;[4]
-    andi       x2, 0x7E                        ;[5]
-    breq       unstuff6                        ;[6]
+       in      x1, USBIN               ;[0] sample line state
+       eor     x2, x1                  ;[1]
+       bst     x2, USBMINUS            ;[2]
+       bld     shift, 6                ;[3]
+       mov     x2, shift               ;[4]
+       andi    x2, 0x7E                ;[5]
+       breq    unstuff6                ;[6]
 didunstuff6:
-       lpm             ZL, Z                           ;[7] load the lower xor crc byte
-                                                               ;[8] lpm needs 3 cycles
-                                                       ;[9]
-       eor             ZL, x3                          ;[10] xor the old high crc byte with the low xor-byte
-       mov             x3, x4                          ;[11] move the new high order crc value from temp to its destination
+       lpm     ZL, Z                   ;[7] load the lower xor crc byte
+                                       ;[8] lpm needs 3 cycles
+                                       ;[9]
+       eor     ZL, x3                  ;[10] xor the old high crc byte with the low xor-byte
+       mov     x3, x4                  ;[11] move the new high order crc value from temp to its destination
 
 ; bit7
-       in              x2, USBIN                       ;[0] sample line state
-    eor                x1, x2                          ;[1]
-    bst                x1, USBMINUS            ;[2]
-    bld        shift, 7                        ;[3] now shift holds the complete but inverted data byte
-    mov                x1, shift                       ;[4]
-    andi       x1, 0xFC                        ;[5]
-    breq       unstuff7                        ;[6]
+       in      x2, USBIN               ;[0] sample line state
+       eor     x1, x2                  ;[1]
+       bst     x1, USBMINUS            ;[2]
+       bld     shift, 7                ;[3] now shift holds the complete but inverted data byte
+       mov     x1, shift               ;[4]
+       andi    x1, 0xFC                ;[5]
+       breq    unstuff7                ;[6]
 didunstuff7:
-       eor             x5, shift                       ;[7] x5 marks all bits which have not been inverted by the unstuffing subs
-       mov             x4, x5                          ;[8] keep a copy of the data byte it will be stored during next bit0
-       eor             ZL, x4                          ;[9] feed the actual byte into the crc algorithm
-       rjmp    rxDataStart                     ;[10] next byte
-                                                               ;[11] during the reception of the next byte this one will be fed int the crc algorithm
-
-unstuff4:                                              ;[9] this is the jump delay of rjmp unstuffX
-       ori             shift, 0x10                     ;[10] invert the last received bit to prevent furhter unstuffing
-       andi    x5, 0xEF                        ;[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    stuffErr2                       ;[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    didunstuff4                     ;[7]
-                                                               ;[8] jump delay of rjmp didunstuffX
-
-unstuff5:                                              ;[8] this is the jump delay of rjmp unstuffX
-       nop                                                     ;[9]
-       ori             shift, 0x20                     ;[10] invert the last received bit to prevent furhter unstuffing
-       andi    x5, 0xDF                        ;[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    stuffErr2                       ;[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
-       nop                                                     ;[5]
-       rjmp    didunstuff5                     ;[6]
-                                                               ;[7] jump delay of rjmp didunstuffX
-
-unstuff6:                                              ;[7] this is the jump delay of rjmp unstuffX
-       nop2                                            ;[8]
-                                                               ;[9]
-       ori             shift, 0x40                     ;[10] invert the last received bit to prevent furhter unstuffing
-       andi    x5, 0xBF                        ;[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    stuffErr2                       ;[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
-       rjmp    didunstuff6                     ;[5]
-                                                               ;[6] jump delay of rjmp didunstuffX
-
-unstuff7:                                              ;[7] this is the jump delay of rjmp unstuffX
-       nop                                                     ;[8]
-       nop                                                     ;[9]
-       ori             shift, 0x80                     ;[10] invert the last received bit to prevent furhter unstuffing
-       andi    x5, 0x7F                        ;[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    stuffErr2                       ;[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
-       rjmp    didunstuff7                     ;[5]
-                                                               ;[6] jump delay of rjmp didunstuff7
+       eor     x5, shift               ;[7] x5 marks all bits which have not been inverted by the unstuffing subs
+       mov     x4, x5                  ;[8] keep a copy of the data byte it will be stored during next bit0
+       eor     ZL, x4                  ;[9] feed the actual byte into the crc algorithm
+       rjmp    rxDataStart             ;[10] next byte
+                                       ;[11] during the reception of the next byte this one will be fed int the crc algorithm
+
+unstuff4:                              ;[9] this is the jump delay of rjmp unstuffX
+       ori             shift, 0x10     ;[10] invert the last received bit to prevent furhter unstuffing
+       andi    x5, 0xEF                ;[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    stuffErr2               ;[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    didunstuff4             ;[7]
+                                       ;[8] jump delay of rjmp didunstuffX
+
+unstuff5:                              ;[8] this is the jump delay of rjmp unstuffX
+       nop                             ;[9]
+       ori             shift, 0x20     ;[10] invert the last received bit to prevent furhter unstuffing
+       andi    x5, 0xDF                ;[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    stuffErr2               ;[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
+       nop                             ;[5]
+       rjmp    didunstuff5             ;[6]
+                                       ;[7] jump delay of rjmp didunstuffX
+
+unstuff6:                              ;[7] this is the jump delay of rjmp unstuffX
+       nop2                            ;[8]
+                                       ;[9]
+       ori             shift, 0x40     ;[10] invert the last received bit to prevent furhter unstuffing
+       andi    x5, 0xBF                ;[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    stuffErr2               ;[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
+       rjmp    didunstuff6             ;[5]
+                                       ;[6] jump delay of rjmp didunstuffX
+
+unstuff7:                              ;[7] this is the jump delay of rjmp unstuffX
+       nop                             ;[8]
+       nop                             ;[9]
+       ori             shift, 0x80     ;[10] invert the last received bit to prevent furhter unstuffing
+       andi    x5, 0x7F                ;[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    stuffErr2               ;[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
+       rjmp    didunstuff7             ;[5]
+                                       ;[6] jump delay of rjmp didunstuff7
 
 ; local copy of the stuffErr desitnation for the second half of the receiver loop
 stuffErr2:
diff --git a/firmware/usbdrv/usbdrvasm18.inc b/firmware/usbdrv/usbdrvasm18.inc
new file mode 100644 (file)
index 0000000..0c263e6
--- /dev/null
@@ -0,0 +1,557 @@
+/* Name: usbdrvasm18.inc
+ * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
+ * Author: Lukas Schrittwieser (based on 20 MHz usbdrvasm20.inc by Jeroen Benschop)
+ * Creation Date: 2009-01-20
+ * Tabsize: 4
+ * Copyright: (c) 2008 by Lukas Schrittwieser and OBJECTIVE DEVELOPMENT Software GmbH
+ * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
+ */
+
+/* Do not link this file! Link usbdrvasm.S instead, which includes the
+ * appropriate implementation!
+ */
+
+/*
+General Description:
+This file is the 18 MHz version of the asssembler part of the USB driver. It
+requires a 18 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!
+
+Note: This version is smaller than usbdrvasm18-crc.inc because it saves the CRC
+table. It's therefore suitable for boot loaders on boards @ 18 MHz. However, it
+is not as small as it could be, because loops are unrolled in the same way as in
+usbdrvasm18-crc.inc. There is room for optimization.
+*/
+
+
+;max stack usage: [ret(2), YL, SREG, YH, [sofError], bitcnt(x5), shift, x1, x2, x3, x4, cnt, ZL, ZH] = 14 bytes
+;nominal frequency: 18 MHz -> 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
+; x4 is used as temporary register
+; x3 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 x3 is cleared to mark the bit as beening iverted
+; zl lower crc value and crc table index
+; zh used for crc table accesses
+
+
+
+macro POP_STANDARD ; 18 cycles
+    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]
+    ldi     x2, 1<<USBPLUS      ;[6] [rx loop init] current line state is K state. D+=="1", D-=="0"
+    push    x5                  ;[7] used by tx loop for bitcnt
+    push    cnt                 ;[9]
+    ldi     cnt, USB_BUFSIZE    ;[11]
+
+
+;--------------------------------------------------------------------------------------------------------------
+; receives the pid byte
+; there is no real unstuffing algorithm implemented here as a stuffing bit is impossible in the pid byte.
+; That's because the last four bits of the byte are the inverted of the first four bits. If we detect a
+; unstuffing condition something went wrong and abort
+; shift has to be initialized to 0x80
+;--------------------------------------------------------------------------------------------------------------
+
+bitloopPid:
+    in      x1, USBIN           ;[0] sample line state
+    andi    x1, USBMASK         ;[1] filter only D+ and D- bits
+    breq    nse0                ;[2] both lines are low so handle se0
+    eor     x2, x1              ;[3] generate inverted of actual bit
+    sbrc    x2, USBMINUS        ;[4] set the carry if we received a zero
+    sec                         ;[5]
+    ror     shift               ;[6]
+    nop                         ;[7] ZL is the low order crc value
+    ser     x4                  ;[8] the is no bit stuffing check here as the pid bit can't be stuffed. if so
+                                ; some error occured. In this case the paket is discarded later on anyway.
+    mov     x2, x1              ;[9] prepare for the next cycle
+    brcc    bitloopPid          ;[10] while 0s drop out of shift we get the next bit
+    eor     x4, shift           ;[11] invert all bits in shift and store result in x4
+
+;--------------------------------------------------------------------------------------------------------------
+; receives data bytes and calculates the crc
+; the last USBIN state has to be in x2
+; this is only the first half, due to branch distanc limitations the second half of the loop is near the end
+; of this asm file
+;--------------------------------------------------------------------------------------------------------------
+
+rxDataStart:
+    in      x1, USBIN           ;[0] sample line state (note: a se0 check is not useful due to bit dribbling)
+    ser     x3                  ;[1] prepare the unstuff marker register
+    eor     x2, x1              ;[2] generates the inverted of the actual bit
+    bst     x2, USBMINUS        ;[3] copy the bit from x2
+    bld     shift, 0            ;[4] and store it in shift
+    mov     x2, shift           ;[5] make a copy of shift for unstuffing check
+    andi    x2, 0xF9            ;[6] mask the last six bits, if we got six zeros (which are six ones in fact)
+    breq    unstuff0            ;[7] then Z is set now and we branch to the unstuffing handler
+didunstuff0:
+    subi    cnt, 1              ;[8] cannot use dec because it doesn't affect the carry flag
+    brcs    nOverflow           ;[9] Too many bytes received. Ignore packet
+    st      Y+, x4              ;[10] store the last received byte
+                                ;[11] st needs two cycles
+
+; bit1
+    in      x2, USBIN           ;[0] sample line state
+    andi    x1, USBMASK         ;[1] check for se0 during bit 0
+    breq    nse0                ;[2]
+    andi    x2, USBMASK         ;[3] check se0 during bit 1
+    breq    nse0                ;[4]
+    eor     x1, x2              ;[5]
+    bst     x1, USBMINUS        ;[6]
+    bld     shift, 1            ;[7]
+    mov     x1, shift           ;[8]
+    andi    x1, 0xF3            ;[9]
+    breq    unstuff1            ;[10]
+didunstuff1:
+    nop                         ;[11]
+
+; bit2
+    in      x1, USBIN           ;[0] sample line state
+    andi    x1, USBMASK         ;[1] check for se0 (as there is nothing else to do here
+    breq    nOverflow           ;[2]
+    eor     x2, x1              ;[3] generates the inverted of the actual bit
+    bst     x2, USBMINUS        ;[4]
+    bld     shift, 2            ;[5] store the bit
+    mov     x2, shift           ;[6]
+    andi    x2, 0xE7            ;[7] if we have six zeros here (which means six 1 in the stream)
+    breq    unstuff2            ;[8] the next bit is a stuffing bit
+didunstuff2:
+    nop2                        ;[9]
+                                ;[10]
+    nop                         ;[11]
+
+; bit3
+    in      x2, USBIN           ;[0] sample line state
+    andi    x2, USBMASK         ;[1] check for se0
+    breq    nOverflow           ;[2]
+    eor     x1, x2              ;[3]
+    bst     x1, USBMINUS        ;[4]
+    bld     shift, 3            ;[5]
+    mov     x1, shift           ;[6]
+    andi    x1, 0xCF            ;[7]
+    breq    unstuff3            ;[8]
+didunstuff3:
+    nop                         ;[9]
+    rjmp    rxDataBit4          ;[10]
+                                ;[11]
+
+; the avr branch instructions allow an offset of +63 insturction only, so we need this
+; 'local copy' of se0
+nse0:
+    rjmp    se0                 ;[4]
+                                ;[5]
+; the same same as for se0 is needed for overflow and StuffErr
+nOverflow:
+stuffErr:
+    rjmp    overflow
+
+
+unstuff0:                       ;[8] this is the branch delay of breq unstuffX
+    andi    x1, USBMASK         ;[9] do an se0 check here (if the last crc byte ends with 5 one's we might end up here
+    breq    didunstuff0         ;[10] event tough the message is complete -> 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    x3, 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    x3, 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    x3, 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    x3, 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
+#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<<USB_INTR_PENDING_BIT;[5] int0 occurred during TX -- clear pending flag
+    USB_STORE_PENDING(x2)   ;[6]
+    ori     x1, USBIDLE     ;[7]
+    in      x2, USBDDR      ;[8]
+    cbr     x2, USBMASK     ;[9] set both pins to input
+    mov     x3, x1          ;[10]
+    cbr     x3, USBMASK     ;[11] configure no pullup on both pins
+    ldi     x4, 4           ;[12]
+se0Delay:
+    dec     x4              ;[13] [16] [19] [22]
+    brne    se0Delay        ;[14] [17] [20] [23]
+    out     USBOUT, x1      ;[24] <-- out J (idle) -- end of SE0 (EOP signal)
+    out     USBDDR, x2      ;[25] <-- release bus now
+    out     USBOUT, x3      ;[26] <-- ensure no pull-up resistors are active
+    rjmp    doReturn
+
+bitstuffN:
+    eor     x1, x4          ;[8] generate a zero
+    ldi     x2, 0           ;[9] reset the bit stuffing history
+    nop2                    ;[10]
+    out     USBOUT, x1      ;[0] <-- send the stuffing bit
+    rjmp    didStuffN       ;[1]
+
+bitstuff7:
+    eor     x1, x4          ;[5]
+    ldi     x2, 0           ;[6] reset bit stuffing history
+    clc                     ;[7] fill a zero into the shift register
+    rol     shift           ;[8] compensate for ror shift at branch destination
+    rjmp    didStuff7       ;[9]
+                            ;[10] jump delay
+
+;--------------------------------------------------------------------------------------------------------------
+; receives data bytes and calculates the crc
+; second half of the data byte receiver loop
+; most parts of the crc algorithm are here
+;--------------------------------------------------------------------------------------------------------------
+
+nOverflow2:
+    rjmp overflow
+
+rxDataBit4:
+    in      x1, USBIN           ;[0] sample line state
+    andi    x1, USBMASK         ;[1] check for se0
+    breq    nOverflow2          ;[2]
+    eor     x2, x1              ;[3]
+    bst     x2, USBMINUS        ;[4]
+    bld     shift, 4            ;[5]
+    mov     x2, shift           ;[6]
+    andi    x2, 0x9F            ;[7]
+    breq    unstuff4            ;[8]
+didunstuff4:
+    nop2                        ;[9][10]
+    nop                         ;[11]
+
+; bit5
+    in      x2, USBIN           ;[0] sample line state
+    nop                         ;[1] use the table for the higher byte
+    eor     x1, x2              ;[2]
+    bst     x1, USBMINUS        ;[3]
+    bld     shift, 5            ;[4]
+    mov     x1, shift           ;[5]
+    andi    x1, 0x3F            ;[6]
+    breq    unstuff5            ;[7]
+didunstuff5:
+    nop2                        ;[8] load the higher crc xor-byte and store it for later use
+                                ;[9] lpm needs 3 cycles
+    nop                         ;[10]
+    nop                         ;[11] load the lower crc xor byte adress
+
+; bit6
+    in      x1, USBIN           ;[0] sample line state
+    eor     x2, x1              ;[1]
+    bst     x2, USBMINUS        ;[2]
+    bld     shift, 6            ;[3]
+    mov     x2, shift           ;[4]
+    andi    x2, 0x7E            ;[5]
+    breq    unstuff6            ;[6]
+didunstuff6:
+    nop2                        ;[7] load the lower xor crc byte
+                                ;[8] lpm needs 3 cycles
+    nop                         ;[9]
+    nop                         ;[10] xor the old high crc byte with the low xor-byte
+    nop                         ;[11] move the new high order crc value from temp to its destination
+
+; bit7
+    in      x2, USBIN           ;[0] sample line state
+    eor     x1, x2              ;[1]
+    bst     x1, USBMINUS        ;[2]
+    bld     shift, 7            ;[3] now shift holds the complete but inverted data byte
+    mov     x1, shift           ;[4]
+    andi    x1, 0xFC            ;[5]
+    breq    unstuff7            ;[6]
+didunstuff7:
+    eor     x3, shift           ;[7] x3 marks all bits which have not been inverted by the unstuffing subs
+    mov     x4, x3              ;[8] keep a copy of the data byte it will be stored during next bit0
+    nop                         ;[9] feed the actual byte into the crc algorithm
+    rjmp    rxDataStart         ;[10] next byte
+                                ;[11] during the reception of the next byte this one will be fed int the crc algorithm
+
+unstuff4:                       ;[9] this is the jump delay of rjmp unstuffX
+    ori     shift, 0x10         ;[10] invert the last received bit to prevent furhter unstuffing
+    andi    x3, 0xEF            ;[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    stuffErr2           ;[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    didunstuff4         ;[7]
+                                ;[8] jump delay of rjmp didunstuffX
+
+unstuff5:                       ;[8] this is the jump delay of rjmp unstuffX
+    nop                         ;[9]
+    ori     shift, 0x20         ;[10] invert the last received bit to prevent furhter unstuffing
+    andi    x3, 0xDF            ;[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    stuffErr2           ;[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
+    nop                         ;[5]
+    rjmp    didunstuff5         ;[6]
+                                ;[7] jump delay of rjmp didunstuffX
+
+unstuff6:                       ;[7] this is the jump delay of rjmp unstuffX
+    nop2                        ;[8]
+                                ;[9]
+    ori     shift, 0x40         ;[10] invert the last received bit to prevent furhter unstuffing
+    andi    x3, 0xBF            ;[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    stuffErr2           ;[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
+    rjmp    didunstuff6         ;[5]
+                                ;[6] jump delay of rjmp didunstuffX
+
+unstuff7:                       ;[7] this is the jump delay of rjmp unstuffX
+    nop                         ;[8]
+    nop                         ;[9]
+    ori     shift, 0x80         ;[10] invert the last received bit to prevent furhter unstuffing
+    andi    x3, 0x7F            ;[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    stuffErr2           ;[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
+    rjmp    didunstuff7         ;[5]
+                                ;[6] jump delay of rjmp didunstuff7
+
+; local copy of the stuffErr desitnation for the second half of the receiver loop
+stuffErr2:
+    rjmp    stuffErr
index 9dd2503..f79ac89 100644 (file)
@@ -6,7 +6,6 @@
  * 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
index 476184d..0a861d0 100644 (file)
@@ -5,7 +5,6 @@
  * Tabsize: 4
  * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
  * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbportability.h 785 2010-05-30 17:57:07Z cs $
  */
 
 /*