Annotation of XNU/iokit/Drivers/hidsystem/drvAppleADBDevices/AppleADBButtons.cpp, revision 1.1.1.1

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: #include "AppleADBButtons.h"
                     23: #include <IOKit/IOLib.h>
                     24: #include <IOKit/pwr_mgt/IOPM.h>
                     25: #include <IOKit/hidsystem/IOHIDTypes.h>
                     26: #include <IOKit/hidsystem/IOHIDParameter.h>
                     27: 
                     28: #define super IOHIKeyboard
                     29: OSDefineMetaClassAndStructors(AppleADBButtons,IOHIKeyboard)
                     30: 
                     31: bool displayWranglerFound( OSObject *, void *, IOService * );
                     32: void button_data ( IOService * us, UInt8 adbCommand, IOByteCount length, UInt8 * data );
                     33: void asyncFunc ( void * );
                     34: 
                     35: // **********************************************************************************
                     36: // start
                     37: //
                     38: // **********************************************************************************
                     39: bool AppleADBButtons::start ( IOService * theNub )
                     40: {
                     41:     int i;
                     42: 
                     43:     for ( i = 0; i < kMax_registrations; i++ ) {
                     44:         keycodes[i] = kNullKey;
                     45:         downHandlers[i] = NULL;
                     46:     }
                     47:     
                     48:     if( !super::start(theNub))
                     49:         return false;
                     50: 
                     51:     adbDevice = (IOADBDevice *)theNub;
                     52:     if( !adbDevice->seizeForClient(this, button_data) ) {
                     53:         IOLog("%s: Seize failed\n", getName());
                     54:         return false;
                     55:     }
                     56:     registerService();
                     57: 
                     58:     addNotification( gIOPublishNotification,serviceMatching("IODisplayWrangler"),      // look for the display wrangler
                     59:                      (IOServiceNotificationHandler)displayWranglerFound, this, 0 );
                     60: 
                     61: return true;
                     62: }
                     63: 
                     64: 
                     65: // **********************************************************************************
                     66: // displayWranglerFound
                     67: //
                     68: // The Display Wrangler has appeared.  We will be calling its
                     69: // ActivityTickle method when there is user activity.
                     70: // **********************************************************************************
                     71: bool displayWranglerFound( OSObject * us, void * ref, IOService * yourDevice )
                     72: {
                     73:  if ( yourDevice != NULL ) {
                     74:      ((AppleADBButtons *)us)->displayManager = yourDevice;
                     75:  }
                     76:  return true;
                     77: }
                     78: 
                     79: UInt32 AppleADBButtons::interfaceID()
                     80: {
                     81:     return NX_EVS_DEVICE_INTERFACE_ADB;
                     82: }
                     83: 
                     84: UInt32 AppleADBButtons::deviceType()
                     85: {
                     86:     return adbDevice->handlerID();
                     87: }
                     88: 
                     89: // **********************************************************************************
                     90: // registerForButton
                     91: //
                     92: // Clients call here, specifying a button and a routine to call when that
                     93: // button is pressed or released.
                     94: // **********************************************************************************
                     95: IOReturn AppleADBButtons::registerForButton ( unsigned int keycode, IOService * registrant, button_handler handler, bool down )
                     96: {
                     97:     int i;
                     98: 
                     99:     for ( i = 0; i < kMax_registrations; i++ ) {
                    100:         if ( keycodes[i] == kNullKey ) {
                    101:             if ( down ) {
                    102:                 registrants[i] = registrant;
                    103:                 downHandlers[i] = handler;
                    104:                 keycodes[i] = keycode;
                    105:                 break;
                    106:             }
                    107:         }
                    108:     }
                    109:     return kIOReturnSuccess;
                    110: }
                    111: 
                    112: // **********************************************************************************
                    113: // button_data
                    114: //
                    115: // **********************************************************************************
                    116: void button_data ( IOService * us, UInt8 adbCommand, IOByteCount length, UInt8 * data )
                    117: {
                    118: ((AppleADBButtons *)us)->packet(data,length,adbCommand);
                    119: }
                    120: 
                    121: 
                    122: // **********************************************************************************
                    123: // packet
                    124: //
                    125: // **********************************************************************************
                    126: IOReturn AppleADBButtons::packet (UInt8 * data, IOByteCount, UInt8 adbCommand )
                    127: {
                    128:     unsigned int       keycode;
                    129:     bool               down;
                    130: 
                    131:     keycode = *data;
                    132:     down = ((keycode & 0x80) == 0);
                    133:     keycode &= 0x7f;
                    134: 
                    135:     dispatchButtonEvent(keycode,down);
                    136: 
                    137:     keycode = *(data + 1);
                    138:     if( keycode != 0xff ) {
                    139:         down = ((keycode & 0x80) == 0);
                    140:         keycode &= 0x7f;
                    141:         dispatchButtonEvent(keycode,down);
                    142:     }
                    143:     
                    144:     if ( displayManager != NULL ) {                    // if there is a display manager, tell
                    145:         displayManager->activityTickle(kIOPMSuperclassPolicy1);        // it there is user activity
                    146:     }
                    147:     
                    148:     return kIOReturnSuccess;
                    149: }
                    150: 
                    151: 
                    152: // **********************************************************************************
                    153: // dispatchButtonEvent
                    154: //
                    155: // Look for any registered handlers for this button and notify them.
                    156: // **********************************************************************************
                    157: void AppleADBButtons::dispatchButtonEvent (unsigned int keycode, bool down )
                    158: {
                    159:     int i;
                    160:     AbsoluteTime now;
                    161: 
                    162:     clock_get_uptime(&now);
                    163:     
                    164:     for ( i = 0; i < kMax_registrations; i++ ) {
                    165:         if ( keycodes[i] == keycode ) {
                    166:             if ( down ) {
                    167:                 if (downHandlers[i] != NULL ) {
                    168:                     thread_call_func((thread_call_func_t)downHandlers[i],
                    169:                                      (thread_call_param_t)registrants[i],
                    170:                                      true);
                    171:                 }
                    172:             }
                    173:         }
                    174:     }
                    175: 
                    176:     dispatchKeyboardEvent(keycode, down, now);
                    177: }
                    178: 
                    179: const unsigned char *AppleADBButtons::defaultKeymapOfLength(UInt32 *length)
                    180: {
                    181:     static const unsigned char appleADBButtonsKeyMap[] = {
                    182:         0x00, 0x00,    // chars
                    183:         0x00,          // no modifier keys
                    184:         0x00,          // no defs
                    185:         0x00,          // no seqs
                    186:         0x05,          // 5 special keys
                    187:         NX_KEYTYPE_SOUND_UP, kVolume_up,
                    188:         NX_KEYTYPE_SOUND_DOWN, kVolume_down,
                    189:         NX_KEYTYPE_MUTE, kMute,
                    190:         NX_KEYTYPE_BRIGHTNESS_UP, kBrightness_up,
                    191:         NX_KEYTYPE_BRIGHTNESS_DOWN, kBrightness_down
                    192:     };
                    193:     
                    194:     *length = sizeof(appleADBButtonsKeyMap);
                    195:     
                    196:     return appleADBButtonsKeyMap;
                    197: }
                    198: 
                    199: IOReturn AppleADBButtons::setParamProperties(OSDictionary *dict)
                    200: {
                    201:     if (dict->getObject(kIOHIDKeyMappingKey)) {
                    202:         dict->removeObject(kIOHIDKeyMappingKey);
                    203:         // Do we also need to release this object? - hopefully not
                    204:     }
                    205: 
                    206:     return super::setParamProperties(dict);
                    207: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.