Мышиный Антиконвертер (Самопалка на тему COM -> USB или PS/2. Тренируемся на переходниках!)

Все, что не подходит под определение "старого софта и железа", обсуждается здесь
Аватара пользователя
EJSanYo
Advanced Member
Сообщения: 414
Зарегистрирован: 27.12.2007,23:55

Вклад в сообщество

Мышиный Антиконвертер

Сообщение EJSanYo » 30.07.2015,23:32

Самопалка на тему COM -> USB или PS/2. Тренируемся на переходниках!

Как-то было дело, в прошлой теме затронут был вопрос, мол, раз уж можно превратить PS/2 в COM, то можно ли наоборот? И подумалось тогда, а в самом деле, не в теории, а на практике, возможно ли? И после некоторого исследования вопроса родилось вот такое чудо. Встречаем, "Антиконвертер"!

Изображение

Переходник поможет подключить вашу, видавшую ещё молодого Гейтса, квадратную шариковую мышь к современной или не очень вычислительной машине при помощи относительно современного USB или PS/2 интерфейса. Давая тем самым "айтишникам" со стажем лишний повод вспомнить молодость и пустить скупую слезу, а новичкам - познать все прелести проскальзывания и тугих кнопок особенностей функционирования ещё "того" аппаратного обеспечения и, тем самым, немного приобщиться к даунгрейдерской субкультуре! :biggrin: Шучу, конечно. Настоящей целью создания сего поделия было изучение особенностей протокола, используемого в PS/2, и в частности, создание функциональной части, способной адекватно взаимодействовать с компом и выдавать себя, в частности, за PS/2 мышь. Которая будет использована в дальнейшем в прошивке более функционального переходника. Поскольку его плату лишний раз мурыжить ради этого не хотелось, и был придуман такой "облегчённый" макет.

И так, в настоящий момент (начиная с прошивки v.0.9) плата работает с мышами, работающими протоколом M$ Mouse для двух кнопок (без всяких "расширений для третьей кнопки и колеса"), а также протоколом PC Mouse (известным ещё как Mousesystem Mouse) с поддержкой трёх кнопок. Т.е., с самыми банальными и распространёнными. Распознаётся тип протокола автоматически: если в течение 200 мс после включения питания мышь не выдаёт признак M$ мыши (символ "M"), переходник полагает, что к нему подключена PC Mouse.

В зависимости от положения джампера переводит перемещения и нажатия кнопок либо в действия эмулируемой HID мыши на USB, либо эмулируемой стандартной (т.е. той, что без колеса и пяти кнопок) PS/2 мыши. Каких либо регулировок чувствительности и прочих дополнительных функций пока не реализовывал.

Переходник тестировался под Windows 98, XP, 7 x64, а также с различными DOS-овскими драйверами на как минимум десяти материнских платах различных производителей и поколений, а также под моим собственным переходником PS/2 -> COM, и на текущем этапе заработал везде.

Для удобства перепрошивки был добавлен также DFU Bootloader из проекта LUFA USB, немного подправленный для применения на моей плате.

Если кто-либо пожелает повторить переходник, или хотя бы ознакомиться с его принципом работы, вот все файлы проекта:

Аппаратная версия 1.0
v.0.9.6 beta
предыдущие версии:
v.0.9
v.0.8 beta
v.0.7 beta

В архивах сама прошивка, принципиальная схема и скриншоты фьюзов для использования прилагаемого бутлоадера и без него.

Бутлоадер
LUFA DFU Bootloader

В архиве проект под Atmel Studio, а также инсталляшка Atmel Flip (Атмеловской софтины для перепрошивки)


Некоторые технические подробности:

В качестве контроллера был взят AT90USB162. Примечателен он тем, что содержит в себе как более-менее полноценный физический уровень USB, так и некоторые элементы PS/2! Правда на аппаратном уровне там реализован, по сути, лишь его выходной каскад, а всё остальное приходится воспроизводить на уровне кода прошивки. Что практически ничем не отличается от "дрыганья ногами" обычного порта ввода-вывода.

Для эмуляции USB мыши были использованы встроенные библиотеки среды CodeVisionAVR (весьма удобные, стабильные и простые в применении, кстати), поэтому для компиляции проекта нужна её версия не ниже 3.12. Но есть и уже откомпилированный hex, он находится в папке \Release\Exe.

Для работы с COM портом используется асинхронный буфер, заполняемый по прерываниям UART. Процедуры сочинил сам мастер CodeVision.

С эмуляцией PS/2 всё гораздо сложнее. На данном этапе используется реализация, основанная на изысканиях dtvims (http://rukodelie-ds.ru/forum/viewtopic.php?t=619 и библиотеке ps2dev из проекта Arduido). Всё это, впрочем, пришлось во многом переосмыслить и доработать. На данном этапе формирование самих сигналов интерфейса выполняется программно, однако периодическая проверка на предмет опроса и конфигурирования мыши хостом сделана по прерываниям таймера. Часть "второстепенных" команд заменена "затычками" (переходник говорит, мол, "команда принята", но на деле ничего в своей работе не меняет). Примерно так же, как делали многие производителей поздних чипов для PS/2 мышей. :08: На практике это, по большому счёту, ни на что не влияет. Кроме того, из-за отсутствия адекватного оборудования, "второстепенные" режимы работы (по запросу и эхо) пока не тестировались. А из-за, как выяснилось, исключительного разнообразия особенностей работы хостовой части PS/2 на разных материнских платах, пока едва ли можно гарантировать, что текущая реализация их все учитывает и будет работать в любой ситуации.

Небольшие пояснения по схеме (по аппаратной версии 1.0):
XP1 - разъём DB-9 под COM-порт, XS1 - mini-DIN 6 для PS/2 мыши, XS2 - USB разъём (я брал полноразмерный USB-B). XP2 - линейка пинов для подключения программатора. Для соединения XS1 с портом компа я доработал провод от сломаной мышки (нет, сломалась она не в ходе этих экспериментов :biggrin: ).
Джампер XP4 в замкнутом состоянии активирует режим PS/2, в разомкнутом - USB. Проверяется он один раз при подаче питания. ВНИМАНИЕ!!! Перед тем, как включить комп в розетку (даже не просто перед "включить кнопкой". Ибо на разъёмах часто имеется дежурное питание даже при выключенном компе) правильно выставите джампер в соответствии с выбранным интерфейсом! В противном случае есть совсем небольшой, но всё же риск чего-нибудь сломать. (в USB уровни сигналов составляют порядка 3 вольт, а в PS/2 - порядка 5).

Джампер XP3 может активировать бут-загрузчик. В принципе Atmel записывает свой загрузчик в AT90USB162 прямо с конвейера. Но всё же я бы рекомендовал использовать тот, который прилагается в отдельном архиве.
Чтобы его откомпилировать, требуется поставить Atmel Studio, да ещё и LUFA стек поверх. :eek: Однако можно просто взять готовый hex из папки BootLoader_DFU\LUFA_DFU_16KB_4KB_1\LUFA_DFU_16KB_4KB_1\Release Кроме того, потребуется выставить правильно фьюзы (см. скриншот в архиве с основной прошивкой). ВНИМАНИЕ! Фьюзы BootLock нужно выставлять после заливки бутлодера в чип. А можно и не выставлять вообще. Состояние джампера проверяется в момент подачи питания, при этом комп его увидит как "Atmel USB Device". Драйвера на него после установки Atmel Flip искать в папке Program Files\Atmel\Flip 3.4.7\usb

Питание на переходник поступает от USB или PS/2. Никакого дополнительного источника, конечно, не тебуется.

Светодиод VD1 подмигивает при заливке прошивки через программатор, при успешном опознавании COM мыши и при получении от неё пакетов данных. Также он мигает, когда активен прилагаемый бут-загрузчик.
Хорошо иметь DOOM-ик в деревне!

Anonymous1
Advanced Member
Сообщения: 2727
Зарегистрирован: 22.11.2011,09:41
Откуда: Москва(Россия)

Вклад в сообщество

Сообщение Anonymous1 » 31.07.2015,10:08

Очень полезный проект! Вот у меня, например, есть множество 3-кнопочных мышек с rs232-выходом, которые прекрасно работают под дос и всевозможными юникс-подобными ос, но которые категорически винда отказывается опознавать, т.к. они тупые, в том числе есть со внутренностями, реализованными без микроконтроллера, на дискретных кмоп-микросхемах, и сразу переходят в работу, не выдавая байта отклика при инициализации, по которому винда мышу неподвижную опознаёт, насколько я понял. Потому цеплянием их на имеющиеся com-порты или через usb конвертер на ft232 с виндой их не подружить, не куроча виндовый драйвер. Я тоже на 162й в 12м году для этого спаял переходку на макетке, но так и забросил, т.к. сам винду не запускаю, а из покупателей мышей никто не жаловался пока. Такое у меня безобразие http://qbus.narod.ru/pic-241.jpg - с расчётом еще и на полную замену внутренностей мышки, кроме rs232 от максимчиков, на дополнительные гребёнки выведены дискретные сигналы для кнопок и оптопар.

Аватара пользователя
EJSanYo
Advanced Member
Сообщения: 414
Зарегистрирован: 27.12.2007,23:55

Вклад в сообщество

Сообщение EJSanYo » 31.07.2015,11:04

Anonymous не исключено, что у вас мыши с протоколом "PC Mouse". Они как раз при активации ничего не выдают в порт. В таком случае, с той прошивкой, что сейчас, мой переход также работать не стал бы, поскольку программировался на протокол "MS Mouse". :rolleyes: С прошивкой, доработанной в части декодирования протокола мыши, наверно заработал бы.
Однако дело может обстоять и иначе - что ваши мыши вообще сделаны не под COM порт, а под специальную плату расширения. Как раз такую-то мышь и возможно было сделать на простейшей рассыпухе, не привлекая программируемую логику. Очевидно, с таким интерфейсом COM порт не работает. И моё поделие, очевидно, также работать не будет. Однако и в этом случае, если вы нагуглите истинное назначение контактов вашего разъёма, то скорректировав аппаратную и программную часть моего перехода, вполне смогли бы его приспособить для своих задач.
Хорошо иметь DOOM-ик в деревне!

Anonymous1
Advanced Member
Сообщения: 2727
Зарегистрирован: 22.11.2011,09:41
Откуда: Москва(Россия)

Вклад в сообщество

Сообщение Anonymous1 » 31.07.2015,11:25

Я же написал, что под дос и *никс они прекрасно работают, там com-порт реализаован на 1002хл1 и в более старых на 564ир6. Прекрасно работают и с графическими станциями NCD, которые гениусами комплектовались при продаже. Протокол, естественно, pcmouse.

Аватара пользователя
EJSanYo
Advanced Member
Сообщения: 414
Зарегистрирован: 27.12.2007,23:55

Вклад в сообщество

Сообщение EJSanYo » 31.07.2015,12:00

Anonymous почитал даташит на эту самую ХЛ...и правда, ну просто очень железный чип! Каждую команду и состояние вывели на выделенные ноги. :biggrin:
Так что можете попробовать вариант №1. Будут вопросы - спрашивайте. Сразу обратите внимание на периодический сброс буфера пакета мыши по таймеру.
А может и я в процессе тоже попробую, спортивного интереса ради. Пара мышей, якобы умеющих "PC Mouse", у меня есть. Хоть и не настолько винтажных, чтобы совсем на рассыпухе.
P.S. Кстати, если не секрет, что это за модели у вас такие мышей? Неужели советские?
Хорошо иметь DOOM-ик в деревне!

Anonymous1
Advanced Member
Сообщения: 2727
Зарегистрирован: 22.11.2011,09:41
Откуда: Москва(Россия)

Вклад в сообщество

Сообщение Anonymous1 » 31.07.2015,12:07

Да, с подводных лодок списанные. Хотя, много куда ставились у вояк.

Аватара пользователя
EJSanYo
Advanced Member
Сообщения: 414
Зарегистрирован: 27.12.2007,23:55

Вклад в сообщество

Сообщение EJSanYo » 31.07.2015,12:35

В процессе реставрации одного своего COM мыша с забавным названием "AK-77" (именно его немного видно на фото) сделал забавное наблюдение:

При вскрытии обнаружилось, что выполнен он на основе чипа EM83701. Так вот, оказалось, что если ноги 1 и 16 чипа замкнуть перемычкой, то мышь входит в режим т.н. "динамического разрешения". Меняет свою чувствительность в зависимости от скорости перемещения. Как результат - мышь двигается гораздо быстрее и отзывчивее, в чём-то даже приближаясь к своим PS/2 сородичам! Или как минимум, гораздо лучше, чем было. Забавно, что именно об этом кричали надписи на коробке (да, у меня сохранилась родная коробка от неё), да только до моего вмешательства эта фича не была активирована. Китайцы сами поставить перемычку не догадались. Видимо, невнимательно читали даташит. :08:

Вывод: таким образом, настоящим гуртовщикам мыши настоятельно рекомендуется знать элементную базу своих манипуляторов. Как знать, может и в вашей мыши таится ещё не раскрытый потенциал!
Anonymous ё моё, люди, где вы умудряетесь такое доставать?! :biggrin: Я в шоке.
Хорошо иметь DOOM-ик в деревне!

Аватара пользователя
EJSanYo
Advanced Member
Сообщения: 414
Зарегистрирован: 27.12.2007,23:55

Вклад в сообщество

Сообщение EJSanYo » 03.08.2015,00:08

Обновление прошивки!
Добавил поддержку протокола PC Mouse. Теперь если после подачи питания переходник некоторое время не получает байта, идентифицирующего майкрософтовский протокол (символ "M"), он решает, что к нему подключена PC Mouse. Кроме того, прикрутил немного модифицированный бут-загрузчик, чтобы каждый раз не лезть в стол за программатором. :rolleyes:

Ряд замечаний по поводу PC Mouse
Хмм, как оказалось, все мыши под COM, что у меня есть, его поддерживают! Даже те, у которых на пузе нет соответствующего рубильника. В таких мышах чтобы активировать второй протокол надо в аккурат перед подачей питания зажать любую из кнопок. В случае моего переходника это означает "перед подачей питания на переходник". В случае прямого соединения с компом - "перед загрузкой драйвера мыши". После сброса питания мышь переходит снова в M$ режим. Так что я там ранее говорил про разнообразные "скрытые возможности" в мышах?

Впечатления от дополнительного режима
Как и ожидалось, поскольку теперь в пакете передаётся не три, а уже пять байт, причём на всё той же скорости 1200 бит/с, двигаться мышь стала более грубо и дёргано. Но за счёт "двойной" передачи координат за одну посылку, максимальное ускорение, с которым можно дёрнуть мышь, стало явно больше. Что лучше, честно говоря, затрудняюсь ответить. В играх, возможно, подобная медлительность на пользу бы не пошла. Третья кнопка активирует "прокрутку мышью" в современных браузерах и многих программах. Однако полноценное колёсико она, само собой, заменить не может.
Хорошо иметь DOOM-ик в деревне!

Аватара пользователя
EJSanYo
Advanced Member
Сообщения: 414
Зарегистрирован: 27.12.2007,23:55

Вклад в сообщество

Сообщение EJSanYo » 19.09.2015,23:24

Почти месяц уже пытался перевести наконец алгоритм PS/2 функции на "аппаратную основу". Т.е. заменить программные задержки на работу по прерываниям таймера, что значительно разгрузило бы ядро контроллера. И...о б-же мой! :mad: И хоть тов. dtvims как бы уже предупреждал, всё равно, я даже предположить не мог, насколько же индивидуальны и придирчивы до мелочей PS/2 контроллеры на различных матерях. Если им при инициализации мыши хоть что-то не понравилось, они тупо затыкаются и сообщают, что мыши нет. Даже ни разу не пытаясь перезапустить. При том, что отладка интерфейса крайне затруднена из-за изолированности интерфейса от основной системы компьютра. Драйвер мыши просто получает от контроллера признак, есть мышь, или нет. В этом плане у меня особо выделилась интеловская DH55TC с "комбинированным" портом PS/2. В который она при работе периодически шлёт какую-то полную чушь, типа импульсов DATA=0, при этом не меняя состояние CLK. При определённых настройках времянки импульсов мыши эта мать вообще наглухо зависает на старте! :eek: Пока не оторвёшь переходник. Но при этом любая "живая" PS/2 мышь работает чётко и на любой материнке. ЧЯДНТ, в конце концов?
Хорошо иметь DOOM-ик в деревне!

Аватара пользователя
EJSanYo
Advanced Member
Сообщения: 414
Зарегистрирован: 27.12.2007,23:55

Вклад в сообщество

Сообщение EJSanYo » 19.09.2015,23:40

Небольшое обновление прошивки!
Так что пока доделал хотя бы "программную" реализацию алгоритма. А то совсем затихло у меня как-то всё. И хоть кое-что до сих пор остаётся неясным, v.0.9 теперь чётко определяется и работает на всех моих материнских платах. На той самой DH55TC в том числе. Справедливости ради отмечу, что те немногие проекты эмуляции PS/2 периферии, что удалось найти в Интернетах, были все также сделаны на программых задержках. И даже прошивка для контроллеров Cypress, на которых работают одни из лучших мышей с PS/2, похоже, также работает чисто с программным опросом (характерная процедура mouse_poll(), вызываемая в основном цикле прошивки).
Хорошо иметь DOOM-ик в деревне!

Гость

Сообщение Гость » 20.09.2015,14:44

EJSanYo, может быть, аппаратные прерывания попадают не в такт с передачей данных в PS2... Чуть торопятся или опаздывают, попадая на 3/4 такта шины PS2... И отрегулировать сие трудно, ибо сами задержки имеют переменную длину, по времени...
или рассинхрон берётся оттого, что прерывание контроллером обрабатывается быстрее, чем завершится такт PS2 шины...

Экскузьми, глубоко не рыл сию тему.

Ответить