NKRO para USB. Problemas e muletas em suas soluções
Olá GT. Em uma das minhas postagens anteriores (em particular, sobre o teclado SteelSeries Apex M800), o usuário monah_tukfez uma pergunta interessante nos comentários: como o NKRO (substituição de teclas n, fixação simultânea de várias teclas) é implementado nos teclados USB. Essa pergunta me interessou, e quando eu me aprofundava um pouco mais ... Em geral, existem estábulos augianos tão grandes que havia informações suficientes para um post inteiro, embora um pouco. Parece que o USB 2.0, mesmo no modo de baixa velocidade, fornece transmissão de até 1500 Kbps (cerca de 185 KB / s), qual é o problema de transmitir pressionamentos de tecla? Mas não é tão simples.
Para descobrir quais problemas a conexão USB tem, teremos que nos aprofundar na história e um pouco no design do teclado.Problemas de rolagem: fantasmas
Digamos que você tenha um teclado com as teclas 104/105 padrão. No caso ideal, para obter informações 100% precisas sobre quais teclas estão presas, você precisará de 1 "fiação" a mais do que os botões: 104/105 fios dos botões e um "terra" comum.Obviamente, essa fiação será difícil e cara, e muitos teclados de baixo custo são usados dentro dos chamados. "Matriz" - um conjunto de contatos horizontais e verticais que se cruzam. O controlador varre cada coluna, detecta um sinal, começa a varrer as “linhas” e calcula a tecla pressionada.Se você pressionar S, G e digitar alguma terceira tecla em uma linha diferente, o controlador não poderá mais dizer qual das linhas foi fechada: na melhor das hipóteses, não detectará uma das três, na pior das hipóteses - de para os recursos de fiação, desenharei outro quarto em que você não clicou. Isso é chamado de fantasma.Esse comportamento é tratado com vários truques no campo da fiação: as combinações mais populares são penduradas em diferentes "linhas"; as linhas de função, que geralmente são elementos de teclas de atalho, recebem linhas separadas. O layout permanece bastante simples, mas teclados não caros raros 5 + KRO - geralmente são limitados a 3-4 enquanto a tecla é pressionada.Além disso, o controlador pode bloquear os "vizinhos" no bloco para remover a operação "extra". Ou seja, formalmente o teclado pode suportar 6KRO e, honestamente, pressione CTRL + AWFBNM ao mesmo tempo, mas não permita que o AWSD seja preso, limitando-se a acionar um tipo WAS ou WDS.Você pode verificar seu teclado com esse tipo de coisa . Tem algumas limitações, mas elas se devem ao fato de o sistema interceptar um pressionamento de botão antes do navegador. Por exemplo, Print Screen ou Alt + Tab funcionará antes que a página possa “pegá-los”.Agora, esse terrível (do ponto de vista do trabalho) sistema "barato" é quase completamente substituído por uma matriz "aberta" um pouco mais complexa, no entanto, ainda são encontradas instâncias, especialmente em todos os tipos de teclados completos de "um dólar" que vão para o computador "de fora" caixas ".Mais caros (geralmente teclados de jogos ou de negócios) usam circuitos mais complexos, vários controladores, conexões individuais, placas de circuito impresso de multicamadas, em geral, várias abordagens que reduzem ou eliminam completamente os fantasmas, mas levam a um aumento no preço do dispositivo. Descobrimos os possíveis problemas de hardware da NKRO, nos voltamos para os de software.Teclados até USB
O principal conector comum para conectar um teclado e mouse ao USB era o PS / 2. Aqui está um exemplo tão arrumado:
seu charme era que, sujeito a todos os padrões, era possível trabalhar com o mouse e o teclado a partir de um conector e divisor, e os próprios dispositivos de entrada geravam uma interrupção e enviavam informações sobre os botões pressionados / movimento do cursor. Lá, pelo menos role o rosto no teclado, se tudo for feito corretamente, e a rolagem não depende dos recursos de hardware do teclado - o teclado enviará tudo o que o controlador “lê”.Infelizmente, o PS / 2 teve suas desvantagens (como problemas com o Plug'n'Play e um conector inconveniente), e a onipresença do USB fez com que os periféricos PS / 2 fossem quase completamente expulsos do mercado. No entanto, existem placas-mãe bastante modernas com USB 3.0 e dois (!) PS / 2:
portas combinadas, a propósito, devido aos recursos de pinagem (fonte de alimentação geral, pinos diferentes para dados + / dados no mouse e teclado), também permitem conectar ambos os dispositivos através de uma porta usando um adaptador:
NKRO Problemas com o USB: o USB HID é o culpado
Para que os teclados USB funcionem antes de carregar o sistema (ou seja, no BIOS / UEFI), é usado o driver HID padrão, desenvolvido para oferecer o suporte mais amplo possível para teclados e hosts USB. A classe USB HID descreve dispositivos para que a implementação padrão do host e dos dispositivos USB possa se comunicar sem a instalação de drivers especiais.Um teclado padrão (projetado com suporte para o padrão USB HID) usa o fluxo de dados de saída (saída do host USB) (ponto final da pilha USB) para obter informações sobre o status dos indicadores (Num / Caps / Scroll Lock) e o fluxo de entrada (proveniente do teclado, “Entrada” para o host USB) para enviar informações sobre as teclas pressionadas.Se você seguir a mais rigorosa especificação USB HID v1.11, que suporta o modo de inicialização USB (e permite que você use um teclado USB para entrar no BIOS e trabalhar nele), o teclado enviará interrupções para a CPU sempre que o host USB o pesquisar , independentemente de sua condição ter mudado ou não. Assim, o trabalho dos teclados PS / 2 é “emulado” com sobrecarga mínima.Nesse caso, o teclado funciona de acordo com o padrão USB 1.1 (às vezes 2.0) de baixa velocidade e a taxa de polling da porta é de 100 Hz. Nesse modo, o tamanho máximo do pacote no USB é de 8 bytes e eles são enviados a cada 10 ms. Um dos bytes é reservado, para que restem 7 bytes para o teclado funcionar, ou seja, a quantidade é suficiente para codificar a pressão de qualquer tecla modificadora e de outras seis.Acontece que o teclado trabalha no modo 6-KRO e é padrão para a maioria dos teclados USB. Fazer menos é possível (às vezes conscientemente, às vezes não, por causa de fantasmas e atolamento de teclas), mais - apenas violando a especificação USB HID.Após o carregamento, o sistema pode aumentar a frequência de busca em uma porta USB, carregar um driver especial que permita, por exemplo, chaves e macros multimídia.Implementações NKRO USB
Ignorar restrições USB HID, de fato, existem dois tipos. No primeiro caso, o teclado é detectado por um software proprietário, transferido para algum modo especial e envia dados do controlador diretamente para o driver, e ele já se comunica com o sistema. O ponto negativo de tal decisão é o aumento dos chamados atraso de entrada: atraso de entrada. Entrevistando conhecidos, encontrei apenas um teclado que me permitia pressionar 10 teclas quando conectado via USB: um substantivo chinês de terry com zakos sob o "jogo". O proprietário já mora em Irkutsk, por isso não é de surpreender que apenas ele tivesse uma coisa dessas.A segunda solução cativa por sua simplicidade e criatividade, mas na verdade é uma muleta:
Obrigado pela captura de tela Myfeargear, uma coisa dessas foi observada no Logitech G710 + Oteclado é simplesmente apresentado ao sistema por vários dispositivos HID, cada um com seu próprio 6KRO. Uma pesquisa rápida com conhecidos solicitando que eles especificassem um modelo de teclado e enviassem uma captura de tela mostrou que a Logitech , A4tech , Cougar e SteelSeries usam esse truque - em geral, todos que encontraram o NKRO na descrição dos teclados USB.Atenção! Antes de verificar o teclado, verifique se não há nenhum mouse USB sofisticado com vários botões conectado (mesmo sem fio). Como toda magnificência de vários botões da mesma maneira pode fingir ser teclados "extras".Conclusão
Na verdade, é tudo. Quase todos os fabricantes escolheram um método de "muleta" que funciona e não cria problemas especiais para o usuário, e o NKRO honesto (bem, relativamente honesto) no USB é possível. Source: https://habr.com/ru/post/pt384797/
All Articles