Я всё думаю, как мышь прицепить...
PS/2 - просто, но получение данных занимает очень много времени, и реализация на эмуляторах не очевидна, в виду малого количества реалов и большей доступности эмулятора - такой вариант подключения не очень практичен.
Нашел USB-хост на stm32f103, в продаже есть готовые платы, не очень дорогие.
...
Сошлись таки "звёзды на небе", ..... подключил USB-мышь к реальному вектору, через контроллер.
Пока сделал самый простой в реализации вариант, контроллер мыши выдаёт состояние клавиш и текущие координаты "курсора" по осям в диапазоне: для Х - [0-511] для Y - [0-255]
Начало координат - нижний левый угол.
Пока без колеса прокрутки.
В регистре состояния клавиш, хранится младший бит (дополнительный) положения курсора по оси "Х".
Собственно, если этот младший бит не учитывать, то в режиме экрана 256х256, указатель имеет диапазон из регистра [0-255].
А при переключении экрана в режим 512х256, учитывая дополнительный младший бит координаты "Х" можно позиционировать все точки экрана, скорость перемещения курсора не изменится.
"Контроллер USB-мыши" собран на stm32f103ret6 (что было под рукой).
Данные из мыши контроллер читает через "usb-hub" собранный на чипе "max3421e".
Готовая плата usb-hub на max3421e, обошлась примерно 300руб. Вредная, но юзать вполне можно.
Подключается контроллер к "ПУ" Вектора, порт С - управление, А - выставляется номер регистра контроллера, В - чтение данных из выбранного регистра.
Использование портов "ПУ":
; Порт 5:
; бит С5 - запись - вкл/сброс мыши, "0" - вкл. , "1" - откл. и сброс начальных координат в 128/128
; бит С4 - запись - строб запроса данных, перед чтением данных из мыши, нужно сбросить бит в "0", затем восстановить в "1"
;
; Порт 6:
; В7-0 - чтение - байт данных из мыши
;
; Порт 7:
; биты А3-0 - запись - номер регистра контроллера мыши, для чтения данных
; регистры контроллера мыши:
; регистр "0" - состояние кнопок и младший бит "Х" для режима экрана 512/256
; бит 7 - "левая" кнопка мыши "1" - нажата
; бит 6 - "правая" кнопка мыши "1" - нажата
; бит 5 - "средняя" кнопка мыши "1" - нажата
; бит 0 - младший бит "Х" для режима экрана 512/256
; регистр "1" - "Х" положение курсора мыши (от 0 до 255), значение обновляется только при чтении регистра "0"
; регистр "2" - "Y" положение курсора мыши (от 0 до 255), значение обновляется независимо от чтения других регистров
[свернуть]
За кнопки мыши, отвечают биты, которые были описаны в тех-доках на Вектор. Там есть описание подключения мыши к Вектору, и соответствие кнопок-бит. Они отзеркалены по отношению к стандарту для USB и РС/2 мышей.
Взял вариант уже предложенный для Вектора.
С младшим битом положения по "Х" для режима экрана 512х256, получилось очень удобно.
Из-за особенностей реализации этого режима, этот "младший бит" отвечает за переключение плоскостей, а не за координату на плоскости. Соответственно, по значению из регистра для "Х" (№1) вычисляем позицию указателя по горизонтали, а по состоянию "младшего бита" выбираем экранную плоскость.
Во вложении исходник и "rom" теста контроллера. Сочетание клавиш пкм+скм - переключает экран в режим 512х256, пкм+лкм - в режим 256х256 точек.
Собственно, весть код, работы с контроллером через "ПУ":
;
MVI A,82H ; ПУ - А,С на вЫход , В на вход
OUT 4
MVI A,0FFH
OUT 5 ; отключить/сбросить мышь
OUT 7 ; номер регистра мыши НЕ указан
;------------------------
;========== инициализация мыши ==============
mvi a,0Ah ; бит 5 - "0" - включить мышь
out 4
;============================================
RDMous: ; прочитать
;--------------- прочитать регистры мыши -----------------
xra a ; регистр "0"
out 7
mvi a,08h ; строб бит 4 в "0"
out 4
mvi a,09h ; строб бит 4 в "1"
out 4
in 6 ; чтение выбранного регистра
STA MKey ; сохранить состояние кнопок
mvi a,01h ; регистр "1"
out 7
mvi a,08h ; строб бит 4 в "0"
out 4
mvi a,09h ; строб бит 4 в "1"
out 4
in 6 ; чтение выбранного регистра
STA POSMX ; сохранить позицию Х
mvi a,02h ; регистр "2"
out 7
mvi a,08h ; строб бит 4 в "0"
out 4
mvi a,09h ; строб бит 4 в "1"
out 4
in 6 ; чтение выбранного регистра
STA POSMY ; сохранить позицию Y
;
[свернуть]
При тесте usb-мыши, возник вопрос, что делать со скоростью перемещения курсора...
На РС-шном экране с большим разрешением, курсор проходит от края до края, при перемещении мыши примерго сантиметров на 7-8, это привычная скорость.
А у Вектора всего 256х256 - курсор пробегал от края до края примерно за 1см перемещения мыши по коврику... 8()
Пришлось уменьшить скорость в 8 раз.
Сейчас перемещение указателя мыши по экрану Вектора вполне комфортно.
На скриншоте - тест мыши. "Сетка" помогает понять как движется "указатель мыши", и визуализировать режим экрана 512х256.
Исходник проекта для stm32 на Keil можно будет потом выложить. Пока в нём много мусора, так как переделывался из исходников, скачанных с просторов и-нета.
Откопал в кладовке плату с ПЛИС, у которой распаян переходник на "ВУ", в сырец старого проекта добавил "мост" между портом D4h и "контроллером USB-мыши", поменял в тестовой программе чтение регистров "контроллера мыши".
"Контроллер USB-мыши" переткнул с "ПУ" в разъём платы ПЛИС, и все дела.
Во вложении исходник и rom, с тестом USB-мыши, подключенной к шине "ВУ".
код работы с мышью через порт D4h
;
; тест USB-мыши в разъёме "ВУ"
; 08.2024
;--------------------------------------------------
; порт D4h - на запись - слово управления контроллером мыши
;
; бит 5 - запись - вкл/сброс мыши, "0" - вкл. , "1" - откл. и сброс начальных координат в 128/128
; биты 3-0 - запись - номер регистра мыши, для чтения данных
;
; порт D4h - на чтение - данные из запрошенного регистра контроллера мыши
;=======================================================================================================
;========== инициализация мыши ==============
mvi a,0DFh ; бит 5 - "0" - включить мышь
out 0D4h
;
;=========================================================
RDMous: ; прочитать и вывести на экран
;--------------- прочитать регистры мыши -----------------
;
xra a ; регистр "0"
out 0D4h
in 0D4h ; чтение выбранного регистра
STA MKey ; сохранить состояние кнопок
mvi a,01h ; регистр "1"
out 0D4h
in 0D4h ; чтение выбранного регистра
STA POSMX ; сохранить позицию Х
mvi a,02h ; регистр "2"
out 0D4h
in 0D4h ; чтение выбранного регистра
STA POSMY ; сохранить позицию Y
;
[свернуть]
Так-же во вложении проект на Квартус, для ПЛИС EP4CE6E22C8.
Я криворукий прогер на верилоге, даже на любиреля не тяну, за стиль не пинать.
Но надеюсь запись и чтение порта будет понятна.
Для "Мыши" выбрал порт D4, так как 4Dh - код символа "М".
Архив MOUSE_USB_R9 содержит исходник универсального теста и адаптера контроллера на шину ВУ, для контроллера, предоставляющего доступ к ДЕВЯТИ регистрам ( кнопки, X, Y, W, mX, mY, , Xps, Yps, Id ).
Архив MOUSE_USB_R12 содержит исходник универсального теста контроллера, добавлены регистры: 8, 9, 10.
Это сырые данные мыши. Данные регистров 9 и 10 смещения только защищаются от переполнения.
В контроллере R12 регистры
"0" кнопки - состояние кнопок и младший бит координаты "Х" для режима экрана 512х256
бит 7 - "левая" кнопка мыши "1" - нажата
бит 6 - "правая" кнопка мыши "1" - нажата
бит 5 - "средняя" кнопка мыши "1" - нажата
бит 0 - младший бит координаты "Х" для режима экрана 512х256, значение обновляется только при чтении регистра "1"
"1" - "Х" координата курсора мыши (от 0 до 255)
"2" - "Y" координата курсора мыши (от 0 до 255)
"3" - колесо прокрутки, правда с моими мышами не работает;
"4" - смещение мыши по X, за период между чтениями этого регистра от -128 до 127 ( от 80h до 7fh );
"5" - смещение мыши по Y, за период между чтениями этого регистра от -128 до 127 ( от 80h до 7fh );
"6" - смещение мыши по "X" между чтениями этого регистра от 0 до 127 ( бит 7 - направление "1" - влево )
"7" - смещение мыши по "Y" между чтениями этого регистра от 0 до 127 ( бит 7 - направление "1" - вниз )
"8" - состояние кнопок
бит 0 - "левая" кнопка мыши "1" - нажата
бит 1 - "правая" кнопка мыши "1" - нажата
бит 2 - "средняя" кнопка мыши "1" - нажата
"9" - "Х" смещение курсора мыши (от -127 до +127) сырые данные мыши
"10" - "Y" смещение курсора мыши (от -127 до +127) сырые данные мыши
"15" - регистр идентификатора, выдаёт значение 6Dh, позволяет определить факт подключения контроллера.
[свернуть]
На фото, четыре крайние левые столбца экрана - статистика значений регистров R4, R5, R6, R7 (соответственно) полученных от контроллера позволяет определить максимальные значения регистров - максимальное смещение мыши за отрезок времени.
Добавил во вложение "arkanoid", адаптированный под контроллер USB-мыши, разъём "ВУ", порт D4h.
Если "контроллер мыши" не подключен, то управление обычное.
Визуальное отличие - в нижнем левом углу экрана есть маркер и отображаются байты, прочитанные из регистров "0" и "4" контроллера.
В каталоге обнаружился исходник игры "MINSWEEPER", сделал из неё демонстрашку мыши, во вложении "MINES_M".
Адаптирована под контроллер USB-мыши, разъёмы "ПУ" и "ВУ".
Если "контроллер мыши" не подключен, то управление обычное.
Визуальное отличие - в верхнем левом углу экрана есть маркер и отображаются байты, прочитанные из регистров "0", "1" и "2" контроллера.
На дополнительном скриншоте экран теста контроллера R12.
Добавлены столбцы статистики для регистров R9, R10.
Во второй строке состояние добавленных регистров R8, R9, R10.
В тесте R12:
клавиша "РУС/LAT" - переключает на перемещение мыши по данным регистров 1 и 2.
клавиша "УС" - переключает на перемещение мыши по данным регистров 4 и 5.
клавиша "СС" - переключает на перемещение мыши по данным регистров 9 и 10.
игра "mines" - для экспериментов есть сборка с "сервером мыши" и конфигом для эмулятора emu https://zx-pk.ru/threads/35656-vekto...=1#post1202779
игра ARKANOID - для экспериментов есть сборка с "сервером мыши" и конфигом для эмулятора emu https://zx-pk.ru/threads/35656-vekto...=1#post1202815
игра COLLINES - для экспериментов есть сборка с "сервером мыши" и конфигом для эмулятора emu https://zx-pk.ru/threads/35656-vekto...=1#post1202874




Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 

