160 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
USB NKRO MEMO
 | 
						|
=============
 | 
						|
2010/12/09
 | 
						|
 | 
						|
 | 
						|
References
 | 
						|
----------
 | 
						|
USB - boot mode, NKRO, compatibility, etc...
 | 
						|
    http://geekhack.org/showthread.php?t=13162
 | 
						|
NKey Rollover - Overview, Testing Methodology, and Results
 | 
						|
    http://geekhack.org/showwiki.php?title=NKey+Rollover+-+Overview+Testing+Methodology+and+Results
 | 
						|
dfj's NKRO(2010/06)
 | 
						|
    http://geekhack.org/showpost.php?p=191195&postcount=251
 | 
						|
    http://geekhack.org/showthread.php?p=204389#post204389
 | 
						|
 | 
						|
 | 
						|
Terminology
 | 
						|
---------
 | 
						|
NKRO
 | 
						|
ghost
 | 
						|
matrix
 | 
						|
mechanical with diodes
 | 
						|
membrane
 | 
						|
 | 
						|
 | 
						|
OS Support Status
 | 
						|
-----------------
 | 
						|
USB NKRO is possible *without* a custom driver.
 | 
						|
At least following OS's supports.
 | 
						|
    Windows7 64bit
 | 
						|
    WindowsXP
 | 
						|
    Windows2000 SP4
 | 
						|
    Ubuntu10.4(Linux 2.6)
 | 
						|
    MacOSX(To be tested)
 | 
						|
 | 
						|
 | 
						|
Custom Driver for USB NKRO
 | 
						|
--------------------------
 | 
						|
NOT NEEDED
 | 
						|
at least when using following report formats on Windows, Linux or MacOSX.
 | 
						|
 | 
						|
 | 
						|
USB NKRO methods
 | 
						|
----------------
 | 
						|
1. Virtual keyboards
 | 
						|
    Keyboard can increase its KRO by using virtual keyboards with Standard or Extended report.
 | 
						|
    If the keyboard has 2 virtual keyboard with Standard report(6KRO), it gets 12KRO.
 | 
						|
    Using this method means the keyboard is a composite device.
 | 
						|
 | 
						|
2. Extended report
 | 
						|
    It needs large report size for this method to achieve NKRO.
 | 
						|
    If a keyboard has 101keys, it needs 103byte report. It seems to be inefficient.
 | 
						|
 | 
						|
3. Bitmap report
 | 
						|
    If the keyboard has less than 128keys, 16byte report will be enough for NKRO.
 | 
						|
    The 16byte report seems to be reasonable cost to get NKRO.
 | 
						|
 | 
						|
 | 
						|
Report Format
 | 
						|
-------------
 | 
						|
Other report formats than followings are possible, though these format are typical one.
 | 
						|
 | 
						|
1. Standard             8bytes
 | 
						|
    modifiers(bitmap)       1byte
 | 
						|
    reserved                1byte(not used)
 | 
						|
    keys(array)             1byte*6
 | 
						|
Standard report can send 6keys plus 8modifiers simultaneously.
 | 
						|
Standard report is used by most keyboards in the marketplace.
 | 
						|
Standard report is identical to boot protocol report.
 | 
						|
Standard report is hard to suffer from compatibility problems.
 | 
						|
 | 
						|
2. Extended standard    16,32,64bytes
 | 
						|
    modifiers(bitmap)       1byte
 | 
						|
    reserved                1byte(not used)
 | 
						|
    keys(array)             1byte*(14,32,62)
 | 
						|
Extended report can send N-keys by using N+2bytes.
 | 
						|
Extended report is expected to be compatible with boot protocol.
 | 
						|
 | 
						|
3. Bitmap               16,32,64bytes
 | 
						|
    keys(bitmap)            (16,32)bytes
 | 
						|
Bitmap report can send at most 128keys by 16bytes and 256keys by 32bytes.
 | 
						|
Bitmap report can achieve USB NKRO efficiently in terms of report size.
 | 
						|
Bitmap report needs a deliberation for boot protocol implementation.
 | 
						|
Bitmap report descriptor sample:
 | 
						|
        0x05, 0x01,                     // Usage Page (Generic Desktop),
 | 
						|
        0x09, 0x06,                     // Usage (Keyboard),
 | 
						|
        0xA1, 0x01,                     // Collection (Application),
 | 
						|
        // bitmap of modifiers
 | 
						|
        0x75, 0x01,                     //   Report Size (1),
 | 
						|
        0x95, 0x08,                     //   Report Count (8),
 | 
						|
        0x05, 0x07,                     //   Usage Page (Key Codes),
 | 
						|
        0x19, 0xE0,                     //   Usage Minimum (224),
 | 
						|
        0x29, 0xE7,                     //   Usage Maximum (231),
 | 
						|
        0x15, 0x00,                     //   Logical Minimum (0),
 | 
						|
        0x25, 0x01,                     //   Logical Maximum (1),
 | 
						|
        0x81, 0x02,                     //   Input (Data, Variable, Absolute), ;Modifier byte
 | 
						|
        // LED output report
 | 
						|
        0x95, 0x05,                     //   Report Count (5),
 | 
						|
        0x75, 0x01,                     //   Report Size (1),
 | 
						|
        0x05, 0x08,                     //   Usage Page (LEDs),
 | 
						|
        0x19, 0x01,                     //   Usage Minimum (1),
 | 
						|
        0x29, 0x05,                     //   Usage Maximum (5),
 | 
						|
        0x91, 0x02,                     //   Output (Data, Variable, Absolute),
 | 
						|
        0x95, 0x01,                     //   Report Count (1),
 | 
						|
        0x75, 0x03,                     //   Report Size (3),
 | 
						|
        0x91, 0x03,                     //   Output (Constant),
 | 
						|
        // bitmap of keys
 | 
						|
        0x95, (REPORT_BYTES-1)*8,	//   Report Count (),
 | 
						|
        0x75, 0x01,                     //   Report Size (1),
 | 
						|
        0x15, 0x00,                     //   Logical Minimum (0),
 | 
						|
        0x25, 0x01,                     //   Logical Maximum(1),
 | 
						|
        0x05, 0x07,                     //   Usage Page (Key Codes),
 | 
						|
        0x19, 0x00,                     //   Usage Minimum (0),
 | 
						|
        0x29, (REPORT_BYTES-1)*8-1,	//   Usage Maximum (),
 | 
						|
        0x81, 0x02,                     //   Input (Data, Variable, Absolute),
 | 
						|
        0xc0                            // End Collection
 | 
						|
where REPORT_BYTES is a report size in bytes.
 | 
						|
 | 
						|
 | 
						|
Considerations
 | 
						|
--------------
 | 
						|
Compatibility
 | 
						|
    boot protocol
 | 
						|
    minor/old system
 | 
						|
        Some BIOS doesn't send SET_PROTOCOL request, a keyboard can't switch to boot protocol mode.
 | 
						|
        This may cause a problem on a keyboard which uses other report than Standard.
 | 
						|
Reactivity
 | 
						|
    USB polling time
 | 
						|
    OS/Driver processing time
 | 
						|
 | 
						|
 | 
						|
Windows Problem
 | 
						|
---------------
 | 
						|
1. Windows accepts only 6keys  in case of Standard report.
 | 
						|
        It should be able to send 6keys plus 8modifiers.
 | 
						|
2. Windows accepts only 10keys in case of 16bytes Extended report.
 | 
						|
        It should be able to send 14keys plus 8modifiers.
 | 
						|
3. Windows accepts only 18keys in case of 32bytes Extended report.
 | 
						|
        It should be able to send 30keys plus 8modifiers.
 | 
						|
If keys are pressed in excess of the number, wrong keys are registered on Windows.
 | 
						|
 | 
						|
This problem will be reportedly fixed soon.(2010/12/05)
 | 
						|
    http://forums.anandtech.com/showpost.php?p=30873364&postcount=17
 | 
						|
 | 
						|
 | 
						|
Tools for testing NKRO
 | 
						|
----------------------
 | 
						|
Browser App:
 | 
						|
http://www.microsoft.com/appliedsciences/content/projects/KeyboardGhostingDemo.aspx
 | 
						|
http://random.xem.us/rollover.html
 | 
						|
 | 
						|
Windows:
 | 
						|
AquaKeyTest.exe http://geekhack.org/showthread.php?t=6643
 | 
						|
 | 
						|
Linux:
 | 
						|
xkeycaps
 | 
						|
xev
 | 
						|
showkeys
 | 
						|
 | 
						|
EOF
 |