50 #include <linux/kernel.h>
51 #include <linux/module.h>
52 #include <linux/slab.h>
53 #include <linux/input.h>
54 #include <linux/serio.h>
57 #define DRIVER_DESC "Handykey Twiddler keyboard as a joystick driver"
66 #define TWIDJOY_MAX_LENGTH 5
68 static struct twidjoy_button_spec {
92 struct input_dev *
dev;
105 struct input_dev *
dev = twidjoy->
dev;
106 unsigned char *
data = twidjoy->
data;
107 struct twidjoy_button_spec *bp;
110 button_bits = ((data[1] & 0x7f) << 7) | (data[0] & 0x7f);
112 for (bp = twidjoy_buttons; bp->bitmask; bp++) {
113 int value = (button_bits & (bp->bitmask << bp->bitshift)) >> bp->bitshift;
116 for (i = 0; i < bp->bitmask; i++)
117 input_report_key(dev, bp->buttons[i], i+1 == value);
120 abs_x = ((data[4] & 0x07) << 5) | ((data[3] & 0x7C) >> 2);
121 if (data[4] & 0x08) abs_x -= 256;
123 abs_y = ((data[3] & 0x01) << 7) | ((data[2] & 0x7F) >> 0);
124 if (data[3] & 0x02) abs_y -= 256;
126 input_report_abs(dev,
ABS_X, -abs_x);
127 input_report_abs(dev,
ABS_Y, +abs_y);
140 struct twidjoy *twidjoy = serio_get_drvdata(serio);
146 if ((data & 0x80) == 0)
148 else if (twidjoy->
idx == 0)
155 twidjoy_process_packet(twidjoy);
166 static void twidjoy_disconnect(
struct serio *serio)
168 struct twidjoy *twidjoy = serio_get_drvdata(serio);
171 serio_set_drvdata(serio,
NULL);
172 input_unregister_device(twidjoy->
dev);
182 static int twidjoy_connect(
struct serio *serio,
struct serio_driver *drv)
184 struct twidjoy_button_spec *bp;
185 struct twidjoy *twidjoy;
186 struct input_dev *input_dev;
190 twidjoy = kzalloc(
sizeof(
struct twidjoy),
GFP_KERNEL);
191 input_dev = input_allocate_device();
192 if (!twidjoy || !input_dev)
195 twidjoy->
dev = input_dev;
198 input_dev->name =
"Handykey Twiddler";
199 input_dev->phys = twidjoy->
phys;
202 input_dev->id.product = 0x0001;
203 input_dev->id.version = 0x0100;
204 input_dev->dev.parent = &serio->
dev;
207 input_set_abs_params(input_dev,
ABS_X, -50, 50, 4, 4);
208 input_set_abs_params(input_dev,
ABS_Y, -50, 50, 4, 4);
210 for (bp = twidjoy_buttons; bp->bitmask; bp++)
211 for (i = 0; i < bp->bitmask; i++)
212 set_bit(bp->buttons[i], input_dev->keybit);
214 serio_set_drvdata(serio, twidjoy);
220 err = input_register_device(twidjoy->
dev);
227 fail2: serio_set_drvdata(serio,
NULL);
228 fail1: input_free_device(input_dev);
254 .id_table = twidjoy_serio_ids,
255 .interrupt = twidjoy_interrupt,
256 .connect = twidjoy_connect,
257 .disconnect = twidjoy_disconnect,