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