Kurt Stephens

Nerd Up!

Luxeed LED Keyboard Driver for Linux

Kurt on Wed, 2008-12-10 07:34.

Hardware Review

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

Overview

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

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

Basic Commands

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.

Things left:

  • Pausing updates to the keyboard for a short time period after any keypress would allow animations but not let them interfere with the typist. The keyboard I/O channel is too slow to handle typing and animations (~10 frame/sec) at the same time.
  • A bulk update command that maps a PNM image representing the keyboard would be helpful.
  • udev rules to prevent the need for running the server as root.
  • Debian packaging.

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!


links: Kurt's blog | add new comment | 22754 reads

deTA 3.1 Firmware


Has anyone been able to install the new 3.1 firmware on the deTA? I always get “download error”. I’m using a USB-to-Serial dongle, but I’ve never had any problems with it before.

http://luxiium.com/en/bbs/board.php?bo_table=program_down_e&wr_id=16

Their support site is horrific.

— Kurt

linux


Can only seem to get the keys to light up with white ff ff ff, any other color i try eg blue 00 00 ff, and they won’t respond or light up. Was thinking of making a gui for this to create an executable file for color templates (and maybe animations) but can’t quite get past the color issue.

Ubunto 8.04 desktop

How are you communicating with the server?


There were some fixes since your post.
— Kurt

Trying to get this working on OSX


I have a Luxeed which I bought with precisely this in mind, however I got the U5 which (as I only discovered after purchasing) doesn’t come with the software to set the colour externally…I’m hoping that under the hood it’s basically the same (it looks identical) and will respond to the same USB calls.

Anyway, do you have any tips for getting the server running on OSX? When I enter “make install-prereqs” I get the following error:

sudo: apt-get: command not found
make: *** [install-prereqs] Error 1

My C & Unix chops are n00b-level but if I can just get the server responding to TCP I should be able to take it from there…

- Matthew

OSX


The Makefile is somewhat geared toward Debian Linux. Try commenting out the references to install-prereqs. You will need to find out how to install those libraries on OSX.

— Kurt

Re: OSX


Thanks very much Kurt, am going to try that now.

- Matthew

More OSX


Hi there, got a little further. Managed (with some effort) to install libusb and libevent from darwinports.com on my mac. I commented out the “sudo apt-get…” line in the Makefile. Finally I ran Make and…I get a ton of errors:

cc -g -O2 -Wall -c -o luxeed_device.o luxeed_device.c
In file included from luxeed_device.c:10:
luxeed_device.h:7:17: error: usb.h: No such file or directory
In file included from luxeed_device.c:10:
luxeed_device.h:22: error: syntax error before ‘usb_dev_handle’

... and so on for days. Am I missing something critical from my path? Having searched my computer I’ve found seven different files called USB.h (upper case) – I’m rather confused.

Thanks for any help you can give,
Matthew

OSX driver


U5 like deTA ?


is this Driver compatible with the Luxeed U5 keyboard ?


U5?


I don’t know.

Primary links

Syndicate

Syndicate content

Browse archives

« May 2013  
Mo Tu We Th Fr Sa Su
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31