#include <IOKit/IOLib.h>
#include <IOKit/assert.h>
#include <IOKit/hidsystem/IOHIDUsageTables.h>
#include <IOKit/hidsystem/IOHIDParameter.h>
#include <IOKit/hidsystem/IOHIDShared.h>
#include <IOKit/usb/USB.h>
#include "IOHIDKeyboard.h"
#include "IOHIDKeys.h"
#include "IOHIDElement.h"
#include "IOHIDFamilyTrace.h"
#include "AppleHIDUsageTables.h"
#define kFnModifierUsagePageKey "FnModifierUsagePage"
#define kFnModifierUsageKey "FnModifierUsage"
#define kFnSpecialKeyMapKey "FnSpecialKeyMap"
#define kFnNonSpecialUsageMapKey "FnNonSpecialUsageMap"
#define kNumPadUsageMapKey "NumPadUsageMap"
#define super IOHIKeyboard
OSDefineMetaClassAndStructors(IOHIDKeyboard, super)
extern unsigned int hid_usb_2_adb_keymap[]; extern unsigned int hid_usb_apple_2_adb_keymap[];
IOHIDKeyboard *
IOHIDKeyboard::Keyboard(UInt32 supportedModifiers, bool isDispatcher)
{
IOHIDKeyboard *keyboard = new IOHIDKeyboard;
if ((keyboard == 0) || !keyboard->init())
{
if (keyboard) keyboard->release();
return 0;
}
keyboard->_containsFKey = ( supportedModifiers & NX_SECONDARYFNMASK );
keyboard->setProperty( kIOHIDKeyboardSupportedModifiersKey, supportedModifiers, 32 );
keyboard->_isDispatcher = isDispatcher;
return keyboard;
}
bool
IOHIDKeyboard::init(OSDictionary *properties)
{
if (!super::init(properties)) return false;
_asyncLEDThread = 0;
_ledState = 0;
_repeat = true;
setRepeatMode(_repeat);
_containsFKey = 0;
bcopy(hid_usb_2_adb_keymap, _usb_2_adb_keymap, sizeof(unsigned int ) * ADB_CONVERTER_LEN);
bcopy(hid_usb_apple_2_adb_keymap, _usb_apple_2_adb_keymap, sizeof(unsigned int) * APPLE_ADB_CONVERTER_LEN);
return true;
}
bool
IOHIDKeyboard::start(IOService *provider)
{
OSNumber *xml_swap_CTRL_CAPSLOCK;
OSNumber *xml_swap_CMD_ALT;
OSNumber *xml_use_pc_keyboard;
UInt16 productIDVal;
UInt16 vendorIDVal;
_provider = OSDynamicCast(IOHIDEventService, provider);
if ( !_provider )
return false;
if ( _isDispatcher )
setProperty(kIOHIDVirtualHIDevice, kOSBooleanTrue);
productIDVal = _provider->getProductID();
vendorIDVal = _provider->getVendorID();
xml_swap_CTRL_CAPSLOCK = (OSNumber*)provider->copyProperty("Swap control and capslock");
if (OSDynamicCast( OSNumber, xml_swap_CTRL_CAPSLOCK ))
{
if ( xml_swap_CTRL_CAPSLOCK->unsigned32BitValue())
{
char temp;
temp = _usb_2_adb_keymap[0x39]; _usb_2_adb_keymap[0x39] = _usb_2_adb_keymap[0xe0]; _usb_2_adb_keymap[0xe0] = temp;
}
}
OSSafeReleaseNULL(xml_swap_CTRL_CAPSLOCK);
xml_swap_CMD_ALT = (OSNumber*)provider->copyProperty("Swap command and alt");
if (OSDynamicCast( OSNumber, xml_swap_CMD_ALT ))
{
if ( xml_swap_CMD_ALT->unsigned32BitValue())
{
char temp;
temp = _usb_2_adb_keymap[0xe2]; _usb_2_adb_keymap[0xe2] = _usb_2_adb_keymap[0xe3]; _usb_2_adb_keymap[0xe3] = temp;
temp = _usb_2_adb_keymap[0xe6]; _usb_2_adb_keymap[0xe6] = _usb_2_adb_keymap[0xe7]; _usb_2_adb_keymap[0xe7] = temp;
}
}
OSSafeReleaseNULL(xml_swap_CMD_ALT);
xml_use_pc_keyboard = (OSNumber*)provider->copyProperty("Use PC keyboard");
if (OSDynamicCast( OSNumber, xml_use_pc_keyboard ))
{
if ( xml_use_pc_keyboard->unsigned32BitValue())
{
char temp;
temp = _usb_2_adb_keymap[0xe0]; _usb_2_adb_keymap[0xe0] = _usb_2_adb_keymap[0xe2]; _usb_2_adb_keymap[0xe2] = _usb_2_adb_keymap[0xe3]; _usb_2_adb_keymap[0xe3] = temp;
temp = _usb_2_adb_keymap[0xe6]; _usb_2_adb_keymap[0xe6] = _usb_2_adb_keymap[0xe7]; _usb_2_adb_keymap[0xe4] = temp; }
}
OSSafeReleaseNULL(xml_use_pc_keyboard);
_asyncLEDThread = thread_call_allocate((thread_call_func_t)_asyncLED, (thread_call_param_t)this);
if ( _containsFKey )
{
setProperty(kIOHIDFKeyModeKey, (unsigned long long)0, (unsigned int)32);
}
return super::start(provider);
}
void IOHIDKeyboard::stop(IOService * provider)
{
_provider = NULL;
if (_asyncLEDThread)
{
thread_call_cancel(_asyncLEDThread);
thread_call_free(_asyncLEDThread);
_asyncLEDThread = 0;
}
super::stop(provider);
}
void IOHIDKeyboard::free()
{
super::free();
}
extern "C" {
void Debugger( const char * );
void boot(int paniced, int howto, char * command);
#define RB_BOOT 1
}
void IOHIDKeyboard::dispatchKeyboardEvent(
AbsoluteTime timeStamp,
UInt32 usagePage,
UInt32 usage,
bool keyDown,
IOOptionBits options)
{
UInt32 alpha = usage;
bool repeat = ((options & kHIDDispatchOptionKeyboardNoRepeat) == 0);
UInt32 vendorID = _provider ? _provider->getVendorID() : 0;
unsigned int keycode = 0xff;
if ((usagePage > 0xffff) || (usage > 0xffff))
IOLog("IOHIDKeyboard::dispatchKeyboardEvent usage/page unexpectedly large %02x:%02x\n", (int)usagePage, (int)usage);
setLastPageAndUsage(usagePage, usage);
switch (usagePage)
{
case kHIDPage_KeyboardOrKeypad:
case kHIDPage_AppleVendorKeyboard:
if (repeat != _repeat)
{
_repeat = repeat;
setRepeatMode(_repeat);
}
if ( usagePage == kHIDPage_KeyboardOrKeypad ) {
keycode = _usb_2_adb_keymap[alpha];
}
else {
keycode = _usb_apple_2_adb_keymap[alpha];
}
if ((usagePage == kHIDPage_AppleVendorKeyboard) && (usage == kHIDUsage_AppleVendorKeyboard_Function) && (vendorID == kIOUSBVendorIDAppleComputer)) {
super::dispatchKeyboardEvent(0x3f, keyDown, timeStamp);
}
else {
super::dispatchKeyboardEvent(keycode, keyDown, timeStamp);
}
break;
case kHIDPage_AppleVendorTopCase:
if ((usage == kHIDUsage_AV_TopCase_KeyboardFn) && (vendorID == kIOUSBVendorIDAppleComputer))
super::dispatchKeyboardEvent(0x3f, keyDown, timeStamp);
break;
}
clearLastPageAndUsage();
}
void
IOHIDKeyboard::_asyncLED(OSObject *target)
{
IOHIDKeyboard *me = OSDynamicCast(IOHIDKeyboard, target);
IOHID_DEBUG(kIOHIDDebugCode_KeyboardLEDThreadActive, me, me ? me->_ledState : -1, me ? (uintptr_t)me->_provider : (uintptr_t)-1, 0);
me->Set_LED_States( me->_ledState );
}
void
IOHIDKeyboard::Set_LED_States(UInt8 ledState)
{
if (_provider) {
bool resync = _resyncLED;
_resyncLED = FALSE;
for (int i=0; i<2; i++)
{
UInt32 value = (ledState >> i) & 1;
if (resync)
_provider->setElementValue(kHIDPage_LEDs, i + kHIDUsage_LED_NumLock, value ? 0 : 1);
_provider->setElementValue(kHIDPage_LEDs, i + kHIDUsage_LED_NumLock, value);
}
}
}
void
IOHIDKeyboard::setAlphaLockFeedback ( bool LED_state)
{
UInt8 newState = _ledState;
if (LED_state) newState |= kUSB_CAPSLOCKLED_SET; else
newState &= ~kUSB_CAPSLOCKLED_SET;
if (newState != _ledState)
{
_ledState = newState;
if (_asyncLEDThread) {
IOHID_DEBUG(kIOHIDDebugCode_KeyboardLEDThreadTrigger, this, _ledState, 0, 0);
thread_call_enter(_asyncLEDThread);
}
}
}
void
IOHIDKeyboard::setNumLockFeedback ( bool LED_state)
{
UInt8 newState = _ledState;
if (LED_state)
newState |= kUSB_NUMLOCKLED_SET; else
newState &= ~kUSB_NUMLOCKLED_SET;
if (newState != _ledState)
{
_ledState = newState;
if (_asyncLEDThread) {
IOHID_DEBUG(kIOHIDDebugCode_KeyboardLEDThreadTrigger, this, _ledState, 1, 0);
thread_call_enter(_asyncLEDThread);
}
}
}
unsigned
IOHIDKeyboard::getLEDStatus (void )
{
unsigned ledState = 0;
if (_provider) {
for (int i=0; i<2; i++)
{
ledState |= (_provider->getElementValue(kHIDPage_LEDs, i + kHIDUsage_LED_NumLock)) << i;
}
}
return ledState;
}
UInt32
IOHIDKeyboard::deviceType ( void )
{
UInt32 id = kgestUSBUnknownANSIkd;
if ( _deviceType )
{
id = _deviceType;
}
else {
OSNumber *xml_handlerID = _provider ? (OSNumber*)_provider->copyProperty("alt_handler_id") : NULL;
if ( OSDynamicCast(OSNumber, xml_handlerID) ) {
id = xml_handlerID->unsigned32BitValue();
}
else {
id = handlerID();
}
OSSafeReleaseNULL(xml_handlerID);
}
switch ( id )
{
case kgestUSBCosmoISOKbd:
case kgestUSBAndyISOKbd:
case kgestQ6ISOKbd:
case kgestQ30ISOKbd:
case kgestM89ISOKbd:
case kgestUSBGenericISOkd:
_usb_2_adb_keymap[0x35] = 0x0a;
_usb_2_adb_keymap[0x64] = 0x32;
break;
default:
_usb_2_adb_keymap[0x35] = 0x32;
_usb_2_adb_keymap[0x64] = 0x0a;
break;
}
return id;
}
UInt32
IOHIDKeyboard::interfaceID ( void )
{
return NX_EVS_DEVICE_INTERFACE_ADB; }
UInt32
IOHIDKeyboard::handlerID ( void )
{
UInt32 ret_id = kgestUSBUnknownANSIkd;
if (_provider) {
UInt16 productID = _provider->getProductID();
UInt16 vendorID = _provider->getVendorID();
if (vendorID == kIOUSBVendorIDAppleComputer)
{
switch (productID)
{
case kprodUSBCosmoANSIKbd: ret_id = kgestUSBCosmoANSIKbd; break;
case kprodUSBCosmoISOKbd: ret_id = kgestUSBCosmoISOKbd; break;
case kprodUSBCosmoJISKbd: ret_id = kgestUSBCosmoJISKbd; break;
case kprodUSBAndyANSIKbd: ret_id = kgestUSBAndyANSIKbd; break;
case kprodUSBAndyISOKbd: ret_id = kgestUSBAndyISOKbd; break;
case kprodUSBAndyJISKbd: ret_id = kgestUSBAndyJISKbd; break;
case kprodQ6ANSIKbd: ret_id = kgestQ6ANSIKbd;
break;
case kprodQ6ISOKbd: ret_id = kgestQ6ISOKbd;
break;
case kprodQ6JISKbd: ret_id = kgestQ6JISKbd;
break;
case kprodQ30ANSIKbd: ret_id = kgestQ30ANSIKbd;
break;
case kprodQ30ISOKbd: ret_id = kgestQ30ISOKbd;
break;
case kprodQ30JISKbd: ret_id = kgestQ30JISKbd;
break;
case kprodFountainANSIKbd: ret_id = kgestFountainANSIKbd;
break;
case kprodFountainISOKbd: ret_id = kgestFountainISOKbd;
break;
case kprodFountainJISKbd: ret_id = kgestFountainJISKbd;
break;
case kprodSantaANSIKbd: ret_id = kgestSantaANSIKbd;
break;
case kprodSantaISOKbd: ret_id = kgestSantaISOKbd;
break;
case kprodSantaJISKbd: ret_id = kgestSantaJISKbd;
break;
default: ret_id = kgestUSBCosmoANSIKbd;
break;
}
}
}
return ret_id; }
const unsigned char *
IOHIDKeyboard::defaultKeymapOfLength (UInt32 * length )
{
if ( _containsFKey )
{
static const unsigned char appleUSAFKeyMap[] = {
0x00,0x00,
0x0b, 0x01,0x01,0x38,
0x02,0x01,0x3b,
0x03,0x01,0x3a,
0x04,0x01,0x37,
0x05,0x14,0x52,0x41,0x53,0x54,0x55,0x45,0x58,0x57,0x56,0x5b,0x5c,
0x43,0x4b,0x51,0x7b,0x7d,0x7e,0x7c,0x4e,0x59,
0x06,0x01,0x72,
0x07,0x01,0x3f, 0x09,0x01,0x3c, 0x0a,0x01,0x3e, 0x0b,0x01,0x3d, 0x0c,0x01,0x36,
0xa2,
0x0d,0x00,0x61,0x00,0x41,0x00,0x01,0x00,0x01,0x00,0xca,0x00,0xc7,0x00,0x01,0x00,0x01, 0x0d,0x00,0x73,0x00,0x53,0x00,0x13,0x00,0x13,0x00,0xfb,0x00,0xa7,0x00,0x13,0x00,0x13, 0x0d,0x00,0x64,0x00,0x44,0x00,0x04,0x00,0x04,0x01,0x44,0x01,0xb6,0x00,0x04,0x00,0x04, 0x0d,0x00,0x66,0x00,0x46,0x00,0x06,0x00,0x06,0x00,0xa6,0x01,0xac,0x00,0x06,0x00,0x06, 0x0d,0x00,0x68,0x00,0x48,0x00,0x08,0x00,0x08,0x00,0xe3,0x00,0xeb,0x00,0x00,0x18,0x00, 0x0d,0x00,0x67,0x00,0x47,0x00,0x07,0x00,0x07,0x00,0xf1,0x00,0xe1,0x00,0x07,0x00,0x07, 0x0d,0x00,0x7a,0x00,0x5a,0x00,0x1a,0x00,0x1a,0x00,0xcf,0x01,0x57,0x00,0x1a,0x00,0x1a, 0x0d,0x00,0x78,0x00,0x58,0x00,0x18,0x00,0x18,0x01,0xb4,0x01,0xce,0x00,0x18,0x00,0x18, 0x0d,0x00,0x63,0x00,0x43,0x00,0x03,0x00,0x03,0x01,0xe3,0x01,0xd3,0x00,0x03,0x00,0x03, 0x0d,0x00,0x76,0x00,0x56,0x00,0x16,0x00,0x16,0x01,0xd6,0x01,0xe0,0x00,0x16,0x00,0x16, 0x02,0x00,0x3c,0x00,0x3e, 0x0d,0x00,0x62,0x00,0x42,0x00,0x02,0x00,0x02,0x01,0xe5,0x01,0xf2,0x00,0x02,0x00,0x02, 0x0d,0x00,0x71,0x00,0x51,0x00,0x11,0x00,0x11,0x00,0xfa,0x00,0xea,0x00,0x11,0x00,0x11, 0x0d,0x00,0x77,0x00,0x57,0x00,0x17,0x00,0x17,0x01,0xc8,0x01,0xc7,0x00,0x17,0x00,0x17, 0x0d,0x00,0x65,0x00,0x45,0x00,0x05,0x00,0x05,0x00,0xc2,0x00,0xc5,0x00,0x05,0x00,0x05, 0x0d,0x00,0x72,0x00,0x52,0x00,0x12,0x00,0x12,0x01,0xe2,0x01,0xd2,0x00,0x12,0x00,0x12, 0x0d,0x00,0x79,0x00,0x59,0x00,0x19,0x00,0x19,0x00,0xa5,0x01,0xdb,0x00,0x19,0x00,0x19, 0x0d,0x00,0x74,0x00,0x54,0x00,0x14,0x00,0x14,0x01,0xe4,0x01,0xd4,0x00,0x14,0x00,0x14, 0x0a,0x00,0x31,0x00,0x21,0x01,0xad,0x00,0xa1, 0x0e,0x00,0x32,0x00,0x40,0x00,0x32,0x00,0x00,0x00,0xb2,0x00,0xb3,0x00,0x00,0x00,0x00, 0x0a,0x00,0x33,0x00,0x23,0x00,0xa3,0x01,0xba, 0x0a,0x00,0x34,0x00,0x24,0x00,0xa2,0x00,0xa8, 0x0e,0x00,0x36,0x00,0x5e,0x00,0x36,0x00,0x1e,0x00,0xb6,0x00,0xc3,0x00,0x1e,0x00,0x1e, 0x0a,0x00,0x35,0x00,0x25,0x01,0xa5,0x00,0xbd, 0x0a,0x00,0x3d,0x00,0x2b,0x01,0xb9,0x01,0xb1, 0x0a,0x00,0x39,0x00,0x28,0x00,0xac,0x00,0xab, 0x0a,0x00,0x37,0x00,0x26,0x01,0xb0,0x01,0xab, 0x0e,0x00,0x2d,0x00,0x5f,0x00,0x1f,0x00,0x1f,0x00,0xb1,0x00,0xd0,0x00,0x1f,0x00,0x1f, 0x0a,0x00,0x38,0x00,0x2a,0x00,0xb7,0x00,0xb4, 0x0a,0x00,0x30,0x00,0x29,0x00,0xad,0x00,0xbb, 0x0e,0x00,0x5d,0x00,0x7d,0x00,0x1d,0x00,0x1d,0x00,0x27,0x00,0xba,0x00,0x1d,0x00,0x1d, 0x0d,0x00,0x6f,0x00,0x4f,0x00,0x0f,0x00,0x0f,0x00,0xf9,0x00,0xe9,0x00,0x0f,0x00,0x0f, 0x0d,0x00,0x75,0x00,0x55,0x00,0x15,0x00,0x15,0x00,0xc8,0x00,0xcd,0x00,0x15,0x00,0x15, 0x0e,0x00,0x5b,0x00,0x7b,0x00,0x1b,0x00,0x1b,0x00,0x60,0x00,0xaa,0x00,0x1b,0x00,0x1b, 0x0d,0x00,0x69,0x00,0x49,0x00,0x09,0x00,0x09,0x00,0xc1,0x00,0xf5,0x00,0x09,0x00,0x09, 0x0d,0x00,0x70,0x00,0x50,0x00,0x10,0x00,0x10,0x01,0x70,0x01,0x50,0x00,0x10,0x00,0x10, 0x10,0x00,0x0d,0x00,0x03, 0x0d,0x00,0x6c,0x00,0x4c,0x00,0x0c,0x00,0x0c,0x00,0xf8,0x00,0xe8,0x00,0x0c,0x00,0x0c, 0x0d,0x00,0x6a,0x00,0x4a,0x00,0x0a,0x00,0x0a,0x00,0xc6,0x00,0xae,0x00,0x0a,0x00,0x0a, 0x0a,0x00,0x27,0x00,0x22,0x00,0xa9,0x01,0xae, 0x0d,0x00,0x6b,0x00,0x4b,0x00,0x0b,0x00,0x0b,0x00,0xce,0x00,0xaf,0x00,0x0b,0x00,0x0b, 0x0a,0x00,0x3b,0x00,0x3a,0x01,0xb2,0x01,0xa2, 0x0e,0x00,0x5c,0x00,0x7c,0x00,0x1c,0x00,0x1c,0x00,0xe3,0x00,0xeb,0x00,0x1c,0x00,0x1c, 0x0a,0x00,0x2c,0x00,0x3c,0x00,0xcb,0x01,0xa3, 0x0a,0x00,0x2f,0x00,0x3f,0x01,0xb8,0x00,0xbf, 0x0d,0x00,0x6e,0x00,0x4e,0x00,0x0e,0x00,0x0e,0x00,0xc4,0x01,0xaf,0x00,0x0e,0x00,0x0e, 0x0d,0x00,0x6d,0x00,0x4d,0x00,0x0d,0x00,0x0d,0x01,0x6d,0x01,0xd8,0x00,0x0d,0x00,0x0d, 0x0a,0x00,0x2e,0x00,0x3e,0x00,0xbc,0x01,0xb3, 0x02,0x00,0x09,0x00,0x19, 0x0c,0x00,0x20,0x00,0x00,0x00,0x80,0x00,0x00, 0x0a,0x00,0x60,0x00,0x7e,0x00,0x60,0x01,0xbb, 0x02,0x00,0x7f,0x00,0x08, 0xff, 0x02,0x00,0x1b,0x00,0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,0xfe,0x36, 0x00,0x00,0x2e, 0xff, 0x00,0x00,0x2a, 0xff, 0x00,0x00,0x2b, 0xff, 0x00,0x00,0x1b, 0xff, 0xff, 0xff, 0x0e,0x00,0x2f,0x00,0x5c,0x00,0x2f,0x00,0x1c,0x00,0x2f,0x00,0x5c,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0d, 0xff, 0x00,0x00,0x2d, 0x00,0xfe,0x37, 0x00,0xfe,0x38, 0x0e,0x00,0x3d,0x00,0x7c,0x00,0x3d,0x00,0x1c,0x00,0x3d,0x00,0x7c,0x00,0x00,0x18,0x46, 0x00,0x00,0x30, 0x00,0x00,0x31, 0x00,0x00,0x32, 0x00,0x00,0x33, 0x00,0x00,0x34, 0x00,0x00,0x35, 0x00,0x00,0x36, 0x00,0x00,0x37, 0x00,0xfe,0x39, 0x00,0x00,0x38, 0x00,0x00,0x39, 0xff, 0xff, 0xff, 0x00,0xfe,0x24, 0x00,0xfe,0x25, 0x00,0xfe,0x26, 0x00,0xfe,0x22, 0x00,0xfe,0x27, 0x00,0xfe,0x28, 0xff, 0x00,0xfe,0x2a, 0xff, 0x00,0xfe,0x32, 0x00,0xfe,0x35, 0x00,0xfe,0x33, 0xff, 0x00,0xfe,0x29, 0xff, 0x00,0xfe,0x2b, 0xff, 0x00,0xfe,0x34, 0xff, 0x00,0xfe,0x2e, 0x00,0xfe,0x30, 0x00,0xfe,0x2d, 0x00,0xfe,0x23, 0x00,0xfe,0x2f, 0x00,0xfe,0x21, 0x00,0xfe,0x31, 0x00,0xfe,0x20, 0x00,0x01,0xac, 0x00,0x01,0xae, 0x00,0x01,0xaf, 0x00,0x01,0xad,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00, 0x00,0x00,0x00,
0x0f,0x02,0xff,0x04,
0x00,0x31,0x02,0xff,0x04,0x00,0x32,0x02,0xff,0x04,0x00,0x33,0x02,0xff,0x04,0x00,
0x34,0x02,0xff,0x04,0x00,0x35,0x02,0xff,0x04,0x00,0x36,0x02,0xff,0x04,0x00,0x37,
0x02,0xff,0x04,0x00,0x38,0x02,0xff,0x04,0x00,0x39,0x02,0xff,0x04,0x00,0x30,0x02,
0xff,0x04,0x00,0x2d,0x02,0xff,0x04,0x00,0x3d,0x02,0xff,0x04,0x00,0x70,0x02,0xff,
0x04,0x00,0x5d,0x02,0xff,0x04,0x00,0x5b,
0x07, 0x04,0x39, 0x05,0x72, 0x06,0x7f, 0x07,0x4a, 0x00,0x48, 0x01,0x49, 0x0a,0x47 };
*length = sizeof(appleUSAFKeyMap);
return appleUSAFKeyMap;
}
static const unsigned char appleUSAKeyMap[] = {
0x00,0x00,
0x0a, 0x01,0x01,0x38,
0x02,0x01,0x3b,
0x03,0x01,0x3a,
0x04,0x01,0x37,
0x05,0x15,0x52,0x41,0x4c,0x53,0x54,0x55,0x45,0x58,0x57,0x56,0x5b,0x5c,
0x43,0x4b,0x51,0x7b,0x7d,0x7e,0x7c,0x4e,0x59,
0x06,0x01,0x72,
0x09,0x01,0x3c, 0x0a,0x01,0x3e, 0x0b,0x01,0x3d, 0x0c,0x01,0x36,
0xa2,
0x0d,0x00,0x61,0x00,0x41,0x00,0x01,0x00,0x01,0x00,0xca,0x00,0xc7,0x00,0x01,0x00,0x01, 0x0d,0x00,0x73,0x00,0x53,0x00,0x13,0x00,0x13,0x00,0xfb,0x00,0xa7,0x00,0x13,0x00,0x13, 0x0d,0x00,0x64,0x00,0x44,0x00,0x04,0x00,0x04,0x01,0x44,0x01,0xb6,0x00,0x04,0x00,0x04, 0x0d,0x00,0x66,0x00,0x46,0x00,0x06,0x00,0x06,0x00,0xa6,0x01,0xac,0x00,0x06,0x00,0x06, 0x0d,0x00,0x68,0x00,0x48,0x00,0x08,0x00,0x08,0x00,0xe3,0x00,0xeb,0x00,0x00,0x18,0x00, 0x0d,0x00,0x67,0x00,0x47,0x00,0x07,0x00,0x07,0x00,0xf1,0x00,0xe1,0x00,0x07,0x00,0x07, 0x0d,0x00,0x7a,0x00,0x5a,0x00,0x1a,0x00,0x1a,0x00,0xcf,0x01,0x57,0x00,0x1a,0x00,0x1a, 0x0d,0x00,0x78,0x00,0x58,0x00,0x18,0x00,0x18,0x01,0xb4,0x01,0xce,0x00,0x18,0x00,0x18, 0x0d,0x00,0x63,0x00,0x43,0x00,0x03,0x00,0x03,0x01,0xe3,0x01,0xd3,0x00,0x03,0x00,0x03, 0x0d,0x00,0x76,0x00,0x56,0x00,0x16,0x00,0x16,0x01,0xd6,0x01,0xe0,0x00,0x16,0x00,0x16, 0x02,0x00,0x3c,0x00,0x3e, 0x0d,0x00,0x62,0x00,0x42,0x00,0x02,0x00,0x02,0x01,0xe5,0x01,0xf2,0x00,0x02,0x00,0x02, 0x0d,0x00,0x71,0x00,0x51,0x00,0x11,0x00,0x11,0x00,0xfa,0x00,0xea,0x00,0x11,0x00,0x11, 0x0d,0x00,0x77,0x00,0x57,0x00,0x17,0x00,0x17,0x01,0xc8,0x01,0xc7,0x00,0x17,0x00,0x17, 0x0d,0x00,0x65,0x00,0x45,0x00,0x05,0x00,0x05,0x00,0xc2,0x00,0xc5,0x00,0x05,0x00,0x05, 0x0d,0x00,0x72,0x00,0x52,0x00,0x12,0x00,0x12,0x01,0xe2,0x01,0xd2,0x00,0x12,0x00,0x12, 0x0d,0x00,0x79,0x00,0x59,0x00,0x19,0x00,0x19,0x00,0xa5,0x01,0xdb,0x00,0x19,0x00,0x19, 0x0d,0x00,0x74,0x00,0x54,0x00,0x14,0x00,0x14,0x01,0xe4,0x01,0xd4,0x00,0x14,0x00,0x14, 0x0a,0x00,0x31,0x00,0x21,0x01,0xad,0x00,0xa1, 0x0e,0x00,0x32,0x00,0x40,0x00,0x32,0x00,0x00,0x00,0xb2,0x00,0xb3,0x00,0x00,0x00,0x00, 0x0a,0x00,0x33,0x00,0x23,0x00,0xa3,0x01,0xba, 0x0a,0x00,0x34,0x00,0x24,0x00,0xa2,0x00,0xa8, 0x0e,0x00,0x36,0x00,0x5e,0x00,0x36,0x00,0x1e,0x00,0xb6,0x00,0xc3,0x00,0x1e,0x00,0x1e, 0x0a,0x00,0x35,0x00,0x25,0x01,0xa5,0x00,0xbd, 0x0a,0x00,0x3d,0x00,0x2b,0x01,0xb9,0x01,0xb1, 0x0a,0x00,0x39,0x00,0x28,0x00,0xac,0x00,0xab, 0x0a,0x00,0x37,0x00,0x26,0x01,0xb0,0x01,0xab, 0x0e,0x00,0x2d,0x00,0x5f,0x00,0x1f,0x00,0x1f,0x00,0xb1,0x00,0xd0,0x00,0x1f,0x00,0x1f, 0x0a,0x00,0x38,0x00,0x2a,0x00,0xb7,0x00,0xb4, 0x0a,0x00,0x30,0x00,0x29,0x00,0xad,0x00,0xbb, 0x0e,0x00,0x5d,0x00,0x7d,0x00,0x1d,0x00,0x1d,0x00,0x27,0x00,0xba,0x00,0x1d,0x00,0x1d, 0x0d,0x00,0x6f,0x00,0x4f,0x00,0x0f,0x00,0x0f,0x00,0xf9,0x00,0xe9,0x00,0x0f,0x00,0x0f, 0x0d,0x00,0x75,0x00,0x55,0x00,0x15,0x00,0x15,0x00,0xc8,0x00,0xcd,0x00,0x15,0x00,0x15, 0x0e,0x00,0x5b,0x00,0x7b,0x00,0x1b,0x00,0x1b,0x00,0x60,0x00,0xaa,0x00,0x1b,0x00,0x1b, 0x0d,0x00,0x69,0x00,0x49,0x00,0x09,0x00,0x09,0x00,0xc1,0x00,0xf5,0x00,0x09,0x00,0x09, 0x0d,0x00,0x70,0x00,0x50,0x00,0x10,0x00,0x10,0x01,0x70,0x01,0x50,0x00,0x10,0x00,0x10, 0x10,0x00,0x0d,0x00,0x03, 0x0d,0x00,0x6c,0x00,0x4c,0x00,0x0c,0x00,0x0c,0x00,0xf8,0x00,0xe8,0x00,0x0c,0x00,0x0c, 0x0d,0x00,0x6a,0x00,0x4a,0x00,0x0a,0x00,0x0a,0x00,0xc6,0x00,0xae,0x00,0x0a,0x00,0x0a, 0x0a,0x00,0x27,0x00,0x22,0x00,0xa9,0x01,0xae, 0x0d,0x00,0x6b,0x00,0x4b,0x00,0x0b,0x00,0x0b,0x00,0xce,0x00,0xaf,0x00,0x0b,0x00,0x0b, 0x0a,0x00,0x3b,0x00,0x3a,0x01,0xb2,0x01,0xa2, 0x0e,0x00,0x5c,0x00,0x7c,0x00,0x1c,0x00,0x1c,0x00,0xe3,0x00,0xeb,0x00,0x1c,0x00,0x1c, 0x0a,0x00,0x2c,0x00,0x3c,0x00,0xcb,0x01,0xa3, 0x0a,0x00,0x2f,0x00,0x3f,0x01,0xb8,0x00,0xbf, 0x0d,0x00,0x6e,0x00,0x4e,0x00,0x0e,0x00,0x0e,0x00,0xc4,0x01,0xaf,0x00,0x0e,0x00,0x0e, 0x0d,0x00,0x6d,0x00,0x4d,0x00,0x0d,0x00,0x0d,0x01,0x6d,0x01,0xd8,0x00,0x0d,0x00,0x0d, 0x0a,0x00,0x2e,0x00,0x3e,0x00,0xbc,0x01,0xb3, 0x02,0x00,0x09,0x00,0x19, 0x0c,0x00,0x20,0x00,0x00,0x00,0x80,0x00,0x00, 0x0a,0x00,0x60,0x00,0x7e,0x00,0x60,0x01,0xbb, 0x02,0x00,0x7f,0x00,0x08, 0xff, 0x02,0x00,0x1b,0x00,0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,0xfe,0x36, 0x00,0x00,0x2e, 0xff, 0x00,0x00,0x2a, 0xff, 0x00,0x00,0x2b, 0xff, 0x00,0x00,0x1b, 0xff, 0xff, 0xff, 0x0e,0x00,0x2f,0x00,0x5c,0x00,0x2f,0x00,0x1c,0x00,0x2f,0x00,0x5c,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0d, 0xff, 0x00,0x00,0x2d, 0x00,0xfe,0x37, 0x00,0xfe,0x38, 0x0e,0x00,0x3d,0x00,0x7c,0x00,0x3d,0x00,0x1c,0x00,0x3d,0x00,0x7c,0x00,0x00,0x18,0x46, 0x00,0x00,0x30, 0x00,0x00,0x31, 0x00,0x00,0x32, 0x00,0x00,0x33, 0x00,0x00,0x34, 0x00,0x00,0x35, 0x00,0x00,0x36, 0x00,0x00,0x37, 0x00,0xfe,0x39, 0x00,0x00,0x38, 0x00,0x00,0x39, 0xff, 0xff, 0xff, 0x00,0xfe,0x24, 0x00,0xfe,0x25, 0x00,0xfe,0x26, 0x00,0xfe,0x22, 0x00,0xfe,0x27, 0x00,0xfe,0x28, 0xff, 0x00,0xfe,0x2a, 0xff, 0x00,0xfe,0x32, 0x00,0xfe,0x35, 0x00,0xfe,0x33, 0xff, 0x00,0xfe,0x29, 0xff, 0x00,0xfe,0x2b, 0xff, 0x00,0xfe,0x34, 0xff, 0x00,0xfe,0x2e, 0x00,0xfe,0x30, 0x00,0xfe,0x2d, 0x00,0xfe,0x23, 0x00,0xfe,0x2f, 0x00,0xfe,0x21, 0x00,0xfe,0x31, 0x00,0xfe,0x20, 0x00,0x01,0xac, 0x00,0x01,0xae, 0x00,0x01,0xaf, 0x00,0x01,0xad,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0x00,0x00, 0x00,0x00,0x00,
0x0f, 0x02,0xff,0x04,0x00,0x31,
0x02,0xff,0x04,0x00,0x32,
0x02,0xff,0x04,0x00,0x33,
0x02,0xff,0x04,0x00,0x34,
0x02,0xff,0x04,0x00,0x35,
0x02,0xff,0x04,0x00,0x36,
0x02,0xff,0x04,0x00,0x37,
0x02,0xff,0x04,0x00,0x38,
0x02,0xff,0x04,0x00,0x39,
0x02,0xff,0x04,0x00,0x30,
0x02,0xff,0x04,0x00,0x2d,
0x02,0xff,0x04,0x00,0x3d,
0x02,0xff,0x04,0x00,0x70,
0x02,0xff,0x04,0x00,0x5d,
0x02,0xff,0x04,0x00,0x5b,
0x07, 0x04,0x39, 0x05,0x72, 0x06,0x7f, 0x07,0x4a, 0x00,0x48, 0x01,0x49, 0x0a,0x47 };
*length = sizeof(appleUSAKeyMap);
return appleUSAKeyMap;
}
IOReturn IOHIDKeyboard::setParamProperties( OSDictionary * dict )
{
IOHID_DEBUG(kIOHIDDebugCode_KeyboardSetParam, this, dict, dict ? dict->getCount() : 0, 0);
if ( _containsFKey ) {
setProperty(kIOHIDFKeyModeKey, OSDynamicCast(OSNumber, dict->getObject(kIOHIDFKeyModeKey)));
}
if ( _asyncLEDThread ) {
if ( OSDynamicCast(OSBoolean, dict->getObject(kIOHIDResetLEDsKey) ) ) {
_resyncLED = TRUE;
IOHID_DEBUG(kIOHIDDebugCode_KeyboardLEDThreadTrigger, this, _ledState, 2, 0);
thread_call_enter(_asyncLEDThread);
}
}
return super::setParamProperties(dict);
}