Changeset 08d5388 in avrstuff


Ignore:
Timestamp:
Jul 31, 2010, 9:35:39 AM (14 years ago)
Author:
Adrien Destugues <pulkomandy@…>
Branches:
main
Children:
38f2eef
Parents:
c6e02cf
Message:

Should-be_working version (but its not)

  • Amiga to usb keycodemap
  • Sending hid reports when a key is pressed

git-svn-id: svn://pulkomandy.tk/avrstuff@7 c6672c3c-f6b6-47f9-9001-1fd6b12fecbe

Location:
aktoserial/code
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • aktoserial/code/Makefile

    rc6e02cf r08d5388  
     1#Set vars
     2COMPILE = avr-gcc -Wall -Os -Iusbdrv -I. -mmcu=atmega8 -DF_CPU=16000000
     3
     4#Rules
    15keyboard.hex: keyboard.bin
    26        avr-objcopy -j .text -j .data -O ihex keyboard.bin keyboard.hex
    37
    4 keyboard.bin: keyboard.o usart.o main.o
    5         avr-gcc keyboard.o usart.o main.o -o keyboard.bin -mmcu=atmega8 -Os
     8keyboard.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
    610
    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
     11main.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.
    1213
    1314keyboard.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 :1000000052C061C06AC05FC05EC05DC05CC05BC002
    2 :100010005AC059C058C057C056C055C054C053C02C
    3 :1000200052C051C050C06031323334353637383960
     1:10000000EFC071C212C107C106C105C104C103C15D
     2:1000100002C101C100C1FFC0FEC0FDC0FCC0FBC0E9
     3:10002000FAC0F9C0F8C06031323334353637383968
    44:10003000302D3D5C3F3071776572747975696F70F2
    55:100040005B5D3F3132336173646667686A6B6C3B3A
     
    99:100080003F3F3F3F3F4853534358414141413F3F2A
    1010: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
    36160:00000001FF
  • aktoserial/code/main.c

    rc6e02cf r08d5388  
    1 #define F_CPU 16000000UL
    2 
    31#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>
    48
    59#include "amiga_keyboard/amiga_keyboard.h"
    6 #include "usart/usart.h"
     10#include "usbdrv/usbdrv.h"
     11#include "keycodes.h"
     12
     13const uint8_t PROGMEM keymatrix[128] = {
     14// 0         1                 2            3            4          5          6           7            8            9              A             B             C             D             E              F
     15KEY_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
     16KEY_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
     17KEY_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
     18KEY_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
     19KEY_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
     20KEY_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
     21KEY_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
     22KEY_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 */
     30const uint8_t PROGMEM modmatrix[8] = { // contains positions of modifiers in the matrix
     31  // 0             1               2                 3         4         5         6                  7
     32MOD_SHIFT_LEFT,MOD_SHIFT_RIGHT,MOD_NONE,MOD_CONTROL_LEFT,MOD_ALT_LEFT,MOD_NONE, MOD_GUI_LEFT, MOD_GUI_RIGHT,
     33};
     34
     35static uint8_t idleRate;
     36static uint8_t reportBuffer[8];
     37
     38void 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
     55void 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
    764
    865int 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
     120static uint8_t protocolVer = 1;
     121uint8_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
     128uint8_t LEDstate = 0;     ///< current state of the LEDs
     129
     130
     131char 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
     169uint8_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 */
     210uint8_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.