rotary_dial_kmod converte um disco telefônico rotativo em um dispositivo de entrada evdev do Linux, permitindo tratar a discagem como um teclado numérico
- O funcionamento conecta os interruptores BUSY/PULSE aos pinos GPIO do SoC, e por causa das características dos contatos mecânicos é necessário tratar bouncing
- Dependendo do país e do fabricante, os nomes dos contatos, a duração dos pulsos e a codificação dos números podem variar, então é importante verificar a fiação e as etiquetas reais
- O usuário configura um nó
rotary-dial no devicetree com pulse-gpios e busy-gpios, depois compila e carrega o módulo como um módulo de kernel fora da árvore
- Mesmo sem hardware real, é possível executar testes end-to-end em uma VM de desenvolvimento manipulando GPIOs BUSY/PULSE baseados em
gpio-sim
Converter um disco rotativo em dispositivo de entrada evdev
rotary_dial_kmod é um driver de kernel Linux que transforma um disco telefônico rotativo em um dispositivo de entrada evdev
- Ele foi pensado para situações como:
- quando se prefere uma discagem mais lenta do que a de um teclado numérico
- quando se quer usar um telefone rotativo antigo em um ambiente digital
- quando se precisa de um exemplo simples de driver com ambiente de desenvolvimento e teste end-to-end baseado em VM, mesmo sem hardware real
- outros casos de uso criativos
Fiação e funcionamento do sinal
- Este projeto trata o disco rotativo como um dispositivo formado por dois interruptores: BUSY e PULSE
- BUSY é normally open
- PULSE é normally closed
- os dois interruptores são conectados aos pinos GPIO de um SoC Linux embarcado por meio de resistores pull-up
- Ao girar o disco, o interruptor BUSY fecha e o pino busy vai para low
- Enquanto o disco retorna à posição original, o interruptor PULSE abre repetidamente e o pino pulse vai para high
- Como são interruptores mecânicos, pode ocorrer bouncing
Diferenças por país e fabricante
- A identificação dos contatos dos interruptores pode variar conforme o país e o fabricante, ou até não existir
- na Alemanha, o interruptor BUSY é chamado de nsa
- na Alemanha, o interruptor PULSE é chamado de nsi
- Se a atribuição dos pinos não estiver clara, deve-se mover o disco lentamente e verificar a resposta dos interruptores com o teste de continuidade de um multímetro
- O duty cycle e a duração do sinal de pulso também variam conforme o país e o fabricante
- no exemplo alemão, em cada pulso o interruptor PULSE fica 62 ms aberto e 38 ms fechado
- Na maioria dos casos, de 1 a 9 pulsos correspondem aos números de 1 a 9, e 10 pulsos correspondem ao 0
- Alguns países usam codificação diferente; no exemplo sueco, 1 pulso corresponde a 0 e 10 pulsos correspondem a 9
- Em caso de dúvida, é preciso conferir a etiqueta do disco
Como usar o módulo de kernel
- O driver é um módulo de kernel fora da árvore padrão
- O procedimento de uso parte do pressuposto de que o ambiente de build do kernel Linux já está preparado e que o host de build e o host de destino são o mesmo
- Em ambientes reais, muitas vezes a compilação é feita com uma toolchain cruzada fornecida por Yocto ou Buildroot
- No devicetree, deve-se adicionar um nó
rotary-dial
- a propriedade
pulse-gpios faz o binding com o pino GPIO de pulse
- a propriedade
busy-gpios faz o binding com o pino GPIO de busy
- a propriedade
linux,keycodes permite alterar opcionalmente o mapa padrão de keycodes
- mais informações e exemplos estão no binding do devicetree
- A variável de ambiente
KDIR deve apontar para a árvore de código-fonte do kernel
- A compilação, instalação e carregamento são feitos com os seguintes comandos
make
make install
modprobe rotary_dial
- Depois que o módulo é carregado, o dispositivo de entrada do disco rotativo aparece e, conforme o mapeamento de keycodes, por padrão funciona como um teclado numérico
- Para depuração, pode-se usar o pacote evemu
evemu-describe permite verificar as propriedades do dispositivo de entrada
evemu-record permite monitorar os eventos de discagem
VM de desenvolvimento e simulação
- É fornecida uma VM para desenvolvimento do driver e testes end-to-end
- O kernel Linux da VM inclui um patch de devicetree
- Esse devicetree fornece linhas GPIO busy e pulse simuladas por meio do gpio-sim
- No espaço do usuário, é possível manipular as linhas GPIO para simular a discagem
- O procedimento para usar a VM é o seguinte
- instalar o Nix package manager
- ativar flakes
- construir a VM com
make vm
- isso pode levar tempo, pois o kernel precisa ser recompilado com configuração personalizada e com o patch de devicetree
- executar a VM com
make run-vm
- após a inicialização, o login automático é feito no shell de desenvolvimento
- Na VM,
KDIR aponta para os artefatos de build do kernel da VM, então é possível compilar o driver apenas com make
- Em alguns alvos de
clang-format e clang-tidy, os artefatos de build sozinhos não bastam; KDIR precisa apontar para um código-fonte do kernel baixado separadamente
- Depois da compilação, os alvos
insmod e rmmod permitem carregar e descarregar o driver
rotary_dialer e testes
rotary_dialer simula a discagem de números manipulando linhas GPIO
- A compilação é feita com o seguinte comando
make rotary_dialer
- Um exemplo de discagem de três pulsos é o seguinte
test/rotary_dialer 3
- Ao voltar ao shell, o número
2 deve aparecer, porque o devicetree simulado está configurado com codificação sueca
- A suíte de testes pode ser executada na VM de desenvolvimento
make test
- Os testes carregam o módulo de kernel e executam vários casos
- validam a funcionalidade do dispositivo de entrada
- verificam se, após discar um determinado número de pulsos, o keycode esperado é emitido
- verificam se entradas inválidas são tratadas corretamente
Inclusão no mainline
- A descrição do projeto termina em tom de brincadeira, dizendo que vê com bons olhos um futuro em que o disco rotativo seja usado como dispositivo de entrada, embora Linus Torvalds talvez não concorde
1 comentários
Opiniões no Hacker News
No fim dos anos 70, fiz um discador de telefone rotativo com uma calculadora HP41C
Liguei um relé reed NC a um buzzer piezoelétrico e coloquei o contato NC em série com a linha telefônica
Usei synthetic programming, com opcodes não documentados, para gerar os bipes curtos necessários aos pulsos de discagem; dava para digitar um nome alfanumérico, procurar o número e discar
Há uns 10 anos, encontrei na empresa uma pessoa chamada Keith Jarrett e, antes mesmo de eu perguntar se ele era aquele Keith Jarrett que escreveu o HP-41C Synthetic Programming Manual, ele disse: “Não, não sou o músico. Todo mundo pergunta isso”
Então fiz a pergunta até o fim, e ele ficou muito feliz e surpreso por eu ter lido, 35 anos antes, o livro do qual ele era o autor
https://picclick.com/HP-41-Synthetic-Programming-Made-Easy-b...
https://www.hpmuseum.org/prog/synth41.htm
Ainda tenho a cópia em papel do guia de synthetic programming
Mesmo deixando essa técnica de lado, essa calculadora era uma ferramenta programável muito poderosa para o começo dos anos 1980
Com o mesmo amigo, também escrevemos um programa que resolvia todos os cálculos de uma disciplina de pós-graduação sobre modelagem por parâmetros S de transmissão em RF; quando mostramos ao professor, como “recompensa” ele proibiu o uso de programas na calculadora em todas as provas
Só depois entendi que havia uma disputa de território entre a área de RF e a de eletrônica digital no departamento de engenharia elétrica
A calculadora HP-41CX me ensinou uma das lições mais importantes do curso de engenharia elétrica: na tomada de decisão humana, muitas vezes a tecnologia não é a prioridade principal
Fiz algo parecido em uma hp49g e fiquei orgulhoso de ter programado em um ambiente restrito, mas, se foi feito na tela de uma linha da 41c, teria sido uma conquista realmente impressionante
Fazendo uma pequena divulgação para quem gosta de telefones rotativos: modifiquei o meu para virar um headset Bluetooth totalmente funcional, incluindo discar números pelo disco rotativo
O post no HN não foi muito longe, mas apareceu no Hackaday
https://hackaday.com/2024/10/31/bakelite-to-the-future-a-195...
https://blog.waleson.com/2024/10/bakelite-to-future-1950s-ro...
Não parece difícil criar um modo alternativo para um teclado numérico rotativo Bluetooth
Agora só falta achar tempo
Na época em que o iPhone ainda era só rumor, sugeri que, se colocassem uma touch wheel como a do iPod da época, seria uma ótima oportunidade para trazer de volta o discador rotativo
Todos os presentes rejeitaram a ideia categoricamente, mas, graças a isso, agora basta preparar uma máquina Linux para usar aquela sensação clássica do disco rotativo
Steve Jobs também aparecia como um dos inventores dessa patente
Eu e outro colega da Apple registramos quase a mesma patente, quase na mesma época, e por um tempo a Apple teve duas patentes para simular um discador rotativo na touch wheel
A minha patente acabou expirando, e a de Steve foi renovada
Propus essa ideia a um colega durante um jantar em SF, já um pouco bêbado, lembrando de um velho jogo de pinball cuja física era tão boa que parecia real
Para mim, o ponto central era implementar a física do disco para que o usuário pudesse girar rapidamente qualquer número com o gesto adequado
Quando tive essa ideia, eu ainda não tinha acesso às informações sobre o iPhone, mas meu colega a enviou ao comitê de patentes e ela foi aprovada
Imagino que o comitê tenha rido ao ver a semelhança com a patente de Steve, mas também havia diferenças importantes, então não era duplicada
Só que acho que eles queriam aumentar o número de patentes relacionadas ao iPhone como parte do marketing inicial. O próprio Steve já disse, no anúncio do iPhone, que havia “mais de 200 patentes”
Para entrada, era só usar isto: https://www.youtube.com/watch?v=9BnLbv6QYcA
Chegou a hora de alguém aproveitar esse telefone rotativo direito e zerar Dark Souls com ele
Precisamos de uma versão DTMF
Na Austrália, há alguém que fabrica uma caixinha bem pequena, alimentada só pela linha, que converte pulsos rotativos em Touch Tone
Graças a ela, consegui continuar usando telefones rotativos até me mudar, alguns anos atrás, para um prédio sem fiação POTS. Uma pena
Eu ainda mantenho vários funcionando assim, incluindo um telefone castiçal dos anos 1920
Muito bom. Gosto desse tipo de implementação mínima de driver
Mostra quão pouco código real um driver precisa ter, mas ao mesmo tempo também mostra quantas flags e métodos do kernel é preciso conhecer para fazer até um driver básico funcionar
Achei interessante, e bastante decepcionante, embora não inesperado, o trecho em que ele diz: “No começo, eu queria reimplementar o driver em Rust para avaliar o estado do projeto Rust for Linux, mas logo percebi que os bindings necessários ainda não existiam, então essa parte teria que esperar”
Acho que documentar a abordagem e os obstáculos encontrados daria um post de blog interessante
Se o suporte amadurecer por volta do ano que vem e uma reimplementação em Rust se tornar possível, ficarei feliz em escrever sobre a experiência
Isso me lembrou de um episódio envolvendo telefones de disco de cerca de 30 anos atrás
Eu não usei diretamente um telefone de disco, mas havia envolvimento de uma rede telefônica que ainda era compatível com eles
Em vez de repetir tudo, deixo o link aqui:
https://news.ycombinator.com/item?id=40391220
Para atiçar a curiosidade: é uma história com uma batida forte na porta e “San Jose Police! Open up!”
porque 112 era mais fácil de discar, mas descobri que, quando vi aquele post pela primeira vez há um ano, eu já tinha feito o mesmo comentário
Isso me lembrou de quando Sarah, no Connections Museum de Seattle, escreveu um driver para fazer uma central PBX por software Asterisk em uma máquina Linux se comunicar com trunks pre-DTMF de antigas centrais telefônicas usando sinalização por pulsos revertivos
https://www.youtube.com/watch?v=35N5vKKGDy8
Em uma reviravolta histórica curiosa, nos telefones de disco da Nova Zelândia a correspondência entre os números e a quantidade de pulsos era invertida
Lá, o número de pulsos era 10 - o número
Acho que talvez eu seja uma das pouquíssimas pessoas vivas que sabem o motivo, então compartilho para que esse conhecimento não se perca
Entre as centrais telefônicas mecânicas relativamente antigas, havia a rotary exchange [0]
Os pulsos vindos do telefone acionavam uma embreagem dentro da central, movendo um mecanismo rotativo, que por sua vez movia o dispositivo de comutação
Um dos problemas das rotary exchanges era que as pastilhas da embreagem se desgastavam, tornando o acoplamento instável
Em Aotearoa/NZ, quando se decidiu instalar rotary exchanges, já havia um plano de numeração existente
Alguém inteligente conhecia o problema de desgaste e calculou que, com base no plano de numeração existente, fazer a posição 1 do disco emitir 9 pulsos reduziria muito o desgaste total das pastilhas, exigindo menos manutenção
Foi assim que esse esquema começou
Outro fato interessante é que, pelo que sei, a Noruega também escolheu a mesma configuração para telefones de disco
Não tenho certeza se foi pelo mesmo motivo
[0] https://en.wikipedia.org/wiki/Rotary_system
Justo agora que tenho um telefone de disco desmontado em cima da mesa e estou rebobinando a mola de relógio, este post apareceu
Que coincidência estranha
Se for como comigo, deve estar lá há uns 2 anos