Настройка геймпада 8BitDo в NixOS
Руководство по настройке геймпада 8BitDo Ultimate C в XInput режиме в NixOS с использованием udev-правил и драйвера xpad-noone
Введение
Геймпады 8BitDo популярны благодаря универсальности: поддерживают Switch, Android и XInput режимы. Для использования в Linux в XInput режиме (эмуляция Xbox 360 контроллера) требуется корректная настройка udev-правил и драйвера. В NixOS это делается декларативно через модуль конфигурации.
Материал основан на реальном NixOS-модуле для 8BitDo Ultimate C контроллера и адаптирован под общую конфигурацию NixOS.
Определение устройства
Перед настройкой необходимо определить idVendor и idProduct контроллера через lsusb:
lsusb | grep 8BitDo
Типичные идентификаторы для 8BitDo Ultimate C:
| Устройство | Vendor ID | Product ID (XInput) | Product ID (отключение) |
|---|---|---|---|
| 8BitDo Ultimate C | 2dc8 |
3106 |
3016 |
| 8BitDo Pro 2 | 2dc8 |
3106 |
3016 |
| 8BitDo Ultimate | 2dc8 |
3106 |
3016 |
Примечание: Product ID может отличаться в зависимости от модели и режима. Уточнять через
lsusbпри подключённом контроллере в XInput режиме.
Модуль NixOS
Готовый модуль для включения в конфигурацию:
{ config, pkgs, lib, ... }:
{
# Драйвер Xbox-контроллеров (работает с 8BitDo в XInput режиме)
hardware.xpad-noone.enable = true;
# Udev-правила: запуск/остановка службы при подключении/отключении контроллера
services.udev.extraRules = ''
SUBSYSTEM=="usb", ATTR{idVendor}=="2dc8", ATTR{idProduct}=="3106",
ATTR{manufacturer}=="8BitDo",
RUN+="${pkgs.systemd}/bin/systemctl start 8bitdo-ultimate-xinput@2dc8:3106"
SUBSYSTEM=="usb", ATTR{idVendor}=="2dc8", ATTR{idProduct}=="3016",
ATTR{manufacturer}=="8BitDo",
RUN+="${pkgs.systemd}/bin/systemctl stop 8bitdo-ultimate-xinput@2dc8:3106"
'';
# Systemd-сервис: запуск xboxdrv для эмуляции Xbox 360 геймпада
systemd.services."8bitdo-ultimate-xinput@" = {
unitConfig.Description = "8BitDo Ultimate Controller XInput mode xboxdrv daemon";
serviceConfig = {
Type = "simple";
ExecStart = "${pkgs.xboxdrv}/bin/xboxdrv \
--mimic-xpad --silent --type xbox360 \
--device-by-id %I --force-feedback";
};
};
}
Компоненты модуля
hardware.xpad-noone.enable = true — альтернативный драйвер Xbox-контроллеров для ядра Linux. Работает как замена xpad, но с лучшей поддержкой сторонних контроллеров (включая 8BitDo). Без этого драйвера геймпад может не распознаваться в XInput режиме.
Udev-правила — при подключении контроллера с vendor 2dc8 и product 3106 запускается systemd-сервис 8bitdo-ultimate-xinput@2dc8:3106. При отключении (появление устройства 3016) сервис останавливается.
Systemd-сервис — запускает xboxdrv для преобразования сигналов контроллера в стандартный Xbox 360 геймпад. Флаги:
--mimic-xpad— эмуляция драйвера xpad--silent— без лишнего вывода в лог--type xbox360— принудительный режим Xbox 360--device-by-id %I— привязка к конкретному USB-устройству (параметр передаётся из udev)--force-feedback— поддержка вибрации
Установка
Модуль можно разместить в configuration.nix или вынести в отдельный файл и импортировать:
# configuration.nix
{
imports = [ ./modules/8bitdo.nix ];
}
После добавления — пересобрать конфигурацию:
sudo nixos-rebuild switch
Переподключить геймпад (или перезагрузить систему) для применения udev-правил.
Поиск идентификаторов устройства
Если lsusb не показывает контроллер — проверить режим подключения. Геймпад 8BitDo Ultimate C переключается между режимами комбинацией кнопок:
- XInput (Xbox):
X + Bпри включении - Switch:
Y + Bпри включении - Android:
A + Bпри включении
Для работы с данным модулем требуется XInput режим.
После подключения в XInput режиме:
lsusb
# Bus 001 Device 003: ID 2dc8:3106 8BitDo 8BitDo Ultimate C
dmesg | tail
# [ +0.123456] input: Xbox 360 Wireless Receiver as /devices/...
Альтернативы
Если xboxdrv не требуется, минимальная конфигурация состоит из одного драйвера:
{ hardware.xpad-noone.enable = true; }
Многие игры и эмуляторы корректно работают с геймпадом и без xboxdrv, напрямую через события /dev/input/js* или через SDL2.
Типичные проблемы
| Проблема | Причина | Решение |
|---|---|---|
Геймпад не определяется в lsusb |
Контроллер не в XInput режиме | Включить с зажатыми X + B |
| Устройство видно, но не работает в играх | Нет драйвера xpad-noone | Включить hardware.xpad-noone.enable |
| Вибрация не работает | Отсутствует --force-feedback |
Добавить флаг в ExecStart xboxdrv |
| Геймпад отключается через несколько секунд | Неверный udev-матчинг | Проверить idProduct через lsusb |
Диагностика
Проверить статус сервиса после подключения контроллера:
systemctl status "8bitdo-ultimate-xinput@2dc8:3106"
Проверить udev-правила:
udevadm control --reload-rules
udevadm trigger
udevadm info -a -n /dev/input/js0
Проверить, что геймпад виден в системе:
evtest
ls /dev/input/js*
cat /proc/bus/input/devices | grep -A 5 8BitDo
Заключение
Настройка 8BitDo в NixOS не требует сложных действий: udev-правила и драйвер xpad-noone полностью решают проблему совместимости. Декларативная конфигурация позволяет воспроизводить настройку на любой машине с минимальными усилиями.
Основные компоненты:
hardware.xpad-noone.enable— драйвер Xbox-контроллеров- udev-правила — автоматический запуск сервиса при подключении
xboxdrv— принудительная эмуляция Xbox 360 геймпада (опционально)
Готовый модуль можно использовать как основу для любого 8BitDo контроллера, скорректировав idProduct под своё устройство.