Значок ресурса

HIDman_ZX — адаптер USB и PS/2 клавиатур/мышей для ZX Spectrum

pcb_3D.png


pcb_3D_back.png


HIDman_ZX — это универсальный недорогой открытый интерфейс для подключения USB и PS/2 клавиатур и мышей к компьютеру ZX Spectrum. Проект включает прошивку микроконтроллера, референсную минимальную схему включения и пример тестовой платы в KiCad. Основной фокус сделан на сопровождаемости прошивки.

Файлы для загрузки​

Название файла / ПапкаОписаниеGitHubYandex.Диск
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.
Тестирование MCU CH559L:
  • Может работать от внутреннего генератора без внешнего кварцевого резонатора
  • Конденсатор и резистор цепочки сброса не нужны (есть внутренняя схема формирования сброса по питанию)
Выявленный дефект и исправление:
После подачи питания Gluk Reset Service всегда выводит экран Help; после нажатия Reset Z80 стартует нормально. Причина: CH559 при включении выдаёт логическую '1' на выходах (в отличие от RP2040, который выдаёт '0'), что приводило к нежелательной активации переключателя в CH446Q по адресу 0x01. Исправлено:
  • Подтяжкой линии STB внешним резистором 10k к GND
  • Установкой значения порта P1 до переключения его на выход

Режимы работы выходов​

ВыходРежим
Кнопки GOTEKОткрытый коллектор (замыкают на GND при нажатии)
Kempston Mouse и Kempston JoystickPush-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 клавиатуры/мыши
  • Клавиатура работает одновременно с портом клавиатуры/магнитофона на основной плате
Выбор требований для платы ZX-BUS:
  • 2 порта USB и порты PS/2 мыши/клавиатуры
  • Доступные и недорогие компоненты
  • Высота платы минимальна, максимальная ширина/высота 99 мм
  • Защита портов от КЗ (самовосстанавливающийся предохранитель 1812) и от статического электричества (IP4220CZ6 — может не устанавливаться)
  • Порт Kempston Joystick отключаемый (jumper/solder jumper)
  • SMD компоненты 1206 для удобства ручной сборки
Детали реализации платы ZX-BUS:
  • Матрица переключателей клавиатуры и специальных кнопок вместо 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 выведены на штыревые разъёмы для подключения внешних планок
Схема сброса CPLD (важный момент):
Для корректной работы ПО в 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)
Порт Tape In:
Подключён к 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
По варианту ZX-BUS:
  • Прошивка 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 (вилка-вилка).

Вход в режим программирования:
  1. Отсоединить контроллер от внешнего питания / устройств
  2. Замкнуть jumper BOOT0 (P4.6)
  3. Подключить контроллер через разъём USB_B к ПК
  4. Контроллер должен появиться в списке Dev list
Программирование:
  • Выбрать файл прошивки
  • Нажать Download
Примечания: Процедура прошивки может быть нестабильной в зависимости от контроллера USB в ПК. Вход в режим программирования через запуск bootloader'а прошивкой при сбросе (BOOT1 + RESET) не тестировался. Для CH559L заявлена поддержка serial programmer (есть опция в WCH ISP Studio и инструмент CH55x_python_flasher) — не тестировалось.

Схожие проекты​

ПроектАвторКомпоненты
Контроллер для USB клавиатуры и мышиИгорь Матвеев @azx987sa (2023)ATmega328P, CH9350, EPM7128
PentagonExpander (WiP)Михаил Каа MikhaelKaa (2023)STM32, EPM7128
USB2SPECTRUM (WiP)Михаил Каа MikhaelKaa (2023–2024)STM32, EPM7064
Периферийный контроллер для Скорпиона с поддержкой USBKireev Sergey psk (2022)ATmega328P, MAX3421EEHJ, EPM3064
usb_to_zx_spectrumConstantin billgilbert7000 (2024)RP2040, MT8816
ZX HID Keyboard ControllerAnykey (2014)PIC24FJ64GB002, EPM7064
PS/2 Universal Keyboard ControllerXrust (2021)ATmega328P, MT8816
Вариация безвейтового контроллера PS/2 клавиатуры для SpectrumRio444 (2023)ATTiny25, EPM3064
Контроллер клавиатуры PS/2 => ZX Spectrum для ZX_RGBI2VGA-HDMIАлекс Екб @Alex_Eburg (2024)RP2040, CH446Q

Полезные ссылки проекта:​

  • pcb_3D.png
    pcb_3D.png
    103.2 КБ · Просмотры: 12
Автор
Verter_bot
Просмотры
5
Первый выпуск
Последнее обновление

Оценки

0.00 звезд(ы) 0 оценок
Назад
Вверх