[Open source, Программирование микроконтроллеров, DIY или Сделай сам] Поговорим с мышами? Или Soft USB HOST на Esp32
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Esp32 весьма мощный контроллер, подходящий для эмуляции различных ретро систем, таких как Spectrum, Commodore, NES, IBM PC-XT и тд. Есть возможность сгенегировать VGA или AV - TV композитный сигнал, подключить различные компактные LCD дисплеи. Он умеет разговаривать с SD картами по SPI & SD протоколу. Вот только с USB клавиатурами, мышами и джойстиками - не умеет. Попробуем научить его говорить с ними. Есть конечно новый вариант ESP32-S3 с одним USB host контроллером, а мне нужно подключить хотя бы 3 девайса и без хаба... Нам понадобится (ссылки только для примера) :
- Собственно сам ESP32 ~3$ WEMOS LOLIN32
- Несколько разъемов USB ~3$ за десяток
- Мне понадобился логический анализатор ~$3 CY7C68013A и бесплатная отличная программа анализатора протоколов
- Спецификации USB и USB-HID (HID - Human Interface Device).
- Макетные платы или любовь к паяльнику/припою/канифоли.
USB 1.1Большинство HID умеет разговаривать с хостом этого стандарта. Имеет две скорости работы HS (High Speed) -12 Mbits/s и LS (Low speed)- 1.5 Mbits/s . К сожалению, скорости процессора ногодрыгом (Generic Pin IO) недостаточно для работы в HS, поэтому мы будем рассматривать реализацию только LS (1.5 Mbits/s). Впрочем большая часть HID devices работает именно на этой скорости. На физическом уровне USB 1.1 - имеет два сигнальных провода: D+ и D- , провод земли : GRN и провод питания: VBus. Сигналы в D+ и D- измеряются относительно провода GRN, хотя большую часть времени они работают как дифф-пара (для уменьшения синфазных помех, наводок) , то есть в противофазе. Шина (D+ и D-) может принимать 4 состояния (high - ~3.3v low - 0v ) для LS : 'K' : D+ - high D- low 'J' : D+ - low D- highSE0: D+ - low D- low SE1: D+ - high D- highСостояние SE1 - незаконное. В исправной системе шина в этом состоянии находиться не должнаКогда к шине хоста ничего не подключено , по стандарту, D+ и D- присоединены со стороны хоста к земле через резисторы 15 kOhm (у нас получается около 50 kOhm - это величина pull-down резисторов в ESP32 чипе, впрочем работе это не мешает). При подключении LS девайса он замыкает провод D- на 3.3v через резистор в 5 kOhm, а HS девайс - провод D+, что позволяет отличить HS девайс от LS.Определив на шине появление LS девайса , после задержки в 200 миллисекуд (дать время девайсу закончить переходные процессы) мы начинаем с ним разговаривать. В протоколе USB инициатором всегда является хост (в отличии от протокола PS/2 например). Раз в миллисекунду хост посылает сообщение девайсу и тот отвечает. Данные передаются младшим битом вперед, 0 кодируется переходом 'K' в 'J' или 'J' в 'K'. Единица - отсутствием перехода. Если встречается больше 6 единиц подряд , то принудительно вставляется переход состояния 'K' в 'J' или 'J' в 'K' . (NRZI coding) . Передача идет пакетами, начало пакета - синхронизирующая последовательность "KJKJKJKK" ('00000001' binary или число 80Н , младший бит передается первым ), конец пакета "SE0,SE0, J". первый байт пакета (после синхронизирующей последовательности ) тип пакета (packet ID - PID). Остальные байты и их кол-во - зависят от типа пакета. Пакеты можно поделить на короткие (handshake) ACK, NACK, STALL ... из одного байта , средние IN,OUT,SETUP из 3 байт и длинные DATA0,DATA1 из 3-11 байт. Формат короткого пакета 8 bit start, 8 bit PID, SE0,SE0, J.Формат среднего пакета: 8 bit start, 8 bit PID, 7 bit address (назначенный адрес устройства), 4 bit EP (конечная точка), 5 bit CRC5 (контрольная сумма адреса и устройства) .Формат длинного пакета 8 bit start, 8 bit PID (DATA0 или DATA1) 0-8 байт данных и 2 байта crc16 (только от данных).После физического подключения устройства хост должен:
- запросить тип устройства (диск ,камера, HID...)
- присвоить ему уникальный адрес
- выяснить количество и тип конечных точек на чтение (типа нажатые кнопки) или на запись (типа LED-ов состояния клавиатуры) и частоту их опроса (раз в сколько миллисекунд)
- выбрать нужную конфигурацию
- дальше один раз в миллисекунду:
- послать запрос на конечную точку и получить или данные или NACK
- послать пустой пакет (SE0,SE0, J) на устройство если не пришло время запрашивать данные.
Если пришли данные - проверить пакет на корректность (чек сумма и тип) и послать ACK если все верно или запросить данные повторно. К сожалению некоторые устройства не дают достаточно времени для проверки корректности пакета (не могу на CPU одновременно и принимать и посчитывать), поэтому я сначала не отвечаю на пакет , проверяю его его корректность , запрашиваю его повторно на следующей миллисекунде и только тогда отвечаю устройству ACK. Такое поведение , в целом, соответствует спецификации (если устройство соответствует спецификации USB 1.1 LS, то это должно работать).Примерный код приемника - узкое место (должен успевать делать заметно больше двух оборотов на бит и функция _getCycleCount8d8() - младшие 8 бит абсолютного времени = цикл CPU/8 (240MHz/8 = 30 MHz)- время на 6 бит должно быть меньше 256 (в байт)):
while(act>0 && (val||nval) ) // есть активность и не нули на шине
{
val = nval;
nval = READ_BOTH_PINS; //прочитать порт и наложить маску пинов D+ D-,пины в старшем байте
received_NRZI_buffer[locRec] = _getCycleCount8d8() | nval; // записать время и состояние в 16 бит
if(val!=nval) // была замечена активность
{
locRec++;
act = TOUT; // была замечена активность,отложить выход из цикла на TOUT
}
else act--; //
}
Примерный код передатчика:
SET_O; // cконфигурировать пины на выход
// в transmit_NRZI_buffer состояния на передачу 0 - 'K' 1 - 'J 2 - se0
for(k=0;k<transmit_NRZI_buffer_cnt;k++)
{
cpuDelay(TRANSMIT_TIME_DELAY); // задержка передачи одного бита
*snd[transmit_NRZI_buffer[k]][0] = DM_PIN_M;
*snd[transmit_NRZI_buffer[k]][1] = DP_PIN_M;
}
SET_I; // cконфигурировать пины на вход
Pulseview работа с тремя мышами
Набор в работе
Детям после 16.
Слева направо: логический анализатор, ESP32, STM32 обслуживающий себя сам Поскольку протокол всегда инициируется хостом, то общее число устройств ограничено количеством выделенных пинов (по два на устройство) И как я понимаю, это единственная реализация софт хоста на ESP32, приглашаю поучаствовать, впрочем версия работает:sourcе на 4 HID устройства.
===========
Источник:
habr.com
===========
Похожие новости:
- [Разработка игр, DIY или Сделай сам, Игры и игровые приставки] Восстание игроков: игра как миф
- [Программирование, Развитие стартапа, Производство и разработка электроники, Гаджеты, DIY или Сделай сам] Как я делаю цифровую минигитару. Часть 2
- [Машинное обучение, Разработка на Raspberry Pi, Гаджеты, DIY или Сделай сам] Умелец собрал детектор кота на Raspberry Pi Zero
- [Open source, *nix] FOSS News №59 – дайджест материалов о свободном и открытом ПО за 1-7 марта 2021 года
- [Open source, Разработка под Android, Kotlin] Reaction — обработка результатов методов в Kotlin
- [Разработка под Arduino, DIY или Сделай сам] Мой умный дом на ESP8266, часть 3
- [Assembler, Программирование микроконтроллеров, Разработка под Arduino, DIY или Сделай сам, Электроника для начинающих] Приемопередатчик HC-12 и датчик температуры DS18b20 на AVR-ассемблере
- [Python, Разработка на Raspberry Pi, Умный дом, DIY или Сделай сам] «Умная камера» на базе Raspberry Pi с управлением через Telegram-бота
- [Open source, Разработка игр, Графический дизайн, Дизайн игр, DIY или Сделай сам] О ходе создания русской народной игры «Колобок» в феврале
- [Open source, Java, OpenStreetMap, Геоинформационные сервисы] Как использовать GraphHopper для построения пешеходных маршрутов по собственным правилам
Теги для поиска: #_open_source, #_programmirovanie_mikrokontrollerov (Программирование микроконтроллеров), #_diy_ili_sdelaj_sam (DIY или Сделай сам), #_esp32, #_open_source, #_programmirovanie_mikrokontrollerov (
Программирование микроконтроллеров
), #_diy_ili_sdelaj_sam (
DIY или Сделай сам
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:26
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Esp32 весьма мощный контроллер, подходящий для эмуляции различных ретро систем, таких как Spectrum, Commodore, NES, IBM PC-XT и тд. Есть возможность сгенегировать VGA или AV - TV композитный сигнал, подключить различные компактные LCD дисплеи. Он умеет разговаривать с SD картами по SPI & SD протоколу. Вот только с USB клавиатурами, мышами и джойстиками - не умеет. Попробуем научить его говорить с ними. Есть конечно новый вариант ESP32-S3 с одним USB host контроллером, а мне нужно подключить хотя бы 3 девайса и без хаба... Нам понадобится (ссылки только для примера) :
while(act>0 && (val||nval) ) // есть активность и не нули на шине
{ val = nval; nval = READ_BOTH_PINS; //прочитать порт и наложить маску пинов D+ D-,пины в старшем байте received_NRZI_buffer[locRec] = _getCycleCount8d8() | nval; // записать время и состояние в 16 бит if(val!=nval) // была замечена активность { locRec++; act = TOUT; // была замечена активность,отложить выход из цикла на TOUT } else act--; // } SET_O; // cконфигурировать пины на выход
// в transmit_NRZI_buffer состояния на передачу 0 - 'K' 1 - 'J 2 - se0 for(k=0;k<transmit_NRZI_buffer_cnt;k++) { cpuDelay(TRANSMIT_TIME_DELAY); // задержка передачи одного бита *snd[transmit_NRZI_buffer[k]][0] = DM_PIN_M; *snd[transmit_NRZI_buffer[k]][1] = DP_PIN_M; } SET_I; // cконфигурировать пины на вход Набор в работе Детям после 16. Слева направо: логический анализатор, ESP32, STM32 обслуживающий себя сам Поскольку протокол всегда инициируется хостом, то общее число устройств ограничено количеством выделенных пинов (по два на устройство) И как я понимаю, это единственная реализация софт хоста на ESP32, приглашаю поучаствовать, впрочем версия работает:sourcе на 4 HID устройства. =========== Источник: habr.com =========== Похожие новости:
Программирование микроконтроллеров ), #_diy_ili_sdelaj_sam ( DIY или Сделай сам ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:26
Часовой пояс: UTC + 5