1/*
2 * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
7 *
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25
26#include <IOKit/IOBufferMemoryDescriptor.h>
27#include "IOHIDEventQueue.h"
28#include "IOHIDTestDriver.h"
29
30#undef  super
31#define super IOHIDDevice
32OSDefineMetaClassAndStructors( IOHIDTestDriver, IOHIDDevice )
33
34void IOHIDTestDriver::free()
35{
36    if ( _timerSource )
37    {
38        _timerSource->cancelTimeout();
39        _timerSource->release();
40        _timerSource = 0;
41    }
42
43    if ( _workLoop )
44    {
45        _workLoop->release();
46        _workLoop = 0;
47    }
48
49    super::free();
50}
51
52static void generateFakeReport(OSObject * owner, IOTimerEventSource * sender)
53{
54    ((IOHIDTestDriver *) owner)->issueFakeReport();
55
56    sender->setTimeoutMS(1000);
57}
58
59void IOHIDTestDriver::handleStop( IOService * provider )
60{
61    if ( _timerSource ) _timerSource->cancelTimeout();
62
63    super::handleStop(provider);
64}
65
66bool IOHIDTestDriver::handleStart( IOService * provider )
67{
68    if ( super::handleStart(provider) == false )
69        return false;
70
71    _workLoop = IOWorkLoop::workLoop();
72    if ( _workLoop == 0 )
73        return false;
74
75    _timerSource = IOTimerEventSource::timerEventSource(
76                     this,
77                     (IOTimerEventSource::Action) &generateFakeReport );
78    if ( _timerSource == 0)
79        return false;
80
81    if ( _workLoop->addEventSource( _timerSource ) != kIOReturnSuccess )
82        return false;
83
84    _timerSource->setTimeoutMS(1000);
85
86    return true;
87}
88
89//---------------------------------------------------------------------------
90// Report fake report descriptor and report data.
91
92IOReturn IOHIDTestDriver::newReportDescriptor(IOMemoryDescriptor ** desc) const
93{
94#if 0
95    // Keyboard
96    char report[] = { 0x05, 0x01,
97                      0x09, 0x06,
98                      0xA1, 0x01,
99                      0x05, 0x07,
100                      0x19, 0xE0,
101                      0x29, 0xE7,
102                      0x15, 0x00,
103                      0x25, 0x01,
104                      0x75, 0x01,
105                      0x95, 0x08,
106                      0x81, 0x02,
107                      0x95, 0x01,
108                      0x75, 0x08,
109                      0x81, 0x01,
110                      0x95, 0x05,
111                      0x75, 0x01,
112                      0x05, 0x08,
113                      0x19, 0x01,
114                      0x29, 0x05,
115                      0x91, 0x02,
116                      0x95, 0x01,
117                      0x75, 0x03,
118                      0x91, 0x01,
119                      0x95, 0x06,
120                      0x75, 0x08,
121                      0x15, 0x00,
122                      0x25, 0x65,
123                      0x05, 0x07,
124                      0x19, 0x00,
125                      0x29, 0x65,
126                      0x81, 0x00, 0xC0 };
127
128    // macally joystick
129    char report[] = {
130        0x05, 0x01, 0x09, 0x04, 0xA1, 0x01, 0x09, 0x01,
131        0xA1, 0x00, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
132        0x15, 0x00, 0x25, 0x7F, 0x35, 0x00, 0x46, 0xFF,
133        0x00, 0x66, 0x00, 0x00, 0x75, 0x08, 0x95, 0x02,
134        0x81, 0x02, 0x75, 0x08, 0x95, 0x01, 0x81, 0x01,
135        0x09, 0x39, 0x15, 0x01, 0x25, 0x08, 0x36, 0x00,
136        0x00, 0x46, 0x3B, 0x01, 0x65, 0x14, 0x75, 0x08,
137        0x95, 0x01, 0x81, 0x02, 0x05, 0x09, 0x19, 0x01,
138        0x29, 0x04, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00,
139        0x45, 0x01, 0x75, 0x01, 0x95, 0x04, 0x81, 0x02,
140        0x95, 0x01, 0x75, 0x04, 0x81, 0x01, 0xC0, 0x05,
141        0x01, 0x09, 0x36, 0x15, 0x00, 0x26, 0xFF, 0x00,
142        0x35, 0x00, 0x46, 0xFF, 0x00, 0x75, 0x08, 0x66,
143        0x00, 0x00, 0x95, 0x01, 0x81, 0x02, 0xC0, 0x00,
144        0x00, 0x00
145    };
146
147    // macally gamepad
148    char report[] = {
149        0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, 0x09, 0x01,
150        0xA1, 0x00, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
151        0x09, 0x35, 0x09, 0x36, 0x15, 0x00, 0x25, 0x7F,
152        0x35, 0x00, 0x46, 0xFF, 0x00, 0x65, 0x00, 0x75,
153        0x08, 0x95, 0x04, 0x81, 0x02, 0x05, 0x09, 0x19,
154        0x01, 0x29, 0x14, 0x15, 0x00, 0x25, 0x01, 0x35,
155        0x00, 0x45, 0x01, 0x75, 0x01, 0x95, 0x14, 0x81,
156        0x02, 0x75, 0x01, 0x95, 0x04, 0x81, 0x01, 0xC0,
157        0xC0
158    };
159
160    // gravis gamepad
161    char report[] = {
162        0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, 0x05, 0x01,
163        0x09, 0x01, 0xA1, 0x00, 0x09, 0x30, 0x09, 0x31,
164        0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95,
165        0x02, 0x81, 0x02, 0xC0, 0x05, 0x09, 0x19, 0x01,
166        0x29, 0x0A, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
167        0x95, 0x0A, 0x81, 0x02, 0x95, 0x01, 0x75, 0x06,
168        0x81, 0x01, 0xC0
169    };
170
171    // sidewinder gamepad
172    char report[] = {
173        0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, 0x09, 0x01,
174        0xA1, 0x00, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
175        0x15, 0x00, 0x25, 0x7F, 0x35, 0x00, 0x45, 0x7F,
176        0x66, 0x00, 0x00, 0x75, 0x08, 0x95, 0x02, 0x81,
177        0x02, 0xC0, 0x05, 0x09, 0x19, 0x01, 0x29, 0x06,
178        0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45, 0x01,
179        0x75, 0x01, 0x95, 0x06, 0x81, 0x02, 0x95, 0x02,
180        0x81, 0x01, 0xC0
181    };
182
183    // Xterminator
184    char report[] = {
185        0x05, 0x01, 0x09, 0x04, 0xA1, 0x01, 0x09, 0x01,
186        0xA1, 0x00, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
187        0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95,
188        0x02, 0x81, 0x02, 0xC0, 0x05, 0x01, 0x09, 0x35,
189        0x15, 0x00, 0x26, 0xFF, 0x00, 0x35, 0x00, 0x46,
190        0xFF, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02,
191        0x09, 0x37, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x35,
192        0x00, 0x46, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x01,
193        0x81, 0x02, 0x09, 0x32, 0x15, 0x00, 0x26, 0xFF,
194        0x00, 0x35, 0x00, 0x46, 0xFF, 0x00, 0x75, 0x08,
195        0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x09, 0x39,
196        0x15, 0x01, 0x25, 0x08, 0x75, 0x08, 0x95, 0x01,
197        0x81, 0x42, 0x05, 0x09, 0x19, 0x01, 0x29, 0x09,
198        0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x09,
199        0x81, 0x02, 0x75, 0x01, 0x95, 0x07, 0x81, 0x01,
200        0xC0
201    };
202
203    // Thrustmaster
204    char report[] = {
205        0x05, 0x01, 0x09, 0x04, 0xA1, 0x01, 0x09, 0x01,
206        0xA1, 0x00, 0x09, 0x30, 0x09, 0x31, 0x15, 0x80,
207        0x25, 0x7F, 0x35, 0x00, 0x46, 0xFF, 0x00, 0x75,
208        0x08, 0x95, 0x02, 0x81, 0x02, 0xC0, 0x09, 0x39,
209        0x15, 0x01, 0x25, 0x08, 0x35, 0x00, 0x46, 0x3B,
210        0x01, 0x66, 0x14, 0x00, 0x75, 0x04, 0x95, 0x01,
211        0x81, 0x42, 0x05, 0x09, 0x15, 0x00, 0x25, 0x01,
212        0x35, 0x00, 0x45, 0x01, 0x19, 0x01, 0x29, 0x04,
213        0x75, 0x01, 0x95, 0x04, 0x81, 0x02, 0x75, 0x08,
214        0x95, 0x01, 0x81, 0x01, 0xC0
215    };
216
217    // macally gamepad
218    char report[] = {
219        0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, 0x09, 0x01,
220        0xA1, 0x00, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
221        0x09, 0x35, 0x09, 0x36, 0x15, 0x00, 0x25, 0x7F,
222        0x35, 0x00, 0x46, 0xFF, 0x00, 0x65, 0x00, 0x75,
223        0x08, 0x95, 0x04, 0x81, 0x02, 0x05, 0x09, 0x19,
224        0x01, 0x29, 0x14, 0x15, 0x00, 0x25, 0x01, 0x35,
225        0x00, 0x45, 0x01, 0x75, 0x01, 0x95, 0x14, 0x81,
226        0x02, 0x75, 0x01, 0x95, 0x04, 0x81, 0x01, 0xC0,
227        0xC0
228    };
229#endif
230
231    // EIZO HID-controllable monitors
232    char report[] = {
233        0x05, 0x80, 0x09, 0x01, 0xA1, 0x01, 0x75, 0x08, 0x95, 0x80, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x85,
234        0x01, 0x09, 0x02, 0xB2, 0x02, 0x01, 0x05, 0x82, 0x75, 0x10, 0x95, 0x01, 0x25, 0x78, 0x85, 0x20,
235        0x09, 0x12, 0x81, 0x02, 0x09, 0x12, 0xB1, 0x02, 0x26, 0xC8, 0x00, 0x85, 0x21, 0x09, 0x10, 0x81,
236        0x02, 0x09, 0x10, 0xB1, 0x02, 0x26, 0xFF, 0x00, 0x85, 0x22, 0x09, 0x16, 0x81, 0x02, 0x09, 0x16,
237        0xB1, 0x02, 0x85, 0x23, 0x09, 0x18, 0x81, 0x02, 0x09, 0x18, 0xB1, 0x02, 0x85, 0x24, 0x09, 0x1A,
238        0x81, 0x02, 0x09, 0x1A, 0xB1, 0x02, 0x26, 0xFF, 0x01, 0x85, 0x30, 0x09, 0x20, 0x81, 0x02, 0x09,
239        0x20, 0xB1, 0x02, 0x26, 0xFF, 0x00, 0x85, 0x38, 0x09, 0x30, 0x81, 0x02, 0x09, 0x30, 0xB1, 0x02,
240        0x75, 0x20, 0x27, 0x40, 0x0D, 0x03, 0x00, 0x85, 0x10, 0x09, 0xAC, 0x81, 0x02, 0x09, 0xAC, 0xB1,
241        0x02, 0x75, 0x10, 0x26, 0x20, 0x4E, 0x09, 0xAE, 0x81, 0x02, 0x09, 0xAE, 0xB1, 0x02, 0x75, 0x02,
242        0x15, 0x01, 0x25, 0x02, 0x85, 0x02, 0x09, 0x60, 0xA1, 0x02, 0x05, 0x81, 0x09, 0x01, 0x09, 0x02,
243        0x81, 0x00, 0xC0, 0x75, 0x06, 0x81, 0x03, 0x05, 0x82, 0x75, 0x02, 0x09, 0x60, 0xA1, 0x02, 0x05,
244        0x81, 0x09, 0x01, 0x09, 0x02, 0xB1, 0x00, 0xC0, 0x75, 0x06, 0xB1, 0x03, 0x05, 0x82, 0x75, 0x02,
245        0x85, 0x18, 0x09, 0xB0, 0xA1, 0x02, 0x05, 0x81, 0x09, 0x01, 0x09, 0x02, 0xB1, 0x00, 0xC0, 0x75,
246        0x06, 0xB1, 0x03, 0x06, 0x00, 0xFF, 0x75, 0x10, 0x95, 0x01, 0x15, 0x00, 0x27, 0xFF, 0xFF, 0x00,
247        0x00, 0x85, 0x50, 0x09, 0x09, 0x81, 0x02, 0x09, 0x09, 0xB1, 0x02, 0x85, 0x51, 0x09, 0x30, 0xB1,
248        0x02, 0x85, 0x52, 0x09, 0x31, 0xB1, 0x02, 0x75, 0x20, 0x27, 0xFF, 0xFF, 0xFF, 0x00, 0x85, 0x53,
249        0x09, 0x32, 0xB1, 0x02, 0x75, 0x08, 0x26, 0xFF, 0x00, 0x85, 0x54, 0x09, 0x33, 0xB1, 0x02, 0x95,
250        0x80, 0x85, 0x55, 0x09, 0x34, 0xB2, 0x02, 0x01, 0x75, 0x10, 0x95, 0x01, 0x25, 0x06, 0x85, 0x56,
251        0x09, 0xBC, 0x81, 0x02, 0x09, 0xBC, 0xB1, 0x02, 0x75, 0x08, 0x95, 0x10, 0x26, 0xFF, 0x00, 0x85,
252        0x57, 0x09, 0x35, 0xB2, 0x02, 0x01, 0x95, 0x03, 0x85, 0x58, 0x09, 0x37, 0xB1, 0x02, 0x95, 0x11,
253        0x85, 0x59, 0x09, 0x36, 0xB2, 0x02, 0x01, 0x95, 0x21, 0x85, 0x5A, 0x09, 0x38, 0xB2, 0x02, 0x01,
254        0x85, 0x5B, 0x09, 0x39, 0xB2, 0x02, 0x01, 0x85, 0x5C, 0x09, 0x3A, 0xB2, 0x02, 0x01, 0x95, 0x11,
255        0x85, 0x5D, 0x09, 0x3B, 0xB2, 0x02, 0x01, 0x95, 0x01, 0x25, 0x01, 0x85, 0x5E, 0x09, 0xBF, 0xB1,
256        0x02, 0x85, 0x5F, 0x09, 0xBD, 0xB1, 0x02, 0x95, 0x04, 0x26, 0xFF, 0x00, 0x85, 0x60, 0x09, 0xBE,
257        0xB1, 0x02, 0x95, 0x01, 0x25, 0x01, 0x85, 0x61, 0x09, 0xB8, 0x81, 0x02, 0x09, 0xB8, 0xB1, 0x02,
258        0x75, 0x08, 0x25, 0x27, 0x85, 0x62, 0x09, 0x3D, 0xB1, 0x02, 0x75, 0x08, 0x95, 0x80, 0x26, 0xFF,
259        0x00, 0x85, 0x63, 0x09, 0x3E, 0xB2, 0x02, 0x01, 0x75, 0x10, 0x95, 0x01, 0x25, 0x01, 0x85, 0x81,
260        0x09, 0xC1, 0x81, 0x02, 0x09, 0xC1, 0xB1, 0x02, 0x25, 0x1F, 0x85, 0x82, 0x09, 0xC5, 0x81, 0x02,
261        0x75, 0x08, 0x95, 0x02, 0x25, 0x40, 0x85, 0x84, 0x09, 0xC7, 0xB1, 0x02, 0x75, 0x10, 0x95, 0x28,
262        0x27, 0xFF, 0xFF, 0x00, 0x00, 0x85, 0x85, 0x09, 0xC8, 0xB1, 0x02, 0x95, 0x01, 0x25, 0x77, 0x85,
263        0x83, 0x09, 0xC6, 0xB1, 0x02, 0x75, 0x08, 0x25, 0x02, 0x85, 0x86, 0x09, 0xC9, 0xB1, 0x02, 0x75,
264        0x10, 0x25, 0x0B, 0x85, 0x90, 0x09, 0xE1, 0xB1, 0x02, 0x75, 0x08, 0x25, 0x01, 0x85, 0x91, 0x09,
265        0xE2, 0xB1, 0x02, 0x95, 0x80, 0x26, 0xFF, 0x00, 0x85, 0x92, 0x09, 0xE3, 0xB2, 0x02, 0x01, 0x95,
266        0x01, 0x75, 0x10, 0x85, 0xA0, 0x09, 0xA7, 0x81, 0x02, 0x09, 0xA7, 0xB1, 0x02, 0x85, 0xA1, 0x09,
267        0x83, 0x81, 0x02, 0x09, 0x83, 0xB1, 0x02, 0x85, 0xA2, 0x09, 0x84, 0x81, 0x02, 0x09, 0x84, 0xB1,
268        0x02, 0x85, 0xA3, 0x09, 0x85, 0x81, 0x02, 0x09, 0x85, 0xB1, 0x02, 0x25, 0x3F, 0x85, 0xA4, 0x09,
269        0x86, 0x81, 0x02, 0x09, 0x86, 0xB1, 0x02, 0x85, 0xA5, 0x09, 0x87, 0x81, 0x02, 0x09, 0x87, 0xB1,
270        0x02, 0x85, 0xA6, 0x09, 0x88, 0x81, 0x02, 0x09, 0x88, 0xB1, 0x02, 0x26, 0xFF, 0x00, 0x85, 0xA7,
271        0x09, 0x89, 0x81, 0x02, 0x09, 0x89, 0xB1, 0x02, 0x85, 0xA8, 0x09, 0x8A, 0x81, 0x02, 0x09, 0x8A,
272        0xB1, 0x02, 0x85, 0xA9, 0x09, 0x8B, 0x81, 0x02, 0x09, 0x8B, 0xB1, 0x02, 0x85, 0xAA, 0x09, 0x8C,
273        0x81, 0x02, 0x09, 0x8C, 0xB1, 0x02, 0x26, 0x00, 0x05, 0x16, 0x40, 0x01, 0x85, 0xB0, 0x09, 0xA2,
274        0x81, 0x02, 0x09, 0xA2, 0xB1, 0x02, 0x85, 0xB1, 0x09, 0xCA, 0x81, 0x02, 0x09, 0xCA, 0xB1, 0x02,
275        0x26, 0x00, 0x04, 0x16, 0xC8, 0x00, 0x85, 0xB8, 0x09, 0xA3, 0x81, 0x02, 0x09, 0xA3, 0xB1, 0x02,
276        0x85, 0xB9, 0x09, 0xCB, 0x81, 0x02, 0x09, 0xCB, 0xB1, 0x02, 0x25, 0x06, 0x15, 0x00, 0x85, 0xC0,
277        0x09, 0x10, 0x81, 0x02, 0x09, 0x10, 0xB1, 0x02, 0x16, 0x00, 0x80, 0x26, 0xFF, 0x7F, 0x85, 0xC2,
278        0x09, 0x0F, 0x81, 0x02, 0x09, 0x0F, 0xB1, 0x02, 0x15, 0x00, 0x25, 0x07, 0x85, 0xC3, 0x09, 0x15,
279        0x81, 0x02, 0x09, 0x15, 0xB1, 0x02, 0x15, 0x00, 0x25, 0x01, 0x85, 0xC4, 0x09, 0xA8, 0x81, 0x02,
280        0x09, 0xA8, 0xB1, 0x02, 0x25, 0x17, 0x85, 0xC5, 0x09, 0xAA, 0x81, 0x02, 0x09, 0xAA, 0xB1, 0x02,
281        0x25, 0x02, 0x85, 0xC6, 0x09, 0xA5, 0x81, 0x02, 0x09, 0xA5, 0xB1, 0x02, 0x25, 0x04, 0x85, 0xC7,
282        0x09, 0xAB, 0x81, 0x02, 0x09, 0xAB, 0xB1, 0x02, 0x25, 0x01, 0x85, 0xCA, 0x09, 0x80, 0x81, 0x02,
283        0x09, 0x80, 0xB1, 0x02, 0x26, 0xFE, 0x0F, 0x16, 0x40, 0x01, 0x85, 0xCB, 0x09, 0xA0, 0x81, 0x02,
284        0x09, 0xA0, 0xB1, 0x02, 0x25, 0x1F, 0x15, 0x00, 0x85, 0xCC, 0x09, 0xA1, 0x81, 0x02, 0x09, 0xA1,
285        0xB1, 0x02, 0x25, 0x07, 0x85, 0xCD, 0x09, 0x81, 0x81, 0x02, 0x09, 0x81, 0xB1, 0x02, 0x26, 0xFF,
286        0x00, 0x85, 0xCE, 0x09, 0xC4, 0xB1, 0x02, 0x85, 0xCF, 0x09, 0x82, 0x81, 0x02, 0x09, 0x82, 0xB1,
287        0x02, 0x26, 0x10, 0x27, 0x95, 0x02, 0x85, 0xD0, 0x09, 0xAD, 0x81, 0x02, 0x09, 0xAD, 0xB1, 0x02,
288        0x85, 0xD1, 0x09, 0xAE, 0x81, 0x02, 0x09, 0xAE, 0xB1, 0x02, 0x85, 0xD2, 0x09, 0xAF, 0x81, 0x02,
289        0x09, 0xAF, 0xB1, 0x02, 0x85, 0xD3, 0x09, 0xB0, 0x81, 0x02, 0x09, 0xB0, 0xB1, 0x02, 0x95, 0x01,
290        0x26, 0x70, 0x17, 0x85, 0xD5, 0x09, 0xB2, 0x81, 0x02, 0x09, 0xB2, 0xB1, 0x02, 0x25, 0x0F, 0x85,
291        0xD6, 0x09, 0x07, 0x81, 0x02, 0x09, 0x07, 0xB1, 0x02, 0x25, 0x20, 0x85, 0xD7, 0x09, 0xB3, 0x81,
292        0x02, 0x09, 0xB3, 0xB1, 0x02, 0x85, 0xE8, 0x09, 0x6D, 0x81, 0x02, 0x09, 0x6D, 0xB1, 0x02, 0x85,
293        0xE9, 0x09, 0x6E, 0x81, 0x02, 0x09, 0x6E, 0xB1, 0x02, 0x85, 0xEA, 0x09, 0x6F, 0x81, 0x02, 0x09,
294        0x6F, 0xB1, 0x02, 0x85, 0xEB, 0x09, 0x70, 0x81, 0x02, 0x09, 0x70, 0xB1, 0x02, 0x85, 0xEC, 0x09,
295        0x71, 0x81, 0x02, 0x09, 0x71, 0xB1, 0x02, 0x85, 0xED, 0x09, 0x72, 0x81, 0x02, 0x09, 0x72, 0xB1,
296        0x02, 0x25, 0x28, 0x85, 0xD8, 0x09, 0xB4, 0x81, 0x02, 0x09, 0xB4, 0xB1, 0x02, 0x85, 0xE2, 0x09,
297        0x67, 0x81, 0x02, 0x09, 0x67, 0xB1, 0x02, 0x85, 0xE3, 0x09, 0x68, 0x81, 0x02, 0x09, 0x68, 0xB1,
298        0x02, 0x85, 0xE4, 0x09, 0x69, 0x81, 0x02, 0x09, 0x69, 0xB1, 0x02, 0x85, 0xE5, 0x09, 0x6A, 0x81,
299        0x02, 0x09, 0x6A, 0xB1, 0x02, 0x85, 0xE6, 0x09, 0x6B, 0x81, 0x02, 0x09, 0x6B, 0xB1, 0x02, 0x85,
300        0xE7, 0x09, 0x6C, 0x81, 0x02, 0x09, 0x6C, 0xB1, 0x02, 0x25, 0x08, 0x85, 0xD4, 0x09, 0x66, 0x81,
301        0x02, 0x09, 0x66, 0xB1, 0x02, 0x26, 0xFF, 0x00, 0x85, 0xD9, 0x09, 0xB5, 0x81, 0x02, 0x09, 0xB5,
302        0xB1, 0x02, 0x85, 0xDA, 0x09, 0xB6, 0x81, 0x02, 0x09, 0xB6, 0xB1, 0x02, 0x85, 0xDB, 0x09, 0xB7,
303        0x81, 0x02, 0x09, 0xB7, 0xB1, 0x02, 0x26, 0x10, 0x27, 0x95, 0x02, 0x85, 0xDE, 0x09, 0x9C, 0x81,
304        0x02, 0x09, 0x9C, 0xB1, 0x02, 0x85, 0xDF, 0x09, 0x9D, 0x81, 0x02, 0x09, 0x9D, 0xB1, 0x02, 0x85,
305        0xE0, 0x09, 0x9E, 0x81, 0x02, 0x09, 0x9E, 0xB1, 0x02, 0x85, 0xE1, 0x09, 0x9F, 0x81, 0x02, 0x09,
306        0x9F, 0xB1, 0x02, 0x75, 0x08, 0x95, 0x07, 0x26, 0xFF, 0x00, 0x85, 0x80, 0x09, 0xC3, 0xB2, 0x02,
307        0x01, 0x75, 0x08, 0x95, 0x12, 0x26, 0xFF, 0x00, 0x85, 0xEF, 0x09, 0x3F, 0xB2, 0x02, 0x01, 0x75,
308        0x10, 0x95, 0x02, 0x15, 0x00, 0x27, 0xFF, 0xFF, 0x00, 0x00, 0x85, 0x64, 0x09, 0x2F, 0xB1, 0x02,
309        0x75, 0x08, 0x95, 0x04, 0x26, 0xFF, 0x00, 0x85, 0x65, 0x09, 0x41, 0xB1, 0x02, 0x96, 0x00, 0x02,
310        0x85, 0x66, 0x09, 0x42, 0xB1, 0x02, 0x95, 0x10, 0x85, 0x67, 0x09, 0x43, 0xB1, 0x02, 0x95, 0x02,
311        0x85, 0x68, 0x09, 0x48, 0xB1, 0x02, 0xC0
312    };
313
314    *desc = IOBufferMemoryDescriptor::withBytes( report,
315                                                 sizeof(report),
316                                                 kIODirectionNone );
317
318    return kIOReturnSuccess;
319}
320
321void IOHIDTestDriver::issueFakeReport()
322{
323    UInt8 report[][7] = {
324    { 0x44, 0x3B, 0x49, 0x43, 0x80, 0x00, 0x00 },
325    { 0x44, 0x3B, 0x49, 0x43, 0x00, 0x00, 0x00 },
326    { 0x44, 0x3B, 0x49, 0x43, 0x20, 0x00, 0x00 },
327    { 0x44, 0x3B, 0x49, 0x43, 0x00, 0x00, 0x00 },
328    { 0x44, 0x3B, 0x49, 0x43, 0x10, 0x00, 0x00 },
329    { 0x44, 0x3B, 0x49, 0x43, 0x00, 0x00, 0x00 },
330    { 0x44, 0x3B, 0x49, 0x43, 0x00, 0x80, 0x00 },
331    { 0x44, 0x3B, 0x49, 0x43, 0x00, 0x00, 0x00 },
332    { 0x44, 0x36, 0x49, 0x43, 0x00, 0x00, 0x00 },
333    { 0x48, 0x19, 0x49, 0x43, 0x00, 0x00, 0x00 },
334    { 0x48, 0x15, 0x49, 0x43, 0x00, 0x00, 0x00 },
335    { 0x4C, 0x11, 0x49, 0x43, 0x00, 0x00, 0x00 } };
336
337    const  UInt32 reportCount = sizeof(report)/sizeof(report[0]);
338    static UInt32 reportIndex = 0;
339
340    IOMemoryDescriptor * desc = IOMemoryDescriptor::withAddress(
341                                        report[reportIndex],
342                                        sizeof(report[0]),
343                                        kIODirectionNone );
344
345    if (desc)
346    {
347        handleReport( desc );
348        desc->release();
349    }
350
351    if ( ++reportIndex >= reportCount )
352        reportIndex = 0;
353}
354
355//---------------------------------------------------------------------------
356// Dummy properties.
357
358OSString * IOHIDTestDriver::newTransportString() const
359{
360    return OSString::withCStringNoCopy("USB");
361}
362
363OSString * IOHIDTestDriver::newManufacturerString() const
364{
365    return OSString::withCStringNoCopy("ACME");
366}
367
368OSString * IOHIDTestDriver::newProductString() const
369{
370    return OSString::withCStringNoCopy("AxisStick");
371}
372
373OSNumber * IOHIDTestDriver::newVendorIDNumber() const
374{
375    return OSNumber::withNumber(64443, 32);
376}
377
378OSNumber * IOHIDTestDriver::newProductIDNumber() const
379{
380    return OSNumber::withNumber(0xffff, 32);
381}
382
383OSNumber * IOHIDTestDriver::newVersionNumber() const
384{
385    return OSNumber::withNumber(256, 32);
386}
387
388OSNumber * IOHIDTestDriver::newSerialNumber() const
389{
390    return OSNumber::withNumber(0x1234, 32);
391}
392
393OSNumber * IOHIDTestDriver::newPrimaryUsageNumber() const
394{
395    return OSNumber::withNumber(4, 32);
396}
397
398OSNumber * IOHIDTestDriver::newPrimaryUsagePageNumber() const
399{
400    return OSNumber::withNumber(1, 32);
401}
402