2 * Driver for the Gravis Grip Multiport, a gamepad "hub" that
3 * connects up to four 9-pin digital gamepads/joysticks.
4 * Driver tested on SMP and UP kernel versions 2.4.18-4 and 2.4.18-5.
6 * Thanks to Chris Gassib for helpful advice.
8 * Copyright (c) 2002 Brian Bonnlander, Bill Soudan
9 * Copyright (c) 1998-2000 Vojtech Pavlik
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/slab.h>
15 #include <linux/gameport.h>
16 #include <linux/input.h>
17 #include <linux/delay.h>
18 #include <linux/proc_fs.h>
19 #include <linux/jiffies.h>
21 #define DRIVER_DESC "Gravis Grip Multiport driver"
23 MODULE_AUTHOR("Brian Bonnlander");
24 MODULE_DESCRIPTION(DRIVER_DESC
);
25 MODULE_LICENSE("GPL");
28 #define dbg(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg)
30 #define dbg(format, arg...) do {} while (0)
33 #define GRIP_MAX_PORTS 4
35 * Grip multiport state
39 struct input_dev
*dev
;
43 /* individual gamepad states */
47 int dirty
; /* has the state been updated? */
51 struct gameport
*gameport
;
52 struct grip_port
*port
[GRIP_MAX_PORTS
];
58 * Multiport packet interpretation
61 #define PACKET_FULL 0x80000000 /* packet is full */
62 #define PACKET_IO_FAST 0x40000000 /* 3 bits per gameport read */
63 #define PACKET_IO_SLOW 0x20000000 /* 1 bit per gameport read */
64 #define PACKET_MP_MORE 0x04000000 /* multiport wants to send more */
65 #define PACKET_MP_DONE 0x02000000 /* multiport done sending */
68 * Packet status code interpretation
71 #define IO_GOT_PACKET 0x0100 /* Got a packet */
72 #define IO_MODE_FAST 0x0200 /* Used 3 data bits per gameport read */
73 #define IO_SLOT_CHANGE 0x0800 /* Multiport physical slot status changed */
74 #define IO_DONE 0x1000 /* Multiport is done sending packets */
75 #define IO_RETRY 0x4000 /* Try again later to get packet */
76 #define IO_RESET 0x8000 /* Force multiport to resend all packets */
79 * Gamepad configuration data. Other 9-pin digital joystick devices
80 * may work with the multiport, so this may not be an exhaustive list!
81 * Commodore 64 joystick remains untested.
84 #define GRIP_INIT_DELAY 2000 /* 2 ms */
86 #define GRIP_MODE_NONE 0
87 #define GRIP_MODE_RESET 1
88 #define GRIP_MODE_GP 2
89 #define GRIP_MODE_C64 3
91 static const int grip_btn_gp
[] = { BTN_TR
, BTN_TL
, BTN_A
, BTN_B
, BTN_C
, BTN_X
, BTN_Y
, BTN_Z
, -1 };
92 static const int grip_btn_c64
[] = { BTN_JOYSTICK
, -1 };
94 static const int grip_abs_gp
[] = { ABS_X
, ABS_Y
, -1 };
95 static const int grip_abs_c64
[] = { ABS_X
, ABS_Y
, -1 };
97 static const int *grip_abs
[] = { NULL
, NULL
, grip_abs_gp
, grip_abs_c64
};
98 static const int *grip_btn
[] = { NULL
, NULL
, grip_btn_gp
, grip_btn_c64
};
100 static const char *grip_name
[] = { NULL
, NULL
, "Gravis Grip Pad", "Commodore 64 Joystick" };
102 static const int init_seq
[] = {
103 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
104 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
105 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
106 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1 };
108 /* Maps multiport directional values to X,Y axis values (each axis encoded in 3 bits) */
110 static const int axis_map
[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5 };
112 static int register_slot(int i
, struct grip_mp
*grip
);
115 * Returns whether an odd or even number of bits are on in pkt.
118 static int bit_parity(u32 pkt
)
120 int x
= pkt
^ (pkt
>> 16);
129 * Poll gameport; return true if all bits set in 'onbits' are on and
130 * all bits set in 'offbits' are off.
133 static inline int poll_until(u8 onbits
, u8 offbits
, int u_sec
, struct gameport
* gp
, u8
*data
)
137 nloops
= gameport_time(gp
, u_sec
);
138 for (i
= 0; i
< nloops
; i
++) {
139 *data
= gameport_read(gp
);
140 if ((*data
& onbits
) == onbits
&&
141 (~(*data
) & offbits
) == offbits
)
144 dbg("gameport timed out after %d microseconds.\n", u_sec
);
149 * Gets a 28-bit packet from the multiport.
151 * After getting a packet successfully, commands encoded by sendcode may
152 * be sent to the multiport.
154 * The multiport clock value is reflected in gameport bit B4.
156 * Returns a packet status code indicating whether packet is valid, the transfer
157 * mode, and any error conditions.
159 * sendflags: current I/O status
160 * sendcode: data to send to the multiport if sendflags is nonzero
163 static int mp_io(struct gameport
* gameport
, int sendflags
, int sendcode
, u32
*packet
)
165 u8 raw_data
; /* raw data from gameport */
166 u8 data_mask
; /* packet data bits from raw_data */
167 u32 pkt
; /* packet temporary storage */
168 int bits_per_read
; /* num packet bits per gameport read */
169 int portvals
= 0; /* used for port value sanity check */
172 /* Gameport bits B0, B4, B5 should first be off, then B4 should come on. */
175 raw_data
= gameport_read(gameport
);
179 for (i
= 0; i
< 64; i
++) {
180 raw_data
= gameport_read(gameport
);
181 portvals
|= 1 << ((raw_data
>> 4) & 3); /* Demux B4, B5 */
184 if (portvals
== 1) { /* B4, B5 off */
185 raw_data
= gameport_read(gameport
);
186 portvals
= raw_data
& 0xf0;
190 gameport_trigger(gameport
);
192 if (!poll_until(0x10, 0, 308, gameport
, &raw_data
))
197 /* Determine packet transfer mode and prepare for packet construction. */
199 if (raw_data
& 0x20) { /* 3 data bits/read */
200 portvals
|= raw_data
>> 4; /* Compare B4-B7 before & after trigger */
206 pkt
= (PACKET_FULL
| PACKET_IO_FAST
) >> 28;
207 } else { /* 1 data bit/read */
210 pkt
= (PACKET_FULL
| PACKET_IO_SLOW
) >> 28;
213 /* Construct a packet. Final data bits must be zero. */
216 if (!poll_until(0, 0x10, 77, gameport
, &raw_data
))
218 raw_data
= (raw_data
>> 5) & data_mask
;
220 if (pkt
& PACKET_FULL
)
222 pkt
= (pkt
<< bits_per_read
) | raw_data
;
224 if (!poll_until(0x10, 0, 77, gameport
, &raw_data
))
231 /* If 3 bits/read used, drop from 30 bits to 28. */
233 if (bits_per_read
== 3) {
234 pkt
= (pkt
& 0xffff0000) | ((pkt
<< 1) & 0xffff);
235 pkt
= (pkt
>> 2) | 0xf0000000;
238 if (bit_parity(pkt
) == 1)
241 /* Acknowledge packet receipt */
243 if (!poll_until(0x30, 0, 77, gameport
, &raw_data
))
246 raw_data
= gameport_read(gameport
);
251 gameport_trigger(gameport
);
253 if (!poll_until(0, 0x20, 77, gameport
, &raw_data
))
256 /* Return if we just wanted the packet or multiport wants to send more */
259 if ((sendflags
== 0) || ((sendflags
& IO_RETRY
) && !(pkt
& PACKET_MP_DONE
)))
260 return IO_GOT_PACKET
;
262 if (pkt
& PACKET_MP_MORE
)
263 return IO_GOT_PACKET
| IO_RETRY
;
265 /* Multiport is done sending packets and is ready to receive data */
267 if (!poll_until(0x20, 0, 77, gameport
, &raw_data
))
268 return IO_GOT_PACKET
| IO_RESET
;
270 raw_data
= gameport_read(gameport
);
272 return IO_GOT_PACKET
| IO_RESET
;
274 /* Trigger gameport based on bits in sendcode */
276 gameport_trigger(gameport
);
278 if (!poll_until(0x20, 0x10, 116, gameport
, &raw_data
))
279 return IO_GOT_PACKET
| IO_RESET
;
281 if (!poll_until(0x30, 0, 193, gameport
, &raw_data
))
282 return IO_GOT_PACKET
| IO_RESET
;
285 return IO_GOT_PACKET
| IO_RESET
;
288 gameport_trigger(gameport
);
293 return IO_GOT_PACKET
| IO_MODE_FAST
;
297 * Disables and restores interrupts for mp_io(), which does the actual I/O.
300 static int multiport_io(struct gameport
* gameport
, int sendflags
, int sendcode
, u32
*packet
)
305 local_irq_save(flags
);
306 status
= mp_io(gameport
, sendflags
, sendcode
, packet
);
307 local_irq_restore(flags
);
313 * Puts multiport into digital mode. Multiport LED turns green.
315 * Returns true if a valid digital packet was received, false otherwise.
318 static int dig_mode_start(struct gameport
*gameport
, u32
*packet
)
321 int flags
, tries
= 0, bads
= 0;
323 for (i
= 0; i
< ARRAY_SIZE(init_seq
); i
++) { /* Send magic sequence */
325 gameport_trigger(gameport
);
326 udelay(GRIP_INIT_DELAY
);
329 for (i
= 0; i
< 16; i
++) /* Wait for multiport to settle */
330 udelay(GRIP_INIT_DELAY
);
332 while (tries
< 64 && bads
< 8) { /* Reset multiport and try getting a packet */
334 flags
= multiport_io(gameport
, IO_RESET
, 0x27, packet
);
336 if (flags
& IO_MODE_FAST
)
339 if (flags
& IO_RETRY
)
348 * Packet structure: B0-B15 => gamepad state
349 * B16-B20 => gamepad device type
350 * B21-B24 => multiport slot index (1-4)
352 * Known device types: 0x1f (grip pad), 0x0 (no device). Others may exist.
354 * Returns the packet status.
357 static int get_and_decode_packet(struct grip_mp
*grip
, int flags
)
359 struct grip_port
*port
;
364 /* Get a packet and check for validity */
366 flags
&= IO_RESET
| IO_RETRY
;
367 flags
= multiport_io(grip
->gameport
, flags
, 0, &packet
);
370 if (packet
& PACKET_MP_DONE
)
373 if (flags
&& !(flags
& IO_GOT_PACKET
)) {
378 /* Ignore non-gamepad packets, e.g. multiport hardware version */
380 slot
= ((packet
>> 21) & 0xf) - 1;
381 if ((slot
< 0) || (slot
> 3))
384 port
= grip
->port
[slot
];
387 * Handle "reset" packets, which occur at startup, and when gamepads
388 * are removed or plugged in. May contain configuration of a new gamepad.
391 joytype
= (packet
>> 16) & 0x1f;
394 if (port
->registered
) {
395 printk(KERN_INFO
"grip_mp: removing %s, slot %d\n",
396 grip_name
[port
->mode
], slot
);
397 input_unregister_device(port
->dev
);
398 port
->registered
= 0;
400 dbg("Reset: grip multiport slot %d\n", slot
);
401 port
->mode
= GRIP_MODE_RESET
;
402 flags
|= IO_SLOT_CHANGE
;
406 /* Interpret a grip pad packet */
408 if (joytype
== 0x1f) {
410 int dir
= (packet
>> 8) & 0xf; /* eight way directional value */
411 port
->buttons
= (~packet
) & 0xff;
412 port
->yaxes
= ((axis_map
[dir
] >> 2) & 3) - 1;
413 port
->xaxes
= (axis_map
[dir
] & 3) - 1;
416 if (port
->mode
== GRIP_MODE_RESET
)
417 flags
|= IO_SLOT_CHANGE
;
419 port
->mode
= GRIP_MODE_GP
;
421 if (!port
->registered
) {
422 dbg("New Grip pad in multiport slot %d.\n", slot
);
423 if (register_slot(slot
, grip
)) {
424 port
->mode
= GRIP_MODE_RESET
;
431 /* Handle non-grip device codes. For now, just print diagnostics. */
434 static int strange_code
= 0;
435 if (strange_code
!= joytype
) {
436 printk(KERN_INFO
"Possible non-grip pad/joystick detected.\n");
437 printk(KERN_INFO
"Got joy type 0x%x and packet 0x%x.\n", joytype
, packet
);
438 strange_code
= joytype
;
445 * Returns true if all multiport slot states appear valid.
448 static int slots_valid(struct grip_mp
*grip
)
450 int flags
, slot
, invalid
= 0, active
= 0;
452 flags
= get_and_decode_packet(grip
, 0);
453 if (!(flags
& IO_GOT_PACKET
))
456 for (slot
= 0; slot
< 4; slot
++) {
457 if (grip
->port
[slot
]->mode
== GRIP_MODE_RESET
)
459 if (grip
->port
[slot
]->mode
!= GRIP_MODE_NONE
)
463 /* Return true if no active slot but multiport sent all its data */
465 return (flags
& IO_DONE
) ? 1 : 0;
467 /* Return false if invalid device code received */
468 return invalid
? 0 : 1;
472 * Returns whether the multiport was placed into digital mode and
473 * able to communicate its state successfully.
476 static int multiport_init(struct grip_mp
*grip
)
478 int dig_mode
, initialized
= 0, tries
= 0;
481 dig_mode
= dig_mode_start(grip
->gameport
, &packet
);
482 while (!dig_mode
&& tries
< 4) {
483 dig_mode
= dig_mode_start(grip
->gameport
, &packet
);
488 dbg("multiport_init(): digital mode activated.\n");
490 dbg("multiport_init(): unable to activate digital mode.\n");
494 /* Get packets, store multiport state, and check state's validity */
495 for (tries
= 0; tries
< 4096; tries
++) {
496 if (slots_valid(grip
)) {
501 dbg("multiport_init(): initialized == %d\n", initialized
);
506 * Reports joystick state to the linux input layer.
509 static void report_slot(struct grip_mp
*grip
, int slot
)
511 struct grip_port
*port
= grip
->port
[slot
];
514 /* Store button states with linux input driver */
516 for (i
= 0; i
< 8; i
++)
517 input_report_key(port
->dev
, grip_btn_gp
[i
], (port
->buttons
>> i
) & 1);
519 /* Store axis states with linux driver */
521 input_report_abs(port
->dev
, ABS_X
, port
->xaxes
);
522 input_report_abs(port
->dev
, ABS_Y
, port
->yaxes
);
524 /* Tell the receiver of the events to process them */
526 input_sync(port
->dev
);
532 * Get the multiport state.
535 static void grip_poll(struct gameport
*gameport
)
537 struct grip_mp
*grip
= gameport_get_drvdata(gameport
);
540 for (npkts
= 0; npkts
< 4; npkts
++) {
542 for (i
= 0; i
< 32; i
++) {
543 flags
= get_and_decode_packet(grip
, flags
);
544 if ((flags
& IO_GOT_PACKET
) || !(flags
& IO_RETRY
))
551 for (i
= 0; i
< 4; i
++)
552 if (grip
->port
[i
]->dirty
)
553 report_slot(grip
, i
);
557 * Called when a joystick device file is opened
560 static int grip_open(struct input_dev
*dev
)
562 struct grip_mp
*grip
= input_get_drvdata(dev
);
564 gameport_start_polling(grip
->gameport
);
569 * Called when a joystick device file is closed
572 static void grip_close(struct input_dev
*dev
)
574 struct grip_mp
*grip
= input_get_drvdata(dev
);
576 gameport_stop_polling(grip
->gameport
);
580 * Tell the linux input layer about a newly plugged-in gamepad.
583 static int register_slot(int slot
, struct grip_mp
*grip
)
585 struct grip_port
*port
= grip
->port
[slot
];
586 struct input_dev
*input_dev
;
590 port
->dev
= input_dev
= input_allocate_device();
594 input_dev
->name
= grip_name
[port
->mode
];
595 input_dev
->id
.bustype
= BUS_GAMEPORT
;
596 input_dev
->id
.vendor
= GAMEPORT_ID_VENDOR_GRAVIS
;
597 input_dev
->id
.product
= 0x0100 + port
->mode
;
598 input_dev
->id
.version
= 0x0100;
599 input_dev
->dev
.parent
= &grip
->gameport
->dev
;
601 input_set_drvdata(input_dev
, grip
);
603 input_dev
->open
= grip_open
;
604 input_dev
->close
= grip_close
;
606 input_dev
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
608 for (j
= 0; (t
= grip_abs
[port
->mode
][j
]) >= 0; j
++)
609 input_set_abs_params(input_dev
, t
, -1, 1, 0, 0);
611 for (j
= 0; (t
= grip_btn
[port
->mode
][j
]) >= 0; j
++)
613 set_bit(t
, input_dev
->keybit
);
615 err
= input_register_device(port
->dev
);
617 input_free_device(port
->dev
);
621 port
->registered
= 1;
623 if (port
->dirty
) /* report initial state, if any */
624 report_slot(grip
, slot
);
629 static int grip_connect(struct gameport
*gameport
, struct gameport_driver
*drv
)
631 struct grip_mp
*grip
;
634 if (!(grip
= kzalloc(sizeof(struct grip_mp
), GFP_KERNEL
)))
637 grip
->gameport
= gameport
;
639 gameport_set_drvdata(gameport
, grip
);
641 err
= gameport_open(gameport
, drv
, GAMEPORT_MODE_RAW
);
645 gameport_set_poll_handler(gameport
, grip_poll
);
646 gameport_set_poll_interval(gameport
, 20);
648 if (!multiport_init(grip
)) {
653 if (!grip
->port
[0]->mode
&& !grip
->port
[1]->mode
&& !grip
->port
[2]->mode
&& !grip
->port
[3]->mode
) {
654 /* nothing plugged in */
661 fail2
: gameport_close(gameport
);
662 fail1
: gameport_set_drvdata(gameport
, NULL
);
667 static void grip_disconnect(struct gameport
*gameport
)
669 struct grip_mp
*grip
= gameport_get_drvdata(gameport
);
672 for (i
= 0; i
< 4; i
++)
673 if (grip
->port
[i
]->registered
)
674 input_unregister_device(grip
->port
[i
]->dev
);
675 gameport_close(gameport
);
676 gameport_set_drvdata(gameport
, NULL
);
680 static struct gameport_driver grip_drv
= {
684 .description
= DRIVER_DESC
,
685 .connect
= grip_connect
,
686 .disconnect
= grip_disconnect
,
689 module_gameport_driver(grip_drv
);