Меню

Как подключить дуалшок к псп

Подключаем к PSP геймпад от Xbox 360 при помощи Raspberry Pi

… или сказ про то, как пингвин Америку с Японией подружил.

Итак, в стародавние времена люди играли в Sony Playstation и их все устраивало. Но прогресс не стоял на месте. Увеличивалась степень интеграции микросхем. Инженерная мысль постоянно искала новые формфакторы, а мысль маркетинговая — новые рынки сбыта. Так в 2005 году появилась в продаже за пределами Японии портативная игровая система Sony Playstation Portable. Ее игровая линейка (как и у любой другой приставки) представляла собою специально скомпилированные под железо PSP игры. Но также она обладала и достаточными вычислительными мощностями для запуска игр от оригинальной PlayStation через встроенный эмулятор. Хотя, быть может, тут ключевую роль сыграло то, что и у PlayStation, и у PSP стоял процессор одной и той же архитектуры — а именно MIPS. Но самое примечательное в этой системе то, что сразу же, в год запуска, в сеть утекли библиотеки PSP SDK. В результате, через почти 10 лет с момента запуска, мы имеем огромную библиотеку игр и отлаженного homebrew. Также, сейчас, в не самом крупном городе России полностью рабочую PSP (самой функциональной модификации) можно купить с рук за 3000 рублей. Все это делает ее к настоящему моменту очень привлекательной бюджетной игровой системой с просто огромной инсталлбазой. Самая функциональная модификация имеет компонентный выход для подключения к ТВ. Но разъем подключения к ТВ располагается неудачно с точки зрения долгого использования PSP в качестве геймпада. К тому же, при длительном использовании возникает необходимость подключения второго провода — от зарядного устройства. И удобство использования такой химеры стремится к нулю. Как относительно бюджетно и при этом гиково решить эту проблемку — про это и пойдет речь в этой статье. Также вкратце будут затронуты темы программирования драйвера USB-клиента под PSP, методика установки хук-функций в PSP, работа под линуксом с устройствами USB и с джойстиками через API. Мы начинаем.

Идея подключения портативной консоли к ТВ не нова

В качестве геймпадов она использует обычные Dualshock 3 от Playstation 3. Поддеживается USB или Bluetooth подключение. Vita TV, как и Vita, может воспроизводить игры от Vita, PSP и от оригинальной Playstation. Таким образом, идея «стационарной портативной» консоли достаточно состоятельна и интересна.

С помощью чего подружить геймпад и PSP?

В этой машинке есть все, что нужно — 2 USB порта, а также полноценный Linux. В не самом крупном городе России старшая модель (с 512 Мб памяти и Ethernet) стоит 1500 рублей через доски бесплатных частных объявлений. Цена соизмерима с самыми дешевыми контролерными отладочными платами, а функциональность не в пример больше. Причем еще и «Made in the UK».

Начало исследования

Модификация исходников плагинов PSP. Хуки.

За основу проекта плагина, который я буду модифицировать, я выбрал тот, что уже содержал работащий код USB-клиента. Но для привычной отладки и вообще уютной атмосферы мне понадобился printf(). На PSP. В выбранном плагине его не было. Зато в плагине, из которого я хотел вытащить рабочий код перехвата событий органов управления PSP он был, выполненный через перехват функции отрисовки очередного кадра в кадровый буфер и дорисовки к кадру нужных мне отладочных строк. Сам перехват функции (хук) отрисовки реализован следующим образом:

После вызова hook_function() операционная система PSP при вызове своей внутренней функции ядра sceDisplaySetFrameBuf() будет фактически вызывать setframebuf_hook_func(). А для вызова оригинальной sceDisplaySetFrameBuf() нужно теперь вызывать g_setframebuf(). Кому интересна тема хуков, более подробно можно почитать например здесь.

Модификация исходников плагинов PSP. Управление.

Далее я добавил в модифицируемый проект рабочие хуки на функции управления sceCtrlReadBufferPositive(), sceCtrlPeekBufferPositive(), sceCtrlReadBufferNegative() и sceCtrlPeekBufferNegative(), взяв их из того же JoySens. Только сделал так, чтобы входными данными внутри них были последние присланные в PSP данные о состоянии геймпада, подключенного к ПК-хосту. Вот архив со всеми нужными бинарниками и исходниками. Перед запуском ПК-части программы нужно установить драйвера USB. Сначала нужно запустить плагин на PSP (как запустить плагин можно узнать, погуглив в яндексе). Потом перезагрузить PSP и подключить ее к ПК. Должно обнаружиться устройство PSP Type B. Далее скачиваем драйвера. Устанавливаем драйвера через мастер (bin\inf-wizard.exe), указывая наше устройство PSP Type B и говоря в конце установить драйвер.

Подготовка минимальной версии PSP-части

Все бы хорошо, но в сети есть исходники только на версию 0.19 RemoteJoyLite. А она некорректно работает на некоторых играх (например K-On! дико тормозит, а в Dungeon Siege появляются графические артефакты). В версии 0.20 это, как говорят, исправили, но исходников этой версии в открытом доступе нет. Поэтому было решено модифицировать протокол данных, передающихся по USB, чтобы передавать только минимум информации о состоянии геймпада, а также минимизировать размер исходника PSP-части. Из протокола были удалены все данные, передающиеся от PSP в ПК, и оставлена только одна структура, передающаяся от ПК в PSP, в результате чего тормоза и артефакты канули в небытие:

Читайте также:  Контроллер для гирлянды светодиодной как подключить

Аналоговые данные со стика в самой PSP представлены в виде однобайтового беззнакового целого для каждой оси (127 — центр), а 4 байта в протоколе выделено из-за желания даже не думать про проблемы упаковывания и выравнивания структур, т.к. в самом RemoteJoyLite данные упаковываются следующим образом:

И чтобы даже не задумываться о соответствующих проблемах (ведь сам RemoteJoyLite компилируется MinGW GCC, а следующим шагом будет создание проекта в Microsoft Visual Studio для отработки урезанного протокола, которая про __attribute__((packed)) не знает), я убрал все выравнивания и упаковывания структур, приведя их к 32-битному представлению. В итоге, в этом архиве содержатся исходники и бинарники урезанного проекта — и PSP-, и Windows-часть. Windows-приложение выполнено в виде проекта mfc на C++ для Microsoft Visual Studio 2010. Изучающим Windows-программирование будет полезно посмотреть, как реализована обработка нажатий клавиш управления курсором (в mfc-приложениях оно работает, только если находится в фильтре оконных сообщений всего приложения, а не в диалоговом обработчике нажатия клавиш), а также за счет чего корректно работает printf() на форму даже из отдельного потока. В части же PSP будет интересно изучить прилагающийся легковесный исходник, в котором оставлены только USB, управление и printf(). Например, прием данных по USB асинхронен и реализован следующим образом. При подключении к USB-хосту, после корректной процедуры получения внутреннего адреса на шине USB (см. описание USB) происходит вызов UsbAttach(), поскольку в зарегистрированной при инициализации структуре драйвера был описан этот вызов:

Где module_start() — функция, вызываемая в отдельном потоке при запуске плагина пиратской прошивкой. Также при запуске драйвера происходит создание флаговой переменной типа int (т.е. 32 флага) с доступом через уникальный идентификатор объекта в операционной системе PSP и запуск вспомогательного потока:

Так вот, а вызываемый UsbAttach() устанавливает флаг USB_EVENT_ATTACH во флаговой переменной объекта UsbMainEventFlag:

При этом в предварительно созданном при вызове UsbStartFunc() потоке UsbMainThread() написано:

А это значит, что поток в бесконечном цикле ждет установки флага USB_EVENT_ATTACH или флага USB_EVENT_ASYNC во флаговой переменной объекта UsbMainEventFlag. Успешная установка связи с USB-хостом вызвала установку флага USB_EVENT_ATTACH, по которому этот поток выполняет асинхронный запрос на прием пакета данных по USB, при этом сбрасывая флаг USB_EVENT_ASYNC:

В этом запросе callback-ом устанавливается вызов функции UsbAsyncReqDone():

Эта функция, как мы видим, по завершению приема пакета данных от USB-хоста (обрабатываемого ядром операционной системы PSP по прерыванию от USB-контроллера PSP) выставляет флаг USB_EVENT_ASYNC во флаговой переменной объекта UsbMainEventFlag. По нему наш бесконечный цикл выставляет новый асинхронный запрос данных. Такой механизм событий позволяет не тратить процессорное время впустую на бесконечный опрос флага готовности данных, поскольку при вызове sceKernelWaitEventFlag() потоку не выделяются кванты времени до тех пор, пока не наступит необходимое событие — это обеспечивает планировщик потоков внутри операционной системы PSP, да и вообще этот базовый принцип работает в любой многозадачной операционной системе.

Написание сервиса для работы с USB для Linux под Raspberry Pi

Итак, PSP-часть завершена. Теперь время для разработки приложения, а точнее сервиса, который будет запускаться автоматически при включении Raspberry Pi под Linux. Вообще, для Raspberry Pi существует несколько адаптированных дистрибутивов Linux. Но я остановился на Fedora, т.к. он черпает свои корни от Red Hat, с которым я банально имел дело по работе и привык к его RPM дистрибуции пакетов. Сразу после установки Fedora Remix 18 и, в случае необходимости, настройки сети (в моем случае нужно было руками прописать сетевой адрес и шлюз, т.к. DHCP-сервер в домашней сети работает некорректно), которая делается интуитивно — подключив мышь и кликнув на значок сетевого соединения в правом верхнем углу, прямо из коробки работает SSH-сервер. А вот SMB-сервер оперативно настроить не удалось (проблемы с smbpasswd), поэтому исходник создавался и редактировался удаленно по SSH через midnight commander. Первое, с чего я начал, это подключение к PSP. Для этого нужно было узнать, как в Linux взаимодействовать с USB. В связи с этим произошла небольшая неприятная история, из-за которой, в очередной раз, у меня перед глазами рушится весь шарм линукса. Дело в том, что при попытке установить библиотеку и заголовочник для компиляции через

менеджер пакетов поругался и сказал что он устарел, используй libusbx. Хорошо, команда

скачала необходимые файлы. Но дело то в том, что libusbx по api-вызовам несовместим с libusb1, который одинаков с windows-версией libusb, которая, в свою очередь, использовалась в оригинальных исходниках RemoteJoyLite, да и вообще отлично работает под Windows. Но, ладно. С usb разобрались, теперь перейдем к доступу к геймпаду из под линукс. У меня в распоряжении есть проводной геймпад от Xbox 360, который отлично чувствует себя в Windows, и, на удивление, заработал из коробки в Fedora Remix 18 на Raspberry Pi, создав устройство /dev/input/js0. Это отработал штатный драйвер xpad. Существует альтернативный драйвер xboxdrv — он более гибок в конфигурировании. Но нам хватит и штатного.

Читайте также:  Как подключить яндекс кассу без сайта

Драйвер xpad входит в состав ядра Linux для андроида:

И точно так же создается устройство /dev/input/js0:

Например рассмотрим, как происходит получение списка устройств ввода в андроиде. Рекомендуемое api говорит нам для этого вызвать getDeviceIds(), в котором написано:

Тут вступает в дело сервис InputManager:

getId() приводит нас уже туда, где мы были (андроид удивителен):

В нативной части андроида экземпляр InputDevice() создается здесь (спасибо оперативному ответу с тостера):

Эта функция вызывается здесь:

Вызов функции notifyInputDevicesChanged() определен колбэком опять в уже знакомом сервисе InputManager:

Вызов самого колбэка инициируется в InputReader:

Так же здесь мы видим, что события от устройства ввода принимаются классом EventHubInterface:

И, в итоге, в реализации этого класса EventHub.cpp идет открытие и работа с устройством из /dev/input, как и в обычном Linux Fedora в Raspberry Pi:

А вообще, про всю эту систему ввода в андроиде вкратце объяснено в самих исходниках здесь:

Итак, итоговый исходный код сервиса имеет следующий вид:

Вот ссылка на двоичный файл сервиса. А вот также содержимое скрипта компиляции m.sh:

По самому исходнику хотелось бы отметить два момента. Во-первых, аналоговые стики Xbox имеют точность 16 бит, в то время как стик PSP имеет точность 8 бит. В связи с этим пакет я шлю по изменению приведенного к 8 битам значения осей, а не по изменению исходных данных от контроллера Xbox. Во-вторых, в PSP значение диагоналей соответствует полной шкале (т.е. круглый стик PSP с точки зрения шкалы — это квадрат), а в Xbox, как и положено, половине шкалы:

Поэтому введен линейно увеличивающийся (чем больше отклонение от центра оси контроллера Xbox, тем больше) коэффициент с максимумом в 1.4 (хотя, как выяснилось позже, правильно было бы определять значение угла, и чем ближе угол к диагонали, тем больше делать коэффициент). С этими значениями геймпад Xbox ощущается без какого то ни было дискомфорта, хоть чисто технически чувствительность и получилась загрубленной. В Doom 0.05 управлять удобно, в Dungeon Siege все три скорости перемещения (в зависимости от силы отклонения стика) работают и ощущаются как на самой PSP. Ибо, при столкновении с проблемой, в начале был опробован простой коэффициент (и 1.5, и 1.4), без линейного увеличения в зависимости от отклонения, и в названных играх ощущался резкий дискомфорт — играть было невозможно.

Добавление собственного сервиса в автозагрузку в Fedora Remix 18 для Raspberry Pi

Поверхностное гугление по вопросу добавления программы в автозагрузку в Linux дает в основном рекомендации по модификации скрипта init rc. Но в нашем случае нужно поступить по-другому.

1. Сначала нужно скопировать наш сервис xbox2psp.o в /usr/local/bin и установить ему права запуска(все три бита).

2. Затем создать файл /lib/systemd/system/xbox2psp.service следующего содержания:

3. Перейти в папку /etc/systemd/system/ и создать ссылку командой

4. Перезагрузить конфигурацию демона автозагрузки:

5. Активировать автозапуск нового сервиса

6. При необходимости можно сразу запустить сервис командой

В итоге мы получили удобную возможность управлять PSP при помощи геймпада от Xbox 360. При желании этот проект можно модифицировать для подключения например Dualshock 3 по Bluetooth.
UDP 15.11.2020 обновлены ссылки на файлы

Источник

Как подключить дуалшок к псп

Сообщение ScooloV » 18 май 2010, 11:40

Этот небольшой гайд именно для тех, кто имеет лишь PSP, но очень хочет играть в файтинги на турнирах.
Кстати это одна из самых популярных консолей среди файтеров-новичков (обычно школьников), да и в последнее время из файтингов на неё вышли актуальные Guilty Gear, Tekken, BlazBlue и Soul Calibur. Одно из решений – установка специальных плагинов, дабы определяться у PS3 как проводной пад, второе решение сейчас будет расписано.

Итак мы имеем две проблемы, маленький экран и неудобное управление. Решаются они очень просто, установкой плагина RemoteJoyLite и «прикручиванием» Dualshock’a к нему. Теперь немного по порядку. Данный метод работает на всех PSP с модифицированными прошивками (даже виртуальными).

— Качаем прикрепленный архив RemoteJoyLite_020a.rar и распаковываем его

Если вы ни разу не устанавливали плагины на свою PSP, то требуется сделать следующее
— На карте памяти PSP создаем папку [seplugins]
— В этой папке создаем вручную файлы VSH.TXT, GAME.TXT, POPS.TXT

— Закидываем в папку [seplugins] файл RemoteJoyLite.prx
— Добавляем в каждый из текстовых файлов строчку «ms0:/SEPLUGINS/RemoteJoyLite.prx», закрываем и сохраняем файлы

Теперь приставка знает о существовании новых плагинов, надо лишь их включить

— Заходим в Recovery Menu консоли (у настоящих прошивок требуется при включении нажать [R], у виртуальных включаем консоль, нажимаем SELECT и заходим в него)
— Выбираем наш плагин и переводим в значение Enabled (включено)
— Можно выбрать еще зарядку от USB кабеля, дабы не подрубать к PSP зарядку, во время игры
— Выходим из Recovery, выбрав пункт Exit.

Читайте также:  Как подключить камеру в вконтакте

Полдела сделано, теперь плагины включены.

— Подключаем USB кабель к компьютеру
— Windows сразу же попросит у драйвера для нового устройства PSP Type B. Найти их можно в папке LibUSB/driver или LibUSB/driver_х64 в зависимости от типа вашей системы
— После того как драйвера установятся (или уже были установлены) запустите сам RemoteJoyLite.exe или RemoteJoyLite_en.exe. Если вы все сделали правильно, то на экране в окошке появится картинка с экрана PSP.

Теперь небольшие настройки:
— Нажимаем SELECT и ставим в [CPU CLOCK XMB] и в [CPU CLOCK GAME] значения 333/166

Программа поддерживает несколько горячих клавиш
1) ESC/Right-Click – меню настроек
2) F1 – отобразить/скрыть счетчик FPS
3) F3 – включить/выключить отображение картинки с PSP
3) F4 – отобразить/скрыть рамку вокруг окна программы
4) F11 – снять скриншот (появится в папке Capture)
5) F12 – записать видео ролик (появится в папке Capture)
6) Alt+Enter/Double-Click – вход и выход из полноэкранного режима.

Теперь нужно установить у себя в системе джойстик, это может быть либо Dualshock3, согласно инструкции в разделе, либо любой другой пад/стик с USB переходником для PS3/PC (для демонстрации использовал второй случай). Настраиваем пад в программе:
— Нажимаем правой кнопкой мыши на окно RemoteJoyLite, либо жмем ESC
— Выбираем меню Joy (если у вас там ничего внятного не отображается, нужно в своей Windows установить/включить поддержку азиатских языков)
— Начинаем тыкать по клавишам джойстика, если цифры в Joy Status начинают меняться, то переходим к следующему шагу. Если же ничего не отображается, выбираем вместо [Use Joy00] следующий [Use Joy01] и так до тех пор, пока в Status’e не начнут меняться цифры
— Зажимаем кнопку на джойстике, которую хотим забиндить (например [O]) и не отпуская её нажимаем [O] в самой программе.

После проделанных действий должно получиться что-то вроде этого

Ну и после этого наслаждаемся любимым файтингом на большом экране, управляя с дуалшока, и подготавливаясь взять призовое место на ближайшем турнире. Если звук с колонок PSP вам не нравится, можно подрубить туда колонки или наушники со своего ПК.

( Немного скринов )




Источник

Как подключить джойстик к ps3

Несмотря на то что персональные компьютеры пользуются большей популярностью у геймеров, многие используют и игровые консоли. Фирмы — производители стараются сделать контроллеры эргономичными, функциональными и прочными. Однако, иногда геймпад выходит из строя и возникает необходимость в приобретении и подключении нового девайса. Также эта необходимость может появиться в случае, если Play Station пользуется несколько игроков одновременно.

Как подключить новый джойстик DualShok 3 к PS3

Игровая консоль Sony Play Station 3 является очень распространённой. При этом приставка уже не является новинкой. Несмотря на это, цены на новые контроллеры достаточно высокие. Поэтому многие владельцы ищут альтернативные варианты геймпадов. Некоторые приобретают китайские аналоги, которые не отличаются высоким качеством или стараются найти и подключить контроллер от более ранних версий консоли Sony.

Самыми распространёнными вариантами, которыми пользуются владельцы приставок, являются:

СПРАВКА. Если использование DualShok 4 совместно с Play Station 3 допускается, то DualShok 3 работать с PS4 не будет.

Использование нового DualShok 3 с Sony PS3 является самым простым решением возникшей проблемы. Конечно, в таком случае, придётся потратить достаточно крупную сумму денег.

Подключение нового контроллера осуществляется следующим образом:

Помимо подключения с использованием провода, приставку PS3 можно подключить и по беспроводной технологии. Обычно, игровой процесс и осуществляется без использования проводов.

СПРАВКА. Самое первое подключение нового контроллера должно быть выполнено только с помощью кабеля! Перед началом процедуры соединения устройств, необходимо полностью зарядить джойстик.

Чтобы подключить манипулятор к Play Station 3 по беспроводной технологии потребуется:

Процедура подключения выглядит следующим образом:

При необходимости к консоли можно присоединить и дополнительный джойстик:

Почему джойстик не подключается к PS3?

При подключении нового контроллера, у владельцев может возникнуть не только вопрос «Как включить джойстик на ПС3?», но и «Почему джойстик не подключается?» Самой распространённой причиной, по которой не удаётся выполнить присоединение, является то, что контроллер полностью разряжен. В этом случае требуется полностью зарядить устройство.

Также одной из причин может быть — покупка неоригинального изделия. В этом случае пользователь не застрахован от того, что джойстик может быть или полностью не рабочим, или консоль не сможет распознать геймпад. Помимо этого, неоригинальные джойстики имеют очень ограниченный функционал, что сказывается на качестве игрового процесса. Специалисты советуют приобретать только оригинальные изделия, чтобы избежать возможных проблем при подключении или возникновения сложностей при использовании изделия. Выполнить же присоединение нового оригинального джойстика не доставляет больших трудностей.

Источник