Привет, GT. В одном из моих прошлых постов (в частности, про клавиатуру SteelSeries Apex M800) юзернейм monah_tuk задал интересный вопрос в комментариях: как реализуется NKRO (n-key rollover, одновременное зажатие нескольких клавиш) в USB-клавиатурах. Данный вопрос меня заинтересовал, а когда я копнул поглубже… В общем, там такие авгиевы конюшни, что на целый пост информации хватило, пусть и небольшой.



Казалось бы, USB 2.0 даже в режиме Low-speed обеспечивает передачу до 1500 КБит в секунду (порядка 185 КБайт/с.), в чём проблема передать нажатия клавиш? Но не всё так просто.

Чтобы разобраться с тем, какие проблемы у USB-подключения, нам придётся покопаться в истории, и немного — в конструкции клавиатуры.

Проблемы rollover’а: ghosting


Допустим, у вас есть клавиатура со стандартными 104/105 клавишами. В идеальном случае, чтобы получить 100% точную информацию о том, какие клавиши зажаты, вам понадобится на 1 «проводок» больше, чем есть кнопок: 104/105 проводов от кнопок, и одна общая «земля».

Разумеется, такая разводка будет сложна и дорога, поэтому многие недорогие клавиатуры применяют внутри т.н. «матрицу» — набор пересекающихся горизонтальных и вертикальных контактов. Контроллер сканирует каждый столбец, обнаруживает сигнал, начинает сканировать «строки» и вычисляет нажатую клавишу.



В случае, если вы нажимаете, скажем, S и G и захотите добавить какую-нибудь третью клавишу в другом ряду, контроллер уже не может сказать, какая из линий была замкнута: в лучшем случае не обнаружит одну из трёх, в худшем — из-за особенностей разводки нарисует ещё какую-нибудь четвёртую, которую вы не нажимали. Это называется ghosting.

Лечится подобное поведение различными хитростями в области разводки: наиболее популярные сочетания вешаются на разные «линии», функциональным клавишам, которые часто являются элементами хоткеев, назначаются отдельные линии. Разводка остаётся достаточно простой, но в недорогих клавиатурах редко встречается 5+KRO — обычно дело ограничивается 3-4 одновременно зажатыми клавишами.

Кроме того, контроллер может блокировать «соседей» по блоку, чтобы убрать «лишние» срабатывания. То есть формально клавиатура может поддерживать 6KRO, и честно давать нажать CTRL+AWFBNM одновременно, но не давать зажать AWSD, ограничиваясь срабатыванием вида WAS или WDS.

Проверить свою клавиатуру вы можете с помощью вот такой штуки. У неё есть некоторые ограничения, но они обусловлены тем, что система перехватит нажатие кнопки раньше, чем браузер. Например, Print Screen или Alt+Tab отработают раньше, чем страничка сможет их «поймать».

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

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

Клавиатуры до USB


Основным распространённым разъёмом для подключения клавиатуры и мышки до USB был PS/2. Вот такой, кругленький:



Его прелесть заключалась в том, что при соблюдении всех стандартов с одного разъёма и разветвителя можно было работать и с мышью, и с клавиатурой, а ещё сами устройства ввода генерировали прерывание и отправляли информацию о нажатых кнопках / перемещении курсора. Там хоть лицом по клавиатуре катайся, если всё разведено грамотно, и rollover не упирается в аппратные возможности клавиатуры — клавиатура отправит всё, что «прочитает» контроллер.

К сожалению, у PS/2 были и недостатки (вроде проблем с Plug’n’Play и неудобного разъёма), да и повсеместное распространение USB привело к тому, что PS/2 периферия была практически полностью вытеснена с рынка. Тем не менее, встречаются вполне современные материнки с USB 3.0 и двумя(!) PS/2:


Комбинированные порты, кстати, благодаря особенностям распиновки (общее питание, разные pin’ы для data+/data- у мыши и клавиатуры), позволяют также подключить оба устройства через один порт с помощью переходника:



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


Для работы клавиатур через USB до загрузки системы (то есть в BIOS / UEFI) используется стандартный HID-драйвер, который был разработан для максимально широкой поддержки клавиатур и USB-хостов. Класс USB HID описывает устройства таким образом, чтобы стандартная реализация USB-хоста и USB-устройства могли взаимодействовать без установки специальных драйверов.

Обычная клавиатура (разработанная с поддержкой USB HID стандарта) использует выходной (исходящий от USB-хоста) поток данных (endpoint USB-стэка) для получения информации о состоянии индикаторов (Num / Caps / Scroll Lock), и входной поток (исходящий от клавиатуры, «входящий» для USB-хоста) для отправки информации о нажатых клавишах.

Если следовать наиболее строгой спецификации USB HID v1.11, которая поддеживает режим USB Boot (и позволяет использовать USB-клавиатуру для входа в BIOS и работы в нём), то клавиатура будет отправлять пррывания на CPU каждый раз, как USB-хост будет опрашивать её, вне зависимости от того, изменилось её состояние или нет. Таким образом «эмулируется» работа PS/2 клавиатур минимальными издержками.

В данном случае клавиатура работает по стандарту USB 1.1 (иногда 2.0) Low-speed, а частота опроса порта составляет 100 Гц. В данном режиме максимальная длина пакета на USB равна 8 байтам, а отправляются они раз в 10 мс. Один из байтов зарезервирован, так что на работу клавиатуры остаётся 7 байт, т.е. количество достаточное, чтобы закодировать нажатие любой клавиши-модификатора и ещё шести других.

Получится, кто клавиатура работает в режиме 6-KRO, и он является стандартным для большинства USB-клавиатур. Сделать меньше — можно (иногда осознанно, иногда — нет, из-за ghosting’а и key jamming’а), больше — только с нарушением спецификации USB HID.

Уже после загрузки система может увеличить частоту опроса USB-порта, загрузить специальный драйвер, который позволит работать, скажем, мультимедийным клавишам и макросам.

Реализации NKRO на USB


Обходы ограничений USB HID, собственно, встречаются двух видов. В первом случае клавиатура обнаруживается фирменным ПО, переводится в какой-нибудь специальный режим и отправляет данные с контроллера напрямую в драйвер, а тот уже общается с системой. Минус такого решения — увеличивается т.н. input lag: задержка ввода. Опросив знакомых, нашёл только одну клавиатуру, которая позволила нажать 10 клавиш при подключении по USB: махровый китайский ноунейм с закосом под «игровую». Владелец живёт аж в Иркутстке, так что не удивительно, что только у него нашлась такая штука.

Второе решение подкупает своей простотой и бесхитростностью, но по сути является костылём:


За скриншот спасибо MyFearGear, такую штуку заметили за Logitech G710+

Клавиатура просто представляется системе несколькими HID-устройствами, каждое из которых имеет свои 6KRO. Беглый опрос знакомых с просьбой указать модель клавиатуры и прислать такой скриншот показал, что этим «хаком» пользуются и Logitech, и A4tech, и Cougar, и SteelSeries — в общем все, у кого нашлось NKRO в описании клавиатур, подключащихся по USB.

Внимание! Прежде чем проверять свою клавиатуру, убедитесь, что у вас не подключена какая-нибудь навороченная многокнопочная USB-мышь (даже по беспроводному каналу). Так как всё многокнопочное великолепие точно так же может притворяться «лишними» клавиатурами.

Заключение


Собственно, на этом всё. Почти все производители выбрали «костыльный», но работающий и не создающих пользователю особых проблем метод, и честный (ну, сравнительно честный) NKRO на USB достижим.

Комментарии (58)


  1. phoenixweiss
    02.10.2015 18:16
    +1

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

    P.S. на клавиатуре 13" MacbookAir mid 2013 не отлавливаются проверкой одновременные нажатия трех клавиш, расположенных не на одной линии. То есть например ASD срабатывает, а WSD уже нет.


  1. NermaN
    02.10.2015 18:39
    +6

    Всегда с беспокойством смотрел на количество клавиатур в диспетчера устройств, теперь ясно в чем дело :)


  1. wormball
    02.10.2015 18:56
    +2

    > В случае, если вы нажимаете, скажем, S и G контроллер уже не может сказать, какая из линий была замкнута: в лучшем случае обнаружит одну из двух, в худшем — из-за особенностей разводки нарисует какую-нибудь третью, которую вы не нажимали. Это называется ghosting.

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

    Вот, даже статья на эту тему есть: http://easyelectronics.ru/matrichnaya-klaviatura.html


    1. mark_ablov
      02.10.2015 19:56
      +3

      Автор не понял источника проблемы, бывает.
      С S и G проблем не будет. А вот если зажать W + S + D (по схеме из статьи), то получиться 4 пересечения (WSDE). Сколько на самом деле нажато кнопок (3 или 4), и каких именно — не определить. Просто W + D не приведут к такой ситуации, хотя тоже будет 4 пересечиня из-за того как происходит процедура сканирования (по колонкам, они открываются последовательно и смотрится состояние строк), то есть открывается строка с W, и на ней активно только W, затем закрывается и открывается строка с D, где тоже только одна клавиша активна. Но если и на строке, и на столбце по 2 активных клавиши, то разрешить это не получится.


      1. mark_ablov
        02.10.2015 19:59

        Вот вроде адекватно и наглядно описано — www.dribin.org/dave/keyboard/one_html


      1. wormball
        02.10.2015 20:12

        Действительно.


    1. Shirixae
      02.10.2015 19:56
      +1

      Контроллеры используются дешёвые, разводка простенькая, прошивку людям писать лень. Я вот, покопавшись, нашёл клавиатуру вполне новую, комплектную к одному девайсу, у неё 2KRO + модификаторы, позволяет зажать только 2 кнопки на двух любых диагоналях, а дальше впадает в ступор.

      image

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

      В случае же с S и G блокируются сразу два лайна, и нажатия в двух других рядах приведут к ещё 4 «замыканиям», которые автоматом будут отсяеяны. Возможно, я неточно выразился в статье, сейчас поправлю описание.


  1. VioletGiraffe
    02.10.2015 20:06

    Logitech G15 (синяя) — 4 клавы в устройствах :)


  1. JetP1L0t
    02.10.2015 22:16

    MBA 11" mid 2013 — дает 6 по горизонтали либо 4 по вертикали в одном ряду, но, если нажаты, например, S+D то в добавок не даст нажать X C W E 2 3, без пересечения по вертикали из «разнесённых блоков» дает зажать до 6 клавиш.


  1. Alexeyslav
    02.10.2015 23:35
    +1

    Странное дело, но эту проблему полностью решают диоды включенные последовательно с каждой кнопкой. Тогда можно обеспечить сканирование ЛЮБЫХ комбинаций.
    Да и вообще не понимаю проблемы разводки 100+ линий под клавиши и организации многоканального мультиплексора(многоразрядный регистр сдвига будет проще схемотехнически) в виде 128-ногого чипа. Это добавит порядка 1..2$ в стоимость клавиатуры и решит все проблемы.
    Но нет же, экономим на деталях чтобы потом героически 20 лет преодолевать проблему нажатия нескольких клавиш…
    Как-то это невольно напоминает зависимость ширины ракетного ускорителя шаттла от размера конской задницы.


    1. Shirixae
      03.10.2015 00:59

      Razer BlackWidow 2014 года имеет честные 6KRO и в системе представляется 1 клавиатурой. При этом у неё 100%-й anto-ghosting, нажимаются любые кнопки. Так что делают, делают. Вопрос в цене. Тут больше речь о том, что есть NKRO заявленный и USB-HID не позволяет больше 6KRO стандартными средствами, но помимо NKRO есть ещё ограничения по ghosting'у у недорогих, в которое упираются раньше, чем в возможности USB.


    1. ibnteo
      07.10.2015 19:11

      На плёнки диоды не поставить, а отводить от каждой кнопки по 2 дорожки к плате контроллера не получится. Лишь в механических клавиатурах ставят диоды на каждую кнопку, у тех же Cherry MX внутри кнопки есть место для диода (или светодиода).


      1. Alexeyslav
        07.10.2015 23:09

        Почему не получится? На плёнке дорожки ведь не вручную рисуют. диоды можно располагать на периферии, и вообще давно ведь существуют гибкие полупроводники.


        1. ibnteo
          08.10.2015 02:31

          Чтобы разместить диоды на периферии, нужно от каждой кнопки дорожку туда провести.

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


  1. forgot10
    02.10.2015 23:40

    И на топовой Logitech G910 механике 3 клавиатуры + 1 «клавиатура» на самом деле мышь (Logitech G600).
    Хотя как по мне, то не стоит это называть «костылем». Это вынужденная необходимость при таком интерфейсе для полной хардварной поддержке стандартными драйверами без использования софтовых «костылей».


  1. monah_tuk
    03.10.2015 04:01
    +1

    Shirixae, большое спасибо! Про матрицу, конечно есть агрехи, но в остальном — хорошая подборка. HID кстати, сильно обширная тема, там дохрена всего. Часто на основе его даже обновления прошивки делают на некоторых девайсах (хотя есть стандартный класс DFU), не говоря уже о весах и прочем оборудовании. Имхо, такая универсальность аукнулась геймерам :)

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


    1. Shirixae
      03.10.2015 14:36

      Собственно, о таком варианте в посте и рассказано, я даже нашёл одну такую клавиатуру.


      1. monah_tuk
        04.10.2015 10:23

        Фразу «фирменное ПО» не связал с драйвером. Но там у вас есть про минус, но если делать драйвер, то просто вмето HID-уровня будет что-то своё. Наличие задержек тут может быть обусловлено только корявыми руками разработчиков.

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


  1. Nicknnn
    03.10.2015 17:45
    +2

    Робот переводчик?

    Если следовать наиболее строгой спецификации 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

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


    1. Alexeyslav
      05.10.2015 09:54

      Это что же получается… нажимаю шифт, ввожу капсом первые 5(6? уникальных?) символов а дальше… облом? Вроде не замечал таких проблем.


      1. monah_tuk
        05.10.2015 10:54
        -1

        А можно Wireshark посмотреть и спеку почитать. Удовольствие изощрённое, но вполне перевариваемое.


      1. Shirixae
        05.10.2015 11:09

        Нет, если вы держите дальше кнопку: Shift + A => Shift + A + S => Shift + A + S +D => и так далее до 5-6 клавиш, то рано или поздно на 6KRO вы упрётесь в HID-спеки и дальше ничего работать не будет, пока вы не отпустите какую-нибудь предыдущую. Но при этом вы можете упереться в хреновую разводку раньше, чем в 6KRO-ограничения USB-HID.


      1. Nicknnn
        05.10.2015 11:12

        При последовательном нажатии всё будет хорошо. Речь про одновременное нажатие клавиш. Мне самому не верилось, что так может быть. Не удержался и нашёл информацию. Всё так, не более 6 клавиш, не модификаторов. Под модификаторы отведён отдельный байт.


    1. monah_tuk
      05.10.2015 10:53

      то клавиатура будет отправлять пррывания на CPU каждый раз, как USB-хост будет опрашивать её

      скорее всего речь шла об interrupt end-point :) что не совсем то, что отправить прерывание на хост. А так да, в USB только хост может инициировать передачу данных. Устройство — нет. Соответственно, что бы быстро опрашивать, нужно быстро поллить, а это циклы CPU. Подробности не читал, но какие-то подвижки есть в USB 3.0, хотя, может, что-то путаю.


      1. Nicknnn
        05.10.2015 11:15

        скорее всего речь шла об interrupt end-point
        Не понял что это. Это дёрганье контроллера клавиатуры? Ну и пусть дёргает, он ведь больше ничем не занимается :)


        1. monah_tuk
          05.10.2015 11:32

          Это различные соглашение по передаче данных USB: bulk endpoint, isochronous endpoint, interrupt endpoint: www.beyondlogic.org/usbnutshell/usb4.shtml


  1. Aclz
    03.10.2015 18:51

    Хм, о том, что у моей клавы, которой идет 17й год, есть какие-то проблемы с отправкой сканкодов комбинаций клавиш, узнал из вашей статьи. Раз так — может оно не так и необходимо?


    1. Shirixae
      03.10.2015 19:25

      Если не мешает — конечно. А так — вдруг будете менять клавиатуру? Сможете убедиться, что новая ведёт себя прилично.


      1. Aclz
        04.10.2015 17:38

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


        1. Alexeyslav
          05.10.2015 09:52

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


          1. Aclz
            05.10.2015 12:19

            Насчет «невозможно вперед и влево» как-то не вяжется с причиной проблем, описанных в статье (что это за разводка там такая убогая может быть?). У меня не работает ровно так, как описано: не работает, например, WAS или WSD (которых в играх ни разу не встречал, даже одновременный WS крайне редок, т.к. его банально неудобно нажать), но работает WAD (который встречается часто, т.к. тут каждая кнопка лежит под своим пальцем).

            Разработчики софта не имеют ничего общего с разработкой средств ввода.
            Ну как не имеют… Если две из двух моих клавиатур обе не отрабатывают WAS, то эта проблема по-любому вылезет и при тестировании у кого-нибудь из тестеров, о чем он зарепортит, и разработчикам потребуется выкручиваться. Что, подозреваю, и происходит IRL.


            1. Alexeyslav
              05.10.2015 13:36

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


  1. Big-Boss
    03.10.2015 20:26

    А почему просто битовую маску клавиатуры не отсылать?

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

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

    ну и т. д.

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

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


    1. mayorovp
      04.10.2015 07:17

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


      1. Alexeyslav
        05.10.2015 09:56

        А в двух? Почему всё ограничено одним пакетом? отвести часть бит под номер пакета…


      1. Big-Boss
        05.10.2015 10:01

        Но 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 работал… Простейший АЦП.


        1. Alexeyslav
          05.10.2015 10:16

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

          Сделать можно очень многое, но очень немногое проходит фильтры на технологичность и дешевизну.
          Можно сделать хенд-мейд клавиатуру с собственным драйвером которая бы была способна держать одновременное нажатие хоть 200 клавиш… и тут ты задумываешься о смысле бытия, смотришь на затраты денежные и временные и офигеваешь во сколько встал этот фетиш… Зато теперь можно нажать все 200 клавиш одновременно.


          1. Big-Boss
            05.10.2015 10:53

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

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

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

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

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

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


            1. monah_tuk
              05.10.2015 11:12

              Значит реализовать 1 клавиатуру как 6 HID устройств не проблема, а тут проблема?

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

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


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

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

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


              1. Big-Boss
                05.10.2015 11:16

                Вы видимо никогда рефлектограммы не видели, в том то и дело, что видит все переотражения (сварка, деформация) на волокне видно.

                Подобный принцип применяется в периметровых системах охраны на коакссиальных кабелях (требоэлектрические).


                1. monah_tuk
                  05.10.2015 11:24

                  Нет, не видел, спасибо за ликбез. В остальном — сведу к ответу в соседней ветке.


                1. Alexeyslav
                  05.10.2015 11:59

                  С разрешением места изгиба в миллиметры? И сколько такой рефлектометр будет стоить? Тут как раз проблема в том что на сотни метров измерять проще чем на миллиметровых расстояниях.


            1. Alexeyslav
              05.10.2015 13:15

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

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

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


        1. monah_tuk
          05.10.2015 10:48

          А что мешает сжимать данные?

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

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

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


          1. Big-Boss
            05.10.2015 11:06

            Ладно, не резисторы.
            Дорожки из резистивного материала. Все равно на пленку какой то состав наносят, причем вероятнее
            практически типографским способом. Пусть он будет резистивным.
            Конечно неудобно, что сопротивление нам нужны разные, но что мешает делать 1, 2, 4 и т. д. параллельных дорожек для
            разных сопротивлений. По моему станку наплевать, что печатать. Одну широкую или 1-11 тонких.


            1. monah_tuk
              05.10.2015 11:21

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

              Да и вообще, внутри клавы проблем нет, почти все уже решены — на PS/2 проблемы NKRO не существует :) Проблема именно в контроллер клавиатуры — хост. HID не позволяет сделать NKRO. HID стандарт, вы можете просто продумать и пропихнуть свой стандарт — и будет счастье геймерам.


        1. mayorovp
          05.10.2015 19:43
          +1

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


          Все проще. Надо было не выдумывать, и остаться на старом протоколе: отдельно события нажатия на клавишу, отдельно события отпускания клавиши. Хватило бы как раз на 128 клавиш.


  1. zzeneg
    03.10.2015 22:58

    Собственно, упоминал о хаке с HID пару лет назад:) Так что все китайские клавы с NKRO тоже его используют.


  1. monah_tuk
    05.10.2015 11:27

    Shirixae, кстати, не узрел или пропустил момент когда клава по USB 6KRO, а через переходник USB-PS/2 — NKRO. В той теме мы обсудили, но хорошо бы иметь и тут эту информацию и, желательно, не на уровне гипотез…


    1. Shirixae
      05.10.2015 11:29

      Я не уверен, что клавиатура, чей контроллер не знает про возможность работы с PS/2, заведётся с переходником. Ну то есть та же BlackWidow Ultimate может просто не работать по PS/2 от слова совсем. Проверю на современных клавиатурах, которые официально никак не помечены на тему работы с PS/2 и отпишусь.


      1. monah_tuk
        05.10.2015 11:38

        Да, было бы неплохо. Ну и возможность закостылить NKRO таким макаром: deskthority.net/wiki/NKRO-over-USB_issues :) от туда же следует, что пассивный переходник позволяет переключить клаву (если есть саппорт? как происходит переключение?) в режим совместимости PS/2, а потом уже использовать «специальный» конвертер из PS/2 в USB, который, в общем случае, может быть и не HID устройством.


      1. monah_tuk
        05.10.2015 11:52

        И вот ещё неплохая подборка для анализа: stenoknight.com/wiki/N-key_rollover и хорошая отсылка от туда: geekhack.org/index.php?topic=37567.msg717750#msg717750


  1. Big-Boss
    05.10.2015 13:28

    Ну что же, хорошая дискуссия получилась.
    В очередной раз убеждаюсь, что жестянщиков, программеров и «эффективных» менеджеров
    к написанию ТЗ и разработке пользовательских интерфейсов нельзя подпускать на пушечный выстрел.


    1. monah_tuk
      05.10.2015 14:28

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


      1. vorphalack
        06.10.2015 04:52

        тут скорее вопрос, как правильно пририсовать тесты на регресс при принятии очередного стандарта, чтоб не ВСПЛЫЛО через пару лет, как в данном случае.


        1. monah_tuk
          06.10.2015 06:44

          А всё равно всплывёт. Какая бы архитектура ни была, рано или поздно появятся запросы, которые на неё положиться не смогут без костыляк и подпорок. Да просто учесть все нюансы… Да можно попытаться, но стандарты будут появляться как в самолётостроении :)


  1. Big-Boss
    05.10.2015 17:24

    Кого? Того кто может!

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

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

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

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

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


    1. monah_tuk
      06.10.2015 06:42

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


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

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


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

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


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