1 puntos por GN⁺ 2025-05-25 | 1 comentarios | Compartir por WhatsApp
  • rotary_dial_kmod convierte un disco de teléfono rotatorio en un dispositivo de entrada evdev de Linux, permitiendo tratar la entrada del disco como si fuera un teclado numérico
  • Su funcionamiento consiste en conectar los interruptores BUSY/PULSE a pines GPIO del SoC, y por las características de los contactos mecánicos requiere manejo de rebote
  • Según el país y el fabricante, los nombres de los contactos, la duración de los pulsos y la codificación de los números pueden variar, por lo que es importante verificar el cableado real y las etiquetas
  • El usuario configura en devicetree un nodo rotary-dial con pulse-gpios y busy-gpios, y luego lo compila y carga como módulo de kernel fuera del árbol
  • Incluso sin hardware real, se pueden ejecutar pruebas de extremo a extremo en una VM de desarrollo manipulando GPIO BUSY/PULSE basados en gpio-sim

Convertir un disco rotatorio en un dispositivo de entrada evdev

  • rotary_dial_kmod es un controlador del kernel de Linux que convierte un disco de teléfono rotatorio en un dispositivo de entrada evdev
  • Está pensado para situaciones como estas
    • Cuando se prefiere una marcación más lenta que la de un teclado numérico
    • Cuando se quiere usar un viejo teléfono de disco en un entorno digital
    • Cuando se necesita un ejemplo simple de controlador con un entorno de desarrollo y pruebas de extremo a extremo basado en VM, sin hardware real
    • Otros casos de uso creativos

Cableado y funcionamiento de las señales

  • Este proyecto trata al disco rotatorio como un dispositivo compuesto por dos interruptores: BUSY y PULSE
    • BUSY es normally open
    • PULSE es normally closed
    • Ambos interruptores se conectan a pines GPIO de un SoC con Linux embebido mediante resistencias pull-up
  • Al girar el disco, el interruptor BUSY se cierra y el pin busy se lleva a low
  • Mientras el disco vuelve a su posición original, el interruptor PULSE se abre repetidamente y el pin pulse se lleva a high
  • Como son interruptores mecánicos, puede producirse rebote

Diferencias por país y fabricante

  • La notación de los contactos de los interruptores puede variar según el país y el fabricante, o incluso no existir
    • En Alemania, el interruptor BUSY se llama nsa
    • En Alemania, el interruptor PULSE se llama nsi
  • Si la asignación de pines no está clara, se debe mover lentamente el disco y verificar la respuesta del interruptor con el probador de continuidad de un multímetro
  • El ciclo de trabajo y la duración de la señal de pulso también varían según el país y el fabricante
    • En el ejemplo alemán, por cada pulso el interruptor PULSE se abre durante 62 ms y se cierra durante 38 ms
  • En la mayoría de los casos, de 1 a 9 pulsos corresponden a los números del 1 al 9, y 10 pulsos corresponden al 0
  • Algunos países usan una codificación distinta; en el ejemplo sueco, 1 pulso corresponde al 0 y 10 pulsos corresponden al 9
  • Si no hay certeza, hay que revisar la etiqueta del disco

Cómo usar el módulo de kernel

  • El controlador es un módulo de kernel fuera del árbol estándar
  • El procedimiento de uso parte del supuesto de que el entorno de compilación del kernel de Linux está preparado y que el host de compilación y el host de destino son el mismo
  • En entornos reales, a menudo se compila con una toolchain cruzada provista por Yocto o Buildroot
  • En devicetree se agrega un nodo rotary-dial
    • La propiedad pulse-gpios se vincula al pin GPIO de pulse
    • La propiedad busy-gpios se vincula al pin GPIO de busy
    • Con la propiedad linux,keycodes se puede cambiar opcionalmente el mapa de keycodes predeterminado
    • Hay más información y ejemplos en devicetree binding
  • La variable de entorno KDIR debe apuntar al árbol de fuentes del kernel
  • La compilación, instalación y carga se ejecutan con los siguientes comandos
make
make install
modprobe rotary_dial
  • Cuando el módulo de kernel se carga, aparece el dispositivo de entrada del disco rotatorio y, según el mapeo de keycodes, por defecto funciona como un teclado numérico
  • Para depuración se puede usar el paquete evemu
    • Con evemu-describe se revisan las propiedades del dispositivo de entrada
    • Con evemu-record se monitorean los eventos del disco

VM de desarrollo y simulación

  • Se proporciona una VM para el desarrollo del controlador y pruebas de extremo a extremo
  • El kernel de Linux de la VM tiene aplicado un parche de devicetree
  • Este devicetree proporciona líneas GPIO busy y pulse simuladas mediante gpio-sim
  • Desde espacio de usuario se pueden manipular las líneas GPIO para simular una marcación con el disco
  • El procedimiento para usar la VM es el siguiente
    • Instalar Nix package manager
    • Activar flakes
    • Compilar la VM con make vm
    • Puede tardar, porque hay que recompilar el kernel con configuración personalizada y el parche de devicetree
    • Ejecutar la VM con make run-vm
    • Tras iniciar, se inicia sesión automáticamente en el shell de desarrollo
  • En la VM, KDIR apunta a los artefactos de compilación del kernel de la VM, por lo que el controlador puede compilarse solo con make
  • Para algunos targets de clang-format y clang-tidy, los artefactos de compilación no son suficientes; KDIR debe apuntar a fuentes del kernel descargadas por separado
  • Después de compilar, se puede cargar y descargar el controlador con los targets insmod y rmmod

rotary_dialer y pruebas

  • rotary_dialer simula la marcación de números manipulando las líneas GPIO
  • Se compila con el siguiente comando
make rotary_dialer
  • Un ejemplo para marcar tres pulsos es el siguiente
test/rotary_dialer 3
  • Al volver al shell, debería aparecer el número 2, porque el devicetree simulado tiene configurada la codificación sueca
  • La suite de pruebas se puede ejecutar en la VM de desarrollo
make test
  • Las pruebas cargan el módulo de kernel y ejecutan varios casos
    • Verifican la funcionalidad del dispositivo de entrada
    • Después de marcar una cantidad dada de pulsos, comprueban si se emite el keycode esperado
    • Comprueban si las entradas inválidas se manejan correctamente

Inclusión en mainline

  • La descripción del proyecto cierra con una broma: ve con optimismo un futuro en el que los discos rotatorios se usen como dispositivos de entrada, aunque Linus Torvalds podría no estar de acuerdo

1 comentarios

 
GN⁺ 2025-05-25
Opiniones de Hacker News
  • A fines de los 70 hice un marcador de teléfono rotativo con una calculadora HP41C.
    Conecté un relé reed NC a un zumbador piezoeléctrico y puse el contacto NC en serie con la línea telefónica.
    Usé synthetic programming con opcodes no documentados para generar los pitidos cortos necesarios para los pulsos de marcado, y al ingresar un nombre alfanumérico podía buscar el número y marcarlo.
    Hace unos 10 años conocí en la empresa a alguien llamado Keith Jarrett, y antes de que pudiera preguntarle si era el Keith Jarrett que escribió el HP-41C Synthetic Programming Manual, me dijo: “No, no soy el músico. Todos preguntan eso”.
    Así que terminé de hacerle la pregunta, y resultó ser el autor de ese libro que había leído 35 años antes; él también se alegró y se sorprendió muchísimo.
    https://picclick.com/HP-41-Synthetic-Programming-Made-Easy-b...
    https://www.hpmuseum.org/prog/synth41.htm

    • Un amigo y yo también hicimos esto, y lo usamos como marcador rápido que funcionaba con cualquier teléfono.
      Todavía conservo el manual impreso de synthetic programming.
      Incluso dejando de lado esa técnica, esta calculadora era una herramienta programable muy potente para principios de los años 80.
      Con el mismo amigo también escribimos un programa que resolvía todos los cálculos de una clase de posgrado sobre modelado con parámetros S de transmisión RF, y cuando se lo presumimos al profesor, como “recompensa” prohibió usar programas de calculadora en todos los exámenes.
      Solo más tarde me enteré de que había una disputa territorial entre el área de RF y la de electrónica digital del departamento de ingeniería eléctrica.
      La calculadora HP-41CX me enseñó una de las lecciones más importantes de la carrera de ingeniería eléctrica: en la toma de decisiones humanas, la tecnología muchas veces no es la máxima prioridad.
    • Me da curiosidad si programaban algo así directamente en la calculadora.
      Hice algo parecido con una hp49g y estaba orgulloso de haber programado en un entorno limitado, pero si lo hicieron con la pantalla de una sola línea de la 41c, habría sido un logro realmente impresionante.
  • Para hacer un poco de promoción a quienes les gustan los teléfonos rotativos: modifiqué mi teléfono para convertirlo en un auricular Bluetooth completamente funcional, incluido marcar números con el dial rotativo.
    La publicación en HN no tuvo mucho éxito, pero apareció en Hackaday.
    https://hackaday.com/2024/10/31/bakelite-to-the-future-a-195...
    https://blog.waleson.com/2024/10/bakelite-to-future-1950s-ro...
    No creo que sea difícil crear un modo alternativo para un teclado numérico rotativo Bluetooth.
    Ahora solo falta encontrar tiempo.

    • Genial. Hoy en día usar ESP32 es una opción mucho más económica, pero igual tenía muchas ganas de probar un driver del kernel de Linux.
  • Cuando el iPhone todavía era solo un rumor, sugerí que, si le ponían una rueda táctil como la del iPod de entonces, sería una buena oportunidad para revivir el dial rotativo.
    Todos los presentes lo rechazaron rotundamente, pero gracias a eso ahora, con solo preparar una caja con Linux, podemos usar esa sensación clásica de un teléfono rotativo.

    • En realidad no estabas solo: https://www.patentlyapple.com/2010/12/apple-wins-patent-for-...
      Steve Jobs también figuraba como uno de los inventores de esa patente.
      Otro colega de Apple y yo presentamos casi al mismo tiempo una patente casi idéntica, y durante un tiempo Apple tuvo dos patentes sobre simular un dial rotativo en una rueda táctil.
      Mi patente finalmente expiró, y la de Steve se renovó.
      Le propuse la idea a un colega durante una cena en SF, ya con unos tragos de más, pensando en un viejo juego de pinball cuya sensación física era tan buena que se sentía real.
      Para mí, la clave era implementar la sensación física del dial para que el usuario pudiera girar rápidamente hasta cualquier número con el gesto adecuado.
      Cuando tuve esta idea, yo no tenía acceso a información sobre el iPhone, pero mi colega la envió al comité de patentes y la aprobaron.
      Por lo parecida que era a la patente de Steve, imagino que el comité se habrá reído, aunque también había diferencias importantes y no era duplicada.
      Creo que simplemente querían aumentar la cantidad de patentes relacionadas con el iPhone como parte del marketing inicial. Steve ya había dicho en la presentación del iPhone que tenía “más de 200 patentes”.
    • Si hubieran lanzado aunque fuera un modelo de iPod con solo agregarle conectividad celular, habría sido una línea temporal muy graciosa.
      Para la entrada se podría usar esto: https://www.youtube.com/watch?v=9BnLbv6QYcA
    • Seguro que existe alguna app que permite marcar llamadas con un dial rotativo en una pantalla táctil.
  • Ya va siendo hora de que alguien aproveche bien ese teléfono rotativo y se pase Dark Souls con él.

    • Me recuerda que se podía jugar Soul Calibur con el control de caña de pescar de Dreamcast.
  • Hace falta una versión DTMF.
    En Australia hay alguien que fabrica una cajita muy pequeña que funciona solo con la energía de la línea y convierte pulsos rotativos a Touch Tone.
    Gracias a eso pude seguir usando mi teléfono rotativo hasta hace unos años, cuando me mudé a un edificio sin cableado POTS. Qué lástima.

    • ¿No bastaría conectarlo a un FXS/ATA para convertirlo en un teléfono VoIP?
      Yo todavía mantengo funcionando así varios teléfonos, incluido uno tipo candelabro de los años 20.
  • Muy bueno. Me gustan estas implementaciones mínimas de drivers
    Muestra lo poco código real que se necesita en un driver, pero al mismo tiempo también muestra cuántos flags y métodos del kernel hay que conocer para hacer funcionar un driver básico
    Me pareció interesante —y bastante decepcionante, aunque no inesperado— el pasaje que dice: “Al principio quise volver a implementar el driver en Rust para ver el estado del proyecto Rust for Linux, pero pronto me di cuenta de que los bindings necesarios todavía no existen, así que esa parte tendrá que esperar”
    Creo que documentar el enfoque y los obstáculos encontrados daría para una entrada de blog interesante

    • Lamentablemente, por ahora solo hay bindings de Rust para algunas API de subsistemas, así que no llegué lo suficientemente lejos como para que valiera la pena escribir algo sustancioso
      Si el soporte madura el próximo año y se vuelve posible una reimplementación en Rust, con gusto escribiré sobre la experiencia
  • Esto me recuerda a algo relacionado con teléfonos de disco de hace unos 30 años
    No usé directamente un teléfono de disco, pero sí estaba involucrada una red telefónica que todavía era compatible con esos teléfonos
    En vez de repetirlo, dejo el enlace aquí:
    https://news.ycombinator.com/item?id=40391220
    Para despertar la curiosidad: es una historia con un fuerte golpe en la puerta y un “¡Policía de San José! ¡Abra!”

    • Esa historia me sonaba conocida y estaba por comentar que 112 se redirige a 911
      Era porque 112 era más fácil de marcar, pero resultó que, cuando vi ese texto por primera vez hace un año, ya había dejado el mismo comentario
    • Que yo sepa, todas las PSTN eran compatibles con marcación por pulsos o todavía lo son
  • Me recuerda a cuando Sarah, del Connections Museum de Seattle, escribió un driver para que un soft PBX Asterisk en una máquina Linux pudiera comunicarse mediante revertive pulse signaling con troncales pre-DTMF de una central telefónica antigua
    https://www.youtube.com/watch?v=35N5vKKGDy8

  • Como giro histórico curioso, en los teléfonos de disco de Nueva Zelanda la correspondencia entre números y cantidad de pulsos era la inversa
    Allí la cantidad de pulsos era 10 - el número

    • Había una razón técnica profunda para eso
      Creo que quizá soy una de las poquísimas personas vivas que la conocen, así que la comparto para que ese conocimiento no se pierda
      Entre las centrales telefónicas mecánicas relativamente tempranas estaban las rotary exchanges [0]
      Los pulsos provenientes del teléfono acoplaban un embrague dentro de la central, movían el accionamiento rotativo, y eso movía el mecanismo de conmutación
      Uno de los problemas de las rotary exchanges era que las almohadillas del embrague se desgastaban y el acoplamiento se volvía poco confiable
      En Aotearoa/NZ ya existía un plan de numeración cuando se decidió instalar rotary exchanges
      Alguien astuto conocía el problema del desgaste y calculó que, según el plan de numeración existente, si la posición 1 del dial generaba 9 pulsos, el desgaste total de las almohadillas se reduciría mucho y haría falta menos mantenimiento
      Así empezó ese esquema
      Otro dato curioso es que, según tengo entendido, Noruega también eligió la misma configuración para los teléfonos de disco
      No estoy seguro de si fue por la misma razón
      [0] https://en.wikipedia.org/wiki/Rotary_system
  • Justo tenía un teléfono de disco desarmado sobre el escritorio y estaba volviendo a tensar el resorte de reloj cuando apareció este artículo
    Qué coincidencia tan extraña

    • Pregunta sincera: ¿cuánto tiempo lleva ese teléfono desarmado sobre tu escritorio?
      Si eres como yo, diría que unos 2 años