2 * $Id: grip_mp.c,v 1.9 2002/07/20 19:28:45 bonnland Exp $
4 * Driver for the Gravis Grip Multiport, a gamepad "hub" that
5 * connects up to four 9-pin digital gamepads/joysticks.
6 * Driver tested on SMP and UP kernel versions 2.4.18-4 and 2.4.18-5.
8 * Thanks to Chris Gassib for helpful advice.
10 * Copyright (c) 2002 Brian Bonnlander, Bill Soudan
11 * Copyright (c) 1998-2000 Vojtech Pavlik
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/init.h>
17 #include <linux/slab.h>
18 #include <linux/gameport.h>
19 #include <linux/input.h>
20 #include <linux/delay.h>
21 #include <linux/proc_fs.h>
22 #include <linux/jiffies.h>
24 #define DRIVER_DESC "Gravis Grip Multiport driver"
26 MODULE_AUTHOR("Brian Bonnlander");
27 MODULE_DESCRIPTION(DRIVER_DESC);
28 MODULE_LICENSE("GPL");
31 #define dbg(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg)
33 #define dbg(format, arg...) do {} while (0)
36 #define GRIP_MAX_PORTS 4
38 * Grip multiport state
42 struct input_dev *dev;
46 /* individual gamepad states */
50 int dirty; /* has the state been updated? */
54 struct gameport *gameport;
55 struct grip_port *port[GRIP_MAX_PORTS];
61 * Multiport packet interpretation
64 #define PACKET_FULL 0x80000000 /* packet is full */
65 #define PACKET_IO_FAST 0x40000000 /* 3 bits per gameport read */
66 #define PACKET_IO_SLOW 0x20000000 /* 1 bit per gameport read */
67 #define PACKET_MP_MORE 0x04000000 /* multiport wants to send more */
68 #define PACKET_MP_DONE 0x02000000 /* multiport done sending */
71 * Packet status code interpretation
74 #define IO_GOT_PACKET 0x0100 /* Got a packet */
75 #define IO_MODE_FAST 0x0200 /* Used 3 data bits per gameport read */
76 #define IO_SLOT_CHANGE 0x0800 /* Multiport physical slot status changed */
77 #define IO_DONE 0x1000 /* Multiport is done sending packets */
78 #define IO_RETRY 0x4000 /* Try again later to get packet */
79 #define IO_RESET 0x8000 /* Force multiport to resend all packets */
82 * Gamepad configuration data. Other 9-pin digital joystick devices
83 * may work with the multiport, so this may not be an exhaustive list!
84 * Commodore 64 joystick remains untested.
87 #define GRIP_INIT_DELAY 2000 /* 2 ms */
89 #define GRIP_MODE_NONE 0
90 #define GRIP_MODE_RESET 1
91 #define GRIP_MODE_GP 2
92 #define GRIP_MODE_C64 3
94 static const int grip_btn_gp[] = { BTN_TR, BTN_TL, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, -1 };
95 static const int grip_btn_c64[] = { BTN_JOYSTICK, -1 };
97 static const int grip_abs_gp[] = { ABS_X, ABS_Y, -1 };
98 static const int grip_abs_c64[] = { ABS_X, ABS_Y, -1 };
100 static const int *grip_abs[] = { NULL, NULL, grip_abs_gp, grip_abs_c64 };
101 static const int *grip_btn[] = { NULL, NULL, grip_btn_gp, grip_btn_c64 };
103 static const char *grip_name[] = { NULL, NULL, "Gravis Grip Pad", "Commodore 64 Joystick" };
105 static const int init_seq[] = {
106 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
107 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
108 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
109 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1 };
111 /* Maps multiport directional values to X,Y axis values (each axis encoded in 3 bits) */
113 static const int axis_map[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5 };
115 static int register_slot(int i, struct grip_mp *grip);
118 * Returns whether an odd or even number of bits are on in pkt.
121 static int bit_parity(u32 pkt)
123 int x = pkt ^ (pkt >> 16);
132 * Poll gameport; return true if all bits set in 'onbits' are on and
133 * all bits set in 'offbits' are off.
136 static inline int poll_until(u8 onbits, u8 offbits, int u_sec, struct gameport* gp, u8 *data)
140 nloops = gameport_time(gp, u_sec);
141 for (i = 0; i < nloops; i++) {
142 *data = gameport_read(gp);
143 if ((*data & onbits) == onbits &&
144 (~(*data) & offbits) == offbits)
147 dbg("gameport timed out after %d microseconds.\n", u_sec);
152 * Gets a 28-bit packet from the multiport.
154 * After getting a packet successfully, commands encoded by sendcode may
155 * be sent to the multiport.
157 * The multiport clock value is reflected in gameport bit B4.
159 * Returns a packet status code indicating whether packet is valid, the transfer
160 * mode, and any error conditions.
162 * sendflags: current I/O status
163 * sendcode: data to send to the multiport if sendflags is nonzero
166 static int mp_io(struct gameport* gameport, int sendflags, int sendcode, u32 *packet)
168 u8 raw_data; /* raw data from gameport */
169 u8 data_mask; /* packet data bits from raw_data */
170 u32 pkt; /* packet temporary storage */
171 int bits_per_read; /* num packet bits per gameport read */
172 int portvals = 0; /* used for port value sanity check */
175 /* Gameport bits B0, B4, B5 should first be off, then B4 should come on. */
178 raw_data = gameport_read(gameport);
182 for (i = 0; i < 64; i++) {
183 raw_data = gameport_read(gameport);
184 portvals |= 1 << ((raw_data >> 4) & 3); /* Demux B4, B5 */
187 if (portvals == 1) { /* B4, B5 off */
188 raw_data = gameport_read(gameport);
189 portvals = raw_data & 0xf0;
193 gameport_trigger(gameport);
195 if (!poll_until(0x10, 0, 308, gameport, &raw_data))
200 /* Determine packet transfer mode and prepare for packet construction. */
202 if (raw_data & 0x20) { /* 3 data bits/read */
203 portvals |= raw_data >> 4; /* Compare B4-B7 before & after trigger */
209 pkt = (PACKET_FULL | PACKET_IO_FAST) >> 28;
210 } else { /* 1 data bit/read */
213 pkt = (PACKET_FULL | PACKET_IO_SLOW) >> 28;
216 /* Construct a packet. Final data bits must be zero. */
219 if (!poll_until(0, 0x10, 77, gameport, &raw_data))
221 raw_data = (raw_data >> 5) & data_mask;
223 if (pkt & PACKET_FULL)
225 pkt = (pkt << bits_per_read) | raw_data;
227 if (!poll_until(0x10, 0, 77, gameport, &raw_data))
234 /* If 3 bits/read used, drop from 30 bits to 28. */
236 if (bits_per_read == 3) {
237 pkt = (pkt & 0xffff0000) | ((pkt << 1) & 0xffff);
238 pkt = (pkt >> 2) | 0xf0000000;
241 if (bit_parity(pkt) == 1)
244 /* Acknowledge packet receipt */
246 if (!poll_until(0x30, 0, 77, gameport, &raw_data))
249 raw_data = gameport_read(gameport);
254 gameport_trigger(gameport);
256 if (!poll_until(0, 0x20, 77, gameport, &raw_data))
259 /* Return if we just wanted the packet or multiport wants to send more */
262 if ((sendflags == 0) || ((sendflags & IO_RETRY) && !(pkt & PACKET_MP_DONE)))
263 return IO_GOT_PACKET;
265 if (pkt & PACKET_MP_MORE)
266 return IO_GOT_PACKET | IO_RETRY;
268 /* Multiport is done sending packets and is ready to receive data */
270 if (!poll_until(0x20, 0, 77, gameport, &raw_data))
271 return IO_GOT_PACKET | IO_RESET;
273 raw_data = gameport_read(gameport);
275 return IO_GOT_PACKET | IO_RESET;
277 /* Trigger gameport based on bits in sendcode */
279 gameport_trigger(gameport);
281 if (!poll_until(0x20, 0x10, 116, gameport, &raw_data))
282 return IO_GOT_PACKET | IO_RESET;
284 if (!poll_until(0x30, 0, 193, gameport, &raw_data))
285 return IO_GOT_PACKET | IO_RESET;
288 return IO_GOT_PACKET | IO_RESET;
291 gameport_trigger(gameport);
296 return IO_GOT_PACKET | IO_MODE_FAST;
300 * Disables and restores interrupts for mp_io(), which does the actual I/O.
303 static int multiport_io(struct gameport* gameport, int sendflags, int sendcode, u32 *packet)
308 local_irq_save(flags);
309 status = mp_io(gameport, sendflags, sendcode, packet);
310 local_irq_restore(flags);
316 * Puts multiport into digital mode. Multiport LED turns green.
318 * Returns true if a valid digital packet was received, false otherwise.
321 static int dig_mode_start(struct gameport *gameport, u32 *packet)
324 int flags, tries = 0, bads = 0;
326 for (i = 0; i < ARRAY_SIZE(init_seq); i++) { /* Send magic sequence */
328 gameport_trigger(gameport);
329 udelay(GRIP_INIT_DELAY);
332 for (i = 0; i < 16; i++) /* Wait for multiport to settle */
333 udelay(GRIP_INIT_DELAY);
335 while (tries < 64 && bads < 8) { /* Reset multiport and try getting a packet */
337 flags = multiport_io(gameport, IO_RESET, 0x27, packet);
339 if (flags & IO_MODE_FAST)
342 if (flags & IO_RETRY)
351 * Packet structure: B0-B15 => gamepad state
352 * B16-B20 => gamepad device type
353 * B21-B24 => multiport slot index (1-4)
355 * Known device types: 0x1f (grip pad), 0x0 (no device). Others may exist.
357 * Returns the packet status.
360 static int get_and_decode_packet(struct grip_mp *grip, int flags)
362 struct grip_port *port;
367 /* Get a packet and check for validity */
369 flags &= IO_RESET | IO_RETRY;
370 flags = multiport_io(grip->gameport, flags, 0, &packet);
373 if (packet & PACKET_MP_DONE)
376 if (flags && !(flags & IO_GOT_PACKET)) {
381 /* Ignore non-gamepad packets, e.g. multiport hardware version */
383 slot = ((packet >> 21) & 0xf) - 1;
384 if ((slot < 0) || (slot > 3))
387 port = grip->port[slot];
390 * Handle "reset" packets, which occur at startup, and when gamepads
391 * are removed or plugged in. May contain configuration of a new gamepad.
394 joytype = (packet >> 16) & 0x1f;
397 if (port->registered) {
398 printk(KERN_INFO "grip_mp: removing %s, slot %d\n",
399 grip_name[port->mode], slot);
400 input_unregister_device(port->dev);
401 port->registered = 0;
403 dbg("Reset: grip multiport slot %d\n", slot);
404 port->mode = GRIP_MODE_RESET;
405 flags |= IO_SLOT_CHANGE;
409 /* Interpret a grip pad packet */
411 if (joytype == 0x1f) {
413 int dir = (packet >> 8) & 0xf; /* eight way directional value */
414 port->buttons = (~packet) & 0xff;
415 port->yaxes = ((axis_map[dir] >> 2) & 3) - 1;
416 port->xaxes = (axis_map[dir] & 3) - 1;
419 if (port->mode == GRIP_MODE_RESET)
420 flags |= IO_SLOT_CHANGE;
422 port->mode = GRIP_MODE_GP;
424 if (!port->registered) {
425 dbg("New Grip pad in multiport slot %d.\n", slot);
426 if (register_slot(slot, grip)) {
427 port->mode = GRIP_MODE_RESET;
434 /* Handle non-grip device codes. For now, just print diagnostics. */
437 static int strange_code = 0;
438 if (strange_code != joytype) {
439 printk(KERN_INFO "Possible non-grip pad/joystick detected.\n");
440 printk(KERN_INFO "Got joy type 0x%x and packet 0x%x.\n", joytype, packet);
441 strange_code = joytype;
448 * Returns true if all multiport slot states appear valid.
451 static int slots_valid(struct grip_mp *grip)
453 int flags, slot, invalid = 0, active = 0;
455 flags = get_and_decode_packet(grip, 0);
456 if (!(flags & IO_GOT_PACKET))
459 for (slot = 0; slot < 4; slot++) {
460 if (grip->port[slot]->mode == GRIP_MODE_RESET)
462 if (grip->port[slot]->mode != GRIP_MODE_NONE)
466 /* Return true if no active slot but multiport sent all its data */
468 return (flags & IO_DONE) ? 1 : 0;
470 /* Return false if invalid device code received */
471 return invalid ? 0 : 1;
475 * Returns whether the multiport was placed into digital mode and
476 * able to communicate its state successfully.
479 static int multiport_init(struct grip_mp *grip)
481 int dig_mode, initialized = 0, tries = 0;
484 dig_mode = dig_mode_start(grip->gameport, &packet);
485 while (!dig_mode && tries < 4) {
486 dig_mode = dig_mode_start(grip->gameport, &packet);
491 dbg("multiport_init(): digital mode activated.\n");
493 dbg("multiport_init(): unable to activate digital mode.\n");
497 /* Get packets, store multiport state, and check state's validity */
498 for (tries = 0; tries < 4096; tries++) {
499 if (slots_valid(grip)) {
504 dbg("multiport_init(): initialized == %d\n", initialized);
509 * Reports joystick state to the linux input layer.
512 static void report_slot(struct grip_mp *grip, int slot)
514 struct grip_port *port = grip->port[slot];
517 /* Store button states with linux input driver */
519 for (i = 0; i < 8; i++)
520 input_report_key(port->dev, grip_btn_gp[i], (port->buttons >> i) & 1);
522 /* Store axis states with linux driver */
524 input_report_abs(port->dev, ABS_X, port->xaxes);
525 input_report_abs(port->dev, ABS_Y, port->yaxes);
527 /* Tell the receiver of the events to process them */
529 input_sync(port->dev);
535 * Get the multiport state.
538 static void grip_poll(struct gameport *gameport)
540 struct grip_mp *grip = gameport_get_drvdata(gameport);
543 for (npkts = 0; npkts < 4; npkts++) {
545 for (i = 0; i < 32; i++) {
546 flags = get_and_decode_packet(grip, flags);
547 if ((flags & IO_GOT_PACKET) || !(flags & IO_RETRY))
554 for (i = 0; i < 4; i++)
555 if (grip->port[i]->dirty)
556 report_slot(grip, i);
560 * Called when a joystick device file is opened
563 static int grip_open(struct input_dev *dev)
565 struct grip_mp *grip = input_get_drvdata(dev);
567 gameport_start_polling(grip->gameport);
572 * Called when a joystick device file is closed
575 static void grip_close(struct input_dev *dev)
577 struct grip_mp *grip = input_get_drvdata(dev);
579 gameport_stop_polling(grip->gameport);
583 * Tell the linux input layer about a newly plugged-in gamepad.
586 static int register_slot(int slot, struct grip_mp *grip)
588 struct grip_port *port = grip->port[slot];
589 struct input_dev *input_dev;
593 port->dev = input_dev = input_allocate_device();
597 input_dev->name = grip_name[port->mode];
598 input_dev->id.bustype = BUS_GAMEPORT;
599 input_dev->id.vendor = GAMEPORT_ID_VENDOR_GRAVIS;
600 input_dev->id.product = 0x0100 + port->mode;
601 input_dev->id.version = 0x0100;
602 input_dev->dev.parent = &grip->gameport->dev;
604 input_set_drvdata(input_dev, grip);
606 input_dev->open = grip_open;
607 input_dev->close = grip_close;
609 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
611 for (j = 0; (t = grip_abs[port->mode][j]) >= 0; j++)
612 input_set_abs_params(input_dev, t, -1, 1, 0, 0);
614 for (j = 0; (t = grip_btn[port->mode][j]) >= 0; j++)
616 set_bit(t, input_dev->keybit);
618 err = input_register_device(port->dev);
620 input_free_device(port->dev);
624 port->registered = 1;
626 if (port->dirty) /* report initial state, if any */
627 report_slot(grip, slot);
632 static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
634 struct grip_mp *grip;
637 if (!(grip = kzalloc(sizeof(struct grip_mp), GFP_KERNEL)))
640 grip->gameport = gameport;
642 gameport_set_drvdata(gameport, grip);
644 err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW);
648 gameport_set_poll_handler(gameport, grip_poll);
649 gameport_set_poll_interval(gameport, 20);
651 if (!multiport_init(grip)) {
656 if (!grip->port[0]->mode && !grip->port[1]->mode && !grip->port[2]->mode && !grip->port[3]->mode) {
657 /* nothing plugged in */
664 fail2: gameport_close(gameport);
665 fail1: gameport_set_drvdata(gameport, NULL);
670 static void grip_disconnect(struct gameport *gameport)
672 struct grip_mp *grip = gameport_get_drvdata(gameport);
675 for (i = 0; i < 4; i++)
676 if (grip->port[i]->registered)
677 input_unregister_device(grip->port[i]->dev);
678 gameport_close(gameport);
679 gameport_set_drvdata(gameport, NULL);
683 static struct gameport_driver grip_drv = {
687 .description = DRIVER_DESC,
688 .connect = grip_connect,
689 .disconnect = grip_disconnect,
692 static int __init grip_init(void)
694 gameport_register_driver(&grip_drv);
698 static void __exit grip_exit(void)
700 gameport_unregister_driver(&grip_drv);
703 module_init(grip_init);
704 module_exit(grip_exit);