Геймпорт джойстик на Linux

Я купил джойстик Logitech Wingman Extreme Digital в магазине товаров повседневного спроса, покопался и нашел старую звуковую карту PCI с портом Gameport

Вставив звуковую карту в мой компьютер и убедившись, что звуковая карта работает (выводит звук на динамики), я подключил джойстик к 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" и "аналог" безрезультатно

"jstest /dev/input/jsX", где X от 0 до 10, просто каждый раз давал "jstest: нет такого устройства или адреса"

У кого-нибудь есть информация о том, как заставить это устройство работать в Linux? Я видел несколько руководств, но все они дали мне те же шаги, что я пытался выше

Системная информация

  • Дистро - Манджаро
  • Ядро - 4.9.13-1-МАНЖАРО

РЕДАКТИРОВАТЬ: здесь вывод 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

Однако JStest дает No such file or directory независимо от того, что я пытаюсь я пытался /dev/js* и изменил игровой порт 0x200 хоть 0x207 без удачи

На данный момент безопасно ли предположить, что джойстик может быть мертвым? Будет ли способ проверить это?

1 ответ

Правильный драйвер snd_cmipci, Если вы посмотрите на документацию в Documentation/sound/alsa/CMIPCI.txt в исходниках ядра написано:

Джойстик и модем

Устаревший джойстик поддерживается. Чтобы включить поддержку джойстика, передайте joystick_port=1 Опция модуля. Значение 1 означает автоопределение. Если автоопределение не удается, попробуйте передать точный адрес ввода-вывода.

Модем включается динамически через плату управления коммутатором "Модем"

Также проверьте через dmesg тот snd_cmipci modprobes правильно, и отредактируйте свой вопрос с любыми сообщениями об ошибках, если вы не можете выяснить причину.

Редактировать:

Хорошо, карта правильно обнаружена. Я посмотрел на исходный код (sound/pci/cmipci.c) и таблицы. Единственное, что упомянуто, это один бит для включения джойстика, и он не дает никакого базового адреса. Базовый адрес также не является частью регионов PCI, очевидно, более старые карты PCI сделали это таким же образом (это то же самое для устаревших баз MPU401/FM/SB16, хотя вы можете выбрать те, что означает, что мы могли бы их знать).

Традиционно игровой порт был на 0x200-0x207, с 0x201 как обычно используется. Таким образом, код драйвера просто пытается зарезервировать 0x201 а также 0x200в таком порядке, для joystick_port=1, и данный порт в противном случае, а затем включает джойстик на карте. Там нет надлежащего обнаружения и нет сообщений.

Итак, сначала проверьте, что ресурс свободен: без загруженного драйвера (проверьте с lsmodиспользовать rmmod при необходимости) отредактируйте вопрос с выводом cat /proc/ioports как root (как обычный пользователь, вы не видите диапазоны). Если 0x200 Диапазон взят, мы должны найти способ освободить его.

Для проверки снова убедитесь, что драйвер еще не загружен, когда вы modprobe snd_cmipci joystick_port=0x201 (или опция не будет обработана).

Не помню точно, где отображается игровой порт, но если все работает (диапазон свободен), вы должны увидеть gameport и некоторые другие модули в lsmodи думаю, у тебя должно быть устройство /dev/js* или аналогичные, которые вы можете проверить с jscal или же jstest, Если это произойдет, но вы не получите никакой реакции, попробуйте 0x200 следующий.

редактировать

Как я уже сказал, я не помню, какой именно стек модулей вам нужен, и у меня больше нет игрового оборудования. Но я вытащил свой старый джойстик (который также является Logitech WingMan Extreme, без понятия "цифровой" или нет), посмотрел старые файлы и немного погуглил. Вот мое текущее понимание стека модулей:

  • gameport сделать регистр игрового порта доступным
  • ns558 измерять аналоговые сигналы на игровом порту
  • analog в качестве драйвера для простых аналоговых джойстиков (если ваш Wingman работает в этом режиме)
  • adi для джойстиков Logitech, использующих протокол ADI (для дополнительных кнопок и т. д.) поверх игрового порта (вероятный выбор для вашего Wingman)
  • joydev для устройства ввода

Поэтому после получения игрового порта попробуйте следующее в таком порядке:

modprobe adi
modprobe joydev

и смотри dmesg или же sudo 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-порту. Проще, чем использовать старую звуковую карту.:-)

Другие вопросы по тегам