mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-22 00:40:03 +00:00
![Lucas De Marchi](/assets/img/avatar_default.png)
Fixes generated by 'codespell' and manually reviewed. Signed-off-by: Lucas De Marchi <lucas.demarchi@profusion.mobi>
542 lines
20 KiB
Text
542 lines
20 KiB
Text
Linux Joystick parport drivers v2.0
|
|
(c) 1998-2000 Vojtech Pavlik <vojtech@ucw.cz>
|
|
(c) 1998 Andree Borrmann <a.borrmann@tu-bs.de>
|
|
Sponsored by SuSE
|
|
----------------------------------------------------------------------------
|
|
|
|
0. Disclaimer
|
|
~~~~~~~~~~~~~
|
|
Any information in this file is provided as-is, without any guarantee that
|
|
it will be true. So, use it at your own risk. The possible damages that can
|
|
happen include burning your parallel port, and/or the sticks and joystick
|
|
and maybe even more. Like when a lightning kills you it is not our problem.
|
|
|
|
1. Intro
|
|
~~~~~~~~
|
|
The joystick parport drivers are used for joysticks and gamepads not
|
|
originally designed for PCs and other computers Linux runs on. Because of
|
|
that, PCs usually lack the right ports to connect these devices to. Parallel
|
|
port, because of its ability to change single bits at will, and providing
|
|
both output and input bits is the most suitable port on the PC for
|
|
connecting such devices.
|
|
|
|
2. Devices supported
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
Many console and 8-bit computer gamepads and joysticks are supported. The
|
|
following subsections discuss usage of each.
|
|
|
|
2.1 NES and SNES
|
|
~~~~~~~~~~~~~~~~
|
|
The Nintendo Entertainment System and Super Nintendo Entertainment System
|
|
gamepads are widely available, and easy to get. Also, they are quite easy to
|
|
connect to a PC, and don't need much processing speed (108 us for NES and
|
|
165 us for SNES, compared to about 1000 us for PC gamepads) to communicate
|
|
with them.
|
|
|
|
All NES and SNES use the same synchronous serial protocol, clocked from
|
|
the computer's side (and thus timing insensitive). To allow up to 5 NES
|
|
and/or SNES gamepads and/or SNES mice connected to the parallel port at once,
|
|
the output lines of the parallel port are shared, while one of 5 available
|
|
input lines is assigned to each gamepad.
|
|
|
|
This protocol is handled by the gamecon.c driver, so that's the one
|
|
you'll use for NES, SNES gamepads and SNES mice.
|
|
|
|
The main problem with PC parallel ports is that they don't have +5V power
|
|
source on any of their pins. So, if you want a reliable source of power
|
|
for your pads, use either keyboard or joystick port, and make a pass-through
|
|
cable. You can also pull the power directly from the power supply (the red
|
|
wire is +5V).
|
|
|
|
If you want to use the parallel port only, you can take the power is from
|
|
some data pin. For most gamepad and parport implementations only one pin is
|
|
needed, and I'd recommend pin 9 for that, the highest data bit. On the other
|
|
hand, if you are not planning to use anything else than NES / SNES on the
|
|
port, anything between and including pin 4 and pin 9 will work.
|
|
|
|
(pin 9) -----> Power
|
|
|
|
Unfortunately, there are pads that need a lot more of power, and parallel
|
|
ports that can't give much current through the data pins. If this is your
|
|
case, you'll need to use diodes (as a prevention of destroying your parallel
|
|
port), and combine the currents of two or more data bits together.
|
|
|
|
Diodes
|
|
(pin 9) ----|>|-------+------> Power
|
|
|
|
|
(pin 8) ----|>|-------+
|
|
|
|
|
(pin 7) ----|>|-------+
|
|
|
|
|
<and so on> :
|
|
|
|
|
(pin 4) ----|>|-------+
|
|
|
|
Ground is quite easy. On PC's parallel port the ground is on any of the
|
|
pins from pin 18 to pin 25. So use any pin of these you like for the ground.
|
|
|
|
(pin 18) -----> Ground
|
|
|
|
NES and SNES pads have two input bits, Clock and Latch, which drive the
|
|
serial transfer. These are connected to pins 2 and 3 of the parallel port,
|
|
respectively.
|
|
|
|
(pin 2) -----> Clock
|
|
(pin 3) -----> Latch
|
|
|
|
And the last thing is the NES / SNES data wire. Only that isn't shared and
|
|
each pad needs its own data pin. The parallel port pins are:
|
|
|
|
(pin 10) -----> Pad 1 data
|
|
(pin 11) -----> Pad 2 data
|
|
(pin 12) -----> Pad 3 data
|
|
(pin 13) -----> Pad 4 data
|
|
(pin 15) -----> Pad 5 data
|
|
|
|
Note that pin 14 is not used, since it is not an input pin on the parallel
|
|
port.
|
|
|
|
This is everything you need on the PC's side of the connection, now on to
|
|
the gamepads side. The NES and SNES have different connectors. Also, there
|
|
are quite a lot of NES clones, and because Nintendo used proprietary
|
|
connectors for their machines, the cloners couldn't and used standard D-Cannon
|
|
connectors. Anyway, if you've got a gamepad, and it has buttons A, B, Turbo
|
|
A, Turbo B, Select and Start, and is connected through 5 wires, then it is
|
|
either a NES or NES clone and will work with this connection. SNES gamepads
|
|
also use 5 wires, but have more buttons. They will work as well, of course.
|
|
|
|
Pinout for NES gamepads Pinout for SNES gamepads and mice
|
|
|
|
+----> Power +-----------------------\
|
|
| 7 | o o o o | x x o | 1
|
|
5 +---------+ 7 +-----------------------/
|
|
| x x o \ | | | | |
|
|
| o o o o | | | | | +-> Ground
|
|
4 +------------+ 1 | | | +------------> Data
|
|
| | | | | | +---------------> Latch
|
|
| | | +-> Ground | +------------------> Clock
|
|
| | +----> Clock +---------------------> Power
|
|
| +-------> Latch
|
|
+----------> Data
|
|
|
|
Pinout for NES clone (db9) gamepads Pinout for NES clone (db15) gamepads
|
|
|
|
+---------> Clock +-----------------> Data
|
|
| +-------> Latch | +---> Ground
|
|
| | +-----> Data | |
|
|
| | | ___________________
|
|
_____________ 8 \ o x x x x x x o / 1
|
|
5 \ x o o o x / 1 \ o x x o x x o /
|
|
\ x o x o / 15 `~~~~~~~~~~~~~' 9
|
|
9 `~~~~~~~' 6 | | |
|
|
| | | | +----> Clock
|
|
| +----> Power | +----------> Latch
|
|
+--------> Ground +----------------> Power
|
|
|
|
2.2 Multisystem joysticks
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
In the era of 8-bit machines, there was something like de-facto standard
|
|
for joystick ports. They were all digital, and all used D-Cannon 9 pin
|
|
connectors (db9). Because of that, a single joystick could be used without
|
|
hassle on Atari (130, 800XE, 800XL, 2600, 7200), Amiga, Commodore C64,
|
|
Amstrad CPC, Sinclair ZX Spectrum and many other machines. That's why these
|
|
joysticks are called "Multisystem".
|
|
|
|
Now their pinout:
|
|
|
|
+---------> Right
|
|
| +-------> Left
|
|
| | +-----> Down
|
|
| | | +---> Up
|
|
| | | |
|
|
_____________
|
|
5 \ x o o o o / 1
|
|
\ x o x o /
|
|
9 `~~~~~~~' 6
|
|
| |
|
|
| +----> Button
|
|
+--------> Ground
|
|
|
|
However, as time passed, extensions to this standard developed, and these
|
|
were not compatible with each other:
|
|
|
|
|
|
Atari 130, 800/XL/XE MSX
|
|
|
|
+-----------> Power
|
|
+---------> Right | +---------> Right
|
|
| +-------> Left | | +-------> Left
|
|
| | +-----> Down | | | +-----> Down
|
|
| | | +---> Up | | | | +---> Up
|
|
| | | | | | | | |
|
|
_____________ _____________
|
|
5 \ x o o o o / 1 5 \ o o o o o / 1
|
|
\ x o o o / \ o o o o /
|
|
9 `~~~~~~~' 6 9 `~~~~~~~' 6
|
|
| | | | | | |
|
|
| | +----> Button | | | +----> Button 1
|
|
| +------> Power | | +------> Button 2
|
|
+--------> Ground | +--------> Output 3
|
|
+----------> Ground
|
|
|
|
Amstrad CPC Commodore C64
|
|
|
|
+-----------> Analog Y
|
|
+---------> Right | +---------> Right
|
|
| +-------> Left | | +-------> Left
|
|
| | +-----> Down | | | +-----> Down
|
|
| | | +---> Up | | | | +---> Up
|
|
| | | | | | | | |
|
|
_____________ _____________
|
|
5 \ x o o o o / 1 5 \ o o o o o / 1
|
|
\ x o o o / \ o o o o /
|
|
9 `~~~~~~~' 6 9 `~~~~~~~' 6
|
|
| | | | | | |
|
|
| | +----> Button 1 | | | +----> Button
|
|
| +------> Button 2 | | +------> Power
|
|
+--------> Ground | +--------> Ground
|
|
+----------> Analog X
|
|
|
|
Sinclair Spectrum +2A/+3 Amiga 1200
|
|
|
|
+-----------> Up +-----------> Button 3
|
|
| +---------> Fire | +---------> Right
|
|
| | | | +-------> Left
|
|
| | +-----> Ground | | | +-----> Down
|
|
| | | | | | | +---> Up
|
|
| | | | | | | |
|
|
_____________ _____________
|
|
5 \ o o x o x / 1 5 \ o o o o o / 1
|
|
\ o o o o / \ o o o o /
|
|
9 `~~~~~~~' 6 9 `~~~~~~~' 6
|
|
| | | | | | | |
|
|
| | | +----> Right | | | +----> Button 1
|
|
| | +------> Left | | +------> Power
|
|
| +--------> Ground | +--------> Ground
|
|
+----------> Down +----------> Button 2
|
|
|
|
And there were many others.
|
|
|
|
2.2.1 Multisystem joysticks using db9.c
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
For the Multisystem joysticks, and their derivatives, the db9.c driver
|
|
was written. It allows only one joystick / gamepad per parallel port, but
|
|
the interface is easy to build and works with almost anything.
|
|
|
|
For the basic 1-button Multisystem joystick you connect its wires to the
|
|
parallel port like this:
|
|
|
|
(pin 1) -----> Power
|
|
(pin 18) -----> Ground
|
|
|
|
(pin 2) -----> Up
|
|
(pin 3) -----> Down
|
|
(pin 4) -----> Left
|
|
(pin 5) -----> Right
|
|
(pin 6) -----> Button 1
|
|
|
|
However, if the joystick is switch based (eg. clicks when you move it),
|
|
you might or might not, depending on your parallel port, need 10 kOhm pullup
|
|
resistors on each of the direction and button signals, like this:
|
|
|
|
(pin 2) ------------+------> Up
|
|
Resistor |
|
|
(pin 1) --[10kOhm]--+
|
|
|
|
Try without, and if it doesn't work, add them. For TTL based joysticks /
|
|
gamepads the pullups are not needed.
|
|
|
|
For joysticks with two buttons you connect the second button to pin 7 on
|
|
the parallel port.
|
|
|
|
(pin 7) -----> Button 2
|
|
|
|
And that's it.
|
|
|
|
On a side note, if you have already built a different adapter for use with
|
|
the digital joystick driver 0.8.0.2, this is also supported by the db9.c
|
|
driver, as device type 8. (See section 3.2)
|
|
|
|
2.2.2 Multisystem joysticks using gamecon.c
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
For some people just one joystick per parallel port is not enough, and/or
|
|
want to use them on one parallel port together with NES/SNES/PSX pads. This is
|
|
possible using the gamecon.c. It supports up to 5 devices of the above types,
|
|
including 1 and 2 buttons Multisystem joysticks.
|
|
|
|
However, there is nothing for free. To allow more sticks to be used at
|
|
once, you need the sticks to be purely switch based (that is non-TTL), and
|
|
not to need power. Just a plain simple six switches inside. If your
|
|
joystick can do more (eg. turbofire) you'll need to disable it totally first
|
|
if you want to use gamecon.c.
|
|
|
|
Also, the connection is a bit more complex. You'll need a bunch of diodes,
|
|
and one pullup resistor. First, you connect the Directions and the button
|
|
the same as for db9, however with the diodes between.
|
|
|
|
Diodes
|
|
(pin 2) -----|<|----> Up
|
|
(pin 3) -----|<|----> Down
|
|
(pin 4) -----|<|----> Left
|
|
(pin 5) -----|<|----> Right
|
|
(pin 6) -----|<|----> Button 1
|
|
|
|
For two button sticks you also connect the other button.
|
|
|
|
(pin 7) -----|<|----> Button 2
|
|
|
|
And finally, you connect the Ground wire of the joystick, like done in
|
|
this little schematic to Power and Data on the parallel port, as described
|
|
for the NES / SNES pads in section 2.1 of this file - that is, one data pin
|
|
for each joystick. The power source is shared.
|
|
|
|
Data ------------+-----> Ground
|
|
Resistor |
|
|
Power --[10kOhm]--+
|
|
|
|
And that's all, here we go!
|
|
|
|
2.2.3 Multisystem joysticks using turbografx.c
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
The TurboGraFX interface, designed by
|
|
|
|
Steffen Schwenke <schwenke@burg-halle.de>
|
|
|
|
allows up to 7 Multisystem joysticks connected to the parallel port. In
|
|
Steffen's version, there is support for up to 5 buttons per joystick. However,
|
|
since this doesn't work reliably on all parallel ports, the turbografx.c driver
|
|
supports only one button per joystick. For more information on how to build the
|
|
interface, see
|
|
|
|
http://www2.burg-halle.de/~schwenke/parport.html
|
|
|
|
2.3 Sony Playstation
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The PSX controller is supported by the gamecon.c. Pinout of the PSX
|
|
controller (compatible with DirectPadPro):
|
|
|
|
+---------+---------+---------+
|
|
9 | o o o | o o o | o o o | 1 parallel
|
|
\________|_________|________/ port pins
|
|
| | | | | |
|
|
| | | | | +--------> Clock --- (4)
|
|
| | | | +------------> Select --- (3)
|
|
| | | +---------------> Power --- (5-9)
|
|
| | +------------------> Ground --- (18-25)
|
|
| +-------------------------> Command --- (2)
|
|
+----------------------------> Data --- (one of 10,11,12,13,15)
|
|
|
|
The driver supports these controllers:
|
|
|
|
* Standard PSX Pad
|
|
* NegCon PSX Pad
|
|
* Analog PSX Pad (red mode)
|
|
* Analog PSX Pad (green mode)
|
|
* PSX Rumble Pad
|
|
* PSX DDR Pad
|
|
|
|
2.4 Sega
|
|
~~~~~~~~
|
|
All the Sega controllers are more or less based on the standard 2-button
|
|
Multisystem joystick. However, since they don't use switches and use TTL
|
|
logic, the only driver usable with them is the db9.c driver.
|
|
|
|
2.4.1 Sega Master System
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
The SMS gamepads are almost exactly the same as normal 2-button
|
|
Multisystem joysticks. Set the driver to Multi2 mode, use the corresponding
|
|
parallel port pins, and the following schematic:
|
|
|
|
+-----------> Power
|
|
| +---------> Right
|
|
| | +-------> Left
|
|
| | | +-----> Down
|
|
| | | | +---> Up
|
|
| | | | |
|
|
_____________
|
|
5 \ o o o o o / 1
|
|
\ o o x o /
|
|
9 `~~~~~~~' 6
|
|
| | |
|
|
| | +----> Button 1
|
|
| +--------> Ground
|
|
+----------> Button 2
|
|
|
|
2.4.2 Sega Genesis aka MegaDrive
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
The Sega Genesis (in Europe sold as Sega MegaDrive) pads are an extension
|
|
to the Sega Master System pads. They use more buttons (3+1, 5+1, 6+1). Use
|
|
the following schematic:
|
|
|
|
+-----------> Power
|
|
| +---------> Right
|
|
| | +-------> Left
|
|
| | | +-----> Down
|
|
| | | | +---> Up
|
|
| | | | |
|
|
_____________
|
|
5 \ o o o o o / 1
|
|
\ o o o o /
|
|
9 `~~~~~~~' 6
|
|
| | | |
|
|
| | | +----> Button 1
|
|
| | +------> Select
|
|
| +--------> Ground
|
|
+----------> Button 2
|
|
|
|
The Select pin goes to pin 14 on the parallel port.
|
|
|
|
(pin 14) -----> Select
|
|
|
|
The rest is the same as for Multi2 joysticks using db9.c
|
|
|
|
2.4.3 Sega Saturn
|
|
~~~~~~~~~~~~~~~~~
|
|
Sega Saturn has eight buttons, and to transfer that, without hacks like
|
|
Genesis 6 pads use, it needs one more select pin. Anyway, it is still
|
|
handled by the db9.c driver. Its pinout is very different from anything
|
|
else. Use this schematic:
|
|
|
|
+-----------> Select 1
|
|
| +---------> Power
|
|
| | +-------> Up
|
|
| | | +-----> Down
|
|
| | | | +---> Ground
|
|
| | | | |
|
|
_____________
|
|
5 \ o o o o o / 1
|
|
\ o o o o /
|
|
9 `~~~~~~~' 6
|
|
| | | |
|
|
| | | +----> Select 2
|
|
| | +------> Right
|
|
| +--------> Left
|
|
+----------> Power
|
|
|
|
Select 1 is pin 14 on the parallel port, Select 2 is pin 16 on the
|
|
parallel port.
|
|
|
|
(pin 14) -----> Select 1
|
|
(pin 16) -----> Select 2
|
|
|
|
The other pins (Up, Down, Right, Left, Power, Ground) are the same as for
|
|
Multi joysticks using db9.c
|
|
|
|
3. The drivers
|
|
~~~~~~~~~~~~~~
|
|
There are three drivers for the parallel port interfaces. Each, as
|
|
described above, allows to connect a different group of joysticks and pads.
|
|
Here are described their command lines:
|
|
|
|
3.1 gamecon.c
|
|
~~~~~~~~~~~~~
|
|
Using gamecon.c you can connect up to five devices to one parallel port. It
|
|
uses the following kernel/module command line:
|
|
|
|
gamecon.map=port,pad1,pad2,pad3,pad4,pad5
|
|
|
|
Where 'port' the number of the parport interface (eg. 0 for parport0).
|
|
|
|
And 'pad1' to 'pad5' are pad types connected to different data input pins
|
|
(10,11,12,13,15), as described in section 2.1 of this file.
|
|
|
|
The types are:
|
|
|
|
Type | Joystick/Pad
|
|
--------------------
|
|
0 | None
|
|
1 | SNES pad
|
|
2 | NES pad
|
|
4 | Multisystem 1-button joystick
|
|
5 | Multisystem 2-button joystick
|
|
6 | N64 pad
|
|
7 | Sony PSX controller
|
|
8 | Sony PSX DDR controller
|
|
9 | SNES mouse
|
|
|
|
The exact type of the PSX controller type is autoprobed when used, so
|
|
hot swapping should work (but is not recommended).
|
|
|
|
Should you want to use more than one of parallel ports at once, you can use
|
|
gamecon.map2 and gamecon.map3 as additional command line parameters for two
|
|
more parallel ports.
|
|
|
|
There are two options specific to PSX driver portion. gamecon.psx_delay sets
|
|
the command delay when talking to the controllers. The default of 25 should
|
|
work but you can try lowering it for better performance. If your pads don't
|
|
respond try raising it until they work. Setting the type to 8 allows the
|
|
driver to be used with Dance Dance Revolution or similar games. Arrow keys are
|
|
registered as key presses instead of X and Y axes.
|
|
|
|
3.2 db9.c
|
|
~~~~~~~~~
|
|
Apart from making an interface, there is nothing difficult on using the
|
|
db9.c driver. It uses the following kernel/module command line:
|
|
|
|
db9.dev=port,type
|
|
|
|
Where 'port' is the number of the parport interface (eg. 0 for parport0).
|
|
|
|
Caveat here: This driver only works on bidirectional parallel ports. If
|
|
your parallel port is recent enough, you should have no trouble with this.
|
|
Old parallel ports may not have this feature.
|
|
|
|
'Type' is the type of joystick or pad attached:
|
|
|
|
Type | Joystick/Pad
|
|
--------------------
|
|
0 | None
|
|
1 | Multisystem 1-button joystick
|
|
2 | Multisystem 2-button joystick
|
|
3 | Genesis pad (3+1 buttons)
|
|
5 | Genesis pad (5+1 buttons)
|
|
6 | Genesis pad (6+2 buttons)
|
|
7 | Saturn pad (8 buttons)
|
|
8 | Multisystem 1-button joystick (v0.8.0.2 pin-out)
|
|
9 | Two Multisystem 1-button joysticks (v0.8.0.2 pin-out)
|
|
10 | Amiga CD32 pad
|
|
|
|
Should you want to use more than one of these joysticks/pads at once, you
|
|
can use db9.dev2 and db9.dev3 as additional command line parameters for two
|
|
more joysticks/pads.
|
|
|
|
3.3 turbografx.c
|
|
~~~~~~~~~~~~~~~~
|
|
The turbografx.c driver uses a very simple kernel/module command line:
|
|
|
|
turbografx.map=port,js1,js2,js3,js4,js5,js6,js7
|
|
|
|
Where 'port' is the number of the parport interface (eg. 0 for parport0).
|
|
|
|
'jsX' is the number of buttons the Multisystem joysticks connected to the
|
|
interface ports 1-7 have. For a standard multisystem joystick, this is 1.
|
|
|
|
Should you want to use more than one of these interfaces at once, you can
|
|
use turbografx.map2 and turbografx.map3 as additional command line parameters
|
|
for two more interfaces.
|
|
|
|
3.4 PC parallel port pinout
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
.----------------------------------------.
|
|
At the PC: \ 13 12 11 10 9 8 7 6 5 4 3 2 1 /
|
|
\ 25 24 23 22 21 20 19 18 17 16 15 14 /
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Pin | Name | Description
|
|
~~~~~~|~~~~~~~~~|~~~~~~~~~~
|
|
1 | /STROBE | Strobe
|
|
2-9 | D0-D7 | Data Bit 0-7
|
|
10 | /ACK | Acknowledge
|
|
11 | BUSY | Busy
|
|
12 | PE | Paper End
|
|
13 | SELIN | Select In
|
|
14 | /AUTOFD | Autofeed
|
|
15 | /ERROR | Error
|
|
16 | /INIT | Initialize
|
|
17 | /SEL | Select
|
|
18-25 | GND | Signal Ground
|
|
|
|
3.5 End
|
|
~~~~~~~
|
|
That's all, folks! Have fun!
|