# P.I. Engineering SDK Help

## X-keys Multi Board 192 Data Report

### General Information

VID | 05f3h
PID #1 (Factory Default) | 0410h or 1040
PID #2 | 0412h or 1042
Consumer Usage Page | 1
Usage Page | 000Ch or 12

### X-keys Multi Board 192 Input Reports

Figure 1: X-keys Multi Board 192 key reference. On actual board C1-C8=P0 0-7, C9-C16=P5 0-7, C17-C24=P4 0-7, R1-R8=P2 0-7.

Endpoint: 3, Consumer Usage Page.

PID #1 Additional Endpoints: 1, Keyboard (Hid Usage Page 1, Hid Usage 6) and 2, Mouse (Hid Usage Page 1, Hid Usage 2).
PID #2 Additional Endpoints: 1, Keyboard (Hid Usage Page 1, Hid Usage 6) and 2, Joystick (Hid Usage Page 1, Hid Usage 4).

Report Length: 49 bytes.

1. General Incoming Data for Multi Board 192

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 | Byte 10 | Byte 11 | Byte 12 | Byte 13 | Byte 14 | Byte 15 | Byte 16 | Byte 17 | Byte 18 | Byte 19 | Byte 20 | Byte 21 | Byte 22 | Byte 23 | Byte 24 | Byte 25 | Byte 26 | Byte 27 | Bytes 28-31 | Bytes 32+
Constant | Unit ID | Data Type | Keys A | Keys B | Keys C | Keys D | Keys E | Keys F | Keys G | Keys H | Keys I | Keys J | Keys K | Keys L | Keys M | Keys N | Keys O | Keys P | Keys Q | Keys R | Keys S | Keys T | Keys U | Keys V | Keys X | Keys Y | Time Stamp | Reserved
0 | <data> | PS | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | DI | Time | value

PS: 0 if program switch unset, 1 if program switch is set, 2 if generated by the Generate Data (output report 6) and program switch is unset, 3 if generated by the Generate Data (output report 6) and program switch is set.
DI: For all bits 0 if key is up, 1 if key is down. Bits 1 to 8 correspond to rows 1-8 respectively of the given column. For example Byte 4 gives the state of A1, A2, A3, A4, A5, A6, A7 and A8. A value of 67 in this byte would indicate that A1, A2 and A7 are pressed.
Time: If enabled using Enable Time Stamp output report gives a time in ms from start of computer in 4 bytes where byte 28 is the MSB and byte 31 is the LSB.

2. Descriptor Data

This data is returned after a Request for Descriptor output report is sent.

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+
Constant | Unit ID | Data Type | Mode | Key mapstart | Layer2 Offset | Write Report Length-1 | Read Report Length-1 | Max Columns | Max Rows | LED State | Version | PID Low | PID Hi | Reserved
0 | <data> | 214 | Mode | 32 | 192 | 35 | 48 | 4 | 6 | LEDs | <data> | PIDL | PIDH | value

Mode: 0 means device is in PID #1, 2 means the device is in PID #2.
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: The LSB of the Product Identification number or PID.
PIDH: The MSB of the Product Identification number or PID.

### X-keys Multi Board 192 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, 184, KC, 0... | Enable/Disable Keyboard Control
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, 204, Mode, 0... | Change PIDe
8 | 0, 215, Mode, 0... | External Diodese
9 | 0, 201, Modifier, 0, HC1, HC2, HC3, HC4, HC5, HC6, 0... | Keyboard Reflector
10 | 0, 203, Buttons, Mouse X, Mouse Y, Wheel X, Wheel Y, 0... | Mouse Reflector (PID #1 only)
11 | 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 (PID #2 only)

eCommand writes to EEPROM, do not perform this command excessively, do not exceed 50,000 writes to EEPROM.

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: For all bits, 0 is off, 1 is on. Bit 1= LED1, bit 2=LED 2, bit 3=LED 3, bit 4=LED 4, bit 5=LED 5, bit 6=LED 6, bit 7=LED 7, bit 8=LED 8. Note if keyboard control is enabled (see Enable/Disable Keyboard Control) bits 1, 2, 3 are irrelevant. To control the first 3 LEDs manually disable the keyboard control.

2. Enable/Disable Keyboard Control

Send this output report to enable or disable keyboard control. If the keyboard control is enabled the first LED is on when NumLock is on and off if NumLock is off, the second LED is on if CapsLock is on and off is CapsLock is off, the third LED is on if ScrollLock is on and off if ScrollLock is off. Disabling the keyboard control will allow for the LEDs to be set manually using the Set LEDs output report.

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Command | Keyboard Control | Constant
0 | 184 | KC | 0

KC: Bit 1=0 to disable keyboard control of the first 3 LEDs, bit 1=1 to enable keyboard control of the first 3 LEDs (factory default).

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. Change PID

Send this output report to change between the two PIDs. This needs to be done only if the user wishes to have the joystick endpoint.

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

Mode: 0 for PID #1, reporting to the USB as a Splat device (IN and OUT), a mouse, and a keyboard and 2 for PID #2, reporting as a Splat device (IN and OUT), joystick and a keyboard.

8. External Diodes

Send this output report with Mode=0 if the board has external diodes connected to the key matrix. Send this output report with Mode=1 if no external diodes are connected to the key matrix. Factory default is Mode=1, without external diodes. This command needs to be sent only once and the setting is saved in the eeprom.

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

Mode: 0 if external diodes are present, 1 if external diodes are not present.

9. Keyboard Reflector

Sends native keyboard messages.

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.

10. Mouse Reflector

Sends native mouse messages (PID #1 only).

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.
WY=Wheel Y 128=0 no motion, 1-127 is up, 255-129=down, finest inc (1 and 255) to coarsest (127 and 129).

11. Joystick Reflector

Sends native joystick messages (PID #2 only).

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.

*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