11. 并口游戏杆驱动程序

版权:

© 1998-2000 Vojtech Pavlik <vojtech@ucw.cz>

版权:

© 1998 Andree Borrmann <a.borrmann@tu-bs.de>

由 SuSE 赞助

11.1. 免责声明

此文件中的任何信息均按“原样”提供,不保证其真实性。因此,您需要自行承担使用风险。可能发生的损坏包括烧毁您的并口和/或摇杆和游戏杆,甚至可能更多。例如,当闪电击中您导致死亡时,这不是我们的问题。

11.2. 简介

并口游戏杆驱动程序用于并非最初为 PC 和其他运行 Linux 的计算机设计的游戏杆和游戏手柄。因此,PC 通常缺少将这些设备连接到的正确端口。并口由于其能够随意更改单个位,并提供输出和输入位,因此是 PC 上连接此类设备的最合适的端口。

11.3. 支持的设备

支持许多控制台和 8 位计算机游戏手柄和游戏杆。以下小节讨论每种设备的使用方法。

11.3.1. NES 和 SNES

任天堂娱乐系统和超级任天堂娱乐系统的游戏手柄广泛可用,并且易于获取。此外,它们很容易连接到 PC,并且不需要太多的处理速度(NES 为 108 微秒,SNES 为 165 微秒,而 PC 游戏手柄约为 1000 微秒)即可与它们通信。

所有 NES 和 SNES 都使用相同的同步串行协议,由计算机端时钟控制(因此对时序不敏感)。为了允许最多 5 个 NES 和/或 SNES 游戏手柄和/或 SNES 鼠标同时连接到并口,并口的输出线是共享的,而 5 个可用输入线之一分配给每个游戏手柄。

该协议由 gamecon.c 驱动程序处理,因此这是您将用于 NES、SNES 游戏手柄和 SNES 鼠标的驱动程序。

PC 并口的主要问题是它们的任何引脚上都没有 +5V 电源。因此,如果您想为您的游戏手柄提供可靠的电源,请使用键盘或游戏杆端口,并制作一个直通电缆。您也可以直接从电源(红色导线为 +5V)取电。

如果您只想使用并口,则可以从某些数据引脚取电。对于大多数游戏手柄和并口实现,只需要一个引脚,我建议使用引脚 9,即最高数据位。另一方面,如果您不打算在端口上使用 NES / SNES 以外的任何东西,则引脚 4 到引脚 9(包括 4 和 9)之间的任何引脚都可以工作。

(pin 9) -----> Power

不幸的是,有些游戏手柄需要更多的电源,而并口无法通过数据引脚提供太多电流。如果出现这种情况,您需要使用二极管(以防止损坏您的并口),并将两个或多个数据位的电流组合在一起。

          Diodes
(pin 9) ----|>|-------+------> Power
                    |
(pin 8) ----|>|-------+
                    |
(pin 7) ----|>|-------+
                    |
<and so on>         :
                    |
(pin 4) ----|>|-------+

接地很容易。在 PC 的并口上,地线位于引脚 18 到引脚 25 的任何引脚上。因此,请使用您喜欢的这些引脚中的任何一个作为地线。

(pin 18) -----> Ground

NES 和 SNES 游戏手柄有两个输入位:时钟和锁存,它们驱动串行传输。它们分别连接到并口的引脚 2 和引脚 3。

(pin 2) -----> Clock
(pin 3) -----> Latch

最后是 NES / SNES 数据线。只有这根线不是共享的,每个游戏手柄都需要自己的数据引脚。并口引脚如下

(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

请注意,引脚 14 未使用,因为它不是并口上的输入引脚。

这就是您在 PC 端连接所需的一切,现在转到游戏手柄端。NES 和 SNES 具有不同的连接器。此外,还有很多 NES 克隆产品,由于任天堂在其机器上使用了专有连接器,克隆者无法使用,因此使用了标准 D-Cannon 连接器。无论如何,如果您有一个游戏手柄,并且它有 A、B、Turbo A、Turbo B、Select 和 Start 按钮,并通过 5 根线连接,那么它要么是 NES,要么是 NES 克隆产品,可以使用此连接。SNES 游戏手柄也使用 5 根线,但有更多按钮。当然,它们也可以正常工作。

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

11.3.2. 多系统游戏杆

在 8 位机器时代,游戏杆端口存在某种事实上的标准。它们都是数字的,并且都使用 D-Cannon 9 针连接器 (db9)。因此,一个游戏杆可以毫无问题地用于 Atari(130、800XE、800XL、2600、7200)、Amiga、Commodore C64、Amstrad CPC、Sinclair ZX Spectrum 和许多其他机器。这就是这些游戏杆被称为“多系统”的原因。

现在介绍它们的引脚

      +---------> Right
      | +-------> Left
      | | +-----> Down
      | | | +---> Up
      | | | |
  _____________
5 \ x o o o o / 1
   \ x o x o /
  9 `~~~~~~~' 6
       |   |
       |   +----> Button
       +--------> Ground

但是,随着时间的推移,这个标准出现了扩展,并且这些扩展彼此不兼容

        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.

11.3.2.1. 使用 db9.c 的多系统游戏杆

对于多系统游戏杆及其衍生产品,编写了 db9.c 驱动程序。它每个并口只允许一个游戏杆/游戏手柄,但接口易于构建并且几乎适用于任何东西。

对于基本的 1 按钮多系统游戏杆,您将其导线连接到并口,如下所示

(pin  1) -----> Power
(pin 18) -----> Ground

(pin  2) -----> Up
(pin  3) -----> Down
(pin  4) -----> Left
(pin  5) -----> Right
(pin  6) -----> Button 1

但是,如果游戏杆是基于开关的(例如,当您移动它时会发出咔哒声),则根据您的并口,您可能需要或可能不需要在每个方向和按钮信号上使用 10 kOhm 上拉电阻,如下所示

(pin 2) ------------+------> Up
          Resistor  |
(pin 1) --[10kOhm]--+

先不使用尝试,如果不起作用,请添加它们。对于基于 TTL 的游戏杆/游戏手柄,不需要上拉电阻。

对于带有两个按钮的游戏杆,您将第二个按钮连接到并口上的引脚 7

(pin 7) -----> Button 2

就是这样。

另外,如果您已经构建了不同的适配器以用于数字游戏杆驱动程序 0.8.0.2,则 db9.c 驱动程序也支持它,作为设备类型 8。(请参阅第 3.2 节)

11.3.2.2. 使用 gamecon.c 的多系统游戏杆

对于某些人来说,每个并口只有一个游戏杆是不够的,和/或想在同一个并口上与 NES/SNES/PSX 游戏手柄一起使用。这可以使用 gamecon.c 来实现。它支持最多 5 个上述类型的设备,包括 1 和 2 个按钮的多系统游戏杆。

但是,没有什么是免费的。为了允许同时使用更多游戏杆,您需要游戏杆纯粹是基于开关的(即非 TTL),并且不需要电源。内部只有六个简单的开关。如果您的游戏杆可以做更多的事情(例如,连发),如果您想使用 gamecon.c,您需要首先完全禁用它。

此外,连接稍微复杂一些。您需要一堆二极管和一个上拉电阻。首先,您将方向和按钮连接方式与 db9 相同,但之间带有二极管

            Diodes
(pin 2) -----|<|----> Up
(pin 3) -----|<|----> Down
(pin 4) -----|<|----> Left
(pin 5) -----|<|----> Right
(pin 6) -----|<|----> Button 1

对于两个按钮的游戏杆,您还可以连接另一个按钮

(pin 7) -----|<|----> Button 2

最后,您连接游戏杆的接地线,就像此小原理图中所示,连接到并口上的电源和数据,如本文件的第 2.1 节中针对 NES / SNES 游戏手柄所述 - 即每个游戏杆一个数据引脚。电源是共享的

Data    ------------+-----> Ground
          Resistor  |
Power   --[10kOhm]--+

就这样,我们开始吧!

11.3.2.3. 使用 turbografx.c 的多系统游戏杆

TurboGraFX 接口,由

Steffen Schwenke <schwenke@burg-halle.de>设计

允许将最多 7 个多系统游戏杆连接到并口。在 Steffen 的版本中,每个游戏杆最多支持 5 个按钮。但是,由于这并非在所有并口上都可靠地工作,因此 turbografx.c 驱动程序每个游戏杆仅支持一个按钮。有关如何构建接口的更多信息,请参阅

11.3.3. 索尼 PlayStation

PSX 控制器由 gamecon.c 支持。PSX 控制器的引脚(与 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)

该驱动程序支持这些控制器

  • 标准 PSX 游戏手柄

  • NegCon PSX 游戏手柄

  • 模拟 PSX 游戏手柄(红色模式)

  • 模拟 PSX 游戏手柄(绿色模式)

  • PSX 震动游戏手柄

  • PSX DDR 游戏手柄

11.3.4. 世嘉

所有世嘉控制器或多或少都基于标准的 2 按钮多系统游戏杆。但是,由于它们不使用开关并使用 TTL 逻辑,因此唯一可用的驱动程序是 db9.c 驱动程序。

11.3.4.1. 世嘉 Master System

SMS 游戏手柄几乎与普通的 2 按钮多系统游戏杆完全相同。将驱动程序设置为 Multi2 模式,使用相应的并口引脚和以下原理图

    +-----------> Power
    | +---------> Right
    | | +-------> Left
    | | | +-----> Down
    | | | | +---> Up
    | | | | |
  _____________
5 \ o o o o o / 1
   \ o o x o /
  9 `~~~~~~~' 6
     | |   |
     | |   +----> Button 1
     | +--------> Ground
     +----------> Button 2

11.3.4.2. 世嘉 Genesis(又名 MegaDrive)

世嘉 Genesis(在欧洲以世嘉 MegaDrive 的名称销售)游戏手柄是世嘉 Master System 游戏手柄的扩展。它们使用更多按钮(3+1、5+1、6+1)。使用以下原理图

    +-----------> Power
    | +---------> Right
    | | +-------> Left
    | | | +-----> Down
    | | | | +---> Up
    | | | | |
  _____________
5 \ o o o o o / 1
   \ o o o o /
  9 `~~~~~~~' 6
    | | | |
    | | | +----> Button 1
    | | +------> Select
    | +--------> Ground
    +----------> Button 2

选择引脚连接到并口上的引脚 14

(pin 14) -----> Select

其余与使用 db9.c 的 Multi2 游戏杆相同

11.3.4.3. 世嘉 Saturn

世嘉 Saturn 有八个按钮,为了传输这些按钮,无需像 Genesis 6 游戏手柄那样使用黑客,它需要一个额外的选择引脚。无论如何,它仍然由 db9.c 驱动程序处理。它的引脚与任何其他设备都非常不同。使用此原理图

    +-----------> Select 1
    | +---------> Power
    | | +-------> Up
    | | | +-----> Down
    | | | | +---> Ground
    | | | | |
  _____________
5 \ o o o o o / 1
   \ o o o o /
  9 `~~~~~~~' 6
     | | | |
     | | | +----> Select 2
     | | +------> Right
     | +--------> Left
     +----------> Power

选择 1 是并口上的引脚 14,选择 2 是并口上的引脚 16

(pin 14) -----> Select 1
(pin 16) -----> Select 2

其他引脚(上、下、右、左、电源、地线)与使用 db9.c 的 Multi 游戏杆相同

11.3.5. Amiga CD32

Amiga CD32 游戏手柄使用以下引脚

    +-----------> Button 3
    | +---------> Right
    | | +-------> Left
    | | | +-----> Down
    | | | | +---> Up
    | | | | |
  _____________
5 \ o o o o o / 1
   \ o o o o /
  9 `~~~~~~~' 6
    | | | |
    | | | +----> Button 1
    | | +------> Power
    | +--------> Ground
    +----------> Button 2

它可以连接到并口并由 db9.c 驱动程序驱动。它需要以下接线

CD32 游戏手柄

并口

1(上)

2 (D0)

2(下)

3 (D1)

3(左)

4 (D2)

4(右)

5(D3)

5(按钮 3)

14(AUTOFD)

6(按钮 1)

17(SELIN)

7(+5V)

1(STROBE)

8(接地)

18(接地)

9(按钮 2)

7(D5)

11.4. 驱动程序

并行端口接口有三个驱动程序。如上所述,每个驱动程序都允许连接不同组的操纵杆和游戏手柄。以下是它们的命令行描述

11.4.1. gamecon.c

使用 gamecon.c,您可以将最多五个设备连接到一个并行端口。它使用以下内核/模块命令行

gamecon.map=port,pad1,pad2,pad3,pad4,pad5

其中 port 是并行端口接口的编号(例如,parport0 为 0)。

pad1pad5 是连接到不同数据输入引脚(10、11、12、13、15)的游戏手柄类型,如本文件第 2.1 节所述。

类型包括

类型

操纵杆/游戏手柄

0

1

SNES 游戏手柄

2

NES 游戏手柄

4

多系统 1 按钮操纵杆

5

多系统 2 按钮操纵杆

6

N64 游戏手柄

7

索尼 PSX 控制器

8

索尼 PSX DDR 控制器

9

SNES 鼠标

PSX 控制器的确切类型在使用时会自动探测,因此热插拔应该可以工作(但不建议)。

如果您想同时使用多个并行端口,可以使用 gamecon.map2 和 gamecon.map3 作为另外两个并行端口的附加命令行参数。

PSX 驱动程序部分有两个特定选项。gamecon.psx_delay 设置与控制器通信时的命令延迟。默认值 25 应该可以工作,但您可以尝试降低它以获得更好的性能。如果您的游戏手柄没有响应,请尝试将其提高直到它们工作。将类型设置为 8 允许驱动程序用于舞动革命或类似游戏。方向键被注册为按键而不是 X 和 Y 轴。

11.4.2. db9.c

除了制作接口之外,使用 db9.c 驱动程序没有什么困难。它使用以下内核/模块命令行

db9.dev=port,type

其中 port 是并行端口接口的编号(例如,parport0 为 0)。

需要注意的是:此驱动程序仅适用于双向并行端口。如果您的并行端口足够新,您应该不会遇到任何问题。旧的并行端口可能没有此功能。

Type 是连接的操纵杆或游戏手柄的类型

类型

操纵杆/游戏手柄

0

1

多系统 1 按钮操纵杆

2

多系统 2 按钮操纵杆

3

世嘉 Genesis 游戏手柄(3+1 按钮)

5

世嘉 Genesis 游戏手柄(5+1 按钮)

6

世嘉 Genesis 游戏手柄(6+2 按钮)

7

土星游戏手柄(8 按钮)

8

多系统 1 按钮操纵杆(v0.8.0.2 引脚排列)

9

两个多系统 1 按钮操纵杆(v0.8.0.2 引脚排列)

10

Amiga CD32 游戏手柄

如果您想同时使用多个这些操纵杆/游戏手柄,可以使用 db9.dev2 和 db9.dev3 作为另外两个操纵杆/游戏手柄的附加命令行参数。

11.4.3. turbografx.c

turbografx.c 驱动程序使用非常简单的内核/模块命令行

turbografx.map=port,js1,js2,js3,js4,js5,js6,js7

其中 port 是并行端口接口的编号(例如,parport0 为 0)。

jsX 是连接到接口端口 1-7 的多系统操纵杆具有的按钮数量。对于标准多系统操纵杆,此值为 1。

如果您想同时使用多个这些接口,可以使用 turbografx.map2 和 turbografx.map3 作为另外两个接口的附加命令行参数。

11.5. PC 并行端口引脚排列

               .----------------------------------------.
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 /
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

引脚

名称

描述

1

/STROBE

选通

2-9

D0-D7

数据位 0-7

10

/ACK

确认

11

BUSY

12

PE

纸张末尾

13

SELIN

选择输入

14

/AUTOFD

自动进纸

15

/ERROR

错误

16

/INIT

初始化

17

/SEL

选择

18-25

GND

信号地

就这些了,伙计们!玩得开心!