Linux 上的 Gameport 操纵杆

Linux 上的 Gameport 操纵杆

我在一家二手商店买了一个 Logitech Wingman Extreme Digital 操纵杆,然后四处寻找,找到了一个带有 Gameport 端口的旧 PCI 声卡

将声卡插入电脑并确认声卡工作正常(将声音输出到扬声器)后,我将操纵杆插入 Gameport,但 Linux 根本无法检测到操纵杆

“lspci” 给出了声卡信息

05:06.0 Multimedia audio controller: C-Media Electronics Inc CMI8738/CMI8768 PCI Audio (rev 10)

我使用“modprobe”加载“joydev”、“gameport”、“adi”、“ns558”、“snd_cmipci”和“analog”,但无济于事

“jstest /dev/input/jsX”,其中 X 是 0 到 10,每次都给出“jstest:没有这样的设备或地址”

有人知道如何让这个设备在 Linux 中工作吗?我看过一些指南,但它们都给了我上面尝试过的相同步骤

系统信息

  • 发行版-Manjaro
  • 内核——4.9.13-1-MANJARO

lspci -n -v -s 05:06.0编辑:这是和的输出aplay -l

05:06.0 0401: 13f6:0111 (rev 10)
Subsystem: 13f6:0111
Flags: bus master, stepping, medium devsel, latency 32, IRQ 20, NUMA node 0
I/O ports at ae00 [size=256]
Capabilities: [c0] Power Management version 2
Kernel driver in use: snd_cmipci
Kernel modules: snd_cmipci

sudo modprobe snd_cmipci joystick_port=1什么也不做,joystick_port=ae00

以下是输出aplay -l

**** List of PLAYBACK Hardware Devices ****
card 0: CMI8738 [C-Media CMI8738], device 0: CMI8738 [C-Media PCI DAC/ADC]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: CMI8738 [C-Media CMI8738], device 1: CMI8738 [C-Media PCI 2nd DAC]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: CMI8738 [C-Media CMI8738], device 2: CMI8738 [C-Media PCI IEC958]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: SB [HDA ATI SB], device 0: ALC887-VD Analog [ALC887-VD Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 1: SB [HDA ATI SB], device 1: ALC887-VD Digital [ALC887-VD Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: HDMI [HDA ATI HDMI], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: HDMI [HDA ATI HDMI], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: HDMI [HDA ATI HDMI], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: HDMI [HDA ATI HDMI], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: HDMI [HDA ATI HDMI], device 10: HDMI 4 [HDMI 4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: HDMI [HDA ATI HDMI], device 11: HDMI 5 [HDMI 5]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

编辑:输出cat /proc/ioports

0000-0cf7 : PCI Bus 0000:00
  0000-001f : dma1
  0020-0021 : pic1
  0040-0043 : timer0
  0050-0053 : timer1
  0060-0060 : keyboard
  0061-0061 : PNP0800:00
  0064-0064 : keyboard
  0070-0073 : rtc0
  0080-008f : dma page reg
  00a0-00a1 : pic2
  00c0-00df : dma2
  00f0-00ff : PNP0C04:00
    00f0-00ff : fpu
  0170-0177 : 0000:00:14.1
    0170-0177 : pata_atiixp
  01f0-01f7 : 0000:00:14.1
    01f0-01f7 : pata_atiixp
  0220-0225 : pnp 00:00
  0228-022f : pnp 00:01
    022d-022e : it87
      022d-022e : it87
  0290-0294 : pnp 00:00
  0376-0376 : 0000:00:14.1
    0376-0376 : pata_atiixp
  0378-037a : parport0
  03c0-03df : vesafb
  03f6-03f6 : 0000:00:14.1
    03f6-03f6 : pata_atiixp
  03f8-03ff : serial
  040b-040b : pnp 00:01
  04d0-04d1 : pnp 00:00
  04d6-04d6 : pnp 00:01
  0b00-0b0f : pnp 00:01
  0b10-0b1f : pnp 00:01
  0b20-0b3f : pnp 00:01
  0c00-0c01 : pnp 00:01
  0c14-0c14 : pnp 00:01
  0c50-0c52 : pnp 00:01
  0c6c-0c6d : pnp 00:01
   0c6f-0c6f : pnp 00:01
  0cd0-0cd1 : pnp 00:01
  0cd2-0cd3 : pnp 00:01
  0cd4-0cdf : pnp 00:01
0cf8-0cff : PCI conf1
0d00-ffff : PCI Bus 0000:00
  4000-40fe : pnp 00:01
    4000-4003 : ACPI PM1a_EVT_BLK
    4004-4005 : ACPI PM1a_CNT_BLK
    4008-400b : ACPI PM_TMR
    4020-4027 : ACPI GPE0_BLK
    4050-4050 : ACPI PM2_CNT_BLK
  4100-411f : pnp 00:01
  4210-4217 : pnp 00:01
  a000-afff : PCI Bus 0000:05
    ae00-aeff : 0000:05:06.0
  b000-bfff : PCI Bus 0000:02
  c000-cfff : PCI Bus 0000:01
    ce00-ceff : 0000:01:00.0
  d000-dfff : PCI Bus 0000:04
  e000-efff : PCI Bus 0000:03
    ee00-eeff : 0000:03:00.0
      ee00-eeff : r8168
  fa00-fa0f : 0000:00:14.1
    fa00-fa0f : pata_atiixp
  fb00-fb0f : 0000:00:11.0
    fb00-fb0f : ahci
  fc00-fc03 : 0000:00:11.0
    fc00-fc03 : ahci
  fd00-fd07 : 0000:00:11.0
    fd00-fd07 : ahci
  fe00-fe03 : 0000:00:11.0
    fe00-fe03 : ahci
  ff00-ff07 : 0000:00:11.0
    ff00-ff07 : ahci

完成后,modprobe snd_cmipci joystick_port=0x201我在 dmseg 中得到了这个[74167.823806] gameport gameport0: C-Media Gameport is pci0000:05:06.0/gameport0, io 0x201, speed 714kHz

No such file or directory但是无论我怎么尝试,jstest 都会返回结果。我尝试过/dev/js*将游戏端口改为,0x200但是0x207没有成功

此时,是否可以安全地假设操纵杆可能已坏?有办法测试吗?

答案1

正确的驱动程序是。如果你查看内核源代码中snd_cmipci的文档,它说:Documentation/sound/alsa/CMIPCI.txt

操纵杆和调制解调器

支持旧版操纵杆。要启用操纵杆支持,请传递 joystick_port=1模块选项。值 1 表示自动检测。如果自动检测失败,请尝试传递准确的 I/O 地址。

调制解调器通过卡控制开关“调制解调器”动态启用

另外,请通过 modprobes 进行验证dmesgsnd_cmipci如果您无法找出原因,请使用任何错误消息编辑您的问题。

编辑

好的,卡被正确检测到了。我查看了源代码(sound/pci/cmipci.c)和数据表。唯一提到的是,有一个位用于启用操纵杆,并且它不提供任何基址。基址也不是 PCI 区域的一部分,显然较旧的 PCI 卡就是这样做的(对于传统的 MPU401/FM/SB16 基址也是如此,尽管您可以选择它们,这意味着我们可以知道它们)。

传统上,游戏端口位于0x200- 0x2070x201其中 是通常使用的端口。因此,驱动程序代码只是尝试按顺序保留0x201和,否则保留给定的端口,然后启用卡中的操纵杆。没有正确的检测,也没有消息。0x200joystick_port=1

因此,首先检查资源是否可用:不加载驱动程序(使用 检查lsmodrmmod必要时使用),以 root 身份编辑带有 输出的问题cat /proc/ioports(作为普通用户,您看不到范围)。如果范围0x200已被占用,我们必须找到一种方法来释放它。

对于探测,请再次确保您的驱动程序尚未加载modprobe snd_cmipci joystick_port=0x201(否则该选项将不会被处理)。

我不记得游戏端口具体显示在哪里,但如果一切正常(范围是空闲的),你现在应该会看到gameport中的一些其他模块lsmod,我认为你应该有一个设备/dev/js*或类似设备,你可以用jscal或进行测试jstest。如果发生这种情况但你没有得到任何反应,请尝试0x200下一步。

编辑

正如我所说,我不记得你需要的模块堆栈,而且我不再有游戏端口硬件。但我找出了我的旧操纵杆(碰巧也是 Logitech WingMan Extreme,不知道是不是“数字”操纵杆),查看了旧文件并在 Google 上搜索了一下。以下是我目前对模块堆栈的理解:

  • gameport使游戏端口寄存器可访问
  • ns558测量游戏端口上的模拟信号
  • analog作为普通模拟操纵杆的驱动程序(如果您的 Wingman 在此模式下工作)
  • adi对于使用 ADI 协议的 Logitech 操纵杆(用于额外的按钮等),通过游戏端口(Wingman 的可能选择)
  • joydev对于输入设备

因此,获取游戏端口后,请按顺序尝试以下操作:

modprobe adi
modprobe joydev

并观察dmesgsudo tail -f /var/log/syslog看看会发生什么。你应该得到一个/dev/input/js0可以用来测试的设备jstest /dev/input/js0。如果这不起作用,请尝试

modprobe ns558
modprobe analog map=auto
modprobe joydev

顺便说一句,我的 Wingman 是多协议的(USB + ADI,也可能是模拟的),并配备了游戏端口转 USB 适配器电缆,让我可以将其连接到 USB 端口。比使用旧声卡更简单。:-)

相关内容