#ifndef _IOKIT_HID_IOHIDKEYBOARD_H
#define _IOKIT_HID_IOHIDKEYBOARD_H
#include <IOKit/hidsystem/IOHIDTypes.h>
#include <IOKit/hidsystem/IOHIKeyboard.h>
#include "IOHIDDevice.h"
#include "IOHIDConsumer.h"
enum {
kUSB_LEFT_CONTROL_BIT = 0x01,
kUSB_LEFT_SHIFT_BIT = 0x02,
kUSB_LEFT_ALT_BIT = 0x04,
kUSB_LEFT_FLOWER_BIT = 0x08,
kUSB_RIGHT_CONTROL_BIT = 0x10,
kUSB_RIGHT_SHIFT_BIT = 0x20,
kUSB_RIGHT_ALT_BIT = 0x040,
kUSB_RIGHT_FLOWER_BIT = 0x80
};
enum {
kUSB_CAPSLOCKLED_SET = 2,
kUSB_NUMLOCKLED_SET = 1
};
enum {
kgestUSBCosmoANSIKbd = 198,
kprodUSBCosmoANSIKbd = 0x201, kgestUSBCosmoISOKbd = 199,
kprodUSBCosmoISOKbd = 0x202,
kgestUSBCosmoJISKbd = 200,
kprodUSBCosmoJISKbd = 0x203,
kgestUSBAndyANSIKbd = 204,
kprodUSBAndyANSIKbd = 0x204,
kgestUSBAndyISOKbd = 205,
kprodUSBAndyISOKbd = 0x205,
kgestUSBAndyJISKbd = 206,
kprodUSBAndyJISKbd = 0x206,
kgestQ6ANSIKbd = 31,
kprodQ6ANSIKbd = 0x208,
kgestQ6ISOKbd = 32,
kprodQ6ISOKbd = 0x209,
kgestQ6JISKbd = 33,
kprodQ6JISKbd = 0x20a,
kgestQ30ANSIKbd = 34,
kprodQ30ANSIKbd = 0x20b,
kgestQ30ISOKbd = 35,
kprodQ30ISOKbd = 0x20c,
kgestQ30JISKbd = 36,
kprodQ30JISKbd = 0x20d,
kgestFountainANSIKbd = 37,
kprodFountainANSIKbd = 0x20e,
kgestFountainISOKbd = 38,
kprodFountainISOKbd = 0x20f,
kgestFountainJISKbd = 39,
kprodFountainJISKbd = 0x210,
kgestSantaANSIKbd = 37,
kprodSantaANSIKbd = 0x211,
kgestSantaISOKbd = 38,
kprodSantaISOKbd = 0x212,
kgestSantaJISKbd = 39,
kprodSantaJISKbd = 0x213,
};
enum {
kSecondaryKeyFnSpecial = 0x01,
kSecondaryKeyFnNonSpecial = 0x02,
kSecondaryKeyNumPad = 0x04
};
typedef struct _SecondaryKey {
UInt8 bits;
UInt8 swapping;
UInt8 specialKey;
UInt8 fnUsage;
UInt8 numPadUsage;
} SecondaryKey;
#define ADB_CONVERTER_LEN 0xff + 1 //length of array def_usb_2_adb_keymap[]
class IOHIDKeyboard : public IOHIKeyboard
{
OSDeclareDefaultStructors(IOHIDKeyboard)
IOHIDDevice * _provider;
IOHIDConsumer * _consumer;
IONotifier * _publishNotify;
IORecursiveLock * _keyboardLock;
OSNumber* _productID;
OSNumber* _vendorID;
OSNumber* _locationID;
OSString * _transport;
IOHIDElementCookie _ledCookies[2];
UInt32 * _ledValuePtrs[2];
UInt8 _numLeds;
UInt8 _ledState;
thread_call_t _asyncLEDThread;
UInt32 * _modifierValuePtrs[8];
UInt8 _oldmodifier;
OSArray * _keyCodeArrayValuePtrArray;
UInt32 * _oldArraySelectors;
UInt8 _usb_2_adb_keymap[ADB_CONVERTER_LEN + 1];
UInt32 * _fKeyValuePtr;
UInt32 _lastFKeyValue;
UInt8 _fKeyMode;
bool _stickyKeysOn;
SecondaryKey _secondaryKeys[255];
void Set_LED_States(UInt8);
UInt32 handlerID();
bool determineKeyboard(IOHIDDevice *owner);
bool findDesiredElements(OSArray *elements, IOHIDDevice *owner);
void findSecondaryKeys();
bool filterSecondaryNumPadKey(int * usage, bool down, AbsoluteTime ts);
bool filterSecondaryFnSpecialKey(int * usage, bool down, AbsoluteTime ts);
bool filterSecondaryFnNonSpecialKey(int * usage, bool down, AbsoluteTime ts);
static void _asyncLED (OSObject *target);
static bool _publishNotificationHandler(void * target, void * ref, IOService * newService );
public:
static IOHIDKeyboard * Keyboard(OSArray *elements, IOHIDDevice *owner);
virtual bool init(OSDictionary * properties = 0);
virtual bool start(IOService * provider);
virtual void stop(IOService * provider);
virtual void free();
virtual bool matchPropertyTable(OSDictionary * table, SInt32 * score);
virtual void handleReport();
UInt32 interfaceID();
UInt32 deviceType();
UInt32 maxKeyCodes();
const unsigned char * defaultKeymapOfLength(UInt32 * length);
void setAlphaLockFeedback(bool LED_state);
void setNumLockFeedback(bool LED_state);
unsigned getLEDStatus();
IOReturn setParamProperties( OSDictionary * dict );
};
#endif