ФЭНДОМ


История

Клавиатура к первым ПК (IBM PC и IBM PC/XT, 1981 год) подключалась по однонаправленному (передача данных только в одну сторону — от клавиатуры к компьютеру) интерфейсу, программное взаимодействие с которым осуществлялось с помощью двух портов микросхемы параллельного интерфейса 8255: порт A (он был доступен по адресу 60h) использовался как регистр принятых от клавиатуры данных, а порт B (61h) содержал биты, управляющие как клавиатурой, так и другими устройствами. Нажатие и отпускание клавиш кодировалось способом, ныне известным как таблица скан-кодов № 1.

В компьютерах IBM PC/AT (первые из них появились в 1984 году) от применения микросхемы 8255 отказались. Для обеспечения взаимодействия с клавиатурой был применён микроконтроллер 8042. Изменился и сам физический интерфейс: он стал двунаправленным. Хотя клавиатура по-прежнему подключалась через 5-контактный DIN-коннектор, она была несовместимой с клавиатурами IBM PC и IBM PC/XT (хотя в переходный период выпускалось большое число клавиатур, пригодных для использования с обоими типами интерфейсов; выбор нужного интерфейса осуществлялся специальным переключателем). В клавиатурах IBM PC/AT была использована новая таблица скан-кодов, получившая № 2.

В 1987 году IBM начала выпуск семейства ПК IBM PS/2. В этих компьютерах использовалась та же самая микросхема 8042, однако её функции были расширены: она обеспечивала подключение не только клавиатуры, но и мыши, для которой был добавлен второй коннектор. Электрически интерфейс остался тем же самым, что на IBM PC/AT, однако коннекторы поменялись: вместо 5-контактных DINов стали использовать 6-контактные MiniDINы. С помощью переходника клавиатура IBM PC/AT могла быть подключена к PS/2, и наоборот. IBM разработала и новую таблицу скан-кодов — № 3, но клавиатуры, пригодные для использования с разными типами ПК, обеспечивали программное переключение используемой таблицы.

Хотя сами компьютеры PS/2 не смогли завоевать рынок, простой и достаточно эффективный интерфейс PS/2 стал стандартом де-факто, быстро вытеснив близкий к нему, но менее функциональный (из-за отсутствия поддержки мыши) контроллер IBM PC/AT. Он используется по сей день, хотя на новых системных платах он уже может отсутствовать: всё чаще клавиатура и мышь подключаются по интерфейсу USB (впрочем, BIOS обычно способен эмулировать функции контроллера интерфейса PS/2, связанные со взаимодействием с клавиатурой и мышью, даже если используются устройства, подключенные по шине USB). Что же касается набора скан-кодов, то все современные клавиатуры работают с таблицей № 2 (использовавшейся в IBM PC/AT), поддержка двух других таблиц не гарантирована, да и не имеет особого смысла.

Помимо подключения клавиатуры и мыши, контроллер интерфейса PS/2 обеспечивает выполнение ещё ряда функций; например, он управляет вентилем линии A20 или позволяет выполнить сброс процессора ПК. Достоверно неизвестно, когда именно эти функции были на него возложены, однако современные контроллеры их поддерживают.

Следует заметить, что контроллер интерфейса PS/2, описываемый в этой статье, часто ошибочно именуют контроллером клавиатуры. Это абсолютно неверно. Последний находится внутри самой клавиатуры, отслеживает нажатия и отпускания клавиш и посылает по интерфейсу PS/2 соответствующие скан-коды, а также принимает по этому интерфейсу команды и выполняет их (например, переключает светодиоды или меняет скорость автоповтора нажатия клавиш). Контроллер интерфейса PS/2 никакого отношения к клавиатуре или мыши как таковой не имеет и располагается на системной плате компьютера; к нему можно подключить абсолютно любое устройство, использующее интерфейс PS/2. Задача этого контроллера — принимать данные от устройства (клавиатуры, мыши, ещё чего-нибудь — неважно) и позволять процессору их считывать, а также принимать данные от процессора и передавать их устройству.

Некорректно называть контроллер PS/2 и контроллером 8042. Во-первых, 8042 — это микроконтроллер, который мог быть запрограммирован на решение самых разных задач, и его применение для управления интерфейсом PS/2 в составе персонального компьютера — лишь одно из многих возможных. Во-вторых, уже давным-давно функции контроллера PS/2 выполняет другая микросхема. Наконец, современные контроллеры зачастую выполняют массу других функций, например, связанных с поддержкой ACPI. По всем этим причинам корректно говорить лишь о контроллере PS/2, совместимом с точки зрения пользователя с контроллером, реализованным в IBM PC/AT на микросхеме 8042.

Интерфейс PS/2

Физический интерфейс PS/2 включает четыре проводника: землю, напряжение питания (изначально использовалось напряжение +5В, все современные контроллеры и устройства используют +3,3В), линию данных (Data) и линию синхронизации (Clock). Технически две последние линии выполнены таким образом, что логическая единица на каждой из них присутствует только тогда, когда и контроллер интерфейса («хост» по терминологии, используемой в описании интерфейса), и устройство одновременно удерживают на данной линии логическую единицу. Если хост или устройство выставляет на линию логический нуль, на всей линии появляется нуль, даже если другое устройство продолжает удерживать единицу.

Информация передаётся между хостом и устройством пакетами по 11 бит. Первый передаваемый бит является стартовым, он всегда равен нулю. Далее следуют восемь битов данных, причём первым передаётся наименее значащий. После битов данных идёт контрольный бит (он дополняет общее количество единичных битов данных до нечётного), а за ним — стоп-бит, всегда равный единице. Например, для передачи байта, имеющего шестнадцатеричное значение 15h, используется следующая последовательность битов: 01010100001.

Передача данных от устройства к хосту

PS2 dev-to-host

Временнáя диаграмма передачи информации от устройства к хосту

Устройство может начать передачу данных хосту по своей инициативе в любой момент, когда передача не ведётся, но разрешена. Признаком разрешения передачи является наличине на обеих линиях — Clock и Data — логических единиц (естественно, при условии, что ранее начатая передача 11-разрядного пакета уже закончена, поскольку обе линии могут быть единичными и в процессе передачи).

Последовательность передачи одного бита выглядит следующим образом. Когда на линии Clock находится логическая единица, устройство выставляет нужный бит (единицу или нуль) на линию Data, а затем, выждав 5—25 мкс, выставляет на Clock логический нуль, тем самым давая понять хосту, что на линии Data находится нужный бит. Выждав ещё некоторое время, устройство вновь выставляет на линии Clock логическую единицу, а затем в течение не менее 5 мкс не изменяет состояние линий Clock и Data. Хост может принять бит в любой момент после того, как линия Clock была переведена устройством в логический нуль, однако технически удобнее всего это делать в момент перехода Clock из нуля в единицу, т.е. по фронту (положительному перепаду) сигнала Clock; именно для этого требуется, чтобы бит на линии Data удерживался ещё как минимум 5 мкс после перехода Clock в единичное состояние. Общий период времени, необходимый для передачи одного бита, составляет от 60 до 100 мкс, что соответствует частоте синхроимпульсов, передаваемых по линии Clock, в 10—16,7 кГц.

Временнáя диаграмма сигналов на линиях Clock и Data при передаче информационного байта 15h (последовательность битов 01010100001) показана на рисунке.

PS2 dev-to-host 15h

Временнáя диаграмма передачи байта 15h от устройства к хосту

Передача данных от хоста к устройству

PS2 host-to-dev

Временнáя диаграмма передачи информации от хоста к устройству

Передача данных от хоста к устройству несколько отличается от описанной выше последовательности. Главное отличие заключается в том, что синхронизацию осуществляет не передающая сторона (хост), а принимающая, поскольку предполагается, что устройство может быть намного медленнее хоста.

Когда хост желает начать передачу данных, он сначала выставляет на линии Data и Clock логические нули и удерживает их не менее 100 мкс, что запрещает устройству передачу данных хосту (или обрывает уже ведущуюся передачу — см. следующий подраздел) и одновременно даёт время приготовиться для приёма данных.

Выждав необходимое время, хост выставляет на линии Clock логическую единицу, продолжая удерживать на линии Data нуль. Этим устройству даётся знать, что хост желает начать передачу данных; одновременно нулевое состояние линии Data играет роль стартового бита 11-разрядного пакета.

Устройство, приготовившись к приёму первого информационного бита (на это с момента перевода линии Clock хостом в нуль должно уходить не более 15 мс), начинает выдачу синхроимпульсов на линию Clock. Хост выдаёт очередной бит пакета, когда на Clock находится логический нуль, а устройство считывает этот бит, когда на Clock находится единица (т.е. моменты выдачи и приёма информации обратные по сравнению с передачей данных от устройства к хосту).

После приёма стоп-бита пакета устройство подтверждает окончание приёма, выставляя на линию Data логический нуль и генерируя ещё один синхроимпульс (отрицательный и затем положительный перепад) на Clock. Выдача нуля на Data при этом осуществляется, когда на Clock устройство удерживает единицу. Хост в ответ на получение нуля по линии Data после посылки стоп-бита должен выдать на эту линию логическую единицу. Если этого сделано не будет, устройство, обнаружив такую ситуацию после перевода Clock в единичное состояние, продолжит генерацию синхроимпульсов на линии Clock, дожидаясь, пока на Data появится единица, и одновременно зафиксировав ошибку.

Вся передача информации от хоста к устройству с момента получения хостом первого импульса по линии Clock и до выдачи устройством подтверждения приёма должна укладываться в промежуток времени, не превышающий 2 мс. Если информация, переданная хостом, подразумевает выдачу устройством ответной информации, эта выдача должна начаться не позже, чем через 20 мс.

Временнáя диаграмма посылки хостом устройству байта 15h показана на рисунке.

PS2 host-to-dev 15h

Временнáя диаграмма передачи байта 15h от хоста к устройству

Запрет передачи данных

Хост может в любой момент запретить передачу данных, переведя линию Clock в состояние логического нуля. Если в этот момент устройство осуществляло передачу данных, оно её прекращает.

Если хост прервал передачу данных от устройства, то после восстановления на линии Clock состояния логической единицы устройство начинает передачу информации заново, причём повторены должны быть все байты, составляющие единое логическое целое. Например, если хост прервал передачу второго байта двухбайтового скан-кода клавиатуры, при возобновлении работы клавиатура заново должна отправить первый байт, и лишь потом начинать передачу второго.

Программное взаимодействие с контроллером

Далее мы будем исходить, что контроллер интерфейса PS/2 используется традиционным образом — для подключения клавиатуры и мыши.

С точки зрения программиста контроллер состоит из трёх регистров: регистра данных, регистра состояния и регистра команд. Последний служит для выдачи в контроллер различных команд, выполняемых самим контроллером; эти команды не следует путать с командами клавиатуры, которые передаются в клавиатуру через контроллер интерфейса PS/2, но выполняются не им, а контроллером клавиатуры. Кроме того, контроллер интерфейса PS/2 способен вырабатывать запросы прерываний, поступающие в программируемый контроллер прерываний по линиям IRQ1 и IRQ12, первая из которых соответствует запросам прерываний от клавиатуры, а вторая — от мыши.

Регистры контроллера

Регистр данных

Регистр данных доступен процессору для чтения и записи через порт 60h. Он используется для:

  • считывания информации, поступившей от клавиатуры или мыши (либо любых других устройств, подключенных через интерфейс PS/2);
  • передачи информации в клавиатуру (или иное подключенное устройство);
  • получения информации, возвращаемой контроллером в ответ на выданную ему команду;
  • записи информации, необходимой для исполнения ранее выданной контроллеру команды.

Заметим, что чтение и запись информации возможны только в определённые моменты времени. Считывание имеет смысл только тогда, когда регистр данных содержит байт, принятый от какого-либо устройства или возвращённый ранее заданной командой; признаком наличия данных для считывания служит единичное значение бита 0 регистра состояния (см. ниже). Записывать байт в регистр данных можно только тогда, когда установлен бит 1 регистра состояния.

Не следует забывать и о том, что описываемый регистр относится ко всему контроллеру интерфейса PS/2, а не к клавиатуре или мыши. Он используется как для «общения» с этими устройствами, так и для считывания или записи данных в сам контроллер PS/2 в зависимости от того, какую операцию он в данный момент времени выполняет (см. ниже описание регистра команд).

Регистр состояния

Этот регистр доступен процессору для считывания через порт 64h. Назначение его разрядов следующее:

Бит Описание
7 =1 – при получении данных от устройства была обнаружена ошибка чётности. В регистр данных помещается байт 0FFh
6 =1 – при обмене данными с устройством зафиксирован таймаут. Если он возник при получении данных от устройства, в регистр данных помещается байт 0FFh, если он возник при передаче данных в устройство — байт 0FEh
5 =1 – в регистре данных находится байт, полученный от мыши. Одновременно будет установлен и бит 0
4 =0 – клавиатура блокирована, =1 — работа клавиатуры разрешена. В компьютерах PS/2 была предусмотрена блокировка клавиатуры для предотвращения несанкционированного использования компьютера; к настоящему времени этот механизм защиты утратил свою актуальность и практически не используется
3 =0 – последней передачей байта контроллеру была выдача команды (запись в регистр команд); =1 – последней передачей была выдача данных (запись в регистр данных)
2 =0 – был выполнен аппаратный сброс; =1 – инициализация ПК была закончена. Этот бит сбрасывается контроллером после того, как на него будет подано питающее напряжение либо при поступлении общего сигнала сброса (обычно от кнопки Reset), а устанавливается программно, с помощью команды 60h (см. ниже). Анализируя состояние этого бита, BIOS может определить причину сброса (аппаратный или программный)
1 =0 – входной буфер контроллера пуст (можно производить запись в регистр команд или данных); =1 — входной буфер контроллера заполнен, запись в регистры данных и команд запрещена
0 =1 – выходной буфер контроллера содержит информацию (можно производить чтение из регистра данных). После чтения регистра данных этот бит сбрасывается

Регистр команд

Регистр команд служит для выдачи команд контроллеру интерфейса PS/2. Он доступен только для записи через порт 64h. Записывать команду в этот порт можно только в том случае, если входной буфер контроллера пуст (бит 1 регистра состояния сброшен).

Описание команд контроллера приведено ниже в соответствующем подразделе.

Команды контроллера

Команды контроллера записываются в регистр команд (порт 64h). Контроллеры различных производителей имеют несколько различающийся набор команд, однако все основные команды у них присутствуют, а различия касаются команд, предназначенных для проверки функционирования контроллера.

Команды, выполняющие запись каких-либо данных, выдаются контроллеру в два приёма: сначала в регистр команд записывается код команды, а затем в регистр данных — необходимые ей данные. Команды, возвращающие какие-либо данные, помещают их в регистр данных.

Ниже приведён общий список и краткое описание команд контроллера. Коды команд даны в шестнадцатеричном виде. Дополнительные сведения о некоторых командах даны отдельно.

Команда Описание
20 Чтение управляющего байта (см. ниже)
21–3F Чтение ячеек памяти контроллера. Эти команды предназначены для диагностики и работают не во всех контроллерах. Формально команда 20 относится к их же числу, однако работает всегда, поскольку возвращаемая ей информация стандартизирована
60 Запись управляющего байта (см. ниже)
61–7F Запись ячеек памяти контроллера. Эти команды предназначены для диагностики и работают не во всех контроллерах. Формально команда 60 относится к их же числу, однако работает всегда, поскольку записываемая ей информация стандартизирована
A1 Чтение версии контроллера. В первых контроллерах не поддерживалась
A4 Проверка наличия механизма парольной защиты. Возвращает байт FA, если механизм присутствует, и F1 в противном случае. В настоящее время не используется
A5 Загрузка пароля. Получив эту команду, контроллер начинает принимать пароль, загружаемый в него через регистр данных. Пароль заканчивается нулевым байтом. В настоящее время эта команда не используется
A6 Разрешение проверки пароля. Эта команда допустима, только если пароль уже загружен (команда A5). В настоящее время не используется
A7 Запрет мыши. Эта команда устанавливает бит 5 управляющего байта (см. ниже)
A8 Разрешение мыши. Эта команда сбрасывает бит 5 управляющего байта (см. ниже)
A9 Тест интерфейса мыши; при успешном выполнении возвращается 00. В ранних версиях контроллера эта команда отсутствовала
AA Самотестирование контроллера; при успешном выполнении возвращается 55. В ранних версиях контроллера эта команда отсутствовала
AB Тест интерфейса клавиатуры; при успешном выполнении возвращается 00. В ранних версиях контроллера эта команда отсутствовала
AD Запрет клавиатуры. Эта команда устанавливает бит 4 управляющего байта (см. ниже)
AE Разрешение клавиатуры. Эта команда сбрасывает бит 4 управляющего байта (см. ниже)
AF Чтение версии. Чем-то отличается от команды A1. В ранних версиях контроллера отсутствовала
C0 Чтение входного порта (см. ниже)
C1 Опрос младшей части входного порта (см. ниже). Биты 3–0 входного порта считываются и помещаются в разряды 7–4 регистра состояния. Большинство контроллеров не поддерживает эту команду
C2 Опрос старшей части входного порта (см. ниже). Биты 7–4 входного порта считываются и помещаются в разряды 7–4 регистра состояния. Большинство контроллеров не поддерживает эту команду
D0 Чтение выходного порта (см. ниже)
D1 Запись выходного порта (см. ниже). Многие контроллеры поддерживают запись только в разряд 1 или в разряды 0 и 1
D2 Запись байта в выходной буфер клавиатуры. Эта команда имитирует поступление байта данных от клавиатуры: байт данных, записываемый процессором в регистр данных после выдачи этой команды, считается как бы пришедшим от клавиатуры и вызывает установку бита 0 регистра состояния и генерацию прерывания, после чего может быть прочитан через регистр данных
D3 Запись байта в выходной буфер мыши. Эта команда аналогична предыдущей, но имитирует поступление байта данных от мыши, устанавливая биты 0 и 5 и генерируя прерывание от мыши
D4 Передача информации в мышь. Байт, записываемый в регистр данных после выдачи этой команды, передаётся мыши
E0 Чтение тестовых входов. В регистр данных помещается байт, бит 0 которого соответствует состоянию на момент поступления команды линии синхронизации (Clock) интерфейса клавиатуры, а бит 1 — линии синхронизации интерфейса мыши
F0–FE Выдача импульсов в выходной порт (см. ниже). Разряды 3–0 этой команды соответствуют битам 3–0 выходного порта. Те биты выходного порта, соответствующие которым разряды команды сброшены, на несколько микросекунд (6 мкс для оригинального контроллера 8042) будут сброшены. Многие контроллеры могут не поддерживать часть этих команд. Например, контроллер PS/2 типа 2 фирмы IBM поддерживает только команду FE, вызывающую отрицательный перепад нулевого разряда выходного порта, что приводит к сбросу процессора
FF Сброс контроллера PS/2

Управляющий байт контроллера

Режимы работы контроллера определяются значением управляющего байта, который может быть задан командой 60 и прочитан командой 20. Назначение разрядов этого байта следующее.

Бит Описание
7 Зарезервировано
6 =0 – контроллер передаёт принятые от клавиатуры скан-коды без изменения; =1 – контроллер преобразует поступающие от клавиатуры скан-коды в кодовую таблицу 1. Многие контроллеры не поддерживают эту возможность; в этом случае установить данный разряд командой 60h невозможно
5 =0 – работа мыши разрешена; =1 – работа мыши запрещена (на линии Clock интерфейса мыши будет установлен 0). Этот бит может быть установлен и сброшен командами A7 и A8
4 =0 – работа клавиатуры разрешена; =1 – работа клавиатуры запрещена (на линии Clock интерфейса клавиатуры будет установлен 0). Этот бит может быть установлен и сброшен командами AD и AE
3 Зарезервировано
2 Значение бита 2 регистра состояния
1 =0 – прерывания от мыши запрещены; =1 – прерывания от мыши разрешены
0 =0 – прерывания от клавиатуры запрещены; =1 – прерывания от клавиатуры разрешены

Входной порт

Входной порт — это внутренний порт контроллера PS/2, разряды которого отражают состояние ряда входных линий контроллера. Входной порт может быть прочитан с помощью команд C0, C1 и C2, причём последние две многими контроллерами не поддерживаются. Обычным программам, включая ОС, состояние линий этого порта неинтересно.

Бит Описание
7 =0 – клавиатура блокирована; =1 – клавиатура разрешена. В настоящее время не используется
6 Состояние перемычки, управляющей режимом работы видеоконтроллера после включения питания или сброса (=0 – цветной режим, =1 – монохромный режим). В настоящее время не используется
5 Состояние перемычки неизвестного назначения. В настоящее время не используется
4 Объём памяти ПК: =0 — 256 Кбайт, =1 — 512 Кбайт или больше. В настоящее время не используется
3 Зарезервировано
2 Зарезервировано
1 Состояние входной линии данных интерфейса мыши
0 Состояние входной линии данных интерфейса клавиатуры

Выходной порт

Выходной порт является внутренним портом контроллера интерфейса PS/2, с помощью которого он управляет подключенными к нему устройствами. Назначение его разрядов приведено в таблице.

Бит Описание
7 Состояние выходной линии данных клавиатуры
6 Состояние выходной линии синхронизации клавиатуры
5 Состояние линии запроса прерывания от мыши (IRQ12, =1 – запрошено прерывание)
4 Состояние линии запроса прерывания от клавиатуры (IRQ1, =1 – запрошено прерывание)
3 Состояние выходной линии синхронизации мыши
2 Состояние выходной линии данных мыши
1 Управление линией A20. Когда этот разряд и бит 1 порта 92h сброшены, линия A20 запрещена. Для нормальной работы в защищённом режиме её необходимо разрешить
0 Сброс микропроцессора. При нормальной работе всегда равен 1. Сброс этого разряда приводит к выдаче процессору сигнала сброса

Ссылки

Keyboard and Auxiliary Device Controller Из документации на IBM PS/2
vt82c42 Keyboard Controller Документации от VIA на свой контроллер 8042

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.