Luxeed LED Keyboard Driver for Linux
Kurt on Wed, 2008-12-10 07:34.
This is a really cool keyboard, except that the ESC and function keys do not light up and are strangely located and difficult to press. I also don’t understand why the spacebar does not light up; seems like it’s the most important key. The construction is not very good and the feel is a bit mushy. However, this keyboard is fun for hacking and could be really great for user training.
Device Driver and Source Code
After much troubleshooting, I have created a simple C driver library for the Luxeed deTA 100/200 keyboard using libusb. This driver allows the LEDs under each key to be set from C from most Unix-like operating systems. This is my first attempt at reverse-engineering the protocol of a USB device.
Source is located here: http://github.com/kstephens/luxeed/tree/master
There is a user-space single-threaded, non-blocking I/O daemon using libevent that accepts multiple TCP connections on port 12345 to execute pixel update commands. I’ve been able to get time between frames down to 0.025 seconds.
Commands sent from clients via TCP to the server:
set <RED> <GREEN> <BLUE> <KEY>... update wait <SECONDS> get <KEY>
Keys can be specified using names (e.g.: “TAB”, “LSHIFT”, “A”), key IDs (e.g. “#20” same as “Y”) or positions relative to the top-left corner (e.g.: “2@1” same as “W”). The “get” command returns the current color of a key. The key colors are atomically uploaded to the keyboard with “update” command.
Building and Running the Server
> cd luxeed/src > make install-prereqs > make > sudo ./luxeed --server & # start the server
Make the number keys light up blue:
> netcat localhost 12345 set 00 00 ff 1 2 3 4 5 6 7 8 9 0 update ^D
Simple client that flashes keys:
> sudo ./luxeed --server & # start the server > cat flash_keys #!/bin/bash t=0.5 c="ff ff ff" c2="00 00 00" while [ $# -gt 0 ] do case "$1" in -t) t="$2"; shift 2 ;; -c) c="$2"; shift 2 ;; -c2) c2="$2"; shift 2 ;; *) break ;; esac done keys="$*" while true do netcat localhost 12345 <<END set $c $keys update wait $t set $c2 $keys update wait $t END done > ./flash_keys ENTER # flash the ENTER key
Since the server can service multiple clients, we can flash multiple keys at different rates and colors using multiple clients:
> ./flash_keys -t 0.2 -c 'ff 00 00' TAB & > ./flash_keys ENTER &
Maybe it’s time for a demo video.
There are some I/O throttling issues; sometimes the keyboard disconnects (or requires a power cycle) if data is sent to it too quickly. The only message I could decipher is a bulk keyboard update message of 5 65-byte blocks with an embedded checksum. Maybe there is a smaller differential update payload that will only update specific keys which would be more useful for faster animation. There may be a response message that needs to be read.
If you have this keyboard, give it a try!