Avdeev
.pdf205
При включении питания или поступлении команды контроллера
FFh (сброс) клавиатура выполняет базовый тест, связанный с проверкой переключателей клавиш, внутренних ОЗУ и ПЗУ. Если базовый тест завершен успешно, то в контроллер передается код Aah (код ответа) и осуществляется сканирование переключателей клавиш. И наоборот, в случае ошибки в контроллер выводится код FCh.
Контроллер представляет собой однокристальный микрокомпьютер, взаимодействующий с процессором с помощью портов и аппаратного прерывания IRQ1. Доступ к портам выполняется по адресным сигналам А0 (младший бит адреса), CS (выбор кристалла) и сигналам управления RD (чтения порта), WR (запись в порт), а также с помощью команд. Передача данных между контроллером и процессором осуществляется по внутренней шине данных XD0-XD7, подключенной к системной шине данных SD0-SD7 через приемопередатчик (на см. рис. 8.5 это соединение не показано). Контроллер выполняет преобразование полученных от клавиатуры кодов нажатия (отжатия) клавиш в системные (стандартные для обработчика прерываний) скэн-коды, причем 2-байтовый код отпускания клавиши заменяется байтовым, у которого бит D7=1. Процессор устанавливает наличие в контроллере кодов нажатия (отпускания) через прерывание IRQ1, по которому определяется адрес вектора прерывания (36 или 24h, т. е. номер прерывания 9 умножается на 4), указывающий на фиксированнуюячейку оперативнойпамяти(0000:0024),хранящую4-байтовыйвек- тор прерывания (стартовый адрес обработчика прерывания). Кроме того, процессор с помощью обработчика прерывания выполняет анализ системного скэн-кода нажатия и преобразование его в 2-байтовый код, помещаемый в буфер клавиатуры (FIFO) оперативной памяти (RAM).
БуферклавиатурыRAMреализуетрежимкольцевойочередииможетхранить 15 двухбайтовых кодов нажатия, причем для обычных клавиш (алфавитно-цифро- вых),которымсоответствуюткодыASCII,вбуфереклавиатурыотводитсядвабайта, первый из которых является кодом ASCII, а второй - скэн-кодом (порядковым номером этой клавиши). Второй байт необходим для различения одинаковых клавиш.
206
При нажатии специальных клавиш, например, F1-F12, INS, DEL и т. д., которым присвоен двухбайтный расширенный код, в буфер клавиатуры RAM помещается также 2 байта, первый из которых равен 00, а второй содержит порядковый номер этой клавиши (скэн-код). Буфер клавиатуры представлен на рис. 8.6.
|
|
|
|
|
|
'A' |
|
|
'B' |
'C' |
. . . |
|
'H' |
'I' |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0040:001E |
20 |
22 |
24 |
26 |
28 |
|
2A |
2C |
36 |
38 |
3A |
0040:003C |
||||||||||
|
|
|
|
|
|
|
|
удаление |
|
|
|
|
запись |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
+2 |
|
|
|
|
|
|
+2 |
|
|
||||
|
|
|
|
|
|
28 |
|
|
|
|
38 |
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0040:001A |
|
|
|
|
0040:001С |
|
|
|
|||||||||
|
|
|
|
указатель головы |
указатель хвоста |
Рис. 8.6. Циклический буфер клавиатуры RAM
Начальный адрес буфера клавиатуры - 0040:001Е, а конечный адрес - 0040:003С. Буферу клавиатуры RAM соответствуют все 2-байтовые ячейки памяти с адресами 0040:001А и 0040:001С, первая из которых является указателем головы заносимых данных (определяет первые введенные 2 байта данных), а вторая - указателем хвоста (см. рис. 8.6). В этих ячейках обычно используется только младший байт. По мере занесения данных в сторону увеличения адреса буфера клавиатуры RAMменяетсясоответственноизначениеуказателяхвоста.Послезаполненияконца буфера клавиатуры данные заносятся в его начальные ячейки памяти, если они были удалены при чтении данных из буфера клавиатуры, приводящим к изменению значения (позиции) указателя головы. В результате подобных действий значения указателя хвоста оказываются меньше значения указателя головы. Кроме того, в буфере клавиатуры используется дополнительная 2-байтовая ячейка (пустая позиция), которая содержит код возврата каретки (13) и код ввода (28) и предшествует ячейке буфера, соответствующей указателю головы.
Если значения указателей головы и хвоста равны, то буфер клавиатуры пуст. Поэтому для очистки буфера клавиатуры следует установить равные значения в указателях головы и хвоста. В том случае, если буфер клавиатуры уже заполнен, а поступают другие данные, вырабатывается звуковой сигнал переполнения. Наличие
207
данных в буфере клавиатуры с целью их ввода можно определить по неравенству значений в указателях головы и хвоста.
Состояния нажатия и отпускания переключательных клавиш Caps Lock, Num Lock,ScrollLock,Ins,Shiftит.д.отражаютсявфиксированных ячейкахRAM(байтах состояния), имеющих адреса 0040:0017 и 0040:0018. Кроме того, информация о состоянии расширенной клавиатуры отмечается в ячейках с адресами 0040:0096 и 0040:0097. В этих ячейках задается состояние правых клавиш Ctrl, Alt и состояние индикаторов. При прерывании клавиатуры, если была нажата переключательная клавиша, устанавливается соответствующий бит одного из байтов состояния. Обработчик прерывания INT9h проверяет каждый раз состояние переключательных клавиш,чтобыправильноинтерпретироватьвводимыйкодклавиши,например,«С»или
«с».
При нажатии (отпускании) клавиши аппаратное прерывание IRQ1 вызывает обработчик прерывания INT09h, который выполняет следующие основные функции:
-сохранение содержимого регистров процессора;
-считывание и анализ номера клавиши из контроллера;
-преобразование этого номера с использованием таблиц в код ASCII и системный скэн-код;
-оповещение контроллера о завершении чтения номера клавиши;
-сбрасывание запроса в контроллере прерывания;
-передачу двухбайтного кода в буфер клавиатуры RAM;
-управление динамиком и буфером клавиатуры RAM и восстановление регистров процессора.
Кроме того, для некоторых комбинаций клавиш: Ctrl_Alt_Del (перезагрузка операционной системы), Ctrl_Break (формирование прерывания INT1Bh с установкой бита D7 в байте 0040:0071h), Alt_SysRq (вызов подфункции 85h прерывания INT15h) и т. д., выполняющих специальные функции, обработчик прерывания INT09h не использует скэн-коды в буфере клавиатуры RAM. Для других переключательных клавиш: Caps Lock, Num Lock и т. д. при их нажатии (отпускании) обработчик прерывания INT09h изменяет содержимое байтов состояния, размещенных в фиксированных ячейках RAM.
208
Обработчик (драйвер) программного прерывания INT16h употреб-
ляет функции:
-чтение кода нажатой клавиши (00h);
-проверка состояния буфера клавиатуры (01h);
-чтение байта состояния клавиатуры (02h);
-установка скорости повторения кода клавиши (03h);
-считывание кода нажатой клавиши (10h);
-проверка состояния буфера клавиатуры (11h);
-чтение байтов состояния клавиатуры (12h).
Функции 00h-02h предназначены для старой клавиатуры.
Функция 00h по значению указателя головы удаляет 2-байтный код из буфера клавиатуры, причем первый байт (код ASCII) помещается в регистр AL, а второй байт (скэн-код) - в регистр AH процессора. Если буфер клавиатуры пуст, то функция 00h ожидает нажатия клавиши (появления 2-байтного кода) и только потом передает управление программе.
Функция 01h позволяет исключить время ожидания нажатия клавиши путем проверки нажатия 2-байтных кодов в буфере клавиатуры. Эта функция сообщает только о готовности ввода с клавиатуры (устанавливает признак ZF=1, если буфер клавиатуры пуст).
Функция 02h предназначена для чтения байта состояния клавиатуры, который помещается в регистр AL.
Формат байта состояния (0040:0017) изображен на рис. 8.7.
биты |
|
|
D7 |
1 |
- включен режим Insert |
D6 |
1 |
- включен режим Caps Lock |
D5 |
1 |
- включен режим Num Lock |
D4 |
1 |
- включен режим Scroll Lock |
D3 |
1 |
- нажата клавиша Alt |
D2 |
1 |
- нажата клавиша Ctrl |
D1 |
1 |
- нажата левая клавиша Shift |
D0 |
1 |
- нажата правая клавиша Shift |
Рис. 8.7. Формат байта состояния
209
Функция 03h управляет задержкой и частотой (скоростью) повто-
рения кода клавиши. Значение частоты повторения (число из диапазона 0-31) задается в регистре BL, а в регистре BH - задержка повторения (0-250 мс, 1-500 мс, ..., 3- 1000 мс).
В новой клавиатуре, имеющей 101 (102) клавишу, используется функция 00h, 01hи02hстаройклавиатуры.Этарасширеннаяклавиатура,какужеотмечалось,применяется в ПК РС/АТ и PS/2.
Функция 10h используется вместо функции 00h, если расширенная клавиатура работает в режиме 2, что позволяет получить коды для дополнительных клавиш. Общее назначение, входные и выходные параметры функций 00h и 10h совпадают. Аналогичным образом используется функция 11h вместо 01h. Функция 12h заменяет функцию 02h, если расширенная клавиатура работает в режиме 2. При выполнении функции 12h байты состояния размещаются в регистрах AL и АН, причем в регистре AL хранится первый байт состояния (см. рис. 8.7), а в регистре АН - второй байт состояния (0040:0018), формат которого показан на рис. 8.8.
биты |
|
|
D7 |
1 |
- включен режим Insert |
D6 |
1 |
- включен режим Caps Lock |
D5 |
1 |
- включен режим Num Lock |
D4 |
1 |
- включен режим Scroll Lock |
D3 |
1 |
- включен режим «пауза» |
D2 |
1 |
- нажата клавиша Sys Req |
D1 |
1 |
- нажата правая клавиша Alt |
D0 |
1 |
- нажата правая клавиша Ctrl |
Рис. 8.8. Формат второго байта состояния Рассмотрим структурную схему контроллера, показанную на рис. 8.9.
210
XD0 - XD7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IRQ 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
Входной буфер |
|
|
|
|
|
|
|
|
||||||||||
7 |
|
0 |
64h |
7 |
|
|
|
|
0 |
60h |
7 |
|
|
0 |
64h |
|
7 |
|
|
|
0 |
60h |
|||||||
|
|
|
|||||||||||||||||||||||||||
Регистр |
|
|
|
|
Регистр |
Регистр |
|
|
|
|
Выходной |
|
|||||||||||||||||
состояния |
|
|
|
данных |
|
|
команды |
|
|
|
|
|
|
буфер |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
E0h (R) |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
Микро- |
|
|
ОЗУ |
|
|
|
|
ПЗУ |
|
|
Порт |
|
|
Управляющий |
|||||||||||||||
процессор |
|
|
128 x 8 |
|
|
|
|
2K x 8 |
|
|
|
Т0, Т1 |
|
|
|
байт |
|
|
|
20h (R), 60h (W) |
Входной порт |
Выходной порт |
C0h(R) |
D0h(R), D1h(W) |
CLK |
DATA |
Примечание: |
|
|
C0h(R), D0h(R), D1h(W) |
|
- команды |
||
|
||||
|
|
E0h(R), 20h(R), 60h(W) |
|
- команды |
|
|
|
||
|
|
(W) |
|
- запись |
|
|
(R) |
|
- чтение |
|
|
60h, 64h |
|
- адреса |
Рис. 8.9. Структурная схема контроллера
Входной буфер подключается к шине XD0 -XD7 и содержит два 8 - битовых регистра данных и команд, доступных по записи и имеющих соответственно адреса 60h и 64h. Информация записывается во входной буфер, если сброшен бит D1 регистра состояния (64h), содержащего флаг входного буфера (IBF), который устанавливается в единицу при записи информации во входной буфер. Данные из входного буфера (регистра данных) передаются в клавиатуру и выполняется автоматический сброс IBF.
Выходной буфер включает 8-битовый регистр, адрес которого 60h. Содержимое этого регистра считывается, если бит DO регистра состояния (64h) равен единице (установлен флаг выходного буфера OBF), что указывает на наличие данных в выходном буфере (выходной буфер полон). При чтении выходного буфера бит DO (OBF) регистра состояния (64h) автоматически сбрасывается.
211
Читаемый регистр состояния (64h) предназначен для хранения информации о состоянии контроллера и интерфейса. Формат регистра состояния (64h) представлен на рис. 8.10.
биты
D7 1 - ошибка нечетного паритета
D6 1 - прием байта из клавиатуры не завершен
D5 1 - передача байта в клавиатуру не завершена
D4 0 - клавиатура заблокирована (защитный замок закрыт) D3 0 - в выходном буфере данные
1- в выходном буфере команда D2 0 - сброс по включению питания
1- программный сброс
D1 0 - входной буфер пуст (IBF)
D0 1 - выходной буфер полон (OBF)
Рис. 8.10. Формат регистра состояния
Доступ к другим портам контроллера выполняется с помощью специальных команд, так как из-за ограниченного числа контактов микросхемы I8042 они не имеют адресов. Команды C0h(R), D0h(R), D1h(W), и Е0h(R) (см. рис. 8.9) использу-
ются соответственно для чтения входного и выходного портов, записи в выходной порт и чтение порта Т0, Т1 (чтение состояния линий CLK и DATA интерфейса клавиатуры). Эти команды должны быть переданы в регистр команд входного буфера по адресу 64h.
Входной порт контроллера предназначен для чтения информации о конфигурации системы, используемой программами BIOC. Формат входного порта показан на рис. 8.11.
биты |
|
|
D7 |
0 |
- клавиатура заблокирована ключом |
D6 |
0 |
- цветной адаптер |
|
1 |
- монохромный адаптер |
D5 |
0 |
- переключатель установлен |
|
|
- переключатель не установлен |
D4 |
0 |
- не используются вторые 256К RAM |
|
|
- используются вторые 256К RAM |
D3, D2,D1, D0 |
- резерв |
Рис. 8.11. Формат входного порта
212
Выходной порт доступен по записи (W) и чтению (R) и хранит значения выходных линий. Формат выходного порта представлен на рис. 8.12.
биты |
|
|
D7 |
|
- значение линии DATA при передаче данных в клавиатуру |
D6 |
|
- значение линии CLK при передаче данных в клавиатуру |
D5 |
1 |
- входной буфер пуст |
D4 |
1 |
- выходной буфер полон |
D3, D2 |
|
- резерв |
D1 |
|
- состояние адресной линии А20 |
D0 |
0 |
- системный сброс |
Рис. 8.12. Формат выходного порта
Значения порта состояния линий Т0 и Т1 считываются командой E0h(R), причем бит Т0 соответствует входному значению линии CLK, а бит Т1 - входному значению линии DATA.
Кроме того, контроллер содержит управляющий байт, доступный по чтению с помощью команды 20h(R) и по записи с использованием команды 60h(W).
Для считывания управляющего байта необходимо вначале записать команду 20h(R) в регистр команды (64h), а затем получить управляющий байт из выходного буфера (60h). Запись управляющего байта выполняется следующим образом. Предварительно в регистр команд (64h) входного буфера заносится команда 60h(W), а после этого содержимое управляющего байта - в регистр данных (60h) входного буфера. Формат управляющего байта изображен на рис. 8.13.
биты |
|
|
D7 |
0 |
- резерв |
D6 |
1 |
- режим совместимости клавиатуры с IBM PC |
|
(вызывает преобразование 2-байтовых кодов отпускания в 1-байтовые) |
|
D5 |
1 |
- используются коды клавиатуры IBM PC/XT |
|
0 |
- используются 2-битовые коды АТ |
D4 |
1 |
- отключение клавиатуры |
|
0 |
- разрешение |
D3 |
1 |
- запрещается защитный замок |
D2 |
|
- значение этого бита записывается в бит D2 регистра состояния |
D1 |
0 |
- резерв |
D0 |
1 |
- разрешение прерывания, если выходной буфер полон |
Рис. 8.13. Формат управляющего байта
213
Различают команды контроллера (некоторые из них были уже рассмотрены: C0h(R), D0h(R), D1h(W) и т.д.), команды управления клавиатурой и коды ответов клавиатуры.
Команда контроллера выводится процессором в регистр команд (64h) входного буфера и если у команды есть байт данных, то он загружается сразу после команды в регистр данных (60h) входного буфера.
Команды контроллера приведены в табл. 8.1.
|
Таблица 8.1 |
|
|
Код |
Назначение команды |
|
|
20h |
Чтение управляющего байта |
|
|
60h |
Запись управляющего байта |
|
|
AAh |
Выполнение внутреннего теста |
|
|
ABh |
Тест интерфейса |
|
|
ADh |
Отключение (блокировка) клавиатуры |
|
|
AEh |
Разрешение (деблокирование) клавиатуры |
|
|
C0h |
Чтение входного порта |
|
|
D0h |
Чтение выходного порта |
|
|
D1h |
Запись в выходной порт |
|
|
E0h |
Чтение порта Т0, Т1 |
|
|
F0h - |
Сброс выходного порта |
FFh |
|
|
|
Рассмотрим назначение команд контроллера. Команда ААh вызывает выполнение внутреннего теста контроллера. Если тест завершается успешно, то в выходной буфер (60h) помещается код 55h. Тест интерфейса (линий CLK и DATA) осуществляется командой AВh и в выходном буфере хранится результат тестирования (00 - ошибок нет, 01(03) - линия CLK(DATA) имеет нулевой уровень, 02(04) - на
214
линии CLK(DATA) установлен высокий уровень. По команде ADh производится отключение клавиатуры (данные не передаются и не принимаются), а по команде AЕh - разрешается работа клавиатуры (сбрасывается бит D4 управляющего байта). Команда C0h осуществляет чтение входного порта и занесение его содержимого в выходной буфер (60h).
Предварительно следует убедиться, что выходной буфер пуст, т.е. проверить бит D0(0BF) регистра состояния (64h). Чтение выходного порта исполняется командой D0h, которая помещает его содержимое в выходной буфер, если он пуст. Запись в выходной порт выполняется по команде D1h, за которой следует вывести байт по адресу 60h регистра данных, причем бит 0 выходного порта не должен быть равным нулю, иначе будет системный сброс. Для считывания значений порта Т0 и Т1 (значений входных линий CLK и DATA) в выходной буфер употребляется команда E0h. Команды F0h - FFh указывают своим кодом, какие четыре младших бита выходного порта следует сбросить, причем значение 0 определяет сброс бита.
Команды управления клавиатурой выводятся системным процессором как данные в регистр данных (60h) входного буфера контроллера, откуда передаются затем в клавиатуру. Клавиатура обязательно подтверждает прием команды управления, кроме команд EEh и FEh.
Команды управления клавиатурой представлены в табл. 8.2.
|
Таблица 8.2 |
|
|
Код |
Назначение команды |
|
|
EDh |
Установить индикаторы состояния |
|
|
EEh |
Эхо (диагностика) |
|
|
F0h |
Установка таблицы скэн–кодов |
|
|
FFh, |
Холостые (недействительные) команды |
F1h |
|
|
|
F2h |
Чтение идентификатора |
|
|
F3h |
Задание частоты повтора и задержки |
|
|
F4h |
Разрешение клавиатуры |
|
|