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

994
Jango Knight

Я купил джойстик Logitech Wingman Extreme Digital в магазине товаров повседневного спроса, покопался и нашел старую звуковую карту 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» и «аналог» безрезультатно

«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

1 ответ на вопрос

0
dirkt

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

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

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

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

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

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

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

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

Итак, сначала проверьте, что ресурс свободен: без загруженного драйвера (проверьте с lsmodпомощью, rmmodпри необходимости используйте), отредактируйте вопрос с выводом от имени cat /proc/ioportsroot (как обычный пользователь, вы не видите диапазоны). Если 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-порту. Проще, чем использовать старую звуковую карту. :-)

Modprobing `snd_cmipci` ничего не показывает на` dmesg`. Передача `joystick_port = 1` также ничего не показывает в` dmesg` Как мне получить точный адрес ввода / вывода? Jango Knight 7 лет назад 0
Пожалуйста, отредактируйте вопрос с выводом `lspci -n -v -s 05: 06.0` после того, как вы отредактировали` snd_cmipci`. Это также даст вам регионы ввода / вывода. Также, поскольку это звуковая карта, добавьте вывод `aplay -l` после modprobe, чтобы убедиться, что по крайней мере звуковая карта обнаружена. dirkt 7 лет назад 0
Добавил оба вывода в вопрос Jango Knight 7 лет назад 0
Добавлен вывод ioports и мой вывод dmesg Jango Knight 7 лет назад 0

Похожие вопросы