12 #include <linux/kernel.h>
13 #include <linux/module.h>
15 #include <linux/slab.h>
16 #include <linux/gameport.h>
17 #include <linux/input.h>
22 #define DRIVER_DESC "Gravis Grip Multiport driver"
29 #define dbg(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg)
31 #define dbg(format, arg...) do {} while (0)
34 #define GRIP_MAX_PORTS 4
40 struct input_dev *
dev;
62 #define PACKET_FULL 0x80000000
63 #define PACKET_IO_FAST 0x40000000
64 #define PACKET_IO_SLOW 0x20000000
65 #define PACKET_MP_MORE 0x04000000
66 #define PACKET_MP_DONE 0x02000000
72 #define IO_GOT_PACKET 0x0100
73 #define IO_MODE_FAST 0x0200
74 #define IO_SLOT_CHANGE 0x0800
75 #define IO_DONE 0x1000
76 #define IO_RETRY 0x4000
77 #define IO_RESET 0x8000
85 #define GRIP_INIT_DELAY 2000
87 #define GRIP_MODE_NONE 0
88 #define GRIP_MODE_RESET 1
89 #define GRIP_MODE_GP 2
90 #define GRIP_MODE_C64 3
95 static const int grip_abs_gp[] = {
ABS_X,
ABS_Y, -1 };
96 static const int grip_abs_c64[] = {
ABS_X,
ABS_Y, -1 };
98 static const int *grip_abs[] = {
NULL,
NULL, grip_abs_gp, grip_abs_c64 };
99 static const int *grip_btn[] = {
NULL,
NULL, grip_btn_gp, grip_btn_c64 };
101 static const char *grip_name[] = {
NULL,
NULL,
"Gravis Grip Pad",
"Commodore 64 Joystick" };
103 static const int init_seq[] = {
104 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
105 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
106 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
107 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1 };
111 static const int axis_map[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5 };
119 static int bit_parity(
u32 pkt)
121 int x = pkt ^ (pkt >> 16);
138 nloops = gameport_time(gp, u_sec);
139 for (i = 0; i < nloops; i++) {
140 *data = gameport_read(gp);
141 if ((*data & onbits) == onbits &&
142 (~(*data) & offbits) == offbits)
145 dbg(
"gameport timed out after %d microseconds.\n", u_sec);
176 raw_data = gameport_read(gameport);
180 for (i = 0; i < 64; i++) {
181 raw_data = gameport_read(gameport);
182 portvals |= 1 << ((raw_data >> 4) & 3);
186 raw_data = gameport_read(gameport);
187 portvals = raw_data & 0xf0;
191 gameport_trigger(gameport);
193 if (!poll_until(0x10, 0, 308, gameport, &raw_data))
200 if (raw_data & 0x20) {
201 portvals |= raw_data >> 4;
217 if (!poll_until(0, 0x10, 77, gameport, &raw_data))
219 raw_data = (raw_data >> 5) & data_mask;
223 pkt = (pkt << bits_per_read) | raw_data;
225 if (!poll_until(0x10, 0, 77, gameport, &raw_data))
234 if (bits_per_read == 3) {
235 pkt = (pkt & 0xffff0000) | ((pkt << 1) & 0xffff);
236 pkt = (pkt >> 2) | 0xf0000000;
239 if (bit_parity(pkt) == 1)
244 if (!poll_until(0x30, 0, 77, gameport, &raw_data))
247 raw_data = gameport_read(gameport);
252 gameport_trigger(gameport);
254 if (!poll_until(0, 0x20, 77, gameport, &raw_data))
268 if (!poll_until(0x20, 0, 77, gameport, &raw_data))
271 raw_data = gameport_read(gameport);
277 gameport_trigger(gameport);
279 if (!poll_until(0x20, 0x10, 116, gameport, &raw_data))
282 if (!poll_until(0x30, 0, 193, gameport, &raw_data))
289 gameport_trigger(gameport);
301 static int multiport_io(
struct gameport* gameport,
int sendflags,
int sendcode,
u32 *packet)
307 status = mp_io(gameport, sendflags, sendcode, packet);
319 static int dig_mode_start(
struct gameport *gameport,
u32 *packet)
322 int flags, tries = 0, bads = 0;
326 gameport_trigger(gameport);
330 for (i = 0; i < 16; i++)
333 while (tries < 64 && bads < 8) {
335 flags = multiport_io(gameport,
IO_RESET, 0x27, packet);
340 if (flags & IO_RETRY)
358 static int get_and_decode_packet(
struct grip_mp *
grip,
int flags)
368 flags = multiport_io(grip->
gameport, flags, 0, &packet);
371 if (packet & PACKET_MP_DONE)
381 slot = ((packet >> 21) & 0xf) - 1;
382 if ((slot < 0) || (slot > 3))
392 joytype = (packet >> 16) & 0x1f;
397 grip_name[port->
mode], slot);
398 input_unregister_device(port->
dev);
401 dbg(
"Reset: grip multiport slot %d\n", slot);
409 if (joytype == 0x1f) {
411 int dir = (packet >> 8) & 0xf;
412 port->
buttons = (~packet) & 0xff;
413 port->
yaxes = ((axis_map[dir] >> 2) & 3) - 1;
414 port->
xaxes = (axis_map[dir] & 3) - 1;
423 dbg(
"New Grip pad in multiport slot %d.\n", slot);
424 if (register_slot(slot, grip)) {
435 static int strange_code = 0;
436 if (strange_code != joytype) {
438 printk(
KERN_INFO "Got joy type 0x%x and packet 0x%x.\n", joytype, packet);
439 strange_code = joytype;
449 static int slots_valid(
struct grip_mp *grip)
453 flags = get_and_decode_packet(grip, 0);
454 if (!(flags & IO_GOT_PACKET))
457 for (slot = 0; slot < 4; slot++) {
466 return (flags &
IO_DONE) ? 1 : 0;
469 return invalid ? 0 : 1;
477 static int multiport_init(
struct grip_mp *grip)
482 dig_mode = dig_mode_start(grip->
gameport, &packet);
483 while (!dig_mode && tries < 4) {
484 dig_mode = dig_mode_start(grip->
gameport, &packet);
489 dbg(
"multiport_init(): digital mode activated.\n");
491 dbg(
"multiport_init(): unable to activate digital mode.\n");
496 for (tries = 0; tries < 4096; tries++) {
497 if (slots_valid(grip)) {
502 dbg(
"multiport_init(): initialized == %d\n", initialized);
510 static void report_slot(
struct grip_mp *grip,
int slot)
517 for (i = 0; i < 8; i++)
518 input_report_key(port->
dev, grip_btn_gp[i], (port->
buttons >> i) & 1);
527 input_sync(port->
dev);
536 static void grip_poll(
struct gameport *gameport)
538 struct grip_mp *grip = gameport_get_drvdata(gameport);
541 for (npkts = 0; npkts < 4; npkts++) {
543 for (i = 0; i < 32; i++) {
544 flags = get_and_decode_packet(grip, flags);
545 if ((flags & IO_GOT_PACKET) || !(flags & IO_RETRY))
552 for (i = 0; i < 4; i++)
553 if (grip->
port[i]->dirty)
554 report_slot(grip, i);
561 static int grip_open(
struct input_dev *
dev)
563 struct grip_mp *grip = input_get_drvdata(dev);
573 static void grip_close(
struct input_dev *
dev)
575 struct grip_mp *grip = input_get_drvdata(dev);
584 static int register_slot(
int slot,
struct grip_mp *grip)
587 struct input_dev *input_dev;
591 port->
dev = input_dev = input_allocate_device();
595 input_dev->name = grip_name[port->
mode];
598 input_dev->id.product = 0x0100 + port->
mode;
599 input_dev->id.version = 0x0100;
600 input_dev->dev.parent = &grip->
gameport->dev;
602 input_set_drvdata(input_dev, grip);
604 input_dev->open = grip_open;
605 input_dev->close = grip_close;
609 for (j = 0; (t = grip_abs[port->
mode][
j]) >= 0; j++)
610 input_set_abs_params(input_dev, t, -1, 1, 0, 0);
612 for (j = 0; (t = grip_btn[port->
mode][
j]) >= 0; j++)
616 err = input_register_device(port->
dev);
618 input_free_device(port->
dev);
625 report_slot(grip, slot);
630 static int grip_connect(
struct gameport *gameport,
struct gameport_driver *drv)
640 gameport_set_drvdata(gameport, grip);
646 gameport_set_poll_handler(gameport, grip_poll);
647 gameport_set_poll_interval(gameport, 20);
649 if (!multiport_init(grip)) {
654 if (!grip->
port[0]->mode && !grip->
port[1]->mode && !grip->
port[2]->mode && !grip->
port[3]->mode) {
663 fail1: gameport_set_drvdata(gameport,
NULL);
668 static void grip_disconnect(
struct gameport *gameport)
670 struct grip_mp *grip = gameport_get_drvdata(gameport);
673 for (i = 0; i < 4; i++)
674 if (grip->
port[i]->registered)
675 input_unregister_device(grip->
port[i]->dev);
677 gameport_set_drvdata(gameport,
NULL);
686 .connect = grip_connect,
687 .disconnect = grip_disconnect,