Skip to content

proboterror/ZX_BUS_Mouse

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ZX-BUS PS/2 Kempston Mouse Controller

photo_1 photo_2 photo_3 photo_4 pcb_front pcb_back pcb scheme

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

  • Разработать максимально компактный простой в повторении интерфейс PS/2 Kempston Mouse для шины ZX BUS.
  • Исходники прошивок микроконтролллеров / CPLD, схема и разводка платы должны быть полностью открыты.
  • Сигнал WAIT микропроцессора не должен использоваться.

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

  • Поддержка USB мыши. Объем аппаратной и программной поддержки USB стека в микроконтроллере не соответствует сложности задачи.

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

Контроллер доступен как 3 8-разрядных регистра кнопок и осей X/Y MKEY, MX, MY по следующим адресам портов:

#FADF 1111 1010 1101 1111 BUTTONS
#FBDF 1111 1011 1101 1111 MX
#FFDF 1111 1111 1101 1111 MY
  • Биты 0-2 регистра MKEY соответствуют инвертированным значениям левой, правой, средней кнопок мыши.
  • Бит 3 регистра MKEY зарезервирован под четвертую кнопку мыши и всегда равен 1.
  • Биты 4-7 регистра MKEY хранят значение оси mouse wheel, если она поддержана (начальное значение %0000). Если ось mouse wheel не поддержана, всегда содержат %1111.

При переполнении 8-bit значений координат осей происходит перенос значения.

Спецификация оси mouse wheel была публично зафиксирована в сообщении в Fido эхоконференции REAL SPECCY

Дополнительная информация: https://speccy.info/Kempston_Mouse

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

Original Kempston Mouse Interface (1986)

ZX-Ревю 1995 #1 [схема]
KEMPSTON-MOUSE
(С) М.Свечков (схема), К.Мехедов (программа) 1995

Фирма Scorpion & Д.К. (Санкт-Петербург 1995-97)
Контроллер IBM PC-клавиатуры и мыши
Публикации: ZX Format #01 (31 октября 1995) On-Line #15 (17 декабря 1995) On-Line #16 (24 декабря 1995)

Схема от Михаила Кондратьева (17 апреля 1995)

Интерфейс Kempston Mouse от Create Soft (Максим Романов, Mad Max & RML) (Санкт-Петербург)
ZX-Format #5 (12 декабря 1996) [screenshot]
Схемa KEMPSTON MOUSE
(С) Mad Max

Spectrofon #20 (12 октября 1996) [text] [screenshot] [схема]
ZX-SPECTRUM и МЫШЬ
(C) Владимиp Лаpьков, 1996, Санкт-Петербург

AY Mouse
ZX Power #1 (12.10.1996)
В ЗАЩИТУ БЕДНОЙ МЫШКИ
(C) V.M.G., Харьков

Optron #13 (12 июня 1998) [screenshot]
Kempston mouse
(C) Рашпиль, Сергей Филимонов

ZX Club #09 (31 октября 1998) [screenshot]
Kempston mouse
(С) SERGIUS PUZZLER / PROXIMA

Adventurer #11 (31 июля 2000) [screenshot]
Описание на подключение Kempston MOUSE (простая и маленькая схема)
(C) Паршуков XN0ByS Юрий/CPU

Deja Vu #0A (30 сентября 2000) [text] [screenshot]
Схема Kempston Mouse Interface (v2.1) на БИС KP580BB55A
(C) Felix Knajzev

Поддержка оси mouse wheel
DonNews #19 (26 февраля 2003) [screenshot]
KEMPSTON MOUSE INTERFACE
(C) Bit/XXL

Схема контроллера мыши на AT89C2051 (MSC-51)
Опубликовано в ZX-Net эхоконференции HARDWARE.ZX (21 Aug 2000)
(C) Eugene Stahov 1999-2000
Микроконтроллер AT89C1051/AT89C2051, исходный код прошивки закрыт.
Использует сигнал WAIT при опросе регистров интерфейса.

PS/2 -> Kempston Mouse Adapter v2.0
Опубликовано в Fido эхоконференции ZX.SPECTRUM (2003-01-10)
(C) 1999-2000 Studio STALL (Eugene Stahov)
(C) 2003 Kamil Karimov
Микроконтроллер AT90S2313 (или AT90S1200), исходный код прошивки закрыт.
Использует сигнал WAIT при опросе регистров интерфейса.

PS/2 -> Kempston Mouse Adapter v4.0 [схема]
(C)2010 Kamil Karimov
Не использует сигнал WAIT.
Для обеспечения работы контроллера без торможения Z80 микроконтроллер ATTiny2313 работает на частоте 20 Мгц.
Исходный код прошивки микроконтроллера закрыт.

The Kempston Mouse Turbo Interface 2006/2008/2011 by Velesoft and Ben Versteeg
PC Mouse and Kempston joystick Interface for the Sinclair ZX Spectrum
Поддержка master/slave mouse, mouse wheel.
Микроконтроллер PIC16F84A + CPLD XC9572X
Исходный код прошивки микроконтроллера закрыт.

Z-Controller
(C) Алексей Жабин KingOfEvil 2007
Позволяет подключать к ZX Spectrum стандартную клавиатуру и мышь с интерфейсом PS/2, IDE-устройства, карты флеш-памяти стандарта SD. Устройство предназначено для установки в слот ZX Bus.
Документация
Микроконтроллер КР1878ВЕ1 + CPLD EPM7128SLC84
Closed source

ZX Evolution
(C) NedoPC 2010
Периферийный контроллер ATMEGA128
PS/2 интерфейс клавиатуры и мыши
Open source

ZX_Multi_Card ZXMC1/ZXMC2
(C) caro Kamil Karimov 2005
Поддерживает:

  • IBM AT клавиатуру - эмулирует стандартную клавиатуру Спектрума;
  • PS/2 мышка - эмулирует Кемпстон мышку (с колесом);
  • RS232 - поддержка внешнего модема с адресацией по Кондратьеву.
  • Часы реального времени (RTC)

Closed source

Схема контроллера Kempston Mouse для Nemo-BUS (модификация схемы из Spectrofon #20)
(C) Prusak 2016

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

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

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

Прошивка ATmega для обработки протокола написана на языке C.
Аппаратные прерывания ATmega по фронтам сигналов PS/2 MDATA/MCLK и таймеры не использовались для большей понятности кода. Тем не менее, сигналы MDATA/MCLK подключены к входам INT1/INT0 микроконтроллера.
Реализация регистров интерфейса, схемы дешифрации адресов и формирования сигнала IORQGE для CPLD EPM3032 выполнена на языке VHDL.

Текущая реализация использует 30 из 32 macrocells в CPLD EPM3032 c отключенными битами оси mouse wheel в регистре кнопок мыши, 35 macrocells при включении битов оси mouse wheel.
Попытка перенести реализацию на AHDL пока закончилась таким же потреблением macrocells.
Теретически возможно использование менее доступной и более дорогой CPLD EPM3064 или оптимизация модели в VHDL и распределения ресурсов в CPLD.

При подаче питания на контроллер до прихода первого пакета событий от PS/2 мыши в регистры MKEY, MX, MY всегда записываются значения 0xFF, 0x80, 0x60.
При отключенной поддержке оси mouse wheel в старших 4 битах регистра MKEY %1111, при включенной поддержке начальное значение оси %0000.

Формирование сигнала IORQGE/ происходит исходя из общих битов адресов портов A0,A1,A7,A5/ и сигнала M1/.

Отладка устройства проводилась на Pentagon 2024 и сверялась с эмулятором Unreal Speccy 0.39.0, выбранным как референс реализации. Работа на других клонах ZX Spectrum не проверялась.

Условная эквивалентная схема контролллера в CPLD: scheme-decompose

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

На некоторых платах с неправильной реализацией IORQGE теоретически возможен конфликт с портом Kempston Joystick.

Сомнительно:

PS/2 мышь может требовать задержку перед инициализацией после подачи питания. Решено перезагрузкой контроллера после 2 секунд ожидания инициализации устройства PS/2.

Bill of materials

Ref Qnty Value Cmp name Footprint Description
C1, C2, C3, C4, C5, C6, C7, C8 8 0.1u C Capacitor_SMD:C_1206_3216Metric Unpolarized capacitor
C9 1 10u C_Polarized Capacitor_Tantalum_SMD:CP_EIA-6032-28_Kemet-C_Pad2.25x2.35mm Polarized capacitor
C10 1 22u C_Polarized Capacitor_Tantalum_SMD:CP_EIA-6032-28_Kemet-C_Pad2.25x2.35mm Polarized capacitor
J4 1 Mini-DIN-6 Mini-DIN-6 Connector_Mini-DIN_Female_6Pin_2rows 6-pin Mini-DIN connector
J5 1 Conn_02x03_Odd_Even ISP Conn_02x03_Odd_Even Connector_PinHeader_2x03_P2.54mm_Vertical
J7 1 Conn_02x05_Odd_Even JTAG Conn_02x05_Odd_Even Connector_IDC-Header_2x05_P2.54mm_Vertical
R1 1 2.2K R Resistor_SMD:R_1206_3216Metric Resistor
R2, R3 2 4.7K R Resistor_SMD:R_1206_3216Metric Resistor
R4, R5, R6, R7 4 10K R Resistor_SMD:R_1206_3216Metric Resistor
U1 1 ATmega8A-U ATmega8A-U Package_QFP:TQFP-32_7x7mm_P0.8mm 16MHz, 8kB Flash, 1kB SRAM, 512B EEPROM, TQFP-32
U2 1 EPM3032ALC44 EPM3032ALC44 Package_LCC:PLCC-44_THT-Socket CPLD MAX3000A MCs:32 IOs:34 [PLCC-44]
U3 1 AMS1117-3.3 AMS1117-3.3 Package_TO_SOT_SMD:SOT-223-3_TabPin2 1A Low Dropout regulator, positive, 3.3V fixed output, SOT-223

IC Socket PLCC-44 THT DIP

Разъем J4 PS/2 зеленый с прямыми ушками.
Разъемы программаторов J5, J7 - любой pin header 2x03, 2x05 2.54mm. Запаивать их не обязательно.
Конденсаторы C9, C10 линейного преобразователя напряжения танталовые согласно datasheet.

Отладочные компоненты:

Ref Qnty Value Cmp name Footprint Description
R8, R9 2 2.2K R Resistor_SMD:R_1206_3216Metric Resistor
J6 1 Conn_01x04 Debug Conn_01x04 Connector_PinHeader_1x04_P2.54mm_Vertical

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

ATmega8

Нужно установить AVR SDK: WinAVR-20100110
Сompile:

make clean
make all

Собранная прошивка с включенной поддержкой mouse wheel и отключенным отладочным выводом на OLED дисплей.

Altera EPM3032

Для сборки и заливки прошивки CPLD необходима бесплатная версия ПО Quartus II Web Edition версии 9.1 SP2 / 13.0 SP1
Последовательность компиляции и прошивки:

  • File/Open Project
  • Processing/Start Compilation
  • Tools/Programmer
  • При необходимости выбрать программатор USB Blaster через Hardware Setup
  • Для файла скомпилированной прошивки mouse_controller.pof выбрать Program/Configure и Verify.
  • Start.

Заливка прошивки

ATmega8

Для прошивки ATmega можно использовать программатор CH341A и ПО NeoProgrammer V2.2.
Последовательность прошивки:

  • Убедиться, что микроконтроллер доступен и определяется через SPI: Нажать Detect.
  • Если контроллер не определяется, то возможна ошибка соединения проводов с программатором, отсутствие контакта в разъеме ISP, ошибки сборки, в микроконтроллере могут быть прошиты fuses для использования внешнего кварцевого резонатора.
  • Выставить Fuses через соответствующий диалог, нажать Write.

Fuses для прошивки ATmega8:

Low     High
0xC4    0xD9
  • Открыть файл .hex прошивки через Open File.
  • Через Write IC сделать Erase/Write/Verify.

При некоторой сноровке гребенки разъемов ISP и JTAG можно не припаивать, а прижать под углом на время прошивки.

Altera EPM3032

Для прошивки по JTAG может быть использован дешевый аналог Altera USB Blaster.
Несколько более дорогие аналоги USB Blaster на FT245+CPLD возможно более совместимы в установке и работе (не проверялось).

Доступные дешевые аналоги Altera USB Blaster Rev.c на CH552G условно работоспособны, нужно обновление прошивки программатора.
Требуется WCHISPTool и прошивка CH552_Blaster_v22.2.27.hex
Подробнее: Прошивка китайского USB-Blaster на основе CH552G
Драйвер программатора устанавливается из папки установки quartus/drivers/usb-blaster

После запайки в плату всех компонентов помимо CPLD и обвязки JTAG, в первую очередь преобразователя питания 5V=>3.3V, при подаче питания 3.3V на разъем JTAG с программатора напряжение питания падает до ~2V.
CPLD определяется в Quartus, но не прошивается.
Нужно подать на плату внешнее питание 5V через разъем ISP или слот ZX-BUS.
На практике при отладке плата успешно перешивалась на лету на включенном Pentagon 2024.
Требуется особая осторожность при подключении программаторов через USB, необходимо выполнять на выключенном устройстве.

Бывшие в употреблении чипы EPM3032 могут быть залочены и не видны через JTAG интерфейс. Можно попытать удачи в процедуре unlock, или заказать у другого поставщика.

Поддержка mouse wheel

Включение поддержки mouse wheel в регистре кнопок контроллера:

	register_key: register_generic_3_state
	generic map(data_width => 3)
	port map(DI(2 downto 0), D, C => to_stdulogic(MKEY), OE => MKEY_SEL);

заменить на:

	register_key: register_generic_3_state
	port map(DI, D, C => to_stdulogic(MKEY), OE => MKEY_SEL);

Целевым устройством указать EPM3064.

Текущая реализация использует 35 macrocells вместо 30. На EPM3032 доступно 32 macrocells, на EPM3064 64 macrocells.

Работа mouse wheel проверялась на EPM3032 с отключенной одной из осей X/Y. Работа с EPM3064 не тестировалась.

Отладка

ПО для тестирования интерфейса: MousTest (C) 2012 Patrik Rak - Raxoft

Для отладки интерфейса PS/2 можно использовать OLED I2C Display 128x32. Должны быть запаяны резисторы подтяжки I2C SDA/SCL R8, R9.
Припаивать дисплей не нужно, достаточно контакта в разъеме I2C под собственным весом дисплея.
В Makefile нужно включить отладочный код и пересобрать с библиотекой OLED for AVR mikrocontrollers:

CFLAGS += -DDEBUG=1

Можно отследить шаги инициализации устройства PS/2, тип устройства, обработку осей, кнопок и колеса мыши.

Credits