1 điểm bởi GN⁺ 2025-05-25 | 1 bình luận | Chia sẻ qua WhatsApp
  • rotary_dial_kmod biến mặt số quay của điện thoại thành thiết bị nhập evdev của Linux, cho phép xử lý thao tác quay số như bàn phím số
  • Cách hoạt động là nối công tắc BUSY/PULSE vào các chân GPIO của SoC, và do đặc tính tiếp điểm cơ khí nên cần xử lý hiện tượng dội tiếp điểm
  • Tùy theo quốc gia và nhà sản xuất, tên tiếp điểm, độ dài xung và cách mã hóa chữ số có thể khác nhau, nên việc kiểm tra dây nối và nhãn thực tế là rất quan trọng
  • Người dùng cấu hình node rotary-dial cùng pulse-gpios, busy-gpios trong devicetree rồi biên dịch và nạp nó như mô-đun kernel ngoài cây nguồn
  • Ngay cả khi không có phần cứng thật, vẫn có thể chạy kiểm thử end-to-end trong VM phát triển bằng cách điều khiển GPIO BUSY/PULSE dựa trên gpio-sim

Chuyển mặt số quay thành thiết bị nhập evdev

  • rotary_dial_kmod là trình điều khiển kernel Linux biến mặt số quay của điện thoại thành thiết bị nhập evdev
  • Dự án nhắm đến các tình huống như sau
    • Khi bạn thích quay số chậm hơn so với bàn phím số
    • Khi bạn muốn dùng điện thoại quay số cũ trong môi trường số
    • Khi bạn cần một ví dụ trình điều khiển đơn giản có môi trường phát triển và kiểm thử end-to-end dựa trên VM mà không cần phần cứng thật
    • Các trường hợp sử dụng sáng tạo khác

Đấu dây và hoạt động tín hiệu

  • Dự án này xem mặt số quay là thiết bị gồm hai công tắc BUSYPULSE
    • BUSY là normally open
    • PULSE là normally closed
    • Cả hai công tắc được nối tới các chân GPIO của SoC Linux nhúng thông qua điện trở pull-up
  • Khi vặn mặt số, công tắc BUSY đóng lại và chân busy được kéo xuống mức low
  • Trong lúc mặt số quay trở về vị trí ban đầu, công tắc PULSE liên tục mở ra và chân pulse được kéo lên mức high
  • Vì là công tắc cơ khí nên có thể xảy ra dội tiếp điểm

Khác biệt theo quốc gia và nhà sản xuất

  • Ký hiệu tiếp điểm công tắc có thể khác nhau hoặc không có, tùy quốc gia và nhà sản xuất
    • Ở Đức, công tắc BUSY được gọi là nsa
    • Ở Đức, công tắc PULSE được gọi là nsi
  • Nếu chưa chắc về cách gán chân, hãy di chuyển mặt số chậm rãi và dùng chế độ kiểm tra thông mạch của đồng hồ vạn năng để xác nhận phản ứng của công tắc
  • Chu kỳ làm việc và thời lượng của tín hiệu xung cũng khác nhau theo quốc gia và nhà sản xuất
    • Trong ví dụ của Đức, công tắc PULSE mở 62ms và đóng 38ms cho mỗi xung
  • Trong đa số trường hợp, 1 đến 9 xung tương ứng với các số 1 đến 9, còn 10 xung tương ứng với số 0
  • Một số quốc gia dùng cách mã hóa khác; trong ví dụ của Thụy Điển, 1 xung là 0, còn 10 xung tương ứng với 9
  • Nếu vẫn chưa chắc, bạn nên kiểm tra nhãn trên mặt số

Cách dùng mô-đun kernel

  • Trình điều khiển là mô-đun kernel ngoài cây nguồn tiêu chuẩn
  • Quy trình sử dụng bắt đầu với giả định rằng môi trường biên dịch kernel Linux đã sẵn sàng và máy biên dịch trùng với máy đích
  • Trong môi trường thực tế, thường sẽ biên dịch bằng cross toolchain do Yocto hoặc Buildroot cung cấp
  • Trong devicetree, hãy thêm node rotary-dial
    • Thuộc tính pulse-gpios được gắn với chân GPIO pulse
    • Thuộc tính busy-gpios được gắn với chân GPIO busy
    • Có thể tùy chọn thay đổi ánh xạ keycode mặc định bằng thuộc tính linux,keycodes
    • Thông tin chi tiết và ví dụ có trong devicetree binding
  • Biến môi trường KDIR phải trỏ tới cây mã nguồn kernel
  • Biên dịch, cài đặt và nạp bằng các lệnh sau
make
make install
modprobe rotary_dial
  • Sau khi mô-đun kernel được nạp, thiết bị nhập từ mặt số quay sẽ xuất hiện và mặc định hoạt động như bàn phím số theo ánh xạ keycode
  • Có thể dùng gói evemu để gỡ lỗi
    • Dùng evemu-describe để kiểm tra thuộc tính thiết bị nhập
    • Dùng evemu-record để theo dõi các sự kiện quay số

VM phát triển và mô phỏng

  • Có cung cấp VM phục vụ phát triển trình điều khiển và kiểm thử end-to-end
  • Kernel Linux của VM đã được áp dụng bản vá devicetree
  • Devicetree này cung cấp các đường GPIO busy và pulse được mô phỏng thông qua gpio-sim
  • Có thể điều khiển các đường GPIO từ không gian người dùng để mô phỏng thao tác quay số
  • Quy trình dùng VM như sau
    • Cài Nix package manager
    • Bật flakes
    • Biên dịch VM bằng make vm
    • Việc này có thể mất thời gian vì kernel cần được biên dịch lại với cấu hình tùy chỉnh và bản vá devicetree
    • Chạy VM bằng make run-vm
    • Sau khi khởi động, hệ thống sẽ tự động đăng nhập vào shell phát triển
  • Trong VM, KDIR trỏ tới các đầu ra biên dịch kernel của VM nên có thể biên dịch trình điều khiển chỉ với make
  • Một số target của clang-formatclang-tidy không chỉ cần đầu ra biên dịch mà còn yêu cầu KDIR trỏ tới mã nguồn kernel được tải riêng
  • Sau khi biên dịch, có thể nạp và gỡ trình điều khiển bằng các target insmodrmmod

rotary_dialer và kiểm thử

  • rotary_dialer mô phỏng việc quay số bằng cách điều khiển các đường GPIO
  • Biên dịch bằng lệnh sau
make rotary_dialer
  • Ví dụ quay ba xung như sau
test/rotary_dialer 3
  • Khi quay lại shell, bạn sẽ thấy số 2, vì devicetree mô phỏng đang dùng mã hóa kiểu Thụy Điển
  • Bộ kiểm thử có thể chạy trong VM phát triển
make test
  • Kiểm thử sẽ nạp mô-đun kernel và chạy nhiều trường hợp khác nhau
    • Xác minh chức năng của thiết bị nhập
    • Kiểm tra xem sau khi quay số với số xung cho trước có phát ra keycode mong đợi hay không
    • Kiểm tra xem đầu vào không hợp lệ có được xử lý đúng cách hay không

Có được đưa vào mainline hay không

  • Phần mô tả dự án kết lại bằng một câu đùa rằng dù tác giả lạc quan về tương lai dùng mặt số quay như thiết bị nhập, Linus Torvalds có thể sẽ không đồng ý

1 bình luận

 
GN⁺ 2025-05-25
Ý kiến trên Hacker News
  • Vào cuối thập niên 70, tôi đã làm một bộ quay số điện thoại kiểu xoay bằng máy tính HP41C
    Tôi nối rơ-le lưỡi gà NC với còi áp điện, rồi mắc tiếp điểm NC nối tiếp vào đường dây điện thoại
    Để tạo các tiếng bíp ngắn cần cho xung quay số, tôi dùng synthetic programming với các opcode không được ghi tài liệu; nhập tên bằng chữ và số là có thể tìm số rồi gọi
    Khoảng 10 năm trước, tôi gặp ở công ty một người tên Keith Jarrett; trước khi kịp hỏi liệu ông ấy có phải Keith Jarrett đã viết HP-41C Synthetic Programming Manual không, ông ấy đã nói: “Không, tôi không phải nhạc sĩ. Ai cũng hỏi vậy cả”
    Thế là tôi hỏi cho hết câu, và ông ấy rất vui cũng như ngạc nhiên khi biết tôi là người đã đọc cuốn sách ông ấy viết 35 năm trước
    https://picclick.com/HP-41-Synthetic-Programming-Made-Easy-b...
    https://www.hpmuseum.org/prog/synth41.htm

    • Tôi và một người bạn cũng từng làm thứ này, dùng như một bộ quay số nhanh hoạt động với bất kỳ điện thoại nào
      Tôi vẫn còn giữ bản giấy của sách hướng dẫn synthetic programming
      Ngay cả bỏ qua kỹ thuật đó, chiếc máy tính này vẫn là một công cụ lập trình được rất mạnh vào đầu thập niên 1980
      Cũng với người bạn đó, chúng tôi viết chương trình xử lý toàn bộ các phép tính cho lớp cao học về mô hình hóa tham số S trong truyền dẫn RF; khi khoe với giáo sư, phần “thưởng” là việc dùng chương trình máy tính bị cấm trong tất cả các kỳ thi
      Mãi sau này tôi mới biết có một cuộc tranh giành lãnh địa giữa mảng RF và mảng điện tử số trong khoa kỹ thuật điện
      Chiếc HP-41CX đã dạy tôi một trong những bài học quan trọng nhất trong chương trình kỹ thuật điện: trong quá trình ra quyết định của con người, công nghệ thường không phải ưu tiên hàng đầu
    • Tôi tò mò không biết họ có lập trình những thứ như vậy ngay trên chính chiếc máy tính không
      Tôi từng làm thứ tương tự với hp49g và khá tự hào vì đã viết chương trình trong môi trường bị hạn chế, nhưng nếu làm bằng màn hình một dòng của 41c thì đó hẳn là một thành tựu thật sự ấn tượng
  • Xin phép quảng bá nhẹ cho những ai thích điện thoại quay số: tôi đã độ chiếc điện thoại của mình thành tai nghe Bluetooth hoạt động hoàn chỉnh, bao gồm cả việc quay số điện thoại bằng đĩa xoay
    Bài trên HN không được chú ý lắm, nhưng đã được Hackaday giới thiệu
    https://hackaday.com/2024/10/31/bakelite-to-the-future-a-195...
    https://blog.waleson.com/2024/10/bakelite-to-future-1950s-ro...
    Tôi nghĩ tạo một chế độ thay thế cho bàn phím số xoay Bluetooth không khó lắm
    Giờ chỉ cần tìm thời gian thôi

    • Tuyệt. Ngày nay dùng ESP32 sẽ kinh tế hơn nhiều, nhưng tôi vẫn rất muốn thử viết driver kernel Linux
  • Hồi iPhone vẫn chỉ là tin đồn, tôi từng đề xuất rằng nếu đưa touch wheel như trên iPod khi đó vào thì sẽ là cơ hội tốt để hồi sinh đĩa quay số
    Tất cả mọi người có mặt đều thẳng thừng bác bỏ, nhưng nhờ vậy mà giờ chỉ cần chuẩn bị một hộp Linux là có thể dùng lại cảm giác xoay số cổ điển đó

    • Thật ra bạn không đơn độc: https://www.patentlyapple.com/2010/12/apple-wins-patent-for-...
      Steve Jobs cũng được ghi là một trong các nhà phát minh của bằng sáng chế này
      Tôi và một đồng nghiệp khác ở Apple cũng nộp một bằng sáng chế gần như giống hệt vào gần cùng thời điểm, và trong một thời gian Apple sở hữu hai bằng sáng chế về việc mô phỏng đĩa quay số trên touch wheel
      Bằng sáng chế của tôi cuối cùng đã hết hiệu lực, còn bằng của Steve thì được gia hạn
      Tôi nảy ra ý tưởng này với một đồng nghiệp trong một bữa tối ở SF khi đã uống hơi nhiều; lúc đó tôi đang nghĩ tới một trò pinball cũ có cảm giác vật lý rất tốt, gần như thật
      Tôi cho rằng điểm cốt lõi là triển khai cảm giác vật lý của đĩa quay để người dùng có thể xoay nhanh tới bất kỳ chữ số nào bằng cử chỉ phù hợp
      Khi đưa ra ý tưởng này, tôi chưa được chia sẻ thông tin về iPhone, nhưng đồng nghiệp đã gửi nó lên hội đồng bằng sáng chế và được chấp thuận
      Nhìn vào điểm tương đồng với bằng sáng chế của Steve, tôi đoán hội đồng hẳn đã bật cười, nhưng cũng có khác biệt lớn nên không phải trùng lặp
      Có điều có vẻ họ muốn tăng số lượng bằng sáng chế liên quan đến iPhone như một phần của marketing ban đầu. Ngay trong buổi ra mắt iPhone, Steve cũng đã nói rằng có “hơn 200 bằng sáng chế”
    • Nếu họ từng ra dù chỉ một mẫu iPod chỉ gắn thêm mạng di động thì đó hẳn đã là một dòng thời gian rất hài hước
      Phần nhập liệu dùng cái này là được: https://www.youtube.com/watch?v=9BnLbv6QYcA
    • Chắc chắn phải có app cho phép quay số bằng đĩa xoay trên màn hình cảm ứng
  • Giờ đã đến lúc ai đó tận dụng đúng chiếc điện thoại quay số đó để phá đảo Dark Souls

    • Làm tôi nhớ đến chuyện có thể chơi Soul Calibur bằng cần câu điều khiển của Dreamcast
  • Cần có phiên bản DTMF
    Ở Úc có một người làm những chiếc hộp rất nhỏ chỉ chạy bằng nguồn từ đường dây, chuyển đổi xung quay số sang Touch Tone
    Nhờ nó mà tôi vẫn dùng được điện thoại quay số cho đến vài năm trước, khi chuyển tới một tòa nhà không có dây POTS. Tiếc thật

    • Chẳng phải chỉ cần nối với FXS/ATA để biến nó thành điện thoại VoIP là được sao?
      Tôi cũng vẫn đang dùng nhiều máy theo cách đó, trong đó có cả một chiếc điện thoại chân nến từ thập niên 1920
  • Rất hay. Tôi thích kiểu triển khai driver tối giản như thế này
    Nó cho thấy mã thực tế cần cho driver ít đến mức nào, nhưng đồng thời cũng cho thấy có bao nhiêu flag và phương thức kernel cần phải biết để làm cho một driver cơ bản hoạt động
    Đoạn “ban đầu tôi định triển khai lại driver bằng Rust để xem tình trạng của dự án Rust for Linux ra sao, nhưng chẳng mấy chốc nhận ra rằng các binding cần thiết vẫn chưa có, nên phần đó phải chờ” khá thú vị và khá thất vọng, nhưng cũng không ngoài dự đoán
    Nếu ghi lại cách tiếp cận và những trở ngại đã gặp, chắc sẽ thành một bài blog thú vị

    • Đáng tiếc là hiện tại Rust binding chỉ có cho một số API hạ tầng con nhất định, nên tôi chưa đi đủ xa để có thể viết thành một bài đáng kể
      Nếu khoảng năm sau hỗ trợ chín muồi hơn và có thể triển khai lại bằng Rust, tôi rất sẵn lòng viết về trải nghiệm đó
  • Nhớ lại một chuyện liên quan đến điện thoại quay số khoảng 30 năm trước
    Tôi không trực tiếp dùng điện thoại quay số, nhưng có liên quan đến một mạng điện thoại vẫn còn tương thích với loại điện thoại đó
    Thay vì viết lại, tôi để link ở đây:
    https://news.ycombinator.com/item?id=40391220
    Để khơi gợi tò mò thì đó là câu chuyện có tiếng gõ cửa rất lớn và câu “Cảnh sát San Jose đây! Mở cửa ra!”

    • Câu chuyện đó nghe quen quen nên tôi đã định bình luận rằng 112 được chuyển hướng sang 911
      Vì 112 dễ quay số hơn, nhưng hóa ra khi lần đầu thấy bài đó một năm trước tôi đã để lại đúng bình luận như vậy rồi
    • Theo tôi biết thì mọi PSTN đều đã từng tương thích, hoặc vẫn còn tương thích, với quay số xung
  • Nhớ đến việc Sarah ở Connections Museum tại Seattle từng viết một driver để soft PBX Asterisk trên một máy Linux giao tiếp bằng revertive pulse signaling với các trunk tiền-DTMF của tổng đài điện thoại cũ
    https://www.youtube.com/watch?v=35N5vKKGDy8

  • Một cú đảo chiều lịch sử thú vị là điện thoại quay số ở New Zealand có cách ánh xạ giữa chữ số và số xung bị đảo ngược
    Ở đó số xung là 10 - chữ số

    • Chuyện đó cũng có lý do kỹ thuật sâu xa
      Tôi nghĩ mình có lẽ là một trong số rất ít người còn sống biết lý do đó, nên chia sẻ để kiến thức này không biến mất
      Trong số các tổng đài điện thoại cơ khí khá sớm, có loại rotary exchange [0]
      Các xung từ điện thoại sẽ nối ly hợp bên trong tổng đài để làm chuyển động bộ truyền động quay, và bộ này sẽ di chuyển thiết bị chuyển mạch
      Một trong các vấn đề của rotary exchange là các má ly hợp bị mòn, khiến việc nối trở nên không ổn định
      Khi Aotearoa/NZ quyết định lắp đặt rotary exchange, họ đã có sẵn kế hoạch đánh số hiện hữu
      Một người thông minh nào đó biết về vấn đề mài mòn và đã tính rằng, dựa trên kế hoạch đánh số hiện hữu, nếu vị trí số 1 trên mặt số tạo ra 9 xung thì tổng mức mòn của má ly hợp sẽ giảm đáng kể, cần ít bảo trì hơn
      Cách làm đó bắt đầu từ đó
      Một điều thú vị nữa là theo tôi biết Norway cũng chọn cấu hình tương tự cho điện thoại quay số
      Tôi không chắc có phải vì cùng lý do hay không
      [0] https://en.wikipedia.org/wiki/Rotary_system
  • Đúng lúc tôi đang tháo rời một chiếc điện thoại quay số trên bàn và lên lại lò xo cót thì bài này xuất hiện
    Thật là một sự trùng hợp kỳ lạ

    • Hỏi thật nhé, chiếc điện thoại đó đã nằm tháo rời trên bàn được bao lâu rồi?
      Nếu giống tôi thì chắc khoảng 2 năm rồi