Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
notes:hw:xencelabs-quickkeys [2023/04/24 14:18] – created maff | notes:hw:xencelabs-quickkeys [2023/06/26 14:17] (current) – maff | ||
---|---|---|---|
Line 5: | Line 5: | ||
===== Hardware info ===== | ===== Hardware info ===== | ||
- | USB: VID 0x28bd PID 0x5202 - Manufacturer " | + | USB: VID '' |
USB pcaps pending - currently on a mac machine and capturing USB traffic on a mac requires disabling system integrity protection. | USB pcaps pending - currently on a mac machine and capturing USB traffic on a mac requires disabling system integrity protection. | ||
- | Device has a rotary encoder, 10 buttons, a power slider switch, RGB light ring, green power LED, blue connectivity LED, power slider, internal battery (capacity, chemistry unknown), OLED screen (low pixel density, white phosphor) | + | Device has a rotary encoder, 10 buttons, a power slider switch, RGB light ring, green power LED, blue connectivity LED, power slider, internal battery (capacity |
- | Device appears to transmit only signals (ie., button press and rotary wheel moving +/- steps); although it appears to be using HID, it does not present as a regular input device and requires the driver components for actioning anything | + | Device appears to transmit only signals (ie., button press and rotary wheel moving +/- steps); although it appears to be using HID, it does not present as a regular input device and requires the driver components for actioning anything. |
+ | |||
+ | The device seems to have an FCC ID - '' | ||
===== Software info ===== | ===== Software info ===== | ||
Line 17: | Line 19: | ||
Software seems to be a generic XenceLabs-branded application that works for both the QuickKeys and other products offered by the company. | Software seems to be a generic XenceLabs-branded application that works for both the QuickKeys and other products offered by the company. | ||
- | The software is delivered as a DMG disk image, which contains an `xar` compressed | + | The software is delivered as a DMG disk image, which contains an '' |
- | The software archive contains a `LaunchAgents` plist (`com.xencelabs.xencelabstablet.plist`) which registers a launch agent `com.ugee.XencelabsAgent` to be started during login and during a logged-in session, and launches | + | The software archive contains a '' |
The software archive also contains a set of applications in a tree: | The software archive also contains a set of applications in a tree: | ||
Line 25: | Line 27: | ||
* Xencelabs | * Xencelabs | ||
* .guide (contains a copy of LGPLv3, some images, and some plists) | * .guide (contains a copy of LGPLv3, some images, and some plists) | ||
- | * Info.plist: | + | * Info.plist: |
- | * com.xencelabs.config.plist: | + | * com.xencelabs.config.plist: |
- | * com.xencelabs.config_run.plist: | + | * com.xencelabs.config_run.plist: |
* Xencelabs.app | * Xencelabs.app | ||
* UninstallXencelabs.app | * UninstallXencelabs.app | ||
* Driver | * Driver | ||
* XencelabsAgent.app | * XencelabsAgent.app | ||
+ | * Contents/ | ||
+ | * Contents/ | ||
* XencelabsDriver.app | * XencelabsDriver.app | ||
* XencelabsGuide.app | * XencelabsGuide.app | ||
+ | |||
+ | All applications appear to be universal binaries with both arm64 and amd64 builds. | ||
+ | |||
+ | Going by the system permissions prompts that come up when various inputs from the device are received by the computer, '' | ||
+ | |||
+ | ===== Firmware info ===== | ||
+ | |||
+ | The device came loaded with firmware version '' | ||
+ | |||
+ | ===== Observations relating to the stock software and firmware ===== | ||
+ | |||
+ | Scrolling with the rotary encoder appears to be handled inefficiently, | ||
+ | |||
+ | The OLED itself seems to receive its displayed data from the computer - there are references to functions for writing OLED data in the software. This may explain why the screen updates so slowly in normal use - I can see the screen update in blocks. | ||
+ | |||
+ | There' | ||
+ | |||
+ | The green LED (power) fades in a " | ||
+ | |||
+ | The device can be turned off while plugged in; it will continue charging while off, but will not operate. Plugging it in when turned off will turn it on. It's unclear what the utility of it being plugged in but off is - preventing screen-burn when charging? | ||
+ | |||
+ | When first turned on wirelessly, or when first plugged in, the device will not operate without the software installed. The software itself claims to include drivers, but this is a USB HID device, which notably does not use conventional drivers, so realistically the software could be reverse-engineered as open-source software. Plugging the device in or turning it on with any of the ten buttons held down does not appear to invoke any kind of alternate mode (eg. DFU). | ||
+ | |||
+ | The software allows you to input a name for the hardware, but the name is only stored locally. | ||
+ | |||
+ | ===== Observations relating to the hardware ===== | ||
+ | |||
+ | The eight buttons surrounding the screen are made of metal, as is the mode switch button below them. The button in the centre of the rotary encoder is part of the rotary dial itself. | ||
+ | |||
+ | The device seems very well-built, and has a rubber base to prevent slipping when in use - a nice addition, but over the course of at least a decade, it will eventually degrade and perish, and need to be removed. | ||
+ | |||
+ | The device has a kensington lock slot - I wonder if they intend this for businesses? | ||
+ | |||
+ | The bottom-right corner of the device has a slot that would normally be for a fingernail or something to pull the back panel off. I haven' | ||
+ | |||
+ | ===== The dongle ===== | ||
+ | |||
+ | The device contains a battery so that it can be used wirelessly - my first thought was that this was via bluetooth, but this does not appear to be the case. It came with a dongle, which I would assume means it runs over normal 2.4GHz or perhaps 430/ | ||
+ | |||
+ | When first plugged in, the dongle appears to be identified by the system as a keyboard. | ||
+ | |||
+ | USB: VID '' | ||
+ | |||
+ | It has model number ACD12-A and FCC ID 2AYM6-ACD12A | ||
+ | |||
+ | With the dongle plugged in, the software allows you to manage up to two " | ||
+ | |||
+ | The FCC-published information about this device indicates that yes - this is simply bluetooth/ | ||
+ | |||
+ | Diagnostic information in the software reports the dongle' | ||
+ | |||
+ | ===== Linux Drivers ===== | ||
+ | |||
+ | Somehow never occurred to me that the linux driver package might shed more light on how the software and hardware interact. | ||
+ | |||
+ | The Linux download contains packages for RPM and dpkg-based distros, as well as a tarball with installation scripts - the most obvious point for examination. It contains normal XDG stuff for startup, application registration and so on, but also contains udev rules: | ||
+ | |||
+ | <code text 10-xencelabs.rules> | ||
+ | KERNEL==" | ||
+ | SUBSYSTEMS==" | ||
+ | </ | ||
+ | |||
+ | It also contains the actual software and a set of Qt5 libraries. The application itself is invoked via a script which exports LD_LIBRARY_PATH beforehand. | ||
+ | |||
+ | The application binary is (predictably) a dynamically-linked ELF built for amd64. | ||
+ | |||
+ | ===== Plans ===== | ||
+ | |||
+ | Get USB packet captures of: | ||
+ | |||
+ | * Initial communication between the software and the device itself | ||
+ | * Initial communication between the software and the dongle | ||
+ | * Configuring the pairing for the dongle and the device | ||
+ | * Configuring the device | ||
+ | * Changing the sleep time and screen brightness | ||
+ | |||
+ | Check any network communications the software makes. | ||
+ | |||
+ | * Application has references to several hostnames/ | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * Checks for updates to itself by calling '' | ||
+ | * Checks for firmware updates by calling '' | ||
+ | |||
+ | ===== Notes during reverse-engineering ===== | ||
+ | |||
+ | Both the dongle and the direct USB connection expose a USB Usage with page FF0Ah | ||
+ | |||
+ | Not 100% on packet/HID report format, but.. | ||
+ | |||
+ | * All writes are 32-byte packets | ||
+ | * Bytes 10-15 inclusive are the MAC address of the device, or zeroes if connected via USB instead of the dongle | ||
+ | * Byte 0 is always 0x02 - this is the endpoint I think | ||
+ | * Data is only sent from the device once it has been subscribed to: | ||
+ | * 02b410 - Subscribes to battery change events | ||
+ | * 02b004 - Subscribes to button press and wheel events | ||
+ | * 02b801 - Subscribes to dongle connection events | ||
+ | |||
+ | Commands/ | ||
+ | |||
+ | * 02b40801& | ||
+ | * 02b4040101& | ||
+ | * 02b10a01& | ||
+ | * 02b1&0 - Set the display rotation (0 = 0º, 3 = 270º) | ||
+ | * 02b40101& | ||
+ | * 02b100& | ||
+ | * 02b1& | ||
+ | |||
+ | ===== Links ===== | ||
+ | |||
+ | [[https:// | ||