Teensy 4.1 как устройство ввода для DMA
Полная сборка Teensy 4.1: пайка host-площадок, прошивка через Teensy Loader, порядок подключения, управление по serial или сети, частота отчётов, дескриптор и типичные сбои.
Коротко
Припаяйте 5-пиновый разъём к host-площадкам Teensy 4.1 на 600 МГц и залейте passthrough-прошивку через Teensy Loader. Мышь подключите к host-порту, device-порт — к игровому ПК, а управляйте платой по serial.
На странице12
- Что такое Teensy 4.1
- Зачем брать Teensy, а не готовое устройство?
- Как припаять USB host-порт
- Какой софт нужен и где лежат файлы
- Как прошить плату и проверить host-порт
- В каком порядке подключать кабели
- Выбор канала управления и настройка чита
- Помогает ли более высокая частота отчётов?
- Как изменить USB-дескриптор
- Типичные проблемы с Teensy и их решения
- Частые вопросы о Teensy
- Источники
Что такое Teensy 4.1
Teensy 4.1 — микроконтроллерная плата общего назначения от PJRC, которую никогда не проектировали под эту задачу. Поэтому она дешёвая — и поэтому же, если вложить в неё труд, она умеет больше любого другого устройства ввода из этого списка.
- Микроконтроллер
- NXP i.MX RT1062, ARM Cortex-M7 с аппаратным FPU (блоком вычислений с плавающей запятой)
- Тактовая частота
- 600 МГц в стоке, выбирается в IDE. Для этой задачи не разгоняйте
- Флеш-память
- Около 8 МБ (7936 K) — намного больше, чем нужно любой passthrough-прошивке
- ОЗУ
- Всего 1024 K, из них 512 K — память TCM (tightly coupled), подключённая напрямую к ядру
- Device-порт
- Разъём micro-USB. USB 2.0 High Speed, 480 Мбит/с. Этот разъём идёт к игровому ПК
- Host-порт
- Пять сквозных контактных площадок на плате, с завода не распаяны. Работает на 480, 12 или 1,5 Мбит/с в зависимости от того, что подключено. Сюда подключается ваша мышь
- 5 В на host-порту
- Коммутируется чипом через ключ с ограничением тока. На площадках нет питания, пока прошивка не вызовет функцию begin библиотеки хоста
- Аппаратный serial
- Восемь UART, если нужен serial-канал не через USB device-порт
- Ethernet
- Поддерживает 10/100, но разъём magjack — отдельный комплект, который нужно припаять. Для serial-сборки не нужен
- Программирование
- Teensy Loader, который после установки Teensyduino автоматически вызывается из Arduino IDE. Физическая кнопка Program принудительно запускает загрузчик
Зачем брать Teensy, а не готовое устройство?
Причин три, и идут они в порядке того, как часто каждая оказывается настоящей. Во-первых, прошивку вы компилируете сами, поэтому сами решаете, какой USB-дескриптор увидит игровой ПК и как часто отправляются отчёты, — ни одно готовое устройство такого не позволяет. Во-вторых, контроллеры host и device полностью независимы, так что проброс мыши не делит полосу пропускания с подмешиванием движения. В-третьих, это дёшево. Расплата в том, что производителем становитесь вы: когда что-то глючит, никакой поддержки нет, есть только ваша разводка и ваш код.
Внимание
Как припаять USB host-порт
Это единственная обязательная пайка, и от неё зависит, заработает ли остальная сборка. Host-площадки — пять металлизированных сквозных отверстий, с завода не распаянных; на них выведены 5 В хоста, пара D- и D+ и земля. Порядок смотрите по шелкографии и официальной карточке распиновки, не гадайте и не доверяйте схеме из форумного поста.
- Найдите на своей плате пять host-площадок и сверьте их порядок с фирменной карточкой распиновки PJRC для Teensy 4.1
- Вставьте в отверстия 5-пиновый штыревой разъём (header) или подготовьте подходящий USB host-кабель, который PJRC продаёт для Teensy 3.6 и 4.1
- Паяйте тонким жалом и низкотемпературным припоем: площадки маленькие, плата плотная, и толстое жало их замкнёт
- Осмотрите каждое соединение при хорошем свете. Тусклая, зернистая или скатавшаяся в шарик пайка — холодная, и это самая частая причина, по которой host-порт ничего не определяет
- Прежде чем подавать питание, прозвоните мультиметром, нет ли замыкания припоем между D- и D+
- Если вместо кабеля используете голые провода, делайте пару D- и D+ короткой и одинаковой длины: это дифференциальная пара, по которой идёт до 480 Мбит/с
- Не подключайте 5 В хоста к внешнему источнику питания без веской причины: плата сама коммутирует эту линию, и ограничение тока на ключе стоит не просто так
Какой софт нужен и где лежат файлы
Нужны Arduino IDE и Teensyduino — дополнение от PJRC. В Teensyduino уже входят библиотека хоста и Teensy Loader, так что больше ничего ставить не нужно.
# After installing Teensyduino, set these three in the Arduino IDE:
Tools > Board > Teensy 4.1
Tools > USB Type > Serial + Keyboard + Mouse + Joystick
Tools > CPU Speed > 600 MHz
# The host-side library ships with Teensyduino. Prove the hardware with its own example:
File > Examples > USBHost_t36 > Mouse
# USB identity is defined in the core, not in your sketch:
<arduino>/hardware/teensy/avr/cores/teensy4/usb_desc.h
<arduino>/hardware/teensy/avr/cores/teensy4/usb_names.hВнимание
Как прошить плату и проверить host-порт
Сначала залейте стандартный пример мыши из USBHost_t36. Он выводит в монитор порта каждое движение и каждый клик подключённой мыши, так что пайка проверяется примерно за тридцать секунд. Перед проверкой учтите: 5 В на host-площадки подаёт чип через ключ, а не напрямую. Если на плате прошивка, которая не запускает библиотеку хоста, мышь в host-порту даже не загорится. Мёртвый с виду host-порт на такой плате ни о чём не говорит. Сначала прошивка, потом проверка, и только после этого — прошивка, которую ожидает ваш чит.
- Подключите micro-USB device-порт Teensy к ПК, на котором компилируете
- Откройте пример USBHost_t36 Mouse, выставьте Board и USB Type как в настройках тулчейна и нажмите Upload
- Teensyduino передаёт скомпилированный образ в Teensy Loader, который перезагружает плату и записывает образ. На стоковой плате это происходит автоматически
- Если загрузка зависла, один раз нажмите кнопку Program на Teensy. Это принудительно запускает загрузчик, и Loader найдёт плату
- Подключите проводную мышь к только что припаянному host-порту и откройте монитор порта (Serial Monitor)
- Подвигайте мышью. Если появляются события движения и кнопок, host-порт работает, и аппаратная часть сборки закончена
- Теперь скомпилируйте и залейте passthrough-прошивку из документации вашего чита, не меняя настройки Board и USB Type
- После финальной прошивки один раз передёрните питание платы, а не полагайтесь на программный сброс
В каком порядке подключать кабели
Если перепутать эту последовательность, легко потратить час на отладку кабеля. Device-порт смотрит в игровой ПК, потому что именно этот конец выдаёт себя за мышь, а host-порт — в сторону вашей руки.
- Подключите физическую мышь или донгл беспроводной мыши к припаянному USB host-порту Teensy
- Подключите micro-USB device-порт Teensy напрямую к заднему USB-порту ИГРОВОГО ПК, без хаба и без разъёмов передней панели
- Добавьте канал управления со ВТОРОГО ПК. Через device-порт его не провести: USB-serial интерфейс этого порта определяется на игровом ПК, куда воткнут кабель
- Вместо этого возьмите для канала управления один из восьми аппаратных UART. На стороне второго ПК поставьте USB-serial адаптер, чтобы две машины никогда не делили один кабель
- Загрузите игровой ПК и убедитесь, что Windows показывает устройство мыши, а курсор двигается от вашей руки
- Только после этого запускайте софт на втором ПК и открывайте канал
Совет
Выбор канала управления и настройка чита
Составной (composite) USB Type даёт интерфейс мыши и serial-интерфейс на одном кабеле. Этот serial-интерфейс появляется на игровом ПК, куда воткнут device-порт, поэтому второй ПК открыть его не может. Кроме того, на машине, где вы читерите, окажется serial-устройство из того же составного гаджета, что и мышь, и оба интерфейса будут под одним дескриптором. Поэтому канал управления берите с аппаратного UART, а на стороне второго ПК ставьте обычный USB-serial адаптер. Тогда игровой ПК видит просто мышь и ничего больше: сборка получается чище ценой ещё одного кабеля и ещё одной детали. Какой бы канал вы ни выбрали, протокол задаёт прошивка, и чит должен ему соответствовать. В меню ввода чита выставляются три вещи: тип устройства, COM-порт и скорость. Тип устройства часто называется Teensy или generic serial device. COM-порт — тот, который назначил второй ПК, а скорость — та, с которой скомпилирована прошивка. Все три должны совпадать. Несовпадающий baud rate не даёт внятной ошибки: соединение открывается, и дальше ничего не происходит, что выглядит точь-в-точь как мёртвое устройство. Поэтому смотрите номер порта в диспетчере устройств и принудительно ставьте его ниже 10, если чит читает только одну цифру, а скорость записывайте в момент прошивки, чтобы потом не гадать.
Помогает ли более высокая частота отчётов?
Device-порт работает в режиме USB High Speed, поэтому дескриптор может запрашивать интервалы короче 1 мс — нижней границы, которая ограничивает Full Speed-мышь. На практике это значит отчёты чаще раза в миллисекунду, и именно за это плату любят, но именно здесь энтузиазм обгоняет пользу. Частота отчётов, намного превышающая ту, с которой игра сама обрабатывает ввод, не даёт никакого измеримого выигрыша. Идеально ровный поток отчётов на необычной частоте — это тоже паттерн, а паттерны как раз и ищет поведенческий анализ. Ставьте частоту, которую правдоподобно использовала бы настоящая мышь такого класса. Честного бенчмарка, который показывал бы, что большее число безопаснее, не существует, и любой, кто называет вам такую цифру в миллисекундах, её выдумал.
Совет
Как изменить USB-дескриптор
Раз прошивку компилируете вы, под вашим контролем vendor ID, product ID, строки производителя и продукта, серийный номер и HID report descriptor. Если ничего не трогать, Teensy представляется собственной идентичностью PJRC — идентичностью отладочной платы на машине, где ей больше неоткуда взяться. Строки и ID лежат в usb_desc.h и usb_names.h ядра, а не в вашем скетче. Ядро 4.x предлагает способ аккуратнее: задать строковые дескрипторы в маленьком отдельном C-файле в папке скетча. После смены vendor ID и product ID Teensyduino уже не может сам найти и перезагрузить плату, поэтому каждая следующая загрузка требует нажатия кнопки Program. Это ожидаемое поведение, а не кирпич. Прочитайте гайд о дескрипторах до того, как что-то менять: плохо скопированная идентичность настоящей мыши хуже стоковой.
Типичные проблемы с Teensy и их решения
Идите сверху вниз. Первые четыре строки покрывают большую часть того, что ломается на первой сборке, и три из этих четырёх сводятся к пайке.
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Мышь в host-порту ничего не делает, светодиод на мыши не горит | Либо холодная пайка на host-площадках, либо прошивка не запускает библиотеку хоста, и линия 5 В остаётся выключенной | Сначала залейте пример USBHost_t36 Mouse. Если мышь по-прежнему не подаёт признаков жизни, перепаяйте все пять площадок и прозвоните их |
| Host-порт определяет устройства через раз, или работают только медленные устройства | Пара D- и D+ слишком длинная или разной длины, либо между площадками остались следы припоя | Укоротите пару и выровняйте длины или перейдите на нормальный USB host-кабель. Очистите площадки изопропиловым спиртом и осмотрите при свете |
| Игровой ПК вообще не показывает устройство мыши | USB Type в IDE не включает Mouse, поэтому device-порт так и не представляет HID-интерфейс мыши | Выставьте в Tools > USB Type вариант, где есть Mouse, перекомпилируйте, перепрошейте, затем передёрните питание платы |
| Загрузка падает или висит на Waiting for Teensy device | Работающая прошивка не отвечает на запрос перезагрузки, или вы изменили vendor ID и product ID | Один раз нажмите кнопку Program на плате. После смены VID или PID это придётся делать при каждой загрузке |
| Чит двигает курсор, а ваша собственная мышь не работает | Проброс не работает: сторона host мертва, а сторона device работает | Проверьте host-порт примером Mouse: причина почти всегда в пайке |
| Мышь работает, но чит не может открыть канал | Не тот COM-порт или скорость, не совпадающая с той, что задана в прошивке | Найдите порт в диспетчере устройств, назначьте номер ниже 10 и выставьте скорость, с которой собрана прошивка |
| Движение грубое, ступеньками, а не плавное | В report descriptor поля движения 8-битные, поэтому большие смещения обрезаются и отправляются несколькими шагами | Используйте прошивку, дескриптор которой объявляет 16-битные относительные оси, и пусть большие движения делит чит, а не дескриптор |
| Плата греется, а устройство в host-порту отваливается под нагрузкой | Подключённое устройство потребляет больше тока, чем позволяет ограничение линии хоста | Используйте простую проводную мышь, а не мышь с кучей RGB-подсветки или активный хаб, и никогда не подключайте к host-порту хаб, забитый устройствами |
Частые вопросы о Teensy
Можно ли взять Teensy 4.0 вместо 4.1?
Без мучений — нет. На 4.0 сигналы хоста выведены на две SMD-площадки, а не на пять сквозных отверстий с управлением питанием, поэтому D- и D+ придётся разводить вручную, а 5 В подавать самостоятельно. Сделать можно, но все гайды и все прошивки рассчитаны на 4.1.
Нужен ли официальный USB host-кабель PJRC?
Нет, но это самый простой правильный вариант: он садится на 5-пиновый разъём и без лишних усилий даёт правильную дифференциальную пару. Ручная разводка тоже работает, если пара короткая и одинаковой длины.
Teensy сложнее обнаружить, чем KMBox?
Не сама по себе. Teensy даёт контроль: дескриптор, строки и частоту отчётов решаете вы, так что можно представить правдоподобную идентичность вместо стоковой. На настройках по умолчанию она представляется отладочной платой, а это хуже, чем устройство, сделанное под эту задачу, так что контроль — преимущество, только если им пользоваться.
Может ли Teensy сама запускать чит?
Нет: у неё нет никакой возможности читать память игрового ПК. Она двигает курсор по команде, а куда — решают DMA-карта и второй ПК.
Заработает ли донгл беспроводной мыши в host-порту?
Обычно да: хост воспринимает донгл как USB HID-устройство. Некоторые донглы отдают дополнительные интерфейсы или проприетарный протокол настройки, который passthrough-прошивка игнорирует, поэтому переназначение кнопок в памяти мыши и часть программных функций могут перестать работать.
Нужно ли паять комплект Ethernet magjack?
Только если вам нужен канал управления по IP вместо serial. Когда второй ПК стоит рядом с игровым, serial проще и избавляет от одной пайки.
Что будет, если залить не ту прошивку?
Ничего необратимого. Загрузчик живёт на отдельном чипе, и кнопка Program всегда возвращает плату в состояние, в котором Teensy Loader может записать новый образ. Поэтому окирпичить Teensy прошивкой очень сложно.
Источники
В проверенном нами списке источников нет ничего о самой Teensy, поэтому характеристики платы, пайка, прошивка и таблица сбоев основаны на наших собственных тестах на стенде.
- 01Microsoft Learn, USB device descriptors
поля vendor id, product id, строк и серийного номера, которые вы задаёте, когда компилируете собственный дескриптор
learn.microsoft.com
Читать дальше
Не получилось? Откройте тикет в Discord
Все гайды