|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: File: HIDEmulation.c ! 27: ! 28: Contains: HID Emulation glue code between the ADB SHIM and the USB Mouse HID Module ! 29: ! 30: Version: xxx put version here xxx ! 31: ! 32: Copyright: � 1998 by Apple Computer, Inc., all rights reserved. ! 33: ! 34: File Ownership: ! 35: ! 36: DRI: Craig Keithley ! 37: ! 38: Other Contact: xxx put other contact here xxx ! 39: ! 40: Technology: xxx put technology here xxx ! 41: ! 42: Writers: ! 43: ! 44: (BWS) Brent Schorsch ! 45: (DKF) David Ferguson ! 46: (CJK) Craig Keithley ! 47: ! 48: Change History (most recent first): ! 49: ! 50: <USB30> 7/6/98 CJK make certain cursor device is removed when interrupt is ! 51: installed ! 52: <USB29> 6/22/98 CJK move cursordevice setup to InterfaceEntry, which is guarenteed ! 53: to be called at task time ! 54: <USB28> 6/18/98 BWS fixed interrupt refcon support ! 55: <USB27> 6/18/98 CJK add interrupt refcon support ! 56: <USB26> 5/28/98 CJK remove pragma unused from NotifyRegisteredHIDUser ! 57: <USB25> 5/20/98 CJK change driver name from USBMouseModule to USBHIDMouseModule ! 58: <USB24> 5/13/98 CJK move DPI setting to interface entry code ! 59: <USB23> 4/24/98 CJK add "get device units per inch" functionality ! 60: <USB22> 4/23/98 CJK add status message when interrupt is installed. ! 61: <USB21> 4/23/98 CJK Reworked mouse functionality to always pass mouse data on to the ! 62: register HID user (even if the data is the same as the last ! 63: read). ! 64: <USB20> 4/20/98 CJK add in mouse demo mode control selector ! 65: <USB19> 4/9/98 CJK remove include of USBClassDrivers.h, USBHIDModules.h, and ! 66: USBDeviceDefines.h ! 67: <USB18> 4/9/98 CJK remove demo mode support ! 68: <17> 4/8/98 CJK rework USBMouseIn to work the same way as the standard interrupt ! 69: handler ! 70: <16> 3/27/98 CJK only set units per inch to 100 when using a BTC keyboard. ! 71: <15> 3/25/98 CJK Move units per inch initialization to here, as we're now using ! 72: interrupt transactions. Remove clip to -90. Change name of ! 73: paramblock pointer to better indicate that it's a pointer to a ! 74: cursor device manager struct. ! 75: <14> 3/18/98 CJK Add back in the clip to -90. Seems that this is the cause of the ! 76: mouse skip. ! 77: <13> 3/18/98 CJK Remove checks for X & Y deltas of less than -90 ! 78: <12> 3/17/98 CJK Replace some "};" with just "}" (MetroWerks has a problem with ! 79: it). Add parens around the pragma unused variables. Move ! 80: function prototypes to MouseModule.h ! 81: <11> 3/9/98 CJK Add check for BTC mouse port. If that's the mouse we're using, ! 82: then set the DPI to 100. ! 83: <10> 3/3/98 CJK change cursor device manager device creation to used 'Fixed' ! 84: data type properly. ! 85: <9> 3/2/98 CJK add check for illegal mouse movement values. Don't allow ! 86: movement if it's less than negative 90. ! 87: <8> 3/2/98 CJK Add include of USBHIDModules.h. Remove include of HIDEmulation.h ! 88: <7> 2/18/98 CJK change call to mouse buttons to only pass a char. ! 89: <USB6> 2/17/98 DKF Add mouse movement if there is no shim installed ! 90: <5> 2/10/98 CJK change hid notification code to munge X & Y delta values into ! 91: signed 16 bit values. ! 92: <4> 2/10/98 CJK remove debugstr (that is hit when both mouse buttons are ! 93: pressed). ! 94: <3> 2/10/98 CJK Remove keyboard related code ! 95: <2> 2/9/98 CJK remove get descriptor from HID Emulation code ! 96: <1> 2/9/98 CJK First time check in. Cloned from CompoundDriver. ! 97: */ ! 98: ! 99: //#include <Types.h> ! 100: //#include <Devices.h> ! 101: #include "../driverservices.h" ! 102: //#include <CursorDevices.h> ! 103: #include "../USB.h" ! 104: #include "MouseModule.h" ! 105: ! 106: extern usbMousePBStruct myMousePB; ! 107: extern void mouse_adbhandler(int number, unsigned char *buffer, int count, void * ssp); ! 108: ! 109: ! 110: void USBMouseIn(UInt32 refcon, void * theData) ! 111: { ! 112: #pragma unused (refcon) ! 113: ! 114: USBHIDDataPtr pMouseData; ! 115: static UInt16 oldbuttons = 0; ! 116: UInt16 changedbuttons = 0; ! 117: ! 118: // DebugStr("In USBMouseIn"); ! 119: pMouseData = (USBHIDDataPtr)theData; ! 120: ! 121: // Tell the Cursor Device Manager that we moved ! 122: if ((pMouseData->mouse.XDelta != 0) || (pMouseData->mouse.YDelta !=0)) ! 123: { ! 124: CursorDeviceMove(myMousePB.pCursorDeviceInfo, pMouseData->mouse.XDelta, pMouseData->mouse.YDelta); ! 125: } ! 126: ! 127: // Update with the state of the buttons. ! 128: pMouseData->mouse.buttons &= 0x07; ! 129: changedbuttons = oldbuttons ^ pMouseData->mouse.buttons; ! 130: if (changedbuttons) ! 131: { ! 132: CursorDeviceButtons(myMousePB.pCursorDeviceInfo, (short)pMouseData->mouse.buttons); ! 133: } ! 134: oldbuttons = pMouseData->mouse.buttons; ! 135: } ! 136: ! 137: OSStatus USBHIDInstallInterrupt(HIDInterruptProcPtr HIDInterruptFunction, UInt32 refcon) ! 138: { ! 139: USBExpertStatus(myMousePB.deviceRef, "USBHIDMouseModule: Demo Mode Disabled (interrupt service routine installed)", myMousePB.deviceRef); ! 140: myMousePB.interruptRefcon = refcon; ! 141: myMousePB.pSHIMInterruptRoutine = HIDInterruptFunction; ! 142: if (myMousePB.pCursorDeviceInfo != 0) ! 143: { ! 144: CursorDeviceDisposeDevice(myMousePB.pCursorDeviceInfo); ! 145: myMousePB.pCursorDeviceInfo = 0; ! 146: } ! 147: return noErr; ! 148: } ! 149: ! 150: OSStatus USBHIDPollDevice(void) ! 151: { ! 152: return kUSBInternalErr; ! 153: } ! 154: ! 155: OSStatus USBHIDControlDevice(UInt32 theControlSelector, void * theControlData) ! 156: { ! 157: #pragma unused (theControlData) ! 158: ! 159: switch (theControlSelector) ! 160: { ! 161: case kHIDRemoveInterruptHandler: ! 162: myMousePB.interruptRefcon = nil; ! 163: myMousePB.pSavedInterruptRoutine = nil; ! 164: myMousePB.pSHIMInterruptRoutine = nil; ! 165: break; ! 166: ! 167: case kHIDEnableDemoMode: ! 168: USBExpertStatus(myMousePB.deviceRef, "USBHIDMouseModule: Demo Mode Enabled", myMousePB.deviceRef); ! 169: ! 170: if (myMousePB.pCursorDeviceInfo == 0) ! 171: { ! 172: myMousePB.pCursorDeviceInfo = &myMousePB.cursorDeviceInfo; ! 173: CursorDeviceNewDevice(&myMousePB.pCursorDeviceInfo); ! 174: ! 175: CursorDeviceSetAcceleration(myMousePB.pCursorDeviceInfo, (Fixed)(1<<16)); ! 176: ! 177: CursorDeviceSetButtons(myMousePB.pCursorDeviceInfo, 3); // should actually be set by reading ! 178: // the HID descriptor, but lacking ! 179: // a parser, we'll just force it ! 180: // this way. ! 181: CursorDeviceButtonOp(myMousePB.pCursorDeviceInfo, 0, kButtonSingleClick, 0L); ! 182: CursorDeviceButtonOp(myMousePB.pCursorDeviceInfo, 1, kButtonSingleClick, 0L); ! 183: CursorDeviceButtonOp(myMousePB.pCursorDeviceInfo, 2, kButtonSingleClick, 0L); ! 184: CursorDeviceUnitsPerInch(myMousePB.pCursorDeviceInfo, (Fixed)(myMousePB.unitsPerInch)); ! 185: } ! 186: ! 187: myMousePB.pSavedInterruptRoutine = myMousePB.pSHIMInterruptRoutine; ! 188: myMousePB.pSHIMInterruptRoutine = USBMouseIn; ! 189: break; ! 190: ! 191: case kHIDDisableDemoMode: ! 192: USBExpertStatus(myMousePB.deviceRef, "USBHIDMouseModule: Demo Mode Disabled", myMousePB.deviceRef); ! 193: if (myMousePB.pCursorDeviceInfo != 0) ! 194: { ! 195: CursorDeviceDisposeDevice(myMousePB.pCursorDeviceInfo); ! 196: myMousePB.pCursorDeviceInfo = 0; ! 197: } ! 198: myMousePB.pSHIMInterruptRoutine = myMousePB.pSavedInterruptRoutine; ! 199: break; ! 200: ! 201: default: ! 202: return paramErr; ! 203: } ! 204: return noErr; ! 205: } ! 206: ! 207: ! 208: ! 209: OSStatus USBHIDGetDeviceInfo(UInt32 theInfoSelector, void * theInfo) ! 210: { ! 211: HIDInterruptProcPtr * pHIDIntProcPtr; ! 212: UInt32 * pUnits; ! 213: UInt32 * pInterruptRefcon; ! 214: ! 215: switch (theInfoSelector) ! 216: { ! 217: case kHIDGetDeviceUnitsPerInch: ! 218: pUnits = (UInt32*)theInfo; ! 219: *pUnits = (UInt32)(myMousePB.unitsPerInch); ! 220: break; ! 221: ! 222: ! 223: case kHIDGetInterruptHandler: ! 224: pHIDIntProcPtr = (HIDInterruptProcPtr *)theInfo; ! 225: *pHIDIntProcPtr = myMousePB.pSHIMInterruptRoutine; ! 226: break; ! 227: ! 228: case kHIDGetInterruptRefcon: ! 229: pInterruptRefcon = (UInt32 *)theInfo; ! 230: *pInterruptRefcon = myMousePB.interruptRefcon; ! 231: break; ! 232: ! 233: default: ! 234: return paramErr; ! 235: } ! 236: return noErr; ! 237: } ! 238: ! 239: OSStatus USBHIDEnterPolledMode(void) ! 240: { ! 241: return unimpErr; ! 242: } ! 243: ! 244: OSStatus USBHIDExitPolledMode(void) ! 245: { ! 246: return unimpErr; ! 247: } ! 248: ! 249: void NotifyRegisteredHIDUser(UInt32 devicetype, UInt8 hidReport[]) ! 250: { ! 251: #pragma unused (devicetype) ! 252: ! 253: USBHIDData theMouseData; ! 254: SInt8 myXDelta, myYDelta; ! 255: UInt8 adb_data[4]; ! 256: ! 257: theMouseData.mouse.buttons = (UInt16)hidReport[0]; ! 258: ! 259: myXDelta = (SInt8)hidReport[1]; ! 260: myYDelta = (SInt8)hidReport[2]; ! 261: //kprintf("***Mouse data: buttons=0x%x, Xdelta=0x%x, YDelta=0x%x***\n",hidReport[0],hidReport[1],hidReport[2]); ! 262: theMouseData.mouse.XDelta = (SInt16)myXDelta; ! 263: theMouseData.mouse.YDelta = (SInt16)myYDelta; ! 264: ! 265: //A.W. call the mouse driver in ADB-land ! 266: adb_data[0] = (SInt8)hidReport[2]; ! 267: adb_data[1] = (SInt8)hidReport[1]; ! 268: if (hidReport[0] == 1) /* Clicked */ ! 269: { ! 270: adb_data[0] = ((adb_data[0] >>1) & 0x7f); ! 271: } ! 272: else adb_data[0] = 0x80 | (adb_data[0] >>1); //button 1 clickif (hidReport[0] == 2) ! 273: ! 274: if (hidReport[0] == 2) /* Clicked */ ! 275: { ! 276: adb_data[1] = ((adb_data[1] >>1) & 0x7f); ! 277: } ! 278: else adb_data[1] = 0x80 | (adb_data[1] >>1); //button 1 clickif (hidReport[0] == 2) ! 279: ! 280: mouse_adbhandler(3, adb_data, 2, (void *) 0); ! 281: ! 282: if (myMousePB.pSHIMInterruptRoutine) ! 283: { ! 284: (*myMousePB.pSHIMInterruptRoutine)(myMousePB.interruptRefcon, (void *)&theMouseData); ! 285: } ! 286: } ! 287: USBHIDModuleDispatchTable TheHIDModuleDispatchTable = ! 288: { ! 289: (UInt32)0, ! 290: (USBHIDInstallInterruptProcPtr)USBHIDInstallInterrupt, ! 291: (USBHIDPollDeviceProcPtr)USBHIDPollDevice, ! 292: (USBHIDControlDeviceProcPtr)USBHIDControlDevice, ! 293: (USBHIDGetDeviceInfoProcPtr)USBHIDGetDeviceInfo, ! 294: (USBHIDEnterPolledModeProcPtr)USBHIDEnterPolledMode, ! 295: (USBHIDExitPolledModeProcPtr)USBHIDExitPolledMode ! 296: }; ! 297: CursorDevicePtr gUSBMouse; ! 298: CursorDevice ourDevice; ! 299:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.