Аппаратные интерфейсы ПК — страница 29 из 52

Специализированные интерфейсы периферийных устройств

В этой главе описываются интерфейсы периферийных устройств, от самых необходимых (клавиатура, дисплей, мышь, принтер) до мультимедийных (видео- и аудиоустройства) и развлекательных (джойстик и его «родственники»).

8.1. Интерфейс клавиатуры

Традиционная клавиатура PC представляет собой унифицированное устройство ввода со стандартным разъемом и последовательным интерфейсом связи с системной платой. В настоящее время используются так называемые расширенные (enhanced) клавиатуры AT или PS/2, имеющие более 100 клавиш. Они вытеснили первые 84-клавишные клавиатуры AT и тем более клавиатуры XT. По электрическому интерфейсу клавиатуры XT и AT совпадают, за исключением того, что двунаправленный интерфейс позволяет клавиатуре AT принимать команды от системной платы. Однако по логическому интерфейсу они несовместимы (клавиатура AT иногда имеет переключатель режима XT/AT). Клавиатура PS/2 отличается от AT только исполнением разъема, при необходимости можно использовать переходник.

Клавиатуры имеют внутренний микроконтроллер, способный определить факты нажатия и отпускания клавиш, при этом можно нажимать очередную клавишу, даже удерживая несколько ранее нажатых. При нажатии клавиши клавиатура передает идентифицирующий ее скан-код. При удержании клавиши в нажатом положении через некоторое время клавиатура начинает автоповтор передачи скан-кода нажатия этой клавиши. Задержка автоповтора (typematic delay) и скорость автоповтора (typematic rate) для клавиатур AT программируются. Расширенная клавиатура позволяет выбирать 1 из 3 наборов скан-кодов.

С распространением шины USB появились клавиатуры и с этим интерфейсом; они имеют и встроенный хаб, например для подключения мыши USB. Клавиатура USB питается от шины. Для клавиатуры USB требуется специальная поддержка со стороны BIOS; она имеется в современных системных платах.

8.1.1. Интерфейс клавиатуры AT и PS/2

Для подключения клавиатуры предназначен последовательный синхронный двунаправленный интерфейс, состоящий из двух обязательных сигналов

KB-Data
и
KB-Clock
. Обе линии на системной плате подтягиваются резисторами к шине +5 В. На обеих сторонах интерфейса выходные сигналы низкого уровня формируются выходами элементов с открытым коллектором (стоком), а состояние линий может быть прочитано через входные линии контроллеров. Вид разъемов (со стороны задней панели) и назначение контактов приведены на рис. 8.1. Конструктивно возможны два варианта разъема — обычная 5-контактная розетка DIN (клавиатура AT) или малогабаритная розетка mini-DIN (PS/2). На этот же разъем через плавкий предохранитель поступает напряжение питания клавиатуры +5 В.

Рис. 8.1. Разъемы (вид со стороны контактов) подключения клавиатур: а — AT и б — PS/2

ВНИМАНИЕ

Питание от разъема клавиатуры часто используется такими устройствами, как внешние накопители или адаптеры локальных сетей, подключаемыми к параллельному порту. Плавкий предохранитель, установленный на системной плате, может не выдержать броска тока, потребляемого этими устройствами. При этом откажется работать и клавиатура — ее индикаторы даже и не мигнут при включении.

Процессор общается с клавиатурой через контроллер интерфейса клавиатуры — микроконтроллер 8042 или программно-совместимый с ним, установленный на системной плате. Для обмена информацией в основном используется порт 60h, из которого принимаются скан-коды. О необходимости чтения скан-кода контроллер сигнализирует процессору через аппаратное прерывание IRQ1, сигнал которого вырабатывается по каждому событию клавиатуры (нажатию и отпусканию клавиши). Задание параметров автоповтора, выбор таблиц скан-кодов, управление светодиодными индикаторами, а также управление режимом сканирования матрицы клавиш и запуск диагностического теста осуществляется командами, посылаемыми в этот же порт. Контроллер транслирует команды в посылки, направляемые к клавиатуре.

Работу двунаправленного интерфейса иллюстрирует рис. 8.2, а, где серым цветом помечены сигналы, формируемые контроллером, а черным — клавиатурой. В исходном состоянии обе линии «отпущены» выходными формирователями в состояние с высоким уровнем. Клавиатура может начать передачу данных в произвольный момент, когда интерфейс находится в покое. Клавиатура формирует стартовый бит (низкий уровень) на линии

KB-Data
и первый импульс
KB-Clock
, что является сигналом контроллеру о необходимости начала приема. После подъема
KB-Clock
она выводит 0-й бит данных на линию
KB-Data
, а затем и следующий импульс
KB-Clock
. Контроллер должен «защелкивать» принятый бит данных по спаду
KB-Clock
. Так передаются все 8 бит данных и бит паритета, дополняющий число единичных бит до нечетного. После синхроимпульса бита паритета контроллер клавиатуры должен сформировать импульс
KB-Clock
, подтверждающий прием байта (Ack). Если весь байт с битом паритета не будет получен контроллером за 2 мс, контроллер прекращает прием данного байта и фиксирует ошибку тайм-аута.

Рис. 8.2. Временные диаграммы интерфейса клавиатуры: а — прием посылки от клавиатуры, б — передача команды в клавиатуру

Обратная передача — вывод команды контроллера в клавиатуру — происходит несколько сложнее (рис. 8.2, б). Из состояния покоя контроллер устанавливает низкий уровень

KB-Clock
на 250 мкс и формирует старт-бит (низкий уровень) — это сигнал клавиатуре на прием команды. На него клавиатура должна ответить серией из 11 импульсов
KB-Clock
. По спаду очередного синхроимпульса контроллер выставляет очередной бит данных, а клавиатура его «защелкивает» по фронту формируемого ею же синхроимпульса. После бита паритета (9-й импульс) и единичного стоп-бита (10-й) на 11-м импульсе клавиатура формирует нулевой бит подтверждения (Ack). После этого контроллер формирует импульс
KB-Clock
(60 мкс), который является запросом на прием ответа клавиатуры. Контроллер ожидает окончания ответа на этот запрос не долее 20 мс и, если ответ не придет за это время, сформирует ошибку тайм-аута. Ошибка будет также в случае, если клавиатура не введет первый синхроимпульс за 15 мс от начала запроса или контроллер не примет данные, включая стоп-бит, за 2 мс с момента появления синхроимпульса бита 0.

На системной плате PC/XT контроллера 8042 не было, а интерфейс клавиатуры (однонаправленный) был реализован аппаратной логикой — регистром сдвига, параллельный выход которого подключается к входам порта А системного интерфейса 18255. По приему байта от клавиатуры вырабатывается аппаратное прерывание

IRQ1
, обработчик которого может прочитать принятый байт из порта 60h. С помощью бит 7 и 6 порта 61h возможны программная блокировка и сброс клавиатуры соответственно. Сброс клавиатуры XT осуществляется обнулением линии
KB-Clock
.

8.1.2. Контроллер интерфейса клавиатуры и мыши 8042/8242

Программируемый микроконтроллер клавиатуры i8042, KBC (keyboard controller), является посредником между клавиатурой, подключенной к нему по вышеописанному последовательному интерфейсу, и центральным процессором, с которым он связан через параллельный интерфейс. В микроконтроллере постоянно исполняется внутренняя микропрограмма, реагирующая на сигналы интерфейса клавиатуры и команды, поступающие от процессора. Эта микропрограмма (KBC BIOS) хранится во внутреннем масочном ПЗУ контроллера; внешне она недоступна, и контроллер можно рассматривать как устройство с заданными свойствами. Поскольку логика работы контроллера реализована программой, его реакция на команды процессора и сигналы интерфейса относительно медленная — время отклика измеряется десятками микросекунд. Помимо управления клавиатурой через программно-управляемые и программно-читаемые линии внешних портов контроллера формируются сигналы управления вентилем Gate A20, аппаратного системного сброса, а также считываются сигналы от конфигурационных джамперов системной платы. Контроллер 18242, кроме интерфейса клавиатуры, поддерживает аналогичный интерфейс дополнительного устройства — PS/2-Mouse. При инициализации (по аппаратному сбросу) контроллер установится в режим PS/2 или AT, в зависимости от состояния определенного вывода микросхемы. В режиме AT контроллер не выполняет функции интерфейса мыши и игнорирует все команды, относящиеся к мыши. Режим выбирается соответствующей настройкой BIOS Setup.

Связь контроллера с центральным процессором обеспечивается через 8-битную шину данных. Контроллер выбирается сигналом

CS#
от дешифратора адреса, срабатывающего по адресам 0060h и 0064h; внутренние регистры контроллера выбираются линией
SA2
системной шины адреса. Чтение и запись выполняется по сигналам
IORD#
и
IOWR#
, генерируемых при выполнении процессором инструкций
IN
и
OUT
. Таким образом, контроллер располагается в пространстве ввода-вывода CPU по адресам 60h (регистр данных) и 64h (регистр состояния и команд), назначение регистров приведено в табл. 8.1. Из регистра данных считываются данные, принимаемые по интерфейсам от клавиатуры и мыши, а также данные, возвращаемые контроллером в ответ на адресованные ему команды. Запись в регистр данных используется для подачи команд и данных, адресованных к клавиатуре и мыши, а также данных для команд, адресованных контроллеру. В регистр команд записываются команды, адресованные контроллеру. Режим работы контроллера (разрешение работы интерфейсов клавиатуры и мыши и прерываний от них, трансляция скан-кодов и другие параметры) задается командным байтом, посылаемым в контроллер по специальной команде. Перед любой записью в контроллер необходимо убедиться в его готовности. Признаком готовности/занятости контроллера является значение бита 1 регистра состояния (порт 064h).


Таблица 8.1. Назначение регистров контроллера клавиатуры

Порт, R/WНазначение
060 RWПорт данных 8042
064 RРегистр состояния 8042 (R/O): бит 7 — ошибка четности при последнем обмене с клавиатурой; бит 6 — тайм-аут приемника/общий тайм-аут¹; бит 5 — тайм-аут передатчика/выходной буфер интерфейса мыши полон (Mouse_OBF)¹; бит 4: 0 — клавиатура на замке; бит 3:1 — последняя запись была командой, 0 — данными; бит 2: системный флаг, устанавливается в 0 по включении питания, в 1 — программно (что означает состояние завершения системного сброса Reset OK); бит 1: 1 — входной буфер интерфейса клавиатуры полон, 0 — готовность к приему команды/данных; бит 0: 1— выходной буфер интерфейса клавиатуры полон (OBF)
064 WРегистр команд 8042

¹Второе назначение бита относится к контроллеру i8242B, имеющему дополнительный интерфейс для подключения PS/2-Mouse.


Контроллер имеет два внешних порта, с помощью которых и реализуются последовательные интерфейсы, а также управление вентилем GateA20, сигналом сброса процессора и чтением сигналов от джамперов системной платы и ключа блокировки клавиатуры. Эти порты не имеют непосредственного отображения в пространстве адресов ввода-вывода PC; доступ к ним осуществляется через команды контроллера. Кроме этих портов контроллер имеет два специальных входа

T0
и
T1
, которые могут считываться его микропрограммой и использоваться в качестве источников его внутренних прерываний (это не прерывания CPU). Каждая из двунаправленных интерфейсных линий
KB-Data
,
KB-Clock
,
MS-Data
и
MS-Clock
реализуется битом порта вывода и битом ввода. В режиме PS/2 для чтения линий
KB-Clock
и
MS-Clock
используются входы
T0
и
T1
, в режиме AT вход
T1
используется для линии
KB-Data
.

Порт ввода

P1
доступен по команде
C0h
; в режиме PS/2 имеет следующее назначение бит:

♦ бит 7 — ключ блокировки клавиатуры (Keylock): 0 — клавиатура заблокирована;

♦ бит 6 — перемычка установки видеорежима: 0 — цветной (Color), 1 — монохромный (Mono);

♦ бит 5 — системная перемычка: 0 —замкнута;

♦ бит 4 — перемычка задания объема ОЗУ: 0 — 256 Кбайт, 1 — 512 Кбайт и более;

♦ биты 3, 2 — не используются;

♦ бит 1 — линия

MS-Data
;

♦ бит 0 — линия

KB-Data
.

В современных ПК используются только биты 0, 1 и 7; в режиме AT биты 0 и 1 не используются.

Порт вывода (P2), доступный для записи и чтения по командам D1h и D0h соответственно, имеет следующее назначение бит:

♦ бит 7 — линия

KB-Data
;

♦ бит 6 — линия

KB-Clk
;

♦ бит 5 — запрос прерывания от дополнительного интерфейса (

IRQ12
), в режиме AT не используется;

♦ бит 4 — запрос прерывания от клавиатуры (

IRQ1
);

♦ бит 3 — линия

MS-Clk
, в режиме AT не используется;

♦ бит 2 — линия

MS-Data
, в режиме AT не используется;

♦ бит 1 — вентиль линии адреса A20 (Gate A20, см. п. 12.3): 0 — A20 обнулен, 1 — управляется выводом процессора;

♦ бит 0 — альтернативный сброс процессора (сигнала

INIT
, без формирования общего сигнала сброса).

Приняв посылку от клавиатуры, контроллер выполняет внутреннюю трансляцию скан-кода (если это не запрещено командным байтом) и устанавливает в регистре состояния

OBF
=1, что приводит к генерации запроса прерывания
IRQ1
(если это не запрещено командным байтом). В ответ на это хост должен считать данные (транслированный скан-код, префиксы и т.п.) из порта данных (60h). Трансляция обеспечивает программную совместимость клавиатур XT и AT (см. ниже) по чтению скан-кодов из порта 60h. При получении посылки от мыши контроллер не выполняет никаких преобразований и устанавливает в регистре состояния
Mouse_OВF
=1, что приводит к генерации запроса прерывания
IRQ12
(если это не запрещено командным байтом). По этому сигналу данные от мыши должны быть считаны хостом из того же порта 60h. To же самое происходит и при программной записи байта в выходной буфер клавиатуры (код D2h) или мыши (код D3h), с установкой соответствующих битов состояния и генерацией запросов
IRQ1
или
IRQ12
.

После получения команды, по которой контроллер должен возвращать данные, он устанавливает в регистре состояния

OBF
=1, что приводит к генерации запроса прерывания
IRQ1
(если это не запрещено командным байтом). После этого данные должны быть считаны из порта данных (по адресу 60h). Если команда возвращает несколько байтов данных, прерывание генерируется для каждого байта.

Взаимодействие с контроллером осуществляется подачей команд — записью в регистр команд (по адресу 064h). Перед посылкой команды необходимо убедиться в готовности контроллера к ее приему — бит 1 порта 64h должен иметь нулевое значение. Подробно команды контроллера описаны в литературе [2, 8]. Контроллеры клавиатуры различаются версиями встроенного ПО, поэтому замена контроллера другим, с отличающейся версией ПО (KBC BIOS), может оказаться проблематичной — микросхема BIOS системной платы должна знать особенности контроллера клавиатуры.

8.1.3. Системная поддержка и программный интерфейс

Клавиатура имеет системную поддержку на уровне BIOS — обработку фактов нажатия и отпускания клавиш и обеспечение сервисов ввода символов с клавиатуры, а также управления ее параметрами (задержка и частота автоповтора) и индикаторами. Коды, принятые от клавиатуры ее контроллером, считываются и обрабатываются обработчиком аппаратного прерывания

IRQ1
(вектор 09h). Результат обработки помещается в клавиатурный буфер, из которого по программному прерыванию
Int 16h
этот результат для дальнейшей обработки может быть извлечен значительно позже. Нажатие «системной» комбинации
Ctrl+Alt+Del
, клавиши
PrintScreen
(
SysRq
) и некоторых других к записи в клавиатурный буфер не приводит, а вызывает специальные процедуры. Прикладной программе, для которой требуется нестандартное использование клавиатуры (например, в качестве музыкальной), придется самой заниматься обработкой аппаратного прерывания
IRQ1
, перехватывая вектор
Int 09h
. Перехват этого вектора требуется и для вызова каких-либо функций резидентных программ по «горячим» клавишам.

При начальном тестировании процедура POST инициализирует клавиатуру (и ее контроллер) и запускает диагностический тест. Во время этого теста клавиатура мигнет всеми индикаторами, после чего может остаться включенным только индикатор

NumLock
(зависит от установки в BIOS Setup). В случае обнаружения ошибки клавиатуры на консоль выводится сообщение с возможным указанием скан-кода залипшей клавиши и обычно предлагается нажать клавишу
F1
для продолжения. То же самое произойдет, если тест не обнаружит клавиатуру (например, из-за вывалившегося разъема или перегоревшего предохранителя), но в этом случае нажатия клавиши
F1
будет уже недостаточно. Ошибку диагностики даст и подключение к компьютеру AT клавиатуры от XT, обратное «скрещивание» тоже неработоспособно. Чтобы начальная загрузка не останавливалась по ошибке (отсутствию) клавиатуры (POST будет дожидаться получения кода клавиши
F1
), тестирование клавиатуры может быть отменено настройкой CMOS Setup.

Для обслуживания клавиатуры используются ячейки ОЗУ из области данных BIOS (BIOS Data Area):

♦ 0:0417, 0:418 — флаги клавиатуры;

♦ 0:0419 — аккумулятор кода Alt-набора;

♦ 0:041A — указатель головы буфера (Buffer Head), 2 байта (модифицируется при помещении символа в буфер);

♦ 0:041C — указатель хвоста буфера (Buffer Tail), 2 байта (модифицируется при извлечении символа из буфера);

♦ 0:041E-0:042D — область кольцевого буфера (16 слов).

8.2. Интерфейсы мыши