]> git.donarmstrong.com Git - tmk_firmware.git/blob - doc/USB_NKRO.txt
Merge branch 'ibm4704'
[tmk_firmware.git] / doc / USB_NKRO.txt
1 USB NKRO MEMO
2 =============
3 2010/12/09
4
5
6 References
7 ----------
8 USB - boot mode, NKRO, compatibility, etc...
9     http://geekhack.org/showthread.php?t=13162
10 NKey Rollover - Overview, Testing Methodology, and Results
11     http://geekhack.org/showwiki.php?title=NKey+Rollover+-+Overview+Testing+Methodology+and+Results
12 dfj's NKRO(2010/06)
13     http://geekhack.org/showpost.php?p=191195&postcount=251
14     http://geekhack.org/showthread.php?p=204389#post204389
15
16
17 Terminology
18 ---------
19 NKRO
20 ghost
21 matrix
22 mechanical with diodes
23 membrane
24
25
26 OS Support Status
27 -----------------
28 USB NKRO is possible *without* a custom driver.
29 At least following OS's supports.
30     Windows7 64bit
31     WindowsXP
32     Windows2000 SP4
33     Ubuntu10.4(Linux 2.6)
34     MacOSX(To be tested)
35
36
37 Custom Driver for USB NKRO
38 --------------------------
39 NOT NEEDED
40 at least when using following report formats on Windows, Linux or MacOSX.
41
42
43 USB NKRO methods
44 ----------------
45 1. Virtual keyboards
46     Keyboard can increase its KRO by using virtual keyboards with Standard or Extended report.
47     If the keyboard has 2 virtual keyboard with Standard report(6KRO), it gets 12KRO.
48     Using this method means the keyboard is a composite device.
49
50 2. Extended report
51     It needs large report size for this method to achieve NKRO.
52     If a keyboard has 101keys, it needs 103byte report. It seems to be inefficient.
53
54 3. Bitmap report
55     If the keyboard has less than 128keys, 16byte report will be enough for NKRO.
56     The 16byte report seems to be reasonable cost to get NKRO.
57
58
59 Report Format
60 -------------
61 Other report formats than followings are possible, though these format are typical one.
62
63 1. Standard             8bytes
64     modifiers(bitmap)       1byte
65     reserved                1byte(not used)
66     keys(array)             1byte*6
67 Standard report can send 6keys plus 8modifiers simultaneously.
68 Standard report is used by most keyboards in the marketplace.
69 Standard report is identical to boot protocol report.
70 Standard report is hard to suffer from compatibility problems.
71
72 2. Extended standard    16,32,64bytes
73     modifiers(bitmap)       1byte
74     reserved                1byte(not used)
75     keys(array)             1byte*(14,32,62)
76 Extended report can send N-keys by using N+2bytes.
77 Extended report is expected to be compatible with boot protocol.
78
79 3. Bitmap               16,32,64bytes
80     keys(bitmap)            (16,32)bytes
81 Bitmap report can send at most 128keys by 16bytes and 256keys by 32bytes.
82 Bitmap report can achieve USB NKRO efficiently in terms of report size.
83 Bitmap report needs a deliberation for boot protocol implementation.
84 Bitmap report descriptor sample:
85         0x05, 0x01,                     // Usage Page (Generic Desktop),
86         0x09, 0x06,                     // Usage (Keyboard),
87         0xA1, 0x01,                     // Collection (Application),
88         // bitmap of modifiers
89         0x75, 0x01,                     //   Report Size (1),
90         0x95, 0x08,                     //   Report Count (8),
91         0x05, 0x07,                     //   Usage Page (Key Codes),
92         0x19, 0xE0,                     //   Usage Minimum (224),
93         0x29, 0xE7,                     //   Usage Maximum (231),
94         0x15, 0x00,                     //   Logical Minimum (0),
95         0x25, 0x01,                     //   Logical Maximum (1),
96         0x81, 0x02,                     //   Input (Data, Variable, Absolute), ;Modifier byte
97         // LED output report
98         0x95, 0x05,                     //   Report Count (5),
99         0x75, 0x01,                     //   Report Size (1),
100         0x05, 0x08,                     //   Usage Page (LEDs),
101         0x19, 0x01,                     //   Usage Minimum (1),
102         0x29, 0x05,                     //   Usage Maximum (5),
103         0x91, 0x02,                     //   Output (Data, Variable, Absolute),
104         0x95, 0x01,                     //   Report Count (1),
105         0x75, 0x03,                     //   Report Size (3),
106         0x91, 0x03,                     //   Output (Constant),
107         // bitmap of keys
108         0x95, (REPORT_BYTES-1)*8,       //   Report Count (),
109         0x75, 0x01,                     //   Report Size (1),
110         0x15, 0x00,                     //   Logical Minimum (0),
111         0x25, 0x01,                     //   Logical Maximum(1),
112         0x05, 0x07,                     //   Usage Page (Key Codes),
113         0x19, 0x00,                     //   Usage Minimum (0),
114         0x29, (REPORT_BYTES-1)*8-1,     //   Usage Maximum (),
115         0x81, 0x02,                     //   Input (Data, Variable, Absolute),
116         0xc0                            // End Collection
117 where REPORT_BYTES is a report size in bytes.
118
119
120 Considerations
121 --------------
122 Compatibility
123     boot protocol
124     minor/old system
125         Some BIOS doesn't send SET_PROTOCOL request, a keyboard can't switch to boot protocol mode.
126         This may cause a problem on a keyboard which uses other report than Standard.
127 Reactivity
128     USB polling time
129     OS/Driver processing time
130
131
132 Windows Problem
133 ---------------
134 1. Windows accepts only 6keys  in case of Standard report.
135         It should be able to send 6keys plus 8modifiers.
136 2. Windows accepts only 10keys in case of 16bytes Extended report.
137         It should be able to send 14keys plus 8modifiers.
138 3. Windows accepts only 18keys in case of 32bytes Extended report.
139         It should be able to send 30keys plus 8modifiers.
140 If keys are pressed in excess of the number, wrong keys are registered on Windows.
141
142 This problem will be reportedly fixed soon.(2010/12/05)
143     http://forums.anandtech.com/showpost.php?p=30873364&postcount=17
144
145
146 Tools for testing NKRO
147 ----------------------
148 Browser App:
149 http://www.microsoft.com/appliedsciences/content/projects/KeyboardGhostingDemo.aspx
150 http://random.xem.us/rollover.html
151
152 Windows:
153 AquaKeyTest.exe http://geekhack.org/showthread.php?t=6643
154
155 Linux:
156 xkeycaps
157 xev
158 showkeys
159
160 EOF