32 #include <linux/kernel.h>
33 #include <linux/module.h>
36 #include <linux/parport.h>
37 #include <linux/input.h>
39 #include <linux/slab.h>
50 #define DB9_MAX_PORTS 3
56 MODULE_PARM_DESC(dev2,
"Describes second attached device (<parport#>,<type>)");
58 MODULE_PARM_DESC(dev3,
"Describes third attached device (<parport#>,<type>)");
60 #define DB9_ARG_PARPORT 0
61 #define DB9_ARG_MODE 1
63 #define DB9_MULTI_STICK 0x01
64 #define DB9_MULTI2_STICK 0x02
65 #define DB9_GENESIS_PAD 0x03
66 #define DB9_GENESIS5_PAD 0x05
67 #define DB9_GENESIS6_PAD 0x06
68 #define DB9_SATURN_PAD 0x07
69 #define DB9_MULTI_0802 0x08
70 #define DB9_MULTI_0802_2 0x09
71 #define DB9_CD32_PAD 0x0A
72 #define DB9_SATURN_DPP 0x0B
73 #define DB9_SATURN_DPP_2 0x0C
74 #define DB9_MAX_PAD 0x0D
79 #define DB9_RIGHT 0x08
80 #define DB9_FIRE1 0x10
81 #define DB9_FIRE2 0x20
82 #define DB9_FIRE3 0x40
83 #define DB9_FIRE4 0x80
85 #define DB9_NORMAL 0x0a
86 #define DB9_NOSELECT 0x08
88 #define DB9_GENESIS6_DELAY 14
89 #define DB9_REFRESH_TIME HZ/100
91 #define DB9_MAX_DEVICES 2
113 static struct db9 *db9_base[3];
122 {
"Multisystem joystick", db9_multi_btn, 1, 1, 2, 1, 1 },
123 {
"Multisystem joystick (2 fire)", db9_multi_btn, 2, 1, 2, 1, 1 },
124 {
"Genesis pad", db9_genesis_btn, 4, 1, 2, 1, 1 },
126 {
"Genesis 5 pad", db9_genesis_btn, 6, 1, 2, 1, 1 },
127 {
"Genesis 6 pad", db9_genesis_btn, 8, 1, 2, 1, 1 },
128 {
"Saturn pad", db9_cd32_btn, 9, 6, 7, 0, 1 },
129 {
"Multisystem (0.8.0.2) joystick", db9_multi_btn, 1, 1, 2, 1, 1 },
130 {
"Multisystem (0.8.0.2-dual) joystick", db9_multi_btn, 1, 2, 2, 1, 1 },
131 {
"Amiga CD-32 pad", db9_cd32_btn, 7, 1, 2, 1, 1 },
132 {
"Saturn dpp", db9_cd32_btn, 9, 6, 7, 0, 0 },
133 {
"Saturn dpp dual", db9_cd32_btn, 9, 12, 7, 0, 0 },
139 #define DB9_SATURN_DELAY 300
140 static const int db9_saturn_byte[] = { 1, 1, 1, 2, 2, 2, 2, 2, 1 };
141 static const unsigned char db9_saturn_mask[] = { 0x04, 0x01, 0x02, 0x40, 0x20, 0x10, 0x08, 0x80, 0x08 };
146 static void db9_saturn_write_sub(
struct parport *
port,
int type,
unsigned char data,
int powered,
int pwr_sub)
152 c = 0x80 | 0x30 | (powered ? 0x08 : 0) | (pwr_sub ? 0x04 : 0) |
data;
156 c = 0x40 | data << 4 | (powered ? 0x08 : 0) | (pwr_sub ? 0x04 : 0) | 0x03;
160 c = ((((data & 2) ? 2 : 0) | ((data & 1) ? 4 : 0)) ^ 0x02) | !powered;
169 static unsigned char db9_saturn_read_sub(
struct parport *port,
int type)
176 return (data & 0x80 ? 1 : 0) | (data & 0x40 ? 2 : 0)
177 | (data & 0x20 ? 4 : 0) | (data & 0x10 ? 8 : 0);
181 return (data & 0x8 ? 1 : 0) | (data & 0x4 ? 2 : 0)
182 | (data & 0x2 ? 4 : 0) | (data & 0x1 ? 8 : 0);
189 static unsigned char db9_saturn_read_analog(
struct parport *port,
int type,
int powered)
193 db9_saturn_write_sub(port, type, 0, powered, 0);
195 data = db9_saturn_read_sub(port, type) << 4;
196 db9_saturn_write_sub(port, type, 2, powered, 0);
198 data |= db9_saturn_read_sub(port, type);
206 static unsigned char db9_saturn_read_packet(
struct parport *port,
unsigned char *data,
int type,
int powered)
211 db9_saturn_write_sub(port, type, 3, powered, 0);
212 data[0] = db9_saturn_read_sub(port, type);
213 switch (data[0] & 0x0f) {
216 return data[0] = 0xff;
217 case 0x4:
case 0x4 | 0x8:
219 db9_saturn_write_sub(port, type, 0, powered, 1);
220 data[2] = db9_saturn_read_sub(port, type) << 4;
221 db9_saturn_write_sub(port, type, 2, powered, 1);
222 data[1] = db9_saturn_read_sub(port, type) << 4;
223 db9_saturn_write_sub(port, type, 1, powered, 1);
224 data[1] |= db9_saturn_read_sub(port, type);
225 db9_saturn_write_sub(port, type, 3, powered, 1);
228 return data[0] = 0x02;
231 db9_saturn_write_sub(port, type, 2, powered, 0);
233 data[0] = db9_saturn_read_analog(port, type, powered);
234 if (data[0] != 0x41) {
236 for (i = 0; i < (data[0] & 0x0f); i++)
237 data[i + 1] = db9_saturn_read_analog(port, type, powered);
238 db9_saturn_write_sub(port, type, 3, powered, 0);
242 if (db9_saturn_read_analog(port, type, powered) != 0x60)
243 return data[0] = 0xff;
244 for (i = 0; i < 60; i += 10) {
245 data[
i] = db9_saturn_read_analog(port, type, powered);
248 for (j = 0; j < (data[
i] & 0x0f); j++)
249 data[i + j + 1] = db9_saturn_read_analog(port, type, powered);
251 db9_saturn_write_sub(port, type, 3, powered, 0);
256 db9_saturn_write_sub(port, type, 2, powered, 0);
258 tmp = db9_saturn_read_analog(port, type, powered);
260 for (i = 0; i < 3; i++)
261 data[i + 1] = db9_saturn_read_analog(port, type, powered);
262 db9_saturn_write_sub(port, type, 3, powered, 0);
263 return data[0] = 0xe3;
273 static int db9_saturn_report(
unsigned char id,
unsigned char data[60],
struct input_dev *devs[],
int n,
int max_pads)
275 struct input_dev *
dev;
278 tmp = (
id == 0x41) ? 60 : 10;
279 for (j = 0; j < tmp && n < max_pads; j += 10, n++) {
283 input_report_abs(dev, db9_abs[5], data[j + 6]);
285 input_report_abs(dev, db9_abs[3], data[j + 4]);
286 input_report_abs(dev, db9_abs[4], data[j + 5]);
288 input_report_abs(dev, db9_abs[2], data[j + 3]);
291 input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));
292 input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));
293 for (i = 0; i < 9; i++)
294 input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);
297 input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));
298 input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));
299 for (i = 0; i < 9; i++)
300 input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);
301 input_report_abs(dev, db9_abs[2], data[j + 3]);
302 input_report_abs(dev, db9_abs[3], data[j + 4]);
303 input_report_abs(dev, db9_abs[4], data[j + 5]);
308 input_report_abs(dev, db9_abs[6], data[j + 7]);
309 input_report_abs(dev, db9_abs[7], data[j + 8]);
310 input_report_abs(dev, db9_abs[5], data[j + 9]);
313 input_report_key(dev,
BTN_A, data[j + 3] & 0x80);
314 input_report_abs(dev, db9_abs[2], data[j + 3] & 0x7f);
317 input_report_key(dev,
BTN_START, data[j + 1] & 0x08);
318 input_report_key(dev,
BTN_A, data[j + 1] & 0x04);
319 input_report_key(dev,
BTN_C, data[j + 1] & 0x02);
320 input_report_key(dev,
BTN_B, data[j + 1] & 0x01);
321 input_report_abs(dev, db9_abs[2], data[j + 2] ^ 0x80);
322 input_report_abs(dev, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1);
326 input_report_abs(dev, db9_abs[0], 0);
327 input_report_abs(dev, db9_abs[1], 0);
328 for (i = 0; i < 9; i++)
329 input_report_key(dev, db9_cd32_btn[i], 0);
336 static int db9_saturn(
int mode,
struct parport *port,
struct input_dev *devs[])
338 unsigned char id, data[60];
339 int type,
n, max_pads;
359 for (tmp = 0, i = 0; i <
n; i++) {
360 id = db9_saturn_read_packet(port, data, type + i, 1);
361 tmp = db9_saturn_report(
id, data, devs, tmp, max_pads);
366 static void db9_timer(
unsigned long private)
368 struct db9 *
db9 = (
void *)
private;
370 struct input_dev *dev = db9->
dev[0];
371 struct input_dev *dev2 = db9->
dev[1];
387 input_report_abs(dev,
ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data &
DB9_LEFT ? 0 : 1));
388 input_report_abs(dev,
ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data &
DB9_UP ? 0 : 1));
396 input_report_abs(dev,
ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data &
DB9_LEFT ? 0 : 1));
397 input_report_abs(dev,
ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data &
DB9_UP ? 0 : 1));
405 input_report_abs(dev,
ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data &
DB9_LEFT ? 0 : 1));
406 input_report_abs(dev,
ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data &
DB9_UP ? 0 : 1));
416 input_report_abs(dev,
ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data &
DB9_LEFT ? 0 : 1));
417 input_report_abs(dev,
ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data &
DB9_UP ? 0 : 1));
433 input_report_abs(dev,
ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data &
DB9_LEFT ? 0 : 1));
434 input_report_abs(dev,
ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data &
DB9_UP ? 0 : 1));
444 input_report_key(dev,
BTN_START, ~data & DB9_RIGHT);
453 input_report_abs(dev,
ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data &
DB9_LEFT ? 0 : 1));
454 input_report_abs(dev,
ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data &
DB9_UP ? 0 : 1));
474 input_report_key(dev,
BTN_Y, ~data & DB9_DOWN);
476 input_report_key(dev,
BTN_MODE, ~data & DB9_RIGHT);
489 db9_saturn(db9->
mode, port, db9->
dev);
496 input_report_abs(dev,
ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data &
DB9_LEFT ? 0 : 1));
497 input_report_abs(dev,
ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data &
DB9_UP ? 0 : 1));
501 for (i = 0; i < 7; i++) {
505 input_report_key(dev, db9_cd32_btn[i], ~data &
DB9_FIRE2);
517 static int db9_open(
struct input_dev *dev)
519 struct db9 *db9 = input_get_drvdata(dev);
541 static void db9_close(
struct input_dev *dev)
543 struct db9 *db9 = input_get_drvdata(dev);
562 struct input_dev *input_dev;
566 if (mode < 1 || mode >=
DB9_MAX_PAD || !db9_modes[mode].n_buttons) {
572 db9_mode = &db9_modes[
mode];
582 printk(
KERN_ERR "db9.c: specified parport is not bidirectional\n");
594 db9 = kzalloc(
sizeof(
struct db9),
GFP_KERNEL);
598 goto err_unreg_pardev;
606 db9->
timer.function = db9_timer;
610 db9->
dev[
i] = input_dev = input_allocate_device();
618 "%s/input%d", db9->
pd->port->name, i);
620 input_dev->name = db9_mode->
name;
621 input_dev->phys = db9->
phys[
i];
623 input_dev->id.vendor = 0x0002;
624 input_dev->id.product =
mode;
625 input_dev->id.version = 0x0100;
627 input_set_drvdata(input_dev, db9);
629 input_dev->open = db9_open;
630 input_dev->close = db9_close;
633 for (j = 0; j < db9_mode->
n_buttons; j++)
635 for (j = 0; j < db9_mode->
n_axis; j++) {
637 input_set_abs_params(input_dev, db9_abs[j], -1, 1, 0, 0);
639 input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0);
642 err = input_register_device(input_dev);
651 input_free_device(db9->
dev[i]);
654 input_unregister_device(db9->
dev[i]);
664 static void db9_remove(
struct db9 *db9)
669 input_unregister_device(db9->
dev[i]);
674 static int __init db9_init(
void)
684 if (db9_cfg[i].nargs < 2) {
692 if (IS_ERR(db9_base[i])) {
693 err = PTR_ERR(db9_base[i]);
703 db9_remove(db9_base[i]);
707 return have_dev ? 0 : -
ENODEV;
710 static void __exit db9_exit(
void)
716 db9_remove(db9_base[i]);