2
2
3
3
/* Copyright (c) 2011, Peter Barrett
4
4
**
5
+ ** Sleep/Wakeup/SystemControl support added by Michael Dreher
6
+ **
5
7
** Permission to use, copy, modify, and/or distribute this software for
6
8
** any purpose with or without fee is hereby granted, provided that the
7
9
** above copyright notice and this permission notice appear in all copies.
@@ -43,16 +45,20 @@ Keyboard_ Keyboard;
43
45
#define RAWHID_TX_SIZE 64
44
46
#define RAWHID_RX_SIZE 64
45
47
48
+ #define HID_REPORTID_MOUSE (1 )
49
+ #define HID_REPORTID_KEYBOARD (2 )
50
+ #define HID_REPORTID_RAWHID (3 )
51
+ #define HID_REPORTID_SYSTEMCONTROL (4 )
46
52
extern const u8 _hidReportDescriptor[] PROGMEM;
47
53
const u8 _hidReportDescriptor[] = {
48
54
49
- // Mouse
55
+ // Mouse
50
56
0x05 , 0x01 , // USAGE_PAGE (Generic Desktop) // 54
51
57
0x09 , 0x02 , // USAGE (Mouse)
52
58
0xa1 , 0x01 , // COLLECTION (Application)
53
59
0x09 , 0x01 , // USAGE (Pointer)
54
60
0xa1 , 0x00 , // COLLECTION (Physical)
55
- 0x85 , 0x01 , // REPORT_ID (1)
61
+ 0x85 , HID_REPORTID_MOUSE, // REPORT_ID (1)
56
62
0x05 , 0x09 , // USAGE_PAGE (Button)
57
63
0x19 , 0x01 , // USAGE_MINIMUM (Button 1)
58
64
0x29 , 0x03 , // USAGE_MAXIMUM (Button 3)
@@ -76,43 +82,73 @@ const u8 _hidReportDescriptor[] = {
76
82
0xc0 , // END_COLLECTION
77
83
0xc0 , // END_COLLECTION
78
84
79
- // Keyboard
85
+ // Keyboard
80
86
0x05 , 0x01 , // USAGE_PAGE (Generic Desktop) // 47
81
87
0x09 , 0x06 , // USAGE (Keyboard)
82
88
0xa1 , 0x01 , // COLLECTION (Application)
83
- 0x85 , 0x02 , // REPORT_ID (2)
89
+ 0x85 , HID_REPORTID_KEYBOARD, // REPORT_ID (2)
84
90
0x05 , 0x07 , // USAGE_PAGE (Keyboard)
85
91
86
- 0x19 , 0xe0 , // USAGE_MINIMUM (Keyboard LeftControl)
92
+ 0x19 , 0xe0 , // USAGE_MINIMUM (Keyboard LeftControl)
87
93
0x29 , 0xe7 , // USAGE_MAXIMUM (Keyboard Right GUI)
88
94
0x15 , 0x00 , // LOGICAL_MINIMUM (0)
89
95
0x25 , 0x01 , // LOGICAL_MAXIMUM (1)
90
96
0x75 , 0x01 , // REPORT_SIZE (1)
91
97
92
- 0x95 , 0x08 , // REPORT_COUNT (8)
98
+ 0x95 , 0x08 , // REPORT_COUNT (8)
93
99
0x81 , 0x02 , // INPUT (Data,Var,Abs)
94
100
0x95 , 0x01 , // REPORT_COUNT (1)
95
101
0x75 , 0x08 , // REPORT_SIZE (8)
96
102
0x81 , 0x03 , // INPUT (Cnst,Var,Abs)
97
-
98
- 0x95 , 0x06 , // REPORT_COUNT (6)
103
+
104
+ 0x95 , 0x06 , // REPORT_COUNT (6)
99
105
0x75 , 0x08 , // REPORT_SIZE (8)
100
106
0x15 , 0x00 , // LOGICAL_MINIMUM (0)
101
107
0x25 , 0x65 , // LOGICAL_MAXIMUM (101)
102
108
0x05 , 0x07 , // USAGE_PAGE (Keyboard)
103
109
104
- 0x19 , 0x00 , // USAGE_MINIMUM (Reserved (no event indicated))
110
+ 0x19 , 0x00 , // USAGE_MINIMUM (Reserved (no event indicated))
105
111
0x29 , 0x65 , // USAGE_MAXIMUM (Keyboard Application)
106
112
0x81 , 0x00 , // INPUT (Data,Ary,Abs)
107
113
0xc0 , // END_COLLECTION
108
114
115
+ // System Control (Power Down, Sleep, Wakeup, ...)
116
+ 0x05 , 0x01 , // USAGE_PAGE (Generic Desktop)
117
+ 0x09 , 0x80 , // USAGE (System Control)
118
+ 0xa1 , 0x01 , // COLLECTION (Application)
119
+ 0x85 , HID_REPORTID_SYSTEMCONTROL,// REPORT_ID (4)
120
+ 0x09 , 0x81 , // USAGE (System Power Down)
121
+ 0x09 , 0x82 , // USAGE (System Sleep)
122
+ 0x09 , 0x83 , // USAGE (System Wakeup)
123
+ 0x09 , 0x8E , // USAGE (System Cold Restart)
124
+ 0x09 , 0x8F , // USAGE (System Warm Restart)
125
+ 0x09 , 0xA0 , // USAGE (System Dock)
126
+ 0x09 , 0xA1 , // USAGE (System Undock)
127
+ 0x09 , 0xA7 , // USAGE (System Speaker Mute)
128
+ 0x09 , 0xA8 , // USAGE (System Hibernate)
129
+ // although these display usages are not that important, they don't cost much more than declaring
130
+ // the otherwise necessary constant fill bits
131
+ 0x09 , 0xB0 , // USAGE (System Display Invert)
132
+ 0x09 , 0xB1 , // USAGE (System Display Internal)
133
+ 0x09 , 0xB2 , // USAGE (System Display External)
134
+ 0x09 , 0xB3 , // USAGE (System Display Both)
135
+ 0x09 , 0xB4 , // USAGE (System Display Dual)
136
+ 0x09 , 0xB5 , // USAGE (System Display Toggle Intern/Extern)
137
+ 0x09 , 0xB6 , // USAGE (System Display Swap)
138
+ 0x15 , 0x00 , // LOGICAL_MINIMUM (0)
139
+ 0x25 , 0x01 , // LOGICAL_MAXIMUM (1)
140
+ 0x75 , 0x01 , // REPORT_SIZE (1)
141
+ 0x95 , 0x10 , // REPORT_COUNT (16)
142
+ 0x81 , 0x02 , // INPUT (Data,Var,Abs)
143
+ 0xc0 , // END_COLLECTION
144
+
109
145
#if RAWHID_ENABLED
110
146
// RAW HID
111
147
0x06 , LSB (RAWHID_USAGE_PAGE), MSB (RAWHID_USAGE_PAGE), // 30
112
148
0x0A , LSB (RAWHID_USAGE), MSB (RAWHID_USAGE),
113
149
114
150
0xA1 , 0x01 , // Collection 0x01
115
- 0x85 , 0x03 , // REPORT_ID (3)
151
+ 0x85 , HID_REPORTID_RAWHID, // REPORT_ID (3)
116
152
0x75 , 0x08 , // report size = 8 bits
117
153
0x15 , 0x00 , // logical minimum = 0
118
154
0x26 , 0xFF , 0x00 , // logical maximum = 255
@@ -228,7 +264,7 @@ void Mouse_::move(signed char x, signed char y, signed char wheel)
228
264
m[1 ] = x;
229
265
m[2 ] = y;
230
266
m[3 ] = wheel;
231
- HID_SendReport (1 ,m,4 );
267
+ HID_SendReport (HID_REPORTID_MOUSE ,m,sizeof (m) );
232
268
}
233
269
234
270
void Mouse_::buttons (uint8_t b)
@@ -275,7 +311,7 @@ void Keyboard_::end(void)
275
311
276
312
void Keyboard_::sendReport (KeyReport* keys)
277
313
{
278
- HID_SendReport (2 ,keys,sizeof (KeyReport ));
314
+ HID_SendReport (HID_REPORTID_KEYBOARD ,keys,sizeof (*keys ));
279
315
}
280
316
281
317
extern
@@ -462,6 +498,38 @@ size_t Keyboard_::press(uint8_t k)
462
498
return 1 ;
463
499
}
464
500
501
+ // System Control
502
+ // k is one of the SYSTEM_CONTROL defines which come from the HID usage table "Generic Desktop Page (0x01)"
503
+ // in "HID Usage Tables" (HUT1_12v2.pdf)
504
+ size_t Keyboard_::systemControl (uint8_t k)
505
+ {
506
+ if (k <= 16 )
507
+ {
508
+ u16 mask = 0 ;
509
+ u8 m[2 ];
510
+
511
+ if (k > 0 )
512
+ {
513
+ mask = 1 << (k - 1 );
514
+ }
515
+
516
+ m[0 ] = LSB (mask);
517
+ m[1 ] = MSB (mask);
518
+ HID_SendReport (HID_REPORTID_SYSTEMCONTROL,m,sizeof (m));
519
+
520
+ // these are all OSCs, so send a clear to make it possible to send it again later
521
+ m[0 ] = 0 ;
522
+ m[1 ] = 0 ;
523
+ HID_SendReport (HID_REPORTID_SYSTEMCONTROL,m,sizeof (m));
524
+ return 1 ;
525
+ }
526
+ else
527
+ {
528
+ setWriteError ();
529
+ return 0 ;
530
+ }
531
+ }
532
+
465
533
// release() takes the specified key out of the persistent key report and
466
534
// sends the report. This tells the OS the key is no longer pressed and that
467
535
// it shouldn't be repeated any more.
@@ -517,4 +585,4 @@ size_t Keyboard_::write(uint8_t c)
517
585
518
586
#endif
519
587
520
- #endif /* if defined(USBCON) */
588
+ #endif /* if defined(USBCON) */
0 commit comments