Начиная с версии 0.21 микропрограммы КВУ, появилась поддержка PS/2 манипулятора мышь в стандартном виде: перемещение и три клавиши, колёсико не поддерживается. Мышь подключается к линиям интерфейса I2C по следующей схеме: SDA - Data, SCL - CLOCK.
Работа с мышью требует жёсткого тайминга и ранее обсуждалось, почему "стандартная" реализация не является приемлемой. Реализованный метод работы далёк от совершенства, но вполне пригоден для большинства ситуаций. Мышь работает в режиме Remote Mode, при котором отправка состояния осуществляется только по запросу.
Главным отличием от работы с другими интерфейсами является то, что опрос мыши идёт асинхронно, на время опроса работа КВУ фактически останавливается. В это время не работают обработчик таймера, обновление информации на экране, не переключаются ноты мелодии, не обрабатываются нажатия клавиш. Процедура опроса занимает около трёх миллисекунд, что достаточно долго, поэтому не стоит опрашивать мышь слишком часто.
Для управления используются те же порты, что и для устройств GPIO, аналогично возвращается значение 0 или 1 при успехе или ошибке соответственно. Но в данном случае крайне не рекомендуется постоянно опрашивать порт, а вместо этого формировать программную задержку 5...10 мс, после чего проверять результат.
Порядок работы с мышью из пользовательской программы следующий:
1. Инициализировать мышь, записав команду 0xE0 в порт 215, сделать задержку 5 мс, проверить значение в порту 215. Если значение равно 1, это значит, что мышь не подключена. Если инициализация прошла успешно, будет возвращено значение 0 и активированное состояние мыши будет инициализироваться индикацией светодиода NumLock на клавиатуре.
2. Для опроса необходимо записать команду 0xE1 в порт 215, выдержать паузу 10 мс и проверить код ошибки в порту 215. Если произошла ошибка чтения, опрос необходимо повторить.
3. Опрос состояния возвращает следующие значения:
- порт 216 - состояние клавиш: биты 0-2 соответствуют левой, правой и средней кнопке ' соответственно, в битах 4-6 сохраняются предыдущие значения, что позволяет фиксировать нажатия на клавиши, бит 3 - бит арбитража, он описан дальше;
- порты 217 и 218 возвращают накопительное перемещение мыши по осям X и Y в формате восьмибитных знаковых целых чисел, эти значения не сбрасываются при опросе, напротив, программа должна анализировать перемещение и корректировать значения записью в соответствующий порт для корректной работы счётчиков перемещений. По опыту приемлемым является накопительное значение +/-60 для фиксации перемещения.
4. После окончания работы программы необходимо деактивировать устройство и освободить интерфейсную линию, записав 0xE4 в порт 215, индикатор NumLock при этом погаснет.
Аппаратно инициализировать мышь можно, записав команду 0xE2 в порт 215.
Опрос мыши в КВУ идёт в режиме низкого приоритета по отношению к клавиатуре. Это значит, что если во время опроса состояния мыши придёт сигнал от клавиатуры, опрос прекращается, в порт 215 возвращается 0, как в случае нормального исполнения, но состояние мыши не изменяется, а бит арбитража в порту 216 будет установлен в 0, при нормальном же завершении опроса он будет равен 1. Информация о перемещении курсора мыши за последний интервал между опросами будет потеряна.
В версиях микропрограммы для ЦПУ, начиная с 4.62, предусмотрена работа мыши и без необходимости программирования. Нажатие комбинации клавиш Ctrl-Alt-NumLock активирует режим "автомышь", при котором перемещения передаются как нажатие клавиш стрелок, а нажатия кнопок - настроенными кодами, по умолчанию левая кнопка возвращает код 32 (пробел), правая - ESC, но эти настройки могут быть изменены. Активный режим "автомышь" индициируется индикатором NumLock. Отключить режим можно повторным нажатием указанной комбинации клавиш. Этот режим очень полезен, поскольку позволяет эффективно использовать мышь во многих программах, изначально на неё не рассчитанных, в том числе в текстовых редакторах. Настройка параметров работы режима "автомышь" осуществляется через блок общих переменных по стандартной процедуре, адрес начала описателя - 89. Его структура приведена в таблице 1.
Таблица 1
IDX | Мнемоника | Формат | Описание |
+0 | MS MODE | BYTE | Состояние режима |
1 | MS_STEP_X | BYTE | Чувствительность по оси X |
2 | MS_STEP_Y | BYTE | Чувствительность по оси Y |
3 | MS_MOVE_UP | BYTE | Код символа, возвращаемого при шаге вверх |
4 | MS_MOVE_DOWN | BYTE | Код символа, возвращаемого при шаге вниз |
5 | MSMOVERIGHT | BYTE | Код символа, возвращаемого при шаге вправо |
6 | MS_MOVE_LEFT | BYTE | Код символа, возвращаемого при шаге влево |
1 | MS_BTN_LEFT_P | BYTE | Код символа, возвращаемого при нажатии на левую кнопку |
8 | MS_BTN_LEFT_U | BYTE | Код символа, возвращаемого при отпускании левой кнопки |
9 | MS_BTN_MID_P | BYTE | Код символа, возвращаемого при нажатии на среднюю кнопку |
10 | MS_BTN_MID_U | BYTE | Код символа, возвращаемого при отпускании средней кнопки |
11 | MS_BTN_RIGHT_P | BYTE | Код символа, возвращаемого при нажатии на правую кнопку |
12 | MSBTNRIGHTU | BYTE | Код символа, возвращаемого при отпускании правой кнопки |
Добавление функций работы с мышью привели к изменению логики работы порта SYSRQ (219) - он из командного стал смешанным, содержащем команды и флаги состояния. Его структура приведена в табл. 2.
Таблица 2
SRQ | MSS | LCR | - | CMD3 | CMD2 | CMD1 | CMD0 |
SRQ - флаг запроса исполнения системной команды, MSS - флаг акти вного состояния манипулятора мышь (1), LCR - внутренний флаг запроса изменения состояния индикатора NumLock, CMD3-CMD0 - код системной команды: 0x01 - чтение регистра, 0x02, 0x03 - запись восьмибитного или шестнадцатибитного регистра, 0x0E - запрос версии прошивки, 0x0F - аппаратный сброс (RESET). Бит 4зарезервирован и читается как 0.
Теперь при выдаче команды на изменение внутреннего регистра AVR порядок действий следующий: считать состояние порта SYSRQ, проверить, что бит 7 равен 0, что означает окончание предыдущей команды, далее выполнить команду OR 0x80+cmd, где cmd - команда, и дождаться, пока чтение из порта не вернёт 0 в бите 7.
Прочие устройства
В настоящее время тестируются и другие интерфейсы, которые войдут в релиз 0.22 микропрограммы КВУ:
- линии SDA и SCL одновременно являются портами ввода/вывода PC4/PC5, использование как стандартных дискретных входов/выходов;
- линии SDA и SCL одновременно являются каналами ADC4/ADC5 АЦП, в компьютере предусмотрен сглаживающий конденсатор на линии VREF, поэтому можно использовать эти линии как аналоговые, подключив внешний резистор сопротивлением 2,2 кОм к обще-му проводу для установки половины напряжения питания и использовать эти каналы для обработки, например, простейшего аналогового джойстика;
- индикаторно-клавиатурные панели на основе микросхемы TM1637, которые в изобилии продаются как в Интернете, так и могут быть сделаны самостоятельно;
- другие типы I2С-устройств, в том числе за счёт использования нотного буфера генератора мелодий.
Возможно, появятся и другие стандартные интерфейсы, с которыми легко можно будет работать с минимальным объёмом программного кода, что важно для этой архитектуры.
Кабели для подключения внешних устройств
На текущий момент стандартными являются следующие кабели:
-версия с установленным разъёмом MD6F - стандартные разветвители PS/2 клавиатура/мышь, имеющиеся в продаже, позволяют подключать клавиатуру и мышь;
-версия с установленным разъёмом MD8F - тут стандартных нет, необходимо сделать кабель по следующей схеме (рис. 9).
Рис. 9. Схема кабеля
GPIO/LPT-адаптер делают как отдельный кабель-переходник MD6M-DB25, его внешний вид приведён на рис. 10 и рис. 11.
Рис. 10. Внешний вид GPIO/LPT-адаптер
Рис. 11. Внешний вид GPIO/LPT-адаптер
Для подключения пользовательских устройств стандартный соединитель - разъём MD6M, схема его соединений аналогична кабелю GPIO/LPT
Автор: И. Решетников, г. Видное Московской обл.