РадиоКот :: Как прикошачить джойстик от PlayStation к USB. Часть первая.
Например TDA7294

РадиоКот >Лаборатория >Цифровые устройства >

Теги статьи: Добавить тег

Как прикошачить джойстик от PlayStation к USB. Часть первая.

Автор: Spider
Опубликовано 10.04.2007

Часть первая - PSX.

В этой статье я постараюсь изложить свой опыт по адаптации джойстика от 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 джойстик, а не переходник.

После непродолжительных поисков, я таки нашёл описание протокола работы джойстика и расположение контактов.

Разъем
Table 1

Как вы могли заметить из таблицы, то джойстик работает на 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) это выглядит так:

Table 2

  • 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 клавиши обозначающие крест на джойстике.

    Table 3

  • Bit 7 - L1: Левый верхний шифт
  • Bit 6 - R1: Правый верхний шифт
  • Bit 5 - L2: Левый нижний шифт
  • Bit 4 - R2: Правый нижний шифт
  • Bit 3 - Зелёная клавиша
  • Bit 2 - Красная клавиша
  • Bit 1 - Синяя клавиша
  • Bit 0 - Розовая клавиша

    После приёма DATA2 контроллер может повторить всё сначала и делать так постоянна, дабы быть в курсе состояния клавиш джойстика.

    Для джойстика 0x23 NegCon это выглядит так:

    Table 4

    Я не буду подробно расписывать кнопки, думаю из предыдущего описания и так всё понятно.

    Table 5

  • Bits 7..0 - STE7..0: Угол поворота

    Это положительное число в диапазоне от 0 до 255 характеризует угол поворота главной оси джойстика.

    Table 6

  • Bits 7..0 - BUT17..0: Степень нажатия I
  • Bits 7..0 - BUT27..0: Степень нажатия II
  • Bits 7..0 - L17..0: Степень нажатия L1

    Для джойстика 0x73 Analogue Controller in Red Mode это выглядит так:

    Table 7

    Как вы могли заметить, у этого джойстика формат данных не сильно отличается от обычного цифрового джойстика. Разве что добавилось ещё 2 кнопки.

  • Bit 6 - JOYL: Нажатие на левый джойстик
  • Bit 5 - JOYR: Нажатие на правый джойстик

    Table 8

    Тут ничего не изменилось.

    Table 9

  • Bits 7..0 - RJX7..0: Ось Х правого джойстика
  • Bits 7..0 - RJY7..0: Ось Y правого джойстика

    Table 10

  • Bits 7..0 - LJX7..0: Ось Х левого джойстика
  • Bits 7..0 - LJY7..0: Ось Y левого джойстика

    Как вы уже могли догадаться все оси имеют диапазон значений от 0 до 255, с центром в 127.
    Что же касается джойстика 0x53 Analogue Controller in Green Mode то у него отличие только в порядке бит данных DATA1 и DATA2 в следующей форме:

    Table 11

    Видно, что клавиши перемешались. Зачем это надо я не знаю - у меня не было соньки никогда. Что касается аналоговых осей, то там всё так же.

    Мышь я даже рассматривать не буду, ибо это настолько ущербный пережиток.

    Вот и кончилась теория. Перейдём к практике.
    Т.к. когда я разводил и травил плату, я ещё не знал о SPI режиме джойстика и делал всё рассчитывая, что всё получится. В итоге я получил такую схему:

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

    Плата

    Я старался расставить отверстия так, как в джойстике находятся рёбра жёсткости, но в итоге всё равно уплыл в сторону. Может у вас получится лучше.
    После всего этого остаётся всё напаять и прошить процессор. Плата разрабатывалась с учётом установки непосредственно в корпус джойстика, что у меня с успехом и получилось. Родной провод джойстика я просто выкинул и заменил его купленным в ближайшей лавке USB A-B проводом, с отрезанной частью USB-B.
    Устройство не требует наладки и работает при правильной сборке сразу после включения.
    Прошивка, которая идёт с этой статьёй отлажена для работы с Standard Digital Pad. Если вы собираетесь использовать её для работы с Analogue Controller, то необходимо будет в Makefile изменить PSX = 1 на PSX = 2 и пересобрать код. Замечу, что я НЕ писал PSX2 код. Он находится в стадии отладки и будет в такой пока я не найду таковой джойстик или кто-то то не поделится "впечатлениями". Я буду рад помочь довести код до ума, но пока в этом просто не смысла. Так что пишите.

    Файлы:
    Схема и печатная плата в формате Eagle.
    Прошивка котроллера.
    Исходники прошивки.

    Вопросы, как обычно, складываем тут.




    Как вам эта статья?

    Заработало ли это устройство у вас?

    11 0 1
    0 0 3