Changeset 08d5388 in avrstuff
- Timestamp:
- Jul 31, 2010, 9:35:39 AM (14 years ago)
- Branches:
- main
- Children:
- 38f2eef
- Parents:
- c6e02cf
- Location:
- aktoserial/code
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
aktoserial/code/Makefile
rc6e02cf r08d5388 1 #Set vars 2 COMPILE = avr-gcc -Wall -Os -Iusbdrv -I. -mmcu=atmega8 -DF_CPU=16000000 3 4 #Rules 1 5 keyboard.hex: keyboard.bin 2 6 avr-objcopy -j .text -j .data -O ihex keyboard.bin keyboard.hex 3 7 4 keyboard.bin: keyboard.o usart.o main.o5 avr-gcc keyboard.o usart.o main.o -o keyboard.bin -mmcu=atmega8 -Os8 keyboard.bin: keyboard.o main.o usbdrv/usbdrv.o usbdrv/usbdrvasm.o 9 $(COMPILE) keyboard.o main.o usbdrv/usbdrvasm.o usbdrv/usbdrv.o -o keyboard.bin 6 10 7 main.o: main.c ../../libs/usart/usart.h ../../libs/amiga_keyboard/amiga_keyboard.h 8 avr-gcc -c main.c -mmcu=atmega8 -Os -o main.o -mmcu=atmega8 -Os -I../../libs/ 9 10 usart.o: ../../libs/usart/usart.c ../../libs/usart/usart.h 11 avr-gcc -c ../../libs/usart/usart.c -o usart.o -mmcu=atmega8 -Os 11 main.o: main.c ../../libs/amiga_keyboard/amiga_keyboard.h 12 $(COMPILE) -c main.c -mmcu=atmega8 -Os -o main.o -mmcu=atmega8 -Os -I../../libs/ -I. 12 13 13 14 keyboard.o: ../../libs/amiga_keyboard/amiga_keyboard.c ../../libs/amiga_keyboard/amiga_keyboard.h ../../libs/amiga_keyboard/keymap.h 14 avr-gcc -c ../../libs/amiga_keyboard/amiga_keyboard.c -mmcu=atmega8 -Os -o keyboard.o 15 $(COMPILE) -c ../../libs/amiga_keyboard/amiga_keyboard.c -mmcu=atmega8 -Os -o keyboard.o 16 17 #Generic rules 18 .S.o: 19 $(COMPILE) -x assembler-with-cpp -c $< -o $@ 20 21 .c.o: 22 $(COMPILE) -std=c99 -c $< -o $@ -
aktoserial/code/keyboard.hex
rc6e02cf r08d5388 1 :10000000 52C061C06AC05FC05EC05DC05CC05BC0022 :10001000 5AC059C058C057C056C055C054C053C02C3 :10002000 52C051C050C060313233343536373839601 :10000000EFC071C212C107C106C105C104C103C15D 2 :1000100002C101C100C1FFC0FEC0FDC0FCC0FBC0E9 3 :10002000FAC0F9C0F8C06031323334353637383968 4 4 :10003000302D3D5C3F3071776572747975696F70F2 5 5 :100040005B5D3F3132336173646667686A6B6C3B3A … … 9 9 :100080003F3F3F3F3F4853534358414141413F3F2A 10 10 :100090003F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F70 11 :1000A0003F3F3F3F3F3F11241FBECFE5D4E0DEBFBF 12 :1000B000CDBF10E0A0E6B0E001C01D92A536B107AB 13 :1000C000E1F7A3D0B3C09CCF8C9A949884E591E0DB 14 :1000D0000197F1F7949A8C9808951F920F920FB69A 15 :1000E0000F9211242F933F938F939F9382B390E4A9 16 :1000F000892782BB83992CC080916100882339F4C1 17 :1001000081E0809361001092630010926200309150 18 :100110006300383090F484990DC02091620080E82B 19 :1001200090E0032E02C0959587950A94E2F7282B5C 20 :10013000209362003F5F30936300809163008830BA 21 :1001400038F0109261001092630081E080936400A7 22 :100150009F918F913F912F910F900FBE0F901F9005 23 :100160001895E82FF0E0EA5DFF4F949180916000D0 24 :10017000882311F4892F0895892F80520895809142 25 :1001800064008823E1F380B380EA8A95F1F79CDF6D 26 :1001900010926400809162000895109261001092A4 27 :1001A0006200109263008B98839A85B7886085BF40 28 :1001B00085B78B7F85BF8BB780688BBF789484DFD2 29 :1001C000089589B990BD86E880BD88E18AB908950F 30 :1001D0005D9BFECF8CB908955F9BFECF8CB10895D7 31 :1001E000982F92959F709A3010F4905D01C0995CA1 32 :1001F0005D9BFECF9CB98F708A3010F4805D01C08A 33 :10020000895C5D9BFECF8CB908958E9A83E390E064 34 :10021000D8DFC3DF82E5DCDFB2DF982F96958795C4 35 :1002200088278795892BDCDF80E2F5CFF894FFCF14 11 :1000A0003F3F3F3F3F3F351E1F202122232425266F 12 :1000B000272D2E310062141A0815171C180C121364 13 :1000C000302F00595A5B041607090A0B0D0E0F3327 14 :1000D0003432005C5D5E641D1B0619051110363755 15 :1000E0003800635F60612C4C2B5828292A000000DF 16 :1000F000560052514F503A3B3C3D3E3F40414243F7 17 :10010000838254555775000039000000000000003C 18 :1001100000000000000000000000000000000000DF 19 :10012000000000000000022000010400088005011A 20 :100130000906A101050719E029E715002501750148 21 :1001400095088102950175088103950575010508DB 22 :10015000190129059102950175039103950675080A 23 :10016000150025650507190029658100C0040309EC 24 :10017000042403700075006C006B006F006D00615B 25 :10018000006E00640079002E006100740068002E8B 26 :100190000063007800160341006D0069006B006584 27 :1001A0000079003200750073006200120110010036 28 :1001B000000008424231E10001010200010902226F 29 :1001C000000101008032090400000103010100095F 30 :1001D0002101010001223F000705810308000A00F8 31 :1001E00011241FBECFE5D4E0DEBFCDBF10E0A0E6F6 32 :1001F000B0E0ECEDF9E002C005900D92A436B10735 33 :10020000D9F710E0A4E6B0E001C01D92AB3AB10707 34 :10021000E1F70FD1E1C3F4CE8C9A949884E591E094 35 :100220000197F1F7949A8C9808951F920F920FB648 36 :100230000F9211242F933F938F939F9382B390E457 37 :10024000892782BB83992CC080917100882339F45F 38 :1002500081E08093710010927300109272003091CF 39 :100260007300383090F484990DC02091720080E8BA 40 :1002700090E0032E02C0959587950A94E2F7282B0B 41 :10028000209372003F5F3093730080917300883039 42 :1002900038F0109271001092730081E08093740026 43 :1002A0009F918F913F912F910F900FBE0F901F90B4 44 :1002B0001895E82FF0E0EA5DFF4F9491809170006F 45 :1002C000882311F4892F0895892F80520895839BE4 46 :1002D000FECF80EA8A95F1F79FDF1092740080913B 47 :1002E00072000895809174008823E1F3F0DF08958F 48 :1002F0001092710010927200109273008B98839A82 49 :1003000085B7886085BF85B78B7F85BF8BB78068D1 50 :100310008BBF789481DF0895FC0187E690E090938D 51 :10032000900080938F0080818076803271F581818A 52 :10033000813011F488E00895893049F486819781ED 53 :10034000019719F581E0809364008FEF0895823062 54 :1003500019F486E690E013C08A3029F483818093F3 55 :10036000660080E00895833031F48381882369F446 56 :100370001092600008958B3041F480E690E09093F5 57 :10038000900080938F0081E0089580E00895FC0143 58 :1003900080916400882329F0613019F48081809372 59 :1003A00065001092640081E00895DF93CF93CDB78C 60 :1003B000DEB728970FB6F894DEBF0FBECDBF982FDB 61 :1003C0008091800084FFFCCFFE01319688E0DF0140 62 :1003D0001D928A95E9F799836B83CF0168E0D9D2A2 63 :1003E00028960FB6F894DEBF0FBECDBFCF91DF9138 64 :1003F000089598E0E7E6F0E0DF011D929A95E9F7AD 65 :10040000282F30E0F901EA55FF4F9491805688304B 66 :1004100010F020E004C02A533F4FF90124919923A2 67 :1004200011F09093690080916700282B209367005A 68 :100430000895DF92EF92FF920F931F938FE028E1D0 69 :1004400030E00FB6F894A89521BD0FBE81BD85E0C0 70 :1004500083BF8E9A69D14CDF789410E080E4D82E67 71 :10046000EE24E39401C0102FA8956BD1F090740096 72 :100470008091740081112BDF08B600FE0AC0E8BE2F 73 :1004800000916600002329F0153030F0012F05504F 74 :1004900001C0012FFF2039F38091800084FFE3CF5A 75 :1004A0008CE1A7DF87E690E068E073D282B38D2508 76 :1004B00082BBD9CFA82FB92F80E090E041E050EA6D 77 :1004C000609530E009C02D9182279795879510F0AF 78 :1004D00084279527305EC8F36F5FA8F30895EADF9D 79 :1004E0008D939D930895CF93CFB7CF93DF93C3950B 80 :1004F000859BE9F7859B0BC0859B09C0859B07C041 81 :10050000859B05C0859B03C0859B01C08BC06F93F5 82 :10051000C0918E00DD27CB56DF4F2F9365E5859B7D 83 :1005200003C02F916F91E6CF0F931F934F9320E05D 84 :1005300040E15F9300B3047205FB27F93F9350E05D 85 :100540003BE039C0147240642F77012F5F5F1EC0FB 86 :10055000406810B314722F7752501FC0406400B32C 87 :100560002F770472D1F15F5F00C023C0406210B3E7 88 :100570002F77147291F15F5F00C025C004721027BD 89 :10058000515012F45D5F0000115027952C3F10B3BD 90 :10059000C8F614720127015027952C3FC8F6422750 91 :1005A000499300B3047210274F73115027952C3FC5 92 :1005B000A8F64695469510B3147279F001270150BC 93 :1005C00027952C3F98F66B5A60F3315000B3B0F684 94 :1005D00000C010E41ABF002719C03B503195C31B5F 95 :1005E000D04010E41ABF0881033C09F10B34F9F044 96 :1005F00020918C001981110F1213EDCF4A81441FF5 97 :10060000093651F10D3211F0013E29F700939300A4 98 :100610003F915F914F911F910F912F916F91CAB7A9 99 :10062000C6FD65CFDF91CF91CFBFCF9118952091B7 100 :100630009300222369F310919100112391F5343036 101 :1006400092F13093910020938D0010918E003BE049 102 :10065000311B30938E0027C00091910001300CF5C2 103 :100660000AE54F7049F43091610034FD1DC00093DC 104 :100670006100C5E7D0E01CC03091800034FD14C09B 105 :1006800000938000C1E8D0E013C0052710E000C04F 106 :10069000000002BB1AC0052710E0221F1DC010E099 107 :1006A00021C04AE502C032ED432FC4E1D0E032E080 108 :1006B00011B31462959A02B311BB54E220E865E3CA 109 :1006C00020FF052702BB279517951C3FF0F666957E 110 :1006D000B8F7B1F720FF052702BB279517951C3FF8 111 :1006E000D0F62795179517FF052700001C3F02BB82 112 :1006F000B0F629913A9519F70B7D10919200110FE0 113 :10070000C651D04002BB11F010938C0010E41ABF08 114 :10071000006211B31B7D402F4B7D54E05A95F1F7D9 115 :1007200002BB11BB42BB74CF85B7836085BF8BB75B 116 :1007300080648BBF8BE4809381008AE58093800086 117 :1007400008951F93CF93DF9360919100635067FDED 118 :10075000C4C080918E00CCE0D0E0C81BD109CB563C 119 :10076000DF4F80918D008D3209F0A4C0683009F010 120 :10077000B2C083EC809375008AE58093610010928B 121 :100780006F008881807641F0CE010E948C01282F75 122 :100790008F3F09F47EC084C09A8110927E008981C7 123 :1007A000882321F410927F0022E06CC0853019F478 124 :1007B0009093920066C0863009F04FC08B818130E3 125 :1007C00041F48BEA91E09093900080938F0022E1B6 126 :1007D00040C0823041F48DEB91E090939000809383 127 :1007E0008F0022E236C08330F9F48A81882341F4F5 128 :1007F0008DE691E09093900080938F0024E029C0D3 129 :10080000813041F481E791E09093900080938F00D4 130 :1008100024E21FC08230E1F485E991E090939000DA 131 :1008200080938F0026E115C0813241F48FEC91E076 132 :100830009093900080938F0029E00BC0823241F4A6 133 :100840008EE291E09093900080938F002FE301C09F 134 :1008500020E080E480936F0023C0883021F421E001 135 :1008600084E990E011C0893019F49093940009C094 136 :100870008A3011F421E006C08B3019F48BE48093A8 137 :10088000810020E08EE790E09093900080938F00AD 138 :1008900007C0888187FD2E8180E880936F0006C0A5 139 :1008A0008F81882319F48E81821708F0822F80931C 140 :1008B000620011C080916F0087FF0DC0CE010E94C1 141 :1008C000C7018F3F21F48EE18093610004C088232B 142 :1008D00011F010926200109291008091610084FFEB 143 :1008E0004AC0809162008F3F09F445C0182F8930BB 144 :1008F00008F018E0811B809362008091750098E8F1 145 :10090000892780937500112341F120918F00309148 146 :10091000900080916F0086FF0DC0A6E7B0E080E0F8 147 :1009200090E0F901E80FF91FE491ED930196181793 148 :10093000C1F708C0912FD901E6E7F0E08D918193CE 149 :100940009150E1F71150812F90E01F5F0196820FC7 150 :10095000931F9093900080938F0086E790E0612F23 151 :100960000E946F02612F6C5F6C3019F08FEF8093E3 152 :1009700062006093610094E180B3847231F491501D 153 :10098000D9F71092920010928C00DF91CF911F91B5 154 :1009900008951F93DC01162F8091800084FF07C00B 155 :1009A0008091810098E889278093810003C08AE5BF 156 :1009B00080938000912FE2E8F0E08D918193915037 157 :1009C0001916DCF382E890E0612F0E946F021C5F31 158 :0C09D000109380001F910895F894FFCF51 159 :0409DC00015AFF00BD 36 160 :00000001FF -
aktoserial/code/main.c
rc6e02cf r08d5388 1 #define F_CPU 16000000UL2 3 1 #include <avr/io.h> 2 #include <avr/interrupt.h> 3 #include <avr/wdt.h> 4 #include <avr/pgmspace.h> 5 #include <util/delay.h> 6 7 #include <string.h> 4 8 5 9 #include "amiga_keyboard/amiga_keyboard.h" 6 #include "usart/usart.h" 10 #include "usbdrv/usbdrv.h" 11 #include "keycodes.h" 12 13 const uint8_t PROGMEM keymatrix[128] = { 14 // 0 1 2 3 4 5 6 7 8 9 A B C D E F 15 KEY_grave, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_minus, KEY_equals, KEY_backslash, KEY_Reserved, KEY_KP0, //0 16 KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_rbracket, KEY_lbracket, KEY_Reserved, KEY_KP1, KEY_KP2, KEY_KP3, //1 17 KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_semicolon, KEY_apostroph,KEY_hash, KEY_Reserved, KEY_KP4, KEY_KP5, KEY_KP6, //2 18 KEY_Euro, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_comma, KEY_dot, KEY_slash, KEY_Reserved, KEY_KPcomma, KEY_KP7, KEY_KP8, KEY_KP9, //3 19 KEY_Spacebar,KEY_DeleteForward,KEY_Tab, KEY_KPenter, KEY_Return,KEY_ESCAPE,KEY_DELETE, KEY_Reserved,KEY_Reserved,KEY_Reserved, KEY_KPminus, KEY_Reserved, KEY_UpArrow, KEY_DownArrow, KEY_RightArrow,KEY_LeftArrow,//4 20 KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_KPRParen, KEY_KPLParen, KEY_KPslash, KEY_KPasterisk,KEY_KPplus, KEY_Help, //5 21 KEY_Reserved,KEY_Reserved, KEY_capslock,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved, KEY_Reserved, KEY_Reserved, //6 22 KEY_Reserved,KEY_Reserved, KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved, KEY_Reserved, KEY_Reserved, //7 23 }; 24 25 /** 26 * The modmatrix-array contains positions of the modifier-keys in the matrix. 27 * It is built in the same way as the keymatrix-array. 28 * \sa keymatrix 29 */ 30 const uint8_t PROGMEM modmatrix[8] = { // contains positions of modifiers in the matrix 31 // 0 1 2 3 4 5 6 7 32 MOD_SHIFT_LEFT,MOD_SHIFT_RIGHT,MOD_NONE,MOD_CONTROL_LEFT,MOD_ALT_LEFT,MOD_NONE, MOD_GUI_LEFT, MOD_GUI_RIGHT, 33 }; 34 35 static uint8_t idleRate; 36 static uint8_t reportBuffer[8]; 37 38 void fillReportBuffer(uint8_t key_code) { 39 uint8_t key, modifier; 40 uint8_t reportIndex = 2; // reportBuffer[0] contains modifiers 41 memset(reportBuffer, 0, sizeof(reportBuffer)); // clear report buffer 42 key = pgm_read_byte(&keymatrix[key_code]); 43 if (key_code >= 0x60 && key_code < 0x68) 44 modifier = pgm_read_byte(&modmatrix[key_code - 0x60]); 45 else 46 modifier = MOD_NONE; 47 if (key != KEY_Reserved) { 48 reportBuffer[reportIndex] = key; // set next available entry 49 reportIndex++; 50 } 51 reportBuffer[0] |= modifier; 52 } 53 54 55 void usbSendReport(uint8_t mode, uint8_t key) { 56 // buffer for HID reports. we use a private one, so nobody gets disturbed 57 uint8_t repBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; 58 repBuffer[0] = mode; 59 repBuffer[2] = key; 60 while (!usbInterruptIsReady()); // wait 61 usbSetInterrupt(repBuffer, sizeof(repBuffer)); // send 62 } 63 7 64 8 65 int main() { 9 //debug LED - output 10 DDRD |= (1<<PD6); 11 12 USARTInit(51); 13 ak_init_keyboard(); 14 15 uint8_t key_code = 0; 16 17 // Ready! 18 USARTWriteChar('R'); 19 20 while(1) { 21 key_code = ak_read_scancode(); 22 //USARTWriteChar(ak_scancode_to_ascii(key_code)); 23 USARTWriteHex((key_code >> 1) |(key_code << 7)); 24 USARTWriteChar(' '); 25 } 26 27 return 0; 28 } 29 66 uint8_t idleCounter = 0; 67 uint8_t updateNeeded = 0; 68 69 wdt_enable(WDTO_2S); 70 // configure timer 0 for a rate of 12M/(1024 * 256) = 45.78Hz (~22ms) 71 TCCR0 = 5; // timer 0 prescaler: 1024 72 73 //debug LED - output 74 DDRD |= (1<<PD6); 75 76 // Keyboard 77 uint8_t key_code = 0; 78 79 // USB 80 usbInit(); 81 ak_init_keyboard(); 82 sei(); 83 84 while(1) { 85 wdt_reset(); 86 usbPoll(); 87 88 updateNeeded = char_waiting; 89 90 if (char_waiting) { 91 key_code = ak_read_scancode(); 92 } 93 94 // check timer if we need periodic reports 95 if (TIFR & (1 << TOV0)) { 96 TIFR = (1 << TOV0); // reset flag 97 if (idleRate != 0) { // do we need periodic reports? 98 if(idleCounter > 4){ // yes, but not yet 99 idleCounter -= 5; // 22ms in units of 4ms 100 } else { // yes, it is time now 101 updateNeeded = 1; 102 idleCounter = idleRate; 103 } 104 } 105 106 } 107 // if an update is needed, send the report 108 if (updateNeeded && usbInterruptIsReady()) { 109 updateNeeded = 0; 110 //fillReportBuffer(key_code); 111 fillReportBuffer(KEY_Y); 112 usbSetInterrupt(reportBuffer, sizeof(reportBuffer)); 113 PORTD ^= (1<<PD6); 114 } 115 } 116 117 return 0; 118 } 119 120 static uint8_t protocolVer = 1; 121 uint8_t expectReport = 0; 122 123 #define LED_NUM 0x01 ///< num LED on a boot-protocol keyboard 124 #define LED_CAPS 0x02 ///< caps LED on a boot-protocol keyboard 125 #define LED_SCROLL 0x04 ///< scroll LED on a boot-protocol keyboard 126 #define LED_COMPOSE 0x08 ///< compose LED on a boot-protocol keyboard 127 #define LED_KANA 0x10 ///< kana LED on a boot-protocol keyboard 128 uint8_t LEDstate = 0; ///< current state of the LEDs 129 130 131 char PROGMEM usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = { 132 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 133 0x09, 0x06, // USAGE (Keyboard) 134 0xa1, 0x01, // COLLECTION (Application) 135 0x05, 0x07, // USAGE_PAGE (Keyboard) 136 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 137 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) 138 0x15, 0x00, // LOGICAL_MINIMUM (0) 139 0x25, 0x01, // LOGICAL_MAXIMUM (1) 140 0x75, 0x01, // REPORT_SIZE (1) 141 0x95, 0x08, // REPORT_COUNT (8) 142 0x81, 0x02, // INPUT (Data,Var,Abs) 143 0x95, 0x01, // REPORT_COUNT (1) 144 0x75, 0x08, // REPORT_SIZE (8) 145 0x81, 0x03, // INPUT (Cnst,Var,Abs) 146 0x95, 0x05, // REPORT_COUNT (5) 147 0x75, 0x01, // REPORT_SIZE (1) 148 0x05, 0x08, // USAGE_PAGE (LEDs) 149 0x19, 0x01, // USAGE_MINIMUM (Num Lock) 150 0x29, 0x05, // USAGE_MAXIMUM (Kana) 151 0x91, 0x02, // OUTPUT (Data,Var,Abs) 152 0x95, 0x01, // REPORT_COUNT (1) 153 0x75, 0x03, // REPORT_SIZE (3) 154 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) 155 0x95, 0x06, // REPORT_COUNT (6) 156 0x75, 0x08, // REPORT_SIZE (8) 157 0x15, 0x00, // LOGICAL_MINIMUM (0) 158 0x25, 0x65, // LOGICAL_MAXIMUM (101) 159 0x05, 0x07, // USAGE_PAGE (Keyboard) 160 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 161 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 162 0x81, 0x00, // INPUT (Data,Ary,Abs) 163 0xc0 // END_COLLECTION 164 }; 165 166 167 168 169 uint8_t usbFunctionSetup(uint8_t data[8]) { 170 usbRequest_t *rq = (void *)data; 171 usbMsgPtr = reportBuffer; 172 if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) { 173 // class request type 174 if (rq->bRequest == USBRQ_HID_GET_REPORT) { 175 // wValue: ReportType (highbyte), ReportID (lowbyte) 176 // we only have one report type, so don't look at wValue 177 return sizeof(reportBuffer); 178 } else if (rq->bRequest == USBRQ_HID_SET_REPORT) { 179 if (rq->wLength.word == 1) { 180 // We expect one byte reports 181 expectReport = 1; 182 return 0xff; // Call usbFunctionWrite with data 183 } 184 } else if (rq->bRequest == USBRQ_HID_GET_IDLE) { 185 usbMsgPtr = &idleRate; 186 return 1; 187 } else if (rq->bRequest == USBRQ_HID_SET_IDLE) { 188 idleRate = rq->wValue.bytes[1]; 189 } else if (rq->bRequest == USBRQ_HID_GET_PROTOCOL) { 190 if (rq->wValue.bytes[1] < 1) { 191 protocolVer = rq->wValue.bytes[1]; 192 } 193 } else if(rq->bRequest == USBRQ_HID_SET_PROTOCOL) { 194 usbMsgPtr = &protocolVer; 195 return 1; 196 } 197 } else { 198 // no vendor specific requests implemented 199 } 200 return 0; 201 } 202 203 /** 204 * The write function is called when LEDs should be set. Normally, we get only 205 * one byte that contains info about the LED states. 206 * \param data pointer to received data 207 * \param len number ob bytes received 208 * \return 0x01 209 */ 210 uint8_t usbFunctionWrite(uchar *data, uchar len) { 211 if (expectReport && (len == 1)) { 212 LEDstate = data[0]; // Get the state of all 5 LEDs 213 /* TODO 214 if (LEDstate & LED_NUM) { // light up caps lock 215 PORTLEDS &= ~(1 << LEDNUM); 216 } else { 217 PORTLEDS |= (1 << LEDNUM); 218 } 219 if (LEDstate & LED_CAPS) { // light up caps lock 220 PORTLEDS &= ~(1 << LEDCAPS); 221 } else { 222 PORTLEDS |= (1 << LEDCAPS); 223 } 224 if (LEDstate & LED_SCROLL) { // light up caps lock 225 PORTLEDS &= ~(1 << LEDSCROLL); 226 } else { 227 PORTLEDS |= (1 << LEDSCROLL); 228 } 229 */ 230 } 231 expectReport = 0; 232 return 0x01; 233 } 234
Note:
See TracChangeset
for help on using the changeset viewer.