Настало время продолжить тему прикручивания современной периферии к устаревшим машинам. Прошло уже почти 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-протокола. Вполне возможно, что вы подключили не мышь!
На всякий случай предыдущая версия прошивки, которая умеет меньше: 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 дескрипторы", она не читает. Примечательно также то, что на слишком замудрёных и криво составленных дескрипторах программа иногда сама начинает путаться. И помечает неадекватные поля ошибками.
Thesycon USB Descriptor Dumper - ещё одна программа для просмотра "стандартных" USB-дескрипторов. По сравнению с предыдущей путается реже, но менее удобна в пользовании - для чтения дескрипторов приходится перетыкать девайс.