Annotation of XNU/iokit/Drivers/hidsystem/drvAppleADBDevices/AppleADBKeyboard.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: /*
                     23:  * 18 June 1998
                     24:  * Start IOKit version.
                     25:  */
                     26: 
                     27: #include "AppleADBKeyboard.h"
                     28: #include <IOKit/hidsystem/IOHIDTypes.h>
                     29: #include <IOKit/IOLib.h>
                     30: 
                     31: #define super IOHIKeyboard
                     32: OSDefineMetaClassAndStructors(AppleADBKeyboard,IOHIKeyboard)
                     33: 
                     34: 
                     35: static void new_kbd_data ( IOService * us, UInt8 adbCommand, IOByteCount length, UInt8 * data );
                     36: static void asyncFunc ( thread_call_param_t, thread_call_param_t );
                     37: 
                     38: 
                     39: // **********************************************************************************
                     40: // start
                     41: //
                     42: // **********************************************************************************
                     43: bool AppleADBKeyboard::start ( IOService * theNub )
                     44: {
                     45: if( !super::start(theNub))
                     46:     return false;
                     47: 
                     48: adbDevice = (IOADBDevice *)theNub;
                     49: if( !adbDevice->seizeForClient(this, new_kbd_data) ) {
                     50:        IOLog("%s: Seize failed\n", getName());
                     51:        return false;
                     52: }
                     53: 
                     54: setAlphaLockFeedback(false);
                     55: 
                     56: clock_interval_to_absolutetime_interval( 4, kSecondScale, &rebootTime);
                     57: clock_interval_to_absolutetime_interval( 1, kSecondScale, &debuggerTime);
                     58: 
                     59: return true;
                     60: }
                     61: 
                     62: 
                     63: // **********************************************************************************
                     64: // interfaceID
                     65: //
                     66: // **********************************************************************************
                     67: UInt32 AppleADBKeyboard::interfaceID ( void )
                     68: {
                     69: return NX_EVS_DEVICE_INTERFACE_ADB;
                     70: }
                     71: 
                     72: 
                     73: // **********************************************************************************
                     74: // deviceType
                     75: //
                     76: // **********************************************************************************
                     77: UInt32 AppleADBKeyboard::deviceType ( void )
                     78: {
                     79: return adbDevice->handlerID();
                     80: }
                     81: 
                     82: 
                     83: // **********************************************************************************
                     84: // setAlphaLockFeedback
                     85: // This is usually called on a call-out thread after the caps-lock key is pressed.
                     86: // ADB operations to PMU are synchronous, and this is must not be done
                     87: // on the call-out thread since that is the PMU driver workloop thread, and
                     88: // it will block itself.
                     89: //
                     90: // Therefore, we schedule the ADB write to disconnect the call-out thread
                     91: // and the one that initiates the ADB write.
                     92: //
                     93: // **********************************************************************************
                     94: void AppleADBKeyboard::setAlphaLockFeedback ( bool to )
                     95: {
                     96:     turnLEDon = to;
                     97: 
                     98:     thread_call_func(asyncFunc, (thread_call_param_t)this, true);
                     99: }
                    100: 
                    101: 
                    102: 
                    103: 
                    104: // **********************************************************************************
                    105: // asyncFunc
                    106: //
                    107: // Called asynchronously to turn on/off the capslock LED
                    108: //
                    109: // **********************************************************************************
                    110: static void asyncFunc ( thread_call_param_t self, thread_call_param_t )
                    111: {
                    112:     
                    113: UInt16         value;
                    114: IOByteCount    length = sizeof( UInt16);
                    115: 
                    116: value = (((AppleADBKeyboard*)self)->turnLEDon ?
                    117:                        0 : ADBKS_LED_CAPSLOCK) | ADBKS_LED_NUMLOCK | ADBKS_LED_SCROLLLOCK;
                    118: 
                    119: ((AppleADBKeyboard*)self)->adbDevice->writeRegister(2, (UInt8 *)&value, &length);
                    120: }
                    121: 
                    122: 
                    123: // **********************************************************************************
                    124: // new_kbd_data
                    125: //
                    126: // **********************************************************************************
                    127: static void new_kbd_data ( IOService * us, UInt8 adbCommand, IOByteCount length, UInt8 * data )
                    128: {
                    129: ((AppleADBKeyboard *)us)->packet(data,length,adbCommand);
                    130: }
                    131: 
                    132: // **********************************************************************************
                    133: // dispatchKeyboardEvent
                    134: //
                    135: // **********************************************************************************
                    136: extern "C" {
                    137: void Debugger( const char * );
                    138: void boot(int paniced, int howto, char * command);
                    139: #define RB_HALT                0x08    /* don't reboot, just halt */
                    140: }
                    141: 
                    142: static void AppleADBKeyboardReboot( thread_call_param_t arg, thread_call_param_t )
                    143: {
                    144:     boot( 0, (int) arg, 0 );
                    145: }
                    146: 
                    147: void AppleADBKeyboard::dispatchKeyboardEvent(unsigned int      keyCode,
                    148:                             /* direction */ bool               goingDown,
                    149:                             /* timeStamp */ AbsoluteTime       time)
                    150: {
                    151:     if( !goingDown && programmerKey) {
                    152:        programmerKey = false;
                    153:        EVK_KEYUP( ADBK_CONTROL, _keyState);
                    154:        SUB_ABSOLUTETIME( &time, &programmerKeyTime );
                    155:         if( CMP_ABSOLUTETIME( &time, &rebootTime) >= 0) {
                    156:             
                    157:            thread_call_func( AppleADBKeyboardReboot,
                    158:                                (void *) RB_HALT, true );
                    159:        } else if( CMP_ABSOLUTETIME( &time, &debuggerTime) >= 0) {
                    160:            Debugger("Programmer Key");
                    161:        }
                    162: 
                    163:     } else if( (keyCode == ADBK_POWER)
                    164:        && (EVK_IS_KEYDOWN( ADBK_CONTROL, _keyState))) {
                    165: 
                    166:        if( !programmerKey) {
                    167:            programmerKey = true;
                    168:            programmerKeyTime = time;
                    169:        }
                    170:        return;
                    171:     }
                    172: 
                    173:     super::dispatchKeyboardEvent( keyCode, goingDown, time );
                    174: }
                    175: 
                    176: // **********************************************************************************
                    177: // packet
                    178: //
                    179: // **********************************************************************************
                    180: IOReturn AppleADBKeyboard::packet (UInt8 * data, IOByteCount, UInt8 adbCommand )
                    181: {
                    182: unsigned int   keycode1, keycode2;
                    183: bool           down;
                    184: AbsoluteTime   now;
                    185: 
                    186: keycode1 = *data;
                    187: down = ((keycode1 & 0x80) == 0);
                    188: keycode1 &= 0x7f;
                    189: if(keycode1 == 0x7e) keycode1 = ADBK_POWER;
                    190: clock_get_uptime(&now);
                    191: 
                    192: dispatchKeyboardEvent(keycode1,down,now);
                    193: 
                    194: keycode2 = *(data + 1);
                    195: if( keycode2 != 0xff ) {
                    196:         down = ((keycode2 & 0x80) == 0);
                    197:         keycode2 &= 0x7f;
                    198:         if( keycode2 == 0x7e) keycode2 = ADBK_POWER;
                    199:        if( (keycode1 != ADBK_POWER) || (keycode2 != ADBK_POWER))
                    200:                dispatchKeyboardEvent(keycode2,down,now);
                    201: }
                    202: 
                    203: return kIOReturnSuccess;
                    204: }
                    205: 
                    206: 
                    207: // **********************************************************************************
                    208: // maxKeyCodes
                    209: //
                    210: // **********************************************************************************
                    211: UInt32 AppleADBKeyboard::maxKeyCodes ( void )
                    212: {
                    213: return 0x80;
                    214: }
                    215: 
                    216: 
                    217: // **********************************************************************************
                    218: // defaultKeymapOfLength
                    219: //
                    220: // **********************************************************************************
                    221: const unsigned char * AppleADBKeyboard::defaultKeymapOfLength (UInt32 * length )
                    222: {
                    223: static const unsigned char appleUSAKeyMap[] = {
                    224:             0x00,0x00,0x07,
                    225:            0x00,0x01,0x39,
                    226:            0x01,0x02,0x38,0x7b,
                    227:            0x02,0x02,0x36,0x7d,0x03,0x02,0x3a,0x7c,0x04,
                    228:             0x01,0x37,0x05,0x15,0x52,0x41,0x4c,0x53,0x54,0x55,0x45,0x58,0x57,0x56,0x5b,0x5c,
                    229:             0x43,0x4b,0x51,0x3b,0x3d,0x3e,0x3c,0x4e,0x59,0x06,0x01,0x72,0x7b,0x0d,0x00,0x61,
                    230:             0x00,0x41,0x00,0x01,0x00,0x01,0x00,0xca,0x00,0xc7,0x00,0x01,0x00,0x01,0x0d,0x00,
                    231:             0x73,0x00,0x53,0x00,0x13,0x00,0x13,0x00,0xfb,0x00,0xa7,0x00,0x13,0x00,0x13,0x0d,
                    232:             0x00,0x64,0x00,0x44,0x00,0x04,0x00,0x04,0x01,0x44,0x01,0xb6,0x00,0x04,0x00,0x04,
                    233:             0x0d,0x00,0x66,0x00,0x46,0x00,0x06,0x00,0x06,0x00,0xa6,0x01,0xac,0x00,0x06,0x00,
                    234:             0x06,0x0d,0x00,0x68,0x00,0x48,0x00,0x08,0x00,0x08,0x00,0xe3,0x00,0xeb,0x00,0x00,
                    235:             0x18,0x00,0x0d,0x00,0x67,0x00,0x47,0x00,0x07,0x00,0x07,0x00,0xf1,0x00,0xe1,0x00,
                    236:             0x07,0x00,0x07,0x0d,0x00,0x7a,0x00,0x5a,0x00,0x1a,0x00,0x1a,0x00,0xcf,0x01,0x57,
                    237:             0x00,0x1a,0x00,0x1a,0x0d,0x00,0x78,0x00,0x58,0x00,0x18,0x00,0x18,0x01,0xb4,0x01,
                    238:             0xce,0x00,0x18,0x00,0x18,0x0d,0x00,0x63,0x00,0x43,0x00,0x03,0x00,0x03,0x01,0xe3,
                    239:             0x01,0xd3,0x00,0x03,0x00,0x03,0x0d,0x00,0x76,0x00,0x56,0x00,0x16,0x00,0x16,0x01,
                    240:             0xd6,0x01,0xe0,0x00,0x16,0x00,0x16,0x02,0x00,0x3c,0x00,0x3e,0x0d,0x00,0x62,0x00,
                    241:             0x42,0x00,0x02,0x00,0x02,0x01,0xe5,0x01,0xf2,0x00,0x02,0x00,0x02,0x0d,0x00,0x71,
                    242:             0x00,0x51,0x00,0x11,0x00,0x11,0x00,0xfa,0x00,0xea,0x00,0x11,0x00,0x11,0x0d,0x00,
                    243:             0x77,0x00,0x57,0x00,0x17,0x00,0x17,0x01,0xc8,0x01,0xc7,0x00,0x17,0x00,0x17,0x0d,
                    244:             0x00,0x65,0x00,0x45,0x00,0x05,0x00,0x05,0x00,0xc2,0x00,0xc5,0x00,0x05,0x00,0x05,
                    245:             0x0d,0x00,0x72,0x00,0x52,0x00,0x12,0x00,0x12,0x01,0xe2,0x01,0xd2,0x00,0x12,0x00,
                    246:             0x12,0x0d,0x00,0x79,0x00,0x59,0x00,0x19,0x00,0x19,0x00,0xa5,0x01,0xdb,0x00,0x19,
                    247:             0x00,0x19,0x0d,0x00,0x74,0x00,0x54,0x00,0x14,0x00,0x14,0x01,0xe4,0x01,0xd4,0x00,
                    248:             0x14,0x00,0x14,0x0a,0x00,0x31,0x00,0x21,0x01,0xad,0x00,0xa1,0x0e,0x00,0x32,0x00,
                    249:             0x40,0x00,0x32,0x00,0x00,0x00,0xb2,0x00,0xb3,0x00,0x00,0x00,0x00,0x0a,0x00,0x33,
                    250:             0x00,0x23,0x00,0xa3,0x01,0xba,0x0a,0x00,0x34,0x00,0x24,0x00,0xa2,0x00,0xa8,0x0e,
                    251:             0x00,0x36,0x00,0x5e,0x00,0x36,0x00,0x1e,0x00,0xb6,0x00,0xc3,0x00,0x1e,0x00,0x1e,
                    252:             0x0a,0x00,0x35,0x00,0x25,0x01,0xa5,0x00,0xbd,0x0a,0x00,0x3d,0x00,0x2b,0x01,0xb9,
                    253:             0x01,0xb1,0x0a,0x00,0x39,0x00,0x28,0x00,0xac,0x00,0xab,0x0a,0x00,0x37,0x00,0x26,
                    254:             0x01,0xb0,0x01,0xab,0x0e,0x00,0x2d,0x00,0x5f,0x00,0x1f,0x00,0x1f,0x00,0xb1,0x00,
                    255:             0xd0,0x00,0x1f,0x00,0x1f,0x0a,0x00,0x38,0x00,0x2a,0x00,0xb7,0x00,0xb4,0x0a,0x00,
                    256:             0x30,0x00,0x29,0x00,0xad,0x00,0xbb,0x0e,0x00,0x5d,0x00,0x7d,0x00,0x1d,0x00,0x1d,
                    257:             0x00,0x27,0x00,0xba,0x00,0x1d,0x00,0x1d,0x0d,0x00,0x6f,0x00,0x4f,0x00,0x0f,0x00,
                    258:             0x0f,0x00,0xf9,0x00,0xe9,0x00,0x0f,0x00,0x0f,0x0d,0x00,0x75,0x00,0x55,0x00,0x15,
                    259:             0x00,0x15,0x00,0xc8,0x00,0xcd,0x00,0x15,0x00,0x15,0x0e,0x00,0x5b,0x00,0x7b,0x00,
                    260:             0x1b,0x00,0x1b,0x00,0x60,0x00,0xaa,0x00,0x1b,0x00,0x1b,0x0d,0x00,0x69,0x00,0x49,
                    261:             0x00,0x09,0x00,0x09,0x00,0xc1,0x00,0xf5,0x00,0x09,0x00,0x09,0x0d,0x00,0x70,0x00,
                    262:             0x50,0x00,0x10,0x00,0x10,0x01,0x70,0x01,0x50,0x00,0x10,0x00,0x10,0x10,0x00,0x0d,
                    263:             0x00,0x03,0x0d,0x00,0x6c,0x00,0x4c,0x00,0x0c,0x00,0x0c,0x00,0xf8,0x00,0xe8,0x00,
                    264:             0x0c,0x00,0x0c,0x0d,0x00,0x6a,0x00,0x4a,0x00,0x0a,0x00,0x0a,0x00,0xc6,0x00,0xae,
                    265:             0x00,0x0a,0x00,0x0a,0x0a,0x00,0x27,0x00,0x22,0x00,0xa9,0x01,0xae,0x0d,0x00,0x6b,
                    266:             0x00,0x4b,0x00,0x0b,0x00,0x0b,0x00,0xce,0x00,0xaf,0x00,0x0b,0x00,0x0b,0x0a,0x00,
                    267:             0x3b,0x00,0x3a,0x01,0xb2,0x01,0xa2,0x0e,0x00,0x5c,0x00,0x7c,0x00,0x1c,0x00,0x1c,
                    268:             0x00,0xe3,0x00,0xeb,0x00,0x1c,0x00,0x1c,0x0a,0x00,0x2c,0x00,0x3c,0x00,0xcb,0x01,
                    269:             0xa3,0x0a,0x00,0x2f,0x00,0x3f,0x01,0xb8,0x00,0xbf,0x0d,0x00,0x6e,0x00,0x4e,0x00,
                    270:             0x0e,0x00,0x0e,0x00,0xc4,0x01,0xaf,0x00,0x0e,0x00,0x0e,0x0d,0x00,0x6d,0x00,0x4d,
                    271:             0x00,0x0d,0x00,0x0d,0x01,0x6d,0x01,0xd8,0x00,0x0d,0x00,0x0d,0x0a,0x00,0x2e,0x00,
                    272:             0x3e,0x00,0xbc,0x01,0xb3,0x02,0x00,0x09,0x00,0x19,0x0c,0x00,0x20,0x00,0x00,0x00,
                    273:             0x80,0x00,0x00,0x0a,0x00,0x60,0x00,0x7e,0x00,0x60,0x01,0xbb,0x02,0x00,0x7f,0x00,
                    274:             0x08,0xff,0x02,0x00,0x1b,0x00,0x7e,0xff,0xff,0xff,0xff,0xff,0x00,0x01,0xac,0x00,
                    275:             0x01,0xae,0x00,0x01,0xaf,0x00,0x01,0xad,0xff,0xff,0x00,0x00,0x2e,0xff,0x00,0x00,
                    276:             0x2a,0xff,0x00,0x00,0x2b,0xff,0x00,0x00,0x1b,0xff,0xff,0xff,0x0e,0x00,0x2f,0x00,
                    277:             0x5c,0x00,0x2f,0x00,0x1c,0x00,0x2f,0x00,0x5c,0x00,0x00,0x0a,0x00,0x00,0x00,0x0d, //XX03
                    278:             0xff,0x00,0x00,0x2d,0xff,0xff,0x0e,0x00,0x3d,0x00,0x7c,0x00,0x3d,0x00,0x1c,0x00,
                    279:             0x3d,0x00,0x7c,0x00,0x00,0x18,0x46,0x00,0x00,0x30,0x00,0x00,0x31,0x00,0x00,0x32,
                    280:             0x00,0x00,0x33,0x00,0x00,0x34,0x00,0x00,0x35,0x00,0x00,0x36,0x00,0x00,0x37,0xff,
                    281:             0x00,0x00,0x38,0x00,0x00,0x39,0xff,0xff,0xff,0x00,0xfe,0x24,0x00,0xfe,0x25,0x00,
                    282:             0xfe,0x26,0x00,0xfe,0x22,0x00,0xfe,0x27,0x00,0xfe,0x28,0xff,0x00,0xfe,0x2a,0xff,
                    283:             0x00,0xfe,0x32,0xff,0x00,0xfe,0x33,0xff,0x00,0xfe,0x29,0xff,0x00,0xfe,0x2b,0xff,
                    284:             0x00,0xfe,0x34,0xff,0x00,0xfe,0x2e,0x00,0xfe,0x30,0x00,0xfe,0x2d,0x00,0xfe,0x23,
                    285:             0x00,0xfe,0x2f,0x00,0xfe,0x21,0x00,0xfe,0x31,0x00,0xfe,0x20,0x0f,0x02,0xff,0x04,
                    286:             0x00,0x31,0x02,0xff,0x04,0x00,0x32,0x02,0xff,0x04,0x00,0x33,0x02,0xff,0x04,0x00,
                    287:             0x34,0x02,0xff,0x04,0x00,0x35,0x02,0xff,0x04,0x00,0x36,0x02,0xff,0x04,0x00,0x37,
                    288:             0x02,0xff,0x04,0x00,0x38,0x02,0xff,0x04,0x00,0x39,0x02,0xff,0x04,0x00,0x30,0x02,
                    289:             0xff,0x04,0x00,0x2d,0x02,0xff,0x04,0x00,0x3d,0x02,0xff,0x04,0x00,0x70,0x02,0xff,
                    290:             0x04,0x00,0x5d,0x02,0xff,0x04,0x00,0x5b,0x04,0x05,0x72,0x06,0x7f,0x07,
                    291:             0x3e,0x08,0x3d
                    292:     };
                    293: 
                    294: *length = sizeof(appleUSAKeyMap);
                    295: return appleUSAKeyMap;
                    296: }
                    297: 
                    298: 
                    299: 

unix.superglobalmegacorp.com

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