1 pontos por GN⁺ 2025-05-25 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2025-05-25
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

    • Um amigo e eu também montamos isso, e usávamos como discador rápido que funcionava com qualquer telefone
      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
    • Fico curioso se vocês programaram isso na própria calculadora
      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

    • Legal. Hoje em dia, usar um ESP32 é uma opção muito mais econômica, mas mesmo assim eu queria muito experimentar escrever um driver de kernel Linux
  • 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

    • Na verdade, você não estava sozinho: https://www.patentlyapple.com/2010/12/apple-wins-patent-for-...
      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”
    • Se tivessem lançado ao menos um modelo de iPod só com rede celular adicionada, teria sido uma linha do tempo muito engraçada
      Para entrada, era só usar isto: https://www.youtube.com/watch?v=9BnLbv6QYcA
    • Com certeza deve existir algum app que permita discar em um touchscreen usando um disco rotativo
  • Chegou a hora de alguém aproveitar esse telefone rotativo direito e zerar Dark Souls com ele

    • Isso me lembra que dava para jogar Soul Calibur com o controle de vara de pesca do Dreamcast
  • 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

    • Não daria para ligar a um FXS/ATA e transformá-lo em um telefone VoIP?
      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

    • Infelizmente, no momento só há bindings Rust para algumas APIs de subsistemas, então não cheguei longe o suficiente para ter algo significativo sobre o que escrever
      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!”

    • Essa história me pareceu familiar, e eu ia comentar que 112 é redirecionado para 911
      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
    • Pelo que sei, toda PSTN era ou ainda é compatível com discagem por pulsos
  • 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

    • Havia uma razão técnica profunda para isso
      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

    • Pergunta sincera: há quanto tempo esse telefone está desmontado em cima da sua mesa?
      Se for como comigo, deve estar lá há uns 2 anos