Skip to content

proboterror/HIDman_ZX

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HIDman ZX

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

Входные требования:

  • Разработать универсальный простой в повторении недорогой открытый интерфейс USB / PS/2 клавиатур и мышей.
  • Должны поддерживаться как минимум два USB устройства одновременно
  • Включает прошивку микроконтроллера, референсную минимальную схему включения и пример тестовой платы в KiCad
  • Основной фокус на сопровождаемости прошивки микроконтроллера
  • Выход интерфейса клавиатуры: сигналы матрицы переключателей 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 от статики / короткого замыкания / повышенного напряжения

Реализация

В качестве основы проекта был взят проект HIDman: USB HID to XT / AT / PS/2 / Serial converter : адаптер USB устройств в PS/2 keyboard/mouse device. От HIDman была взята реализация стека USB Host без модификаций.

Схема использует недорогие доступные чипы от Nanjing Qinheng Microelectronics:

  • 8-bit Enhanced USB MCU CH559L: расширенный Intel 8051 совместимый микроконтроллер с двумя аппаратными USB Host
  • 8x16 Analog Switch Array Chip CH446Q: матрица аналоговых ключей 8x16 с последовательным интерфейсом

В код добавлены:

  • Реализация асинхронных интерфейсов PS/2 клавиатуры и мыши
  • Реализация матрицы контактов 8x5 ZX Spectrum клавиатуры с раскладкой Xrust
  • Интерфейс матрицы ключей CH446Q
  • Интерфейс для контроллера Kempston Mouse (DI+MX/MY/MKEY)
  • Интерфейс для контроллера Kempston Joystick (DI+JOY)
  • Интерфейс управления Z80 (PAUSE/MAGIC/RESET) по клавишам F10/F11/F12
  • Интерфейс управления кнопками GOTEK (RIGHT/LEFT/SELCT) по сочетанию клавиш CTRL+ RIGHT/LEFT/DOWN/UP

Детали реализации

Тестовая плата для отладки присоединяется сверху к ZX Spectrum Pentagon 128 2023/2024 Interface Board. Исходя из этого выбраны физические размеры и положение / распиновка разъема клавиатуры.

Интерфейс мыши расчитан на подсоединение к контроллеру, подобному ZX_BUS_Mouse с параллельной записью по шине 8-bit в регистры осей и колеса/кнопок. Колесо прокрутки мыши поддержано.

Исходный код поддержки 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. Код инициализации PS/2 мыши и основной цикл обработки событий асинхронный с минимальными задержками.

Тестирование показало, что MCU CH559L может работать от внутреннего генератора без использования внешнего кварцевого резонатора, выбор источника частоты из кода инициализации PLL.
Конденсатор и резистор цепочки сброса MCU CH559L не нужны, т.к. есть внутренняя схема формирования сброса по питанию.

При тестировании проявился дефект: после подачи питания Gluk Reset Service всегда выводит экран Help, после нажатия Reset Z80 стартует нормально. Зажата клавиша 'A' ZX клавиатуры (адрес переключателя в матрице CH449Q 0x01) до момента программного зануления всех переключателей в CH449Q.
В варианте с MCU RP2040 дефект не проявлялся.
Расследование показало, что RP2040 при включении переводит (большинство) GPIO в режим input c pull-down (подтяжка к земле), выдавая логический '0' на GPIO pin. MCU CH559 при подаче питания активирует для портов pull-up резисторы (подтяжка к питанию 3.3V), выдавая логический '1' на выходы. Матрица переключателей CH446Q записывает значение сигнала DAT по адресу ранее выбранного переключателя при высоком уровне сигнала STB. Так как после аппаратного сброса CH446Q на входах STB и DAT был логический '1', то это приводило к нежелательной активации переключателя по адресу 0x01 (видимо в это значение сбрасывается внутренний регистр адреса).
После подтяжки линии STB внешним резистором 10K к GND проблема почти решилась, но оставался нежелательный импульс длительностью 0.5 us в момент инициализации портов MCU. CH559 при сбросе инициализирует регистры P0..P3 выходного значения портов в значение 1111 1111b, и выстановка регистра P1 в 0x00 сразу после переключения порта P1 на выход приводила к такому эффекту. Исправлено выстановкой значения порта P1 до переключения его на выход.

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

Входы / выходы матрицы клавиатуры A8-A15, D0-D4 и управляющих сигналов Z80 BUSRQ, NMI, RESET подключены к входам / выходам матрицы аналоговых ключей CH446Q. Общий вход X8 для сигналов Z80 BUSRQ, NMI, RESET подключен к GND.

Выходы кнопок GOTEK работают в режиме с открытым коллектором, при нажатии замыкают на GND.

Выход интерфейса Kempston Mouse и Kempston Joystick работает в режиме push-pull.

Схема

scheme

Тестовая плата

pcb

Текущий статус

  • В firmware реализована поддержка PS/2 и USB мышей и клавиатур.
  • Поддерживаются беспроводные мыши / клавиатуры Logitech c 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 хабов и конфигурация беспроводная клавиатура/мышь + gamepad не тестировались, но заявлены в оригинальном проекте.
  • События от USB HID геймпадов транслируются в нажатия кнопок клавиатуры и Kempston Joystick.
  • События от геймпадов с специальным драйвером транслируются в нажатия Kempston Joystick.

Известные проблемы

ToDo

  • Код обработки событий от PS/2 клавиатуры не обрабатывает ошибки parity. После тестирования стабильности работы уточнить необходимость отправки устройству PS/2 команды RESEND / RESET и очистки буфера ввода.
  • Добавить минимальный код трансляции нажатия кнопок геймпадов с специальным драйвером (PS3/XBox) в события клавиатуры.

Вариант для шины ZX-BUS (Nemo-BUS)

Для большей осмысленности существования прошивки MCU и востребованности реализована плата в формате ZX-BUS с полной поддержкой всех возможностей прошивки.

Плата реализует интерфейсы клавиатуры, Kempston Mouse и Kempston Joystick (8 bit), позволяет подключить как минимум 2 USB устройства и PS/2 клавиатуру / мышь.
Интерфейс клавиатуры работает одновременно с портом клавиатуры / магнитофона на основной плате компьютера.

Схема

scheme

Плата

front back pcb 3D front 3D back 3D

Выбор требований

  • Плата должна содержать 2 порта USB и порты PS/2 мыши / клавиатуры, с возможностью подключения стандартных внешних планок.
  • Использовать доступные и недорогие компоненты.
  • Высота платы должна быть минимально возможной, максимальна ширина / высота 99 мм.
  • Предусмотреть защиту портов от короткого замыкания (PS/2 / USB) и статического электричества (USB). Плата должна быть работоспособна без запаянных элементов защиты портов USB от статического электричества.
  • Порт Kempston Joystick должен быть отключаемый по причине потенциальных конфликтов / не нужности.
  • Штыревые разъемы не обязательны к запайке.
  • SMD конденсаторы и резисторы форм фактора 1206 для удобства ручной сборки.

Детали реализации

Матрица переключателей клавиатуры и специальных кнопок вместо отдельного чипа CH446Q помещена в CPLD вместе с дешифраторам адресов и регистрами интерфейсов, с сохранением последовательного интерфейса для доступа (drop-in replacement).

CPLD Altera EPM3128ATC100 выбрана исходя из доступности и минимальной необходимой емкости в макроячейках.

Текущая реализация использует неполную дешифрацию портов клавиатуры, Kempston Mouse, Kempston Joystick.
В идеале для Kempston Joystick желательна полная дешифрация нижних 8 бит адреса порта #1F, но для этого нужна нетривиальная оптимизация.

Плата не блокирует встроенные порты клавиатуры и магнитофона для их параллельной работы.
Плата полностью блокирует встроенный порт Kempston Joystick и порты Kempston Mouse; можно отредактировать описание для параллельной работы интерфейсов Kempston Joystick.
Интерфейс клавиатуры для разделения шины данных подключается к шине в режиме с открытым коллектором.

Использовано порядка 107 из 128 макроячеек. Сложность описания и потребление элементарных компонентов (AND, OR, MUX, tri-state) в выходной RTL map требует особого внимания, при увеличении сложности fitter не может распределить ресурсы CPLD.
Описание схемы в CPLD и testbench для тестирования написаны на языке System Verilog.

Интерфейс Kempston Joystick восьмибитный (4 направления + 4 кнопки) и по умолчанию отключен, включение через jumper / solder jumper.

Интерфейс мыши полный с поддержкой колеса мыши и трех кнопок.

Сигнал IORQGE/ буферизирован до уровня 5V через tri-state буфер 74LVC1G125DB.
Сигналы PAUSE, MAGIC, RESET от CPLD буферизированы на сигналы шины Z80 BUSRQ/, NMI/, RST через FET транзисторные ключи BSS123.

Набор и форма разъемов выбраны исходя из минимальной высоты платы и потенциальной востребованности.
По этой причине разъем PS/2 mini DIN 6 pin комбинированный: PS/2 мышь может быть подключена напрямую, для подключения PS/2 клавиатуры потребуется доступный недорогой Y splitter cable.

Разъемы USB компактные вертикальные Würth Elektronik 614004134726 или их распространенные аналоги.

Сигналы обоих портов USB и PS/2 мыши / клавиатуры также выведены на штыревые разъемы для подключения стандартных внешних планок/выбросов для двух портов USB или отдельных портов PS/2.

Схема сброса CPLD

Важный момент, в многих реализациях игнорируемый.
Для корректной работы ПО в ROM, исполняемого сразу после включения компьютера, например Gluk Reset Service, требуется чтобы регистры матрицы клавиатуры и контроллера Kempston Mouse содержали корректные значения почти сразу после включения (порядка 24 ms): микроконтроллер интерфейса не успевает обновить их значения.
Необходим внутрисхемный сброс регистров CPLD в нужное состояние по системному сигналу RESET или самостоятельное формирование сигнала сброса при включении.
Выбран второй вариант, т.к. CPLD также может формировать системный сигнал RESET (RST_OUT) исходя из значения внутреннего регистра, и это может вводить циклическую зависимость.

Сброс происходит по нисходящему фронту сигнала (более правильно было бы по уровню сигнала).

Защита портов

Защита портов USB / PS/2 от короткого замыкания: самовосстанавливающийся предохранитель форм-фактора 1812 (Littelfuse 1812L050PR, 0.5A, 15V) (номинал требует уточнения, предельная нагрузка отдельного порта USB 0.5A@5V, возможно заменить на Bourns MF-NSMF075-2, 0.75 А, 6V, 1206).

Защита портов USB от статического электричества: IP4220CZ6 Dual USB 2.0 ESD Protection TVS Array. Может быть не установлена.
В плате версии 1.0 подключена некорректно (?) и не должна устанавливаться.
В плате версии 1.1 подключена в соответствии с datasheet, но блокирует порт USB для прошивки MCU.

Зарезервированные сигналы

В CPLD заведены, но не используются сигналы шины ZX-BUS: CLK.
Также заведен сигнал DOS/. Сигнал присутствует только на шине Nemo-BUS xUSSR клонов, в оригинальных моделях ZX-Spectrum с шиной ZX-BUS на этом контакте напряжение питания +9V. Чтобы обратить внимание на этот момент, сигнал подключен через замкнутый solder jumper.

Порт Tape In

Порт входа магнитофона подключен к 6 биту порта #FE клавиатуры, соответственно при блокировке внутреннего порта клавитуры потенциально отключается и порт магнитофона.
Для экспериментов на плате выведен разъем TAPE_IN. К порту можно подключить только LVTTL 3.3V сигнал, например от эмулятора магнитофона на TZXDuino.

Текущий статус

  • Прошивка CPLD проверена через testbench в ModelSim: опция "Tools/Run EDA Simulation Tool/EDA RTL Simulation" в Quartus. Должен быть установлен ModelSim из дистрибутива Quartus (использовалась версия 13.0sp1).
  • Платы собраны и протестированы.
  • Протестированы контроллеры Kempston Mouse, Kempston Joystick, ZX матричной клавиатуры: работают, корректно сбрасываются при включении. Реализация матрицы клавиатуры позволяет зажимать много кнопок без эффекта фантомных нажатий, в том числе при маппинге с HID геймпада.
  • Клавиатура работает параллельно с портом клавиатуры и магнитофона на основной плате.
  • Работа сигналов PAUSE, MAGIC, RESET через транзисторные ключи на шину проверена.
  • Работа TTL входа TAPE_IN не проверена.
  • ESD защита портов блокирует работу USB и не должна устанавливаться.

Известные проблемы

  • При включении в прошивке CPLD поддержки всех трех интерфейсов (Mouse, Joystick, Keyboard) (107 из 128 macrocells) интерфейс клавиатуры начинает работать нестабильно, в том числе при нажатии определенной кнопки джойстика. Предположительно связано с неоптимальным распространением сигналов в комбинаторной схеме при большом заполнении CPLD. В качестве временного решения закомментирована поддержка Kempston Joystick (94 из 128 macrocells).

Сборка проекта

Для сборки прошивки из исходников потребуются: компилятор SDCC 3.9.3, GNU утилиты в составе msys2.

  • Скопировать / установить SDCC 3.9.3. Добавить путь к SDCC/bin в переменную окружения PATH.
  • Установить MSYS2. Путь к msys64/usr/bin должен быть в PATH.

Компиляция:

cd firmware
build-release.bat

Файлы прошивки сохраняются в каталоге firmware/out

Прошивка CH559L

Необходимо установить WCH ISP Studio См. оригинальную инструкцию по прошивке ниже.

Потребуется кабель USB A - USB A (вилка - вилка).

Вход в режим програмирования:

  • Запустить WCH ISP Studio, выбрать режим
  • Отсоединить контроллер от внешнего питания / устройств
  • Замкнуть jumper BOOT0 (P4.6)
  • Подключить контроллер через разъем USB_B к ПК
  • Контроллер должен появиться в списке Dev list
  • При неудаче повторить

Программирование:

  • Выбрать файл прошивки
  • Нажать Download
  • При неудаче повторить

Примечания:

  • Процедура прошивки может быть нестабильной / очень нестабильной в зависимости от контроллера USB в ПК.
  • Вход в режим программирования через запуск bootloader'а прошивкой при сбросе (BOOT1 + RESET) не тестировался.
  • Для CH559L заявлена поддержка serial programmer, есть опция в WCH ISP Studio и доступен инструмент CH55x_python_flasher для Windows / Linux, не тестировалось.

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

Контроллер для USB клавиатуры и мыши [github]
(С) Игорь Матвеев @azx987sa 2023
Микроконтроллер ATmega328P, USB HOST controller CH9350, EPM7128

PentagonExpander (WiP)
(С) Михаил Каа MikhaelKaa 2023
USB / PS/2 мышь / клавиатура, Kempston Mouse / Joystick для Pentagon 128
Микроконтроллер STM32, CPLD EPM7128

USB2SPECTRUM (WiP)
(С) Михаил Каа MikhaelKaa 2023-2024
USB клавиатура / gamepad, PS/2 клавиатура, Kempston Joystick.
Микроконтроллер STM32, CPLD EPM7064

Периферийный контроллер для Скорпиона с поддержкой USB [github]
(С) Kireev Sergey psk 2022
Микроконтроллер ATmega328P, USB HOST controller MAX3421EEHJ, EPM3064

usb_to_zx_spectrum
(C) Constantin billgilbert7000 2024
Универсальный контроллер USB клавиатуры для подключения к компьютерам ZX Spectrum.
Микроконтроллер RP2040, матрица ключей MT8816

ZX HID Keyboard Controller
(C) Anykey 2014
Микроконтроллер PIC24FJ64GB002, EPM7064

PS/2 Universal Keyboard Controller
(C) Xrust 2021
Микроконтроллер ATmega328P, матрица ключей MT8816

Вариация безвейтового контроллера PS/2 клавиатуры для Spectrum - компактный вариант
(C) Rio444 2023
Микроконтроллер ATTiny25, EPM3064

Контроллер клавиатуры PS/2 => ZX Spectrum для ZX_RGBI2VGA-HDMI
(C) Алекс Екб @Alex_Eburg 2024
Микроконтроллер RP2040, матрица ключей CH446Q


USB HID to XT / AT / PS/2 / Serial converter

HIDman is an open source device to allow the use of modern USB keyboards and mice on legacy PCs.

Features

  • (should) Support the majority of standard USB keyboards and mice, including ones that use wireless dongles.
  • Also supports (some) USB Game controllers - buttons/axes are mapped to keypresses or mouse actions

Quickstart Guide

USB Connection

You can connect many different combinations of USB devices to HIDman.

The most obvious being to connect a keyboard to one USB port, and a mouse to the other one :

Or, you could perhaps connect a wireless keyboard+mouse dongle to one port, and a game controller to the other :

Hub support can be hit-and-miss. This is (mostly) not HIDman's fault - many modern hubs don't support low-speed USB devices properly.

Firmware Update

Firmware development is continuing, so if you have problems it's always worth updating to the latest version.

If you're on windows, first install WCH's ISP tool - https://www.wch.cn/downloads/WCHISPTool_Setup_exe.html If on Mac or Linux, install ch55xtool : https://github.com/MarsTechHAN/ch552tool

The next step is to put the HIDman in firmware update mode.

  1. Disconnect everything from HIDman, including all USB devices and PCs. (failure to do this may result in damage to HIDman, your PC, or both).
  2. Hold down HIDman's ⏻ power button.
  3. Use a USB A-to-A cable to connect HIDman's LOWER USB port to a USB port on your modern PC.

After that, update instructions will depend on your operating system.

Windows

Follow the instructions in this diagram :

Linux or Mac

Pass the -f parameter to ch55xtool specify the firmware file to load. For example :

python3 ch55xtool.py -f hidman_axp_v1.1.bin

Technical description

The HIDman is based around the CH559 from WCH, a remarkably flexible chip with two USB HOST ports. This makes it ideal for our purposes.

The code is forked from atc1441's excellent repository - https://github.com/atc1441/CH559sdccUSBHost

About

HIDman for ZX Spectrum

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C 94.6%
  • Verilog 4.8%
  • Other 0.6%