This is not original work, but merely a set of notes on how to do the set up. The core information (and the code) came from this blog posting.
Essentially I’ve re-ordered the steps in which to work and excluded anything other than the bare essentials to get it all working. With the intention I can get my missile launcher working at home and at work 😎
Step 1 is to prevent the HID driver from clamping on to the missile launcher. This was done by :-
- Editing /etc/default/grub and adding usbhid.quirks=0x2123:0x1010:0x04 to the existing variable GRUB_CMDLINE_LINUX_DEFAULT.
- Run update-grub (I always manage to forget this).
- Reboot the machine and check /var/log/messages for 2123 (the VendorID) to see if it has been claimed by usbhid (which will show up as a line beginning generic-usb 0003:2123:1010.0006: hiddev0 if it does claim it).
The next step is to download and compile the code given in the blog link above. If you need instructions on how to do this, then you probably need to look elsewhere – it builds easily.
Once built, an sudo insmod launcher_driver.ko will verify that the kernel module loads – you can double check by looking at /var/log/messages.
It’s also necessary to install both the kernel driver and the control program manually :-
- Copy the compiled kernel module to /lib/modules: sudo cp launcher_driver.ko /lib/modules
- Edit /etc/rc.local and add the command: /sbin/insmod /lib/modules/launcher_driver.ko
- Copy the control program to a sensible location: sudo install launcher_control /opt/bin
There’s probably better ways of doing this, and better places to stick things but as you’re following my instructions you’re stuck with my suggestions! It’s tempting to try a reboot at this stage to verify that this works, but as there’s just one small extra step we may as well get that done too. This is to create a udev rule to set up a device file in /dev.
Create a file (/etc/udev/rules.d/99-usb-launcher.rules) with the following contents :-
KERNEL=="launcher?*",MODE="0660",GROUP="cdrom"
The choice of group name is rather inappropriate except it will work well enough, and I have changed the permissions on this to something a little more restrictive. This can be tested with sudo udevadm trigger which will re-run udev. This should change the permissions on any existing /dev/launcher* file(s). If it doesn’t work, the blog pointer above is the place to head.
Lastly, there’s a couple of corrections to the launcher_control.c that is convenient to make :-
% diff launcher_control.c launcher_control.c.orig 63c63 < while ((c = getopt(argc, argv, "m:lrudfsht:")) != -1) { --- > while ((c = getopt(argc, argv, "mlrudfsht:")) != -1) { 97,98c97 < fprintf(stderr, "Couldn't open file: %s\n", dev); < /*perror("Couldn't open file: %m");*/ --- > perror("Couldn't open file: %m");