|
|
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.