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 BUSY và PULSE
- 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-format và clang-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
insmod và rmmod
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
Ý 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ẫ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ừ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
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 đó
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ế”
Phần nhập liệu dùng cái này là được: https://www.youtube.com/watch?v=9BnLbv6QYcA
Giờ đã đến lúc ai đó tận dụng đúng chiếc điện thoại quay số đó để phá đảo Dark Souls
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
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ị
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!”
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
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ố
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ạ
Nếu giống tôi thì chắc khoảng 2 năm rồi