Мы переделываем клавиатуры «под себя», мечтаем об «идеальном протоколе», но на текущий момент мы вынуждены базироваться на стандартном, общепринятом во всех ОСях клавиатурном протоколе.
И, чтобы заставить нашу кастомную клавиатуру работать так, как нам хочется — нужно знать, как компьютер (аппаратно) и ОСь (программно) взаимодействует с клавиатурой.
Кстати, для ознакомления рекомендую культовую книгу «Библия по техническому обеспечению Уинна Роша» — он очень подробно описывает работу аппаратной части компьютера, а ведь с тех пор клавиатура осталась прежней (добавили клавиши Win и Menu, а также Power и Multimedia), только что используется разъём USB.
Итак, формулирую нарочито упрощённо, подробнее — в «Библии».
Каждая клавиша на клавиатуре (далее имеется в виду СК — Стандартная Клавиатура) имеет свой уникальный скан-код. Дублированные клавиши имеют так называемый расширенный скан-код (кроме Shift).
Некоторые клавиши имеют очень расширенный скан-код (Pause и PrtScr).
Клавиша генерирует два скан-кода — нажатия и отпускания (кроме Pause).
Код отпускания — это тот же скан-код клавиши, только с установленным «старшим» двоичным разрядом в лог. единицу. Кстати, при пропуске этого кода и получаются программные «залипания» клавиш…
Лирическое отступление: все эти KC_A и подобное в QMK — это всего-навсего алиасы, псевдонимы, «человеческие» названия скан-кодов для удобства человека-программиста. Их может быть несколько для обозначение одной и той же клавиши, в зависимости от замысла автора.
Любая клавиша всегда выдаёт одинаковый код, вне зависимости, нажата ли какая-либо другая клавиша (типа CapsLock, Alt или Shift).
Контроллер клавиатуры (а в клавиатуре, даже самой «тупой», установлен полноценный компьютер — микроконтроллер, который работает по зашитой в него программе) передаёт скан-коды клавиш по последовательному протоколу в компьютер, который принимает их через специальные аппаратные порты (60h, 61h и 64h для PS/2, подозреваю, что и по USB коды попадают в тот же порт, «для совместимости»).
Операционная система (ОСь) получает скан-коды и в соответствии с программой интерпретирует их.
Скажем клавиши буквенно-цифрового, основного блока клавиатуры, «прогоняются» ещё и через специальный файл так называемой «раскладки». Управляющие клавиши, модификаторы, а также кнопки и цифры на NumPad-е (кроме точки) софтовой раскладкой не изменяются. Но! Цифры и стрелки на NumPad-е «превращаются друг в друга» при удержании Shift-а (он, получается, «работает» «быстрым» NumLock-ом).
Раскладки (софтовые, здесь только их имеем в виду — и да, я работаю только с Windows, в других ОСях могут быть ньюансы) содержат соответствие клавиш буквам-цифрам-символам, скажем QWERTY или QWERTZ, или даже ЙЦУКЕН). Для каждого языка, как правило, имеется несколько вариантов раскладок (иногда в своей «самостийности», люди доходят до смешного, переходя с кириллицы на латиницу, причём, кустарно разработанную и не подходящую для ихого языка), имеются также так называемые «международные» раскладки, совмещающие в себе несколько языков, как правило, базирующихся на одном алфавите (к примеру, латинском, но с умляутами и прочими циркумфлексами, не к ночи будет сказано).
Раскладок в ОСи может быть одновременно установлено несколько (очевидно, жителям США, в подавляющем большинстве, это не нужно, т. к. базовая латиница охватывает все их ну́жды), их можно оперативно переключать (обычно переключение происходит «по кругу», хотя можно настроить и другие варианты), на компьютерах русскоязычных пользователей, как правило, установлено две раскладки. Стандартными раскладками в нашем случае считаются «Русская» и «Английская (США)».
Одновременно может быть включена только одна раскладка, так что, «напечатать» (ввести с клавиатуры) символ или букву, отсутствующие в текущей раскладке невозможно (точнее, возможно, но «через зад», способом, разным для разных ОС).
Протокол взаимодействия клавиатуры и компьютера (ОСи) как бы двухсторонний, но клавиатура может посылать только скан-коды клавиш, а компьютер может послать коды включения и выключения светодиодов (трёх для «наших» клавиатур и пяти, кажется, для азиатских).
И да, клавиатура (да и любое устройство USB) может «прикинуться» любым устройством — хоть мышкой, хоть накопителем, хоть вообще неким «прибором» (это используется, видимо, для настройки «заводских» так называемых «игровых», программируемых, клавиатур).
Также для преодоления ограничения в шесть одновременно нажатых клавиш 6KRO клавиатура может «прикинуться» двумя клавиатурами (NKRO, неограниченное кол-во одновременно нажатых клавиш).