Added copy of LUFA's MassStorageHost compatible with Micropendous boards.

This commit is contained in:
opendous
2011-11-15 14:58:58 +00:00
parent f0f24d0159
commit 5cf05d7ecc
15 changed files with 1445 additions and 641 deletions

View File

@@ -86,8 +86,12 @@ void SetupHardware(void)
/* Hardware Initialization */
Serial_Init(9600, false);
LEDs_Init();
Board_Init(); // initialize LEDs and Buttons and any other peripherals
DISABLE_VOLTAGE_TXRX;
DISABLE_EXT_SRAM;
SELECT_USB_A;
USB_Init();
SELECT_USB_A; // The Hosted USB FLASH Drive is connected via the USB-A connector
/* Create a stdio stream for the serial port for stdin and stdout */
Serial_CreateStream(NULL);

View File

@@ -48,7 +48,7 @@
#include <LUFA/Version.h>
#include <LUFA/Drivers/Misc/TerminalCodes.h>
#include <LUFA/Drivers/Peripheral/Serial.h>
#include <LUFA/Drivers/Board/LEDs.h>
#include <LUFA/Drivers/Board/BoardSupport.h>
#include <LUFA/Drivers/USB/USB.h>
/* Macros: */

View File

@@ -0,0 +1,616 @@
:1000000006C2000022C2000020C200001EC2000082
:100010001CC200001AC2000018C2000016C2000074
:1000200014C2000012C20000CFC700000EC20000C0
:100030000CC200000AC2000008C2000006C2000094
:1000400004C2000002C2000000C20000FEC10000A5
:10005000FCC10000FAC10000F8C10000F6C10000B8
:10006000F4C10000F2C10000F0C10000EEC10000C8
:10007000ECC10000EAC10000E8C10000E6C10000D8
:10008000E4C10000E2C10000E0C10000DEC10000E8
:10009000DCC10000DAC100001B5B33316D446576C2
:1000A00020456E756D204572726F720D0A202D2DE0
:1000B000204572726F7220436F64652025640D0ABB
:1000C000202D2D20537562204572726F7220436F70
:1000D00064652025640D0A202D2D20496E2053745F
:1000E0006174652025640D0A1B5B33376D001B5B53
:1000F00033316D486F7374204D6F646520457272A3
:100100006F720D0A202D2D204572726F7220436F81
:1001100064652025640D0A1B5B33376D004D6173E8
:10012000732053746F7261676520446576696365F7
:1001300020456E756D6572617465642E0D0A0056FA
:10014000656E646F722022252E3873222C20507227
:100150006F647563742022252E313673220D0A00D8
:100160004572726F722072657472696576696E6726
:100170002064657669636520496E717569727920BE
:10018000646174612E0D0A004572726F722073658E
:100190007474696E672050726576656E742044656C
:1001A000766963652052656D6F76616C2062697453
:1001B0002E0D0A004572726F722072657472696545
:1001C00076696E67206465766963652073656E7312
:1001D000652E0D0A004572726F7220726573657428
:1001E00074696E67204D6173732053746F72616719
:1001F0006520696E746572666163652E0D0A005430
:100200006F74616C204C554E733A202564202D206C
:100210005573696E67206669727374204C554E2061
:10022000696E206465766963652E0D0A00457272F9
:100230006F722072657472696576696E67206D6190
:1002400078204C554E20696E6465782E0D0A004565
:1002500072726F722053657474696E67204465769C
:1002600069636520436F6E66696775726174696F53
:100270006E2E0D0A004174746163686564204465E4
:1002800076696365204E6F7420612056616C6964E5
:10029000204D6173732053746F72616765204465EC
:1002A000766963652E0D0A004572726F7220526581
:1002B0007472696576696E6720436F6E66696775EB
:1002C000726174696F6E2044657363726970746FD4
:1002D000722E0D0A000D0A44657669636520556E1D
:1002E00061747461636865642E0D0A004465766903
:1002F00063652041747461636865642E0D0A000DA6
:100300000A002020202000252E325820000D0A430C
:100310006F6E74656E7473206F6620666972737495
:1003200020626C6F636B3A0D0A004572726F722027
:1003300072656164696E67206465766963652062D1
:100340006C6F636B2E0D0A00256C7520626C6F63F9
:100350006B73206F6620256C752062797465732E2F
:100360000D0A004572726F7220726574726965764B
:10037000696E672064657669636520636170616397
:100380006974792E0D0A0052657472696576696E1A
:10039000672043617061636974792E2E2E0D0A0007
:1003A0004572726F722077616974696E6720666F3B
:1003B000722064657669636520746F2062652072BF
:1003C000656164792E0D0A0057616974696E672052
:1003D000756E74696C2072656164792E2E2E0D0A1B
:1003E000001B5B33366D4D6173732053746F726104
:1003F000676520486F73742044656D6F2072756E59
:100400006E696E672E0D0A1B5B33376D0000112479
:100410001FBECFEFD0E2DEBFCDBF11E0A0E0B1E064
:10042000EAE4F6E200E00BBF02C007900D92A032B2
:10043000B107D9F711E0A0E2B1E001C01D92A234EA
:10044000B107E1F7A2D20C942313DACD90912D01DC
:100450002DB73EB7285030400FB6F8943EBF0FBEC0
:100460002DBFEDB7FEB7319628E930E0ADB7BEB786
:1004700012963C932E931197828313826483158284
:10048000968317820E945C10299A2DB73EB7285F89
:100490003F4F0FB6F8943EBF0FBE2DBF08951F9378
:1004A000182F6DD500D000D0EDB7FEB731968EEE87
:1004B00090E0ADB7BEB712969C938E9311971283BE
:1004C00013820E945C10299A0F900F900F900F904A
:1004D000FFCF85ED92E00E947E10299A08958CEE60
:1004E00092E00E947E10299808950F931F93DF9346
:1004F000CF93CDB7DEB7C953D2400FB6F894DEBF65
:100500000FBECDBF29988E01065C1F4F81E0BE0152
:100510006E5F7F4FA80120E032E0DBD6882319F020
:1005200088EA92E00BC06A817B8180E091E0A801BB
:100530000E942A0F882331F085E792E00E947E1006
:10054000299A84C081E00E940B0B882319F08FE464
:1005500092E0F4CF80E091E0BE016F5F7F4F0E9498
:10056000C40E882319F08DE292E044C000D000D080
:100570008FEF91E0ADB7BEB712969C938E93119713
:10058000898190E0019614969C938E9313970E9414
:100590005C100F900F900F900F9080E091E00E9400
:1005A000E80E882319F085ED91E024C080E091E009
:1005B00060E0AE014C5F5F4F0E944F0D882319F041
:1005C00084EB91E017C080E091E060E041E00E94A0
:1005D000130D882319F088E891E00CC080E091E0C9
:1005E00060E0AE014A5E5F4F0E947F0E882349F0B3
:1005F00080E691E00E947E10299A80E00E940B0B19
:1006000025C000D000D000D0EDB7FEB731968FE303
:1006100091E0ADB7BEB712969C938E931197CE0121
:100620004E9693838283CE018696958384830E941F
:100630005C10EDB7FEB736960FB6F894FEBF0FBE4E
:10064000EDBF8DE191E00E947E102998C75CDD4FDF
:100650000FB6F894DEBF0FBECDBFCF91DF911F91D3
:100660000F9108952F923F924F925F926F927F92D7
:100670008F929F92AF92BF92CF92DF92EF92FF92B2
:100680000F931F93DF93CF93CDB7DEB72C970FB6A1
:10069000F894DEBF0FBECDBF8DB79EB79A8789870E
:1006A0009DB79B87AEB7AC8780912D018B3009F049
:1006B000F4C0299888EC93E00E947E1080E091E0DD
:1006C00060E00E94440E882329F08038B9F380EA64
:1006D00093E05BC087E893E00E947E1080E091E0A9
:1006E00060E0AE014F5F5F4F0E94940D882319F0C8
:1006F00083E693E04AC0EDB7FEB73A970FB6F89499
:10070000FEBF0FBEEDBF319688E493E0ADB7BEB734
:1007100012969C938E93119789819A81AB81BC81AB
:1007200082839383A483B5838D819E81AF81B885B5
:1007300086839783A087B1870E945C10EDB7FEB7D0
:100740003A960FB6F894FEBF0FBEEDBFED80FE8067
:100750008DB79EB78E199F090FB6F8949EBF0FBE36
:100760008DBF8DB69EB60894811C911C80E091E0EF
:1007700060E020E030E040E050E001E064010E94F1
:100780009F0C882331F08AE293E00E947E10299A20
:1007900082C08DE093E00E947E10AA24BB24A7E0D3
:1007A0002A2EA3E03A2EF2E04F2EF3E05F2EEFEF79
:1007B0006E2EE2E07E2E5AC0650174E0CC0CDD1C8A
:1007C0007A95E1F7C80CD91C00E010E000D000D009
:1007D000EDB7FEB73196ADB7BEB712963C922E92EA
:1007E0001197D601A00FB11F8C91828313820E94B2
:1007F0005C100F5F1F4F0F900F900F900F90003104
:10080000110521F700D0EDB7FEB7528241820E9458
:100810005C10EE24FF240F900F90F601EE0DFF1DEB
:100820008081082F10E0C8010E942A10892B11F442
:100830000EE210E060913E0170913F01C8010E94FC
:1008400030100894E11CF11CF0E1EF16F10429F7D7
:1008500000D0ADB7BEB712967C926E9211970E94EF
:100860005C100894A11CB11C0F900F90950140E002
:1008700050E08D819E81AF81B88564E0B695A795E3
:10088000979587956A95D1F7281739074A075B0727
:1008900008F492CF299880E0BED68B859C859C0178
:1008A0000FB6F8943EBF0FBE2DBFE985FA850FB68F
:1008B000F894FEBF0FBEEDBF2C960FB6F894DEBFC6
:1008C0000FBECDBFCF91DF911F910F91FF90EF90A1
:1008D000DF90CF90BF90AF909F908F907F906F9060
:1008E0005F904F903F902F90089584B7877F84BF8B
:1008F00038E10FB6F89430936000109260000FBE9C
:1009000080E090E020E80FB6F89420936100809397
:1009100061000FBE87E690E09093CD008093CC00FD
:1009200086E08093CA001092C8003093C900539AA1
:100930005A9A6A98729A219A29986E9A76986C9A1D
:10094000749A6F9A779812D36F9A7798EEE2F1E0E3
:10095000F0933D01E0933C01F0933F01E0933E01B1
:100960008EE0DF011D928A95E9F783E080933101E3
:100970008BEE9FE0909337018093360185EF9FE0E7
:1009800090933901809338010895AFDF81EE93E0B1
:100990000E947E10299A789465DE62D6FDCF982F4A
:1009A00020919E003091A0008091A0008F7D8093C7
:1009B000A00080919F008F7D80939F0080919E007A
:1009C000816080939E0028C080919F0085FF06C0B3
:1009D00080919F008F7D80939F00915080912D0189
:1009E000813011F491E01AC08091A60084FF09C003
:1009F0001092F5008091A6008F7E8093A60092E071
:100A00000DC08091A60081FF07C08091A6008D7F58
:100A10008093A60093E002C09923B1F620FD05C0A3
:100A200080919E008E7F80939E0035FF05C080914F
:100A3000A00080628093A000892F089560919E009D
:100A40008091A0008D7F8093A00080919E008260A5
:100A500080939E0080919E0081FDFCCF80919E003E
:100A6000816080939E00109223013091A0008091BC
:100A7000A0008F7D8093A00080919F008F7D809348
:100A80009F002AE040EA5FE080919F0085FF0BC055
:100A900080919F008F7D80939F0080919F008D7F2C
:100AA00080939F0005C0CA010197F1F7215061F7BB
:100AB00035FF05C08091A00080628093A00060FD9A
:100AC00005C080919E008E7F80939E008091A00043
:100AD00082608093A0000895EF920F931F93DF939D
:100AE000CF93CDB7DEB728970FB6F894DEBF0FBE11
:100AF000CDBF80912D01853009F4A1C0863068F406
:100B00008230B9F1833018F48823A1F00DC183300D
:100B1000D1F1843009F008C16AC0873009F4A8C057
:100B2000873008F497C0883009F4C0C0893009F0D4
:100B3000FBC0E4C0009121011091220101151105B3
:100B400009F4F2C081E02BDF682F882331F0809117
:100B5000200180932D0191E0E3C0C801019790939B
:100B6000220180932101892B09F0DEC080912001B0
:100B700007C088EE93E0909322018093210183E0E7
:100B800080932D01D1C08091210190912201019784
:100B90009093220180932101019629F080EA9FE041
:100BA0000197F1F7C1C0779A8091D8008061809356
:100BB000D8008091DD008B7F8093DD008091D7008D
:100BC00080618093D7008091DD0082608093DD009A
:100BD0008091DD0084608093DD008091D7008F7E5E
:100BE0008093D7006F9A779A779884E0C9CF8091E5
:100BF0009F0080FF99C080919F008E7F80939F000F
:100C000080919F008D7F80939F008091DF008D7F7A
:100C10008093DF008091DE0082608093DE0080910F
:100C20009E00816080939E00E9D010922D0184E6A1
:100C300090E0909322018093210185E05CC0FEDE6C
:100C400010922D0188EC90E0909322018093210175
:100C500086E051C080E060E040E020E000E410E089
:100C6000EE246ED08091AC0087FF58C087E088CF1B
:100C7000A5E2B1E0E6E1F1E088E001900D9281505B
:100C8000E1F7CE010196A9D3682F882309F044C06B
:100C9000888580931E01D2DE10922D0188EC90E0B1
:100CA000909322018093210188E025C000911E01CC
:100CB00080E060E040E020E010E0EE2441D0809150
:100CC000AC0087FF2BC0A5E2B1E0EEE0F1E088E0E8
:100CD00001900D928150E1F780E090E07ED3682F83
:100CE0008823D1F410922D0184E690E090932201A4
:100CF0008093210189E08093200116C081E08093D8
:100D0000A1008AE080932D01F0DB0EC0892F9EDBCD
:100D1000779ADFDBDBD008C093E002C094E060E0AC
:100D200080912D01813091F728960FB6F894DEBF9F
:100D30000FBECDBFCF91DF911F910F91EF9008951E
:100D4000EF920F931F93E82F7E2D6295660F660F2B
:100D5000607C642B2F70622B382F726045C03093FB
:100D6000A7003E17A1F488E090E020E003C02F5FC9
:100D7000880F991F8017910710F42530C1F7922F23
:100D80009295907F972B562F40E020E008C050911D
:100D9000AA009091AB004091AD002091AE0091FF70
:100DA00022C08091A9008E7F8093A9008091AB0022
:100DB0008D7F8093AB008091A90081608093A90012
:100DC0005093AA009093AB004093AD002093AE00E7
:100DD0008091A90080628093A9008091AC0087FD7A
:100DE00002C080E007C03F5F373008F4B8CFE0931F
:100DF000A70081E01F910F91EF9008951092F800E5
:100E000090E09093A7001092AE001092A60010926E
:100E1000AB008091A9008E7F8093A9009F5F9730DF
:100E200081F70895482F3091A70020E02093A70074
:100E30008091AC0087FF10C09091AA008091AA0019
:100E40008073803111F080E001C080E89F70892BB1
:100E5000841711F481E008952F5F273039F7377038
:100E60003093A70080E008954091A2005091A30024
:100E700028E833E18091AA008073803129F48091C1
:100E8000A60080FF05C020C08091A60082FD1CC086
:100E90008091A60081FF02C081E0089580912D011C
:100EA000813011F482E008958091A2009091A30016
:100EB00084179507F9F22115310511F483E008959F
:100EC00021503040AC01D6CF80E0089570D077D06B
:100ED0008091D8008F778093D8008091D800806867
:100EE0008093D8008091D8008F7D8093D800809126
:100EF000D7008F778093D70084E189BD86E189BDD3
:100F000009B400FEFDCF81E080932D0110922301F2
:100F100080E480931E018091D80080648093D80083
:100F20008091DD0081608093DD008091DD00846030
:100F30008093DD008091D7008F7E8093D7006F9AD9
:100F400077988091DE0081608093DE008091DE00E2
:100F500084608093DE008091E0008E7F8093E000CB
:100F60008091D80080618093D8000895E7EDF0E08B
:100F700080818160808381E080932401A7CF17D096
:100F80001ED0E0EEF0E0808181608083A8EDB0E0CB
:100F90008C918F778C9319BCE7EDF0E080818E7F88
:100FA00080838C918F7E8C93109224010895E8EDBC
:100FB000F0E080818C7F80831092A00008951092D1
:100FC000DA0010929F0008951F920F920FB60F92B1
:100FD0000BB60F9211242F933F934F935F936F9310
:100FE0007F938F939F93AF93BF93EF93FF938091E2
:100FF0009F0085FF0AC08091A00085FF06C08091F8
:101000009F008F7D80939F00BED180919F0081FFC4
:1010100015C08091A00081FF11C080919F008D7F3D
:1010200080939F0080919F008E7F80939F0080918E
:10103000A0008D7F8093A0004CDA48DF8091DF0014
:1010400081FF15C08091DE0081FF11C08091DF001B
:101050008D7F8093DF00779A8091DD00816080939F
:10106000DD0080E01CDA35DA81E080932D0180918B
:10107000DF0080FF17C08091DE0080FF13C08091E9
:10108000DF008E7F8093DF008091DE008E7F809373
:10109000DE0025DA8091A00082608093A00082E0CB
:1010A00080932D018091DF0082FF0EC08091DE00D1
:1010B00082FF0AC08091DF008B7F8093DF0082E097
:1010C00060E0C4D906DA02DFFF91EF91BF91AF91E2
:1010D0009F918F917F916F915F914F913F912F9150
:1010E0000F900BBE0F900FBE0F901F901895BF92E0
:1010F000CF92DF92EF92FF920F931F93CF93DF93E4
:10110000182F092F7B016A018091AA008F7C8061D2
:101110008093AA00A9DEB82E8823A9F5812F902FED
:101120009C01E901C114D10439F0F601808191815B
:10113000E81AF90AC80FD91F00E010E021C0809119
:10114000A60085FD15C08091A6008E778093A6002D
:10115000C114D10449F0F60180819181800F911F63
:101160009183808384E010C07FDE882349F00CC027
:101170008091AF0089930894E108F1080F5F1F4F39
:10118000E114F104E1F68B2DDF91CF911F910F91C6
:10119000FF90EF90DF90CF90BF900895BF92CF92D5
:1011A000DF92EF92FF920F931F93CF93DF93182F4D
:1011B000092F7B016A018091AA008F7C8062809355
:1011C000AA0052DEB82E8823A9F5812F902F9C010A
:1011D000E901C114D10439F0F60180819181E81A46
:1011E000F90AC80FD91F00E010E021C08091A600C5
:1011F00085FD15C08091A6008B778093A600C11451
:10120000D10449F0F60180819181800F911F918373
:10121000808384E010C028DE882349F00CC08991C7
:101220008093AF000894E108F1080F5F1F4FE114AD
:10123000F104E1F68B2DDF91CF911F910F91FF907B
:10124000EF90DF90CF90BF900895AF92BF92CF9272
:10125000DF92EF92FF920F931F93CF93DF937C0166
:10126000EB016A0124C0E881F981BE2EAF2E808196
:1012700090E098018017910708F49C01E20FF31F9A
:10128000F983E883F70180819181821B930B91831D
:10129000808388819981F6010995823041F08130FF
:1012A00069F4B882A982F7011183008307C0F701AE
:1012B0000081118101151105B1F682E0DF91CF9116
:1012C0001F910F91FF90EF90DF90CF90BF90AF9064
:1012D0000895CF92DF92EF92FF920F931F93DF93C7
:1012E000CF93CDB7DEB729970FB6F894DEBF0FBE08
:1012F000CDBF6B018A01790190E89093250196E0BA
:101300009093260190E0019792609093280180933A
:10131000270110922A011092290189E090E0909310
:101320002C0180932B011092A700CE01019655D07D
:10133000282F8823C1F48B819C81F60191838083BF
:10134000E816F90610F425E00EC090932C01809366
:101350002B01C80142D0282F882329F4F80181816C
:10136000823009F026E0822F29960FB6F894DEBF6E
:101370000FBECDBFCF91DF911F910F91FF90EF90E6
:10138000DF90CF90089508951F93CF93DF93182F88
:10139000C8EED3E009C081E002DB8823D1F42097B6
:1013A00011F484E016C02197112329F48091A6003E
:1013B00083FFF1CF0DC0113029F48091A60080FF8A
:1013C000EACF06C0123039F78091A60082FFE3CF42
:1013D00080E0DF91CF911F910895FF920F931F93AB
:1013E000CF93DF93182F092FF0909E00C0912B010F
:1013F000D0912C0180919E00816080939E0081E0BD
:10140000CEDA982F882309F0D7C08091AA008F7C6C
:101410008093AA001092F5008091A6008F7E8093A1
:10142000A6008091A9008F7B8093A900E5E2F1E0FE
:1014300081918093AF0081E0ED32F807C9F7809188
:10144000A60087778093A60080E09EDF982F8823F0
:1014500009F0B2C08091A90080648093A90081E066
:101460009EDA982F882309F0A7C0212F302FC901B9
:101470008C018091250187FF52C08091AA008F7C4A
:1014800080618093AA000115110569F52EC0809135
:10149000A9008F7B8093A90081E076DF982F8823B5
:1014A00009F08AC08091F6009091F700892B49F4E9
:1014B000C0E0D0E006C08091AF00F80181938F01B9
:1014C00021978091F6009091F700892B11F02097D9
:1014D00091F78091A90080648093A9008091A60073
:1014E0008E778093A600209791F68091AA008F7C3A
:1014F00080628093AA008091A9008F7B8093A900CD
:1015000082E042DF982F882309F056C08091A60020
:101510008B778093A60082E037DF982F4DC00115AE
:101520001105A9F18091AA008F7C80628093AA00A6
:101530008091A9008F7B8093A9001DC082E024DFE9
:10154000982F8823C9F580911E01282F30E007C00D
:10155000F80181918F018093AF00219739F080913C
:10156000F6009091F7008217930790F38091A60000
:101570008B778093A600209709F782E005DF982FEC
:101580008823D1F48091A90080648093A900809180
:10159000AA008F7C80618093AA008091A9008F7B34
:1015A0008093A90081E0F0DE982F882329F48091B0
:1015B000A6008E778093A6008091A9008064809316
:1015C000A900F0FC05C080919E008E7F80939E0054
:1015D00081E08093A8001092A800892FDF91CF911D
:1015E0001F910F91FF90089592E09093250191E053
:1015F00090932601109228011092270180932901CF
:1016000010922A0110922C0110922B011092A70027
:1016100080E090E0E2CE1F93182F1092250189E020
:1016200080932601109327011092280110922A011D
:101630001092290110922C0110922B011092A700F8
:1016400080E090E0CADE882349F41093230111233F
:1016500011F49AE001C09BE090932D011F91089531
:10166000FF920F931F9307EA10E0F801F080F7E074
:10167000FF22F801108230DAF801F0821F910F91F9
:10168000FF900895FC018181843059F48581883070
:1016900041F48681863029F48781803511F480E019
:1016A000089582E00895FC016091A2007091A3006A
:1016B00040814093A7008091A9008F7B8093A9006F
:1016C00020E137E245C08091A2009091A3008617E7
:1016D000970741F02115310511F483E00895215059
:1016E0003040BC018091A90080648093A900828170
:1016F0008093A7008091A9008F7B8093A90080919F
:10170000A60081FD10C08091A90080648093A9008B
:101710004093A7008091A9008F7B8093A9008091BE
:10172000A60081FF0FC09091AA008091AA0080734B
:10173000803111F080E001C080E89F70892B54DF78
:1017400081E0089580912D01813011F482E00895A7
:101750008091A60080FFB7CF4093A7008091A90099
:1017600080648093A90082818093A7008091A90062
:1017700080648093A90080E00895BF92CF92DF92A9
:10178000EF92FF920F931F93CF93DF93EC018B01A6
:101790007A018A859B85AC85BD850196A11DB11D09
:1017A0008A879B87AC87BD878F5F9F4FAF4FBF4FA7
:1017B00041F481E090E0A0E0B0E08A879B87AC87AD
:1017C000BD8785E593E5A2E4B3E4F80180839183C6
:1017D000A283B3838A859B85AC85BD8584839583ED
:1017E000A683B7838A818093A7008091A9008F7B0D
:1017F0008093A900C8016FE170E040E050E0CEDCCA
:10180000B82E882309F061C08091A6008B77809361
:10181000A6002ADB8091A90080648093A900E114CE
:10182000F10409F452C0F801C084D184848587FF93
:1018300021C0CE0138DF982F882331F08091A90094
:1018400080648093A9003BC088818093A700809129
:10185000A9008F7B8093A900C701B60140E050E04A
:1018600046DC982F882359F58091A6008E778093C7
:10187000A6001EC08A818093A7008091A9008F7B5B
:101880008093A900C701B60140E050E087DC982FA3
:101890008823A9F48091A6008B778093A60004C0CA
:1018A00080912D01813051F08091A60082FFF8CF08
:1018B0008091A90080648093A90007C092E0809184
:1018C000A90080648093A900B92E8B2DDF91CF9160
:1018D0001F910F91FF90EF90DF90CF90BF900895F0
:1018E0000F931F93CF93DF93EC018B01DCDE982FD6
:1018F0008823F9F488818093A7008091A9008F7BC9
:101900008093A900C8016DE070E040E050E0EFDB9B
:10191000982F882371F48091A6008E778093A6007B
:101920008091A90080648093A900F80184858111C9
:1019300090E8892FDF91CF911F910F9108954F92D9
:101940005F926F927F928F929F92AF92BF92CF924F
:10195000DF92EF92FF920F931F93DF93CF93CDB758
:10196000DEB7AC970FB6F894DEBF0FBECDBF3C011B
:10197000462E49015A01502E80912D018B30D9F508
:10198000F30184818823B9F18E01025F1F4F8FE13B
:10199000F80111928A95E9F7B70180E090E0252DD2
:1019A00030E040E050E035D36E8B7F8B888F998F8D
:1019B00080E88A8F4B8E8AE08C8F88E28D8F8B2D0A
:1019C0009927AA27BB278F8FC501AA27BB2788A3E2
:1019D000BB27AB2D9A2D892D89A38AA25DA2C301B5
:1019E000B801A601CADE882339F4C301BE016F5FC6
:1019F0007F4F76DF01C081E0AC960FB6F894DEBF72
:101A00000FBECDBFCF91DF911F910F91FF90EF904F
:101A1000DF90CF90BF90AF909F908F907F906F900E
:101A20005F904F9008950F931F93DF93CF93CDB79F
:101A3000DEB7AC970FB6F894DEBF0FBECDBF8C01FA
:101A400080912D018B30F9F4D80114968C91882364
:101A5000D1F0FE013E968FE1DF011D928A95E9F7F4
:101A60006B8F86E08C8F8EE18D8F48A3C801BF01FC
:101A700040E050E082DE882339F4C801BE016F5F88
:101A80007F4F2EDF01C081E0AC960FB6F894DEBF29
:101A90000FBECDBFCF91DF911F910F9108950F938E
:101AA0001F93DF93CF93CDB7DEB7AC970FB6F89403
:101AB000DEBF0FBECDBF8C0180912D018B3041F573
:101AC000D80114968C91882319F1FE013E968FE17E
:101AD000DF011D928A95E9F782E190E0A0E0B0E095
:101AE0008E8B9F8BA88FB98F80E88A8F6B8F86E053
:101AF0008C8F83E08D8F82E189A3C801BF013DDE19
:101B0000882339F4C801BE016F5F7F4FE9DE01C051
:101B100081E0AC960FB6F894DEBF0FBECDBFCF917B
:101B2000DF911F910F910895AF92BF92CF92DF92F4
:101B3000EF92FF920F931F93DF93CF93CDB7DEB752
:101B4000AC970FB6F894DEBF0FBECDBF5C016A0143
:101B500080912D018B3009F085C0D50114968C91B0
:101B6000882309F47FC0FE013E968FE1DF011D92BC
:101B70008A95E9F788E090E0A0E0B0E08E8B9F8B3B
:101B8000A88FB98F80E88A8F6B8F8AE08C8F85E26F
:101B90008D8FC501BF01F1DD882309F064C0F60116
:101BA0002081318142815381122F0027FF24EE24AE
:101BB000852F9927AA27BB27E82AF92A0A2B1B2B4E
:101BC000DA01C90180709070B070892F9A2FAB2F05
:101BD000BB27E82AF92A0A2B1B2B20704070507073
:101BE000542F432F322F2227E22AF32A042B152BBE
:101BF000D601ED92FD920D931C93139714962D919F
:101C00003D914D915C911797122F0027FF24EE24F0
:101C1000852F9927AA27BB27E82AF92A0A2B1B2BED
:101C2000DA01C90180709070B070892F9A2FAB2FA4
:101C3000BB27E82AF92A0A2B1B2B20704070507012
:101C4000542F432F322F2227E22AF32A042B152B5D
:101C5000E482F58206831783C501BE016F5F7F4F63
:101C60003FDE01C081E0AC960FB6F894DEBF0FBE38
:101C7000CDBFCF91DF911F910F91FF90EF90DF903B
:101C8000CF90BF90AF9008950F931F93DF93CF93A2
:101C9000CDB7DEB7AC970FB6F894DEBF0FBECDBFA1
:101CA0008C0180912D018B30F1F4D80114968C9128
:101CB0008823C9F0FE013E968FE1DF011D928A95CF
:101CC000E9F780E88A8F6B8F86E08C8FC801BF01AF
:101CD00040E050E052DD882339F4C801BE016F5F57
:101CE0007F4FFEDD01C081E0AC960FB6F894DEBFF9
:101CF0000FBECDBFCF91DF911F910F9108950F932C
:101D00001F93DF93CF93CDB7DEB7AC970FB6F894A0
:101D1000DEBF0FBECDBF8C0180912D018B3041F510
:101D2000D80114968C91882319F1FE013E968FE11B
:101D3000DF011D928A95E9F784E290E0A0E0B0E02F
:101D40008E8B9F8BA88FB98F80E88A8F6B8F86E0F0
:101D50008C8F82E18D8F84E289A3C801BF010DDDE4
:101D6000882339F4C801BE016F5F7F4FB9DD01C020
:101D700081E0AC960FB6F894DEBF0FBECDBFCF9119
:101D8000DF911F910F910895CF93DF93EB01FC0139
:101D9000958181EA809325018EEF80932601109230
:101DA0002801109227019093290110922A0181E0C5
:101DB00090E090932C0180932B011092A700CB010F
:101DC0000CDB833011F4188280E0DF91CF9108950D
:101DD000CF93DF93EC018D8191E2909325019FEFEA
:101DE00090932601109228011092270180932901D7
:101DF00010922A0110922C0110922B011092A70030
:101E000080E090E0EADA882311F588818093A700CA
:101E10009091AA008091AA008073803111F080E037
:101E200001C080E89F70892BDFDB882381F48A81E1
:101E30008093A7009091AA008091AA0080738031BE
:101E400011F080E001C080E89F70892BCDDBDF912D
:101E5000CF9108956F927F928F929F92AF92BF928F
:101E6000CF92DF92EF92FF920F931F93DF93CF9366
:101E700000D000D00F92CDB7DEB76C017A836983B2
:101E80005C834B830496FC018AE0DF011D928A95F6
:101E9000E9F7EB81FC818181823011F081E073C030
:101EA00088249924AA24BB2466247724B3E0EB2E4B
:101EB000F12CEC0EFD1E8E010F5F1F4F611471049B
:101EC00039F0C801B70147ED5FE0BFD9882381F041
:101ED000C801B70142E45BE0B8D9882311F082E081
:101EE00052C06B807C80AA24BB2488249924E6CF2E
:101EF000EB81FC81828187FD02C05F0101C04F013F
:101F000081149104D9F2A114B104C1F291E0F60157
:101F10008081981761F4D40114960D911C91159746
:101F200012962C9181811783068340E10FC0F60140
:101F300082819817D9F4D50114960D911C911597AB
:101F400012962C9183811187008740E2882311F437
:101F500030E001C034E0892F62E0E32E9D830E94CF
:101F6000A0069D81882311F483E00DC09F5F973008
:101F700071F6F3018281D60115968C93159781E055
:101F800014968C9380E00F900F900F900F900F900D
:101F9000CF91DF911F910F91FF90EF90DF90CF9045
:101FA000BF90AF909F908F907F906F900895FC01AD
:101FB0008181853051F483818370823051F4828134
:101FC0000E941207882329F40895843011F481E0D7
:101FD000089582E00895982F8091C80085FFFCCF76
:101FE0009093CE0080E090E008958091C80087FD36
:101FF00003C02EEF3FEF0BC08091C80087FD03C0E8
:102000002FEF3FEF04C08091CE00282F30E0C901B0
:102010000895629FD001739FF001829FE00DF11D32
:10202000649FE00DF11D929FF00D839FF00D749F52
:10203000F00D659FF00D9927729FB00DE11DF91FFE
:10204000639FB00DE11DF91FBD01CF01112408955B
:10205000803209F0911180C280528F55E0F70895C7
:102060000F931F93CF93DF938C01EB018B8181FF43
:102070001BC082FF0DC02E813F818C819D8128175E
:10208000390764F4E881F9810193F983E88306C094
:10209000E885F985802F0995892B31F48E819F8100
:1020A00001969F838E8302C00FEF1FEFC801DF915F
:1020B000CF911F910F910895DF93CF93CDB7DEB7E6
:1020C000FE01359661917191A0913E01B0913F0161
:1020D00013968C911397886013968C9380913E0190
:1020E00090913F01AF013FD0E0913E01F0913F015F
:1020F0002381277F2383CF91DF9108950F931F932F
:10210000CF93DF93EC01E0913E01F0913F01838199
:1021100081FF21C000E010E00EC0E0913E01F0918F
:102120003F0120853185BF01F9010995892B11F007
:102130000FEF1FEF2196FE018491882371F7E09144
:102140003E01F0913F01208531858AE0BF01F90110
:102150000995892B11F00FEF1FEFC801DF91CF9187
:102160001F910F9108952F923F924F925F926F921D
:102170007F928F929F92AF92BF92CF92DF92EF9217
:10218000FF920F931F93DF93CF93CDB7DEB72B97BB
:102190000FB6F894DEBF0FBECDBF3C012B015A0134
:1021A000FC0117821682838181FD03C06FEF7FEFF0
:1021B000B9C19AE0892E1E010894211C311CF3013B
:1021C0002381F20123FD859123FF81912F01882333
:1021D00009F4A5C1853239F423FD859123FF81914E
:1021E0002F01853221F490E0B3013ADFE8CF982F38
:1021F000FF24EE249924FFE1FF15D0F09B3269F013
:102200009C3228F4903259F0933291F40EC09D32F2
:1022100049F0903369F441E024C052E0F52A84E0AB
:10222000F82A28C098E0F92A25C0E0E1FE2A22C059
:10223000F7FC29C0892F80538A3070F4F6FE05C060
:10224000989C902C1124980E15C0E89CE02C112429
:10225000E80EF0E2FF2A0EC09E3229F4F6FC5FC1C0
:1022600040E4F42A07C09C3619F450E8F52A02C06D
:10227000983649F4F20123FD959123FF91912F01A6
:10228000992309F0B8CF892F8554833018F08052F4
:10229000833038F444E050E0A40EB51E5FE3598368
:1022A0000FC0933631F0933779F0933509F052C06F
:1022B0001FC0F5018081898342E050E0A40EB51E65
:1022C000610101E010E011C0F501C080D180F6FC91
:1022D00003C06FEF7FEF02C0692D70E042E050E075
:1022E000A40EB51EC60146D18C015FE7F52213C0CE
:1022F000F501C080D180F6FC03C06FEF7FEF02C014
:10230000692D70E042E050E0A40EB51EC60127D151
:102310008C0150E8F52AF3FE06C018C080E290E078
:10232000B3019EDEEA948E2D90E008171907B0F3F2
:102330000DC0F601F7FC8591F7FE81916F0190E0E9
:10234000B3018EDEE110EA94015010400115110531
:1023500081F7E2C0943611F0993661F5F7FE08C0B6
:10236000F501208131814281538184E090E00AC0EF
:10237000F501808191819C01442737FD4095542FC0
:1023800082E090E0A80EB91E9FE6F92257FF09C02F
:1023900050954095309521953F4F4F4F5F4FE0E866
:1023A000FE2ACA01B901A1012AE030E0EED0D82E00
:1023B000D2183FC0953729F41F2D1F7E2AE030E048
:1023C0001DC01F2D197F9F3661F0903720F498357E
:1023D00009F0A5C00FC0903739F0983709F09FC0B9
:1023E00004C028E030E00AC0106114FD146020E150
:1023F00030E004C014FD166020E132E017FF08C091
:10240000F501608171818281938144E050E008C0D0
:10241000F50180819181BC0180E090E042E050E0D4
:10242000A40EB51EA101B1D0D82ED2188FE7F82E78
:10243000F122F6FE0BC05EEFF522D91438F4F4FE5B
:1024400007C0F2FC05C08FEEF82202C01D2D01C0AE
:10245000192DF4FE0DC0FE01ED0DF11D80818033BC
:1024600019F499EEF92208C01F5FF2FE05C003C0FF
:102470008F2D867809F01F5F0F2DF3FC13C0F0FE3F
:102480000EC01E1510F09D2C0AC09D2C9E0C911A9A
:102490001E2D05C080E290E0B301E2DD1F5F1E1536
:1024A000C8F304C01E1510F4E11A01C0EE2404FFA5
:1024B0000EC080E390E0B301D3DD02FF1BC001FD3D
:1024C00003C088E790E00EC088E590E00BC0802F45
:1024D000867881F001FF02C08BE201C080E2F7FC48
:1024E0008DE290E0B301BCDD05C080E390E0B30174
:1024F000B7DD9A94D914C8F3DA94F101ED0DF11D0A
:10250000808190E0B301ACDDDD20B1F705C080E251
:1025100090E0B301A5DDEA94EE20C9F750CEF301B7
:1025200066817781CB012B960FB6F894DEBF0FBE84
:10253000CDBFCF91DF911F910F91FF90EF90DF9072
:10254000CF90BF90AF909F908F907F906F905F9053
:102550004F903F902F900895992788270895FC0168
:102560000590615070400110D8F7809590958E0FBE
:102570009F1F0895FC016150704001900110D8F731
:10258000809590958E0F9F1F0895FA01AA272830F5
:1025900051F1203181F1E8946F936E7F6E5F7F4F30
:1025A0008F4F9F4FAF4FB1E03ED0B4E03CD0670FAC
:1025B000781F891F9A1FA11D680F791F8A1F911DFF
:1025C000A11D6A0F711D811D911DA11D20D009F44F
:1025D00068943F912AE0269F11243019305D319391
:1025E000DEF6CF010895462F4770405D4193B3E07A
:1025F0000FD0C9F7F6CF462F4F70405D4A3318F021
:10260000495D31FD4052419302D0A9F7EACFB4E0D1
:10261000A6959795879577956795BA95C9F7009789
:102620006105710508959B01AC010A2E069457952A
:10263000479537952795BA95C9F7620F731F841F81
:0A264000951FA01D0895F894FFCF28
:10264A000100020000000000000000000000000578
:10265A0001000000000080060001000008004000A0
:00000001FF

View File

@@ -0,0 +1,615 @@
:1000000006C2000022C2000020C200001EC2000082
:100010001CC200001AC2000018C2000016C2000074
:1000200014C2000012C20000C6C700000EC20000C9
:100030000CC200000AC2000008C2000006C2000094
:1000400004C2000002C2000000C20000FEC10000A5
:10005000FCC10000FAC10000F8C10000F6C10000B8
:10006000F4C10000F2C10000F0C10000EEC10000C8
:10007000ECC10000EAC10000E8C10000E6C10000D8
:10008000E4C10000E2C10000E0C10000DEC10000E8
:10009000DCC10000DAC100001B5B33316D446576C2
:1000A00020456E756D204572726F720D0A202D2DE0
:1000B000204572726F7220436F64652025640D0ABB
:1000C000202D2D20537562204572726F7220436F70
:1000D00064652025640D0A202D2D20496E2053745F
:1000E0006174652025640D0A1B5B33376D001B5B53
:1000F00033316D486F7374204D6F646520457272A3
:100100006F720D0A202D2D204572726F7220436F81
:1001100064652025640D0A1B5B33376D004D6173E8
:10012000732053746F7261676520446576696365F7
:1001300020456E756D6572617465642E0D0A0056FA
:10014000656E646F722022252E3873222C20507227
:100150006F647563742022252E313673220D0A00D8
:100160004572726F722072657472696576696E6726
:100170002064657669636520496E717569727920BE
:10018000646174612E0D0A004572726F722073658E
:100190007474696E672050726576656E742044656C
:1001A000766963652052656D6F76616C2062697453
:1001B0002E0D0A004572726F722072657472696545
:1001C00076696E67206465766963652073656E7312
:1001D000652E0D0A004572726F7220726573657428
:1001E00074696E67204D6173732053746F72616719
:1001F0006520696E746572666163652E0D0A005430
:100200006F74616C204C554E733A202564202D206C
:100210005573696E67206669727374204C554E2061
:10022000696E206465766963652E0D0A00457272F9
:100230006F722072657472696576696E67206D6190
:1002400078204C554E20696E6465782E0D0A004565
:1002500072726F722053657474696E67204465769C
:1002600069636520436F6E66696775726174696F53
:100270006E2E0D0A004174746163686564204465E4
:1002800076696365204E6F7420612056616C6964E5
:10029000204D6173732053746F72616765204465EC
:1002A000766963652E0D0A004572726F7220526581
:1002B0007472696576696E6720436F6E66696775EB
:1002C000726174696F6E2044657363726970746FD4
:1002D000722E0D0A000D0A44657669636520556E1D
:1002E00061747461636865642E0D0A004465766903
:1002F00063652041747461636865642E0D0A000DA6
:100300000A002020202000252E325820000D0A430C
:100310006F6E74656E7473206F6620666972737495
:1003200020626C6F636B3A0D0A004572726F722027
:1003300072656164696E67206465766963652062D1
:100340006C6F636B2E0D0A00256C7520626C6F63F9
:100350006B73206F6620256C752062797465732E2F
:100360000D0A004572726F7220726574726965764B
:10037000696E672064657669636520636170616397
:100380006974792E0D0A0052657472696576696E1A
:10039000672043617061636974792E2E2E0D0A0007
:1003A0004572726F722077616974696E6720666F3B
:1003B000722064657669636520746F2062652072BF
:1003C000656164792E0D0A0057616974696E672052
:1003D000756E74696C2072656164792E2E2E0D0A1B
:1003E000001B5B33366D4D6173732053746F726104
:1003F000676520486F73742044656D6F2072756E59
:100400006E696E672E0D0A1B5B33376D0000112479
:100410001FBECFEFD0E2DEBFCDBF11E0A0E0B1E064
:10042000E8E3F6E200E00BBF02C007900D92A032B5
:10043000B107D9F711E0A0E2B1E001C01D92A234EA
:10044000B107E1F7A2D20C941A13DACD90912D01E5
:100450002DB73EB7285030400FB6F8943EBF0FBEC0
:100460002DBFEDB7FEB7319628E930E0ADB7BEB786
:1004700012963C932E931197828313826483158284
:10048000968317820E945310299A2DB73EB7285F92
:100490003F4F0FB6F8943EBF0FBE2DBF08951F9378
:1004A000182F64D500D000D0EDB7FEB731968EEE90
:1004B00090E0ADB7BEB712969C938E9311971283BE
:1004C00013820E945310299A0F900F900F900F9053
:1004D000FFCF85ED92E00E947510299A08958CEE69
:1004E00092E00E947510299808950F931F93DF934F
:1004F000CF93CDB7DEB7C953D2400FB6F894DEBF65
:100500000FBECDBF29988E01065C1F4F81E0BE0152
:100510006E5F7F4FA80120E032E0D2D6882319F029
:1005200088EA92E00BC06A817B8180E091E0A801BB
:100530000E94210F882331F085E792E00E94751018
:10054000299A84C081E00E94020B882319F08FE46D
:1005500092E0F4CF80E091E0BE016F5F7F4F0E9498
:10056000BB0E882319F08DE292E044C000D000D089
:100570008FEF91E0ADB7BEB712969C938E93119713
:10058000898190E0019614969C938E9313970E9414
:1005900053100F900F900F900F9080E091E00E9409
:1005A000DF0E882319F085ED91E024C080E091E012
:1005B00060E0AE014C5F5F4F0E94460D882319F04A
:1005C00084EB91E017C080E091E060E041E00E94A0
:1005D0000A0D882319F088E891E00CC080E091E0D2
:1005E00060E0AE014A5E5F4F0E94760E882349F0BC
:1005F00080E691E00E947510299A80E00E94020B2B
:1006000025C000D000D000D0EDB7FEB731968FE303
:1006100091E0ADB7BEB712969C938E931197CE0121
:100620004E9693838283CE018696958384830E941F
:100630005310EDB7FEB736960FB6F894FEBF0FBE57
:10064000EDBF8DE191E00E9475102998C75CDD4FE8
:100650000FB6F894DEBF0FBECDBFCF91DF911F91D3
:100660000F9108952F923F924F925F926F927F92D7
:100670008F929F92AF92BF92CF92DF92EF92FF92B2
:100680000F931F93DF93CF93CDB7DEB72C970FB6A1
:10069000F894DEBF0FBECDBF8DB79EB79A8789870E
:1006A0009DB79B87AEB7AC8780912D018B3009F049
:1006B000F4C0299888EC93E00E94751080E091E0E6
:1006C00060E00E943B0E882329F08038B9F380EA6D
:1006D00093E05BC087E893E00E94751080E091E0B2
:1006E00060E0AE014F5F5F4F0E948B0D882319F0D1
:1006F00083E693E04AC0EDB7FEB73A970FB6F89499
:10070000FEBF0FBEEDBF319688E493E0ADB7BEB734
:1007100012969C938E93119789819A81AB81BC81AB
:1007200082839383A483B5838D819E81AF81B885B5
:1007300086839783A087B1870E945310EDB7FEB7D9
:100740003A960FB6F894FEBF0FBEEDBFED80FE8067
:100750008DB79EB78E199F090FB6F8949EBF0FBE36
:100760008DBF8DB69EB60894811C911C80E091E0EF
:1007700060E020E030E040E050E001E064010E94F1
:10078000960C882331F08AE293E00E947510299A32
:1007900082C08DE093E00E947510AA24BB24A7E0DC
:1007A0002A2EA3E03A2EF2E04F2EF3E05F2EEFEF79
:1007B0006E2EE2E07E2E5AC0650174E0CC0CDD1C8A
:1007C0007A95E1F7C80CD91C00E010E000D000D009
:1007D000EDB7FEB73196ADB7BEB712963C922E92EA
:1007E0001197D601A00FB11F8C91828313820E94B2
:1007F00053100F5F1F4F0F900F900F900F9000310D
:10080000110521F700D0EDB7FEB7528241820E9458
:100810005310EE24FF240F900F90F601EE0DFF1DF4
:100820008081082F10E0C8010E942110892B11F44B
:100830000EE210E060913E0170913F01C8010E94FC
:1008400027100894E11CF11CF0E1EF16F10429F7E0
:1008500000D0ADB7BEB712967C926E9211970E94EF
:1008600053100894A11CB11C0F900F90950140E00B
:1008700050E08D819E81AF81B88564E0B695A795E3
:10088000979587956A95D1F7281739074A075B0727
:1008900008F492CF299880E0B5D68B859C859C0181
:1008A0000FB6F8943EBF0FBE2DBFE985FA850FB68F
:1008B000F894FEBF0FBEEDBF2C960FB6F894DEBFC6
:1008C0000FBECDBFCF91DF911F910F91FF90EF90A1
:1008D000DF90CF90BF90AF909F908F907F906F9060
:1008E0005F904F903F902F90089584B7877F84BF8B
:1008F00038E10FB6F89430936000109260000FBE9C
:1009000080E090E020E80FB6F89420936100809397
:1009100061000FBE87E690E09093CD008093CC00FD
:1009200086E08093CA001092C8003093C900539AA1
:100930005A9A6A98729A219A29986B9A73986C9A23
:10094000749A6F9A779A09D36F9A779AEEE2F1E0E8
:10095000F0933D01E0933C01F0933F01E0933E01B1
:100960008EE0DF011D928A95E9F783E080933101E3
:1009700082EE9FE090933701809336018CEE9FE0EA
:1009800090933901809338010895AFDF81EE93E0B1
:100990000E947510299A789465DE59D6FDCF982F5C
:1009A00020919E003091A0008091A0008F7D8093C7
:1009B000A00080919F008F7D80939F0080919E007A
:1009C000816080939E0028C080919F0085FF06C0B3
:1009D00080919F008F7D80939F00915080912D0189
:1009E000813011F491E01AC08091A60084FF09C003
:1009F0001092F5008091A6008F7E8093A60092E071
:100A00000DC08091A60081FF07C08091A6008D7F58
:100A10008093A60093E002C09923B1F620FD05C0A3
:100A200080919E008E7F80939E0035FF05C080914F
:100A3000A00080628093A000892F089560919E009D
:100A40008091A0008D7F8093A00080919E008260A5
:100A500080939E0080919E0081FDFCCF80919E003E
:100A6000816080939E00109223013091A0008091BC
:100A7000A0008F7D8093A00080919F008F7D809348
:100A80009F002AE040EA5FE080919F0085FF0BC055
:100A900080919F008F7D80939F0080919F008D7F2C
:100AA00080939F0005C0CA010197F1F7215061F7BB
:100AB00035FF05C08091A00080628093A00060FD9A
:100AC00005C080919E008E7F80939E008091A00043
:100AD00082608093A0000895EF920F931F93DF939D
:100AE000CF93CDB7DEB728970FB6F894DEBF0FBE11
:100AF000CDBF80912D01853009F494C0863068F413
:100B00008230B9F1833018F48823A1F004C1833016
:100B1000D1F1843009F0FFC05DC0873009F49BC07B
:100B2000873008F48AC0883009F4B3C0893009F0EE
:100B3000F2C0D7C0009121011091220101151105C9
:100B400009F4E9C081E02BDF682F882331F0809120
:100B5000200180932D0191E0DAC0C80101979093A4
:100B6000220180932101892B09F0D5C080912001B9
:100B700007C088EE93E0909322018093210183E0E7
:100B800080932D01C8C0809121019091220101978D
:100B90009093220180932101019629F080EA9FE041
:100BA0000197F1F7B8C077988091D8008061809361
:100BB000D8008091DD008B7F8093DD008091D7008D
:100BC00080618093D7008091DD0082608093DD009A
:100BD00084E0D6CF80919F0080FF9DC080919F00D0
:100BE0008E7F80939F0080919F008D7F80939F00D8
:100BF0008091DF008D7F8093DF008091DE00826036
:100C00008093DE0080919E00816080939E00EDD0F5
:100C100010922D0184E690E09093220180932101AF
:100C200085E05CC00BDF10922D0188EC90E0909382
:100C300022018093210186E051C080E060E040E025
:100C400020E000E410E0EE2472D08091AC0087FF39
:100C50005CC087E095CFA5E2B1E0E6E1F1E088E095
:100C600001900D928150E1F7CE010196ADD3682F2E
:100C7000882309F048C0888580931E01DFDE10922A
:100C80002D0188EC90E0909322018093210188E06F
:100C900025C000911E0180E060E040E020E010E00F
:100CA000EE2445D08091AC0087FF2FC0A5E2B1E0D3
:100CB000EEE0F1E088E001900D928150E1F780E0F4
:100CC00090E082D3682F8823F1F410922D0184E6FE
:100CD00090E0909322018093210189E0809320018C
:100CE0001AC081E08093A1008AE080932D01FDDB92
:100CF00012C0892FABDB8091DD0081608093DD0025
:100D0000E8DBDBD008C093E002C094E060E08091B3
:100D10002D01813071F728960FB6F894DEBF0FBE13
:100D2000CDBFCF91DF911F910F91EF900895EF927A
:100D30000F931F93E82F7E2D6295660F660F607CE0
:100D4000642B2F70622B382F726045C03093A70040
:100D50003E17A1F488E090E020E003C02F5F880FE9
:100D6000991F8017910710F42530C1F7922F9295A3
:100D7000907F972B562F40E020E008C05091AA00AA
:100D80009091AB004091AD002091AE0091FF22C048
:100D90008091A9008E7F8093A9008091AB008D7F08
:100DA0008093AB008091A90081608093A90050934B
:100DB000AA009093AB004093AD002093AE008091C9
:100DC000A90080628093A9008091AC0087FD02C0D9
:100DD00080E007C03F5F373008F4B8CFE093A7004A
:100DE00081E01F910F91EF9008951092F80090E02C
:100DF0009093A7001092AE001092A6001092AB0044
:100E00008091A9008E7F8093A9009F5F973081F722
:100E10000895482F3091A70020E02093A7008091EB
:100E2000AC0087FF10C09091AA008091AA00807347
:100E3000803111F080E001C080E89F70892B841719
:100E400011F481E008952F5F273039F73770309320
:100E5000A70080E008954091A2005091A30028E8E7
:100E600033E18091AA008073803129F48091A6003B
:100E700080FF05C020C08091A60082FD1CC080912B
:100E8000A60081FF02C081E0089580912D0181308C
:100E900011F482E008958091A2009091A30084173C
:100EA0009507F9F22115310511F483E008952150D9
:100EB0003040AC01D6CF80E0089570D077D08091DB
:100EC000D8008F778093D8008091D8008068809375
:100ED000D8008091D8008F7D8093D8008091D70072
:100EE0008F778093D70084E189BD86E189BD09B4FD
:100EF00000FEFDCF81E080932D011092230180E45C
:100F000080931E018091D80080648093D8008091E6
:100F1000DD0081608093DD008091DD00846080933E
:100F2000DD008091D7008F7E8093D7006F9A779AEB
:100F30008091DE0081608093DE008091DE0084601D
:100F40008093DE008091E0008E7F8093E0008091AE
:100F5000D80080618093D8000895E7EDF0E08081AB
:100F60008160808381E080932401A7CF17D01ED0B9
:100F7000E0EEF0E0808181608083A8EDB0E08C91AC
:100F80008F778C9319BCE7EDF0E080818E7F8083B2
:100F90008C918F7E8C93109224010895E8EDF0E0FF
:100FA00080818C7F80831092A00008951092DA00D7
:100FB00010929F0008951F920F920FB60F920BB6DA
:100FC0000F9211242F933F934F935F936F937F93CF
:100FD0008F939F93AF93BF93EF93FF9380919F0065
:100FE00085FF0AC08091A00085FF06C080919F0008
:100FF0008F7D80939F00BED180919F0081FF15C09F
:101000008091A00081FF11C080919F008D7F80930F
:101010009F0080919F008E7F80939F008091A00011
:101020008D7F8093A00055DA48DF8091DF0081FF3B
:1010300015C08091DE0081FF11C08091DF008D7F9F
:101040008093DF0077988091DD0081608093DD00E0
:1010500080E025DA3EDA81E080932D018091DF0087
:1010600080FF17C08091DE0080FF13C08091DF00F9
:101070008E7F8093DF008091DE008E7F8093DE0084
:101080002EDA8091A00082608093A00082E080939D
:101090002D018091DF0082FF0EC08091DE0082FF73
:1010A0000AC08091DF008B7F8093DF0082E060E0E8
:1010B000CDD90FDA02DFFF91EF91BF91AF919F91F0
:1010C0008F917F916F915F914F913F912F910F90F1
:1010D0000BBE0F900FBE0F901F901895BF92CF922E
:1010E000DF92EF92FF920F931F93CF93DF93182F0E
:1010F000092F7B016A018091AA008F7C8061809317
:10110000AA00A9DEB82E8823A9F5812F902F9C0173
:10111000E901C114D10439F0F60180819181E81A06
:10112000F90AC80FD91F00E010E021C08091A60085
:1011300085FD15C08091A6008E778093A600C1140E
:10114000D10449F0F60180819181800F911F918334
:10115000808384E010C07FDE882349F00CC080913A
:10116000AF0089930894E108F1080F5F1F4FE11465
:10117000F104E1F68B2DDF91CF911F910F91FF903C
:10118000EF90DF90CF90BF900895BF92CF92DF9203
:10119000EF92FF920F931F93CF93DF93182F092F96
:1011A0007B016A018091AA008F7C80628093AA00F3
:1011B00052DEB82E8823A9F5812F902F9C01E901DA
:1011C000C114D10439F0F60180819181E81AF90A3D
:1011D000C80FD91F00E010E021C08091A60085FD56
:1011E00015C08091A6008B778093A600C114D1040E
:1011F00049F0F60180819181800F911F9183808356
:1012000084E010C028DE882349F00CC089918093C7
:10121000AF000894E108F1080F5F1F4FE114F104DB
:10122000E1F68B2DDF91CF911F910F91FF90EF9001
:10123000DF90CF90BF900895AF92BF92CF92DF9290
:10124000EF92FF920F931F93CF93DF937C01EB01FB
:101250006A0124C0E881F981BE2EAF2E808190E022
:1012600098018017910708F49C01E20FF31FF9839E
:10127000E883F70180819181821B930B91838083A6
:1012800088819981F6010995823041F0813069F4B5
:10129000B882A982F7011183008307C0F70100819A
:1012A000118101151105B1F682E0DF91CF911F91F7
:1012B0000F91FF90EF90DF90CF90BF90AF90089587
:1012C000CF92DF92EF92FF920F931F93DF93CF9312
:1012D000CDB7DEB729970FB6F894DEBF0FBECDBFEE
:1012E0006B018A01790190E89093250196E0909333
:1012F000260190E001979260909328018093270146
:1013000010922A011092290189E090E090932C011B
:1013100080932B011092A700CE01019655D0282F63
:101320008823C1F48B819C81F60191838083E81628
:10133000F90610F425E00EC090932C0180932B0148
:10134000C80142D0282F882329F4F80181818230F6
:1013500009F026E0822F29960FB6F894DEBF0FBE63
:10136000CDBFCF91DF911F910F91FF90EF90DF9054
:10137000CF90089508951F93CF93DF93182FC8EE51
:10138000D3E009C081E00BDB8823D1F4209711F46E
:1013900084E016C02197112329F48091A60083FFD1
:1013A000F1CF0DC0113029F48091A60080FFEACF63
:1013B00006C0123039F78091A60082FFE3CF80E0AB
:1013C000DF91CF911F910895FF920F931F93CF93B9
:1013D000DF93182F092FF0909E00C0912B01D09120
:1013E0002C0180919E00816080939E0081E0D7DA7D
:1013F000982F882309F0D7C08091AA008F7C809312
:10140000AA001092F5008091A6008F7E8093A6001E
:101410008091A9008F7B8093A900E5E2F1E08191A2
:101420008093AF0081E0ED32F807C9F78091A60004
:1014300087778093A60080E09EDF982F882309F0AD
:10144000B2C08091A90080648093A90081E0A7DAEE
:10145000982F882309F0A7C0212F302FC9018C01B4
:101460008091250187FF52C08091AA008F7C806106
:101470008093AA000115110569F52EC08091A9007D
:101480008F7B8093A90081E076DF982F882309F075
:101490008AC08091F6009091F700892B49F4C0E052
:1014A000D0E006C08091AF00F80181938F012197B1
:1014B0008091F6009091F700892B11F0209791F719
:1014C0008091A90080648093A9008091A6008E7706
:1014D0008093A600209791F68091AA008F7C80626D
:1014E0008093AA008091A9008F7B8093A90082E05D
:1014F00042DF982F882309F056C08091A6008B7791
:101500008093A60082E037DF982F4DC001151105AA
:10151000A9F18091AA008F7C80628093AA008091BB
:10152000A9008F7B8093A9001DC082E024DF982F43
:101530008823C9F580911E01282F30E007C0F801EB
:1015400081918F018093AF00219739F08091F6004F
:101550009091F7008217930790F38091A6008B7704
:101560008093A600209709F782E005DF982F882353
:10157000D1F48091A90080648093A9008091AA0091
:101580008F7C80618093AA008091A9008F7B8093DB
:10159000A90081E0F0DE982F882329F48091A6002D
:1015A0008E778093A6008091A90080648093A90023
:1015B000F0FC05C080919E008E7F80939E0081E0AC
:1015C0008093A8001092A800892FDF91CF911F91DE
:1015D0000F91FF90089592E09093250191E09093F0
:1015E0002601109228011092270180932901109260
:1015F0002A0110922C0110922B011092A70080E07A
:1016000090E0E2CE1F93182F1092250189E080937D
:101610002601109327011092280110922A0110929E
:10162000290110922C0110922B011092A70080E04A
:1016300090E0CADE882349F410932301112311F4AA
:101640009AE001C09BE090932D011F910895FF92B5
:101650000F931F9307EA10E0F801F080F7E0FF22F4
:10166000F801108239DAF801F0821F910F91FF9092
:101670000895FC018181843059F48581883041F4DA
:101680008681863029F48781803511F480E00895C1
:1016900082E00895FC016091A2007091A300408156
:1016A0004093A7008091A9008F7B8093A90020E13F
:1016B00037E245C08091A2009091A300861797075A
:1016C00041F02115310511F483E008952150304097
:1016D000BC018091A90080648093A90082818093DD
:1016E000A7008091A9008F7B8093A9008091A6001C
:1016F00081FD10C08091A90080648093A90040936F
:10170000A7008091A9008F7B8093A9008091A600FB
:1017100081FF0FC09091AA008091AA008073803150
:1017200011F080E001C080E89F70892B54DF81E0D8
:10173000089580912D01813011F482E00895809107
:10174000A60080FFB7CF4093A7008091A9008064D6
:101750008093A90082818093A7008091A900806472
:101760008093A90080E00895BF92CF92DF92EF921C
:10177000FF920F931F93CF93DF93EC018B017A01BC
:101780008A859B85AC85BD850196A11DB11D8A8783
:101790009B87AC87BD878F5F9F4FAF4FBF4F41F493
:1017A00081E090E0A0E0B0E08A879B87AC87BD87AE
:1017B00085E593E5A2E4B3E4F80180839183A283F5
:1017C000B3838A859B85AC85BD8584839583A683F9
:1017D000B7838A818093A7008091A9008F7B809333
:1017E000A900C8016FE170E040E050E0CEDCB82E07
:1017F000882309F061C08091A6008B778093A600B2
:101800002ADB8091A90080648093A900E114F1048F
:1018100009F452C0F801C084D184848587FF21C0B7
:10182000CE0138DF982F882331F08091A9008064A1
:101830008093A9003BC088818093A7008091A90074
:101840008F7B8093A900C701B60140E050E046DCE1
:10185000982F882359F58091A6008E778093A60053
:101860001EC08A818093A7008091A9008F7B8093FE
:10187000A900C701B60140E050E087DC982F88231B
:10188000A9F48091A6008B778093A60004C0809174
:101890002D01813051F08091A60082FFF8CF809118
:1018A000A90080648093A90007C092E08091A900FC
:1018B00080648093A900B92E8B2DDF91CF911F9169
:1018C0000F91FF90EF90DF90CF90BF9008950F930E
:1018D0001F93CF93DF93EC018B01DCDE982F8823DD
:1018E000F9F488818093A7008091A9008F7B809371
:1018F000A900C8016DE070E040E050E0EFDB982FF8
:10190000882371F48091A6008E778093A600809141
:10191000A90080648093A900F8018485811190E872
:10192000892FDF91CF911F910F9108954F925F9270
:101930006F927F928F929F92AF92BF92CF92DF92DF
:10194000EF92FF920F931F93DF93CF93CDB7DEB744
:10195000AC970FB6F894DEBF0FBECDBF3C01462E4C
:1019600049015A01502E80912D018B30D9F5F30198
:1019700084818823B9F18E01025F1F4F8FE1F80146
:1019800011928A95E9F7B70180E090E0252D30E0CB
:1019900040E050E035D36E8B7F8B888F998F80E845
:1019A0008A8F4B8E8AE08C8F88E28D8F8B2D9927C2
:1019B000AA27BB278F8FC501AA27BB2788A3BB27D0
:1019C000AB2D9A2D892D89A38AA25DA2C301B801EE
:1019D000A601CADE882339F4C301BE016F5F7F4FC1
:1019E00076DF01C081E0AC960FB6F894DEBF0FBE83
:1019F000CDBFCF91DF911F910F91FF90EF90DF90BE
:101A0000CF90BF90AF909F908F907F906F905F909E
:101A10004F9008950F931F93DF93CF93CDB7DEB709
:101A2000AC970FB6F894DEBF0FBECDBF8C0180918E
:101A30002D018B30F9F4D80114968C918823D1F0C4
:101A4000FE013E968FE1DF011D928A95E9F76B8FCB
:101A500086E08C8F8EE18D8F48A3C801BF0140E0E6
:101A600050E082DE882339F4C801BE016F5F7F4FEA
:101A70002EDF01C081E0AC960FB6F894DEBF0FBE3A
:101A8000CDBFCF91DF911F910F9108950F931F93B9
:101A9000DF93CF93CDB7DEB7AC970FB6F894DEBF28
:101AA0000FBECDBF8C0180912D018B3041F5D80147
:101AB00014968C91882319F1FE013E968FE1DF0187
:101AC0001D928A95E9F782E190E0A0E0B0E08E8B6C
:101AD0009F8BA88FB98F80E88A8F6B8F86E08C8F61
:101AE00083E08D8F82E189A3C801BF013DDE882399
:101AF00039F4C801BE016F5F7F4FE9DE01C081E0AC
:101B0000AC960FB6F894DEBF0FBECDBFCF91DF917C
:101B10001F910F910895AF92BF92CF92DF92EF92F3
:101B2000FF920F931F93DF93CF93CDB7DEB7AC97A0
:101B30000FB6F894DEBF0FBECDBF5C016A01809185
:101B40002D018B3009F085C0D50114968C91882326
:101B500009F47FC0FE013E968FE1DF011D928A9558
:101B6000E9F788E090E0A0E0B0E08E8B9F8BA88F33
:101B7000B98F80E88A8F6B8F8AE08C8F85E28D8F9A
:101B8000C501BF01F1DD882309F064C0F6012081A1
:101B9000318142815381122F0027FF24EE24852FAB
:101BA0009927AA27BB27E82AF92A0A2B1B2BDA0137
:101BB000C90180709070B070892F9A2FAB2FBB270E
:101BC000E82AF92A0A2B1B2B207040705070542FE2
:101BD000432F322F2227E22AF32A042B152BD6017A
:101BE000ED92FD920D931C93139714962D913D91B8
:101BF0004D915C911797122F0027FF24EE24852F1B
:101C00009927AA27BB27E82AF92A0A2B1B2BDA01D6
:101C1000C90180709070B070892F9A2FAB2FBB27AD
:101C2000E82AF92A0A2B1B2B207040705070542F81
:101C3000432F322F2227E22AF32A042B152BE4828A
:101C4000F58206831783C501BE016F5F7F4F3FDEBC
:101C500001C081E0AC960FB6F894DEBF0FBECDBFD9
:101C6000CF91DF911F910F91FF90EF90DF90CF9078
:101C7000BF90AF9008950F931F93DF93CF93CDB78D
:101C8000DEB7AC970FB6F894DEBF0FBECDBF8C01A8
:101C900080912D018B30F1F4D80114968C9188231A
:101CA000C9F0FE013E968FE1DF011D928A95E9F7AA
:101CB00080E88A8F6B8F86E08C8FC801BF0140E07F
:101CC00050E052DD882339F4C801BE016F5F7F4FB9
:101CD000FEDD01C081E0AC960FB6F894DEBF0FBE0A
:101CE000CDBFCF91DF911F910F9108950F931F9357
:101CF000DF93CF93CDB7DEB7AC970FB6F894DEBFC6
:101D00000FBECDBF8C0180912D018B3041F5D801E4
:101D100014968C91882319F1FE013E968FE1DF0124
:101D20001D928A95E9F784E290E0A0E0B0E08E8B06
:101D30009F8BA88FB98F80E88A8F6B8F86E08C8FFE
:101D400082E18D8F84E289A3C801BF010DDD882364
:101D500039F4C801BE016F5F7F4FB9DD01C081E07A
:101D6000AC960FB6F894DEBF0FBECDBFCF91DF911A
:101D70001F910F910895CF93DF93EB01FC019581A3
:101D800081EA809325018EEF80932601109228012D
:101D9000109227019093290110922A0181E090E08E
:101DA00090932C0180932B011092A700CB010CDBA8
:101DB000833011F4188280E0DF91CF910895CF93A2
:101DC000DF93EC018D8191E2909325019FEF909339
:101DD0002601109228011092270180932901109268
:101DE0002A0110922C0110922B011092A70080E082
:101DF00090E0EADA882311F588818093A70090911A
:101E0000AA008091AA008073803111F080E001C0A7
:101E100080E89F70892BDFDB882381F48A8180939F
:101E2000A7009091AA008091AA008073803111F0E0
:101E300080E001C080E89F70892BCDDBDF91CF91DE
:101E400008956F927F928F929F92AF92BF92CF929E
:101E5000DF92EF92FF920F931F93DF93CF9300D007
:101E600000D00F92CDB7DEB76C017A8369835C83B3
:101E70004B830496FC018AE0DF011D928A95E9F705
:101E8000EB81FC818181823011F081E073C0882474
:101E90009924AA24BB2466247724B3E0EB2EF12CEA
:101EA000EC0EFD1E8E010F5F1F4F6114710439F09F
:101EB000C801B7014EEC5FE0BFD9882381F0C801AB
:101EC000B70149E35BE0B8D9882311F082E052C042
:101ED0006B807C80AA24BB2488249924E6CFEB81E4
:101EE000FC81828187FD02C05F0101C04F01811426
:101EF0009104D9F2A114B104C1F291E0F6018081FC
:101F0000981761F4D40114960D911C9115971296AF
:101F10002C9181811783068340E10FC0F6018281F5
:101F20009817D9F4D50114960D911C911597129616
:101F30002C9183811187008740E2882311F430E0DF
:101F400001C034E0892F62E0E32E9D830E94970652
:101F50009D81882311F483E00DC09F5F973071F657
:101F6000F3018281D60115968C93159781E0149622
:101F70008C9380E00F900F900F900F900F90CF9167
:101F8000DF911F910F91FF90EF90DF90CF90BF9066
:101F9000AF909F908F907F906F900895FC0181810A
:101FA000853051F483818370823051F482810E94A4
:101FB0000907882329F40895843011F481E00895F5
:101FC00082E00895982F8091C80085FFFCCF909300
:101FD000CE0080E090E008958091C80087FD03C0A6
:101FE0002EEF3FEF0BC08091C80087FD03C02FEF9D
:101FF0003FEF04C08091CE00282F30E0C901089542
:10200000629FD001739FF001829FE00DF11D649FDC
:10201000E00DF11D929FF00D839FF00D749FF00D68
:10202000659FF00D9927729FB00DE11DF91F639F09
:10203000B00DE11DF91FBD01CF01112408958032BB
:1020400009F0911180C280528F55E0F708950F93E7
:102050001F93CF93DF938C01EB018B8181FF1BC01A
:1020600082FF0DC02E813F818C819D812817390709
:1020700064F4E881F9810193F983E88306C0E88577
:10208000F985802F0995892B31F48E819F810196E6
:102090009F838E8302C00FEF1FEFC801DF91CF91A6
:1020A0001F910F910895DF93CF93CDB7DEB7FE0157
:1020B000359661917191A0913E01B0913F011396C7
:1020C0008C911397886013968C9380913E01909128
:1020D0003F01AF013FD0E0913E01F0913F012381EC
:1020E000277F2383CF91DF9108950F931F93CF9381
:1020F000DF93EC01E0913E01F0913F01838181FF8C
:1021000021C000E010E00EC0E0913E01F0913F01DF
:1021100020853185BF01F9010995892B11F00FEF59
:102120001FEF2196FE018491882371F7E0913E0113
:10213000F0913F01208531858AE0BF01F9010995C1
:10214000892B11F00FEF1FEFC801DF91CF911F9185
:102150000F9108952F923F924F925F926F927F92CC
:102160008F929F92AF92BF92CF92DF92EF92FF92A7
:102170000F931F93DF93CF93CDB7DEB72B970FB697
:10218000F894DEBF0FBECDBF3C012B015A01FC010C
:1021900017821682838181FD03C06FEF7FEFB9C183
:1021A0009AE0892E1E010894211C311CF301238121
:1021B000F20123FD859123FF81912F01882309F4EA
:1021C000A5C1853239F423FD859123FF81912F012B
:1021D000853221F490E0B3013ADFE8CF982FFF2455
:1021E000EE249924FFE1FF15D0F09B3269F09C3278
:1021F00028F4903259F0933291F40EC09D3249F098
:10220000903369F441E024C052E0F52A84E0F82AD2
:1022100028C098E0F92A25C0E0E1FE2A22C0F7FC98
:1022200029C0892F80538A3070F4F6FE05C0989C2F
:10223000902C1124980E15C0E89CE02C1124E80E77
:10224000F0E2FF2A0EC09E3229F4F6FC5FC140E4A2
:10225000F42A07C09C3619F450E8F52A02C09836D3
:1022600049F4F20123FD959123FF91912F019923C8
:1022700009F0B8CF892F8554833018F0805283300D
:1022800038F444E050E0A40EB51E5FE359830FC05C
:10229000933631F0933779F0933509F052C01FC06F
:1022A000F5018081898342E050E0A40EB51E6101F2
:1022B00001E010E011C0F501C080D180F6FC03C040
:1022C0006FEF7FEF02C0692D70E042E050E0A40E96
:1022D000B51EC60146D18C015FE7F52213C0F5019A
:1022E000C080D180F6FC03C06FEF7FEF02C0692D84
:1022F00070E042E050E0A40EB51EC60127D18C016B
:1023000050E8F52AF3FE06C018C080E290E0B30161
:102310009EDEEA948E2D90E008171907B0F30DC0E9
:10232000F601F7FC8591F7FE81916F0190E0B30112
:102330008EDEE110EA94015010400115110581F77D
:10234000E2C0943611F0993661F5F7FE08C0F50148
:10235000208131814281538184E090E00AC0F501FF
:10236000808191819C01442737FD4095542F82E064
:1023700090E0A80EB91E9FE6F92257FF09C05095BC
:102380004095309521953F4F4F4F5F4FE0E8FE2A33
:10239000CA01B901A1012AE030E0EED0D82ED2184E
:1023A0003FC0953729F41F2D1F7E2AE030E01DC065
:1023B0001F2D197F9F3661F0903720F4983509F072
:1023C000A5C00FC0903739F0983709F09FC004C0FE
:1023D00028E030E00AC0106114FD146020E130E014
:1023E00004C014FD166020E132E017FF08C0F501BB
:1023F000608171818281938144E050E008C0F501E1
:1024000080819181BC0180E090E042E050E0A40E28
:10241000B51EA101B1D0D82ED2188FE7F82EF12227
:10242000F6FE0BC05EEFF522D91438F4F4FE07C0B7
:10243000F2FC05C08FEEF82202C01D2D01C0192D3F
:10244000F4FE0DC0FE01ED0DF11D8081803319F405
:1024500099EEF92208C01F5FF2FE05C003C08F2D60
:10246000867809F01F5F0F2DF3FC13C0F0FE0EC03D
:102470001E1510F09D2C0AC09D2C9E0C911A1E2D2D
:1024800005C080E290E0B301E2DD1F5F1E15C8F3D6
:1024900004C01E1510F4E11A01C0EE2404FF0EC0A2
:1024A00080E390E0B301D3DD02FF1BC001FD03C058
:1024B00088E790E00EC088E590E00BC0802F86781A
:1024C00081F001FF02C08BE201C080E2F7FC8DE2E7
:1024D00090E0B301BCDD05C080E390E0B301B7DD5F
:1024E0009A94D914C8F3DA94F101ED0DF11D8081AD
:1024F00090E0B301ACDDDD20B1F705C080E290E0F3
:10250000B301A5DDEA94EE20C9F750CEF301668150
:102510007781CB012B960FB6F894DEBF0FBECDBFEF
:10252000CF91DF911F910F91FF90EF90DF90CF90AF
:10253000BF90AF909F908F907F906F905F904F90E3
:102540003F902F900895992788270895FC010590C2
:10255000615070400110D8F7809590958E0F9F1FA5
:102560000895FC016150704001900110D8F78095EA
:1025700090958E0F9F1F0895FA01AA27283051F1D8
:10258000203181F1E8946F936E7F6E5F7F4F8F4FA4
:102590009F4FAF4FB1E03ED0B4E03CD0670F781F03
:1025A000891F9A1FA11D680F791F8A1F911DA11DE8
:1025B0006A0F711D811D911DA11D20D009F4689421
:1025C0003F912AE0269F11243019305D3193DEF6C9
:1025D000CF010895462F4770405D4193B3E00FD07F
:1025E000C9F7F6CF462F4F70405D4A3318F0495D6A
:1025F00031FD4052419302D0A9F7EACFB4E0A6954D
:102600009795879577956795BA95C9F7009761056E
:10261000710508959B01AC010A2E069457954795C4
:1026200037952795BA95C9F7620F731F841F951FB9
:08263000A01D0895F894FFCFEE
:10263800010002000000000000000000000000058A
:1026480001000000000080060001000008004000B2
:00000001FF

View File

@@ -30,36 +30,41 @@
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device, using avrdude.
# Please customize the avrdude settings below first!
# Assumes the target is connected through an AVR ISP mkII programmer
#
# make cdc = Download the hex file to the device, using avrdude.
# Assumes the target device is running the LUFA CDC Bootloader
# Make sure to set the CDC_BOOTLOADER_PORT variable
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
# (must have Atmel FLIP installed).
#
# make doxygen = Generate DoxyGen documentation for the project (must have
# DoxyGen installed)
# DoxyGen installed)
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# MCU name
# MCU name - uncomment _ONE_ of the following
#MCU = at90usb647
MCU = at90usb1287
@@ -67,24 +72,46 @@ MCU = at90usb1287
ARCH = AVR8
# Target board (see library "Board Types" documentation, NONE for projects not requiring
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
# "Board" inside the application directory.
BOARD = USBKEY
# Target board:
# - USER for custom board drivers in LUFA/LUFA/Drivers/Board/Board/*
# - NONE for projects not requiring LUFA board drivers such as boards
# with no LEDs and just an HWB button such as: Micropendous1, Micropendous2,
# Micropendous-32U2, or Micropendous3 or Micropendous4 without external SRAM
# - MICROPENDOUS_32U2 for Micropendous-32U2 which has 1 user LED on PD6
# http://www.Micropendous.org/Micropendous-32U2
# - MICROPENDOUS_A for Micropendous-A, Micropendous3, or Micropendous3 boards with external SRAM
# where PE6 is the external SRAM Chip Enable Pin and PE7 is Address Bit 17/Bank Selector Pin
# http://www.Micropendous.org/Micropendous-A
# - MICROPENDOUS_REV1 for the Micropendous Arduino-like board with the
# CY7C1019D external SRAM IC or its DIP variant:
# http://www.Micropendous.org/Micropendous-REV1
# http://www.Micropendous.org/Micropendous-DIP
# - MICROPENDOUS_REV2 for the Micropendous Arduino-like board with the
# IS61C1024AL external SRAM IC:
# http://www.Micropendous.org/Micropendous
# Typical values are:
# BOARD = NONE
# BOARD = USER
# BOARD = MICROPENDOUS_A
# BOARD = MICROPENDOUS_REV1
# BOARD = MICROPENDOUS_REV2
BOARD = MICROPENDOUS_REV2
# Enable External SRAM: Defining to YES will enable external SRAM use
# via the linker. For more info visit www.Micropendous.org/SRAM
ENABLE_EXTERNAL_SRAM = NO
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 8000000
# USB AVR possible values are:
# F_CPU = 8000000
# F_CPU = 16000000
F_CPU = 16000000
# Input clock frequency.
@@ -101,6 +128,13 @@ F_CPU = 8000000
F_USB = $(F_CPU)
# When using the LUFA CDC AVR109-compatible bootloader, you need to set this
# to the port under which your device enumerated. Under Windows it will be
# something like COM5 (Start->Control Panel->System->Hardware->Device Manager->Ports (COM and LPT))
# Under Linux it will be something like /dev/ttyACM0 which you can find with dmesg
CDC_BOOTLOADER_PORT = COM5
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
@@ -116,13 +150,20 @@ OBJDIR = .
# Path to the LUFA library
LUFA_PATH = ../../../..
LUFA_PATH = ../../libs/LUFA
AVRLIB_PATH = ../../libs/avrlib
ARDUINO_PATH = ../../libs/Arduino1
# LUFA library compile-time options and predefined tokens
LUFA_OPTS = -D USB_HOST_ONLY
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
LUFA_OPTS += -D USB_STREAM_TIMEOUT_MS=5000
# All Micropendous boards except Rev.2 require inverted VBUS control to select USB connector appropriately or have control of PE7
ifneq ($(BOARD),MICROPENDOUS_REV2)
LUFA_OPTS += -D NO_AUTO_VBUS_MANAGEMENT
LUFA_OPTS += -D INVERTED_VBUS_ENABLE_LINE
endif
# Create the LUFA source path variables by including the LUFA root makefile
@@ -130,9 +171,9 @@ include $(LUFA_PATH)/LUFA/makefile
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c \
$(LUFA_SRC_USB) \
$(LUFA_SRC_USBCLASS) \
SRC = $(TARGET).c \
$(LUFA_SRC_USB) \
$(LUFA_SRC_USBCLASS) \
$(LUFA_SRC_SERIAL)
@@ -150,6 +191,28 @@ CPPSRC =
ASRC =
#---------------- External Memory Options ----------------
EXTMEMOPTS =
# for the AT90USB1287 with its 8KB of SRAM, external addresses start at 0x20FF
# 0xFFFF(65535) - 0x2100(8448) = 0xDEFF(57087) --> 58KB of available external SRAM
# SAFEST OPTION:
#EXTMEMOPTS +=-Wl,--defsym=__stack=0x802000,--section-start,.data=0x802100,--defsym=__heap_start=0x80DFFF,--defsym=__heap_end=0x80FFFF
ifeq ($(ENABLE_EXTERNAL_SRAM), YES)
# The following will leave the stack in internal memory, place .data+.bss in external memory, and
# leave the final (0x80FFFF-0x80DFFF)=0x2000= 8192 bytes for the heap (which malloc() will use)
# Alter __heap_start to leave more space for the heap
EXTMEMOPTS +=-Wl,--defsym=__stack=0x8020FC,--section-start,.data=0x802100,--defsym=__heap_start=0x80DFFF,--defsym=__heap_end=0x80FFFF
# the following would place .data+.bss and the stack in internal SRAM and only the heap in external SRAM using an AT90USB1287:
#EXTMEMOPTS +=-Wl,--defsym=__stack=0x8020FC,--section-start,.data=0x800100,--defsym=__heap_start=0x802100,--defsym=__heap_end=0x80FFFF
# the following would place .data+.bss such that it overlaps internal and external SRAM with the first 1024 bytes in internal SRAM:
#EXTMEMOPTS +=-Wl,--defsym=__stack=0x801C00,--section-start,.data=0x801D00,--defsym=__heap_start=0x80DFFF,--defsym=__heap_end=0x80FFFF
endif
# Optimization level, can be [0, 1, 2, 3, s].
# 0 = turn off optimization. s = optimize for size.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
@@ -167,7 +230,7 @@ DEBUG = dwarf-2
# Each directory must be seperated by a space.
# Use forward slashes for directory separators.
# For a directory that has spaces, enclose it in quotes.
EXTRAINCDIRS = $(LUFA_PATH)/
EXTRAINCDIRS = $(LUFA_PATH)/ $(AVRLIB_PATH)/ $(ARDUINO_PATH)/
# Compiler flag to set the C Standard level.
@@ -305,20 +368,6 @@ EXTRALIBDIRS =
#---------------- External Memory Options ----------------
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# used for variables (.data/.bss) and heap (malloc()).
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# only used for heap (malloc()).
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
EXTMEMOPTS =
#---------------- Linker Options ----------------
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
@@ -339,7 +388,7 @@ LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
# Type: avrdude -c ?
# to get a full listing.
#
AVRDUDE_PROGRAMMER = jtagmkII
AVRDUDE_PROGRAMMER = avrispmkII
# com1 = serial port. Use lpt1 to connect to parallel port.
AVRDUDE_PORT = usb
@@ -360,7 +409,7 @@ AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
# to submit bug reports.
#AVRDUDE_VERBOSE = -v -v
AVRDUDE_VERBOSE = -v -v
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
@@ -516,6 +565,9 @@ gccversion :
program: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
cdc: $(TARGET).hex
$(AVRDUDE) $(AVRDUDE_VERBOSE) -c avr109 -P $(CDC_BOOTLOADER_PORT) -p $(MCU) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
flip: $(TARGET).hex
batchisp -hardware usb -device $(MCU) -operation erase f
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program

View File

@@ -1,13 +1,13 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
Copyright (C) Dean Camera, 2011.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
@@ -54,7 +54,7 @@
* number of device configurations. The descriptor is read out by the USB host when the enumeration
* process begins.
*/
USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
{
.Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
@@ -81,7 +81,7 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
* and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
* a configuration so that the host may correctly communicate with the USB device.
*/
USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
{
.Config =
{
@@ -143,7 +143,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
{
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
.EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM),
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM),
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
.PollingIntervalMS = 0xFF
@@ -169,7 +169,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
{
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
.EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM),
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM),
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize = CDC_TXRX_EPSIZE,
.PollingIntervalMS = 0x01
@@ -179,7 +179,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
{
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
.EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM),
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM),
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize = CDC_TXRX_EPSIZE,
.PollingIntervalMS = 0x01
@@ -190,7 +190,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
* the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
* via the language ID table available at USB.org what languages the device supports for its string descriptors.
*/
USB_Descriptor_String_t PROGMEM LanguageString =
const USB_Descriptor_String_t PROGMEM LanguageString =
{
.Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
@@ -201,22 +201,22 @@ USB_Descriptor_String_t PROGMEM LanguageString =
* form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
* Descriptor.
*/
USB_Descriptor_String_t PROGMEM ManufacturerString =
const USB_Descriptor_String_t PROGMEM ManufacturerString =
{
.Header = {.Size = USB_STRING_LEN(20), .Type = DTYPE_String},
.Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
.UnicodeString = L"www.Micropendous.org"
.UnicodeString = L"Dean Camera"
};
/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
* and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
* Descriptor.
*/
USB_Descriptor_String_t PROGMEM ProductString =
const USB_Descriptor_String_t PROGMEM ProductString =
{
.Header = {.Size = USB_STRING_LEN(23), .Type = DTYPE_String},
.UnicodeString = L"LUFA USB Virtual Serial"
.UnicodeString = L"LUFA USB-RS232 Adapter"
};
/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"

View File

@@ -1,13 +1,13 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
Copyright (C) Dean Camera, 2011.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
@@ -65,11 +65,15 @@
typedef struct
{
USB_Descriptor_Configuration_Header_t Config;
// CDC Command Interface
USB_Descriptor_Interface_t CDC_CCI_Interface;
USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header;
USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM;
USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union;
USB_Descriptor_Endpoint_t CDC_NotificationEndpoint;
// CDC Data Interface
USB_Descriptor_Interface_t CDC_DCI_Interface;
USB_Descriptor_Endpoint_t CDC_DataOutEndpoint;
USB_Descriptor_Endpoint_t CDC_DataInEndpoint;

View File

@@ -1,120 +0,0 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
#include "RingBuff.h"
void Buffer_Initialize(RingBuff_t* const Buffer)
{
BUFF_ATOMIC_BLOCK
{
Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer;
Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer;
Buffer->Elements = 0;
}
}
void Buffer_StoreElement(RingBuff_t* const Buffer, RingBuff_Data_t Data)
{
BUFF_ATOMIC_BLOCK
{
#if defined(BUFF_DROPOLD)
if (Buffer->Elements == BUFF_LENGTH)
{
Buffer->OutPtr++;
if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH])
Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer;
}
else
{
Buffer->Elements++;
}
#elif defined(BUFF_DROPNEW)
if (Buffer->Elements == BUFF_LENGTH)
return;
Buffer->Elements++;
#elif defined(BUFF_NODROPCHECK)
Buffer->Elements++;
#endif
*(Buffer->InPtr) = Data;
Buffer->InPtr++;
if (Buffer->InPtr == &Buffer->Buffer[BUFF_LENGTH])
Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer;
}
}
RingBuff_Data_t Buffer_GetElement(RingBuff_t* const Buffer)
{
RingBuff_Data_t BuffData;
BUFF_ATOMIC_BLOCK
{
#if defined(BUFF_EMPTYRETURNSZERO)
if (!(Buffer->Elements))
return 0;
#elif !defined(BUFF_NOEMPTYCHECK)
#error No empty buffer check behavior specified.
#endif
BuffData = *(Buffer->OutPtr);
Buffer->OutPtr++;
Buffer->Elements--;
if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH])
Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer;
}
return BuffData;
}
#if defined(BUFF_USEPEEK)
RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* const Buffer)
{
RingBuff_Data_t BuffData;
BUFF_ATOMIC_BLOCK
{
#if defined(BUFF_EMPTYRETURNSZERO)
if (!(Buffer->Elements))
return 0;
#elif !defined(BUFF_NOEMPTYCHECK)
#error No empty buffer check behavior specified.
#endif
BuffData = *(Buffer->OutPtr);
}
return BuffData;
}
#endif

View File

@@ -1,116 +0,0 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/* Buffer Configuration: */
/* Buffer length - select static size of created ring buffers: */
#define BUFF_STATICSIZE 128 // Set to the static ring buffer size for all ring buffers (place size after define)
/* Volatile mode - uncomment to make buffers volatile, for use in ISRs, etc: */
#define BUFF_VOLATILE // Uncomment to cause all ring buffers to become volatile (and atomic if multi-byte) in access
/* Drop mode - select behaviour when Buffer_StoreElement called on a full buffer: */
#define BUFF_DROPOLD // Uncomment to cause full ring buffers to drop the oldest character to make space when full
// #define BUFF_DROPNEW // Uncomment to cause full ring buffers to drop the new character when full
// #define BUFF_NODROPCHECK // Uncomment to ignore full ring buffer checks - checking left to user!
/* Underflow behaviour - select behaviour when Buffer_GetElement is called with an empty ring buffer: */
//#define BUFF_EMPTYRETURNSZERO // Uncomment to return 0 when an empty ring buffer is read
#define BUFF_NOEMPTYCHECK // Uncomment to disable checking of empty ring buffers - checking left to user!
/* Buffer storage type - set the datatype for the stored data */
#define BUFF_DATATYPE uint8_t // Change to the data type that is going to be stored into the buffer
/* Peek routine - uncomment to include the peek routine (fetches next byte without removing it from the buffer */
//#define BUFF_USEPEEK
#ifndef _RINGBUFF_H_
#define _RINGBUFF_H_
/* Includes: */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/atomic.h>
#include <limits.h>
#include <LUFA/Common/Common.h>
/* Defines and checks: */
#if defined(BUFF_STATICSIZE)
#define BUFF_LENGTH BUFF_STATICSIZE
#else
#error No buffer length specified!
#endif
#if !(defined(BUFF_DROPOLD) || defined(BUFF_DROPNEW) || defined(BUFF_NODROPCHECK))
#error No buffer drop mode specified.
#endif
#if !defined(BUFF_DATATYPE)
#error Ringbuffer storage data type not specified.
#endif
#if defined(BUFF_VOLATILE)
#define BUFF_MODE volatile
#define BUFF_ATOMIC_BLOCK ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
#else
#define BUFF_MODE
#define BUFF_ATOMIC_BLOCK
#endif
#if (BUFF_STATICSIZE > LONG_MAX)
#define RingBuff_Elements_t uint64_t
#elif (BUFF_STATICSIZE > INT_MAX)
#define RingBuff_Elements_t uint32_t
#elif (BUFF_STATICSIZE > CHAR_MAX)
#define RingBuff_Elements_t uint16_t
#else
#define RingBuff_Elements_t uint8_t
#endif
/* Type Defines: */
typedef BUFF_DATATYPE RingBuff_Data_t;
typedef BUFF_MODE struct
{
RingBuff_Data_t Buffer[BUFF_LENGTH];
RingBuff_Data_t* InPtr;
RingBuff_Data_t* OutPtr;
RingBuff_Elements_t Elements;
} RingBuff_t;
/* Function Prototypes: */
void Buffer_Initialize(RingBuff_t* const Buff);
void Buffer_StoreElement(RingBuff_t* const Buffer, RingBuff_Data_t Data);
RingBuff_Data_t Buffer_GetElement(RingBuff_t* const Buffer);
#if defined(BUFF_USEPEEK)
RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* const Buffer);
#endif
#endif

View File

@@ -1,13 +1,13 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
Copyright (C) Dean Camera, 2011.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
@@ -31,16 +31,22 @@
/** \file
*
* Main source file for the USBtoSerial project. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
* the project and is responsible for the initial application hardware configuration.
*/
#include "USBtoSerial.h"
/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */
RingBuff_t USBtoUSART_Buffer;
static RingBuffer_t USBtoUSART_Buffer;
/** Underlying data buffer for \ref USBtoUSART_Buffer, where the stored bytes are located. */
static uint8_t USBtoUSART_Buffer_Data[128];
/** Circular buffer to hold data from the serial port before it is sent to the host. */
RingBuff_t USARTtoUSB_Buffer;
static RingBuffer_t USARTtoUSB_Buffer;
/** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */
static uint8_t USARTtoUSB_Buffer_Data[128];
/** LUFA CDC Class driver interface configuration and state information. This structure is
* passed to all CDC Class driver functions, so that multiple instances of the same class
@@ -66,6 +72,7 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
},
};
/** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop.
*/
@@ -73,8 +80,8 @@ int main(void)
{
SetupHardware();
RingBuffer_InitBuffer(&USBtoUSART_Buffer);
RingBuffer_InitBuffer(&USARTtoUSB_Buffer);
RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data));
RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data));
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
sei();
@@ -92,20 +99,30 @@ int main(void)
}
/* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */
RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);
if ((TIFR0 & (1 << TOV0)) || (BufferCount > 200))
uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);
if ((TIFR0 & (1 << TOV0)) || (BufferCount > (uint8_t)(sizeof(USARTtoUSB_Buffer_Data) * .75)))
{
/* Clear flush timer expiry flag */
TIFR0 |= (1 << TOV0);
/* Read bytes from the USART receive buffer into the USB IN endpoint */
while (BufferCount--)
CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer));
{
/* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
{
break;
}
/* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
RingBuffer_Remove(&USARTtoUSB_Buffer);
}
}
/* Load the next byte from the USART transmit buffer into the USART */
if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer)))
Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer));
Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer));
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
USB_USBTask();
@@ -122,76 +139,6 @@ void SetupHardware(void)
/* Disable clock division */
clock_prescale_set(clock_div_1);
/* disable JTAG to allow corresponding pins to be used - PF4, PF5, PF6, PF7 */
/* TODO - remove this if you want to use your JTAG debugger to debug this firmware */
#if (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \
defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \
defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || \
defined(__AVR_ATmega32U6__))
// note the JTD bit must be written twice within 4 clock cycles to disable JTAG
// you must also set the IVSEL bit at the same time, which requires IVCE to be set first
// port pull-up resistors are enabled - PUD(Pull Up Disable) = 0
MCUCR = (1 << JTD) | (1 << IVCE) | (0 << PUD);
MCUCR = (1 << JTD) | (0 << IVSEL) | (0 << IVCE) | (0 << PUD);
#endif
/* Hardware Initialization */
/* enable Ports based on which IC is being used */
/* For more information look over the corresponding AVR's datasheet in the
'I/O Ports' Chapter under subheading 'Ports as General Digital I/O' */
#if (defined(__AVR_AT90USB162__) || defined(__AVR_AT90USB82__) || \
defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__))
DDRD = 0;
PORTD = 0xFF;
DDRB = 0;
PORTB = 0xFF;
DDRC = 0;
PORTC |= (1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7); //only PC2,4,5,6,7 are pins
// be careful using PortC as PC0 is used for the Crystal and PC1 is nRESET
#endif
#if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
DDRD = 0;
PORTD = 0xFF;
DDRB = 0;
PORTB = 0xFF;
DDRC = 0;
PORTC = (1 << PC6) | (1 << PC7); //only PC6,7 are pins
DDRE = 0;
PORTE = (1 << PE2) | (1 << PE6); //only PE2,6 are pins
DDRF = 0;
PORTF = (1 << PF0) | (1 << PF1) | (1 << PF4) | (1 << PF5) | (1 << PF6) | (1 << PF7); // only PF0,1,4,5,6,7 are pins
#endif
#if (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \
defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \
defined(__AVR_ATmega32U6__))
DDRA = 0;
PORTA = 0xFF;
DDRB = 0;
PORTB = 0xFF;
DDRC = 0;
PORTC = 0xFF;
DDRD = 0;
PORTD = 0xFF;
DDRE = 0;
PORTE = 0xFF;
DDRF = 0;
PORTF = 0xFF;
#if (BOARD == BOARD_MICROPENDOUS)
// set PortB pin 1 to an output as it connects to an LED on the Micropendous
DDRB |= (1 << PB1);
// Set PE4=1 to disable external SRAM, PE6=0 to disable TXB0108, PE7=1 to select USB-B connector
DDRE |= ((1 << PE4) | (1 << PE6) | (1 << PE7));
PORTE |= ((1 << PE4) | (1 << PE7));
PORTE &= ~(1 << PE6);
#else // other boards such as the Micropendous3 or Micropendous4
// Set PE6=1 to disable external SRAM
DDRE |= (1 << PE6);
PORTE |= (1 << PE6);
#endif
#endif
/* Hardware Initialization */
LEDs_Init();
USB_Init();

View File

@@ -1,13 +1,13 @@
/*
LUFA Library
Copyright (C) Dean Camera, 2010.
Copyright (C) Dean Camera, 2011.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
@@ -44,11 +44,10 @@
#include "Descriptors.h"
#include "Lib/LightweightRingBuff.h"
#include <LUFA/Version.h>
#include <LUFA/Drivers/Board/LEDs.h>
#include <LUFA/Drivers/Peripheral/Serial.h>
#include <LUFA/Drivers/Misc/RingBuffer.h>
#include <LUFA/Drivers/USB/USB.h>
/* Macros: */

View File

@@ -6,7 +6,7 @@
/** \mainpage USB to Serial Converter Project
*
* \section SSec_Compat Project Compatibility:
* \section Sec_Compat Project Compatibility:
*
* The following list indicates what microcontrollers are compatible with this project.
*
@@ -15,7 +15,7 @@
* - Series 4 USB AVRs (ATMEGAxxU4)
* - Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2)
*
* \section SSec_Info USB Information:
* \section Sec_Info USB Information:
*
* The following table gives a rundown of the USB utilization of this project.
*
@@ -42,7 +42,7 @@
* </tr>
* </table>
*
* \section SSec_Description Project Description:
* \section Sec_Description Project Description:
*
* USB to Serial bridge project. This project allows a USB AVR to serve
* as a USB to USART bridge between a USB host and a device lacking a
@@ -63,7 +63,7 @@
* Operating Systems should automatically use their own inbuilt
* CDC-ACM drivers.
*
* \section SSec_Options Project Options
* \section Sec_Options Project Options
*
* The following defines can be found in this project, which can control the project behaviour when defined, or changed in value.
*

View File

@@ -1,11 +0,0 @@
Purpose: Emulate a Serial Port (COM Port). The communications
protocol is emulated on the USB AVR's UART.
Pins: RX - PD2
TX - PD3
DTR - PD7
RTS - PD5
Notes: - DTR and RTS are active low, meaning that if you
"set" them the pins will go to 0/Low and if you
"clear" them they will go to 1/High.

View File

@@ -59,42 +59,36 @@
#----------------------------------------------------------------------------
# MCU name - uncomment _ONE_ of the following
#MCU = at90usb82
#MCU = at90usb162
#MCU = atmega16u2
#MCU = atmega32u2
#MCU = atmega32u4
#MCU = at90usb646
#MCU = at90usb647
#MCU = at90usb1286
# MCU name
MCU = at90usb1287
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Target board (see library "Board Types" documentation, NONE for projects not requiring
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
# "Board" inside the application directory.
BOARD = USBKEY
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency. You can then use this symbol in your source code to
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
# Typical values are:
# F_CPU = 8000000
# F_CPU = 16000000
F_CPU = 16000000
# Target board: NONE for projects not requiring LUFA board drivers.
# USER for boards with no LEDs and just an HWB button such as
# Micropendous1, Micropendous2, Micropendous3, or Micropendous4
# MICROPENDOUS for the Micropendous and Micropendous-DIP
# Typical values are:
# BOARD = NONE
# BOARD = USER
# BOARD = MICROPENDOUS
BOARD = MICROPENDOUS
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 8000000
# Input clock frequency.
# This will define a symbol, F_CLOCK, in all source code files equal to the
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
@@ -104,26 +98,7 @@ BOARD = MICROPENDOUS
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_CLOCK = $(F_CPU)
#---------------- External Memory Options ----------------
EXTMEMOPTS =
# 64 KB of external SRAM, starting after internal RAM used for variables (.data/.bss) and heap (malloc())
# for the ATmega128 and AT90USB647 with their 4KB of SRAM, external addresses start at 0x1100
# 0xFFFF(65535) - 0x1100(4352) = 0xEEFF(61183) --> 61KB of available external SRAM
#EXTMEMOPTS += -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
# for the AT90USB1287 with its 8KB of SRAM, external addresses start at 0x20FF
# 0xFFFF(65535) - 0x2100(8448) = 0xDEFF(57087) --> 58KB of available external SRAM
# SAFEST OPTION:
#EXTMEMOPTS += -Wl,-Tdata=0x802100,--defsym=__heap_end=0x80ffff
# Can really only be certain that the AT90USB1287-based Micropendous boards have external SRAM
ifeq ($(BOARD), MICROPENDOUS)
EXTMEMOPTS += -Wl,-Tdata=0x802100,--defsym=__heap_end=0x80ffff
endif
F_USB = $(F_CPU)
# Output format. (can be srec, ihex, binary)
@@ -140,14 +115,14 @@ TARGET = USBtoSerial
OBJDIR = .
# Path to the LUFA library as well as other available libraries
# Make sure to add these to the EXTRAINCDIRS variable below
LUFA_PATH = ../../libs/LUFA
AVRLIB_PATH = ../../libs/avrlib
# Path to the LUFA library
LUFA_PATH = ../..
# LUFA library compile-time options and predefined tokens
LUFA_OPTS = -D USB_DEVICE_ONLY
LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0
LUFA_OPTS += -D ORDERED_EP_CONFIG
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
@@ -160,9 +135,9 @@ include $(LUFA_PATH)/LUFA/makefile
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c \
Descriptors.c \
$(LUFA_SRC_USB) \
SRC = $(TARGET).c \
Descriptors.c \
$(LUFA_SRC_USB) \
$(LUFA_SRC_USBCLASS)
@@ -197,7 +172,7 @@ DEBUG = dwarf-2
# Each directory must be seperated by a space.
# Use forward slashes for directory separators.
# For a directory that has spaces, enclose it in quotes.
EXTRAINCDIRS = $(LUFA_PATH)/ $(AVRLIB_PATH)/
EXTRAINCDIRS = $(LUFA_PATH)/
# Compiler flag to set the C Standard level.
@@ -210,20 +185,20 @@ CSTANDARD = -std=c99
# Place -D or -U options here for C sources
CDEFS = -DF_CPU=$(F_CPU)UL
CDEFS += -DF_CLOCK=$(F_CLOCK)UL
CDEFS += -DBOARD=BOARD_$(BOARD)
CDEFS += -DF_USB=$(F_USB)UL
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
CDEFS += $(LUFA_OPTS)
# Place -D or -U options here for ASM sources
ADEFS = -DF_CPU=$(F_CPU)
ADEFS += -DF_CLOCK=$(F_CLOCK)UL
ADEFS += -DF_USB=$(F_USB)UL
ADEFS += -DBOARD=BOARD_$(BOARD)
ADEFS += $(LUFA_OPTS)
# Place -D or -U options here for C++ sources
CPPDEFS = -DF_CPU=$(F_CPU)UL
CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL
CPPDEFS += -DF_USB=$(F_USB)UL
CPPDEFS += -DBOARD=BOARD_$(BOARD)
CPPDEFS += $(LUFA_OPTS)
#CPPDEFS += -D__STDC_LIMIT_MACROS
@@ -335,6 +310,20 @@ EXTRALIBDIRS =
#---------------- External Memory Options ----------------
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# used for variables (.data/.bss) and heap (malloc()).
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# only used for heap (malloc()).
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
EXTMEMOPTS =
#---------------- Linker Options ----------------
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
@@ -695,7 +684,6 @@ clean_list :
@echo $(MSG_CLEANING)
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET)eep.hex
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
@@ -709,13 +697,22 @@ clean_list :
$(REMOVEDIR) .dep
doxygen:
@echo Generating Project Documentation...
@echo Generating Project Documentation \($(TARGET)\)...
@doxygen Doxygen.conf
@echo Documentation Generation Complete.
clean_doxygen:
rm -rf Documentation
checksource:
@for f in $(SRC) $(CPPSRC) $(ASRC); do \
if [ -f $$f ]; then \
echo "Found Source File: $$f" ; \
else \
echo "Source File Not Found: $$f" ; \
fi; done
# Create object files directory
$(shell mkdir $(OBJDIR) 2>/dev/null)
@@ -728,5 +725,4 @@ $(shell mkdir $(OBJDIR) 2>/dev/null)
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff doxygen clean \
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
debug gdb-config
debug gdb-config checksource

View File

@@ -1,182 +0,0 @@
/* Copyright (c) 2009 By Eric B. Weddington
All rights reserved.
Defines missing from currently used versions of avr-libc.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
* Neither the name of the copyright holders nor the names of
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __MISSING_DEFINES__
#define __MISSING_DEFINES__
#include <avr/version.h>
#ifndef PINHIGH
#define PINHIGH(PORT, PIN) PORT |= (1 << PIN);
#endif
#ifndef PINLOW
#define PINLOW(PORT, PIN) PORT &= ~(1 << PIN);
#endif
/* Missing WinAVR include defines */
/* WinAVR does not define these for the ATmega??u4*/
#if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
#ifndef PB7
#define PB7 7
#endif
#ifndef PB6
#define PB6 6
#endif
#ifndef PB5
#define PB5 5
#endif
#ifndef PB4
#define PB4 4
#endif
#ifndef PB3
#define PB3 3
#endif
#ifndef PB2
#define PB2 2
#endif
#ifndef PB1
#define PB1 1
#endif
#ifndef PB0
#define PB0 0
#endif
#ifndef PC7
#define PC7 7
#endif
#ifndef PC6
#define PC6 6
#endif
#ifndef PD7
#define PD7 7
#endif
#ifndef PD6
#define PD6 6
#endif
#ifndef PD5
#define PD5 5
#endif
#ifndef PD4
#define PD4 4
#endif
#ifndef PD3
#define PD3 3
#endif
#ifndef PD2
#define PD2 2
#endif
#ifndef PD1
#define PD1 1
#endif
#ifndef PD0
#define PD0 0
#endif
#ifndef PE2
#define PE2 2
#endif
#ifndef PE6
#define PE6 6
#endif
#ifndef PF7
#define PF7 7
#endif
#ifndef PF6
#define PF6 6
#endif
#ifndef PF5
#define PF5 5
#endif
#ifndef PF4
#define PF4 4
#endif
#ifndef PF1
#define PF1 1
#endif
#ifndef PF0
#define PF0 0
#endif
#endif
// missing avr-libc Linux defines
//#ifndef clock_prescale_set
//#if (__AVR_LIBC_VERSION__ < 10606UL)
#ifndef clock_div_1
#define clock_div_1 0
#endif
#ifndef clock_div_2
#define clock_div_2 1
#endif
#ifndef clock_div_4
#define clock_div_4 2
#endif
#ifndef clock_div_8
#define clock_div_8 3
#endif
#ifndef clock_div_16
#define clock_div_16 4
#endif
#ifndef clock_div_32
#define clock_div_32 5
#endif
#ifndef clock_div_64
#define clock_div_64 6
#endif
#ifndef clock_div_128
#define clock_div_128 7
#endif
#ifndef clock_div_256
#define clock_div_256 8
#endif
#ifndef clock_prescale_set
#define clock_prescale_set(x) \
{ \
uint8_t tmp = _BV(CLKPCE); \
__asm__ __volatile__ ( \
"in __tmp_reg__,__SREG__" "\n\t" \
"cli" "\n\t" \
"sts %1, %0" "\n\t" \
"sts %1, %2" "\n\t" \
"out __SREG__, __tmp_reg__" \
: /* no outputs */ \
: "d" (tmp), \
"M" (_SFR_MEM_ADDR(CLKPR)), \
"d" (x) \
: "r0"); \
}
#endif
//#endif // (__AVR_LIBC_VERSION__ < 10606UL)
#endif // MissingDefines.h