Введение

Геймпады 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 под своё устройство.