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

ZX_BUS_Mouse — контроллер PS/2 Kempston Mouse для шины ZX-BUS

photo_3.jpg


photo_4.jpg


ZX_BUS_Mouse — это максимально компактный, простой в повторении открытый интерфейс PS/2 Kempston Mouse для шины ZX-BUS (совместим также с Nemo-BUS). Проект включает прошивки микроконтроллера и CPLD, схему и разводку платы в KiCad.

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

Название файла / ПапкаОписаниеGitHubYandex.Диск
KiCad (папка)Исходные файлы печатной платы в KiCadСсылка на GitHubСсылка на Яндекс.Диск
gerber (папка)Gerber-файлы для заказа платы (версия V.1.2)Ссылка на GitHubСсылка на Яндекс.Диск
source (папка)Исходные коды CPLD (Verilog и VHDL) и прошивки ATmega8Ссылка на GitHubСсылка на Яндекс.Диск
history (папка)Исторические схемы и публикации (скриншоты, описания, схемы старых реализаций)Ссылка на GitHubСсылка на Яндекс.Диск
images (папка)Изображения (фото плат, схемы, скриншоты)Ссылка на GitHubСсылка на Яндекс.Диск
test (папка)Тестовая программа MousTest (C) Patrik RakСсылка на GitHubСсылка на Яндекс.Диск
Скачать все файлыВсе файлы находятся в одном архивеСсылка на GitHubСсылка на Яндекс.Диск

История версий​

ВерсияИзменения
V.1.0Сигнал IORQGE/ имеет уровень 3.3V (LVTTL). Плата не работает корректно в ZX-BUS XTRaiser. Для поддержки колеса мыши нужна CPLD EPM3064. При включении регистры MX, MY, MKEY инициализируются некорректно (0xFF, 0x80, 0x60 вместо 0x80, 0x60, 0xFF).
V.1.1Сигнал IORQGE/ буферизирован через 3-state buffer 74LVC1G125 до уровня TTL (5V) — исправлен конфликт с ZX-BUS XTRaiser, повышена стабильность. Добавлен разъём для внешнего брекета PS/2 (распиновка PC AT 486/Pentium). Добавлен разъём UART для отладки. Ширина краевого разъёма ZX-BUS увеличена с 80 до 81 мм. Описание схемы в CPLD переписано на Verilog и оптимизировано для поддержки колеса мыши на EPM3032 при отказе от третьей кнопки (32 macrocells). Возможна сборка без поддержки колеса (31 macrocells) и с полной поддержкой (34 macrocells на EPM3064). Не корректно работает с теневым монитором Scorpion (меню, не грузятся программы из ROM диска при активированной мыши). Нужен сигнал A15 в дешифрацию портов.
V.1.2Исправление загрузки с ROM диска в ПрофПЗУ Scorpion ZS 256. В дешифрацию портов и формирование сигнала IORQGE добавлен сигнал A15.

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

  • Разработать максимально компактный простой в повторении интерфейс PS/2 Kempston Mouse для шины ZX-BUS
  • Исходники прошивок микроконтроллера/CPLD, схема и разводка платы — полностью открыты
  • Сигнал WAIT микропроцессора не должен использоваться
Не входит в требования:
  • Поддержка USB мыши (объём аппаратной и программной поддержки USB стека не соответствует сложности задачи)

Описание интерфейса Kempston Mouse​

Контроллер доступен как три 8-разрядных регистра кнопок и осей X/Y по адресам:
ПортАдресРегистр
#FADF1111 1010 1101 1111MKEY (кнопки)
#FBDF1111 1011 1101 1111MX (ось X)
#FFDF1111 1111 1101 1111MY (ось Y)

Регистр MKEY:
  • Биты 0–2 — инвертированные значения левой, правой, средней кнопок мыши
  • Бит 3 — зарезервирован под четвёртую кнопку (всегда =1)
  • Биты 4–7 — значение оси mouse wheel (если поддержана; начальное %0000). Если wheel не поддержана — всегда %1111
При переполнении 8-битных значений координат осей происходит перенос. Значения осей — 8-битное целое со знаком в дополнительном коде.

Спецификация оси mouse wheel публично зафиксирована в сообщении в Fido эхоконференции REAL SPECCY.
Дополнительная информация: https://speccy.info/Kempston_Mouse

Некоторые исторические реализации и публикации​

ГодНазваниеАвтор(ы)Особенности
1986Original Kempston Mouse InterfaceKempstonОригинал
1995ZX-Ревю #1М.Свечков, К.МехедовСхема
1995–97Scorpion & Д.К.Scorpion (СПб)Контроллер IBM PC-клавиатуры и мыши (схема, прошивка V2.5, инструкция)
1995Схема от Михаила КондратьеваМихаил Кондратьев
1996Kempston Mouse от Create SoftМаксим Романов (Mad Max & RML)ZX-Format #5
1996Spectrofon #20Владимир ЛаpьковZX-SPECTRUM и МЫШЬ
1996AY MouseV.M.G.ZX Power #1
1998Optron #13Рашпиль, Сергей ФилимоновKempston mouse
1998ZX Club #09SERGIUS PUZZLER / PROXIMAKempston mouse
2000Adventurer #11Паршуков Юрий/CPUПростая и маленькая схема
2000Deja Vu #0AFelix KnajzevСхема на КР580ВВ55А
2003DonNews #19Bit/XXLПоддержка оси mouse wheel
2000Схема на AT89C2051Eugene StahovИспользует WAIT; исходный код закрыт
2003PS/2 -> Kempston Mouse Adapter v2.0Studio STALL, Kamil KarimovAT90S2313/AT90S1200, используется WAIT; код закрыт
2010PS/2 -> Kempston Mouse Adapter v4.0Kamil KarimovATTiny2313 @20 МГц, без WAIT; код закрыт
2006/08/11The Kempston Mouse Turbo InterfaceVelesoft, Ben VersteegPIC16F84A + CPLD XC9572X, master/slave, wheel; код закрыт
2007Z-ControllerАлексей Жабин KingOfEvilKR1878ВЕ1 + EPM7128SLC84; код открыт в 2024
2010ZX EvolutionNedoPCATMEGA128, PS/2 клавиатура и мышь; open source
2005ZX_Multi_Card ZXMC1/ZXMC2caro Kamil KarimovPS/2 мышь (Kempston с колесом), клавиатура, RS232, RTC; closed source
2016Схема для Nemo-BUSPrusakМодификация схемы из Spectrofon #20
2023Контроллер для USB клавиатуры и мышиИгорь Матвеев @azx987saCH9350; код открыт в 2025

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

Для реализации выбрана связка ATmega8 + EPM3032. Общая идея, схема включения и выбор битов адреса для дешифрации портов взяты из Deltagon 1.5 (Евгений Королёв @djking26, Игорь Матвеев @azx987sa).

ATmega8:
  • Прошивка написана на C. В отдельной ветке есть упрощённая версия на библиотеках Arduino.
  • Аппаратные прерывания по фронтам PS/2 MDATA/MCLK и таймеры не использовались для большей понятности кода. Однако сигналы MDATA/MCLK подключены к INT1/INT0 — есть альтернативная прошивка, использующая аппаратное прерывание от PS/2 clock (для разработчиков).
CPLD EPM3032:
  • Реализация регистров интерфейса, дешифрации адресов и формирования сигнала IORQGE выполнена на Verilog (есть также менее понятная реализация на VHDL).
  • Используется 31 из 32 макроячеек с отключёнными битами оси mouse wheel; 33 макроячейки при включении битов wheel.
  • По умолчанию: поддержка двух кнопок и mouse wheel — используется 32 макроячейки.
  • Теоретически возможно использование EPM3064 или оптимизация кода.
  • Формирование сигнала IORQGE/ происходит исходя из битов адресов A0, A1, A7, A5 и сигнала M1/.
Инициализация:
  • При подаче питания до первого пакета от PS/2 мыши в регистры MKEY, MX, MY записываются значения 0xFF, 0x80, 0x60.
  • При отключённой поддержке wheel в старших 4 битах MKEY — %1111; при включённой — начальное значение оси %0000.
Отладка:
  • Проводилась на Pentagon 2024 и сверялась с эмулятором Unreal Speccy 0.39.0 (референс).
  • Подтверждена работа на Scorpion ZS 256, Scorpion ZS 1024, Pentagon 1024ZP Crocodile Edition.

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

  • На Scorpion ZS 256 в меню сервисного монитора мышь работает некорректно (при этом тест в RAM работает). Не работает загрузка с ROM диска в ПрофПЗУ при включённой опции графических манипуляторов. Исправлено добавлением сигнала A15 в схему дешифрации (также проблема исправляется использованием сигнала /DOS).
  • Некорректная работа регистров осей в CPLD (перепутанные биты) — решается перекомпиляцией и перепрошивкой CPLD.
  • На некоторых платах с неправильной реализацией IORQGE возможен конфликт с портом Kempston Joystick.

Сомнительные моменты (решённые)​

  • PS/2 мышь может требовать задержку перед инициализацией. Решено перезагрузкой контроллера через 2 секунды ожидания инициализации.
  • Проблема с Gluk Reset Service: Мышь при включении автоматически не определяется (ATmega не успевает проинициализировать PS/2 мышь за 1–2 с и выставить регистры за ~6 мкс). Варианты решения: (1) удерживать /RESET Z80 контроллером (как в ZXMC); (2) инициализировать регистры сразу после включения. В коде реализован второй вариант.

Bill of Materials (BOM)​

RefКолич.Номинал/МодельКорпусОписание
C1–C880.1 мкФ1206Керамический конденсатор
C9110 мкФTantalum SMD (6032-28)Танталовый (полярный)
C10122 мкФTantalum SMD (6032-28)Танталовый (полярный)
J41Mini-DIN-6Mini-DIN-6 femaleРазъём PS/2 (зелёный с прямыми ушками)
J512×03 ISPPinHeader 2.54mmISP разъём (опционально)
J712×05 JTAGIDC-Header 2.54mmJTAG разъём (опционально)
R112.2 кОм1206Резистор
R2, R324.7 кОм1206Резистор
R4–R7410 кОм1206Резистор
U11ATmega8A-UTQFP-32 (7×7 мм, 0.8 мм)16 МГц, 8 КБ Flash, 1 КБ SRAM, 512 Б EEPROM
U21EPM3032ALC44PLCC-44 (THT-сокет)CPLD MAX3000A, 32 макроячейки, 34 I/O
U31AMS1117-3.3SOT-223-3 (TabPin2)LDO регулятор, 3.3 В, 1 А
U4174LVC1G125DBSOT-23-5Буфер с 3-состоянием
1PLCC-44 сокетTHT DIPДля установки CPLD

Отладочные компоненты:
  • R8, R9 — 2.2 кОм (1206) — подтяжка I2C SDA/SCL
  • J6 — разъём 1×04 (PinHeader 2.54mm) — I2C для OLED

Сборка прошивок​

ATmega8:
  • Требуется: WinAVR-20100110, MSYS2
  • Команды: make clean, make all
  • Fuses: Low=0xC4, High=0xD9
Altera EPM3032:
  • Требуется: Quartus II Web Edition 9.1 SP2 или 13.0 SP1
  • Открыть проект → Start Compilation → Programmer (USB Blaster) → выбрать .pof → Program/Configure/Verify → Start

Прошивка​

ATmega8:
  • Программатор CH341A, ПО NeoProgrammer V2.2. Прижать ISP-гребёнку под углом (можно не припаивать).
Altera EPM3032:
  • Altera USB Blaster (или китайский аналог на CH552G — может потребоваться обновление прошивки программатора). Драйвер — из quartus/drivers/usb-blaster.
  • Важно: при прошивке CPLD подайте внешнее питание 5V (через ISP или слот ZX-BUS). На практике плата успешно перешивалась на включённом Pentagon 2024.
  • Б/у чипы EPM3032 могут быть залочены — можно попытаться разблокировать или заказать у другого поставщика.

Поддержка mouse wheel​

КонфигурацияКод (заменить в Verilog/VHDL)МакроячейкиЦелевое CPLD
2 кнопки + wheel (по умолчанию)assign D = MKEY_SEL ? {register_key[7:4], 2'b11, register_key[1:0]} : 8'hZ;32EPM3032
3 кнопки без wheelassign D = MKEY_SEL ? {4'b1111, register_key[3:0]} : 8'hZ;31EPM3032
3 кнопки + wheelassign D = MKEY_SEL ? register_key : 8'hZ;34EPM3064

Отладка​

С OLED дисплеем I2C 128×32:
  • Запаять R8, R9 (2.2 кОм), подключить дисплей к разъёму I2C.
  • Прошить отладочную прошивку ZX_BUS_Mouse_ATmega8_Fuses_C4_D9_Debug_OLED_128x32.hex
  • При движении мыши будут выводиться координаты и состояние wheel/кнопок.
Со светодиодом:
  • Подключить светодиод (короткий пин — к GND) к контактам SDA и GND разъёма I2C.
  • Прошить ZX_BUS_Mouse_ATmega8_Fuses_C4_D9_Debug_LED_SDA_GND.hex
  • При успешной инициализации PS/2 светодиод загорается; при нажатии кнопок гаснет.

Тестовое ПО​

MousTest (C) 2012 Patrik Rak (raxoft) — в папке test.

Credits (Благодарности)​

  • Общая идея, схема включения, выбор битов адреса: Deltagon 1.5 (Евгений Королёв @djking26, Игорь Матвеев @azx987sa)
  • @Alex_Eburg — ZX BUS PCB Prototype Board
  • Black_Cat — BC Info Guide #7 «Стандартизация ZXBus интерфейсов и шин» (c) 2011–2020
  • Adam Chapweske — PS/2 Mouse/Keyboard Protocol (1999), The PS/2 Mouse Interface (2003)
  • Kris Chambers — Arduino/Wiring Library for PS2 mouse
  • Patrik Rak (raxoft) — MousTest
  • Sylaina — OLED for AVR mikrocontrollers library
  • Velesoft — RUSKA VERZE KEMPSTON MOUSE (скриншоты статей)
  • Zxdn — Электроника/схемы устройств (Клавиатуры, мыши)
  • Калинин Вячеслав/newart — zxpress.ru
  • @AMM — поддержка в начальном запуске
  • @Michael_Kaa — помощь в тестировании на Scorpion ZS 256
  • Denis (Новый Уренгой) — тестирование и отладка на Scorpion ZS 256
  • @djking26 — локализация проблемы с Gluk Reset Service

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

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

Оценки

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