|
|
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: /* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved. ! 26: * ! 27: * PPCMouse.m - PPC mouse driver. ! 28: * ! 29: * ! 30: * HISTORY ! 31: * 14-Aug-92 Joe Pasqua at NeXT ! 32: * Created. ! 33: * 08-Feb-94 ! 34: * Modified for hppa (PS2) ! 35: * 11-April-97 Simon Douglas ! 36: * Munged into ADB version. Doesn't depend on PPCKeyboard. ! 37: */ ! 38: ! 39: // TO DO: ! 40: // Make this an indirect client of ADB. ADB should probe to create multiple ! 41: // event sources. ! 42: // Notes: ! 43: // * To find things that need to be fixed, search for FIX, to find questions ! 44: // to be resolved, search for ASK, to find stuff that still needs to be ! 45: // done, search for TO DO. ! 46: // ! 47: ! 48: #define MACH_USER_API 1 ! 49: #undef KERNEL_PRIVATE ! 50: ! 51: #import <driverkit/driverServer.h> ! 52: #import <driverkit/generalFuncs.h> ! 53: #import <driverkit/interruptMsg.h> ! 54: #import <mach/mach_interface.h> ! 55: #import <bsd/dev/ppc/PPCMouse.h> ! 56: #import <bsd/dev/ppc/PCPointerDefs.h> ! 57: #import <bsd/dev/ppc/PPCKeyboard.h> ! 58: #import <bsd/dev/ppc/PPCKeyboardPriv.h> ! 59: #import <driverkit/ppc/directDevice.h> ! 60: #import <driverkit/ppc/driverTypes.h> ! 61: ! 62: #include <mach_kdb.h> ! 63: #include <mach/mach_types.h> ! 64: #include <sys/tty.h> ! 65: #include <sys/conf.h> ! 66: #include <machdep/ppc/mach_param.h> ! 67: #include <machine/machspl.h> ! 68: #import <kern/thread_call.h> ! 69: ! 70: #include "busses.h" ! 71: #include "adb.h" ! 72: #import <bsd/dev/ppc/IOADBBus.h> ! 73: ! 74: int set_handler(int device, int handler); ! 75: ! 76: static PointerEvent event; ! 77: ! 78: PPCMouse *_my_Mouse; ! 79: ! 80: extern unsigned int wserver_on; ! 81: ! 82: /* Forward declarations */ ! 83: static void mouse_intr(); ! 84: ! 85: #define msg_printf printf ! 86: ! 87: ! 88: @implementation PPCMouse ! 89: ! 90: static id adb_driver;// pointer to adb indirect driver ! 91: ! 92: + (BOOL)probe:(IODeviceDescription *)deviceDescription ! 93: { ! 94: BOOL return_code; ! 95: ! 96: adb_driver = [deviceDescription directDevice]; ! 97: ! 98: return_code = [super probe: deviceDescription]; ! 99: ! 100: return return_code; ! 101: } ! 102: ! 103: + (IODeviceStyle) deviceStyle ! 104: { ! 105: return IO_IndirectDevice; ! 106: } ! 107: ! 108: static Protocol *protocols[] = { ! 109: @protocol(ADBprotocol), ! 110: nil ! 111: }; ! 112: ! 113: + (Protocol **)requiredProtocols ! 114: { ! 115: return protocols; ! 116: } ! 117: ! 118: // ! 119: // BEGIN: Implementation of internal support methods ! 120: // ! 121: ! 122: void mouse_adbhandler(int number, unsigned char *buffer, int count, void * ssp); ! 123: ! 124: struct ADBDeviceData ! 125: { ! 126: unsigned int type; ! 127: unsigned int resolution; ! 128: unsigned int buttonCount; ! 129: }; ! 130: typedef struct ADBDeviceData ADBDeviceData; ! 131: static ADBDeviceData deviceInfo[ADB_DEVICE_COUNT]; ! 132: ! 133: boolean_t mouse_initted = FALSE; ! 134: ! 135: - (void) mouseInit ! 136: { ! 137: int i, ret; ! 138: IOADBDeviceInfo table[IO_ADB_MAX_DEVICE]; ! 139: unsigned char buffer[8]; ! 140: int length; ! 141: ! 142: resolution = 200; // what event source sees ! 143: [adb_driver adb_register_handler:ADB_DEV_MOUSE :mouse_adbhandler]; ! 144: ! 145: [adb_driver GetTable:table :&i]; ! 146: ! 147: for (i = 0; i < ADB_DEVICE_COUNT; i++) { ! 148: ! 149: int thisDeviceResolution, thisDeviceType, thisButtonCount; ! 150: ! 151: if ((table[i].flags & ADB_FLAGS_PRESENT) == 0) ! 152: continue; ! 153: if (table[i].originalAddress != ADB_DEV_MOUSE) ! 154: continue; ! 155: ! 156: thisDeviceType = 2; ! 157: thisDeviceResolution = 200; ! 158: thisButtonCount = 1; ! 159: ! 160: ret = set_handler(i, 4); ! 161: if( ret == ADB_RET_OK) { ! 162: adb_request_t readreg; ! 163: ! 164: thisDeviceType = 4; ! 165: ! 166: [adb_driver readADBDeviceRegister:i :1 :buffer :&length]; ! 167: if ( length == 8 ) { ! 168: thisDeviceResolution = (buffer[4] << 8) | buffer[5]; ! 169: thisButtonCount = buffer[7]; ! 170: } ! 171: } else { ! 172: ret = set_handler(i, 2); ! 173: if( ret != ADB_RET_OK) { ! 174: thisDeviceType = 1; ! 175: thisDeviceResolution = 100; ! 176: } ! 177: } ! 178: deviceInfo[ i ].type = thisDeviceType; ! 179: deviceInfo[ i ].resolution = thisDeviceResolution; ! 180: deviceInfo[ i ].buttonCount = thisButtonCount; ! 181: } ! 182: } ! 183: ! 184: ! 185: static void mouse_intr() ! 186: { ! 187: [_my_Mouse interruptHandler]; ! 188: } ! 189: ! 190: void ! 191: mouse_adbhandler(int number, unsigned char *buffer, int count, void * ssp) ! 192: { ! 193: int i; ! 194: ! 195: /* If window server is not up no further processing is needed */ ! 196: if (wserver_on == 0) return; ! 197: ! 198: if ( buffer[0] & 0x80 ) event.b0 = TRUE; ! 199: else event.b0 = FALSE; ! 200: if ( buffer[1] & 0x80 ) event.b1 = TRUE; ! 201: else event.b1 = FALSE; ! 202: event.b2 = TRUE; ! 203: event.b3 = TRUE; ! 204: event.dx = buffer[1] & 0x7F; ! 205: event.dy = buffer[0] & 0x7F; ! 206: if ( count > 2 ) { // 3 or 4-button mouse ! 207: if ( buffer[2] & 0x80 ) event.b2 = TRUE; ! 208: else event.b2 = FALSE; ! 209: if ( buffer[2] & 0x08 ) event.b3 = TRUE; ! 210: else event.b3 = FALSE; ! 211: // get higher order bits from subsequent bytes ! 212: for ( i = 2; i < count; i++ ) { ! 213: event.dy = event.dy + ((buffer[i] & 0x70) << ((3*i)-3)); ! 214: event.dx = event.dx + ((buffer[i] & 0x07) << ((3*i)+1)); ! 215: } ! 216: } ! 217: // sign-extend ! 218: if ( event.dx & (1 << (count*3)) ) event.dx -= 1 << ((count*3)+1); ! 219: if ( event.dy & (1 << (count*3)) ) event.dy -= 1 << ((count*3)+1); ! 220: ! 221: event.buttonCount = deviceInfo[ number ].buttonCount; ! 222: ! 223: #if DRVRKITINTS ! 224: IOSendInterrupt(identity, state, IO_DEVICE_INTERRUPT_MSG); ! 225: #else ! 226: thread_call_func((thread_call_func_t)mouse_intr,0, TRUE); ! 227: #endif DRVRKITINTS ! 228: ! 229: } ! 230: ! 231: - (BOOL)mouseInit:deviceDescription ! 232: // Description: Initialize the mouse object. ! 233: { ! 234: if( mouse_initted == FALSE) ! 235: { ! 236: mouse_initted = TRUE; ! 237: ! 238: [self setDeviceKind:"PPCMouse"]; ! 239: ! 240: #ifdef DRVRKITINTS ! 241: [self enableAllInterrupts]; ! 242: #endif DRVRKITINTS ! 243: ! 244: [self mouseInit]; ! 245: ! 246: _my_Mouse = self; ! 247: } ! 248: ! 249: ! 250: return YES; ! 251: } ! 252: ! 253: int ! 254: set_handler(int device, int handler) ! 255: { ! 256: unsigned long retval; ! 257: unsigned char value[8]; ! 258: int length; ! 259: ! 260: retval = [adb_driver readADBDeviceRegister:device :3 :value :&length]; ! 261: ! 262: if (retval != ADB_RET_OK) ! 263: return retval; ! 264: ! 265: value[0] &= 0xF0; ! 266: value[1] = handler; ! 267: ! 268: retval = [adb_driver writeADBDeviceRegister:device :3 :value :length]; ! 269: ! 270: if (retval != ADB_RET_OK) ! 271: return retval; ! 272: ! 273: retval = [adb_driver readADBDeviceRegister:device :3 :value :&length]; ! 274: ! 275: if (retval != ADB_RET_OK) ! 276: return retval; ! 277: ! 278: if (value[1] != handler) ! 279: retval = ADB_RET_UNEXPECTED_RESULT; ! 280: ! 281: return( retval ); ! 282: } ! 283: ! 284: ! 285: // ! 286: // END: Implementation of internal support methods ! 287: // ! 288: ! 289: // ! 290: // BEGIN: Implementation of EXPORTED methods ! 291: // ! 292: - free ! 293: { ! 294: return [super free]; ! 295: } ! 296: ! 297: ! 298: - (BOOL) getHandler:(IOPPCInterruptHandler *)handler ! 299: level:(unsigned int *) ipl ! 300: argument:(unsigned int *) arg ! 301: forInterrupt:(unsigned int) localInterrupt ! 302: { ! 303: #ifdef DRVRKITINTS ! 304: *handler = PPCMouseIntHandler; ! 305: *ipl = 3; ! 306: *arg = 0xdeadbeef; ! 307: return YES; ! 308: #endif DRVRKITINTS ! 309: return NO; ! 310: } ! 311: ! 312: ! 313: - (void)interruptHandler ! 314: { ! 315: IOGetTimestamp(&event.timeStamp); ! 316: if (target != nil) ! 317: { ! 318: [target dispatchPointerEvent:&event]; ! 319: } ! 320: } ! 321: ! 322: ! 323: - (int)getResolution ! 324: { ! 325: return resolution; ! 326: } ! 327: // ! 328: // END: Implementation of EXPORTED methods ! 329: // ! 330: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.