commit 529835346857fd74bde07673d1d6794a213e4dc0 Author: pesceWanda Date: Tue Jul 5 23:50:29 2016 -0400 init diff --git a/Arduino-keyboard-0.2.hex b/Arduino-keyboard-0.2.hex new file mode 100644 index 0000000..616eac6 --- /dev/null +++ b/Arduino-keyboard-0.2.hex @@ -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 diff --git a/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex b/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex new file mode 100644 index 0000000..efbbf15 --- /dev/null +++ b/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex @@ -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 diff --git a/arduino-keyboard-0.2.tgz b/arduino-keyboard-0.2.tgz new file mode 100644 index 0000000..4de0453 Binary files /dev/null and b/arduino-keyboard-0.2.tgz differ diff --git a/flash_arduino b/flash_arduino new file mode 100644 index 0000000..a230cc3 --- /dev/null +++ b/flash_arduino @@ -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 diff --git a/flash_key b/flash_key new file mode 100644 index 0000000..fafe162 --- /dev/null +++ b/flash_key @@ -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 diff --git a/kbd_usb_passthrough.pde b/kbd_usb_passthrough.pde new file mode 100644 index 0000000..f3e7ff0 --- /dev/null +++ b/kbd_usb_passthrough.pde @@ -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 +#include +#include + +/* 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; +} diff --git a/keymapper.ino b/keymapper.ino new file mode 100644 index 0000000..e519f2f --- /dev/null +++ b/keymapper.ino @@ -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 +#include +#include + +/* 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; + } + } + +} +