Реализовано преобразование USB HID -> PS/2. Проверено пока что только логическим анализатором - попробую припаять шнурок от клавиатуры и подключить к компьютеру для полноценной проверки.
Да
Нет
Не знаю
Реализовано преобразование USB HID -> PS/2. Проверено пока что только логическим анализатором - попробую припаять шнурок от клавиатуры и подключить к компьютеру для полноценной проверки.
"Байт-48"
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
В библиотеке stm32 очень убогий USB-хост (помимо остальных проблем). И в добавок в моей практике встречалась куча клавиатур нарушающих USB стандарт самыми разнообразными способами, в том числе от именитых производителей. Казалось бы чего проще - отдай пакет из 8 байт в interrupt EP и потом пришли пакет нулевой длины как завершение передачи, что требуется по стандарту. Дык, чего только не попадалось - и честный нулевой пакет, и empty/NAK, и stall. Некоторые клавиатуры когда им нечего передавать отвечают stall вместо empty/NAK. Под это все стек от ST надо допиливать. Финалом маразма стал беспроводной комплект LG из мыши и клавиатуры. Там в конфигурации репортится два HID-а, первый клавиатура, оно нормально обрабатывается. Но при нажатии F1-F4 почему-то генерируется отчет и в канале мыши. Если софт не обрабатывает такое составное устройство (или обрабатывает только одно - клавиатуру), то канал мыши он, ессно, не вычитывает, и клавиатура нафиг зависает.
Это уже частные случаи, надо смотреть.
И по библиотеке - со времён SPL'а там многое поменялось в стеке USB, добавилось много обработчиков всяких ситуаций. Так что, может быть, что-то стало и лучше. Но такие случаи, как с упомянутым выше свистком - это вообще криворукость разработчиков железки, софтом это не исправить, при требовании полной совместимости со всем спектром устройств.
PS: Сейчас буду вспоминать, как реализована клавиатура, джойстик и мышь в спеке - надо определиться, по каким сигналам нужны будут прерывания.
- - - Добавлено - - -
Так, по клавиатуре ZX'а - её выбор идёт при лог.0 на A0, /IORQ, /RD. Это понятно. Вопрос в организации циклов сканирования - они идут по 1 строке? То есть на одной из линий A8-A15 (которые отображают состояние аккумулятора во время чтения) будет активный лог.0, если я всё правильно понял.
И стоит ли делать дешифрацию адреса порта полной, по всем линиям A0-A7? (Пока что смотрел только в схему Ленинграда).
- - - Добавлено - - -
Если мои рассуждения выше верны. то черновой вариант клавиатуры для ZX-BUS уже готов.
Обработка вызывается по внешним прерываниям на выводах МК - линии /IORQ, /RD, /WR:
Данная функция вызывается обработчиком прерываний, если переключателями был выбран режим ZX-BUS. И в зависимости от значения GPIO_Pin (то есть от того, по какому выводу мы ушли сюда), смотрим дальше - что у нас активно. В итоге, независимо от таймингов и задержек в логике, чтение из порта клавиатуры будет вызвано только при одновременно активных /IORQ и /RD.Код:void zxbus_proc(int GPIO_Pin){ switch (GPIO_Pin) { case ZXBUS_PIN_IORQ: if ((ZXBUS_PORT->IDR & (1 << ZXBUS_PIN_RD)) == 0) zxbus_proc_int_rd(); if ((ZXBUS_PORT->IDR & (1 << ZXBUS_PIN_WR)) == 0) zxbus_proc_int_wr(); break; case ZXBUS_PIN_RD: if ((ZXBUS_PORT->IDR & (1 << ZXBUS_PIN_IORQ)) == 0) zxbus_proc_int_rd(); break; case ZXBUS_PIN_WR: if ((ZXBUS_PORT->IDR & (1 << ZXBUS_PIN_IORQ)) == 0) zxbus_proc_int_wr(); break; } }
Ну а поскольку со схемой этой части уже всё решено (для запаса на дальнейшие расширения под прерывания можно выделить любой из управляющих сигналов процессора - /INT, /NMI, /IORQ, /RD, /WR, /MREQ, /M1). В зависимости от других режимов на эти линии можно подключить другие сигналы.
А на порт данных для ZX-BUS всё-таки повешу двунаправленный буфер, управляемый напрямую сигналом с МК, формируемым при чтении из порта. Всё остальное время в режиме ZX-BUS он будет работать в направлении к МК. Сигнал /OE для него заведу на джампер выборки режима ZX-BUS - что бы в прочих случаях не мешал.
- - - Добавлено - - -
Обновил схему.
Дальше в ней осталось только пара вещей:
1) повесить светодиоды на те же ноги, что и DIP-переключатель - всё равно они используются только при запуске для считывания режимов.
2) подумать над разъёмами.
Итого у контроллера использованы все выводы, и имеем резерв на ещё 3 режима выхода (сейчас есть PS2, ZX-BUS, MATRIX) и 256 вариантов преобразований матрицы клавиатуры.
Контроллер Ethernet при необходимости подключается к разъёму.
Для подключения прочей периферии на разъёмы выведены SPI, I2C, UART. Пару выводов от переключателя выбора матрицы надо будет завести как чипселекты для SPI.
Так же выход PS/2 надо будет сделать через транзисторы, что бы поднять уровень сигналов до +5В.
"Байт-48"
Итак, обновил плату и раскидал компоненты. Назначение выводов может ещё поменяться, но это не важно ещё - разводить ещё и не начинал, пока что рано.
Вот примерный вид платы с компонентами:
Вид сверху и вид снизу.
Скомпоновал таким образом, что разъём ZX-BUS (2 ряда отверстий снизу) на верхнем виде сориентирован так, что под резистором R42 находится пин A15, а под R41 - A14. То есть плата спека и собственно сам разъем будут сзади платы при таком подключении, а все детали и разъёмы будут смотреть наружу, ничему не мешая.
Если с ориентацией разъёма напутал, дайте знать, ориентировался на фото в гугле
Часть подтягивающих резисторов около разъёма излишняя - запаиваются по необходимости. Лучше иметь площадку для запайки, чем потом крутить с проводками и соплями.
"Байт-48"
Для надёжности добавил полноценную защиту USB - всё по хрен-шую
Скрин
[свернуть]
Это ведёт к небольшому увеличению стоимости, но повышает надёжность - иначе при попадании статики на разъём выгорит МК. Так же защита от наводок и прочего.
Или нафиг эти защиты?
Последний раз редактировалось andreil; 30.03.2018 в 12:24.
"Байт-48"
А какой функционал на данный момент задуман?
Мои игрушки: PowerbookG4 / MacMiniG4 / MacMini i5 / Amiga1260 / Commodore64 / Atari65XE / MSX1 SVI-728 / MSX2 КУВТ2 / MiST / MiSTer / Profi+ / KarabasPro / Speccy2010 / Aspect128 / ZX-UNO VGA 2M / PS3 / PS4Pro+PSVR / PSP / PS Vita / GBC / LDK Game / RG350M / iPhone / iPad / Raspberry Pi (0/3B+/4B/5)
MorphOS / AmigaOS / MacOS / Linux
Пока - подключение клавиатуры и мыши, флешки, SD-карты.
В дальнейшем через пару разъемов можно будет повесить какой-либо дисплей (для меню плеера/эмулятора ВГ), Ethernet-контроллер (хоть по SPI, хоть по RMII).
"Байт-48"
А к сд-карте со стороны Спектрума как обращаться? Я даже не в курсе, вдруг есть уже какие-нибудь стандарты. Кстати, было бы забавно подключить модуль на мсх VS1053 (мультиформатный аудиодекодер), которая может получать по I2C поток данных (с сд-Карты) и играть из себя сякие мп3, огг и прочие миди. Надеюсь, спектрум успеет справиться с передачей данных )
Мои игрушки: PowerbookG4 / MacMiniG4 / MacMini i5 / Amiga1260 / Commodore64 / Atari65XE / MSX1 SVI-728 / MSX2 КУВТ2 / MiST / MiSTer / Profi+ / KarabasPro / Speccy2010 / Aspect128 / ZX-UNO VGA 2M / PS3 / PS4Pro+PSVR / PSP / PS Vita / GBC / LDK Game / RG350M / iPhone / iPad / Raspberry Pi (0/3B+/4B/5)
MorphOS / AmigaOS / MacOS / Linux
С картой памяти можно работать как угодно, в том числе и напрямую - в режиме ZX-BUS можно сделать обработку сигналов шины для поддержки SD-карты.
Всё ограничено фантазией и быстродействием.
Аналогично и с VS - можно сделать позже.
Сейчас надо до конца "устаканить" схему и развести плату.
"Байт-48"
"Устаканил" основные вопросы по схеме USB, ничего не изменилось. Больше времени потратил на изучение трассировки диффпар
За вечер развёл часть 2xUSB, microSD, а так же частично затронул шину.
Скрин
[свернуть]
Заливка показана контурами, что бы все слои были видны сразу. Пока развожу в 2 слоя, но в резерве "висят" промежуточные слои - по ним пока что проводится питание. Если получится развести "как есть" все сигналы от МК, эти 2 слоя уберутся. А нет - буду делать 4-х слойку... По финансам получается около $42 за 20 платок (10 заготовок, по 2 платы на каждой).
"Байт-48"
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)