AppleUSBKeyboard.h [plain text]
#ifndef _IOKIT_APPLEUSBKEYBOARD_H
#define _IOKIT_APPLEUSBKEYBOARD_H
#include <IOKit/IOLib.h>
#include <IOKit/IOService.h>
#include <IOKit/usb/IOUSBBus.h>
#include <IOKit/usb/IOUSBDevice.h>
#include <IOKit/usb/USB.h>
#include <IOKit/hidsystem/IOHIKeyboard.h>
#include <IOKit/IOBufferMemoryDescriptor.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_LOWSPEED_MAXPACKET = 8,
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,
kgestUSBProF16ANSIKbd = 34,
kprodUSBProF16ANSIKbd = 0x20B,
kgestUSBProF16ISOKbd = 35,
kprodUSBProF16ISOKbd = 0x20C,
kgestUSBProF16JISKbd = 36,
kprodUSBProF16JISKbd = 0x20D
};
#define ADB_CONVERTER_LEN 0xff + 1 //length of array def_usb_2_adb_keymap[]
#define kKeyboardRetryCount 3
class AppleUSBKeyboard : public IOHIKeyboard
{
OSDeclareDefaultStructors(AppleUSBKeyboard)
IOUSBInterface * _interface;
IOUSBDevice * _device;
IOUSBPipe * _interruptPipe;
IOBufferMemoryDescriptor * _buffer;
IOCommandGate * _gate;
IOUSBCompletion _completion;
IOUSBDevRequest _request;
UInt32 _retryCount;
UInt32 _outstandingIO;
thread_call_t _deviceDeadCheckThread;
thread_call_t _clearFeatureEndpointHaltThread;
thread_call_t _asyncLEDThread;
UInt16 _maxPacketSize;
UInt8 old_array[kUSB_LOWSPEED_MAXPACKET];
UInt8 usb_2_adb_keymap[ADB_CONVERTER_LEN + 1];
UInt8 _hid_report[8];
UInt8 prev_bytes_read;
UInt8 oldmodifier;
UInt8 _ledState;
bool _prevent_LED_set;
bool _flower_key; bool _control_key; bool _deviceDeadThreadActive;
bool _deviceIsDead;
bool _deviceHasBeenDisconnected;
bool _needToClose;
virtual bool init(OSDictionary *properties);
virtual bool start(IOService * provider);
virtual void stop(IOService * provider);
virtual bool finalize(IOOptionBits options);
virtual IOReturn message( UInt32 type, IOService * provider, void * argument = 0 );
virtual bool willTerminate( IOService * provider, IOOptionBits options );
virtual bool didTerminate( IOService * provider, IOOptionBits options, bool * defer );
#if 0
virtual bool requestTerminate( IOService * provider, IOOptionBits options );
virtual bool terminate( IOOptionBits options = 0 );
virtual void free( void );
virtual bool terminateClient( IOService * client, IOOptionBits options );
#endif
UInt32 interfaceID ( void );
UInt32 deviceType ( void );
UInt32 maxKeyCodes ( void );
const unsigned char * defaultKeymapOfLength (UInt32 * length );
void setAlphaLockFeedback ( bool LED_state);
void setNumLockFeedback ( bool LED_state);
bool doesKeyLock ( unsigned key);
unsigned getLEDStatus (void );
void Simulate_ADB_Event(UInt8 *key_ptr, UInt32 bytes_read);
void Set_LED_States( UInt8);
void Set_Idle_Millisecs(UInt16 msecs);
void Get_LED_States( void);
UInt32 handlerID ( void );
void InterruptReadHandler(IOReturn status, UInt32 bufferSizeRemaining);
void CheckForDeadDevice();
void ClearFeatureEndpointHalt(void);
void DecrementOutstandingIO(void);
void IncrementOutstandingIO(void);
static void AsyncLED (OSObject *target);
static void InterruptReadHandlerEntry(OSObject *target, void *param, IOReturn status, UInt32 bufferSizeRemaining);
static void CheckForDeadDeviceEntry(OSObject *target);
static void ClearFeatureEndpointHaltEntry(OSObject *target);
static IOReturn ChangeOutstandingIO(OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3);
};
#endif _IOKIT_APPLEUSBKEYBOARD_H