С появлением стима под линукс вопрос о поддержке геймпадов стал только актуальнее. Настроить контроллер можно в режиме big picture, но к сожалению некоторые игры отказываются работать с отличными от xbox 360 геймпадами. Здесь я опишу способ использования dualshock 3 по блютусу в качестве контроллера от иксбокса, может кому пригодится.
Пробовал под ubuntu 13.10.
Блютус адаптер: Asus usb-bt211. Проверенный донгл для подключения гейпадов от ps3. Пойдет любой адаптер, за редкими исключениями.
sixad — демон из менеджера джойстиков qtsixa, нужен для подключения по блютусу. Ставил из ppa:falk-t-j/qtsixa по гайду
https://help.ubuntu.com/community/Sixaxis.
xboxdrv — продвинутый драйвер для геймпадов xbox. Использовал для имитации родного контроллера.
1. Подключение dualshock 3 по блютусу:
Добавление ppa:
sudo apt-add-repository ppa:falk-t-j/qtsixa
Установка sixad:
sudo apt-get update
sudo apt-get install sixad
Что бы связать адаптер с геймпадом оба должны быть подключены по usb:
sudo sixpair
Если все пройдет удачным, вывод команды будет подобный этому:
Current Bluetooth master: xx:xx:xx:xx:xx:xx
Setting master bd_addr to xx:xx:xx:xx:xx:xx
После этого можно отключить dualshock от usb, с запущенным sixad его теперь можно использовать без провода.
Запуск sixad:
sudo service sixad start
Геймпад подключается нажатием кнопки PS по центру. Мигают индикаторы — идет поиск и подключение. Когда контроллер будет готов к использованию он провибрирует и будет гореть только одна лампочка. Отключить его можно зажав кнопку PS пока не погаснет индикатор.
Если игра поддерживает настройку джойстика через стим, то на этом можно и остановиться. Рекомендую только поставить еще qtsixa и отключить через него акселерометры в геймпаде, иначе они будут мешаться во время назначения клавиш.
2. Дуалшок как xbox-пад.
Для этого потребуется xboxdrv:
sudo apt-get install xboxdrv
Он поддерживает из коробки не только с геймпады от микрософта, но и множество других. Dualshock 3 по usb можно использовать с ним и без sixad, достаточно запустить xboxdrv с параметром --mimic-xpad.
Так же его можно использовать с любым /dev/input/event устройством, нужно только задать необходимые привязки. Мои настройки для подключенного по блютусу через sixad дуалшока:
ds3.xboxdrv:
# Playstation 3 Wireless Controller (sixad)
# ========================
[xboxdrv]
# Using the 'by-id' name is recomment, as it is static, while an
# /dev/input/eventX name can change depending on what other USB
# devices you use.
#evdev = /dev/input/event10
# This displays events received from the controller, if you are
# working on a configuration you want to set this to true:
#evdev-debug = true
# Grabbing the device prevents other applications from accessing it,
# this is needed most of the time te prevent applications from
# receiving events twice.
evdev-grab = true
[evdev-absmap]
ABS_X = X1
ABS_Y = Y1
ABS_Z = X2
ABS_RX = Y2
ABS_#12 = LT
ABS_#13 = RT
[evdev-keymap]
BTN_TL = LT
BTN_TR = RT
BTN_DEAD = X
KEY_#300 = Y
KEY_#302 = A
KEY_#301 = B
BTN_BASE5 = LB
BTN_BASE6 = RB
BTN_THUMB = TL
BTN_THUMB2 = TR
BTN_TOP = start
BTN_TRIGGER = back
BTN_A = guide
BTN_TOP2 = du
BTN_PINKIE = dr
BTN_BASE = dd
BTN_BASE2 = dl
[axismap]
-Y1=Y1
-Y2=Y2
[calibration]
LT=0:127:255
RT=0:127:255
Теперь после запуска xboxdrv --detach-kernel-driver --mimic-xpad --evdev /dev/input/event_НОМЕР_ДУАЛШОКА --silent --config ПУТЬ_К_ФАЙЛУ_КОНФИГУРАЦИИ в системе появится новый геймпад, идентичный проводному джойстику от xboxa. Но есть две проблемы: игры видят два гейпада и иксбоксовский идет вторым, после перезапуска устройство может иметь другое имя.
Не придумал грамотного способа справиться с этим через правила udev, пользуюсь пока таким:
1. Создал правило /etc/udev/rules.d/99-dualshock3.rules
ENV{ID_INPUT_JOYSTICK}=="1", KERNEL=="event*", MODE="0660", SYMLINK+="input/by-id/noname-event%n"
ENV{ID_INPUT_JOYSTICK}=="1", KERNEL=="js*", MODE="0664", SYMLINK+="input/by-id/noname-js%n"
Таким образом при подключении геймпадов получаю симлинки вида /dev/input/by-id/noname-event* и /dev/input/by-id/noname-js*, которые затем использую в скрипте.
Все файлы находятся в одной директории: ds3.xboxdrv (файл с настройками, содержимое выше), emulatexbox.sh (все подключенные джойстики замещаются иксбоксовским вариантом), killxbox.sh (возвращает все назад).
emulatexbox.sh
#!/bin/bash
cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
for i in /dev/input/by-id/noname*
do
chmod go-rw $i
done
for i in /dev/input/by-id/noname-event*
do
xboxdrv --detach-kernel-driver --mimic-xpad --evdev $i --silent --config ./ds3.xboxdrv&
done
killxbox.sh
#!/bin/bash
cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
killall -s KILL xboxdrv
for i in /dev/input/by-id/noname-js*
do
chmod g+rw $i
chmod o+r $i
done
for i in /dev/input/by-id/noname-event*
do
chmod g+rw $i
done
Нужны права рута. Меняют атрибуты доступа к файлам, что бы отключить не нужные геймпады.
Работает в проблемных играх: bastion, trine 2 (с тремя геймпадами), bit trip runner 2, brutal legend, mark of the ninja, teleglitch: die more edition (см. ниже).
Bastion - в игре нельзя выбрать нужный контроллер. Если подключен еще один джойстик, то могут возникнуть проблемы.
Teleglitch: die more edition - по умолчанию не совместим с иксбоксовским геймпадом. Для работы xboxdrv нужно запустить без параметра --mimic-xpad, но добавить --dpad-as-button. Управление в big picture в этом случае будет кривое.
Не работает в играх:
Steel Storm: Burning Retribution - поддерживает геймпад xbox только под windows, во время портирования под линуксом поддержку геймпада делали под Logitech Rumblepad2 (
ссылка). Возможно работает и с другими геймпадами от logitech, игра крашится с несовместимыми контроллерами.
Метод костыльный, но красивый вариант пока не придумал. Может кто поделится своим опытом?