@@ -36,32 +36,40 @@ Keyboard_ Keyboard;
36
36
#define LSB (_x ) ((_x) & 0xFF )
37
37
#define MSB (_x ) ((_x) >> 8 )
38
38
39
- #define RAWHID_USAGE_PAGE 0xFFC0
40
- #define RAWHID_USAGE 0x0C00
41
- #define RAWHID_TX_SIZE 64
42
- #define RAWHID_RX_SIZE 64
39
+ #define RAWHID_USAGE_PAGE 0xFFC0 // recommended: 0xFF00 to 0xFFFF
40
+ #define RAWHID_USAGE 0x0C00 // recommended: 0x0100 to 0xFFFF
41
+ #define RAWHID_TX_SIZE (USB_EP_SIZE-1 )
42
+ #define RAWHID_RX_SIZE (USB_EP_SIZE-1 )
43
+
44
+ #if defined USBCON && defined(HID_KEYBOARD_ENABLED) && defined(HID_KEYBOARD_LEDS_ENABLED)
45
+ // extern accessible led out report
46
+ uint8_t hid_keyboard_leds = 0 ;
47
+ #endif
43
48
44
49
extern const u8 _hidReportDescriptor[] PROGMEM;
45
50
const u8 _hidReportDescriptor[] = {
46
-
47
- // Mouse
51
+ # ifdef HID_MOUSE_ENABLED
52
+ // Mouse
48
53
0x05 , 0x01 , // USAGE_PAGE (Generic Desktop) // 54
49
54
0x09 , 0x02 , // USAGE (Mouse)
50
55
0xa1 , 0x01 , // COLLECTION (Application)
51
56
0x09 , 0x01 , // USAGE (Pointer)
52
57
0xa1 , 0x00 , // COLLECTION (Physical)
53
- 0x85 , 0x01 , // REPORT_ID (1)
58
+ 0x85 , HID_REPORTID_MouseReport,// REPORT_ID
59
+ // 5 buttons
54
60
0x05 , 0x09 , // USAGE_PAGE (Button)
55
61
0x19 , 0x01 , // USAGE_MINIMUM (Button 1)
56
- 0x29 , 0x03 , // USAGE_MAXIMUM (Button 3 )
62
+ 0x29 , 0x05 , // USAGE_MAXIMUM (Button 5 )
57
63
0x15 , 0x00 , // LOGICAL_MINIMUM (0)
58
64
0x25 , 0x01 , // LOGICAL_MAXIMUM (1)
59
- 0x95 , 0x03 , // REPORT_COUNT (3 )
65
+ 0x95 , 0x05 , // REPORT_COUNT (5 )
60
66
0x75 , 0x01 , // REPORT_SIZE (1)
61
67
0x81 , 0x02 , // INPUT (Data,Var,Abs)
68
+ // reserved
62
69
0x95 , 0x01 , // REPORT_COUNT (1)
63
- 0x75 , 0x05 , // REPORT_SIZE (5 )
70
+ 0x75 , 0x03 , // REPORT_SIZE (3 )
64
71
0x81 , 0x03 , // INPUT (Cnst,Var,Abs)
72
+ // x, y, wheel
65
73
0x05 , 0x01 , // USAGE_PAGE (Generic Desktop)
66
74
0x09 , 0x30 , // USAGE (X)
67
75
0x09 , 0x31 , // USAGE (Y)
@@ -71,58 +79,75 @@ const u8 _hidReportDescriptor[] = {
71
79
0x75 , 0x08 , // REPORT_SIZE (8)
72
80
0x95 , 0x03 , // REPORT_COUNT (3)
73
81
0x81 , 0x06 , // INPUT (Data,Var,Rel)
82
+ // end
74
83
0xc0 , // END_COLLECTION
75
84
0xc0 , // END_COLLECTION
85
+ #endif
76
86
77
- // Keyboard
78
- 0x05 , 0x01 , // USAGE_PAGE (Generic Desktop) // 47
87
+ #ifdef HID_KEYBOARD_ENABLED
88
+ // Keyboard
89
+ 0x05 , 0x01 , // USAGE_PAGE (Generic Desktop)
79
90
0x09 , 0x06 , // USAGE (Keyboard)
80
91
0xa1 , 0x01 , // COLLECTION (Application)
81
- 0x85 , 0x02 , // REPORT_ID (2)
92
+ 0x85 , HID_REPORTID_KeyboardReport, // REPORT_ID
82
93
0x05 , 0x07 , // USAGE_PAGE (Keyboard)
83
-
94
+ // modifiers
84
95
0x19 , 0xe0 , // USAGE_MINIMUM (Keyboard LeftControl)
85
96
0x29 , 0xe7 , // USAGE_MAXIMUM (Keyboard Right GUI)
86
97
0x15 , 0x00 , // LOGICAL_MINIMUM (0)
87
98
0x25 , 0x01 , // LOGICAL_MAXIMUM (1)
88
99
0x75 , 0x01 , // REPORT_SIZE (1)
89
-
90
100
0x95 , 0x08 , // REPORT_COUNT (8)
91
101
0x81 , 0x02 , // INPUT (Data,Var,Abs)
102
+ // reserved byte
92
103
0x95 , 0x01 , // REPORT_COUNT (1)
93
104
0x75 , 0x08 , // REPORT_SIZE (8)
94
105
0x81 , 0x03 , // INPUT (Cnst,Var,Abs)
95
-
106
+ // Key[6] Array
96
107
0x95 , 0x06 , // REPORT_COUNT (6)
97
108
0x75 , 0x08 , // REPORT_SIZE (8)
98
109
0x15 , 0x00 , // LOGICAL_MINIMUM (0)
99
110
0x25 , 0x65 , // LOGICAL_MAXIMUM (101)
100
111
0x05 , 0x07 , // USAGE_PAGE (Keyboard)
101
-
102
112
0x19 , 0x00 , // USAGE_MINIMUM (Reserved (no event indicated))
103
113
0x29 , 0x65 , // USAGE_MAXIMUM (Keyboard Application)
104
114
0x81 , 0x00 , // INPUT (Data,Ary,Abs)
115
+ #ifdef HID_KEYBOARD_LEDS_ENABLED
116
+ // LEDs for num lock etc
117
+ 0x05 , 0x08 , /* USAGE_PAGE (LEDs) */
118
+ 0x19 , 0x01 , /* USAGE_MINIMUM (Num Lock) */
119
+ 0x29 , 0x05 , /* USAGE_MAXIMUM (Kana) */
120
+ 0x95 , 0x05 , /* REPORT_COUNT (5) */
121
+ 0x75 , 0x01 , /* REPORT_SIZE (1) */
122
+ 0x91 , 0x02 , /* OUTPUT (Data,Var,Abs) */
123
+ // Reserved 3 bits
124
+ 0x95 , 0x01 , /* REPORT_COUNT (1) */
125
+ 0x75 , 0x03 , /* REPORT_SIZE (3) */
126
+ 0x91 , 0x03 , /* OUTPUT (Cnst,Var,Abs) */
127
+ #endif
128
+ // end
105
129
0xc0 , // END_COLLECTION
130
+ #endif
106
131
107
- #ifdef RAWHID_ENABLED
108
- // RAW HID
132
+ #ifdef HID_RAWHID_ENABLED
133
+ // RAW HID
109
134
0x06 , LSB (RAWHID_USAGE_PAGE), MSB (RAWHID_USAGE_PAGE), // 30
110
135
0x0A , LSB (RAWHID_USAGE), MSB (RAWHID_USAGE),
111
136
112
- 0xA1 , 0x01 , // Collection 0x01
113
- 0x85 , 0x03 , // REPORT_ID (3)
114
- 0x75 , 0x08 , // report size = 8 bits
115
- 0x15 , 0x00 , // logical minimum = 0
116
- 0x26 , 0xFF , 0x00 , // logical maximum = 255
137
+ 0xA1 , 0x01 , // Collection 0x01
138
+ 0x85 , HID_REPORTID_RawKeyboardReport , // REPORT_ID
139
+ 0x75 , 0x08 , // report size = 8 bits
140
+ 0x15 , 0x00 , // logical minimum = 0
141
+ 0x26 , 0xFF , 0x00 , // logical maximum = 255
117
142
118
- 0x95 , 64 , // report count TX
119
- 0x09 , 0x01 , // usage
120
- 0x81 , 0x02 , // Input (array)
143
+ 0x95 , RAWHID_TX_SIZE, // report count TX
144
+ 0x09 , 0x01 , // usage
145
+ 0x81 , 0x02 , // Input (array)
121
146
122
- 0x95 , 64 , // report count RX
123
- 0x09 , 0x02 , // usage
124
- 0x91 , 0x02 , // Output (array)
125
- 0xC0 // end collection
147
+ 0x95 , RAWHID_RX_SIZE, // report count RX
148
+ 0x09 , 0x02 , // usage
149
+ 0x91 , 0x02 , // Output (array)
150
+ 0xC0 , // end collection
126
151
#endif
127
152
};
128
153
@@ -192,6 +217,20 @@ bool WEAK HID_Setup(Setup& setup)
192
217
_hid_idle = setup.wValueL ;
193
218
return true ;
194
219
}
220
+
221
+ #if defined(HID_KEYBOARD_ENABLED) && defined(HID_KEYBOARD_LEDS_ENABLED)
222
+ if (HID_SET_REPORT == r)
223
+ {
224
+ // TODO check correct report ID (not needed for now, no other device has an out report)
225
+ if (setup.wLength == 2 )
226
+ {
227
+ // write led out report data
228
+ uint8_t data[2 ];
229
+ if (2 == USB_RecvControl (data, 2 ))
230
+ hid_keyboard_leds = data[1 ];
231
+ }
232
+ }
233
+ #endif
195
234
}
196
235
return false ;
197
236
}
@@ -200,6 +239,8 @@ bool WEAK HID_Setup(Setup& setup)
200
239
// ================================================================================
201
240
// Mouse
202
241
242
+ #ifdef HID_MOUSE_ENABLED
243
+
203
244
Mouse_::Mouse_ (void ) : _buttons(0 )
204
245
{
205
246
}
@@ -256,10 +297,14 @@ bool Mouse_::isPressed(uint8_t b)
256
297
return false ;
257
298
}
258
299
300
+ #endif
301
+
259
302
// ================================================================================
260
303
// ================================================================================
261
304
// Keyboard
262
305
306
+ #ifdef HID_KEYBOARD_ENABLED
307
+
263
308
Keyboard_::Keyboard_ (void )
264
309
{
265
310
}
@@ -520,4 +565,6 @@ size_t Keyboard_::write(uint8_t c)
520
565
521
566
#endif
522
567
568
+ #endif
569
+
523
570
#endif /* if defined(USBCON) */
0 commit comments