РадиоКот >Лаборатория >Цифровые устройства >
Как прикошачить джойстик от PlayStation к USB. Часть первая.
В этой статье я постараюсь изложить свой опыт по адаптации джойстика от Sony PlayStation к USB. Начнём с того, что джойстики в USB это HID устройства, которые работают в виндах в минимальной конфигурации без сторонних драйверов. Как говорится Plug and Play в прямом смысле.
Начинал я с того, что наткнулся на IgorUSB реализацию USB устройства на AVR от Игоря Чешко. Но Чешко пишет на ASM и, для меня, разбираться в этом деле было тяжко. Ко всему этому я не смог найти документацию на HID. Всё что нашёл, это генератор HID кадров от Microsoft. Потом мне встретился MJoy. Тут ребята уже реализовали джойстик, но он был какой-то МАКСИМАЛЬНЫЙ. В нём куча кнопок и осей, и опять же ничего не понятно по отношению к HID. И тут нашему вниманию открывается статья из Журнала Радио 1/2007. Ребята реализовали то что я так давно порывался сделать. Ну значит скачал я это дело и начал разбираться. О ужас, что они понаворотили! Какой неграмотный, на мой взгляд, код! Я сел и начал его чистить. Исходный код от журнала был рассчитан на 2 джойстика PSX2 в одном устройстве. Но у меня на руках один джойстик да ещё и от PSX. Если кто не в курсе, то разница в джойстиках у PSX и PSX2 в наличии у последнего аналоговых осей. И задача у меня стояла, сделать именно USB джойстик, а не переходник.
После непродолжительных поисков, я таки нашёл описание протокола работы джойстика и расположение контактов.
Как вы могли заметить из таблицы, то джойстик работает на SPI шине. Только есть ещё одна нога ACK. Она используется как подтверждение корректности переданных джойстиком данных. Все команды и параметры состоят из 1 байта по 8 бит. После каждого удачно переданного или принятого байта, джойстик дергает ногой ACK на 1 клок, если этого не произошло - считается, что передача закончилась неудачей.
Система команд у джойстика проста как никогда.
Первым байтом джойстику всегда надо передать 0x80, а вторым 0x42. Одновременно с передачей второго байта, необходимо принимать от джойстика данные, которые будут являться идентификатором типа джойстика. Я смог найти 5 разных идентификаторов. Такие как:
0x41 Standard Digital Pad (PSX)
0x23 NegCon (https://en.wikipedia.org/wiki/NeGcon)
0x73 Analogue Controller in Red Mode (PSX2) (https://en.wikipedia.org/wiki/Dual_Shock_2)
0x53 Analogue Controller in Green Mode (PSX2)
0x12 PSX Mouse
После этого контроллер шлёт джойстику 0xFF параллельно принимая ответ. Длина ответа у каждого джойстика разная. Но первый байт ответа всегда равен 0x5A. Во всех приведённых ниже данных, нажатие на клавишу соответствует 0. Т.е. если все клавиши нажаты данные будут равны 0х00, в противном случае 0хFF.
Для джойстика 0x41 Standard Digital Pad (PSX) это выглядит так:
Bit 7 - SLCT: Select Button
Резиновая клавиша SELECT. Это она только на джойстике select, мы же сможем использовать её как захотим.
Bit 6..5 - Res: Reserved Bits
Bit 4 - START: Start Button
Резиновая клавиша Старт. Всё то же самое, что и с SELECT.
Bit 3 - UP: Up Button
Bit 2 - RIGHT: Right Button
Bit 1 - DOWN: Down Button
Bit 0 - LEFT: Left Button
4 клавиши обозначающие крест на джойстике.
Bit 7 - L1: Левый верхний шифт
Bit 6 - R1: Правый верхний шифт
Bit 5 - L2: Левый нижний шифт
Bit 4 - R2: Правый нижний шифт
Bit 3 - Зелёная клавиша
Bit 2 - Красная клавиша
Bit 1 - Синяя клавиша
Bit 0 - Розовая клавиша
После приёма DATA2 контроллер может повторить всё сначала и делать так постоянна, дабы быть в курсе состояния клавиш джойстика.
Для джойстика 0x23 NegCon это выглядит так:
Я не буду подробно расписывать кнопки, думаю из предыдущего описания и так всё понятно.
Bits 7..0 - STE7..0: Угол поворота
Это положительное число в диапазоне от 0 до 255 характеризует угол поворота главной оси джойстика.
Bits 7..0 - BUT17..0: Степень нажатия I
Bits 7..0 - BUT27..0: Степень нажатия II
Bits 7..0 - L17..0: Степень нажатия L1
Для джойстика 0x73 Analogue Controller in Red Mode это выглядит так:
Как вы могли заметить, у этого джойстика формат данных не сильно отличается от обычного цифрового джойстика. Разве что добавилось ещё 2 кнопки.
Bit 6 - JOYL: Нажатие на левый джойстик
Bit 5 - JOYR: Нажатие на правый джойстик
Тут ничего не изменилось.
Bits 7..0 - RJX7..0: Ось Х правого джойстика
Bits 7..0 - RJY7..0: Ось Y правого джойстика
Bits 7..0 - LJX7..0: Ось Х левого джойстика
Bits 7..0 - LJY7..0: Ось Y левого джойстика
Как вы уже могли догадаться все оси имеют диапазон значений от 0 до 255, с центром в 127.
Что же касается джойстика 0x53 Analogue Controller in Green Mode то у него отличие только в порядке бит данных DATA1 и DATA2 в следующей форме:
Видно, что клавиши перемешались. Зачем это надо я не знаю - у меня не было соньки никогда. Что касается аналоговых осей, то там всё так же.
Мышь я даже рассматривать не буду, ибо это настолько ущербный пережиток.
Вот и кончилась теория. Перейдём к практике.
Т.к. когда я разводил и травил плату, я ещё не знал о SPI режиме джойстика и делал всё рассчитывая, что всё получится. В итоге я получил такую схему:
Прошу простить за качество схемы, но делалось на скорую руку.
Печатная плата получилась следующего вида:
Я старался расставить отверстия так, как в джойстике находятся рёбра жёсткости, но в итоге всё равно уплыл в сторону. Может у вас получится лучше.
После всего этого остаётся всё напаять и прошить процессор. Плата разрабатывалась с учётом установки непосредственно в корпус джойстика, что у меня с успехом и получилось. Родной провод джойстика я просто выкинул и заменил его купленным в ближайшей лавке USB A-B проводом, с отрезанной частью USB-B.
Устройство не требует наладки и работает при правильной сборке сразу после включения.
Прошивка, которая идёт с этой статьёй отлажена для работы с Standard Digital Pad. Если вы собираетесь использовать её для работы с Analogue Controller, то необходимо будет в Makefile изменить PSX = 1 на PSX = 2 и пересобрать код. Замечу, что я НЕ писал PSX2 код. Он находится в стадии отладки и будет в такой пока я не найду таковой джойстик или кто-то то не поделится "впечатлениями". Я буду рад помочь довести код до ума, но пока в этом просто не смысла. Так что пишите.
Файлы:
Схема и печатная плата в формате Eagle.
Прошивка котроллера.
Исходники прошивки.
Вопросы, как обычно, складываем тут.
Как вам эта статья?
|
Заработало ли это устройство у вас?
|
|
|