1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for the Gravis Grip Multiport, a gamepad "hub" that
4 * connects up to four 9-pin digital gamepads/joysticks.
5 * Driver tested on SMP and UP kernel versions 2.4.18-4 and 2.4.18-5.
7 * Thanks to Chris Gassib for helpful advice.
9 * Copyright (c) 2002 Brian Bonnlander, Bill Soudan
10 * Copyright (c) 1998-2000 Vojtech Pavlik
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/slab.h>
16 #include <linux/gameport.h>
17 #include <linux/input.h>
18 #include <linux/delay.h>
19 #include <linux/proc_fs.h>
20 #include <linux/jiffies.h>
22 #define DRIVER_DESC "Gravis Grip Multiport driver"
24 MODULE_AUTHOR("Brian Bonnlander");
25 MODULE_DESCRIPTION(DRIVER_DESC
);
26 MODULE_LICENSE("GPL");
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
36 * Grip multiport state
40 struct input_dev
*dev
;
44 /* individual gamepad states */
48 int dirty
; /* has the state been updated? */
52 struct gameport
*gameport
;
53 struct grip_port
*port
[GRIP_MAX_PORTS
];
59 * Multiport packet interpretation
62 #define PACKET_FULL 0x80000000 /* packet is full */
63 #define PACKET_IO_FAST 0x40000000 /* 3 bits per gameport read */
64 #define PACKET_IO_SLOW 0x20000000 /* 1 bit per gameport read */
65 #define PACKET_MP_MORE 0x04000000 /* multiport wants to send more */
66 #define PACKET_MP_DONE 0x02000000 /* multiport done sending */
69 * Packet status code interpretation
72 #define IO_GOT_PACKET 0x0100 /* Got a packet */
73 #define IO_MODE_FAST 0x0200 /* Used 3 data bits per gameport read */
74 #define IO_SLOT_CHANGE 0x0800 /* Multiport physical slot status changed */
75 #define IO_DONE 0x1000 /* Multiport is done sending packets */
76 #define IO_RETRY 0x4000 /* Try again later to get packet */
77 #define IO_RESET 0x8000 /* Force multiport to resend all packets */
80 * Gamepad configuration data. Other 9-pin digital joystick devices
81 * may work with the multiport, so this may not be an exhaustive list!
82 * Commodore 64 joystick remains untested.
85 #define GRIP_INIT_DELAY 2000 /* 2 ms */
87 #define GRIP_MODE_NONE 0
88 #define GRIP_MODE_RESET 1
89 #define GRIP_MODE_GP 2
90 #define GRIP_MODE_C64 3
92 static const int grip_btn_gp
[] = { BTN_TR
, BTN_TL
, BTN_A
, BTN_B
, BTN_C
, BTN_X
, BTN_Y
, BTN_Z
, -1 };
93 static const int grip_btn_c64
[] = { BTN_JOYSTICK
, -1 };
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 };
109 /* Maps multiport directional values to X,Y axis values (each axis encoded in 3 bits) */
111 static const int axis_map
[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5 };
113 static int register_slot(int i
, struct grip_mp
*grip
);
116 * Returns whether an odd or even number of bits are on in pkt.
119 static int bit_parity(u32 pkt
)
121 int x
= pkt
^ (pkt
>> 16);
130 * Poll gameport; return true if all bits set in 'onbits' are on and
131 * all bits set in 'offbits' are off.
134 static inline int poll_until(u8 onbits
, u8 offbits
, int u_sec
, struct gameport
* gp
, u8
*data
)
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
);
150 * Gets a 28-bit packet from the multiport.
152 * After getting a packet successfully, commands encoded by sendcode may
153 * be sent to the multiport.
155 * The multiport clock value is reflected in gameport bit B4.
157 * Returns a packet status code indicating whether packet is valid, the transfer
158 * mode, and any error conditions.
160 * sendflags: current I/O status
161 * sendcode: data to send to the multiport if sendflags is nonzero
164 static int mp_io(struct gameport
* gameport
, int sendflags
, int sendcode
, u32
*packet
)
166 u8 raw_data
; /* raw data from gameport */
167 u8 data_mask
; /* packet data bits from raw_data */
168 u32 pkt
; /* packet temporary storage */
169 int bits_per_read
; /* num packet bits per gameport read */
170 int portvals
= 0; /* used for port value sanity check */
173 /* Gameport bits B0, B4, B5 should first be off, then B4 should come on. */
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); /* Demux B4, B5 */
185 if (portvals
== 1) { /* B4, B5 off */
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
))
198 /* Determine packet transfer mode and prepare for packet construction. */
200 if (raw_data
& 0x20) { /* 3 data bits/read */
201 portvals
|= raw_data
>> 4; /* Compare B4-B7 before & after trigger */
207 pkt
= (PACKET_FULL
| PACKET_IO_FAST
) >> 28;
208 } else { /* 1 data bit/read */
211 pkt
= (PACKET_FULL
| PACKET_IO_SLOW
) >> 28;
214 /* Construct a packet. Final data bits must be zero. */
217 if (!poll_until(0, 0x10, 77, gameport
, &raw_data
))
219 raw_data
= (raw_data
>> 5) & data_mask
;
221 if (pkt
& PACKET_FULL
)
223 pkt
= (pkt
<< bits_per_read
) | raw_data
;
225 if (!poll_until(0x10, 0, 77, gameport
, &raw_data
))
232 /* If 3 bits/read used, drop from 30 bits to 28. */
234 if (bits_per_read
== 3) {
235 pkt
= (pkt
& 0xffff0000) | ((pkt
<< 1) & 0xffff);
236 pkt
= (pkt
>> 2) | 0xf0000000;
239 if (bit_parity(pkt
) == 1)
242 /* Acknowledge packet receipt */
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
))
257 /* Return if we just wanted the packet or multiport wants to send more */
260 if ((sendflags
== 0) || ((sendflags
& IO_RETRY
) && !(pkt
& PACKET_MP_DONE
)))
261 return IO_GOT_PACKET
;
263 if (pkt
& PACKET_MP_MORE
)
264 return IO_GOT_PACKET
| IO_RETRY
;
266 /* Multiport is done sending packets and is ready to receive data */
268 if (!poll_until(0x20, 0, 77, gameport
, &raw_data
))
269 return IO_GOT_PACKET
| IO_RESET
;
271 raw_data
= gameport_read(gameport
);
273 return IO_GOT_PACKET
| IO_RESET
;
275 /* Trigger gameport based on bits in sendcode */
277 gameport_trigger(gameport
);
279 if (!poll_until(0x20, 0x10, 116, gameport
, &raw_data
))
280 return IO_GOT_PACKET
| IO_RESET
;
282 if (!poll_until(0x30, 0, 193, gameport
, &raw_data
))
283 return IO_GOT_PACKET
| IO_RESET
;
286 return IO_GOT_PACKET
| IO_RESET
;
289 gameport_trigger(gameport
);
294 return IO_GOT_PACKET
| IO_MODE_FAST
;
298 * Disables and restores interrupts for mp_io(), which does the actual I/O.
301 static int multiport_io(struct gameport
* gameport
, int sendflags
, int sendcode
, u32
*packet
)
306 local_irq_save(flags
);
307 status
= mp_io(gameport
, sendflags
, sendcode
, packet
);
308 local_irq_restore(flags
);
314 * Puts multiport into digital mode. Multiport LED turns green.
316 * Returns true if a valid digital packet was received, false otherwise.
319 static int dig_mode_start(struct gameport
*gameport
, u32
*packet
)
322 int flags
, tries
= 0, bads
= 0;
324 for (i
= 0; i
< ARRAY_SIZE(init_seq
); i
++) { /* Send magic sequence */
326 gameport_trigger(gameport
);
327 udelay(GRIP_INIT_DELAY
);
330 for (i
= 0; i
< 16; i
++) /* Wait for multiport to settle */
331 udelay(GRIP_INIT_DELAY
);
333 while (tries
< 64 && bads
< 8) { /* Reset multiport and try getting a packet */
335 flags
= multiport_io(gameport
, IO_RESET
, 0x27, packet
);
337 if (flags
& IO_MODE_FAST
)
340 if (flags
& IO_RETRY
)
349 * Packet structure: B0-B15 => gamepad state
350 * B16-B20 => gamepad device type
351 * B21-B24 => multiport slot index (1-4)
353 * Known device types: 0x1f (grip pad), 0x0 (no device). Others may exist.
355 * Returns the packet status.
358 static int get_and_decode_packet(struct grip_mp
*grip
, int flags
)
360 struct grip_port
*port
;
365 /* Get a packet and check for validity */
367 flags
&= IO_RESET
| IO_RETRY
;
368 flags
= multiport_io(grip
->gameport
, flags
, 0, &packet
);
371 if (packet
& PACKET_MP_DONE
)
374 if (flags
&& !(flags
& IO_GOT_PACKET
)) {
379 /* Ignore non-gamepad packets, e.g. multiport hardware version */
381 slot
= ((packet
>> 21) & 0xf) - 1;
382 if ((slot
< 0) || (slot
> 3))
385 port
= grip
->port
[slot
];
388 * Handle "reset" packets, which occur at startup, and when gamepads
389 * are removed or plugged in. May contain configuration of a new gamepad.
392 joytype
= (packet
>> 16) & 0x1f;
395 if (port
->registered
) {
396 printk(KERN_INFO
"grip_mp: removing %s, slot %d\n",
397 grip_name
[port
->mode
], slot
);
398 input_unregister_device(port
->dev
);
399 port
->registered
= 0;
401 dbg("Reset: grip multiport slot %d\n", slot
);
402 port
->mode
= GRIP_MODE_RESET
;
403 flags
|= IO_SLOT_CHANGE
;
407 /* Interpret a grip pad packet */
409 if (joytype
== 0x1f) {
411 int dir
= (packet
>> 8) & 0xf; /* eight way directional value */
412 port
->buttons
= (~packet
) & 0xff;
413 port
->yaxes
= ((axis_map
[dir
] >> 2) & 3) - 1;
414 port
->xaxes
= (axis_map
[dir
] & 3) - 1;
417 if (port
->mode
== GRIP_MODE_RESET
)
418 flags
|= IO_SLOT_CHANGE
;
420 port
->mode
= GRIP_MODE_GP
;
422 if (!port
->registered
) {
423 dbg("New Grip pad in multiport slot %d.\n", slot
);
424 if (register_slot(slot
, grip
)) {
425 port
->mode
= GRIP_MODE_RESET
;
432 /* Handle non-grip device codes. For now, just print diagnostics. */
435 static int strange_code
= 0;
436 if (strange_code
!= joytype
) {
437 printk(KERN_INFO
"Possible non-grip pad/joystick detected.\n");
438 printk(KERN_INFO
"Got joy type 0x%x and packet 0x%x.\n", joytype
, packet
);
439 strange_code
= joytype
;
446 * Returns true if all multiport slot states appear valid.
449 static int slots_valid(struct grip_mp
*grip
)
451 int flags
, slot
, invalid
= 0, active
= 0;
453 flags
= get_and_decode_packet(grip
, 0);
454 if (!(flags
& IO_GOT_PACKET
))
457 for (slot
= 0; slot
< 4; slot
++) {
458 if (grip
->port
[slot
]->mode
== GRIP_MODE_RESET
)
460 if (grip
->port
[slot
]->mode
!= GRIP_MODE_NONE
)
464 /* Return true if no active slot but multiport sent all its data */
466 return (flags
& IO_DONE
) ? 1 : 0;
468 /* Return false if invalid device code received */
469 return invalid
? 0 : 1;
473 * Returns whether the multiport was placed into digital mode and
474 * able to communicate its state successfully.
477 static int multiport_init(struct grip_mp
*grip
)
479 int dig_mode
, initialized
= 0, tries
= 0;
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");
495 /* Get packets, store multiport state, and check state's validity */
496 for (tries
= 0; tries
< 4096; tries
++) {
497 if (slots_valid(grip
)) {
502 dbg("multiport_init(): initialized == %d\n", initialized
);
507 * Reports joystick state to the linux input layer.
510 static void report_slot(struct grip_mp
*grip
, int slot
)
512 struct grip_port
*port
= grip
->port
[slot
];
515 /* Store button states with linux input driver */
517 for (i
= 0; i
< 8; i
++)
518 input_report_key(port
->dev
, grip_btn_gp
[i
], (port
->buttons
>> i
) & 1);
520 /* Store axis states with linux driver */
522 input_report_abs(port
->dev
, ABS_X
, port
->xaxes
);
523 input_report_abs(port
->dev
, ABS_Y
, port
->yaxes
);
525 /* Tell the receiver of the events to process them */
527 input_sync(port
->dev
);
533 * Get the multiport state.
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
);
558 * Called when a joystick device file is opened
561 static int grip_open(struct input_dev
*dev
)
563 struct grip_mp
*grip
= input_get_drvdata(dev
);
565 gameport_start_polling(grip
->gameport
);
570 * Called when a joystick device file is closed
573 static void grip_close(struct input_dev
*dev
)
575 struct grip_mp
*grip
= input_get_drvdata(dev
);
577 gameport_stop_polling(grip
->gameport
);
581 * Tell the linux input layer about a newly plugged-in gamepad.
584 static int register_slot(int slot
, struct grip_mp
*grip
)
586 struct grip_port
*port
= grip
->port
[slot
];
587 struct input_dev
*input_dev
;
591 port
->dev
= input_dev
= input_allocate_device();
595 input_dev
->name
= grip_name
[port
->mode
];
596 input_dev
->id
.bustype
= BUS_GAMEPORT
;
597 input_dev
->id
.vendor
= GAMEPORT_ID_VENDOR_GRAVIS
;
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
;
607 input_dev
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
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
++)
614 set_bit(t
, input_dev
->keybit
);
616 err
= input_register_device(port
->dev
);
618 input_free_device(port
->dev
);
622 port
->registered
= 1;
624 if (port
->dirty
) /* report initial state, if any */
625 report_slot(grip
, slot
);
630 static int grip_connect(struct gameport
*gameport
, struct gameport_driver
*drv
)
632 struct grip_mp
*grip
;
635 if (!(grip
= kzalloc(sizeof(struct grip_mp
), GFP_KERNEL
)))
638 grip
->gameport
= gameport
;
640 gameport_set_drvdata(gameport
, grip
);
642 err
= gameport_open(gameport
, drv
, GAMEPORT_MODE_RAW
);
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
) {
655 /* nothing plugged in */
662 fail2
: gameport_close(gameport
);
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
);
676 gameport_close(gameport
);
677 gameport_set_drvdata(gameport
, NULL
);
681 static struct gameport_driver grip_drv
= {
685 .description
= DRIVER_DESC
,
686 .connect
= grip_connect
,
687 .disconnect
= grip_disconnect
,
690 module_gameport_driver(grip_drv
);