|
|
1.1 root 1: /*
2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * 18 June 1998 Start IOKit version.
24: * 18 Nov 1998 suurballe port to C++
25: * 4 Oct 1999 decesare Revised for Type 4 support and sub-classed drivers.
26: * 1 Feb 2000 tsherman Added extended mouse functionality (implemented in setParamProperties)
27: */
28:
29: #include "AppleADBMouse.h"
30: #include <IOKit/hidsystem/IOHIDTypes.h>
31: #include <IOKit/IOLib.h>
32:
33: // ****************************************************************************
34: // NewMouseData
35: //
36: // ****************************************************************************
37: static void NewMouseData(IOService * target, UInt8 adbCommand, IOByteCount length, UInt8 * data)
38: {
39: ((AppleADBMouse *)target)->packet(adbCommand, length, data);
40: }
41:
42:
43: // ****************************************************************************
44:
45: #undef super
46: #define super IOHIPointing
47:
48: OSDefineMetaClassAndStructors(AppleADBMouse, IOHIPointing);
49:
50:
51: // ****************************************************************************
52: // probe
53: //
54: // ****************************************************************************
55: IOService * AppleADBMouse::probe(IOService * provider, SInt32 * score)
56: {
57: adbDevice = (IOADBDevice *)provider;
58:
59: return this;
60: }
61:
62:
63: // ****************************************************************************
64: // start
65: //
66: // ****************************************************************************
67: bool AppleADBMouse::start(IOService * provider)
68: {
69: if(!super::start(provider)) return false;
70:
71: if(!adbDevice->seizeForClient(this, NewMouseData)) {
72: IOLog("%s: Seize failed\n", getName());
73: return false;
74: }
75:
76: return true;
77: }
78:
79:
80: // ****************************************************************************
81: // interfaceID
82: //
83: // ****************************************************************************
84: UInt32 AppleADBMouse::interfaceID(void)
85: {
86: return NX_EVS_DEVICE_INTERFACE_ADB;
87: }
88:
89:
90: // ****************************************************************************
91: // deviceType
92: //
93: // ****************************************************************************
94: UInt32 AppleADBMouse::deviceType ( void )
95: {
96: return adbDevice->handlerID();
97: }
98:
99:
100: // ****************************************************************************
101: // resolution
102: //
103: // ****************************************************************************
104: IOFixed AppleADBMouse::resolution(void)
105: {
106: return _resolution;
107: }
108:
109:
110: // ****************************************************************************
111: // buttonCount
112: //
113: // ****************************************************************************
114: IOItemCount AppleADBMouse::buttonCount(void)
115: {
116: return _buttonCount;
117: }
118:
119:
120: // ****************************************************************************
121: // packet
122: //
123: // ****************************************************************************
124: void AppleADBMouse::packet(UInt8 /*adbCommand*/,
125: IOByteCount /*length*/, UInt8 * data)
126: {
127: int dx, dy;
128: UInt32 buttonState = 0;
129: AbsoluteTime now;
130:
131: dy = data[0] & 0x7f;
132: dx = data[1] & 0x7f;
133:
134: if (dy & 0x40) dy |= 0xffffffc0;
135: if (dx & 0x40) dx |= 0xffffffc0;
136:
137: if ((data[0] & 0x80) == 0) buttonState |= 1;
138:
139: clock_get_uptime(&now);
140: dispatchRelativePointerEvent(dx, dy, buttonState, now);
141: }
142:
143:
144: // ****************************************************************************
145: // accelerationTable
146: //
147: // ****************************************************************************
148: void AppleADBMouse::accelerationTable(IOHIAccelerationPoint ** table,
149: IOItemCount * numEntries)
150: {
151: static IOHIAccelerationPoint defaultTable[] = {
152: { 0x0000000, 0x000000 },
153: { 0x000713b, 0x006000 },
154: { 0x0010000, 0x010000 },
155: { 0x0044ec5, 0x108000 },
156: { 0x00c0000, 0x5f0000 },
157: { 0x016ec4f, 0x8b0000 },
158: { 0x01d3b14, 0x948000 },
159: { 0x0227627, 0x960000 },
160: { 0x7ffffff, 0x960000 }
161: };
162:
163: *table = defaultTable;
164: *numEntries = sizeof(defaultTable) / sizeof(defaultTable[0]);
165: }
166:
167: // ****************************************************************************
168: // setParamProperties
169: //
170: // ****************************************************************************
171: IOReturn AppleADBMouse::setParamProperties( OSDictionary * dict )
172: {
173: OSData * data;
174: IOReturn err = kIOReturnSuccess;
175: UInt8 adbdata[8];
176: IOByteCount adblength = 8;
177:
178: adbDevice->readRegister(2, adbdata, &adblength);
179:
180: if( (data = OSDynamicCast( OSData, dict->getObject("Clicking"))))
181: {
182: adbdata[0] = (adbdata[0] & 0x7F) | (*( (UInt8 *) data->getBytesNoCopy() ))<<7;
183: setProperty("Clicking", (unsigned long long)((adbdata[0]&0x80)>>7), sizeof(adbdata[0])*8);
184: }
185:
186: if( (data = OSDynamicCast( OSData, dict->getObject("Dragging"))))
187: {
188: adbdata[1] = (adbdata[1] & 0x7F) | (*( (UInt8 *) data->getBytesNoCopy() ))<<7;
189: setProperty("Dragging", (unsigned long long)((adbdata[1]&0x80)>>7), sizeof(adbdata[1])*8);
190: }
191:
192: if( (data = OSDynamicCast( OSData, dict->getObject("DragLock"))))
193: {
194: adbdata[3] = *((UInt8 *) data->getBytesNoCopy());
195:
196: if(adbdata[3])
197: {
198: setProperty("DragLock", (unsigned long long)adbdata[3], sizeof(adbdata[3])*8);
199: adbdata[3] = (0x80 | 127);
200: }
201: else
202: {
203: setProperty("DragLock", (unsigned long long)adbdata[3], sizeof(adbdata[3])*8);
204: adbdata[3] = (0x80 | 50) ;
205: }
206: }
207:
208: adbDevice->writeRegister(2, adbdata, &adblength);
209:
210: return( err );
211: }
212:
213: // ****************************************************************************
214:
215: #undef super
216: #define super AppleADBMouse
217:
218: OSDefineMetaClassAndStructors(AppleADBMouseType1, AppleADBMouse);
219:
220: IOService * AppleADBMouseType1::probe(IOService * provider, SInt32 * score)
221: {
222: if (!super::probe(provider, score)) return 0;
223:
224: return this;
225: }
226:
227: bool AppleADBMouseType1::start(IOService * provider)
228: {
229: if (adbDevice->setHandlerID(1) != kIOReturnSuccess) return false;
230:
231: _resolution = 100 << 16;
232: _buttonCount = 1;
233:
234: return super::start(provider);
235: }
236:
237:
238: // ****************************************************************************
239:
240: #undef super
241: #define super AppleADBMouse
242:
243: OSDefineMetaClassAndStructors(AppleADBMouseType2, AppleADBMouse);
244:
245: IOService * AppleADBMouseType2::probe(IOService * provider, SInt32 * score)
246: {
247: if (!super::probe(provider, score)) return 0;
248:
249: if (adbDevice->setHandlerID(2) != kIOReturnSuccess) return 0;
250:
251: return this;
252: }
253:
254: bool AppleADBMouseType2::start(IOService * provider)
255: {
256: if (adbDevice->setHandlerID(2) != kIOReturnSuccess) return false;
257:
258: _resolution = 200 << 16;
259: _buttonCount = 1;
260:
261: return super::start(provider);
262: }
263:
264:
265: // ****************************************************************************
266:
267: #undef super
268: #define super AppleADBMouse
269:
270: OSDefineMetaClassAndStructors(AppleADBMouseType4, AppleADBMouse);
271:
272: IOService * AppleADBMouseType4::probe(IOService * provider, SInt32 * score)
273: {
274: UInt8 data[8];
275: IOByteCount length;
276:
277: if (!super::probe(provider, score)) return 0;
278:
279: if (adbDevice->setHandlerID(4) != kIOReturnSuccess) {
280: adbDevice->setHandlerID(adbDevice->defaultHandlerID());
281: return 0;
282: }
283:
284: // To be a Type 4 Extended Mouse, register 1 must return 8 bytes.
285: if (adbDevice->readRegister(1, data, &length) != kIOReturnSuccess) return 0;
286: if (length != 8) return 0;
287:
288: // Save the device's Extended Mouse Info.
289: deviceSignature = ((UInt32 *)data)[0];
290: deviceResolution = ((UInt16 *)data)[2];
291: deviceClass = data[6];
292: deviceNumButtons = data[7];
293:
294: return this;
295: }
296:
297: bool AppleADBMouseType4::start(IOService * provider)
298: {
299: UInt8 adbdata[8];
300: IOByteCount adblength = 8;
301:
302: if (adbDevice->setHandlerID(4) != kIOReturnSuccess) return false;
303:
304: _resolution = deviceResolution << 16;
305: _buttonCount = deviceNumButtons;
306:
307: // Put device into Extended Mode.
308: adbdata[6] = 0xD;
309: if (adbDevice->writeRegister(1, adbdata, &adblength) != 0) return 0;
310:
311: Clicking = FALSE;
312: Dragging = FALSE;
313: DragLock = FALSE;
314:
315: setProperty("Clicking", (unsigned long long)Clicking, sizeof(Clicking)*8);
316: setProperty("Dragging", (unsigned long long)Dragging, sizeof(Dragging)*8);
317: setProperty("DragLock", (unsigned long long)DragLock, sizeof(DragLock)*8);
318:
319: adbDevice->readRegister(1, adbdata, &adblength);
320: IOLog("AppleADBMouseType4 deviceClass = %d (Extended Mode)\n", adbdata[6]);
321:
322: // Set ADB Extended Features to default values.
323: adbdata[0] = 25;
324: adbdata[1] = 20;
325: adbdata[2] = 25;
326: adbdata[3] = 0x80 | (50);
327: adbdata[4] = 50;
328: adbdata[5] = 10;
329: adbdata[6] = 0x1B;
330: adbdata[7] = 0x50;
331: adblength = 8;
332:
333: adbDevice->writeRegister(2, adbdata, &adblength);
334:
335: return super::start(provider);
336: }
337:
338: void AppleADBMouseType4::packet(UInt8 /*adbCommand*/, IOByteCount length, UInt8 * data)
339: {
340: int dx, dy, cnt, numExtraBytes;
341: UInt32 buttonState = 0;
342: AbsoluteTime now;
343:
344: numExtraBytes = length - 2;
345:
346: dy = data[0] & 0x7f;
347: dx = data[1] & 0x7f;
348:
349: if ((data[0] & 0x80) == 0) buttonState |= 1;
350: if ((deviceNumButtons > 1) && ((data[1] & 0x80) == 0)) buttonState |= 2;
351:
352: for (cnt = 0; cnt < numExtraBytes; cnt++) {
353: dy |= ((data[2 + cnt] >> 4) & 7) << (7 + (cnt * 3));
354: dx |= ((data[2 + cnt]) & 7) << (7 + (cnt * 3));
355:
356: if ((deviceNumButtons > (cnt * 2)) && ((data[2 + cnt] & 0x80) == 0))
357: buttonState |= 4 << (cnt * 2);
358: if ((deviceNumButtons > (cnt * 2 + 1)) && ((data[2 + cnt] & 0x08) == 0))
359: buttonState |= 4 << (cnt * 2 + 1);
360: }
361:
362: if (dy & (0x40 << (numExtraBytes * 3)))
363: dy |= (0xffffffc0 << (numExtraBytes * 3));
364: if (dx & (0x40 << (numExtraBytes * 3)))
365: dx |= (0xffffffc0 << (numExtraBytes * 3));
366:
367: clock_get_uptime(&now);
368: dispatchRelativePointerEvent(dx, dy, buttonState, now);
369: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.