что такое контроллер клавиатуры
Анатомия клавиатуры
Устройства ввода играют важнейшую роль в работе с компьютером и играх, поэтому довольно любопытно будет изучить их внутренности. Диапазон цен на клавиатуры сегодня просто огромен, однако их можно отнести к одной из двух широких категорий: мембранным или механическим. Эти понятия описывают систему, используемую для распознавания нажатия клавиш, и начнём мы с первой категории.
Щёлкать иль не щёлкать, вот в чём вопрос
На представленной ниже фотографии показана бюджетная клавиатура, похожая на бесчисленное множество других, используемых сегодня в школах, офисах и дома. Схема расположения её клавиш является почти полной копией классической IBM Model M 102, но это справедливо для большинства современных клавиатур.
И корпус, и отдельные клавиши изготовлены литьём под давлением из АБС-пластика, потому что этот процесс изготовления недорог, а материал слабо подвержен износу.
Работа с клавиатурой даёт полную информацию о том, к какой категории она относится. Полное отсутствие щёлканья и треска при нажатии на клавиши сообщает нам, что это мембранная клавиатура. Ещё одна подсказка — ощущения при нажатии клавиши; несмотря на бюджетность клавиатуры, нажатие ощущается мягким и слабым.
Вскрытие корпуса это подтверждает — первым делом мы видим мягкий слой силикона.
Недостаток такой схемы заключается в отсутствии чёткого указания того, успешным ли было нажатие на клавишу — чтобы понять, нажалась ли клавиша, нужно смотреть на монитор. Для некоторых пользователей притупленность обратной связи становится причиной не пользоваться мембранными клавиатурами.
Благодаря мягкости нажатий клавиатура довольно тиха, поэтому если вы работаете в одном пространстве со множеством людей, клавиатуры такого типа могут оказаться спасением от шума.
Сняв слой силикона, мы увидим набор из трёх пластиковых листов: два создают «контакты переключателей», а третий способствует их разделению, предотвращая ошибочные считывания.
При нажатии клавиши мембраны сдвигаются друг к другу, после чего соединяются и «точки» под клавишей, в результате чего цепь замыкается, и это считывает соответствующий чип.
Если мы пройдём по дорожкам от мембран к небольшой печатной плате, то увидим, что всего есть 26 дорожек. Они выстроены таким образом, что несколько точек находятся на одной дорожке, допустим, у верхней мембраны, но соответствующие точки нижней мембраны расположены на отдельных дорожках.
Это может показаться чересчур сложным, но на самом деле такая система намного проще, чем создание отдельных дорожек для каждой клавиши. В этой модели соединения не прикреплены несъёмно к плате (что позволяет снизить стоимость), поэтому её нужно надёжно прикрепить прижать к мембране, чтобы обеспечить надёжное соединение.
Плата также содержит пару светодиодов, сообщающих о нажатии определённых клавиш, а именно Caps Lock, Num Lock и Scroll Lock.
Перевернув печатную плату, мы увидим чип контроллера. К сожалению, он залит твёрдым пластиком (для герметизации от жидкостей), который невозможно снять, не повредив остальную часть платы.
Чип может быть стандартным микроконтроллером USB HID (human interface device), которых на рынке есть тысячи разновидностей (например, такая).
Подобные типы клавиатур могут работать годами, не вызывая при этом никаких проблем. Когда же они всё-таки возникают, это часто связано с соединяющимися точками — постоянное нажатие и отпускание приводит к их постепенному стиранию, пока, наконец, они не протрутся до такой степени, что не смогут обеспечивать контакт.
После этого остаётся или заменить мембраны, или, как поступает большинство людей, отправить клавиатуру в рай для электроники и купить новую. Но, разумеется, не каждую клавиатуру можно купить за пару долларов и не в каждой используются мембраны.
Механические клавиатуры относятся к другой категории, обычно находящейся на другом крае спектра цен, и на то есть уважительная причина.
На фотографии выше показана механическая клавиатура Corsair K100 RGB, продающаяся по довольно неожиданной цене в 210 долларов. Не все модели такого типа настолько дороги, однако подобный дизайн и набор функций сегодня очень популярен.
Под каждой клавишей расположена отдельная система микропереключателя. В рассматриваемой K100 используются системы, изготовленные знаменитой немецкой компанией Cherry. Переключатели Cherry MX уже приобрели почти легендарную репутацию, но в конечном итоге это всего лишь качественно изготовленные устройства.
Cherry производит широкий ассортимент переключателей, каждый тип имеет свою силу и размер пружин, что обеспечивает разные уровни тактильных ощущений. Также конструкции разнятся в зависимости от того, насколько глубоко нужно нажать клавишу для активации контакта и необходимости создания аудиальной обратной связи.
Из-за наличия подвижных деталей механические клавиатуры обладают отчётливым «стуком». Благодаря использованию переключателей клавиатура становится более надёжной и тактильной по сравнению с мембранными моделями.
Какими бывают механические переключатели?
Современная мода на светодиодную RGB-подсветку в комплектующих PC нравится не всем, однако когда дело касается клавиатур, она обладает определёнными преимуществами: настраиваемая подсветка позволяет выбрать наиболее подходящий пользователю цвет и можно задать комбинацию цветных клавиш (если есть возможность RGB-подсветки каждой клавиши), что бывает полезным в приложениях или играх.
Некоторые клавиатуры можно назвать гибридами, сочетающими в себе механику и мембраны, особенно это относится к ноутбукам. В этих устройствах нет места для полностью механических переключателей, но производители создали конструкции, придающие мембранным клавишам более жёсткую и предсказуемую обратную связь.
Внутри клавиатуры-бабочки Apple
Естественно, это повышает стоимость изготовления, а в случае показанной выше системы Apple могут возникать проблемы, но для многих пользователей добавление механических систем для улучшения ощущений и обратной связи в ноутбучных клавиатурах — желанный результат.
Я не буду подробно рассказывать об эргономических клавиатурах просто потому, что внутри они устроены точно так же, как описанные выше типы. Они отличаются только расположением клавиш на корпусе, а также снижением нагрузки на запястья и предплечья при длительном использовании.
У всех нас есть любимые модели мышей и клавиатур, и наш выбор всегда определяется тем, как продукт ощущается в работе. В основном это относится к внешнему виду, но и внутренности тоже играют свою роль.
На правах рекламы
Виртуальные серверы с новейшим железом, защитой от DDoS-атак и огромным выбором операционных систем. Максимальная конфигурация — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe.
О работе ПК на примере 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 принимает и обрабатывает полученные данные.