X-keys XK-16 LCD Data Report

General Information

VID
05f3h or 1523
XK-16 LCD PID #1 (Factory Default)
0524h or 1316
XK-16 LCD PID #2
0525h or 1317
XK-16 LCD PID #3
0526h or 1318
XK-16 LCD PID #4
0527h or 1319
XK-16 LCD PID #5
0528h or 1320
XK-16 LCD PID #6
0529h or 1321
XK-16 LCD PID #7
052Ah or 1322
XK-16 LCD PID #8 (KVM)
052Bh or 1323
Consumer Usage Page
1
Usage Page
000Ch or 12

*Available only on firmware version 30 or higher.

PID #1 Endpoints: Consumer Usage Page Input and Output (Hid Usage Page 12, Hid Usage 1), Keyboard (Hid Usage Page 1, Hid Usage 6), Multimedia (Hid Usage Page 12, Hid Usage 1 and Hid Usage Page 1, Hid Usage 128).
PID #2 Endpoints: Consumer Usage Page Input and Output (Hid Usage Page 12, Hid Usage 1), Keyboard boot (Hid Usage Page 1, Hid Usage 6), Multimedia (Hid Usage Page 12 and 1, Hid Usage 1 and 128).
PID #3 Endpoints: Consumer Usge Page Input and Output (Hid Usage Page 12, Hid Usage 1), Keyboard (Hid Usage Page 1, Hid Usage 6), Joystick (Hid Usage Page 1, Hid Usage 4).
PID #4 Endpoints: Consumer Usge Page Input and Output (Hid Usage Page 12, Hid Usage 1), Joystick (Hid Usage Page 1, Hid Usage 4), Mouse (Hid Usage Page 1, Hid Usage 2).
PID #5 Endpoints: Consumer Usge Page Input and Output (Hid Usage Page 12, Hid Usage 1), Keyboard boot (Hid Usage Page 1, Hid Usage 6), Mouse (Hid Usage Page 1, Hid Usage 2).
PID #6 Endpoints: Consumer Usge Page Input and Output (Hid Usage Page 12, Hid Usage 1).
PID #7 Endpoints: Consumer Usge Page Input and Output (Hid Usage Page 12, Hid Usage 1), Keyboard (Hid Usage Page 1, Hid Usage 6), Mouse (Hid Usage Page 1, Hid Usage 2), Multimedia (Hid Usage Page 12 and 1, Hid Usage 1 and 128), Joystick (Hid Usage Page 1, Hid Usage 4).
PID #8 Endpoints: Keyboard boot (Hid Usage Page 1, Hid Usage 6) for use with KVMs.

XK-16 LCD is supported by P.I. Engineering Macroworks 3.1 and X-keys Basic Setup for PC users , P.I. Engineering SDK samples for Microsoft C# Express, VB Express, Microsoft C++ 2010 and Linux.

X-keys XK-16 LCD Input Report

X-keys XK-16 LCD

Figure 1: X-keys XK-16 LCD key reference.

Report Length: 37 bytes.

1. General Incoming Data

This data is returned when new data is detected such as button presses, unit id change. This report can be manually stimulated by sending a Generate Data output report which is very useful for obtaining the initial state of the device immediately after enumeration.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
Byte 8
Byte 9-32
Bytes 33-36
Byte 37
Constant Unit ID Data Type Keys Keys Keys Keys NumLck, CapsLck, ScrLck Reserved Time Stamp Reserved
0
<data>
PS
D1
D2
D3
D4
DS
value
Time
value

PS: Program Switch, 0 if unset 1 if set.
D1: For all bits 0 for key up, 1 for key down.  Bit 1=Key 1, bit 2=Key 2, bit 3=Key 3, bit 4=Key 4, bits 5-8=0 always.
D2: For all bits 0 for key up, 1 for key down.  Bit 1=Key 5, bit 2=Key 6, bit 3=Key 7, bit 4=Key 8, bits 5-8=0 always.
D3: For all bits 0 for key up, 1 for key down.  Bit 1=Key 9, Bit 2=Key 10, bit 3=Key 11, bit 4=Key 12, bits 5-8=0 always.
D4: For all bits 0 for key up, 1 for key down.  Bit 1=Key 13, Bit 2=Key 14, bit 3=Key 15, bit 4=Key 16, bits 5-8=0 always.
DS: Bit 1=NumLock, bit 2=CapsLock, bit 3=ScrLock, bit 4=On Boot (sets the bit when device is booted up by the usb then sets it back to 0), bit 5=Program Switch (save state as PS).
Time: If enabled using Enable Time Stamp output report gives a time in ms starting from when the device was plugged into a port in 4 bytes where byte 8 is the MSB and byte 11 is the LSB.

2. Descriptor Data

This data is returned after a Request for Descriptor output report is sent. This report is available only in PID #1 and PID #3.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
Byte 8
Byte 9
Byte 10
Byte 11
Byte 12
Byte 13
Byte 14
Bytes 15-33
Constant Unit ID Data Type Mode Key mapstart Layer2 Offset Size of EEPROM LSB Size of EEPROM MSB Max Columns Max Rows LED State Version PID Low PID Hi Reserved
0
<data>
214
Mode
48
128
<data>
<data>
4
6
LEDs
<data>
PIDL
PIDH
value

Mode: 0 means device is in PID #3, 2=PID #1, 1=PID #2, 3=PID #4.
LEDs: Bit 7=1 for Green LED on, 0 for Green LED off, bit 8=1 for Red LED on, bit 8=0 for Red LED off.
PIDL: LSB of the Product Identification number or PID.
PIDH: MSB of the Product Identification number or PID.

3. Custom Data

This data is returned after an output report: Generate Custom Data is sent. This report is available only in PID #1 and PID #3.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
Bytes Count+5 to 36
Byte 37
Constant Unit ID Data Type Count of custom bytes to follow Custom byte 1 Custom byte 2 Custom byte 3... Reserved Increment
0
<data>
224
Count
B1
B2
B3...
value
Increment

Count: Number of custom bytes to follow.
B1: 1st custom byte.
B2: 2nd custom byte.
B3: 3rd custom byte and so on for as many bytes as specified in Count.
Increment: This byte is incremented each time a Custom Data report is sent thus even if 2 identical reports are sent they will both come in even if SuppressDuplicate reports is on.

4. Check Dongle Key

This is received immediately following a Check Dongle Key output report is sent. The four values R0-R3 are required to continue the check. See Dongle Implementation for further details.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
Bytes 8 to 36
Constant Unit ID Data Type 1st byte returned from hash 2nd byte returned from hash 3rd byte returned from hash 4th byte returned from hash Reserved
0
<data>
193
R0
R1
R2
R3
value

R0: Value need for comparison to check for correct dongle key.
R1: Value need for comparison to check for correct dongle key.
R2: Value need for comparison to check for correct dongle key.
R3: Value need for comparison to check for correct dongle key.

X-keys XK-16 LCD Output Report

The following types of output reports are shown in the summary below. Please be aware that several of these commands result in writing to the device's eeprom which has a limit to the number of writes allowed before it is "burnt out". The manufacturer's specification is 50,000 eeprom writes. Because of this we recommend the commands designated with e be executed rarely and not within timing loops. Note, the first byte listed in this documentation is 0 and represents the report ID. This is not present on some non-PC operating systems. So when sending an output report on Android for example, eliminate this byte.

Report
Format
Description
1
0, 186, LEDs, 0... Set LEDs
2
0, 179, LEDIndex, State, 0... Index Based Set LED (Flash)
3
0, 189, UnitID, 0... Set Unit IDe
4
0, 214, 0... Request Descriptor
5
0, 210, Enable, 0... Enable Time Stamp
6
0, 177, 0... Generate Data
7
0, 187, Bank 1 Intensity, Bank 2 Intensity, 0... Set Backlight Intensity
8
0, 184, 0... Toggle Backlights
9
0, 183, ScrLk, 0... Enable Scroll Lock to Toggle Backlights
10
0, 182, Bank, OnOff, 0... Turn On/Off Rows of Backlights
11
0, 181, Index, State, 0... Index Based Set Backlights (Flash)
12
0, 180, Freq, 0... Set Frequency of Flash
13
0, 199, Save, 0... Save Backlight State to EEPROMe
14
0, 204, Mode, 0... Change PIDe
15
0, 196, Change, 0... Reboot Mode
16
0, 201, Modifier, 0, HC1, HC2, HC3, HC4, HC5, HC6, 0... Keyboard Reflector*
17
0, 203, Buttons, Mouse X, Mouse Y, Wheel X, Wheel Y, 0... Mouse Reflector**
18
0, 202, Joystick X, Joystick Y, Joystick Z rot., Joystick Z, Joystick Slider, Game Buttons 1, Game Buttons 2, Game Buttons 3, Game Buttons 4, 0, Point of View Hat, 0... Joystick Reflector***
19
0, 225, Usage ID LSB, Usage ID MSB, 0... Multimedia Reflector****
20
0, 224, Count, B1, B2, B3..., 0... Generate Custom Data
21
0, 195, Version LSB, Version MSB, 0... Set Version Numbere
22
0, 238, 0... Reboot Device
23
0, 192, K0, K1, K2, K3, 0... Set Dongle Keye
24
0, 193, N0, N1, N2, N3, 0... Check Dongle Key

eCommand writes to EEPROM, do not perform this command excessively, do not exceed 50,000 writes to EEPROM.
*Available only on PIDs with keyboard endpoint.
**Available only on PIDs with mouse endpoint.
***Available only on PIDs with joystick endpoint.
****Available only on PIDs with multimedia endpoint.

Endpoint: 4, Vendor Defined Usage Page.

Report Length: 36 bytes.

1. Set LEDs

One of two methods for controlling the LEDs.

Byte 1*
Byte 2
Byte 3
Bytes 4-36
Constant Command LED Control Constant
0
186
LEDs
0

LEDs: Bits 1-6=0, bit 7=1 to turn on Green LED or 0 to turn off Green LED, bit 8=1 to turn on Red LED or 0 to turn off Red LED.

2. Index Based Set LED (Flash)

One of two methods for controlling the LEDs. If flashing of LEDs is desired this method must be used.

Byte 1*
Byte 2
Byte 3
Byte 4
Bytes 5-36
Constant Command LED Index LED State Constant
0
179
LEDIndex
LEDState
0

LEDIndex: 6 = green, 7 = red.
LEDState: 0 = off, 1 = on and 2 = flash. Set the frequency of the flash with output report 12. Set Frequency of Flash.

3. Set Unit ID

Send this output report to set the Unit ID of the device. This is useful if connecting more than one of the same device to the a computer.

Byte 1*
Byte 2
Byte 3
Bytes 4-36
Constant Command Unit ID (0-255) Constant
0
189
value
0

4. Request Descriptor

After sending this output report a Descriptor input report will be generated.

Byte 1*
Byte 2
Bytes 3-36
Constant Command Constant
0
214
0

5. Enable Time Stamp

By default the Time Stamp feature is enabled. To turn off send this command with Byte 3=0.

Byte 1*
Byte 2
Byte 3
Bytes 4-36
Constant Command Enable Constant
0
210
0=off, 1=on
0

6. Generate Data

After sending this output report a General Incoming Data input report will be generated with bit 2 of PS set. This is useful in determining the initial state of the device before any data has changed.

Byte 1*
Byte 2
Bytes 3-36
Constant Command Constant
0
177
0

7. Set Backlight Intensity

Byte 1*
Byte 2
Byte 3
Byte 4
Bytes 5-36
Constant Command Bank 1 Intensity Bank 2 Intensity Constant
0
187
Intensity
Intensity
0

Intensity: 0-255 where 0 is no intensity for that color or off, and 255 is the brightest.

8. Toggle Backlights

Byte 1*
Byte 2
Bytes 3-36
Constant Command Constant
0
184
0

9. Enable Scroll Lock to Enable Backlights

Send this output report with ScrLk=128 to enable the standard keyboard's ScrLk key to toggle the backlights.

Byte 1*
Byte 2
Byte 3
Bytes 4-36
Constant Command Save Constant
0
183
ScrLk
0

ScrLk: 0 to disable Scroll Lock, 128 to enable Scroll Lock to toggle backlighting.

10. Turn On/Off Rows of Backlights

Send this output report to either turn on or off rows of the backlights.

Byte 1*
Byte 2
Byte 3
Byte 4
Bytes 5-36
Constant Command Bank # State Constant
0
182
Bank
OnOff
0

Bank: 0 = bank 1, 1 = bank 2.
OnOff: For all bits 0 for no backlighting, 1 for backlighting. Bit 0 = 1st row, bit 1=2nd row, bit 2=3rd row, bit 3=4th row, bit 4=5th row, bit 5=6th row. Note the intensities are not affected by this command.

11. Index Based Set Backlights (Flash)

Control of individual backlights.

Byte 1*
Byte 2
Byte 3
Byte 4
Bytes 5-36
Constant Command Key Index State Constant
0
181
Index
State
0

Index: For bank 1 equals the index given in Figure 1 MINUS 1 (0 based index). For bank 2 add 16 to the index. For example Index = 0 is the top leftmost blue LED, Index = 16 is the top leftmost red LED.
State: 0 = off, 1 = on and 2 = flash. Set the frequency of the flash with output report 12. Set Frequency of Flash.

12. Set Frequency of Flash

Use this output report to control the frequency of the flashing of both the indicator LEDs and the backlights, same frequency is used for both.

Byte 1*
Byte 2
Byte 3
Bytes 4-36
Constant Command Frequency Constant
0
180
Freq
0

Freq: 1-255 where 1 is the fastest flash and 255 is the slowest. 255 is approximately 4 seconds between flashes.

13. Save Backlight State to EEPROM

Send this output report to change the default backlighting on startup of device to the current backlight state, ie, what ever backlights are on or off at the time this report is sent will be the new default.

Byte 1*
Byte 2
Byte 3
Bytes 4-36
Constant Command Save Constant
0
199
Save
0

Save: Any value other than 0 will save the current backlight state to the EEPROM so when the device is replugged it will display this save backlighting. Note because there is a limited number of times the EEProm can be written to, it is not a good idea to do this often.

14. Change PID

Send this output report to change between the 8 PIDs.

Byte 1*
Byte 2
Byte 3
Bytes 4-36
Constant Command Mode Constant
0
204
Mode
0

Mode: 0 for PID #1, 1 for PID #2, 2 for PID #3 and 3 for PID #4, 4for PID #5, 5 for PID #6, 6 for PID #7, and 7 for PID #8 (KVM). Note if change to PID #8 (KVM) input and output reports will not be available. To convert back to PID #1 from PID #8 hold down the programming switch while plugging the device in. Use the Reboot Mode command to either have the unit always revert to PID #8 (KVM) on reboot or not.

15. Reboot Mode

Send this output report to determine if the device will automatically return to PID #8 (KVM) on each reboot or if it will remain in the current PID between reboots. Only for use with Pid #8 (KVM).

Byte 1*
Byte 2
Byte 3
Bytes 4-36
Constant Command Change Constant
0
196
Change
0

Change: Enter 0 to have the device not return to PID #8 (KVM) on reboot and 7 to have it always return to PID #8 (KVM) on reboot.

To setup a device for KVM use first program the hardware keyboard macros into it using either P.I. Engineering Macroworks 3.1 or X-keys Basic Setup while it is in the factory default PID #1. Test the macros to make sure they are as desired. After programming send the Reboot Mode command with Change=7, then either reboot device or send the Change PID command with Mode=7.

To return a device previously setup for KVM use press and hold the programming switch at the top of the device while plugging in the device. The device will return to the factory default PID #1. Now it is important to send the Reboot Mode command with Change=0. The device will now be back to factory default. User may or may not wish to clear the hardware keyboard macros at this point.

To modify the hardware macros on a device setup for KVM use, press and hold the program switch at the top of the device while plugging in the device. The device will be return to the factory default PID #1. Make the desired macro modifications using either P.I. Engineering Macroworks 3.1 or X-keys Basic Setup. Replug the device and it will be in the KVM mode again.

16. Keyboard Reflector

Sends native keyboard messages, must have keyboard endpoint to work properly.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
Byte 8
Byte 9
Byte 10
Bytes 11-36
Constant Command Modifier Constant Hid Code 1 Hid Code 2 Hid Code 3 Hid Code 4 Hid Code 5 Hid Code 6 Constant
0
201
Modifier
0
HC1
HC2
HC3
HC4
HC5
HC6
0

Modifier: Bit 1=Left Ctrl, bit 2=Left Shift, bit 3=Left Alt, bit 4=Left Gui, bit 5=Right Ctrl, bit 6=Right Shift, bit 7=Right Alt, bit 8=Right Gui.
HC1=Hid Code for 1st key down, or 0 to release previous key press in this byte position.
HC2=Hid Code for 2nd key down, or 0 to release previous key press in this byte position.
HC3=Hid Code for 3rd key down, or 0 to release previous key press in this byte position.
HC4=Hid Code for 4th key down, or 0 to release previous key press in this byte position.
HC5=Hid Code for 5th key down, or 0 to release previous key press in this byte position.
HC6=Hid Code for 6th key down, or 0 to release previous key press in this byte position.

17. Mouse Reflector

Sends native mouse messages, must have a mouse endpoint to work properly.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
Bytes 8-36
Constant Command Buttons Mouse X Mouse Y Wheel X Wheel Y Constant
0
203
Buttons
X
Y
WX
WY
0

Buttons: Bit 1=Left, bit 2=Right, bit 3=Center, bit 4=XButton1, bit 5=XButton2.
X=Mouse X motion. 128=0 no motion, 1-127 is right, 255-129=left, finest inc (1 and 255) to coarsest (127 and 129).
Y=Mouse Y motion. 128=0 no motion, 1-127 is down, 255-129=up, finest inc (1 and 255) to coarsest (127 and 129).
WX=Wheel X. 128=0 no motion, 1-127 is up, 255-129=down, finest inc (1 and 255) to coarsest (127 and 129).
WY=Wheel Y. 128=0 no motion, 1-127 is up, 255-129=down, finest inc (1 and 255) to coarsest (127 and 129).

18. Joystick Reflector

Sends native joystick messages, must have a joystick endpoint to work properly.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
Byte 8
Byte 9
Byte 10
Byte 11
Byte 12
Byte 13
Bytes 14-36
Constant Command Joystick X Joystick Y Joystick Z rot. Joystick Z Joystick Slider Game Buttons Game Buttons Game Buttons Game Buttons Constant Point of View Hat Constant
0
202
X
Y
Z rot.
Z
Slider
GB1
GB2
GB3
GB4
0
Hat
0

X: Joystick X, 0-127 is from center to full right, 255-128 is from center to full left.
Y: Joystick Y, 0-127 is from center to bottom, 255-128 is from center to top.
Z rot.: Joystick Z rot., 0-127 is from center to bottom, 255-128 is from center to top.
Z.: Joystick Z, 0-127 is from center to bottom, 255-128 is from center to top.
Slider: Joystick Slider, 0-127 is from center to bottom, 255-128 is from center to top.
GB1: Game buttons 1-8, bit 1= game button 1, bit 2=game button 2, etc.
GB2: Game buttons 9-16, bit 1= game button 9, bit 2=game button 10, etc.
GB3: Game buttons 17-24, bit 1= game button 17, bit 2=game button 18, etc.
GB4: Game buttons 25-32, bit 1= game button 25, bit 2=game button 26, etc.
Hat: 0 to 7 clockwise, 8 is no hat.

19. Multimedia Reflector

Sends 2 byte multimedia messages, must have a multimedia endpoint to work properly. This command must be followed with an "up" command with ULo and UHi =0.

Byte 1*
Byte 2
Byte 3
Byte 4
Bytes 8-36
Constant Command Usage ID Lo Usage ID Hi Constant
0
225
ULo
UHi
0

ULo=Usage ID low byte see hut1_12.pdf, pages 75-85 Consumer Page.
UHi=Usage ID high byte see hut1_12.pdf, pages 75-85 Consumer Page.

Example: My Computer - 0, 225, 94, 01, 0... and send report using WriteData. Then 0, 225, 0, 0, 0... and send report using WriteData. In this example 0194 is the Usage ID for My Computer.

20. Generate Custom Data

After sending this output report a Custom Data input report will be generated with Byte 3 set to 224 and the count and custom bytes following.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6...
Bytes (Count+4) to 36
Constant Command Count of custom bytes to follow Custom byte 1 Custom byte 2 Custom byte 3... Constant
0
224
Count
B1
B2
B3...
0

Count: Number of custom bytes to follow.
B1: 1st custom byte.
B2: 2nd custom byte.
B3: 3rd custom byte and so on for as many bytes as specified in Count.


21. Set Version Number

Send this output report to set the Version of the device. This is not the firmware version given in the descriptor but a 2 byte number available on enumeration. The value is "remembered" so if it is changed, using this report, the device must be rebooted. The device can be rebooted by replugging it or by sending the output report : Reboot Device. The device is also rebooted when changing pids using output report: Change PID.

Byte 1*
Byte 2
Byte 3
Byte 4
Bytes 5-36
Constant Command Version LB (0-255) Version HB (0-255) Constant
0
195
value
value
0

22. Reboot Device

Send this output report to reboot the device without having to unplug it. After sending this report the device must be re-enumerated.

Byte 1*
Byte 2
Bytes 3-36
Constant Command Constant
0
238
0

23. Set Dongle Key

Sets the user entered key. Remember these numbers as they are required to check for the key. This is intented to be done once by the developer prior to sale. See Dongle Implemenation for more details.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Bytes 7-36
Constant Command 1st byte of key 2nd byte of key 3rd byte of key 4th byte of key Constant
0
192
K0
K1
K2
K3
0

K0: 1st byte of user determined dongle key, any number 1-254.
K1: 2nd byte of user determined dongle key, any number 1-254.
K2: 3rd byte of user determined dongle key, any number 1-254.
K3: 4th byte of user determined dongle key, any number 1-254.

24. Check Dongle Key

Checks the key that was entered in Set Dongle Key. This is intented to be done by the developer within their own software to determine if the connected X-keys device is the one they sold to the customer. 4 random bytes along with the actual key are entered into the DongleCheck2() hash function of the Piehid32.dll/PieHid32Net.dll which returns 4 bytes. Then after sending this output report a Check Dongle Key input report will be received containing the same 4 bytes returned from the hash if the key matches. See Dongle Implemenation for more details.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Bytes 7-36
Constant Command Random number Random number Random number Random number Constant
0
193
N0
N1
N2
N3
0

K0: 1st byte of a random number that was used in the hash, any number 1-254.
K1: 2nd byte of a random number that was used in the hash, any number 1-254.
K2: 3rd byte of a random number that was used in the hash, any number 1-254.
K3: 4th byte of a random number that was used in the hash, any number 1-254.

25. Write to LCD

Writes to either line 1 or line 2 of the LCD with or without backlighting. Each command should fill the enter 16 characters of the line.

Byte 1*
Byte 2
Byte 3
Byte 4
Byte 5-20
Bytes 21-36
Constant Command Line Backlighting Characters Constant
0
206
Line
BL
Char
0

Line: 0 for top line, 1 for bottom line.
BL: 0 for off, 1 for on.
Char: Ascii value of the desired character. Must enter all 16 characters. If no character is desired use space (32).

Example: to send Hello World to the top line with backlighting use
0, 206, 0, 1, 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 32, 32, 32, 32, 32

*This first byte may be omitted on some non-PC operating systems. On these systems the read and write lengths will be 1 byte smaller.

Back to top