Gameport-Joystick unter Linux

1108
Jango Knight

Ich kaufte einen Logitech Wingman Extreme Digital-Joystick in einem Thift Store, grub herum und fand eine alte PCI-Soundkarte mit einem Gameport-Port

Nach dem Einsetzen der Soundkarte in meinen Computer und der Bestätigung, dass die Soundkarte funktioniert (Tonausgabe an die Lautsprecher), habe ich den Joystick an den Gameport angeschlossen und Linux erkennt den Joystick überhaupt nicht

"lspci" gibt dies für die Soundkarteninfo an

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

Ich habe "modprobe" verwendet, um "joydev", "gameport", "adi", "ns558", "snd_cmipci" und "analog" ohne Erfolg zu laden

"jstest / dev / input / jsX", wobei X 0 bis 10 ist, hat jedes Mal "jstest: Keine solche Einheit oder Adresse" angegeben

Hat jemand Informationen darüber, wie dieses Gerät unter Linux funktioniert? Ich habe ein paar Guides gesehen, aber alle gaben mir die gleichen Schritte, die ich oben ausprobiert habe

System Information

  • Distro - Manjaro
  • Kern - 4.9.13-1-MANJARO

BEARBEITEN: hier ist die Ausgabe von lspci -n -v -s 05:06.0undaplay -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 tut nichts und tut es auch nicht joystick_port=ae00

Hier ist die Ausgabe von 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 

EDIT: Ausgabe von 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 

Nachdem ich das gemacht habe, habe modprobe snd_cmipci joystick_port=0x201ich das tatsächlich in dmseg bekommen[74167.823806] gameport gameport0: C-Media Gameport is pci0000:05:06.0/gameport0, io 0x201, speed 714kHz

Allerdings gibt Jstest No such file or directoryegal was ich versuche. Ich habe versucht /dev/js*und den Gameport 0x200zwar 0x207ohne Glück geändert

Ist an dieser Stelle sicher anzunehmen, dass der Joystick tot sein könnte? Würde es eine Möglichkeit geben, dies zu testen?

1

1 Antwort auf die Frage

0
dirkt

Der richtige Fahrer ist snd_cmipci. Wenn Sie sich die Dokumentation Documentation/sound/alsa/CMIPCI.txtin den Kernel-Quellen ansehen, heißt es:

Joystick und Modem

Der ältere Joystick wird unterstützt. Um die Joystick-Unterstützung zu aktivieren, übergeben Sie die joystick_port=1Option module. Der Wert 1 bedeutet die automatische Erkennung. Wenn die automatische Erkennung fehlschlägt, versuchen Sie, die genaue E / A-Adresse zu übergeben.

Das Modem wird dynamisch über einen Kartensteuerungsschalter "Modem" aktiviert.

Vergewissern Sie sich auch über dmesgdiese snd_cmipciModussätze, und bearbeiten Sie Ihre Frage mit Fehlermeldungen, wenn Sie den Grund nicht herausfinden können.

Bearbeiten :

Ok, die Karte wird richtig erkannt. Ich habe mir den Quellcode ( sound/pci/cmipci.c) und das Datenblatt angesehen . Das einzige, was dort erwähnt wird, ist ein einzelnes Bit, um den Joystick zu aktivieren, und es gibt keine Basisadresse an. Die Basisadresse gehört auch nicht zu den PCI-Regionen, anscheinend haben ältere PCI-Karten dies auch so gemacht (bei den älteren MPU401 / FM / SB16-Basen ist es dasselbe, obwohl Sie diese auswählen können, was bedeutet, dass wir sie kennen können).

Traditionell war das Spiel Port an 0x200- 0x207mit 0x201als derjenige in der Regel verwendet. So wird der Treibercode versucht, nur zu behalten 0x201und 0x200in dieser Reihenfolge, für joystick_port=1und die gegeben Port anders und ermöglicht dann den Joystick in der Karte. Es gibt keine ordnungsgemäße Erkennung und keine Nachrichten.

Überprüfen Sie also zunächst, ob die Ressource frei ist: Wenn der Treiber nicht geladen ist (prüfen Sie mit lsmod, verwenden Sie ihn rmmodggf.), bearbeiten Sie die Frage mit der Ausgabe cat /proc/ioportsals root (als normaler Benutzer werden die Bereiche nicht angezeigt). Wenn der 0x200Bereich belegt ist, müssen wir einen Weg finden, ihn zu befreien.

Vergewissern Sie sich zum Testen, dass der Treiber noch nicht geladen ist modprobe snd_cmipci joystick_port=0x201(oder die Option wird nicht verarbeitet).

Ich erinnere mich nicht genau, wo der Gameport auftaucht, aber wenn alles funktioniert (der Bereich ist kostenlos), sollten Sie jetzt gameporteinige andere Module sehen lsmodund ich denke, Sie sollten ein Gerät /dev/js*oder ähnliches haben, das Sie mit jscaloder testen können jstest. Wenn dies passiert, aber Sie keine Reaktion erhalten, versuchen Sie es als 0x200nächstes.

Bearbeiten

Wie gesagt, ich kann mich nicht genau an den benötigten Modulstapel erinnern und ich habe keine Gameport-Hardware mehr. Aber ich habe meinen alten Joystick ausgegraben (was auch ein Logitech WingMan Extreme ist, keine Ahnung, ob "Digital" oder nicht), habe alte Dateien angeschaut und ein bisschen gegoogelt. Hier ist mein aktuelles Verständnis des Modulstapels:

  • gameport um das Gameport-Register zugänglich zu machen
  • ns558 Analoge Signale am Gameport messen
  • analog als Treiber für normale analoge Joysticks (wenn Ihr Wingman in diesem Modus funktioniert)
  • adi für Logitech-Joysticks mit ADI-Protokoll (für die zusätzlichen Schaltflächen usw.) über den Gameport (die wahrscheinlichste Wahl für Ihren Wingman)
  • joydev für das Eingabegerät

Nachdem Sie den Gameport erworben haben, versuchen Sie Folgendes in dieser Reihenfolge:

modprobe adi modprobe joydev 

und schauen dmesgoder sudo tail -f /var/log/syslogsehen, was passiert. Sie sollten ein /dev/input/js0Gerät erhalten, mit dem Sie testen können jstest /dev/input/js0. Wenn dies nicht funktioniert, versuchen Sie es stattdessen

modprobe ns558 modprobe analog map=auto modprobe joydev 

Übrigens, mein Wingman ist ein Multiprotokoll (USB + ADI, möglicherweise auch analog) und wurde mit einem Gameport-zu-USB-Adapterkabel geliefert, mit dem ich es an einen USB-Anschluss anschließen kann. Einfacher als eine alte Soundkarte. :-)

Modprobing `snd_cmipci` zeigt nichts auf` dmesg`. Das Weitergeben von "joystick_port = 1" zeigt auch nichts auf "dmesg". Wie erhalte ich die genaue E / A-Adresse? Jango Knight vor 7 Jahren 0
Bearbeiten Sie die Frage mit der Ausgabe von `lspci -n -v -s 05: 06.0`, nachdem Sie` snd_cmipci` modprobed haben. Dadurch erhalten Sie auch die E / A-Bereiche. Da es sich um eine Soundkarte handelt, fügen Sie nach Modprobe die Ausgabe von 'aplay -l' hinzu, um sicherzustellen, dass mindestens die Soundkarte erkannt wird. dirkt vor 7 Jahren 0
Beide Ausgaben wurden der Frage hinzugefügt Jango Knight vor 7 Jahren 0
Die Ausgabe von Ioports und meine Dmesg-Ausgabe wurde hinzugefügt Jango Knight vor 7 Jahren 0