что делает контроллер клавиатуры

Контроллер клавиатуры

Здесь приводятся выдержки из файла kbd.def.

Основой послужила книга «Руководство по архитектуре IBM PС AT» / Ж.К. Голенкова, А.В. Заболоцкий, М.Л. Мархасин и др.; Под общ. ред. М.Л. Мархасина. — Минск: ООО «Консул», 1992. — 949 c.: ил.

Структура контроллера клавиатуры

Структура контроллера клавиатуры 8042, установленного на материнской плате приведена ниже

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Выходной буфер (8-разрядный регистр) доступен системе только как читаемый порт с адресом 60h, он используется для передачи системе полученных от клавиатуры кодов сканирования и прочитанных по команде системы байтов данных. Выходной буфер должен быть прочитан только после того, как установлен признак «буфер полон» (Разряд 0 регистра состояния).

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

Регистр состояния клавиатуры (8 разрядов) доступен системе только как читаемый порт с адресом 64h. Назначение разрядов приведено ниже.

Назначение разрядов регистра состояния (только читаемый порт 64h).

РазрядНазначение
00 — В выходном буфере нет новых данных; 1 — Контроллер поместил новые данные в выходной буфер, но система ещё не приняла их, когда система прочитает значение порта 60h, разряд станет нулевым.
10 — входной буфер пуст (порт 60h или 64h) 1 — система поместила данные во входной буфер, но контроллер их ещё не принял. После того, как контроллер их прочитает этот разряд станет нулевым.
20 — сброс по включению питания (холодный пуск); 1 — программный сброс (горячий пуск).
30 — во входном буфере данные (запись производилась по адресу 60h) 1 — во входном буфере команда (запись производилась по адресу 64h)
40 — защитный замок закрыт; 1 — защитный замок открыт
51 — Тайм-аут передачи. Передача данных, начатая контроллером не завершена

61 — Тайм-аут приёма. Передача данных, начата клавиатурой, но не завершена в запрограммированный промежуток времени (2 мс)
71 — Ошибка паритета. Последний байт данных был получен от клавиатуры с чётным паритетом. Клавиатура должна посылать байт с нечётным паритетом.

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

Причины ошибки контроллера клавиатуры

РазрядыПричина ошибки
765
001Нет синхроимпульса
011Есть синхроимпульс, нет отклика
101Есть синхроимпульс, ошибка паритета

В файле kbd.def определены следующие константы для портов:

Макросы в kbd.def проверяют следующие биты регистра состояния (Cm… — маска, F… — номер бита).

Для работы с контроллером клавиатуры в файле kbd.def определены следующие макросы.

KBDInpBufFree BufFull — проверяет, свободен ли входной буфер (возможна ли запись в него), Если нет, то выход по метке BufFull. Портит CF. В AL помещается байт состояния контроллера клавиатуры.

KBDWtInpBufFree — ждёт, когда выходной буфер станет свободным. Портит CF, AL. В AL помещается байт состояния контроллера клавиатуры

KBDOutpBufFull ExErr — проверяет, есть ли данные в выходном буфере. Если данных нет, то выход по метке ExErr. Портит AL.

KBDOutpBufFree — освобождает выходной буфер.

KBDWtOuputBufFull — ждёт, когда во входной буфер поступят данные. Портит AL.

OutputBufFree ExErr — проверяет, есть ли данные в выходном буфере. Если данные есть, то выход по метке ExErr. Портит AL.

KBDInterfaceError ExErr — проверяет, произошла ли ошибка при работе с клавиатурой. Если да, то выход по метке ExErr. Портит AL.

Назначение разрядов входного порта

РазрядНазначение
0Резерв изготовителя (состояние перемычки)
1Резерв изготовителя
2Резерв изготовителя
3Резерв изготовителя
4Объём ОЗУ на системной плате
5Резерв изготовителя
6Тип первичного монитора (0 — цветной, 1 — черно-белый)
7Замок клавиатуры (0 — заблокирована, 1 — разблокирована)

Назначение разрядов выходного порта

РазрядНазначение
0Системный сброс
1Gate A20
2Резерв изготовителя
3Резерв изготовителя
4Выходной буфер полон
5Входной буфер пуст
6Синхросигнал клавиатуры (выход)
7Данные клавиатуры (выход)

Наиболее важны следующие разряды выходного порта, определённые в kbd.def:

На процессорах, начиная с 586, бит 0 к системному сбросу уже не подключён.

Для управления контроллером клавиатуры используются следующие команды

Константы команд управления контроллером клавиатуры, определённые в kbd.def:

Коды ответов контроллера клавиатуры

Для записи в выходной порт необходимо ввести команду D1h по адресу 64h, затем ввести нужное значение данных для выходного порта по адресу 60h.

Чтобы прочитать значение выходного порта необходимо ввести команду D0h по адресу 64h, затем прочитать данные по адресу 60h. Команда должна вводиться только когда выходной буфер пуст. При изменении состояния бита, управляющего адресной линией A20, программа, чтобы нормально продолжать работу, должна быть уверена, что бит установлен правильно. Для этого рекомендуется в контроллер выдавать холостую команду после последовательности записи в порт нужного значения. После выполнения этой холостой команды программа может быть уверена, что предыдущая команда выполнена и разряд адреса A20 установлен аппаратно на требуемое значение. Нельзя использовать команду D1 для изменения любого разряда, кроме первого.

Данные в выходном буфере (порт 60h) — это данные клавиатуры, только если контроллер не получил определённую команду.

В kbd.def определены следующие макросы работы с контроллером клавиатуры

KBDPCReset осуществляет сброс системы, путём подачи команды пульсации нулевого разряда выходного порта. Работает до 486.

KBDDesable запрещает клавиатуру. Макрос должен вызываться при пустом входном буфере. Портит al.

KBDEnable разрешает клавиатуру. Макрос должен вызываться при пустом входном буфере. Портит al.

KBDSetA20 JGateA20AlreadySet устанавливает линию GateA20. Необязательный параметр JGateA20AlreadySet — метка, по которой выполняется переход, если A20 была установлена до выполнения макроса. Портит ax.

KBDResetA20 JGateA20AlreadyReset сбрасывает линию GateA20 Необязательный параметр JGateA20AlreadyReset — метка, по которой выполняется переход, если A20 была сброшена до выполнения макроса. Портит ax.

KBDResetSystem — дожидается, когда входной буфер будет пуст, и сбрасываеть систему. Только для ПК не старше 486 и не под управлением windows.

Режимы работы контроллера клавиатуры определяются разрядами, установленными командой 60h.

Назначение разрядов байта для команды 60h

РазрядНазначение
00 — не генерировать прерывание по заполнению выходного буфера, 1 — генерировать;
1Резерв, должен быть равным нулю;
2Системный флажок. Записывается во второй разряд регистра состояния.
30 — подчиниться защитному замку; 1 — игнорировать защитный замок
40 — разрешить интерфейс клавиатуры; 1 — запретить.
50 — использовать 11-разрядные коды клавиатуры (PC AT); 1 — использовать коды клавиатуры, совместимые с PC XT
60 — не преобразовывать коды клавиатуры в IBM PC совместимый; 1 — преобразовывать коды клавиатуры в совместимые с XT.
7Резерв, должен быть равным нулю

Макрос KBDRdCmdByte читает командный байт контороллера клавиатуры в AL.

Макрос KBDWrCmdByte CmdByte записывает командный байт контороллера клавиатуры. CmdByte — значение командного байта, не должно быть регистром AL.

Клавиатура

При каждой передаче команды или данных от системы на клавиатуру система требует подтверждения от клавиатуры. Если только система не запретит вывод данных с клавиатуры, последняя даёт ответ в течение 20 мс. Если ответ клавиатуры недействителен или содержит ошибку паритета, система повторно посылает ей команду или данные. Двухбайтовые команды требуют особой обработки. Если переданы и подтверждены команды команды F3h, F0h или EDh, а также передан байт данных, но ответ оказался недействительным или с ошибкой паритета, то система передаст повторно и команду и байт данных.

Клавиатура AT имеет 3 режима работы:

Здесь будет рассматриваться в основном режим 3. В этом режиме должно быть запрещено преобразование кодов у контроллера клавиатуры, т. к. он не может обрабатывать этот набор кодов сканирования. BIOS также не может обрабатывать этот код сканирования, поэтому прикладная система, использующая этот режим, должна обрабатывать их сама. Каждой клавише присвоен свой уникальный 8-разрядный код нажатия, который передаётся при нажатии клавиши. Код отжатия состоит из двух байтов первый — префикс отжатия (F0h), а второй идентичен коду нажатия данной клавиши. В этом наборе кодов каждая клавиша посылает только один код сканирования и состояние любой клавиши не зависит от состояния других.

За исключением клавиши Pause все клавиши работают на нажатие/отжатие и являются повторяемыми (т.е. при нажатой и удерживаемой клавише через определённые промежутки клавиатура посылает код нажатия этой клавиши). Если нажаты и удерживаются несколько клавиш, то повторяется код только той клавиши, которая была нажата последней. После её отпускания коды повторений перестают пересылаться, даже если ещё остаются нажатые клавиши. Если клавиша нажата во время запрета клавиатуры, то в буфер клавиатуры поступает только первый код нажатия.

Общение с клавиатурой происходит черз порт 60h.

Макрос KEYBReceive ждёт ответ от клавиатуры. Ответ клавиатуры в регистре al. Используется просто:

Макрос KEYBsend послает команду клавиатуре. Команда может содержать до трёх байт. Команды задаются параметрами CMD, CMD1 и CMD2. Коды команд клавиатуры см. ниже. Если параметр DontWaitACK пустой, то перед посылкой очередного байта (CMD1 или CMD2) ожидается приём подтверждения от клавиатуры. (После посылки CMD2 подтверждения не ожидается) Если DontWaitACK не пустой (любое значение), то ответ от клавиатуры не ожидается.

Команды управления клавиатурой

Байт команды в диапазоне от EF до F1 — резервные. Это холостые однобайтные команды, которые клавиатура принимает и выдаёт ответ CeqKEYBResend, никаких других действий не предпринимается.

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

Следующие команды установливают отдельные клавиши только повторение, только нажатие\отжатие, только нажатие. Клавиатура получает первый байт, посылает KACK, очищает выходной буфер, ждёт код клавиши (ScanCode), подтверждает его и ждёт следующей команды. Сканирование не возобновляется до тех пор, пока клавиатура не получит команду CeqKEYBEnable. Устанавливать можно несколько клавиш одновременно. Это многобайтные команды.

Коды ответов клавиатуры

Макросы

Макрос KBDEndOfInterrupt завершает обработку прерывания клваиатуры. Используется он так:

Сканкоды клавиш при работе клавиатуры в режимах 2 и 3

Сканкоды клавиш при работе клавиатуры в режиме 2 (с отключённой перекодировкой).

Цифры на основной клавиатуре

ОбозначениеКод в режиме 3КлавишаЛат.
shift
Русск.
shift
ОбозначениеКод в режиме 2
CKBD3_045h0))CKBD2_045h
CKBD3_116h1!!CKBD2_116h
CKBD3_21eh2@«CKBD2_21eh
CKBD3_326h3#CKBD2_326h
CKBD3_425h4$;CKBD2_425h
CKBD3_52eh5%:CKBD2_52eh
CKBD3_636h6^,CKBD2_636h
CKBD3_73dh7&.CKBD2_73dh
CKBD3_83eh8**CKBD2_83eh
CKBD3_946h9((CKBD2_946h

Буквы и знаки на основной клавиатуре

ОбозначениеКод режима 3Клавиша.Русск.ОбозначениеКод режима 3
CKBD3_tilde0eh`CKBD2_tilde0eh
CKBD3_minus4eh_CKBD2_minus4eh
CKBD3_equal55h=+CKBD2_equal55h
CKBD3_OpenBrace54h[ <ХCKBD2_OpenBrace54h
CKBD3_CloseBrace5bh]>ЪCKBD2_CloseBrace5bh
CKBD3_Semicolon4ch;:ЖCKBD2_Semicolon4ch
CKBD3_Apostophe52h«ЭCKBD2_Apostophe52h
CKBD3_Zapyataya41h,ЮCKBD2_dot49h
CKBD3_Slash4ah/?ёCKBD2_Slash4ah
CKBD3_BackSlash5ch\|CKBD2_BackSlash5dh
CKBD3_q15hqQйCKBD2_q15h
CKBD3_w1dhwWцCKBD2_w1dh
CKBD3_e24heEуCKBD2_e24h
CKBD3_r2dhrRкCKBD2_r2dh
CKBD3_t2chtTеCKBD2_t2ch
CKBD3_y35hyYнCKBD2_y35h
CKBD3_u3chuUгCKBD2_u3ch
CKBD3_i43hiIшCKBD2_i43h
CKBD3_o44hoOщCKBD2_o44h
CKBD3_p4dhpPзCKBD2_p4dh
CKBD3_a1chaAфCKBD2_a1ch
CKBD3_s1bhsSыCKBD2_s1bh
CKBD3_d23hdDвCKBD2_d23h
CKBD3_f2bhffаCKBD2_f2bh
CKBD3_g34hgGпCKBD2_g34h
CKBD3_h33hhHрCKBD2_h33h
CKBD3_j3bhjJоCKBD2_j3bh
CKBD3_k42hkKлCKBD2_k42h
CKBD3_l4bhlLдCKBD2_l4bh
CKBD3_z1ahzZяCKBD2_z1ah
CKBD3_x22hxXчCKBD2_x22h
CKBD3_c21hcCсCKBD2_c21h
CKBD3_v2ahvVмCKBD2_v2ah
CKBD3_b32hbBиCKBD2_b32h
CKBD3_n31hnNтCKBD2_n31h
CKBD3_m3ahmMьCKBD2_m3ah
CKBD3_Space29hCKBD2_Space29h

Функциональные клавиши

ОбозначениеКод в режиме 3КлавишаОбозначениеКод в режиме 2
CKBD3_Esc08hEscapeCKBD2_Esc76h
CKBD3_F107hF1CKBD2_F105h
CKBD3_F20fhF2CKBD2_F206h
CKBD3_F317hF3CKBD2_F304h
CKBD3_F41fhF4CKBD2_F40ch
CKBD3_F527hF5CKBD2_F503h
CKBD3_F62fhF6CKBD2_F60bh
CKBD3_F737hF7CKBD2_F783h
CKBD3_F83fhF8CKBD2_F80ah
CKBD3_F947hF9CKBD2_F901h
CKBD3_F104fhF10CKBD2_F1009h
CKBD3_F1156hF11CKBD2_F1178h
CKBD3_F125ehF12CKBD2_F1207h
CKBD3_PrScr57hPrint ScreenCKBD2_PrScr0e012e07ch
CKBD3_Pause62hPauseCKBD2_Pause0e11477h

Примечание. Согласно [1] клавиша Pause работает только на нажатие. На моей клавиатуре в режиме 3 она программируется также, как и остальные клавиши (т. е. нажатие, нажатие/отжатие, нажатие/отжатие/повторение и т. д.)

Коды клавиш в режиме 3

ОбозначениеКод в режиме 3КлавишаОбозначениеКод в режиме 2
CKBD3_Lwin8bhЛевая клавиша WindowsCKBD2_LWin0e01fh
CKBD3_Rwin8chПравая клавиша WindowsCKBD2_RWin0e027h
CKBD3_WinMenu8dhКлавиша меню WindowsCKBD2_WinMenu0e02fh
Клавиши WakeUp, Sleep и Power
в режиме 3 на моей
клавиатуре не опознаются
Клавиша WakeUpCKBD2_WakeUp0e05eh
Клавиша SleepCKBD2_Sleep0e03fh
Клавиша PowerCKBD2_Power0e037h

Дополнительные коды, возвращаемые клавиатурой при нажатии и отпускании клавиш.

Источник

О работе ПК на примере Windows 10 и клавиатуры ч.2

В этой части мы рассмотрим какой путь проходит информация о нажатой клавише от клавиатуры до CPU, будет очень много картинок и это не последняя часть. Я буду рассказывать об этом с точки зрения программиста который пишет в режиме пользователя — пользовательские програмы, web, мобильные приложения — поэтому здесь могут быть неточности. Люди занимающиеся электроникой навряд ли найдут для себя что-то полезное. Первая часть находится здесь.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Под катом трафик.

Клавиша клавиатуры представляет из себя кнопку, которая замыкает контакты и через них проходит электрический ток. Механизм замыкания/размыкания сделан таким образом чтобы кнопку не приходилось вдавливать до конца, потому как иначе пальцы будут быстро уставать и клавиатура будет неэргономичной. В разрезе клавиша выглядит так. В правой части находится контакт на который подаётся напряжение.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатурычто делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры
что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатурычто делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Через программу на каждую ножку можно установить либо замерить напряжение. Алгоритм нахождения нажатой клавиши заключается в том чтобы подавать напряжение на одну ножку и замерять его на другой и если клавиша была нажата, то на второй ножке будет примерно столько же вольт сколько на входной. Так в бесконечном цикле проверяются все клавиши. Как правило клавиатура имеет 80-110 кнопок, а у контроллера контактов (пинов) гораздо меньше. Поэтому используют такой подход как “клавиатурная матрица” — все клавиши распределяют по столбцам и строкам и алгоритм сводится к нахождению столбца который пересекается со строкой на которую программа подала напряжение. Здесь отмечено цветом соответствие столбцов/строк контактам.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

В реальности матрица может выглядеть так. Слева промышленная и справа самодельная.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

На псевдокоде часть программы прошивки определяющая нажатые клавиши может выглядеть следующим образом.

Каждой клавише соответствует скан код, он стандартизирован и представляет из себя 8ми битное число, т.е. один байт. Поэтому когда нажата клавиша Y контроллер клавиатуры должен будет отправить число 21 (0x15), а когда отпущена — 149 (0x95). Каким образом происходит отправка? Наверняка вы работали с JSON, веб-сервисами или отправляли данные между процессами и знаете что для отправки данные надо сериализовать, т.е. превратить в массив байт или отформатированный текст, которые получатель может десериализовать, т.е. воссоздать объект в своём адресном пространстве. А во что можно сериализовать данные на таком низком уровне? Нам нужно передать всего лишь 1 байт (8 бит). Забегая вперёд скажу, что данные мы будем передавать побитно.

В математике есть формула которая может преобразовать любое привычное нам десятичное число в последовательность нулей и единиц и обратно. Этой формуле нашлось применение в вычислительной технике. В первой части я вскользь упомянул, что аналоговая техника эксплуатирует законы физики, в то время как цифровая работает на уровне нулей и единиц. Это означает, что аналоговый телефон кодирует весь спектр человеческого голоса в последовательность электромагнитных волн, а цифровой телефон использует микросхему которая преобразовывает человеческий голос в цифровые данные, к примеру в файлы в формате WAV, а потом передаёт их последовательностью нулей и единиц в виде электромагнитных волн. Только в данном случае вместо всего спектра голоса надо представлять только два значения — 0 и 1. Представлять их можно волнами разной длины, разным напряжением, световыми импульсами через оптоволокно, черными и белыми полосками на бумаге, дырками на перфокарте.

Скан код нажатой клавиши Y в двоичном виде выглядит как 0001 0101. Передавать мы их будем по ножке микроконтроллера которая отвечает за данные (DATA). Логическая единица — это напряжение 3.3В и выше, логический ноль — напряжение около 0В. Здесь возникает загвоздка — как передать три нуля подряд? Для этого нам нужна вторая ножка которую назовём CLOCK, когда на ней единичка это значит что сеанс передачи одного бита начался, а ноль — закончился. Такая перемена значений (напряжений) будет происходить с определённым интервалом времени, скажем 50 наносекунд, потому что на другом конце находится второй микроконтроллер который работает со своей скоростью и в бесконечном цикле слушает ножки к которым подключены CLOCK и DATA. В данном примере я буду исходить из того что клавиатура подключается через разъём PS2, который показан ниже. Через USB порт алгоритм передачи будет другим. Как видите у порта PS2 есть пины которые называются Data, Clock. Помимо них есть ещё контакт по которому контроллер порта PS2 раздаёт клавиатуре напряжение 5В необходимое для работы и контакт заземления, который просто выводится на корпус клавиатуры. Остальные контакты не используются.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатурычто делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Порт PS/2 называется последовательным портом (serial bus), потому как передаёт биты один за другим (последовательность битов). Паралельный порт передаёт данные сразу по нескольким контактам и может за один сеанс передачи данных передать к примеру сразу один байт (8 бит).

В чём разница между портом, шиной (bus) и протоколом? Шина как и порт это набор контактов (проводков) и соглашение как их использовать, только порт имеет соединение для подключения внешних устройств, а шина используется для общения компонентов на материнской плате. Порт это по сути шина с разъёмом по середине. Протокол — это порядок взаимодействия через контакты. В примере с PS/2 это был порядок передачи данных через контакты Clock и Data.

Раньше микроконтроллер Intel 8042 был очень распространённым и использовался как в клавиатуре, так и в качестве контроллера порта PS2, т.е. данными обменивались два одинаковых чипа. Драйвер порта PS2 в Windows называется 8042prt.sys.

На самом деле мы передаём не 8 бит, а 11, потому что данные передаются в виде пакета данных или же сообщения. Дополнительные 3 бита обозначают начало и конец данных — один нолик в начале и 0 1 в конце, такой протокол передачи данных от устройства хосту в PS2. Так может выглядеть функция SendKey в псевдокоде, если вам удобнее понимать код. Она отправляет данные о нажатой клавише через шину PS2.

Не всегда для передачи данных нужно вручную устанавливать напряжение на каждой ножке индивидуально. В некоторых случаях значение сохранённое в регистре автоматически отображается на контакты.

На графике такая передача данных будет визуализирована следующим образом. По оси X время, по Y — напряжение.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

В аналоговой технике сигнал может искажаться, т.е. лежит провод ни к чему не подключённый, но вольтметр показывает на нём 0.5В из-за того что рядом есть электромагнитное поле. Поэтому используется понятие порогового напряжения. Если напряжение меньше порогового, то считаем что получили логический ноль, иначе единичка. С учётом возможных искажений скан-код нажатой клавиши Y может прийти вот таким:

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

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

Микроконтроллеры и микросхемы

Микроконтроллер может выполнять вшитую в него программу, имеет некоторый объём RAM памяти и место для хранения данных и кода программы. В микросхему программу можно задать ещё на этапе проектирования. Вручную создавать электрическую схему реализующую алгоритм очень трудоёмко и поэтому для проектирования микросхем может использоваться специальный язык программирования который называется VHDL (Hardware Description Language). Это высокоуровневый язык программирования который транслируется в план электрической схемы, она прогоняется через программу находящую оптимальное расположение радиоэлементов на плате и в конечном счёте производится в физическом виде. Изображения носят иллюстративный характер.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Каким же образом данные и команды представлены в микросхемах и микроконтроллерах? Основой вычислительной техники является транзистор, который человечество научилось делать в микроскопических размерах. Транзистор это такой радиоэлемент у которого есть три ножки: вход, выход и между ними управляющая, которая открывает или закрывает ток между двумя ножками. Рисунок ниже иллюстрирует работу транзистора, вода иллюстрирует ток.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатурычто делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Т.е. одна лампочка представляет один бит информации (0 или 1), а восемь таких лампочек соответствуют одному байту. На транзисторах можно строить и логические операторы И, ИЛИ, НЕ, XOR.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

К примеру в схеме оператора AND (слева на картинке выше) на выходе будет напряжение только если оба входных напряжения ненулевые. Есть уже кем-то придуманные алгоритмы сложения, умножения, деления, вычитания основанные на побитовых логических операциях и битовых сдвигах. Производителям микросхем надо их просто реализовать. Ниже проиллюстрирована работа алгоритма побитового сложения, разбирать мы его не будем:

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

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

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Микросхемы могут содержать на той же плате и в том же корпусе и микроконтроллер.

Обычно в учебниках шины показывают в виде жирных стрелок, как на картинке ниже. Это делается чтобы не рисовать все соединения контактов, которых может быть много. Работа шины PS2 очень простая, там всего нужно три контакта. Но есть шины у которых к примеру 124 контакта для передачи данных.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Шина может состоять из подшин, т.е. одни контакты используются для данных, другие для адресов, третьи для управления и контакты по которым передаётся питание. Подход когда одни и те же контакты используются попеременно для передачи и данных и адресов называется мультиплексированием. К примеру процессор Intel 8086 имеет шину данных и адресов 20 бит, на диаграмме пинов её контакты обозначены AD0-AD19 (ножки 16-2 и 39-35).

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

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

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Чипсет — это набор микросхем, которые все были созданы для работы друг с другом. Они обеспечивают коммуникацию компонентов на материнской плате и предоставляют функциональность, например таймеры. Чип-сет работает только с одной маркой процессоров, AMD нельзя вставить в материнку с чипсетом Intel, у них даже контакты разные. Схема материнской платы представлена ниже:

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатурычто делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Хотите пример хардверной инкапсуляции? В чипсетах фирмы Intel имеется чип под названием Super IO, он представлен на картинке ниже и через шину LPC подключен к Южному мосту. LPC — умное название проводков CLOCK, DATA, VCC (POWER). Этот чип содержит в себе эмуляцию всех старых чипов которые когда-либо использовались для периферийных устройств, в том числе и чип 8042 который использовался для PS2 порта. Там же находится и эмулятор контроллера порта для Floppy и прочие реликты которые мешают прогрессу. На общей схеме материнской платы выше указаны и Super IO и шина LPC.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Современный порт PS2 напрямую подключается к чипу Super I/O. Зелёное — клавиатура, фиолетовый — мышка. Раньше он подключался к микроконтроллеру Intel 8042.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Материнская плата выполнена из диэлектрика, т.е. материала который не проводит ток. Ток может проходить только про пропечатанным на плате магистралям. Материнская плата имеет множество слоёв, на каждом из которых пропечатаны свои контакты и поэтому если просверлить материнку там где магистралей не видно её можно испортить повредив невидимые контакты внутри платы. Теперь можно детально рассмотреть процесс распространения данных от PS2 к CPU.

Дорога от PS2 к процессору

Как правило архитектуру компьютера рассматривают на процессоре 8086. С одной стороны это правильно, потому как он достаточно простой по сравнению с современными CPU, с другой стороны неправильно, потому что он старый и не отражает архитектуру современной машины. Intel 8086 не нужны были никакие мосты, потому что он был настолько медленный что мог работать с периферией на одной шине, т.е. на одной частоте. Я плохо знаю современные CPU и чип сеты, поэтому буду объяснять на выдуманных, которые напоминают реальные. В моём примере будет вымышленный CPU сильно похожий на Intel 8086. У Super IO чипа больше ста контактов и по ним есть документация в Интернете, но я не вижу смысла разбирать какие пины используются клавиатурой и LPC-шиной для общения с South Bridge на самом деле. Главное это принцип, который может быть реализован по-разному.

Давайте быстренько посмотрим на картинку чтобы вспомнить что мы уже прошли. Зелёные стрелки показывают путь который мы рассмотрим.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Итак данные от клавиатуры уже пришли в контроллер порта PS2, который когда-то был чипом Intel 8042, а теперь эмулируется чипом Super IO. А теперь давайте разбирать дальнейший ход действий на моей выдуманной материнке с выдуманным CPU. Контроллер PS2 получил скан код нажатой клавишы Y и теперь подаёт напряжение на контакт сигнал (фиолетовая линия, см картинку ниже) на котором должен уведомить программируемый контроллер прерываний о данных с клавиатуры. Этот сигнал передаётся от одного чипа к другому пока Северный мост не передаст его чипу управляющему прерываниями.

что делает контроллер клавиатуры. Смотреть фото что делает контроллер клавиатуры. Смотреть картинку что делает контроллер клавиатуры. Картинка про что делает контроллер клавиатуры. Фото что делает контроллер клавиатуры

Programmable Interrupt Controller представляет из себя чип Intel 8259 у которого 8 ножек (их имена IRQ0-IRQ7) зарезервированы для получения уведомлений от определённых портов (Interrupt ReQuest). На пин IRQ1 подвязана клавиатура, IRQ7 — принтер, на какой-то пин Floppy диск, звуковая карта, параллельные порты и другие. Конечно устройств может гораздо больше восьми, поэтому применялся такой приём как каскадирование, когда к ножке с именем IRQ2 подключался другой такой же PIC, у которого отсчёт начинался не с 0, а 7. Мышка привязана к IRQ12, т.е. ножка IRQ5 на втором PIC.

На самом деле таблица векторов прерываний содержит больше данных чем просто указатель на функцию. В этом массиве хранятся данные такого типа. Для простоты будем думать, что в IDT хранятся указатели на функцию или в терминах C# делегаты.

Более подробно ознакомится с тем как настраивается таблица векторов прерываний можно на osdev.

Теперь мы знаем о том как произошло прерывание, но не знаем как обработчик прерываний считывает информацию о нажатой клавише. С программной точки зрения порт PS2 представляет собой два регистра, только обращение к ним происходит не по именам или адресам в памяти о по номеру порта ввода/вывода. Эти два однобайтовых регистра закреплены за портами 0x60 и 0x64, в первом (0x60) будет лежать скан-код клавиши. Второй порт используется для передачи статуса и комманд порту PS2 (не клавиатуре!). В наборе инструкций архитектуры x86 есть команда IN storeTo, fromPortNum, которая считывает значение из указанного I/O port в указанный регистр. Например IN AL, 0x60 сохранит данные с клавиатуры в регистр AL. Она может работать примерно так:

Как вы теперь понимаете чтение с внешних устройств, даже таких как память RAM с т.зр. CPU достаточно медленное. Эту медлительность можно заметить написав программу которая печатает 10 000 строчек в файл построчно, вместо того чтобы скопить их в буфере и сохранить сразу. Жёсткий диск подключен к Южному мосту и внутри него так же есть контроллер управляющим непосредственным размещением данных.

Оперативная память подключается к CPU через шину и чтение с неё занимает некоторое время. Для ускорения работы CPU у него имеется кэш, т.е. область в которой расположены транзисторы представляющие данные которые скоро понадобятся или часто используются, их чтение происходит гораздо быстрее чем из платы RAM, которая общается с CPU через Северный мост. Оперативная память называется Dynamic Random Access Memory, потому как для представления данных в ней используются конденсаторы. Конденсатор это радиоэлемент который как аккумулятор держит некоторое время заряд пока полностью не разрядится. Только здесь разрядка происходит очень быстро. Поэтому конденсаторы надо перезаряжать, это происходит моментально, достаточно подать напряжение. Заряженный конденсатор — логическая 1, иначе 0. Для памяти кэша используется Static RAM, т.е. её не надо перезаряжать и поэтому она работает быстрее, но стоит дороже. Кэш делится на 3 уровня, которые последовательно проверяются в процессе поиска запрошенных данных, прежде чем процессор обратиться к RAM. На старых процессорах кэш первого уровня (L1) был частью CPU и работал с ним на одной частоте, когда как L2 и L3 кэши были внешними чипами. Сейчас они все находятся на одной микросхеме с процессором. Кэш L1 самый быстрый и самый маленький по объёму памяти, L2 имеет больше памяти но медленнее. L3 самый большой кэш и самый медленный, часто его называют shared cache, потому что он хранит данные для всех ядер CPU, в то время как L1 и L2 созданы для каждого отдельного ядра.

В следующей части поговорим как Windows принимает и обрабатывает полученные данные.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *