HIDman_ZX — это универсальный недорогой открытый интерфейс для подключения USB и PS/2 клавиатур и мышей к компьютеру ZX Spectrum. Проект включает прошивку микроконтроллера, референсную минимальную схему включения и пример тестовой платы в KiCad. Основной фокус сделан на сопровождаемости прошивки.
Файлы для загрузки
| Название файла / Папка | Описание | GitHub | Yandex.Диск |
|---|---|---|---|
| firmware (папка) | Прошивка MCU CH559L (исходные коды на C, скрипты сборки) | Ссылка на GitHub | Ссылка на Яндекс.Диск |
| hardware (папка) | Аппаратная часть — схемы и файлы печатных плат (KiCad) для тестовой платы и платы ZX-BUS | Ссылка на GitHub | Ссылка на Яндекс.Диск |
| source/Altera (папка) | Исходные коды для CPLD Altera (System Verilog) для варианта ZX-BUS | Ссылка на GitHub | Ссылка на Яндекс.Диск |
| doc (папка) | Документация | Ссылка на GitHub | Ссылка на Яндекс.Диск |
| images (папка) | Изображения (фотографии плат, схемы) | Ссылка на GitHub | Ссылка на Яндекс.Диск |
| Скачать все файлы | Все файлы находятся в одном архиве | Ссылка на GitHub | Ссылка на Яндекс.Диск |
В основе проекта лежит HIDman — адаптер USB HID в PS/2 клавиатуру/мышь для легаси ПК. От HIDman взята реализация стека USB Host без модификаций.
Входные требования
- Разработать универсальный простой в повторении недорогой открытый интерфейс USB/PS/2 клавиатур и мышей
- Должны поддерживаться как минимум два USB устройства одновременно
- Основной фокус на сопровождаемости прошивки микроконтроллера
- Выход интерфейса клавиатуры: сигналы матрицы переключателей A8–A15, D0–D4
- Выход интерфейсов Kempston Mouse и Kempston Joystick: сигналы DI0–DI7, стробы записи регистров MX, MY, MKEY, JOY
- Поддержка USB HID геймпадов как Kempston Joystick и для эмуляции кнопок клавиатуры
- Выход сигналов для управления кнопками эмулятора дисковода GOTEK по горячим кнопкам клавиатуры
- Выход сигналов управления Z80 по горячим кнопкам клавиатуры: BUSRQ (PAUSE), NMI (MAGIC), RESET
- Реализация платы для ZX-BUS
- Реализация портов и регистров контроллеров ZX клавиатуры и Kempston Mouse
- Реализация защиты портов USB от статики / короткого замыкания / повышенного напряжения
Реализация
Схема использует недорогие доступные чипы от Nanjing Qinheng Microelectronics:- CH559L — 8-битный расширенный USB MCU, совместимый с Intel 8051, с двумя аппаратными USB Host
- CH446Q — матрица аналоговых ключей 8×16 с последовательным интерфейсом
- Реализация асинхронных интерфейсов PS/2 клавиатуры и мыши
- Реализация матрицы контактов 8×5 ZX Spectrum клавиатуры с раскладкой Xrust
- Интерфейс матрицы ключей CH446Q
- Интерфейс для контроллера Kempston Mouse (DI + MX/MY/MKEY)
- Интерфейс для контроллера Kempston Joystick (DI + JOY)
- Интерфейс управления Z80 (PAUSE/MAGIC/RESET) по клавишам F10/F11/F12
- Интерфейс управления кнопками GOTEK (RIGHT/LEFT/SELECT) по сочетанию клавиш CTRL+RIGHT/LEFT/DOWN/UP
Детали реализации (тестовая плата)
- Тестовая плата присоединяется сверху к ZX Spectrum Pentagon 128 2023/2024 Interface Board
- Интерфейс мыши рассчитан на подключение к контроллеру, подобному ZX_BUS_Mouse, с параллельной записью по 8-битной шине в регистры осей и колеса/кнопок. Колесо прокрутки мыши поддержано.
- Исходный код поддержки PS/2 клавиатуры и интерфейса матрицы ZX Spectrum → CH446Q портирован из проекта ZX_RGBI2VGA-HDMI + GOTEK FlashFloppy I2C OSD + PS/2 Keyboard
- Исходный код поддержки PS/2 мыши портирован из экспериментальной ветки interrupt_processing_async проекта ZX BUS Mouse. Код обработки мыши по прерыванию clock основан на проекте Олега Трифонова avr-mouse-ps2-to-serial.
- Может работать от внутреннего генератора без внешнего кварцевого резонатора
- Конденсатор и резистор цепочки сброса не нужны (есть внутренняя схема формирования сброса по питанию)
После подачи питания Gluk Reset Service всегда выводит экран Help; после нажатия Reset Z80 стартует нормально. Причина: CH559 при включении выдаёт логическую '1' на выходах (в отличие от RP2040, который выдаёт '0'), что приводило к нежелательной активации переключателя в CH446Q по адресу 0x01. Исправлено:
- Подтяжкой линии STB внешним резистором 10k к GND
- Установкой значения порта P1 до переключения его на выход
Режимы работы выходов
| Выход | Режим |
|---|---|
| Кнопки GOTEK | Открытый коллектор (замыкают на GND при нажатии) |
| Kempston Mouse и Kempston Joystick | Push-pull |
| Матрица клавиатуры A8–A15, D0–D4 и сигналы Z80 | Подключены к входам/выходам CH446Q (общий вход X8 для BUSRQ/NMI/RESET подключён к GND) |
Вариант для шины ZX-BUS (Nemo-BUS)
Реализована плата в формате ZX-BUS с полной поддержкой всех возможностей прошивки:- Интерфейсы клавиатуры, Kempston Mouse и Kempston Joystick (8 бит)
- Подключение как минимум 2 USB устройств и PS/2 клавиатуры/мыши
- Клавиатура работает одновременно с портом клавиатуры/магнитофона на основной плате
- 2 порта USB и порты PS/2 мыши/клавиатуры
- Доступные и недорогие компоненты
- Высота платы минимальна, максимальная ширина/высота 99 мм
- Защита портов от КЗ (самовосстанавливающийся предохранитель 1812) и от статического электричества (IP4220CZ6 — может не устанавливаться)
- Порт Kempston Joystick отключаемый (jumper/solder jumper)
- SMD компоненты 1206 для удобства ручной сборки
- Матрица переключателей клавиатуры и специальных кнопок вместо CH446Q помещена в CPLD Altera EPM3128ATC100 вместе с дешифраторами адресов и регистрами интерфейсов (drop-in replacement, последовательный интерфейс сохранён)
- Использовано 107 из 128 макроячеек
- Описание схемы и testbench написаны на System Verilog
- Интерфейс Kempston Joystick — 8-битный (4 направления + 4 кнопки), по умолчанию отключён
- Сигнал IORQGE/ буферизирован до 5V через 74LVC1G125DB
- Сигналы PAUSE, MAGIC, RESET от CPLD буферизированы на шину Z80 через FET транзисторные ключи BSS123
- Разъём PS/2 mini DIN 6 pin комбинированный: PS/2 мышь подключается напрямую, для клавиатуры нужен Y-splitter кабель
- Сигналы USB и PS/2 выведены на штыревые разъёмы для подключения внешних планок
Для корректной работы ПО в ROM сразу после включения (например, Gluk Reset Service) требуется, чтобы регистры матрицы клавиатуры и Kempston Mouse содержали корректные значения почти сразу (порядка 24 ms). Микроконтроллер не успевает их обновить. Реализован внутрисхемный сброс регистров CPLD по системному сигналу RESET.
Защита портов:
- От КЗ: самовосстанавливающийся предохранитель 1812L050PR (0.5A, 15V) или MF-NSMF075-2 (0.75A, 6V, 1206)
- От ESD: IP4220CZ6 Dual USB 2.0 ESD Protection TVS Array (в версии 1.0 подключена некорректно, в версии 1.1 — по даташиту, но блокирует порт USB для прошивки MCU, поэтому не должна устанавливаться)
- В CPLD заведён, но не используется сигнал CLK
- Заведён сигнал DOS/ (присутствует только на Nemo-BUS; в оригинальном ZX-BUS на этом контакте +9V — для внимания подключён через замкнутый solder jumper)
Подключён к 6 биту порта #FE клавиатуры. На плате выведен разъём TAPE_IN. К порту можно подключить только LVTTL 3.3V сигнал (например, от TZXDuino).
Текущий статус (проекта в целом)
- В firmware реализована поддержка PS/2 и USB мышей и клавиатур
- Поддерживаются беспроводные мыши/клавиатуры Logitech с Unified Receiver и им подобные (работают как стандартный USB HID)
- Реализована поддержка геймпадов/джойстиков, совместимых с USB HID, в том числе Sony DualShock 4, Sony PlayStation 5 DualSense
- Реализованы специальные драйверы для геймпадов Sony DualShock 3, XBox 360 USB Controller, XBox One / Series S/X Controller
- Реализована экспериментальная поддержка SEGA Mega Drive / Genesis геймпада как 3-кнопочного
- Проверена работа выходных портов мыши / клавиатуры / джойстика / GOTEK / Z80
- События от USB HID геймпадов транслируются в нажатия кнопок клавиатуры и Kempston Joystick
- События от геймпадов со специальным драйвером транслируются в нажатия Kempston Joystick
- Прошивка CPLD проверена через testbench в ModelSim (Quartus 13.0sp1)
- Платы собраны и протестированы
- Контроллеры Kempston Mouse, Kempston Joystick, ZX матричной клавиатуры: работают, корректно сбрасываются при включении
- Реализация матрицы клавиатуры позволяет зажимать много кнопок без эффекта фантомных нажатий
- Клавиатура работает параллельно с портом клавиатуры и магнитофона на основной плате
- Работа сигналов PAUSE, MAGIC, RESET через транзисторные ключи на шину проверена
- Работа TTL входа TAPE_IN не проверена
- ESD защита портов блокирует работу USB и не должна устанавливаться
Известные проблемы
По варианту ZX-BUS:- При включении в прошивке CPLD поддержки всех трёх интерфейсов (Mouse, Joystick, Keyboard) — 107 из 128 макроячеек — интерфейс клавиатуры начинает работать нестабильно (в том числе при нажатии определённой кнопки джойстика). Предположительно связано с неоптимальным распространением сигналов в комбинаторной схеме при большом заполнении CPLD. Временное решение: закомментирована поддержка Kempston Joystick (94 из 128 макроячеек).
ToDo
- Код обработки событий от PS/2 клавиатуры не обрабатывает ошибки parity. После тестирования стабильности работы уточнить необходимость отправки устройству PS/2 команды RESEND/RESET и очистки буфера ввода.
- Добавить минимальный код трансляции нажатия кнопок геймпадов со специальным драйвером (PS3/XBox) в события клавиатуры.
Сборка проекта (firmware)
Требуются: компилятор SDCC 3.9.3, GNU утилиты в составе msys2.Компиляция:
Код:
cd firmware
build-release.bat
Файлы прошивки сохраняются в firmware/out
Прошивка CH559L
Необходимо установить WCH ISP Studio. Потребуется кабель USB A – USB A (вилка-вилка).Вход в режим программирования:
- Отсоединить контроллер от внешнего питания / устройств
- Замкнуть jumper BOOT0 (P4.6)
- Подключить контроллер через разъём USB_B к ПК
- Контроллер должен появиться в списке Dev list
- Выбрать файл прошивки
- Нажать Download
Схожие проекты
| Проект | Автор | Компоненты |
|---|---|---|
| Контроллер для USB клавиатуры и мыши | Игорь Матвеев @azx987sa (2023) | ATmega328P, CH9350, EPM7128 |
| PentagonExpander (WiP) | Михаил Каа MikhaelKaa (2023) | STM32, EPM7128 |
| USB2SPECTRUM (WiP) | Михаил Каа MikhaelKaa (2023–2024) | STM32, EPM7064 |
| Периферийный контроллер для Скорпиона с поддержкой USB | Kireev Sergey psk (2022) | ATmega328P, MAX3421EEHJ, EPM3064 |
| usb_to_zx_spectrum | Constantin billgilbert7000 (2024) | RP2040, MT8816 |
| ZX HID Keyboard Controller | Anykey (2014) | PIC24FJ64GB002, EPM7064 |
| PS/2 Universal Keyboard Controller | Xrust (2021) | ATmega328P, MT8816 |
| Вариация безвейтового контроллера PS/2 клавиатуры для Spectrum | Rio444 (2023) | ATTiny25, EPM3064 |
| Контроллер клавиатуры PS/2 => ZX Spectrum для ZX_RGBI2VGA-HDMI | Алекс Екб @Alex_Eburg (2024) | RP2040, CH446Q |
Полезные ссылки проекта:
- Оригинальный проект HIDman (USB HID to XT/AT/PS/2/Serial converter) — GitHub (в основе проекта)
- WCH ISP Studio для прошивки CH559L — https://www.wch.cn/downloads/WCHISPTool_Setup_exe.html
- CH55x_python_flasher для Linux/Mac — https://github.com/MarsTechHAN/ch552tool
- Исходный репозиторий CH559sdccUSBHost (atc1441) — https://github.com/atc1441/CH559sdccUSBHost
- Репозиторий проекта — GitHub