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 游戏手柄有两个输入位,Clock 和 Latch,它们驱动串行传输。 它们分别连接到并行端口的引脚 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、选择和开始按钮,并且通过 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 (Gnd)

18 (Gnd)

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 允许该驱动程序与 Dance Dance Revolution 或类似游戏一起使用。 方向键注册为按键而不是 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

Saturn 游戏手柄(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

信号地

就这样,各位! 玩得开心!