This article is about the Nintendo Wii Remote Linux kernel driver. This driver is part of upstream Linux since version 3.1. It is an easy to use drop-in replacement for the older user-space drivers like cwiid. You can use your Wii Remote for all purposes with this driver, for instance as an X input device or joystick controller for your Linux games.
- xwiimote kernel driver
- Wii Remote hardware
The most important piece required is Bluetooth, this must already be configured and running without the help of this guide. This should be simple enough with any guide found on the Internet. Most recent bluez package in Arch Linux includes the wiimote plugin. See Troubleshooting BlueZ to make BlueZ include the wiimote plugin.
The user-space utilities are available in the AUR. You need the AUR package. There is also a git-package AUR if you want the most recent revision.
The kernel driver is part of upstream Linux since version 3.1. The module is called
hid-wiimote. If it is not available in your kernel, you need to compile the module yourself. The Arch Linux kernel includes it starting with version 3.1.
Lastly you will need a Wii Remote, this can include (although, are not required) the Nunchuk and Classic Controller attachments.
If your kernel does not include the
hid-wiimote module, you can enable it with
CONFIG_HID_WIIMOTE. The module needs
CONFIG_BT_HIDP embedded in your kernel or as modules, previously loaded.
Starting with kernel version 3.3 there is an additional config option
CONFIG_HID_WIIMOTE_EXT which is enabled by default. It controls whether wiimote extensions like Nunchuck and Classic Controller should be supported.
Connect the Wii Remote
You can connect to your Wii Remote like any other Bluetooth device. See the Bluetooth article about information on pairing Bluetooth devices. The Wii Remote does not need special handling anymore. The BlueZ wiimote plugin handles all peculiarities in the background for you.
The Wii Remote can be put into discoverable mode by pressing the red sync-button behind the battery cover on the back. The Wii Remote will stay in discoverable mode for 20s. You can also hold the 1+2 buttons to put the Wii Remote into discoverable state. However, the first method works more reliably!
If you are asked for PIN input while bonding the devices, then your BlueZ bluetoothd daemon does not include the wiimote plugin. See Troubleshooting BlueZ for more information. If this does not help, you can still connect to your wiimote without pairing/bonding (i.e. not using authentication with a PIN). This should work with any BlueZ version. See Troubleshooting Pairing if you still cannot connect your wiimote.
If your Wii Remote is connected, it will appear with several input devices inside
/dev/input/eventX. You can list all Wii Remotes with:
Then you can get additional device details with:
The default mapping for the input-keys of the Wii Remotes are not very useful. Userspace applications that re-map the Wii Remote input to more useful keys/actions are still under development  - available in AUR AUR
The Wii Remote includes an infrared camera. To use this camera as a pointer input device, you need an IR-rack as an infrared source. Possible infrared sources are:
- Nintendo Wii Sensor Bar
- Wireless sensor bar - check eBay!
- Small candles (should have about 30cm distance)
- Home made sensor bar ()
The input mapping is very weird
The default mapping maps the Wii Remote keys to the the key-constants which resemble the Wii Remote's buttons best. This mapping is quite useless by default. To get better mappings, use the xwiimote userspace tools.
BlueZ does not include the wiimote plugin
Upstream BlueZ includes the optional wiimote plugin since version 4.96. However, it must be enabled explicitely with
--enable-wiimote during compilation. The archlinux package includes the wiimote plugin since
bluez-4.96-3. If you are unsure whether your package includes the wiimote plugin, use:
grep wiimote $(which bluetoothd)
This should say:
Binary file /usr/sbin/bluetoothd matches
You probably need to run this as root because the bluetoothd daemon resides in /usr/sbin on archlinux or simply use:
grep wiimote /usr/sbin/bluetoothd
If this matches, then your BlueZ includes the wiimote plugin and no more user-interaction is needed. If this does not match, you need to enable it yourself or work without it. If you do not want to compile your own bluez package, then you can use the wiimote without this plugin by connecting without pairing/bonding. For instance, when using
gnome-bluetooth you need to select
"Proceed without pairing" when adding a new device.
If you want to compile the module on your own, then add
--enable-wiimote to your configure flags and proceed as usual. See the bluez PKGBUILD for further information.
I cannot connect my wiimote
The BlueZ packages includes a special wiimote plugin since version
4.96 which handles all Wii Remote peculiarities for you. If you cannot pair your Wii Remote like any other device, then you should try connecting without pairing/bonding (i.e. not using authentication with a PIN). If this still does not work, please report your issue to the upstream developers at XWiimote@GitHub.
Please always use the red sync-button behind the battery cover on the back of the Wii Remote for troubleshooting. This works more reliably than holding the 1+2 buttons.
The Auto-Reconnect feature allows the Wii Remote to reconnect to its last connected host when a key is pressed. This means you do not need to connect your Wii Remote manually each time. However, the Auto-Reconnect feature only works if you paired your Wii-Remote. Connecting without the wiimote plugin will not enable Auto-Reconnect.
My Wii Remote is still not working
The XWiimote software stack is actively developed. Please report your problems at XWiimote@GitHub.
There are also other projects which provide Wii Remote support for linux. See the Wii Remote article for the cwiid project.
- Wiimote: Cwiid: An older software stack for linux which provides partial Wii Remote support