This commit is contained in:
pesceWanda 2016-07-05 23:50:29 -04:00
commit 5298353468
7 changed files with 1071 additions and 0 deletions

253
Arduino-keyboard-0.2.hex Normal file
View file

@ -0,0 +1,253 @@
:100000009EC00000B7C00000B5C00000B3C0000033
:10001000B1C00000AFC00000ADC00000ABC0000028
:10002000A9C00000A7C00000A5C00000E7C30000F1
:10003000A1C000009FC000009DC000009BC0000048
:1000400099C0000097C0000095C0000093C0000058
:1000500091C000008FC000008DC0000056C100009C
:1000600089C0000087C0000085C0000083C0000078
:1000700081C000007FC000007DC000007BC0000088
:1000800079C0000077C0000075C0000073C0000098
:1000900071C000006FC0000005010906A1017501D3
:1000A0009508050719E029E715002501810295014A
:1000B0007508810395057501050819012905910247
:1000C00095017503910395067508150025650507CB
:1000D000190029658100C01201100100000008EB21
:1000E0000342200000010200010902220001010078
:1000F000C0320904000001030101000921110100BF
:1001000001223F000705810308000A0403090410C7
:1001100003410072006400750069006E006F00000A
:10012000001A034B006500790062006F00610072E5
:10013000006400200030002E003200000000112476
:100140001FBECFEFD2E0DEBFCDBF11E0A0E0B1E037
:10015000E0EBFFE002C005900D92AE30B107D9F799
:1001600011E0AEE0B1E001C01D92AE3AB107E1F797
:100170004ED01CC745CFBF92CF92DF92EF92FF9235
:100180000F931F93CF93DF9384B7877F84BF28E1BA
:100190000FB6F89420936000109260000FBE3CEC04
:1001A000C32ED12C87E690E0F601918380839AECF0
:1001B000E92EF12C86E0B82EF701B08208EC10E0B1
:1001C000F8011082C9ECD0E02883539A5A9A0BD3D5
:1001D00084E085BD5F9A579A1882F8011082F70172
:1001E00010828FEC90E0F60191838083F701B0825A
:1001F00082E0F801808388E98883DF91CF911F91A5
:100200000F91FF90EF90DF90CF90BF900895B3DFF4
:100210002FB7F8948FE191E09093A00180939F0114
:100220009093A2018093A1012FBF789480E091E088
:10023000E7D584D4FBCF0895089580E091E0B8D548
:10024000E2EEF0E0808184608083089580E091E0B8
:1002500087C480910B0190910C01009729F00197C0
:1002600090930C0180930B0108950F931F93CF93EC
:10027000DF93E8019FB7F8948091A3019FBF883076
:1002800050F1AEE0B1E08FE191E0E091A101F09199
:10029000A2015191F093A201E093A10141E0EF3955
:1002A000F40721F49093A2018093A1016FB7F89411
:1002B0004091A30141504093A3016FBF5D9341E082
:1002C000A631B40711F7809116019091C80095FFEF
:1002D000FCCF8093CE00EEE0F1E0822F932FDC0183
:1002E00081918D9381E0E631F807D1F788E090E0C5
:1002F0009983888380E0DF91CF911F910F910895BA
:10030000F90180818093160108951F920F920FB614
:100310000F9211242F938F939F93EF93FF938091CC
:10032000CE009EB39430F9F4E0919F01F091A001CA
:100330008083E0919F01F091A001CF0101969093FD
:10034000A00180939F0121E08F39920721F48FE172
:1003500091E0928381839FB7F8948091A3018F5F8E
:100360008093A3019FBFFF91EF919F918F912F9158
:100370000F900FBE0F901F901895933089F0943016
:1003800028F4913059F1923071F505C09132E1F0C5
:10039000923249F51EC022E230E0E9EEF0E027C0DB
:1003A000813049F0813018F08230E9F408C0EBE088
:1003B000F1E0249107C0EFE0F1E0249103C0E1E215
:1003C000F1E0249130E013C029E030E0EBEFF0E001
:1003D0000EC02FE330E0E8E9F0E009C022E130E0B0
:1003E000E7EDF0E004C020E030E0E0E0F0E0DA012A
:1003F0001196FC93EE93C901089528E030E040E0A7
:1004000003C04F5F220F331F28173907D0F3842F03
:100410008295807F08958093E900EBEEF0E0808183
:1004200081608083EDEEF0E010826093EC00408309
:100430008091EE00881F8827881F08951092F4008D
:1004400080E08093E9001092F0001092E800109292
:10045000ED009091EB009E7F9093EB008F5F8530D5
:1004600081F708958091A60187FF11C003C08EB364
:100470008823B1F08091E80082FFF9CF8091E800F5
:100480008B778093E80008958EB3882349F080919C
:10049000E80080FFF9CF8091E8008E778093E80034
:1004A000089584E69091EC0090FF05C09091E800DB
:1004B00090FF05C01BC09091E80092FD17C09EB34D
:1004C0009923B1F09EB39530A9F09091EB0095FD82
:1004D00013C09091E10092FFE5CF9091E1009B7FE6
:1004E0009093E100882351F08150DCCF80E00895A3
:1004F00082E0089583E0089581E0089584E00895FE
:10050000AF92BF92DF92EF92FF920F931F93DF9310
:10051000CF930F92CDB7DEB7082F5B017A01998395
:10052000C0DFD82E9981882331F5192F1CC0809106
:10053000E80085FD10C08091E8008E778093E80088
:10054000E114F10421F0F7010995813081F0A9DF70
:10055000882349F00FC0F80181918F018093F10049
:100560000894A108B108A114B10409F704C075E00A
:10057000D72E01C0D82E8D2D0F90CF91DF911F91D6
:100580000F91FF90EF90DF90BF90AF900895282FCC
:10059000392FF9018091AC019091AD018617970731
:1005A00018F4BC0190E032C061157105D9F7809153
:1005B000E8008E778093E800F5CF8091E80083FD16
:1005C00037C08091E80082FD2DC08EB38823A1F151
:1005D0008EB3853079F18091E80080FF17C080915B
:1005E000F20006C091919093F100615070408F5FCE
:1005F0006115710511F08830A8F391E0883009F099
:1006000090E08091E8008E778093E8006115710595
:10061000A1F6992391F606C08EB3882369F08EB3B4
:10062000853061F08091E80082FFF6CF80E0089588
:1006300081E0089583E0089582E0089583E00895BD
:10064000282F392FC9012091AC013091AD01261717
:10065000370718F4B90130E034C061157105D9F7D6
:100660002091E8002E772093E800F5CF2091E80054
:1006700023FD39C02091E80022FD2FC02EB3222394
:10068000B1F12EB3253089F12091E80020FF19C087
:100690002091F20008C0FC010196E491E093F10082
:1006A000615070402F5F6115710511F0283098F38B
:1006B00031E0283009F030E02091E8002E772093D7
:1006C000E8006115710591F6332381F606C08EB3FB
:1006D000882369F08EB3853061F08091E80082FF55
:1006E000F6CF80E0089581E0089583E0089582E0E8
:1006F000089583E008956115710519F51DC02091D5
:10070000E80023FD2EC02EB3222379F12EB325302D
:1007100051F12091E80022FFF2CFE82FF92F07C016
:100720008091F1008193CF016150704029F0CF0199
:100730002091F2002223A1F72091E8002B7720934B
:10074000E80061157105D9F606C08EB3882369F0FB
:100750008EB3853061F08091E80080FFF6CF80E0B5
:10076000089581E0089583E0089582E0089583E08C
:1007700008953ED040D01EBA1092A40184E089BDF5
:1007800089B5826089BD09B400FEFDCF8091D80093
:10079000982F9F779093D80080688093D80080919D
:1007A00063008E7F809363008091D8008F7D80935B
:1007B000D8008091E0008E7F8093E0008091E1007E
:1007C0008E7F8093E1008091E20081608093E2005F
:1007D0008091E100877F8093E1008091E200886052
:1007E0008093E2000895C5DF81E08093A50108951C
:1007F0001092E20008951092E10008951F920F9266
:100800000FB60F9211242F933F934F935F936F93E3
:100810007F938F939F93AF93BF93EF93FF938091B9
:10082000E10080FF1BC08091E20080FF17C0809133
:10083000E1008E7F8093E1008091E2008E7F8093C3
:10084000E2008091E20080618093E2008091D80014
:1008500080628093D80019BC1EBAEEDC8091E10062
:1008600084FF29C08091E20084FF25C084E089BD17
:1008700089B5826089BD09B400FEFDCF8091D800A2
:100880008F7D8093D8008091E1008F7E8093E1007E
:100890008091E2008F7E8093E2008091E20081608F
:1008A0008093E2008091A401882311F084E001C0CC
:1008B00081E08EBBC0DC8091E10083FF22C080918B
:1008C000E20083FF1EC08091E100877F8093E100FA
:1008D00082E08EBB1092A4018091E1008E7F809314
:1008E000E1008091E2008E7F8093E2008091E2003F
:1008F00080618093E200A2DD80E060E042E08BDD79
:100900001CD18091E10082FF0AC08091E20082FF49
:1009100006C08091E1008B7F8093E1009ADCFF911B
:10092000EF91BF91AF919F918F917F916F915F9167
:100930004F913F912F910F900FBE0F901F901895E0
:100940001F93DF93CF9300D0CDB7DEB7E6EAF1E097
:100950008091F100819381E0EE3AF807C9F7809128
:10096000A6019091A701953009F46BC0963040F430
:10097000913061F1913070F0933009F0C9C026C018
:10098000983009F49BC0993009F4AAC0963009F058
:10099000BFC075C0803809F4BCC0823809F0B8C047
:1009A0008091AA0187708093E9009091EB001092EA
:1009B000E9008091E800877F8093E80081E095FF5F
:1009C00080E08093F1001092F10083C0882319F039
:1009D000823009F09DC08F71823009F09AC08091F9
:1009E000A801882341F52091AA01277009F491C03C
:1009F0002093E9008091EB0080FF8BC08091A701DC
:100A0000833021F48091EB00806213C08091EB0071
:100A100080618093EB0081E090E002C0880F991F15
:100A20002A95E2F78093EA001092EA008091EB00A9
:100A300088608093EB001092E9008091E800877F46
:100A40004BC0882309F064C01091A8018091E80090
:100A5000877F8093E80006DD04C08EB3882309F405
:100A600058C08091E80080FFF8CF1F7711F083E035
:100A700001C082E08EBB10681093E3004AC080582A
:100A8000823008F045C08091A8019091A901609141
:100A9000AA01AE014F5F5F4F70DCBC010097C9F146
:100AA0008091E800877F8093E80089819A81C8DD82
:100AB0008091E8008B778093E8002BC0803841F567
:100AC0008091E800877F8093E8008091A401809363
:100AD000F1008091E8008E778093E800C3DC19C0B4
:100AE0008823B1F49091A801923098F48091E800A5
:100AF000877F8093E8009093A401B4DC8091A401E7
:100B0000882311F084E001C083E08EBB96DB01C036
:100B10009DDB8091E80083FF0AC08091EB0080623A
:100B20008093EB008091E800877F8093E8000F902E
:100B30000F90CF91DF911F91089508951F938EB369
:100B4000882361F01091E90017701092E9008091FC
:100B5000E80083FF01C0F4DE1093E9001F910895BF
:100B60006F927F928F929F92AF92BF92CF92DF92BD
:100B7000EF92FF920F931F93DF93CF9300D00F92CA
:100B8000CDB7DEB77C016DB67EB68091E80083FFFD
:100B9000F8C0F701808190E02091AA013091AB016B
:100BA0002817390709F0EDC08091A701833009F4B7
:100BB00099C0843030F4813071F0823009F0E1C0A6
:100BC000C8C08A3009F4AEC08B3009F498C08930AF
:100BD00009F0D7C04CC08091A601813A09F0D1C07C
:100BE000CDB6DEB69DB68D2C8091E800877F8093D0
:100BF000E8001B821A828091A8010091A9018983D3
:100C0000F7014781C41AD1080FB6F894DEBE0FBEB3
:100C1000CDBE0894C11CD11CBC2CAD2CC60160E01B
:100C200070E050E0BCD1402F4150C701BE016F5F62
:100C30007F4F96018E010E5F1F4F17DBF701258155
:100C400036812115310529F04781C901B60150E0EF
:100C50009DD11092E9006A817B818B2D9A2D97DCC2
:100C60008091E8008B778093E800940133C08091F5
:100C7000A601813209F085C0CDB6DEB6BDB6AD2C79
:100C80008091E800877F8093E8000091AC0110918B
:100C9000AD019090A8018090A9018DB79EB7801BEF
:100CA000910B0FB6F8949EBF0FBE8DBFCDB6DEB6CA
:100CB0000894C11CD11CC601B8011DDD482D41504E
:100CC000C701692D96011CDB8091E8008E77809327
:100CD000E8009501832F922F0FB6F8949EBF0FBEA8
:100CE0008DBF4FC08091A601813A09F04AC0809122
:100CF000E800877F8093E800F70180853AC0809103
:100D0000A601813209F03DC08091E800877F809381
:100D1000E8009091A80181E0992309F480E0F701AF
:100D200080872EC08091A601813259F58091E8001C
:100D3000877F8093E8008091A8019091A90180703D
:100D400036E0969587953A95E1F7F7019287818786
:100D500017C08091A601813AA1F48091E800877FB5
:100D60008093E800F7018185928596958795969501
:100D700087958093F1008091E8008E778093E8005A
:100D800071DB0FB6F8947EBE0FBE6DBE0F900F9054
:100D90000F90CF91DF911F910F91FF90EF90DF9017
:100DA000CF90BF90AF909F908F907F906F9008955D
:100DB0000F931F93CF93DF93FC010896DC0185E02E
:100DC000ED0119928A95E9F781E0808784EF91E03F
:100DD000928781872281338101818481882311F068
:100DE00014E001C010E0C90108DB412F482B42602C
:100DF000802F61EC10DBDF91CF911F910F9108954F
:100E00004F925F926F927F928F929F92AF92BF921A
:100E1000CF92DF92EF92FF920F931F93DF93CF93C6
:100E200000D00F92CDB7DEB77C016DB67EB68EB323
:100E3000843009F085C0F70181818093E9008091B9
:100E4000E80085FF7DC05DB6472C4781CDB6DEB694
:100E5000C41AD1080FB6F894DEBE0FBECDBE0DB7D2
:100E60001EB70F5F1F4FB02E912E19821B821A8260
:100E7000C80160E070E050E092D0C701BE016F5F32
:100E80007F4F40E098018E010E5F1F4FEED9882EF4
:100E9000F70181859285009759F081E090E02385E4
:100EA00034852115310511F080E090E06C0102C01D
:100EB000CC24DD24F701058116810115110599F077
:100EC0004A815B818B2D992DB80153D0AA24A3941C
:100ED000009709F4AA24F7014781C8016B2D792DE9
:100EE00050E054D001C0AA248A819B81009701F16F
:100EF000882029F4AA2019F4C114D104C9F0F701FB
:100F0000818592859487838781818093E900898197
:100F1000882311F08093F1006A817B818B2D992DBC
:100F200040E050E0EDDA8091E8008E778093E800B1
:100F30009201832F942D0FB6F8949EBF0FBE8DBFE4
:100F40000FB6F8947EBE0FBE6DBE0F900F900F903F
:100F5000CF91DF911F910F91FF90EF90DF90CF9095
:100F6000BF90AF909F908F907F906F905F904F90C9
:100F70000895FB01DC0104C08D910190801921F4DA
:100F800041505040C8F7881B990B0895FB01DC01C4
:100F900002C001900D9241505040D8F70895DC01F5
:100FA00001C06D9341505040E0F70895F894FFCF91
:0E0FB00000010800001701080000000000000A
:00000001FF

View file

@ -0,0 +1,254 @@
:1000000090C00000A9C00000A7C00000A5C000006B
:10001000A3C00000A1C000009FC000009DC0000060
:100020009BC0000099C0000097C0000048C40000B9
:100030000CC4000091C000008FC000008DC0000003
:100040008BC0000089C0000087C0000085C0000090
:1000500083C0000081C000007FC0000002C100001A
:100060007BC0000079C0000077C0000075C00000B0
:1000700073C0000071C000006FC000006DC00000C0
:100080006BC0000069C0000067C0000065C00000D0
:1000900063C0000061C000001201100102000008EE
:1000A0004123420001000102DC0109023E0002017D
:1000B00000C0320904000001020201000524000111
:1000C0001004240206052406000107058203080027
:1000D000FF09040100020A000000070504024000B5
:1000E00001070583024000010403090432034100B3
:1000F00072006400750069006E006F002000280027
:100100007700770077002E006100720064007500B0
:1001100069006E006F002E0063006300290000007C
:10012000000011241FBECFEFD2E0DEBFCDBF11E033
:10013000A0E0B1E0ECEAFFE002C005900D92A6312C
:10014000B107D9F712E0A6E1B1E001C01D92AF32CC
:10015000B107E1F7F1D028C753CF9C01DC01AE57BE
:10016000BF4FED91FC91119741911196FC93EE9345
:1001700080589F4FE817F90711F42D933C939FB7D0
:10018000F894F901EC57FF4F8081815080839FBF25
:10019000842F0895DF92EF92FF920F931F93FC013B
:1001A0008489813019F0823021F405C040E3D42ED7
:1001B00004C0DD2402C030E2D32E8389823011F4E2
:1001C00088E0D82A8589873031F0883031F0863050
:1001D00031F482E003C084E001C086E0D82A1092A6
:1001E000C9001092C8001092CA00E784F088018903
:1001F000128980E0E81681EEF80680E0080780E0CA
:10020000180719F420E130E00FC0C801B701969536
:1002100087957795679560587B47814E9F4FA801DA
:100220009701A0D6215030403093CD002093CC00D0
:10023000D092CA0080E0E81681EEF80680E0080758
:1002400080E0180711F082E001C080E08093C800D0
:1002500088E98093C9001F910F91FF90EF90DF9084
:1002600008951F920F920FB60F9211242F938F9320
:100270009F93EF93FF939091CE008EB38430F1F46F
:10028000E0919901F0919A019083E0919901F091A8
:100290009A01CF01019690939A018093990189590F
:1002A000914021F489E191E0928381839FB7F89492
:1002B00080919D018F5F80939D019FBFFF91EF9182
:1002C0009F918F912F910F900FBE0F901F901895B7
:1002D000FC01858580FF02C05F9808955F9A0895AC
:1002E00080E091E0D5C580E091E088C584B7877F44
:1002F00084BF28E10FB6F89420936000109260004C
:100300000FBE87E690E09093CD008093CC0086E00E
:100310008093CA001092C8002093C900539A5A9A39
:100320008AB180638AB98BB180638BB983D284E050
:1003300085BD5F9A579A08950F931F93CF93DF93CC
:10034000D5DF2FB7F8948EE991E090931F02809348
:100350001E0290932102809320022FBF2FB7F894A2
:1003600089E191E090939A018093990190939C0187
:1003700080939B012FBF7894CEE9D1E003E08FB743
:10038000F894909122028FBF903809F180E091E0BB
:10039000ABD497FD1CC0E0911E02F0911F02808338
:1003A000E0911E02F0911F02CF01019690931F026F
:1003B00080931E028E51924011F4D283C1839FB765
:1003C000F894809122028F5F809322029FBF8FB7A3
:1003D000F89410919D018FBFA89902C0113678F151
:1003E000A89A80919D01882361F05D980093160181
:1003F00008C089E191E0B1DE682F80E091E0DAD4B5
:1004000011501123B1F780911601882351F080918A
:10041000160181508093160180911601882309F4FA
:100420005D9A80911701882351F0809117018150C6
:100430008093170180911701882309F45C9A8FB784
:10044000F894909122028FBF992369F08EE991E090
:1004500084DE982F8091C80085FFFCCF9093CE005A
:100460005C980093170180E091E095D42AD487CF5F
:10047000DA01923049F0933061F09130F9F4E8E913
:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6
:1004900019C0813049F0813018F0823079F408C0F9
:1004A000E8EEF0E0849107C0ECEEF0E0849103C048
:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9
:1004C00020E030E0ED93FC93C901089528E030E08E
:1004D00040E003C04F5F220F331F28173907D0F3C6
:1004E000842F8295807F08958093E9008091EB00AE
:1004F00081608093EB001092ED006093EC004093DC
:10050000ED008091EE00881F8827881F08951092C3
:10051000F40090E09093E9001092F0001092E8004F
:100520001092ED008091EB008E7F8093EB009F5F37
:10053000953081F708958091270288238CF403C0B9
:100540008EB38823B1F08091E80082FFF9CF8091CB
:10055000E8008B778093E80008958EB3882349F0F4
:100560008091E80080FFF9CF8091E8008E7780933A
:10057000E800089594E68091EC0080FF05C080912A
:10058000E80080FF05C023C08091E80082FD1FC005
:100590008EB3882311F482E008958EB3853011F470
:1005A00083E008958091EB0085FF02C081E008950B
:1005B0008091E10082FFDFCF8091E1008B7F80930B
:1005C000E100992311F484E008959150D4CF80E0A4
:1005D00008959C0140912D0250912E024617570715
:1005E00018F4F90120E038C06115710511F0AB0174
:1005F000F8CF8091E8008E778093E80040E050E0EB
:10060000F0CF8091E80083FF02C081E008958091DF
:10061000E80082FD2DC08EB3882381F18EB3853032
:1006200079F18091E80080FF17C09091F20006C038
:1006300081918093F100415050409F5F41155105D9
:1006400011F09830A8F320E0983009F421E080916F
:10065000E8008E778093E8004115510591F622233A
:1006600081F606C08EB3882349F08EB3853041F001
:100670008091E80082FFF6CF80E0089582E008953F
:1006800083E008959C0140912D0250912E0246175F
:10069000570710F490E03BC06115710511F0AB01F4
:1006A000F9CF8091E8008E778093E80040E050E039
:1006B000F1CF8091E80083FF02C081E0089580912E
:1006C000E80082FD30C08EB3882399F18EB3853067
:1006D00091F18091E80080FF1AC08091F20009C07A
:1006E000F9012F5F3F4FE491E093F10041505040FA
:1006F0008F5F4115510511F0883090F390E08830FC
:1007000009F491E08091E8008E778093E80041152C
:10071000510579F6992369F606C08EB3882349F00E
:100720008EB3853041F08091E80082FFF6CF80E003
:10073000089582E0089583E008959C016115710594
:1007400029F48091E8008B778093E800F90120C0BC
:100750008091E80083FF02C081E008958EB3882372
:1007600039F18EB3853031F18091E80082FFF0CF0E
:1007700006C08091F10081936150704021F080911A
:10078000F2008823B1F78091E8008B778093E8002E
:1007900061157105E9F606C08EB3882349F08EB362
:1007A000853041F08091E80080FFF6CF80E0089529
:1007B00082E0089583E0089542D044D01EBA10929A
:1007C0002502109224021092230284E089BD89B58B
:1007D000826089BD09B400FEFDCF8091D800982FBA
:1007E0009F779093D80080688093D80080916300B1
:1007F0008E7F809363008091D8008F7D8093D80096
:100800008091E0008E7F8093E0008091E1008E7FF8
:100810008093E1008091E20081608093E20080910A
:10082000E100877F8093E1008091E20088608093FF
:10083000E2000895C1DF81E08093260208951092BE
:10084000E20008951092E10008951F920F920FB6F2
:100850000F9211241F932F933F934F935F936F93A6
:100860007F938F939F93AF93BF93EF93FF93E9EEA3
:10087000F0E0108117701082E0EFF0E08081877F58
:1008800080837894C3D0F894A9EEB0E01C92E0EF96
:10089000F0E08081886080831C93FF91EF91BF918D
:1008A000AF919F918F917F916F915F914F913F9108
:1008B0002F911F910F900FBE0F901F9018951F92B0
:1008C0000F920FB60F9211242F933F934F935F9384
:1008D0006F937F938F939F93AF93BF93EF93FF9308
:1008E0008091E10080FF1BC08091E20080FF17C073
:1008F0008091E1008E7F8093E1008091E2008E7F05
:100900008093E2008091E20080618093E200809118
:10091000D80080628093D80019BC1EBAD1D18091D2
:10092000E10084FF29C08091E20084FF25C084E0BB
:1009300089BD89B5826089BD09B400FEFDCF809173
:10094000D8008F7D8093D8008091E1008F7E8093C6
:10095000E1008091E2008F7E8093E2008091E200CE
:1009600081608093E20080912502882311F481E068
:1009700001C084E08EBBA4D18091E10083FF27C039
:100980008091E20083FF23C08091E100877F809304
:10099000E10082E08EBB109225028091E1008E7F03
:1009A0008093E1008091E2008E7F8093E20080914D
:1009B000E20080618093E200AADD80E060E042E036
:1009C00093DD8091F00088608093F00079D1809170
:1009D000E10082FF0AC08091E20082FF06C08091A0
:1009E000E1008B7F8093E1006BD1FF91EF91BF918C
:1009F000AF919F918F917F916F915F914F913F91B7
:100A00002F910F900FBE0F901F9018951F93DF939B
:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D
:100A2000CDBFE7E2F2E08091F100819322E0EF3266
:100A3000F207C9F78091270230912802353009F476
:100A400087C0363040F43130C9F1313070F0333086
:100A500009F01DC133C0383009F4EFC0393009F452
:100A6000FEC0363009F013C192C0803821F08238C0
:100A700009F00DC108C090912302809124028823BF
:100A800099F0926011C080912B0287708093E900E9
:100A90008091EB0090E025E0969587952A95E1F707
:100AA000982F91701092E9008091E800877F8093E1
:100AB000E8009093F1001092F100CAC0882319F069
:100AC000823009F0E4C090E08F719070009721F0BF
:100AD000029709F0DDC00CC080912902813009F035
:100AE000D7C010922402333069F5809324022AC0C3
:100AF00080912902882331F520912B02277009F477
:100B0000C7C02093E9008091EB0080FFC1C0333063
:100B100021F48091EB00806213C08091EB00806132
:100B20008093EB0081E090E002C0880F991F2A9526
:100B3000E2F78093EA001092EA008091EB0088606F
:100B40008093EB001092E9008091E800877F83C0DA
:100B5000882309F09CC0109129028091E800877FCA
:100B60008093E800E8DC04C08EB3882309F490C0C9
:100B70008091E80080FFF8CF812F8F7711F492E009
:100B800001C093E09EBB80688093E30081C08058E1
:100B9000823008F07CC08091290290912A0223E0E3
:100BA0008C3D920799F55FB7F894DE0115964EE0FB
:100BB00020E030E061E2E42FF0E0609357008491A0
:100BC00020FF03C082958F704F5F982F9F70892FF1
:100BD000805D8A3308F0895F8C9311961C9211977F
:100BE0002F5F3F4F12962431310529F75FBF8AE20C
:100BF0008B8383E08C838091E800877F8093E8007B
:100C0000CE0103966AE270E0E4DC11C060912B0231
:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2
:100C2000E800877F8093E80089819A812BDD80919D
:100C3000E8008B778093E8002BC0803841F58091E5
:100C4000E800877F8093E800809125028093F1007F
:100C50008091E8008E778093E8006DDC19C08823CE
:100C6000B1F490912902923098F48091E800877F46
:100C70008093E800909325025EDC80912502882312
:100C800011F483E001C084E08EBB2DDB01C028DBC2
:100C90008091E80083FF0AC08091EB00806280931E
:100CA000EB008091E800877F8093E800AC960FB658
:100CB000F894DEBF0FBECDBFCF91DF911F91089595
:100CC00008951F938EB3882361F01091E90010926C
:100CD000E9008091E80083FF01C098DE177010934F
:100CE000E9001F9108950895FC018EB3843021F529
:100CF00087859089A189B2890097A105B105E1F0A6
:100D000085818093E9008091E80082FF15C0809181
:100D1000F200882319F42FEF3FEF04C08091F10017
:100D2000282F30E08091F200882341F48091E80080
:100D30008B778093E80002C02FEF3FEFC901089541
:100D4000FC018EB3843011F587859089A189B28921
:100D50000097A105B105D1F081818093E9008091D0
:100D6000F2008823A9F09091E8008091E8008E7746
:100D70008093E80095FD0CC0FDDB982F882349F493
:100D80008091E8008E778093E80003C092E001C074
:100D900090E0892F0895FC018EB3843051F487854B
:100DA0009089A189B2890097A105B10511F0CF0101
:100DB000C7CF08951F93FC01162F8EB38430D9F44A
:100DC00087859089A189B2890097A105B10599F01D
:100DD00081818093E9008091E80085FD08C08091C1
:100DE000E8008E778093E800C5DB882329F4109310
:100DF000F10080E001C082E01F9108950F931F93DE
:100E0000CF93DF93EC010D96FC0189E0DF011D9289
:100E10008A95E9F72A813B8109818C81882311F425
:100E200010E001C014E0C90151DB182B1260802FC3
:100E300061E8412F59DB882329F12E813F810D8103
:100E40008885882311F410E001C014E0C9013EDB5D
:100E5000182B1260802F60E8412F46DB882391F029
:100E60002A853B8509858C85882311F410E001C013
:100E700014E0C9012BDB182B1260802F61EC412F8D
:100E800033DB01C080E0DF91CF911F910F91089576
:100E9000CF93DF93EC018091E80083FF60C08881ED
:100EA00090E020912B0230912C022817390709F08D
:100EB00056C080912802813261F0823220F4803263
:100EC00009F04DC019C0823269F1833209F047C080
:100ED00038C080912702813A09F041C08091E80032
:100EE000877F8093E800CE010F9667E070E071DBAA
:100EF0008091E8008B7713C080912702813279F5C9
:100F00008091E800877F8093E800CE010F9667E02C
:100F100070E013DCCE013ED98091E8008E7780939B
:100F2000E8001DC0809127028132C9F48091E80059
:100F3000877F8093E800809129028D87CE01C8D9F0
:100F40000DC080912702813251F48091E800877FA3
:100F50008093E800CE0160912902C5DEECDADF91D2
:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053
:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749
:100F800020F0A21BB30BE40BF50B661F771F881F25
:100F9000991F1A9469F760957095809590959B01BB
:0C0FA000AC01BD01CF010895F894FFCF13
:100FAC0000034000000440000002080000000000A4
:060FBC000000000000002F
:00000001FF

BIN
arduino-keyboard-0.2.tgz Normal file

Binary file not shown.

5
flash_arduino Normal file
View file

@ -0,0 +1,5 @@
dfu-programmer atmega16u2 erase
dfu-programmer atmega16u2 flash Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex
echo 'Disconnect Arduino now'
dfu-programmer atmega16u2 reset

5
flash_key Normal file
View file

@ -0,0 +1,5 @@
dfu-programmer atmega16u2 erase
dfu-programmer atmega16u2 flash Arduino-keyboard-0.2.hex
echo 'Disconnect Arduino now'
dfu-programmer atmega16u2 reset

200
kbd_usb_passthrough.pde Normal file
View file

@ -0,0 +1,200 @@
/* Arduino Keyboard HID driver and USB host shield pass through */
/*-
* Copyright (c) 2011 Darran Hunt (darran [at] hunt dot net dot nz)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED ``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 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.
*/
#include <Spi.h>
#include <Max3421e.h>
#include <Usb.h>
/* keyboard data taken from configuration descriptor */
#define KBD_ADDR 1
#define KBD_EP 1
#define KBD_IF 0
#define EP_MAXPKTSIZE 8
#define EP_POLL 0x0a
/* Sticky keys */
#define CAPSLOCK 0x39
#define NUMLOCK 0x53
#define SCROLLLOCK 0x47
/* Sticky keys output report bitmasks */
#define REP_NUMLOCK 0x01
#define REP_CAPSLOCK 0x02
#define REP_SCROLLLOCK 0x04
EP_RECORD ep_record[2]; //endpoint record structure for the keyboard
uint8_t buf[8] = { 0 }; // keyboard buffer
uint8_t old_buf[8] = { 0 }; // last poll
/* Sticky key state */
bool numLock = false;
bool capsLock = false;
bool scrollLock = false;
void setup();
void loop();
bool key_is_new(byte key, byte *report);
MAX3421E Max;
USB Usb;
void setup()
{
Serial.begin(9600);
Max.powerOn();
delay(200);
}
void loop()
{
Max.Task();
Usb.Task();
if (Usb.getUsbTaskState() == USB_STATE_CONFIGURING) {
kbd_init();
Usb.setUsbTaskState( USB_STATE_RUNNING);
}
if (Usb.getUsbTaskState() == USB_STATE_RUNNING) {
kbd_poll();
}
}
/* Initialize keyboard */
void kbd_init( void )
{
byte rcode = 0; //return code
/* Initialize data structures */
ep_record[0] = *(Usb.getDevTableEntry(0,0)); //copy endpoint 0 parameters
ep_record[1].MaxPktSize = EP_MAXPKTSIZE;
ep_record[1].Interval = EP_POLL;
ep_record[1].sndToggle = bmSNDTOG0;
ep_record[1].rcvToggle = bmRCVTOG0;
Usb.setDevTableEntry(1, ep_record); //plug kbd.endpoint parameters to devtable
/* Configure device */
rcode = Usb.setConf(KBD_ADDR, 0, 1);
if (rcode) {
while(1); //stop
}
delay(2000);
}
/* Poll USB keyboard for new key presses, send through to host via
* the Keyboard HID driver in the atmega8u2
*/
void kbd_poll(void)
{
char i;
byte rcode = 0; //return code
uint8_t ledReport;
static uint8_t lastLedReport = 0;
static uint8_t leds = 0;
static uint8_t lastLeds = 0;
/* poll keyboard */
rcode = Usb.inTransfer(KBD_ADDR, KBD_EP, 8, (char *)buf);
if (rcode != 0) {
return;
}
/* Check for change */
for (i=0; i<8; i++) {
if (buf[i] != old_buf[i]) {
/* Send the new key presses to the host */
Serial.write(buf, 8);
/* Get led report */
ledReport = Serial.read();
#if 0
/* Not working yet, ledReport is always 0 */
if (ledReport != lastLedReport) {
rcode = Usb.setReport( KBD_ADDR, 0, 1, KBD_IF, 0x02, 0, (char *)&ledReport );
lastLedReport = ledReport;
}
#endif
break;
}
}
/* Check for status keys and adjust led status */
for (i=2; i<8; i++) {
if (buf[i] == 0) {
/* 0 marks end of keys in the report */
break;
}
/* Check new keys for status change keys */
if (key_is_new(buf[i], old_buf)) {
switch (buf[i]) {
case CAPSLOCK:
capsLock =! capsLock;
leds = capsLock ? leds |= REP_CAPSLOCK : leds &= ~REP_CAPSLOCK;
break;
case NUMLOCK:
numLock =! numLock;
leds = numLock ? leds |= REP_NUMLOCK : leds &= ~REP_NUMLOCK;
break;
case SCROLLLOCK:
scrollLock =! scrollLock;
leds = scrollLock ? leds |= REP_SCROLLLOCK : leds &= ~REP_SCROLLLOCK;
break;
default:
break;
}
}
}
/* Got a change in LED status? */
if (lastLeds != leds) {
Usb.setReport( KBD_ADDR, 0, 1, KBD_IF, 0x02, 0, (char *)&leds );
lastLeds = leds;
}
/* update the old buffer */
for (i=0; i<8; i++) {
old_buf[i] = buf[i];
}
}
/*
* Function: key_is_new(key, report)
* Description: see if key is new or is already in report
* Returns: false if found, true if not
*/
bool key_is_new(uint8_t key, uint8_t *report)
{
uint8_t ind;
for (ind=2; ind<8; ind++) {
if (report[ind] == key) {
return false;
}
}
return true;
}

354
keymapper.ino Normal file
View file

@ -0,0 +1,354 @@
/* Arduino Keyboard HID driver and USB host shield pass through */
/*-
* Copyright (c) 2011 Darran Hunt (darran [at] hunt dot net dot nz)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED ``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 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.
*/
#include <SPI.h>
#include <Max3421e.h>
#include <Usb.h>
/* keyboard data taken from configuration descriptor */
#define KBD_ADDR 1
#define KBD_EP 1
#define KBD_IF 0
#define EP_MAXPKTSIZE 8
#define EP_POLL 0x0a
/* Sticky keys */
/*#define CAPSLOCK 0x39*/ // Is going to be considered ESC
#define NUMLOCK 0x53
#define SCROLLLOCK 0x47
/* Sticky keys output report bitmasks */
#define REP_NUMLOCK 0x01
#define REP_CAPSLOCK 0x02
#define REP_SCROLLLOCK 0x04
EP_RECORD ep_record[2]; //endpoint record structure for the keyboard
uint8_t buf[8] = { 0 }; // keyboard buffer
uint8_t old_buf[8] = { 0 }; // last poll
/* Sticky key state */
bool numLock = false;
bool capsLock = false;
bool scrollLock = false;
uint8_t dvorak_changer (uint8_t ch, uint8_t mod);
void setup();
void loop();
bool key_is_new(byte key, byte *report);
MAX3421E Max;
USB Usb;
void setup()
{
Serial.begin(9600);
Max.powerOn();
delay(200);
digitalWrite(13, HIGH);
delay (1000);
digitalWrite (13, LOW);
}
void loop()
{
Max.Task();
Usb.Task();
if (Usb.getUsbTaskState() == USB_STATE_CONFIGURING) {
kbd_init();
Usb.setUsbTaskState( USB_STATE_RUNNING);
}
if (Usb.getUsbTaskState() == USB_STATE_RUNNING) {
kbd_poll();
}
}
/* Initialize keyboard */
void kbd_init( void )
{
byte rcode = 0; //return code
/* Initialize data structures */
ep_record[0] = *(Usb.getDevTableEntry(0,0)); //copy endpoint 0 parameters
ep_record[1].MaxPktSize = EP_MAXPKTSIZE;
ep_record[1].Interval = EP_POLL;
ep_record[1].sndToggle = bmSNDTOG0;
ep_record[1].rcvToggle = bmRCVTOG0;
Usb.setDevTableEntry(1, ep_record); //plug kbd.endpoint parameters to devtable
/* Configure device */
rcode = Usb.setConf(KBD_ADDR, 0, 1);
if (rcode) {
while(1); //stop
}
delay(2000);
}
/* Poll USB keyboard for new key presses, send through to host via
* the Keyboard HID driver in the atmega8u2
*/
void kbd_poll(void)
{
char i;
byte rcode = 0; //return code
uint8_t ledReport;
static uint8_t lastLedReport = 0;
static uint8_t leds = 0;
static uint8_t lastLeds = 0;
/* poll keyboard */
rcode = Usb.inTransfer(KBD_ADDR, KBD_EP, 8, (char *)buf);
if (rcode != 0) {
return;
}
for (i = 2; i < 8; ++i) {
buf[i] = dvorak_changer (buf[i], buf[0]);
}
// Serial.print ("Modifier = ");
// Serial.println (buf[0]);
/* Check for change */
for (i=0; i<8; i++) {
if (buf[i] != old_buf[i]) {
/* Send the new key presses to the host */
Serial.write(buf, 8);
/* Get led report */
ledReport = Serial.read();
break;
}
}
/* Check for status keys and adjust led status */
for (i=2; i<8; i++) {
if (buf[i] == 0) {
/* 0 marks end of keys in the report */
break;
}
/* Check new keys for status change keys */
/*if (key_is_new(buf[i], old_buf)) {*/
/*switch (buf[i]) {*/
/*case CAPSLOCK:*/
/*capsLock =! capsLock;*/
/*leds = capsLock ? leds |= REP_CAPSLOCK : leds &= ~REP_CAPSLOCK;*/
/*break;*/
/*case NUMLOCK:*/
/*numLock =! numLock;*/
/*leds = numLock ? leds |= REP_NUMLOCK : leds &= ~REP_NUMLOCK;*/
/*break;*/
/*case SCROLLLOCK:*/
/*scrollLock =! scrollLock;*/
/*leds = scrollLock ? leds |= REP_SCROLLLOCK : leds &= ~REP_SCROLLLOCK;*/
/*break;*/
/*default:*/
/*break;*/
/*}*/
/*//}*/
}
/* Got a change in LED status? */
if (lastLeds != leds) {
Usb.setReport( KBD_ADDR, 0, 1, KBD_IF, 0x02, 0, (char *)&leds );
lastLeds = leds;
}
/* update the old buffer */
for (i=0; i<8; i++) {
old_buf[i] = buf[i];
}
}
/*
* Function: key_is_new(key, report)
* Description: see if key is new or is already in report
* Returns: false if found, true if not
*/
bool key_is_new(uint8_t key, uint8_t *report)
{
uint8_t ind;
for (ind=2; ind<8; ind++) {
if (report[ind] == key) {
return false;
}
}
return true;
}
/*
* Qwerty to dvorak hardware changer
* http://www.freebsddiary.org/APC/usb_hid_usages.php
* http://www.usb.org/developers/hidpage/Hut1_12v2.pdf
*
* Modifier keys:
* LEFT:
CTRL = 1
ALT = 4
SHIFT = 2
WINKEY = 8
* RIGHT:
CTRL = 16
ALT = 64
SHIFT = 32
*
*/
uint8_t dvorak_changer (uint8_t ch, uint8_t mod)
{
if (mod != 8) { // WINKEY as layer key
switch (ch){
/* begin mid row*/
case 0x39: // CAPSLOCK --> ESC
return 0x29;
/*case 0x04: // A --> A*/
/*return 0x04;*/
case 0x16: // S --> A
return 0x12;
case 0x07: // D --> E
return 0x08;
case 0x09: // F --> U
return 0x18;
case 0x0A: // G --> I
return 0x0C;
case 0x0B: // H --> D
return 0x07;
case 0x0D: // J --> H
return 0x0B;
case 0x0E: // K --> T
return 0x17;
case 0x0F: // L --> N
return 0x11;
case 0x033: // : --> S
return 0x016;
case 0x34: // " --> -
return 0x2D;
/* end of mid row */
/* begin of upper row */
case 0x14: // Q --> '@
if (mod == 2){
return 0x1F; // Upper case Q to @
} else {
return 0x34; // lowercase q to '
}
case 0x1A: // W --> ,<
return 0x36;
case 0x08: // E --> .>
return 0x37;
case 0x15: // R --> P
return 0x13;
case 0x17: // T --> Y
return 0x1C;
case 0x1C: // Y --> F
return 0x09;
case 0x18: // U --> G
return 0x0A;
case 0x0C: // I --> C
return 0x06;
case 0x12: // O --> R
return 0x15;
case 0x13: // P --> L
return 0x0F;
case 0x2F: // [{ --> /?
return 0x38;
case 0x30: // ]} --> =+
return 0x2E;
/* end upper row */
/* begin lower row */
case 0x2E: // += --> ]}
return 0x30;
case 0x2D: // -_ --> [{
return 0x2F;
case 0x1D: // Z --> :;
return 0x33;
case 0x1B: // X --> Q
return 0x14;
case 0x06: // C --> J
return 0x0D;
case 0x19: // V --> K
return 0x0E;
case 0x05: // B --> X
return 0x1B;
case 0x11: // N --> B
return 0x05;
/*case 0x10: // M --> M*/
/*return 0x10;*/
case 0x36: // <, --> W
return 0x1A;
case 0x37: // >. --> V
return 0x19;
case 0x38: // ?/ --> Z
return 0x1D;
/* end lower row */
/* specials */
case 0x1F: // 2@ --> 2"
if (mod == 2) {
return 0x34;
} else {
return 0x1F;
}
case 0x31: // \| --> DEL
return 0x4C;
case 0x29: // ESC --> `¬
return 0x35;
case 0x4C: // DEL --> /
return 0x54;
case 0x49: // INS --> BEGIN END
if (mod == 2) {
return 0x5D ;
} else {
return 0x4D;
}
}
} else {
switch (ch){
case 0x0C: // WINKEY + I --> UpArrow
return 0x52;
case 0x0E: // WINKEY + K --> DownArrow
return 0x51;
case 0x0D: // WINKEY + J --> LeftArrow
return 0x50;
case 0x0F: // WINKEY + L --> RightArrow
return 0x4F;
}
}
}