33 #include <linux/kernel.h>
34 #include <linux/slab.h>
35 #include <linux/module.h>
37 #include <linux/input.h>
38 #include <linux/serio.h>
40 #define DRIVER_DESC "SpaceTec SpaceBall 2003/3003/4000 FLX driver"
50 #define SPACEBALL_MAX_LENGTH 128
51 #define SPACEBALL_MAX_ID 9
53 #define SPACEBALL_1003 1
54 #define SPACEBALL_2003B 3
55 #define SPACEBALL_2003C 4
56 #define SPACEBALL_3003C 7
57 #define SPACEBALL_4000FLX 8
58 #define SPACEBALL_4000FLX_L 9
61 static char *spaceball_names[] = {
62 "?",
"SpaceTec SpaceBall 1003",
"SpaceTec SpaceBall 2003",
"SpaceTec SpaceBall 2003B",
63 "SpaceTec SpaceBall 2003C",
"SpaceTec SpaceBall 3003",
"SpaceTec SpaceBall SpaceController",
64 "SpaceTec SpaceBall 3003C",
"SpaceTec SpaceBall 4000FLX",
"SpaceTec SpaceBall 4000FLX Lefty" };
71 struct input_dev *
dev;
85 struct input_dev *
dev = spaceball->
dev;
86 unsigned char *
data = spaceball->
data;
89 if (spaceball->
idx < 2)
return;
91 switch (spaceball->
data[0]) {
94 if (spaceball->
idx != 15)
return;
95 for (i = 0; i < 6; i++)
96 input_report_abs(dev, spaceball_axes[i],
97 (
__s16)((data[2 * i + 3] << 8) | data[2 * i + 2]));
101 if (spaceball->
idx != 3)
return;
102 input_report_key(dev,
BTN_1, (data[2] & 0x01) || (data[2] & 0x20));
103 input_report_key(dev,
BTN_2, data[2] & 0x02);
104 input_report_key(dev,
BTN_3, data[2] & 0x04);
105 input_report_key(dev,
BTN_4, data[2] & 0x08);
106 input_report_key(dev,
BTN_5, data[1] & 0x01);
107 input_report_key(dev,
BTN_6, data[1] & 0x02);
108 input_report_key(dev,
BTN_7, data[1] & 0x04);
109 input_report_key(dev,
BTN_8, data[1] & 0x10);
113 if (spaceball->
idx != 3)
return;
114 input_report_key(dev,
BTN_1, data[2] & 0x01);
115 input_report_key(dev,
BTN_2, data[2] & 0x02);
116 input_report_key(dev,
BTN_3, data[2] & 0x04);
117 input_report_key(dev,
BTN_4, data[2] & 0x08);
118 input_report_key(dev,
BTN_5, data[2] & 0x10);
119 input_report_key(dev,
BTN_6, data[2] & 0x20);
120 input_report_key(dev,
BTN_7, data[2] & 0x80);
121 input_report_key(dev,
BTN_8, data[1] & 0x01);
122 input_report_key(dev,
BTN_9, data[1] & 0x02);
123 input_report_key(dev,
BTN_A, data[1] & 0x04);
124 input_report_key(dev,
BTN_B, data[1] & 0x08);
125 input_report_key(dev,
BTN_C, data[1] & 0x10);
126 input_report_key(dev,
BTN_MODE, data[1] & 0x20);
130 spaceball->
data[spaceball->
idx - 1] = 0;
135 spaceball->
data[spaceball->
idx - 1] = 0;
156 spaceball_process_packet(spaceball);
187 static void spaceball_disconnect(
struct serio *serio)
189 struct spaceball* spaceball = serio_get_drvdata(serio);
192 serio_set_drvdata(serio,
NULL);
193 input_unregister_device(spaceball->
dev);
203 static int spaceball_connect(
struct serio *serio,
struct serio_driver *drv)
205 struct spaceball *spaceball;
206 struct input_dev *input_dev;
214 input_dev = input_allocate_device();
215 if (!spaceball || !input_dev)
218 spaceball->
dev = input_dev;
221 input_dev->name = spaceball_names[
id];
222 input_dev->phys = spaceball->
phys;
225 input_dev->id.product =
id;
226 input_dev->id.version = 0x0100;
227 input_dev->dev.parent = &serio->
dev;
248 for (i = 0; i < 3; i++) {
249 input_set_abs_params(input_dev,
ABS_X + i, -8000, 8000, 8, 40);
250 input_set_abs_params(input_dev,
ABS_RX + i, -1600, 1600, 2, 8);
253 serio_set_drvdata(serio, spaceball);
259 err = input_register_device(spaceball->
dev);
266 fail2: serio_set_drvdata(serio,
NULL);
267 fail1: input_free_device(input_dev);
293 .id_table = spaceball_serio_ids,
294 .interrupt = spaceball_interrupt,
295 .connect = spaceball_connect,
296 .disconnect = spaceball_disconnect,