Pull to refresh

Comments 59

Шикарная статья!

P.S. на клавиатуре 13" MacbookAir mid 2013 не отлавливаются проверкой одновременные нажатия трех клавиш, расположенных не на одной линии. То есть например ASD срабатывает, а WSD уже нет.
Всегда с беспокойством смотрел на количество клавиатур в диспетчера устройств, теперь ясно в чем дело :)
> В случае, если вы нажимаете, скажем, S и G контроллер уже не может сказать, какая из линий была замкнута: в лучшем случае обнаружит одну из двух, в худшем — из-за особенностей разводки нарисует какую-нибудь третью, которую вы не нажимали. Это называется ghosting.

Я один не понимаю, как такое может произойти? Вертикальные-то линии разные, так что никаких проблем с распознаванием быть не должно. Ежели бы такая проблема была, то клавиатура бы вообще не могла отличить S от G, а заодно бы не смогли работать мониторы, тачскрины и цифровые фотоаппараты. Ибо во всех в них принцип аналогичен. Что-то мне подсказывает, что здесь какая-то маркетинговая собака порылась.

Вот, даже статья на эту тему есть: http://easyelectronics.ru/matrichnaya-klaviatura.html
Автор не понял источника проблемы, бывает.
С S и G проблем не будет. А вот если зажать W + S + D (по схеме из статьи), то получиться 4 пересечения (WSDE). Сколько на самом деле нажато кнопок (3 или 4), и каких именно — не определить. Просто W + D не приведут к такой ситуации, хотя тоже будет 4 пересечиня из-за того как происходит процедура сканирования (по колонкам, они открываются последовательно и смотрится состояние строк), то есть открывается строка с W, и на ней активно только W, затем закрывается и открывается строка с D, где тоже только одна клавиша активна. Но если и на строке, и на столбце по 2 активных клавиши, то разрешить это не получится.
Контроллеры используются дешёвые, разводка простенькая, прошивку людям писать лень. Я вот, покопавшись, нашёл клавиатуру вполне новую, комплектную к одному девайсу, у неё 2KRO + модификаторы, позволяет зажать только 2 кнопки на двух любых диагоналях, а дальше впадает в ступор.

image

Посмотрите на картинку. Если зажать одновременно S и R, то пересекутся ещё два лайна в буквах W и F. Они автоматически в дешёвых клавиатурах будут заблокированы, т.к. определить их нажатие / отпускание будет затруднительно.

В случае же с S и G блокируются сразу два лайна, и нажатия в двух других рядах приведут к ещё 4 «замыканиям», которые автоматом будут отсяеяны. Возможно, я неточно выразился в статье, сейчас поправлю описание.
MBA 11" mid 2013 — дает 6 по горизонтали либо 4 по вертикали в одном ряду, но, если нажаты, например, S+D то в добавок не даст нажать X C W E 2 3, без пересечения по вертикали из «разнесённых блоков» дает зажать до 6 клавиш.
Странное дело, но эту проблему полностью решают диоды включенные последовательно с каждой кнопкой. Тогда можно обеспечить сканирование ЛЮБЫХ комбинаций.
Да и вообще не понимаю проблемы разводки 100+ линий под клавиши и организации многоканального мультиплексора(многоразрядный регистр сдвига будет проще схемотехнически) в виде 128-ногого чипа. Это добавит порядка 1..2$ в стоимость клавиатуры и решит все проблемы.
Но нет же, экономим на деталях чтобы потом героически 20 лет преодолевать проблему нажатия нескольких клавиш…
Как-то это невольно напоминает зависимость ширины ракетного ускорителя шаттла от размера конской задницы.
Razer BlackWidow 2014 года имеет честные 6KRO и в системе представляется 1 клавиатурой. При этом у неё 100%-й anto-ghosting, нажимаются любые кнопки. Так что делают, делают. Вопрос в цене. Тут больше речь о том, что есть NKRO заявленный и USB-HID не позволяет больше 6KRO стандартными средствами, но помимо NKRO есть ещё ограничения по ghosting'у у недорогих, в которое упираются раньше, чем в возможности USB.
На плёнки диоды не поставить, а отводить от каждой кнопки по 2 дорожки к плате контроллера не получится. Лишь в механических клавиатурах ставят диоды на каждую кнопку, у тех же Cherry MX внутри кнопки есть место для диода (или светодиода).
Почему не получится? На плёнке дорожки ведь не вручную рисуют. диоды можно располагать на периферии, и вообще давно ведь существуют гибкие полупроводники.
Чтобы разместить диоды на периферии, нужно от каждой кнопки дорожку туда провести.

Если диоды будут гибкими, то боюсь это сильно скажется на стоимости клавиатуры, на механических переключателях клавиатуры стоят довольно дорого, по сравнению с плёночными.
И на топовой Logitech G910 механике 3 клавиатуры + 1 «клавиатура» на самом деле мышь (Logitech G600).
Хотя как по мне, то не стоит это называть «костылем». Это вынужденная необходимость при таком интерфейсе для полной хардварной поддержке стандартными драйверами без использования софтовых «костылей».
Shirixae, большое спасибо! Про матрицу, конечно есть агрехи, но в остальном — хорошая подборка. HID кстати, сильно обширная тема, там дохрена всего. Часто на основе его даже обновления прошивки делают на некоторых девайсах (хотя есть стандартный класс DFU), не говоря уже о весах и прочем оборудовании. Имхо, такая универсальность аукнулась геймерам :)

Кстати, вполне реально делать композитное устройство на клавиатуре (несколько HID так и сделано), представлять HID устройство (для совместимости) и своё, вендор-устройство, поддерживаемое своим драйвером — при инициализации, работа HID останавливается ну и дальше — работает свой драйвер. Минусы такого решения: более дорогая разработка и поддержка, нужно обеспечивать драйвер на разные системы (ну если разработчик руковдствует правилом: клава игровая, игры только под Windows, то драйвер нужен только для Windows :)).
Собственно, о таком варианте в посте и рассказано, я даже нашёл одну такую клавиатуру.
Фразу «фирменное ПО» не связал с драйвером. Но там у вас есть про минус, но если делать драйвер, то просто вмето HID-уровня будет что-то своё. Наличие задержек тут может быть обусловлено только корявыми руками разработчиков.

Пример… правда не с клавиатурами, а с UVC и non-UVC (свой драйвер, и да, не рекламы ради): эпифановские грабберы DVI2USB3 и AVio HDMI — первый — свой драйвер для захвата видео, второй — UVC + UAC. Разница для конечного пользователя только в том, что для второго не нужно ставить драйвера. А по итогу доступ всё равно через подсистему DirectShow или Video4Linux2. С клавиатурами, думается, тоже самое: на винде не знаю какая подсистема, на линухе просто представиться evdev.
Робот переводчик?
Если следовать наиболее строгой спецификации USB HID v1.11, которая поддеживает режим USB Boot (и позволяет использовать USB-клавиатуру для входа в BIOS и работы в нём), то клавиатура будет отправлять пррывания на CPU каждый раз, как USB-хост будет опрашивать её, вне зависимости от того, изменилось её состояние или нет.
Суть текста в том, что в usb только хост может инициировать передачу данных. По этому CPU приходится постоянно просить USB прочитать данные с клавиатуры.

Один из байтов зарезервирован, так что на работу клавиатуры остаётся 7 байт, т.е. количество достаточное, чтобы закодировать нажатие любой клавиши-модификатора и ещё шести других.
Тут совершенно ничего не ясно. Ведь PS/2 также посылает байты с кодами, суть последовательный порт. Проблема протокола HID в том, что он шлёт пакеты состояний 6 клавиш вместо сообщений о нажатии, как в PS/2.
Проще понять на примере:
  • нажали навишу «a», пришёл пакет: 00 39 00 00 00 00 00
  • отпустили «a», пришёл пакет: 00 00 00 00 00 00 00
  • нажали «a» и «b», пришёл пакет: 00 39 40 00 00 00 00
  • отпустили «a», «b» держим, пришёл пакет: 00 00 40 00 00 00 00

То-есть позиция сохраняется. По этому при нажатии седьмой клавиши, не модификатора, для неё не будет места и сучится неизвестное состояние. Для него кстати есть специальный пакет.
Отдельный вопрос нафига так? Возможно из-за желания сэкономить циклы процессора на опрос.
Это что же получается… нажимаю шифт, ввожу капсом первые 5(6? уникальных?) символов а дальше… облом? Вроде не замечал таких проблем.
А можно Wireshark посмотреть и спеку почитать. Удовольствие изощрённое, но вполне перевариваемое.
Нет, если вы держите дальше кнопку: Shift + A => Shift + A + S => Shift + A + S +D => и так далее до 5-6 клавиш, то рано или поздно на 6KRO вы упрётесь в HID-спеки и дальше ничего работать не будет, пока вы не отпустите какую-нибудь предыдущую. Но при этом вы можете упереться в хреновую разводку раньше, чем в 6KRO-ограничения USB-HID.
При последовательном нажатии всё будет хорошо. Речь про одновременное нажатие клавиш. Мне самому не верилось, что так может быть. Не удержался и нашёл информацию. Всё так, не более 6 клавиш, не модификаторов. Под модификаторы отведён отдельный байт.
то клавиатура будет отправлять пррывания на CPU каждый раз, как USB-хост будет опрашивать её

скорее всего речь шла об interrupt end-point :) что не совсем то, что отправить прерывание на хост. А так да, в USB только хост может инициировать передачу данных. Устройство — нет. Соответственно, что бы быстро опрашивать, нужно быстро поллить, а это циклы CPU. Подробности не читал, но какие-то подвижки есть в USB 3.0, хотя, может, что-то путаю.
скорее всего речь шла об interrupt end-point
Не понял что это. Это дёрганье контроллера клавиатуры? Ну и пусть дёргает, он ведь больше ничем не занимается :)
UFO just landed and posted this here
Если не мешает — конечно. А так — вдруг будете менять клавиатуру? Сможете убедиться, что новая ведёт себя прилично.
UFO just landed and posted this here
Ничего подобного. Разработчики софта не имеют ничего общего с разработкой средств ввода. И дешевая клавиатура — это проблема пользователя и только пользователя.
Даже на дешевых клавиатурах клавиши-модификаторы работают независимо от остальной матрицы и большая часть комбинаций с модификаторами проходит безболезненно, НО играть на таких клавиатурах становится невозможно — банально нажатие кнопок «вперёд» и «влево» могут уже привести к проблеме(где-то я уже слышал о такой проблеме очень давно: кому-то в офис закупили партию таких клавиатур и таким образом частично решили проблему игр на рабочем месте).
UFO just landed and posted this here
Скажем так, нищебродство пользователя не проблема разработчиков… некоторые могут учитывать проблемы дешевых клавиатур, но в конечном итоге это оказывается слишком дорогим удовольствием и становится самой последней проблемой которую они будут решать.
А почему просто битовую маску клавиатуры не отсылать?

Допустим у нас 5-и кнопочная клавитатура:

00001 — 5-я клавиша
01001 — 2-я + 5я

ну и т. д.

7-байт = 56бит. Т.е. можно передать состояние 56 клавиш.
Почему в 7 байтов помещается только 6 + клавиша модификатор?

Понятно, что 56 клавиш маловато, но это и не 6 штук.

Потому что в клавиатуре более сотни клавиш. Битовая маска не сможет закодировать состояние всех клавиш клавиатуры в одном пакете.
А в двух? Почему всё ограничено одним пакетом? отвести часть бит под номер пакета…
Но 56 лучше же чем 6?

А что мешает сжимать данные?
Пусть клавиш 128 штук (с запасом, больше 115 не видел), соответственно 128 бит. У нас ограничение 8 байт, а нужно отдать 16
но одновременно на клавиатуре осознанно можно нажать10 клавиш. Даже пускай 20.
Соответственно в цепочке 128 нулей будет всего 10-20 единиц. Неужели в таком случае коэффициент сжатия будет менее 50%?

И еще по поводу клавиатурной матрицы:
Что мешает на клавиши добавить резисторы?
Например 11 клавиш в строке, резисторы соответственно 1,2,4,8,16,32,64,128,256,512,1024 кОм.
Столбцов тоже 11, но там резисторы уже не нужны.
Получаем 11 каналов строк на которых можем вычислить любые комбинации.
На таком принципе Covox для LPT работал… Простейший АЦП.

А кто это будет реализовывать в стандарте HID, что делать с тоннами старых железок? Резисторы… это не технологично, их надо будет на производстве дополнительно еще и калибровать, потом вылезут ещё одни проблемы — из-за ухудшения качества контакта(металл в клавиатурах уже давно не используется) со временем и будут вылазить ошибки распознавания зависящие от силы нажатия на кнопку. Гораздо технологичней в этом плане просто параллельный ввод — каждой кнопке по одной линии и через регистр сдвига(или параллельные регистры, мультиплексоры) в контроллер. Но даже это решение несколько дороже тупой матрицы кнопок.

Сделать можно очень многое, но очень немногое проходит фильтры на технологичность и дешевизну.
Можно сделать хенд-мейд клавиатуру с собственным драйвером которая бы была способна держать одновременное нажатие хоть 200 клавиш… и тут ты задумываешься о смысле бытия, смотришь на затраты денежные и временные и офигеваешь во сколько встал этот фетиш… Зато теперь можно нажать все 200 клавиш одновременно.
Значит реализовать 1 клавиатуру как 6 HID устройств не проблема, а тут проблема?
Возможно, я не владею данными знаниями, но что за грабли каждый раз?
То больше 640кБ оперативки без HIMEM не задействуешь, то с объемом хардов больше 128мб свистопляска была,
теперь IP-V4 закончился, что за недальновидность?

Что нужно калибровать при допуске +/1 0,5 кОм? Это сопротивление не одной сотни метров провода!

Хорошо, предлагаю другую дешевую аппаратную реализацию:

1. Под клавишами проходит оптоволокно.
2. Нажатие на клавишу сгибает волокно.
3. Рефлектометр замеряет длину до каждой деформации.
Все вышеперечисленное возможно и с коаксиальным кабелем.

Все затраты — 2-3 метра волокна, корпус и подвижные клавиши.

Рефлектометр конечно штука не дешевая, но нам и не нужно стрелять на километры.
2-3 метра вполне достаточно. При массовом производстве будет дешевле. Можно реализовать на материнке.
Значит реализовать 1 клавиатуру как 6 HID устройств не проблема, а тут проблема?

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

Возможно, я не владею данными знаниями, но что за грабли каждый раз?
То больше 640кБ оперативки без HIMEM не задействуешь, то с объемом хардов больше 128мб свистопляска была,
теперь IP-V4 закончился, что за недальновидность?


в определённый момент развития технологии существуют объективные причины сделать что-то так или иначе. Либо неизвестно как, и тогда принимается что-то с воздуха. Помимо этого, не всегда удаётся всё предусмотреть (привет разработка софта и изменчивые требования!): что-то решается без проблем, что-то малой кровью, что-то не сильно тривиально и прямо.

Хорошо, предлагаю другую дешевую аппаратную реализацию:

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

Подобный принцип применяется в периметровых системах охраны на коакссиальных кабелях (требоэлектрические).
Нет, не видел, спасибо за ликбез. В остальном — сведу к ответу в соседней ветке.
С разрешением места изгиба в миллиметры? И сколько такой рефлектометр будет стоить? Тут как раз проблема в том что на сотни метров измерять проще чем на миллиметровых расстояниях.
Это наоборот более дорогая реализация, еще и нестабильная. Мало того что на миллиметрах нужно вылавливать изменения отражения(где-то надо хранить карту «дефектов», измеренного и предыдущего состояния волокна и так по 16...24 линиям, или одно волокно пустить под всеми клавишами? ото завитушки будут под компактными клавиатурами...), так еще работа клавиатуры будет сильно зависеть от силы нажатия на кнопку.

Нет, пожалуй регистры это сильно дешевле, технологичней и стабильней.

Да и проблеме не в том как реализовать, а в том как сделать это стандартно.
Вот представьте себе зафигачили такую клавиатуру, пробили под неё стандарт… втыкаете в компьютер а он вам «нужен драйвер, до свидания».
Втыкаете в специфическую железку 2000-го года, а она вам болт… кто под неё будет писать реализацию нового стандарта? Да даже в современном железе поддержка нового стандарта будет не сразу, а только лет через 5 пока пройдут все круги ада. В итоге, клёвая клавиатура будет пылится в углу магазинов как геймерская с ограниченной поддержкой железа… типа виндовс-онли(ну ладно запилят на линукс года через два, и то если пойдет в массы).
Сила стандартов порой очень велика, и продвинуть новый стандарт в замен старого ой как непросто, когда тот укоренился в железе.
Я вот даже сейчас встречаю компы которые не имеют поддержки USB-клавиатур в БИОС-е.
А что мешает сжимать данные?

Ничто не мешает. Только спека HID. Ещё (!!!) встречаются мамки в работе, в которых не работает USB-клава в BIOS. Т.е. если сделать что-то новое, то оно ещё должно стандартизироваться и устаканиться. Мы делаем USB 3.0 UVC устройство, столько уже всякого непрятного наелись.

Что мешает на клавиши добавить резисторы?

цент на 1 резистор выльется уже в 1 доллар (примерно) на клаву, а теперь прикиньте массое производство. Удешевлять патаются на всём, что только можно. Плюс более сложная логика (читать: больше багов) в обработке. За примером далеко ходить не нужно: купил механику, а там, при выключенной подстветке определённый набор клавиш перестаёт работать. Причём воспроизводится не на всех контроллерах и не всегда на одном и том же. Благо в магазине согласились без вопросов обменять.
Ладно, не резисторы.
Дорожки из резистивного материала. Все равно на пленку какой то состав наносят, причем вероятнее
практически типографским способом. Пусть он будет резистивным.
Конечно неудобно, что сопротивление нам нужны разные, но что мешает делать 1, 2, 4 и т. д. параллельных дорожек для
разных сопротивлений. По моему станку наплевать, что печатать. Одну широкую или 1-11 тонких.
Скорее всего с плёнками, как и с печатными платами. Сначала полностью клеют, потом травят (честно, не знаю как в больших производствах), а это изменение технологии. А как быть с механическими клавиатурами? Собственно, они, в большей части, позиционируются как игровые и там наиболее актуален вопрос NKRO. Для плёнок это даже и не вопрос. Вам часто в обычно работе мешает ограничение 6 клавиш? А это, кстати, ещё один аргумент — если большинство устраивает, то зачем что-то менять? Ведь это потребует дополнительных затрат.

Да и вообще, внутри клавы проблем нет, почти все уже решены — на PS/2 проблемы NKRO не существует :) Проблема именно в контроллер клавиатуры — хост. HID не позволяет сделать NKRO. HID стандарт, вы можете просто продумать и пропихнуть свой стандарт — и будет счастье геймерам.
А что мешает сжимать данные?
Пусть клавиш 128 штук (с запасом, больше 115 не видел), соответственно 128 бит. У нас ограничение 8 байт, а нужно отдать 16
но одновременно на клавиатуре осознанно можно нажать10 клавиш. Даже пускай 20.
Соответственно в цепочке 128 нулей будет всего 10-20 единиц. Неужели в таком случае коэффициент сжатия будет менее 50%?


Все проще. Надо было не выдумывать, и остаться на старом протоколе: отдельно события нажатия на клавишу, отдельно события отпускания клавиши. Хватило бы как раз на 128 клавиш.
Собственно, упоминал о хаке с HID пару лет назад:) Так что все китайские клавы с NKRO тоже его используют.
Shirixae, кстати, не узрел или пропустил момент когда клава по USB 6KRO, а через переходник USB-PS/2 — NKRO. В той теме мы обсудили, но хорошо бы иметь и тут эту информацию и, желательно, не на уровне гипотез…
Я не уверен, что клавиатура, чей контроллер не знает про возможность работы с PS/2, заведётся с переходником. Ну то есть та же BlackWidow Ultimate может просто не работать по PS/2 от слова совсем. Проверю на современных клавиатурах, которые официально никак не помечены на тему работы с PS/2 и отпишусь.
Да, было бы неплохо. Ну и возможность закостылить NKRO таким макаром: deskthority.net/wiki/NKRO-over-USB_issues :) от туда же следует, что пассивный переходник позволяет переключить клаву (если есть саппорт? как происходит переключение?) в режим совместимости PS/2, а потом уже использовать «специальный» конвертер из PS/2 в USB, который, в общем случае, может быть и не HID устройством.
Ну что же, хорошая дискуссия получилась.
В очередной раз убеждаюсь, что жестянщиков, программеров и «эффективных» менеджеров
к написанию ТЗ и разработке пользовательских интерфейсов нельзя подпускать на пушечный выстрел.
А кого? Особенно как осадить аппетиты которые невозможно реализовать, но станет возможно лет через 5-10-25-100?
тут скорее вопрос, как правильно пририсовать тесты на регресс при принятии очередного стандарта, чтоб не ВСПЛЫЛО через пару лет, как в данном случае.
А всё равно всплывёт. Какая бы архитектура ни была, рано или поздно появятся запросы, которые на неё положиться не смогут без костыляк и подпорок. Да просто учесть все нюансы… Да можно попытаться, но стандарты будут появляться как в самолётостроении :)
Кого? Того кто может!

Джобс что? Применил инопланетные технологии? Ничего необычного в iPhone 1-м не было, просто сделал доступно для
не компьютерных людей. Все просто, понятно, без замороченных меню и без видимой файловой системы, чего чайникам и не нужно.

Меня например всегда убивает в андроиде обилие непонятно кем когда и зачем созданных папок на карте памяти,
при том, что и без карты аппарат вполне работает обходясь внутренней. Тогда зачем так засирать карточку!
И вообще, зачем мне как обычному пользователю видеть папки типа DEV, ETC, MNT и пр.?
Для метя телефон/планшет/компьютер — это инструмент а не предмет для ковыряния. Мне наплевать из чего
и по какой технологии сделан замок в моих дверях. Я им просто пользуюсь и меня все устраивает.
А если из него будут торчать наружу всякие элементы механизма, он меня не устроит.

>А кого? Особенно как осадить аппетиты которые невозможно реализовать, но станет возможно лет через 5-10-25-100?

О каких аппетитах речь? В конце 20 века невозможно было передать лишний десяток байт?

П. С. Айфонами не пользуюсь принципиально. Мне нужно все и сразу, и пока альтернативы нет.
Лучше на костылях, но на свободе, чем на Феррари, но по тоннелю из которого не свернуть.

Джобс что? Применил инопланетные технологии? Ничего необычного в iPhone 1-м не было, просто сделал доступно для
не компьютерных людей. Все просто, понятно, без замороченных меню и без видимой файловой системы, чего чайникам и не нужно.


ок. для некомпьютерных людей проблемы NKRO нет вообще :) это раз. Два, для нуждающихся — есть «изящный хак» с несколькими HID устройствами. Думаешь iPhone, в угоду «некомпьютерным людям» всё сделано плавильно и без костылей. Ну-ну. Спроси разработчиков под него. Но, что с клавами, что с айфонами — выхлоп один: оно тупо работает.

О каких аппетитах речь? В конце 20 века невозможно было передать лишний десяток байт?


Когда проектировался HID был только USB 1.0 и мода LowSpeed, для interrupt endpoint в таком режиме возможна передача только 8 бит, дальше могут ехать тайминги и т.п. плюс большая нагрузка на CPU. Любая технология — набор компромиссов. Я разработчик USB устройств, меня тоже иногда шокирует от принятых решений комитетом, но при детальных разборах оказывается, что, по большей части, они оказываются или оказывались технически обоснованными.

П. С. Айфонами не пользуюсь принципиально. Мне нужно все и сразу, и пока альтернативы нет.
Лучше на костылях, но на свободе, чем на Феррари, но по тоннелю из которого не свернуть.


Ну так… не можете изменить ситуацию — измените отношение к ней. Любая экспрессия на форумах никогда и ни за что не сдвинет что-то в нужном вам направлении. Можете сделать свою сборку на базе андроида, где всё, как нужно вам :) Китайцы вон вообще штампуют «смартфоны» с непонятно чем внутри, но что выглядит как андроид. Они просто делают.

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


И теперь я могу утверждать:


Проблемы NKRO на USB: во всём виноват USB HID

не совсем правда.


Вы правильно рассказали про HID Boot Protocol. В этом режиме хост не считывает HID дескриптов и делает предположение, что используется стандартный формат посылки — чисто для упрощения кода и что бы не писать парсер для HID дескриптора (а полный — очень сложный). Отсюда и лимиты на 6 клавиш.


Стандартный (а не специальный!) драйвер HID в OS уже работает по дефолтному протоколу HID Report Protocol, который предусматривает то, что драйвер считывает HID дескриптор и разбирает его. Так вот, сделать там можно любое количество клавиш. А 1024 (1023 точнее + модификаторы) могут влезть даже в одну посылку в режиме High Speed / Super Speed или до 63(+1) в режиме Full Speed. Хотя завязки на размер посылки-то и нет. Но как правило хорошего тона — вполне.


Судя по всему беда как раз в самой популярной и дружественной ОС: Windows. Даже могу предположить, что в XP, когда, в основном и пошёл бум USB клавиатур. Судя по всему она не обрабатывает посылки больше 8 байт и, по сути, работает в Boot протоколе. Проверить сейчас не могу — нет такой оси.


Косвенно подтверждается это тем, что буквально на днях "изобрёл" очередной BadUSB, который валит последние версии Windows (8, 8.1 и 10) в BSOD: https://htrd.su/wiki/zhurnal/2017/04/24/ideja_dlja_badusb.


Создаётся впечатление, что в драйверах используются фиксированные буфера или что-то захардкожено.


ЗЫ Если на проекте останется время, попытаюсь сделать дескприптор клавиатуры, который сможет послать 63 клавиши одновременно и проверю на Win8/10/Linux.

Sign up to leave a comment.