USB to COM mouse converter v.3 (Или USB по-китайски)

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

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

USB to COM mouse converter v.3

Сообщение EJSanYo » 16.03.2019,22:21

Или USB по-китайски

Настало время продолжить тему прикручивания современной периферии к устаревшим машинам. Прошло уже почти 5 лет с тех пор, как мне впервые удалось адаптировать более современную PS/2 мышь к старому доброму COM-порту. Но и сам PS/2 практически ушёл в прошлое. Так что логично, что следующим шагом должно было быть освоение USB интерфейса со всем изобилием устройств ввода под него. И...вот с этим начались проблемы. :08: Была попытка номер один на основе стека LUFA, но результат меня не полностью устроил.
В конце концов, после длительных поисков, мой выбор реализации USB-хоста остановился на модуле на основе очень китайского чипа CH375. В частности, такие модули часто попадаются на Алиэкспресс.
Изображение
CH375 - это, фактически, контроллер (как я понимаю, что-то на x51-ядре) с USB-хостом на борту. Работает под управлением внешней системы в командном режиме, для чего имеет параллельный и последовательный (немного извратная версия UART) интерфейс. Изначальное предназначение данных модулей - прикрутить к какой-нибудь ардуине поддержку USB-дисков, для чего в прошивке чипа предусмотрена масса специальных команд. Однако на самом деле он способен на большее, поскольку набор его команд охватывает самые разные аспекты USB.
Мне данный чип приглянулся тем, что берёт на себя большую часть низкоуровневых задач, но не ограничивает пользователя высокоуровневыми командами а-ля "прочитать сектор накопителя", давая возможность работать на уровне отдельных USB-пакетов. При этом в режиме параллельного интерфейса чип поддерживает весьма высокое быстродействие и стоит не слишком дорого. То что нужно для любительского конвертера интерфейсов! :thumbup: Есть, конечно, и минусы, главный из которых - языковой барьер. На английский переведено не более половины перечня поддерживаемых команд, библиотек и примеров работы с ним - вообще нисколько. Впрочем, Google Translate отчасти смягчает эту проблему.
Для нового переходника была сделана плата на основе контроллера Atmega8515. Такой выбор был сделан потому что данный чип имеет параллельный интерфейс внешнего ОЗУ, через который очень удобно подвешивать всякие подобные устройства (вспомнить, например, тот же дисплей на HD44780), да и в целом с AVR мне привычно работать.
Изображение Изображение Изображение

Аппаратная часть

Схема переходника выложена здесь: аппаратная версия v.3

Пара слов о схемотехнике:
Несложно увидеть, что схема в части COM-порта повторяет PS/2 переходник. Остальное - по сути простенький дешифратор адреса (поскольку мы пихаем модуль в адресное пространство ОЗУ) и схема согласования уровней сигналов 5В - 3,3В, поскольку китайцы решили применить для питания чипа 3,3В. Соответственно, такими же становятся его логические уровни интерфейса.
Для шины данных используется специальный двунаправленный буфер. Остальные сигналы имеют упрощённое согласование: поставлены буферы с открытым коллектором, а лог. единицы формируют встроенные подтяжки чипа.
Я оставил питание контроллера 5В, но если кто-либо захочет повторить переходник, можете попробовать запитать контроллер 3,3В, схема упростится.
Также имейте ввиду, что китайские модули попадаются, как минимум, в двух вариантах распиновки! Какая именно попадётся вам - внимательно смотрите на фото продавца. Как и в прошлом переходнике USB-порт используется лишь для подачи питания. "Настоящий" USB, само собой, находится на китайском модуле.

Программная часть

Во-первых, конечно, бутлоадер, адаптированный с предыдущего переходника, чтобы легче было перепрошивать контроллер. В частности, при помощи программы Avrdude.
Выложен он здесь: bootloader.
В папке EXE уже лежит готовый HEX-файл, который придётся прошить программатором.
"Фьюзы" контроллера в моём варианте выставлены так. Их тоже нужно прошить.
После чего, если зажать кнопку SB2 в момент подачи питания - запускается "AVR109-совместимый" бутлоадер на COM-порте на скорости 115200 бит/с. При этом оба светодиода загораются, сигнализируя о переходе в режим прошивки.

Текущая версия прошивки: v.0.0.5

В текущей прошивке реализован примерно такой же функционал, который ранее был достигнут на PS/2 мышах. Однако следует иметь ввиду, что пока что переходник работает с мышью в режиме "boot-протокола", о котором я рассказывал в предыдущем посте. Это значит, что поддерживаются 3 кнопки, но колёсико мыши - нет. Могут также не работать различные "крутые" и "геймерские" мыши, если их производитель не реализовал поддержку boot-режима.
При подключении девайса производится упрощённый анализ стандартных дескрипторов, что позволяет, по крайней мере, определить, действительно ли подключен девайс, содержащий логическое устройство - мышь с boot-протоколом, и какой номер лог. устройства использовать. Благодаря этому должны поддерживаться многие беспроводные мыши и комплекты клава+мышь.
USB-хабы не поддерживаются (не уверен пока, возможно ли при помощи данного чипа отсылать т.н. "pre-пакеты", нужные для работы хабов). Впрочем, для переходника на один физический девайс их поддержка не очень-то и требуется.
Реализовано три режима масштабирования скорости перемещения на выбор - замедление в 2 раза, без обработки, ускорение примерно в 2 раза. Переключение между режимами производится кнопкой SB1. При нажатии SB2 выбранный режим сохраняется в EEPROM контроллера и будет восстановлен при следующем включении питания.

Об индикации светодиодами:
  • Коротко мигает светодиод ACT - переходник перезапускает USB пытаясь поговорить с устройством. Скорее всего, ничего в переходник не подключено.
  • Перемигиваются USB и ACT - начальный этап инициализации. Устройство уже как-то увиделось.
  • USB и ACT начинают перемигиваться и тут же срываются в короткое мигание ACT и так в цикле - что-то пошло не так, скорее всего, возникает ошибка при запросе дескрипторов. Такое может случиться, например, если длина дескриптора превышает 64 байта - такое бывает для USB 2.0 устройств, но на мышах до сих пор подобного не встречал, так что, скорее всего, вы подключили НЕ мышь! Более того, для USB 1.1 длина дескрипторов в принципе ограничена теми самыми 64 байтами.
  • USB горит непрерывно, ACT мигает при каждом новом пакете данных мыши - нормальный рабочий режим.
  • USB и ACT мигают одновременно - переходник не нашёл в девайсе мышь и/или поддержку boot-протокола. Вполне возможно, что вы подключили не мышь!
Кстати, hot-plug поддерживается! Можно менять девайсы без выключения питания.

На всякий случай предыдущая версия прошивки, которая умеет меньше: v.0.0.2 alpha

Об отличиях CH375 и CH376

В последнее время в китайских магазинах модули на основе чипа CH376 стали попадаться значительно чаще, чем на CH375. Это чип более свежей разработки. Основное отличие от предыдущего поколения заключается в поддержке USB-дисков, которая у CH376 осуществляется уже не на уровне посекторной записи/чтения, а на уровне файловых операций. Поддерживаются FAT16 и FAT32 с английским и, само собой, китайским набором символов. Отличия также заключаются в работе UART-интерфейса, и, кроме того, был добавлен SPI-интерфейс. Параллельный порт изменениям не подвергался. В части же работы с пакетами USB данный модуль практически идентичен CH375. Единственное найденное отличие - разработчики непонятно для чего заменили команду WR_USB_DATA7 (код 0x2B) на абсолютно идентичную команду команду WR_USB_DATA (код 0x2C). При этом команда 0x2B на CH376 фактически не работает! И там и там выполняемая функция - заполнение внутреннего буфера чипа данными, подлежащими отправке, в переходнике она сейчас используется для передачи команды активации boot-протокола. Поэтому если вы хотите поставить в переходник модуль на CH376, в текущей версии прошивки найдите файл CH375.H и раскомментируйте в нём строку #define CH376

Дополнительная информация

USB in a NutShell - обычно то, что рекомендуют читать в первую очередь. Как мне показалось, лучше это читать параллельно с официальной документацией.
USB Made Simple - очень краткий и хороший туториал от разработчиков аппаратного USB-сниффера. Возможно, лучше всего будет в первую очередь пробежаться именно по нему, потом перейти ко всему остальному, а потом...снова возвращаться к нему - он очень удобен в качестве шпаргалки по таким моментам, как "в какой последовательности идут запросы", "стандартные заголовки пакетов" и т.д., чего в полной документации искать весьма муторно.
Полный архив официальной документации - ищите на странице ссылку на zip-архив (Сейчас это https://www.usb.org/sites/default/files ... 181221.zip), а в архве внимательно читать usb_20.pdf, это основа стандарта! Остальное не обязательно.
Официальная спецификация HID - читать не менее внимательно, это основной стандарт на все эти клавы и мышки.
Очень полезная статья от хакеров из Shinra Team, в которой коротко и доступно показано, как работать с HID-устройствами с помощью чипа CH376.
Перевод дополнительного даташита CH376 от тех же людей.
USB Device Tree Viewer - бесплатная программа для просмотра "стандартных" USB-дескрипторов установленных в компе устройств. К сожалению, другие, в частности, "hid report дескрипторы", она не читает. Примечательно также то, что на слишком замудрёных и криво составленных дескрипторах программа иногда сама начинает путаться. :tongue: И помечает неадекватные поля ошибками.
Thesycon USB Descriptor Dumper - ещё одна программа для просмотра "стандартных" USB-дескрипторов. По сравнению с предыдущей путается реже, но менее удобна в пользовании - для чтения дескрипторов приходится перетыкать девайс.
Хорошо иметь DOOM-ик в деревне!

-MiS-
Advanced Member
Сообщения: 868
Зарегистрирован: 09.03.2016,15:39
Откуда: Москва

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

Сообщение -MiS- » 17.03.2019,14:48

Хорошая работа!
Я познакомился с этой микросхемой во время отладки-запуска платы Lo-tech_ISA_USB_Adapter
Сделана плата по китайским наброскам для пром. применения. Они написали биос и опциональный драйвер для дос. В их схемах был еще вариант подключения через последовательный порт, что давало бы интересный вариант USB-SERIAL диска под дос. Пробовал соединять но не взлетело. Описание очень убогое и большей частью на китайском. Недавно прикупил четырехканальный осциллограф и лог. анализатор. Теперь можно вернутся к этому вопросу.

В данный момент решил переступить через вдумчивое изучение AVR семейства и пробую сразу STM32. Там есть аппаратный USB-HOST у старших контроллеров, например STM32F107. Надо будет посмотреть что там да как. Демоборда уже лет 6 пылится...

Разработка нужная. Т.к. все меньше USB мышей и клавиатур совместимы с PS/2 протоколом через простой переходник.

UP. Вспомнил, что видел USB-PS/2 на STM32 https://zx-pk.ru/threads/24966-konverte ... atury.html

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

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

Сообщение EJSanYo » 17.03.2019,17:19

-MiS- писал(а):Я познакомился с этой микросхемой во время отладки-запуска платы Lo-tech_ISA_USB_Adapter
Действительно, в данном проекте CH375 используется "по прямому назначению", т.е. пользует те самые команды работы с USB-диском. Я эти функции пробовал, в т.ч. через UART. И по большей части всё действительно работает, за исключением пары флеш-свистков, которые чип в упор не распознал как накопители. Возможно у вас не получилось потому, что, обратите внимание, чип работает в режиме 9-битового UART-а! :( Старшим битом там передаётся признак, команда это идёт или данные. В контроллерах, по большей части, активировать такой режим возможно, но в обычном пека - кажется нет. В CH376 китайцы всё-таки решили, что это дичь, и перешли на обычный 8-битовый UART...правда при этом каждую команду или байт данных приходится передавать уже за 2 посылки UART-а. Приём байта там правда осуществляется хотя бы одной посылкой.
-MiS- писал(а):Там есть аппаратный USB-HOST у старших контроллеров, например STM32F107.
Есть, и в "STM-кубике" он поддерживается. Правда тем, кто опыта работы непосредственно с протоколом USB ранее не имел, разобраться в его функциях будет ой как непросто! :08: Возможно, я сужу по себе, но предложил бы начать всё-таки с данного китай-модуля, прикрутив его к какой-нибудь дешманской STM-ине. (на самом деле я с этого и начинал, причём прикручивал как раз через UART. А изначально трёхвольтовая логика STM данный процесс облегчает.).

О планах на данный переходник.
  • Сделать хотя бы простейший парсер USB-дескрипторов, выясняющий, мышь ли подключенный девайс и поддерживает ли boot-протокол. И если всё это есть - правильно выбирающий эндпоинт с мышью.
  • Задействовать кнопки чтобы ими можно было что-нибудь настраивать. В частности, скорость перемещения.
  • Таки сделать более сложный парсер чтобы получать данные в нормальном report-протоколе. Что, в частности, даст поддержку колёсика.
Хорошо иметь DOOM-ик в деревне!

-MiS-
Advanced Member
Сообщения: 868
Зарегистрирован: 09.03.2016,15:39
Откуда: Москва

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

Сообщение -MiS- » 17.03.2019,19:03

-MiS- писал(а):Возможно у вас не получилось потому
Я не писал программную часть. Только воспроизвел схему подключения к последовательному порту и долго подбирал параметры запуска драйвера. http://www.wch.cn/downloads/CH375X86_ZIP.html
EJSanYo писал(а):Правда тем, кто опыта работы непосредственно с протоколом USB ранее не имел, разобраться в его функциях будет ой как непросто!
Надеюсь найти примеры работы с HID.

Аватара пользователя
Jccwu
Advanced Member
Сообщения: 4087
Зарегистрирован: 06.04.2013,17:05
Откуда: Екатеринбург

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

Сообщение Jccwu » 17.03.2019,21:01

Эх, отличная получилось бы статья для конкурса. Надо было подумать вам об этом.
За тему +

Mx_Serg
Advanced Member
Сообщения: 1403
Зарегистрирован: 04.06.2018,22:47

Сообщение Mx_Serg » 18.03.2019,00:00

У меня по роду службы, бывает, скапливается кучка всякого старого списанного промышленного железа. Вот и сейчас в столе валяется маленькая платка PC/104 контроллера с 5V питанием. У него как раз есть COM, USB и загрузочный флеш-диск с DOS. USB-стек под DOS загрузить можно, мышь она видит, дальше относительно простая программа может это все транслировать в RS-232. Получается своеобразный переходник, который можно за пару дней сваять. Но пока что лень - есть запас шариковых мышей для RS232 ))

Аватара пользователя
Tronix
Advanced Member
Сообщения: 2625
Зарегистрирован: 15.01.2008,11:00
Откуда: Москва

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

Сообщение Tronix » 18.03.2019,07:08

Круто! Я пытался как-то давно Lo-tech_ISA_USB_Adapter заставить работать с USB мышкой, но у меня не взлетело. Не долго думая взял первый попавшийся под руку андруино-код, который называется MeUSBhost.c. Перепилил код под Borland C, собрал. Ну, дескриптор у мышки читает, какие-то там ендпоинты устанавливает, дальше чет не идет. То есть потенциально - работает, но нужно было вникать немного в сам USB, а интерес пропал.

А, с другой стороны - ну допустим получил я данные от USB мышки или клавиатуры. А дальше что? Писать мышиный драйвер? Ну можно, сорцы вроде каких-то драйверов видел. Но в винде мышь не будет работать 99%. То есть это писать еще и драйвер для венды, причем как для 9x, так и для 2k. Короче, действительно, лучше через переходник USB мышь использовать, как и предлагает автор.

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

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

Сообщение EJSanYo » 18.03.2019,09:29

Jccwu писал(а):отличная получилось бы статья для конкурса
Мне кажется, на полноценную статью это всё же не тянет. Скорее назвал бы "веткой обсуждения проекта", которую я буду обновлять и дополнять по возможности. Вот когда руки дойдут до полноценного исследования реализаций PS/2 на материнках (а я надеюсь, однажды дойдут), вот там, чую, загадок наберётся столько, что на целую статью хватит! :eek:
Mx_Serg писал(а):Вот и сейчас в столе валяется маленькая платка PC/104
Да, мне уже предлагали взять какую-нибудь однокристалку под линуксом. :tongue: Может, конечно, у меня устаревшее восприятие, но как-то рука не подымается брать настолько более мощную систему, чем основная, чтобы сделать тупенький конвертер...
Tronix писал(а):То есть потенциально - работает, но нужно было вникать немного в сам USB
Со временем пришло понимание, что вот с этого как раз надо было начинать, не надеясь на возможности готовых USB-стеков. Причём изучать надо всё-таки официальную документацию, только там подробно расписано что да как (в шапке топика привёл). Весьма поморочено, да, но в целом читать можно.
Хорошо иметь DOOM-ик в деревне!

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

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

Сообщение EJSanYo » 19.03.2019,20:45

Неплохое обновление прошивки!

v.0.0.3 beta. Сделал упрощённый анализ дескрипторов, так что теперь переходник способен задействовать комбинированные устройства, а значит, и большее количество различных моделей мышей. В частности - беспроводных, поскольку, как оказалось, для них производители очень часто не загоняются разработкой приёмника только лишь для мыши, а берут чипы, изначально предназначенные для комплектов клава+мышь ("клавиатура" такого приёмника видится в компе, но, само собой, никаких функций не выполняет). Код получился весьма неказистым, но тем не менее, вроде работает - протестировано на ~десятке различных устройств.
По прежнему используется boot-протокол, "нормальный режим работы" aka report-протокол пока что не осилил. :08:
Хорошо иметь DOOM-ик в деревне!

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

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

Сообщение EJSanYo » 21.03.2019,18:11

Небольшое обновление.

v.0.0.5 по результатам продолжительного тестирования. Заметил, что одна китайская мышь после подачи питания не всегда определяется адекватно. После увеличения временных промежутков между этапами опроса всё стало работать нормально. Возможно, это несёт некий смысл - ведь и комп, судя по всему, запрашивает у USB девайсов дескрипторы не сразу всей кучей.
Хотел также сделать проверку, активируется ли на самом деле boot-протокол (через команду GET PROTOCOL). Но увы, Ritmix RMW-110, "отличившаяся" в прошлый раз, бодро рапортует, что активировала boot-протокол, хотя по факту - ни разу нет. Что-то мне это напоминает....ну да, конечно, затычки на месте полноценных функций, появившиеся ещё во времена PS/2! :mad: "Зачем делать то, что никому не нужно? Лучше сэкономим..." и всё в этом духе.
Хорошо иметь DOOM-ик в деревне!

Ответить