Joystick da Gameport no Linux

1

Eu comprei um joystick Logitech Wingman Extreme Digital em uma loja e vasculhei e encontrei uma placa de som PCI antiga que tinha uma porta Gameport

Depois de inserir a placa de som no meu computador e confirmar que a placa de som funciona (envia o som para os alto-falantes), conectei o joystick ao Gameport e o Linux não detectará o joystick

"lspci" dá isso para as informações da placa de som

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

Eu usei "modprobe" para carregar "joydev", "gameport", "adi", "ns558", "snd_cmipci" e "analog" sem sucesso

"jstest / dev / input / jsX", onde X é 0 a 10, apenas deu "jstest: sem tal dispositivo ou endereço" todas as vezes

Alguém tem alguma informação sobre como fazer com que este dispositivo funcione no Linux? Eu vi alguns guias, mas todos eles me deram os mesmos passos que eu tentei acima

Informações do sistema

  • Distro - Manjaro
  • Kernel - 4.9.13-1-MANJARO

EDIT: aqui está a saída de lspci -n -v -s 05:06.0 e 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 não faz nada e nem joystick_port=ae00

Aqui está a saída de 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: saída de 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

Depois de fazer modprobe snd_cmipci joystick_port=0x201 eu realmente consegui isso em dmseg [74167.823806] gameport gameport0: C-Media Gameport is pci0000:05:06.0/gameport0, io 0x201, speed 714kHz

No entanto jstest dá No such file or directory não importa o que eu tente. Eu tentei /dev/js* e mudei a porta de jogo para 0x200 embora 0x207 sem sorte

Neste ponto, é seguro assumir que o joystick pode estar morto? Haveria uma maneira de testar isso?

    
por Jango Knight 25.03.2017 / 20:59

1 resposta

0

O driver correto é snd_cmipci . Se você olhar a documentação em Documentation/sound/alsa/CMIPCI.txt nos fontes do kernel, ele diz:

Joystick and Modem

The legacy joystick is supported. To enable the joystick support, pass joystick_port=1 module option. The value 1 means the auto-detection. If the auto-detection fails, try to pass the exact I/O address.

The modem is enabled dynamically via a card control switch "Modem"

Verifique também por meio de dmesg que snd_cmipci modprobes corretamente e edite sua pergunta com mensagens de erro se não conseguir descobrir o motivo.

Editar :

Ok, o cartão foi detectado corretamente. Eu olhei para o código-fonte ( sound/pci/cmipci.c ) e o folha de dados . A única coisa que é mencionada é um único bit para ativar o joystick, e ele não fornece nenhum endereço base. O endereço base também não faz parte das regiões PCI, placas PCI aparentemente mais antigas fizeram isso (é o mesmo para as bases MPU401 / FM / SB16 legadas, embora você possa selecioná-las, o que significa que podemos conhecê-las).

Tradicionalmente, a porta do jogo estava em 0x200 - 0x207 , com 0x201 como a normalmente usada. Portanto, o código do driver tenta reservar 0x201 e 0x200 , nessa ordem, por joystick_port=1 , e a porta especificada, e depois ativa o joystick no cartão. Não há detecção adequada nem mensagens.

Portanto, primeiro verifique se o recurso é gratuito: sem o driver carregado (verifique com lsmod , use rmmod , se necessário), edite a pergunta com a saída de cat /proc/ioports como raiz (como usuário normal, você não vejo os intervalos). Se o intervalo 0x200 for obtido, precisamos encontrar uma maneira de liberá-lo.

Para sondagem, verifique novamente se o driver ainda não está carregado quando você modprobe snd_cmipci joystick_port=0x201 (ou a opção não será processada).

Não se lembre exatamente onde a porta de jogo aparece, mas se tudo funcionar (o intervalo é gratuito), você deve ver gameport e alguns outros módulos em lsmod , e eu acho que você deveria ter um dispositivo /dev/js* ou similar que você pode testar com jscal ou jstest . Se isso acontecer, mas você não receber nenhuma reação, tente 0x200 a seguir.

Editar

Como eu disse, não me lembro exatamente da pilha de módulos que você precisa, e eu não tenho mais o hardware da porta de jogo. Mas eu descobri meu velho joystick (que também é um Logitech WingMan Extreme, não sei se "Digital" ou não), olhei para arquivos antigos e pesquisei um pouco. Aqui está meu entendimento atual da pilha de módulos:

  • gameport para tornar acessível o registro da porta de jogo
  • ns558 para medir sinais analógicos na porta de jogo
  • analog como o driver para joysticks analógicos simples (se o seu Wingman funciona nesse modo)
  • adi para joysticks da Logitech usando o protocolo ADI (para os botões extras etc.) sobre a porta de jogo (a escolha provável para o seu Wingman)
  • joydev para o dispositivo de entrada

Então, depois de obter a porta de jogo, tente o seguinte, nessa ordem:

modprobe adi
modprobe joydev

e assista dmesg ou sudo tail -f /var/log/syslog para ver o que acontece. Você deve obter um dispositivo /dev/input/js0 que possa testar com jstest /dev/input/js0 . Se isso não funcionar, tente

modprobe ns558
modprobe analog map=auto
modprobe joydev

BTW, o meu Wingman é multi-protocolo (USB + ADI, possivelmente também analógico), e vem com um cabo adaptador de porta para jogo que me permite conectá-lo a uma porta USB. Mais simples do que usar uma placa de som antiga. : -)

    
por 26.03.2017 / 18:06