xref: /openbmc/linux/drivers/input/joystick/grip_mp.c (revision 22246614)
1 /*
2  * $Id: grip_mp.c,v 1.9 2002/07/20 19:28:45 bonnland Exp $
3  *
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.
7  *
8  *  Thanks to Chris Gassib for helpful advice.
9  *
10  *  Copyright (c)      2002 Brian Bonnlander, Bill Soudan
11  *  Copyright (c) 1998-2000 Vojtech Pavlik
12  */
13 
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>
23 
24 #define DRIVER_DESC	"Gravis Grip Multiport driver"
25 
26 MODULE_AUTHOR("Brian Bonnlander");
27 MODULE_DESCRIPTION(DRIVER_DESC);
28 MODULE_LICENSE("GPL");
29 
30 #ifdef GRIP_DEBUG
31 #define dbg(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg)
32 #else
33 #define dbg(format, arg...) do {} while (0)
34 #endif
35 
36 #define GRIP_MAX_PORTS	4
37 /*
38  * Grip multiport state
39  */
40 
41 struct grip_port {
42 	struct input_dev *dev;
43 	int mode;
44 	int registered;
45 
46 	/* individual gamepad states */
47 	int buttons;
48 	int xaxes;
49 	int yaxes;
50 	int dirty;     /* has the state been updated? */
51 };
52 
53 struct grip_mp {
54 	struct gameport *gameport;
55 	struct grip_port *port[GRIP_MAX_PORTS];
56 	int reads;
57 	int bads;
58 };
59 
60 /*
61  * Multiport packet interpretation
62  */
63 
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                */
69 
70 /*
71  * Packet status code interpretation
72  */
73 
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  */
80 
81 /*
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.
85  */
86 
87 #define GRIP_INIT_DELAY         2000          /*  2 ms */
88 
89 #define GRIP_MODE_NONE		0
90 #define GRIP_MODE_RESET         1
91 #define GRIP_MODE_GP		2
92 #define GRIP_MODE_C64		3
93 
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 };
96 
97 static const int grip_abs_gp[]  = { ABS_X, ABS_Y, -1 };
98 static const int grip_abs_c64[] = { ABS_X, ABS_Y, -1 };
99 
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 };
102 
103 static const char *grip_name[] = { NULL, NULL, "Gravis Grip Pad", "Commodore 64 Joystick" };
104 
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 };
110 
111 /* Maps multiport directional values to X,Y axis values (each axis encoded in 3 bits) */
112 
113 static const int axis_map[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5 };
114 
115 static int register_slot(int i, struct grip_mp *grip);
116 
117 /*
118  * Returns whether an odd or even number of bits are on in pkt.
119  */
120 
121 static int bit_parity(u32 pkt)
122 {
123 	int x = pkt ^ (pkt >> 16);
124 	x ^= x >> 8;
125 	x ^= x >> 4;
126 	x ^= x >> 2;
127 	x ^= x >> 1;
128 	return x & 1;
129 }
130 
131 /*
132  * Poll gameport; return true if all bits set in 'onbits' are on and
133  * all bits set in 'offbits' are off.
134  */
135 
136 static inline int poll_until(u8 onbits, u8 offbits, int u_sec, struct gameport* gp, u8 *data)
137 {
138 	int i, nloops;
139 
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)
145 			return 1;
146 	}
147 	dbg("gameport timed out after %d microseconds.\n", u_sec);
148 	return 0;
149 }
150 
151 /*
152  * Gets a 28-bit packet from the multiport.
153  *
154  * After getting a packet successfully, commands encoded by sendcode may
155  * be sent to the multiport.
156  *
157  * The multiport clock value is reflected in gameport bit B4.
158  *
159  * Returns a packet status code indicating whether packet is valid, the transfer
160  * mode, and any error conditions.
161  *
162  * sendflags:      current I/O status
163  * sendcode:   data to send to the multiport if sendflags is nonzero
164  */
165 
166 static int mp_io(struct gameport* gameport, int sendflags, int sendcode, u32 *packet)
167 {
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 */
173 	int i;
174 
175 	/* Gameport bits B0, B4, B5 should first be off, then B4 should come on. */
176 
177 	*packet = 0;
178 	raw_data = gameport_read(gameport);
179 	if (raw_data & 1)
180 		return IO_RETRY;
181 
182 	for (i = 0; i < 64; i++) {
183 		raw_data = gameport_read(gameport);
184 		portvals |= 1 << ((raw_data >> 4) & 3); /* Demux B4, B5 */
185 	}
186 
187 	if (portvals == 1) {                            /* B4, B5 off */
188 		raw_data = gameport_read(gameport);
189 		portvals = raw_data & 0xf0;
190 
191 		if (raw_data & 0x31)
192 			return IO_RESET;
193 		gameport_trigger(gameport);
194 
195 		if (!poll_until(0x10, 0, 308, gameport, &raw_data))
196 			return IO_RESET;
197 	} else
198 		return IO_RETRY;
199 
200 	/* Determine packet transfer mode and prepare for packet construction. */
201 
202 	if (raw_data & 0x20) {                 /* 3 data bits/read */
203 		portvals |= raw_data >> 4;     /* Compare B4-B7 before & after trigger */
204 
205 		if (portvals != 0xb)
206 			return 0;
207 		data_mask = 7;
208 		bits_per_read = 3;
209 		pkt = (PACKET_FULL | PACKET_IO_FAST) >> 28;
210 	} else {                                 /* 1 data bit/read */
211 		data_mask = 1;
212 		bits_per_read = 1;
213 		pkt = (PACKET_FULL | PACKET_IO_SLOW) >> 28;
214 	}
215 
216 	/* Construct a packet.  Final data bits must be zero. */
217 
218 	while (1) {
219 		if (!poll_until(0, 0x10, 77, gameport, &raw_data))
220 			return IO_RESET;
221 		raw_data = (raw_data >> 5) & data_mask;
222 
223 		if (pkt & PACKET_FULL)
224 			break;
225 		pkt = (pkt << bits_per_read) | raw_data;
226 
227 		if (!poll_until(0x10, 0, 77, gameport, &raw_data))
228 			return IO_RESET;
229 	}
230 
231 	if (raw_data)
232 		return IO_RESET;
233 
234 	/* If 3 bits/read used, drop from 30 bits to 28. */
235 
236 	if (bits_per_read == 3) {
237 		pkt = (pkt & 0xffff0000) | ((pkt << 1) & 0xffff);
238 		pkt = (pkt >> 2) | 0xf0000000;
239 	}
240 
241 	if (bit_parity(pkt) == 1)
242 		return IO_RESET;
243 
244 	/* Acknowledge packet receipt */
245 
246 	if (!poll_until(0x30, 0, 77, gameport, &raw_data))
247 		return IO_RESET;
248 
249 	raw_data = gameport_read(gameport);
250 
251 	if (raw_data & 1)
252 		return IO_RESET;
253 
254 	gameport_trigger(gameport);
255 
256 	if (!poll_until(0, 0x20, 77, gameport, &raw_data))
257 		return IO_RESET;
258 
259         /* Return if we just wanted the packet or multiport wants to send more */
260 
261 	*packet = pkt;
262 	if ((sendflags == 0) || ((sendflags & IO_RETRY) && !(pkt & PACKET_MP_DONE)))
263 		return IO_GOT_PACKET;
264 
265 	if (pkt & PACKET_MP_MORE)
266 		return IO_GOT_PACKET | IO_RETRY;
267 
268 	/* Multiport is done sending packets and is ready to receive data */
269 
270 	if (!poll_until(0x20, 0, 77, gameport, &raw_data))
271 		return IO_GOT_PACKET | IO_RESET;
272 
273 	raw_data = gameport_read(gameport);
274 	if (raw_data & 1)
275 		return IO_GOT_PACKET | IO_RESET;
276 
277 	/* Trigger gameport based on bits in sendcode */
278 
279 	gameport_trigger(gameport);
280 	do {
281 		if (!poll_until(0x20, 0x10, 116, gameport, &raw_data))
282 			return IO_GOT_PACKET | IO_RESET;
283 
284 		if (!poll_until(0x30, 0, 193, gameport, &raw_data))
285 			return IO_GOT_PACKET | IO_RESET;
286 
287 		if (raw_data & 1)
288 			return IO_GOT_PACKET | IO_RESET;
289 
290 		if (sendcode & 1)
291 			gameport_trigger(gameport);
292 
293 		sendcode >>= 1;
294 	} while (sendcode);
295 
296 	return IO_GOT_PACKET | IO_MODE_FAST;
297 }
298 
299 /*
300  * Disables and restores interrupts for mp_io(), which does the actual I/O.
301  */
302 
303 static int multiport_io(struct gameport* gameport, int sendflags, int sendcode, u32 *packet)
304 {
305 	int status;
306 	unsigned long flags;
307 
308 	local_irq_save(flags);
309 	status = mp_io(gameport, sendflags, sendcode, packet);
310 	local_irq_restore(flags);
311 
312 	return status;
313 }
314 
315 /*
316  * Puts multiport into digital mode.  Multiport LED turns green.
317  *
318  * Returns true if a valid digital packet was received, false otherwise.
319  */
320 
321 static int dig_mode_start(struct gameport *gameport, u32 *packet)
322 {
323 	int i;
324 	int flags, tries = 0, bads = 0;
325 
326 	for (i = 0; i < ARRAY_SIZE(init_seq); i++) {     /* Send magic sequence */
327 		if (init_seq[i])
328 			gameport_trigger(gameport);
329 		udelay(GRIP_INIT_DELAY);
330 	}
331 
332 	for (i = 0; i < 16; i++)            /* Wait for multiport to settle */
333 		udelay(GRIP_INIT_DELAY);
334 
335 	while (tries < 64 && bads < 8) {    /* Reset multiport and try getting a packet */
336 
337 		flags = multiport_io(gameport, IO_RESET, 0x27, packet);
338 
339 		if (flags & IO_MODE_FAST)
340 			return 1;
341 
342 		if (flags & IO_RETRY)
343 			tries++;
344 		else
345 			bads++;
346 	}
347 	return 0;
348 }
349 
350 /*
351  * Packet structure: B0-B15   => gamepad state
352  *                   B16-B20  => gamepad device type
353  *                   B21-B24  => multiport slot index (1-4)
354  *
355  * Known device types: 0x1f (grip pad), 0x0 (no device).  Others may exist.
356  *
357  * Returns the packet status.
358  */
359 
360 static int get_and_decode_packet(struct grip_mp *grip, int flags)
361 {
362 	struct grip_port *port;
363 	u32 packet;
364 	int joytype = 0;
365 	int slot;
366 
367 	/* Get a packet and check for validity */
368 
369 	flags &= IO_RESET | IO_RETRY;
370 	flags = multiport_io(grip->gameport, flags, 0, &packet);
371 	grip->reads++;
372 
373 	if (packet & PACKET_MP_DONE)
374 		flags |= IO_DONE;
375 
376 	if (flags && !(flags & IO_GOT_PACKET)) {
377 		grip->bads++;
378 		return flags;
379 	}
380 
381 	/* Ignore non-gamepad packets, e.g. multiport hardware version */
382 
383 	slot = ((packet >> 21) & 0xf) - 1;
384 	if ((slot < 0) || (slot > 3))
385 		return flags;
386 
387 	port = grip->port[slot];
388 
389 	/*
390 	 * Handle "reset" packets, which occur at startup, and when gamepads
391 	 * are removed or plugged in.  May contain configuration of a new gamepad.
392 	 */
393 
394 	joytype = (packet >> 16) & 0x1f;
395 	if (!joytype) {
396 
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;
402 		}
403 		dbg("Reset: grip multiport slot %d\n", slot);
404 		port->mode = GRIP_MODE_RESET;
405 		flags |= IO_SLOT_CHANGE;
406 		return flags;
407 	}
408 
409 	/* Interpret a grip pad packet */
410 
411 	if (joytype == 0x1f) {
412 
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;
417 		port->dirty = 1;
418 
419 		if (port->mode == GRIP_MODE_RESET)
420 			flags |= IO_SLOT_CHANGE;
421 
422 		port->mode = GRIP_MODE_GP;
423 
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;
428 				port->dirty = 0;
429 			}
430 		}
431 		return flags;
432 	}
433 
434 	/* Handle non-grip device codes.  For now, just print diagnostics. */
435 
436 	{
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;
442 		}
443 	}
444 	return flags;
445 }
446 
447 /*
448  * Returns true if all multiport slot states appear valid.
449  */
450 
451 static int slots_valid(struct grip_mp *grip)
452 {
453 	int flags, slot, invalid = 0, active = 0;
454 
455 	flags = get_and_decode_packet(grip, 0);
456 	if (!(flags & IO_GOT_PACKET))
457 		return 0;
458 
459 	for (slot = 0; slot < 4; slot++) {
460 		if (grip->port[slot]->mode == GRIP_MODE_RESET)
461 			invalid = 1;
462 		if (grip->port[slot]->mode != GRIP_MODE_NONE)
463 			active = 1;
464 	}
465 
466 	/* Return true if no active slot but multiport sent all its data */
467 	if (!active)
468 		return (flags & IO_DONE) ? 1 : 0;
469 
470 	/* Return false if invalid device code received */
471 	return invalid ? 0 : 1;
472 }
473 
474 /*
475  * Returns whether the multiport was placed into digital mode and
476  * able to communicate its state successfully.
477  */
478 
479 static int multiport_init(struct grip_mp *grip)
480 {
481 	int dig_mode, initialized = 0, tries = 0;
482 	u32 packet;
483 
484 	dig_mode = dig_mode_start(grip->gameport, &packet);
485 	while (!dig_mode && tries < 4) {
486 		dig_mode = dig_mode_start(grip->gameport, &packet);
487 		tries++;
488 	}
489 
490 	if (dig_mode)
491 		dbg("multiport_init(): digital mode activated.\n");
492 	else {
493 		dbg("multiport_init(): unable to activate digital mode.\n");
494 		return 0;
495 	}
496 
497 	/* Get packets, store multiport state, and check state's validity */
498 	for (tries = 0; tries < 4096; tries++) {
499 		if (slots_valid(grip)) {
500 			initialized = 1;
501 			break;
502 		}
503 	}
504 	dbg("multiport_init(): initialized == %d\n", initialized);
505 	return initialized;
506 }
507 
508 /*
509  * Reports joystick state to the linux input layer.
510  */
511 
512 static void report_slot(struct grip_mp *grip, int slot)
513 {
514 	struct grip_port *port = grip->port[slot];
515 	int i;
516 
517 	/* Store button states with linux input driver */
518 
519 	for (i = 0; i < 8; i++)
520 		input_report_key(port->dev, grip_btn_gp[i], (port->buttons >> i) & 1);
521 
522 	/* Store axis states with linux driver */
523 
524 	input_report_abs(port->dev, ABS_X, port->xaxes);
525 	input_report_abs(port->dev, ABS_Y, port->yaxes);
526 
527 	/* Tell the receiver of the events to process them */
528 
529 	input_sync(port->dev);
530 
531 	port->dirty = 0;
532 }
533 
534 /*
535  * Get the multiport state.
536  */
537 
538 static void grip_poll(struct gameport *gameport)
539 {
540 	struct grip_mp *grip = gameport_get_drvdata(gameport);
541 	int i, npkts, flags;
542 
543 	for (npkts = 0; npkts < 4; npkts++) {
544 		flags = IO_RETRY;
545 		for (i = 0; i < 32; i++) {
546 			flags = get_and_decode_packet(grip, flags);
547 			if ((flags & IO_GOT_PACKET) || !(flags & IO_RETRY))
548 				break;
549 		}
550 		if (flags & IO_DONE)
551 			break;
552 	}
553 
554 	for (i = 0; i < 4; i++)
555 		if (grip->port[i]->dirty)
556 			report_slot(grip, i);
557 }
558 
559 /*
560  * Called when a joystick device file is opened
561  */
562 
563 static int grip_open(struct input_dev *dev)
564 {
565 	struct grip_mp *grip = input_get_drvdata(dev);
566 
567 	gameport_start_polling(grip->gameport);
568 	return 0;
569 }
570 
571 /*
572  * Called when a joystick device file is closed
573  */
574 
575 static void grip_close(struct input_dev *dev)
576 {
577 	struct grip_mp *grip = input_get_drvdata(dev);
578 
579 	gameport_stop_polling(grip->gameport);
580 }
581 
582 /*
583  * Tell the linux input layer about a newly plugged-in gamepad.
584  */
585 
586 static int register_slot(int slot, struct grip_mp *grip)
587 {
588 	struct grip_port *port = grip->port[slot];
589 	struct input_dev *input_dev;
590 	int j, t;
591 	int err;
592 
593 	port->dev = input_dev = input_allocate_device();
594 	if (!input_dev)
595 		return -ENOMEM;
596 
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;
603 
604 	input_set_drvdata(input_dev, grip);
605 
606 	input_dev->open = grip_open;
607 	input_dev->close = grip_close;
608 
609 	input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
610 
611 	for (j = 0; (t = grip_abs[port->mode][j]) >= 0; j++)
612 		input_set_abs_params(input_dev, t, -1, 1, 0, 0);
613 
614 	for (j = 0; (t = grip_btn[port->mode][j]) >= 0; j++)
615 		if (t > 0)
616 			set_bit(t, input_dev->keybit);
617 
618 	err = input_register_device(port->dev);
619 	if (err) {
620 		input_free_device(port->dev);
621 		return err;
622 	}
623 
624 	port->registered = 1;
625 
626 	if (port->dirty)	            /* report initial state, if any */
627 		report_slot(grip, slot);
628 
629 	return 0;
630 }
631 
632 static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
633 {
634 	struct grip_mp *grip;
635 	int err;
636 
637 	if (!(grip = kzalloc(sizeof(struct grip_mp), GFP_KERNEL)))
638 		return -ENOMEM;
639 
640 	grip->gameport = gameport;
641 
642 	gameport_set_drvdata(gameport, grip);
643 
644 	err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW);
645 	if (err)
646 		goto fail1;
647 
648 	gameport_set_poll_handler(gameport, grip_poll);
649 	gameport_set_poll_interval(gameport, 20);
650 
651 	if (!multiport_init(grip)) {
652 		err = -ENODEV;
653 		goto fail2;
654 	}
655 
656 	if (!grip->port[0]->mode && !grip->port[1]->mode && !grip->port[2]->mode && !grip->port[3]->mode) {
657 		/* nothing plugged in */
658 		err = -ENODEV;
659 		goto fail2;
660 	}
661 
662 	return 0;
663 
664 fail2:	gameport_close(gameport);
665 fail1:	gameport_set_drvdata(gameport, NULL);
666 	kfree(grip);
667 	return err;
668 }
669 
670 static void grip_disconnect(struct gameport *gameport)
671 {
672 	struct grip_mp *grip = gameport_get_drvdata(gameport);
673 	int i;
674 
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);
680 	kfree(grip);
681 }
682 
683 static struct gameport_driver grip_drv = {
684 	.driver		= {
685 		.name	= "grip_mp",
686 	},
687 	.description	= DRIVER_DESC,
688 	.connect	= grip_connect,
689 	.disconnect	= grip_disconnect,
690 };
691 
692 static int __init grip_init(void)
693 {
694 	gameport_register_driver(&grip_drv);
695 	return 0;
696 }
697 
698 static void __exit grip_exit(void)
699 {
700 	gameport_unregister_driver(&grip_drv);
701 }
702 
703 module_init(grip_init);
704 module_exit(grip_exit);
705