quarta-feira, 21 de maio de 2014

Emulador de teclado genérico - Parte 2

Parte 2: Teclados de PC

Existem dezenas de páginas sobre o funcionamento dos teclados de PC, portanto vou fazer apenas um resumo do funcionamento. Quem quiser saber mais detalhes pode consultar alguns links no final deste post.

Os teclados de PC também possuem matrizes de linhas e colunas, porém eles contam com um microcontrolador dedicado para cuidar da varredura da matriz e prover de forma serial as informações sobre o estado das teclas.

Em linhas gerais, quando uma tecla é pressionada controlador do teclado transmite um código correspondente à tecla, o chamado 'make code'. Quando a tecla é liberada, é enviado um código (0xf0) em seguida do código da tecla que foi liberada, o chamado 'break code'.

Exemplo: ao se pressionar a tecla 'A' o teclado envia o valor 0x1C. Quando se solta a tecla 'A', o teclado envia o valor 0xF0 e em seguida o valor 0x1C

Existem também as teclas chamadas estendidas, cujo 'make code' é precedido pelo valor 0xE0, como por exemplo as teclas de cursor. De modo semelhante, o 'break code' desta tecla é precedido pelo valor 0xE0

Exemplo: Ao se pressionar a seta para cima, o teclado envia o valor 0xE0 e em seguida o valor 0x75. Quando se solta a tecla para cima, o teclado envia os valores 0xE0, 0xF0, 0x75.

Por último existem as teclas 'alienígenas' que são o 'Print Screen' e o 'Pause/Break'.

O 'make code' do Print Screen é composto por 5 caracteres 0xE0, 0x12, 0xE0, 0x7c e o 'break code' é composto de 0xE0, 0xF0, 0x7C, 0xE0, 0xF0, 0x12

Já o Pause/Break é o mais bizarro de todos, porque não possui 'break code'. Em vez disso, quando se pressiona esta tecla o teclado transmite simplesmente 0xE1, 0x14, 0x77, 0xE1, 0xF0, 0x14, 0xF0, 0x77 que pode ser entendido como uma combinação de make code e break code juntos

Será que algum dia alguém vai ser capaz de dar uma razão convincente para esta bagunça toda no protocolo? Seria tão mais simples utilizar um código por tecla...

Uma outra característica é a auto-repetição das teclas. Quando se deixa uma tecla pressionada por um tempo maior de que uns 500ms (1/2 segundo) o teclado começa a transmitir repetidamente o make code da(s) tecla(s) pressionadas. Quando se solta a tecla, o teclado emite o break code.

Exemplo: Ao se pressionar e manter pressionada a tecla 'B' o teclado transmite o código 0x32 que corresponde ao B. 500ms depois o teclado transmite os valores 0x32, 0x32, 0x32... a cada 92ms (aproximadamente) enquanto o a tecla estiver pressionada. Ao se soltar a tecla 'B' o teclado transmite 0xF0, 0x32

No caso de ser uma tecla estendida, o raciocínio é o mesmo. o make code 'composto' é transmitido repetidamente.

Exemplo: Ao se pressionar e manter pressionada a tecla UP serão transmitidos os códigos 0xE0, 0x75 seguidos de uma pausa de 500ms, depois novamente 0xE0, 0x75 seguidos de uma pausa de 92ms, depois 0xE0, 0x75, pausa de 92ms .... até a tecla ser liberada (quando então é transmitida a sequência 0xE0, 0xF0, 0x75)

O último aspecto a se considerar é que os símbolos das teclas não possuem códigos próprios. Isso significa que não existe por exemplo um código para a exclamação, em vez disso o teclado simplesmente transmite o código da tecla SHIFT e o da tecla '1'. O mesmo vale para as teclas maiúsculas ou as demais teclas de símbolos.

Existem ainda outros detalhes sobre o protocolo como o 'handshake' inicial, onde o teclado dá seu status de funcionamento e recebe parâmetros como o estado inicial dos LEDs e a taxa de repetição dos caracteres, e outras coisas, mas isto está devidamente explicado nos links abaixo.

Referências:
[1] Interfacing the AT keyboard - Beyond Logic
[2] The PS/2 Mouse/Keyboard Protocol - Computer-Engineering.org 

Nenhum comentário: