Old school (non-usb) joystick in Ubuntu 11.10
We got a used joystick with a d-sub connector and I'm trying to make it work with Ubuntu 11.10.
I had to buy a sound card that had a game port. I got a Diamond XS51 sound card that shows up like this in lspci:
01:07.0 Multimedia audio controller: C-Media Electronics Inc CM8738 (rev 10) Subsystem: C-Media Electronics Inc CMI8738/C3DX PCI Audio Device Flags: bus master, medium devsel, latency 32, IRQ 16 I/O ports at c000 [size=256] Capabilities: [c0] Power Management version 2 Kernel driver in use: C-Media PCI Kernel modules: snd-cmipci
I now have these modules installed:
Module Size Used by analog 17399 0 sidewinder 21041 0 ns558 12654 0 snd_cmipci 35513 2 gameport 15060 5 analog,sidewinder,ns558,snd_cmipci snd_opl3_lib 18863 1 snd_cmipci snd_mpu401_uart 13865 1 snd_cmipci nfs 297750 0 lockd 78804 1 nfs fscache 50674 1 nfs auth_rpcgss 39545 1 nfs nfs_acl 12771 1 nfs sunrpc 205330 7 nfs,lockd,auth_rpcgss,nfs_acl rfcomm 38408 0 bnep 17923 2 bluetooth 148839 8 rfcomm,bnep pci_stub 12550 1 vboxpci 22882 0 vboxnetadp 13328 0 vboxnetflt 27211 0 vboxdrv 251814 3 vboxpci,vboxnetadp,vboxnetflt autofs4 27924 6 vesafb 13489 1 nvidia 10390874 40 snd_intel8x0 33318 2 snd_ac97_codec 106082 1 snd_intel8x0 snd_usb_audio 100880 0 ac97_bus 12642 1 snd_ac97_codec snd_pcm 80468 4 snd_cmipci,snd_intel8x0,snd_ac97_codec,snd_usb_audio snd_hwdep 13276 2 snd_opl3_lib,snd_usb_audio snd_usbmidi_lib 24558 1 snd_usb_audio snd_seq_midi 13132 0 joydev 17393 0 snd_rawmidi 25241 3 snd_mpu401_uart,snd_usbmidi_lib,snd_seq_midi snd_seq_midi_event 14475 1 snd_seq_midi uvcvideo 67271 0 videodev 85626 1 uvcvideo snd_seq 51567 2 snd_seq_midi,snd_seq_midi_event snd_timer 28932 3 snd_opl3_lib,snd_pcm,snd_seq snd_seq_device 14172 4 snd_opl3_lib,snd_seq_midi,snd_rawmidi,snd_seq binfmt_misc 17292 1 snd 55902 21 snd_cmipci,snd_opl3_lib,snd_mpu401_uart,snd_intel8x0,snd_ac97_codec,snd_usb_audio,snd_pcm,snd_hwdep,snd_usbmidi_lib,snd_rawmidi,snd_seq,snd_timer,snd_seq_device soundcore 12600 1 snd snd_page_alloc 14115 2 snd_intel8x0,snd_pcm ppdev 12849 0 shpchp 32356 0 serio_raw 12990 0 i2c_nforce2 12906 0 parport_pc 32114 1 lp 17455 0 parport 40930 3 ppdev,parport_pc,lp usbhid 41905 0 hid 77367 1 usbhid forcedeth 58103 0 pata_amd 13753 2 floppy 60310 0
Sound works on the new sound card. That didn't take any effort. But I can't get the joystick to be visible.
I've tried jstest, which seems to misidentify the device:
root@merkli:~# jstest /dev/input/js0 Driver version is 2.1.0. Joystick (Chicony USB Gaming Keyboard Pro) has 0 axes () and 11 buttons (BtnX, BtnY, BtnZ, BtnTL, BtnTR, BtnTL2, BtnTR2, BtnSelect, BtnStart, BtnMode, BtnThumbL). Testing ... (interrupt to exit) Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 1Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off ^C
It isn't USB and it isn't a keyboard. It might be Chicony... the joystick doesn't have any brand or model written on it. And the joystick might not be working. But I think it is unlikely that all the switches and pots in it would all fail together.
It is much more likely that I don't know which device or module is required.
This post mentions asound.state:
http://osdir.com/ml/linux.alsa.user/2002-07/msg00248.html
Do I have to do something to asound.state? I don't see anything in there related to joysticks at the moment.
This post looks helpful:
http://ubuntuforums.org/showthread.php?t=1145181
I'll try joydump.
That gives me this in dmesg:
[1030086.907845] joydump: ,------------------ START ----------------. [1030086.907854] joydump: | Dumping: pci0000:01:07.0/gameport0 | [1030086.907858] joydump: | Speed: 59659 kHz | [1030087.850311] joydump: >------------------ DATA -----------------< [1030087.850315] joydump: | index: 0 delta: 0 us data: 11111111 | [1030087.850322] joydump: `------------------- END -----------------'
So what device is associated with pci0000:01:07.0/gameport0? Probably not the /dev/input/js0 that I've been talking to.
/proc/ioports contains this:
0201-0201 : CMIPCI gameport
lspci reports the address 01:07.0 as associated with the audio card.
Looking through /sys/dev/char, I see these promising entries:
lrwxrwxrwx 1 root root 0 2011-12-03 16:45 116:2 -> ../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/sound/card1/midiC1D0 lrwxrwxrwx 1 root root 0 2011-12-03 16:45 116:3 -> ../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/sound/card1/pcmC1D2p lrwxrwxrwx 1 root root 0 2011-12-03 16:45 116:33 -> ../../devices/virtual/sound/timer lrwxrwxrwx 1 root root 0 2011-12-03 16:45 116:4 -> ../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/sound/card1/pcmC1D2c lrwxrwxrwx 1 root root 0 2011-12-03 16:45 116:5 -> ../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/sound/card1/pcmC1D1p lrwxrwxrwx 1 root root 0 2011-12-03 16:45 116:6 -> ../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/sound/card1/pcmC1D0p lrwxrwxrwx 1 root root 0 2011-12-03 16:45 116:7 -> ../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/sound/card1/pcmC1D0c lrwxrwxrwx 1 root root 0 2011-12-03 16:45 116:8 -> ../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/sound/card1/hwC1D0 lrwxrwxrwx 1 root root 0 2011-12-03 16:45 116:9 -> ../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/sound/card1/controlC1
They all include a reference to 10:07.0.
Poking around in those directories, I found this directory:
/sys/devices/pci0000:00/0000:00:08.0/0000:01:07.0/gameport0
and it contains this:
root@merkli:/sys/devices/pci0000:00/0000:00:08.0/0000:01:07.0/gameport0# ls -l total 0 -r--r--r-- 1 root root 4096 2011-12-03 16:45 description lrwxrwxrwx 1 root root 0 2011-12-03 16:45 driver -> ../../../../../bus/gameport/drivers/joydump --w------- 1 root root 4096 2011-12-03 16:45 drvctl drwxr-xr-x 2 root root 0 2011-12-03 16:45 power lrwxrwxrwx 1 root root 0 2011-12-03 16:45 subsystem -> ../../../../../bus/gameport -rw-r--r-- 1 root root 4096 2011-12-03 16:45 uevent root@merkli:/sys/devices/pci0000:00/0000:00:08.0/0000:01:07.0/gameport0# cat description C-Media Gameport
I think I'm getting warm.
Those links into /sys/bus/gameport are interesting. When I go there I see all the drivers that I've tried to load to make this work:
root@merkli:/sys/bus/gameport# tree . ├── devices │ └── gameport0 -> ../../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/gameport0 ├── drivers │ ├── adc │ │ ├── bind │ │ ├── description │ │ ├── module -> ../../../../module/a3d │ │ ├── uevent │ │ └── unbind │ ├── analog │ │ ├── bind │ │ ├── description │ │ ├── module -> ../../../../module/analog │ │ ├── uevent │ │ └── unbind │ ├── joydump │ │ ├── bind │ │ ├── description │ │ ├── gameport0 -> ../../../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/gameport0 │ │ ├── module -> ../../../../module/joydump │ │ ├── uevent │ │ └── unbind │ └── sidewinder │ ├── bind │ ├── description │ ├── module -> ../../../../module/sidewinder │ ├── uevent │ └── unbind ├── drivers_autoprobe ├── drivers_probe └── uevent 12 directories, 19 files
When I try to use jstest with that device, I get much closer, but not quite success:
root@merkli:/sys/bus/gameport/devices# jstest /sys/bus/gameport/devices/gameport0 Driver version is 0.8.0. jstest is not fully compatible with your kernel. Unable to retrieve button map! Joystick (Unknown) has 2 axes and 2 buttons. Testing ... (interrupt to exit) jstest: error reading: Is a directory
It sees the device! It sees 2 axes and 2 buttons!
Here is a little bit more from dmesg:
[166023.854108] C-Media PCI 0000:01:07.0: PCI INT A disabled [166125.541549] C-Media PCI 0000:01:07.0: PCI INT A -> Link[APC1] -> GSI 16 (level, high) -> IRQ 16 [166125.560829] gameport gameport0: C-Media Gameport is pci0000:01:07.0/gameport0, io 0x201, speed 59659kHz [180000.000039] [Hardware Error]: Machine check events logged [748827.792033] hrtimer: interrupt took 32679 ns [1030086.907845] joydump: ,------------------ START ----------------. [1030086.907854] joydump: | Dumping: pci0000:01:07.0/gameport0 | [1030086.907858] joydump: | Speed: 59659 kHz | [1030087.850311] joydump: >------------------ DATA -----------------< [1030087.850315] joydump: | index: 0 delta: 0 us data: 11111111 | [1030087.850322] joydump: `------------------- END -----------------'
And here is a helpful and discouraging post:
http://ubuntuforums.org/showthread.php?t=1145181
And here is another:
http://forums.funtoo.org/viewtopic.php?id=763
At first boot, dmesg has nothing about gameport and my /sys/bus/gameport is empty:
root@merkli:/sys/bus/gameport# tree . ├── devices ├── drivers ├── drivers_autoprobe ├── drivers_probe └── uevent
This post looks helpful.
http://forums.gentoo.org/viewtopic-t-539758.html
I've found that adding "joystick_port=1" to the snd-cmipci line in /etc/modprobe.d/alsa-base.conf will cause a device to appear in /sys/bus/gameport after a reboot:
root@merkli:/sys/bus/gameport# tree . ├── devices │ └── gameport0 -> ../../../devices/pci0000:00/0000:00:08.0/0000:01:07.0/gameport0 ├── drivers ├── drivers_autoprobe ├── drivers_probe └── uevent
But it still won't make anything show up in dmesg. "modprobe joydump" will get the diagnostic to show up in dmesg.
I still need to figure out what combination of modules will make that device useful. I'm not sure if I should be trying to use that device in /sys/bus/gameport or if I should be using /dev/input/js0.