rotary_dial_kmod เปลี่ยน หน้าปัดหมุนของโทรศัพท์ ให้เป็นอุปกรณ์อินพุต evdev ของ Linux ทำให้จัดการอินพุตจากการหมุนหน้าปัดได้เหมือนแป้นตัวเลข
- วิธีทำงานคือการเชื่อมต่อ สวิตช์ BUSY/PULSE เข้ากับขา GPIO ของ SoC และเนื่องจากเป็นหน้าสัมผัสเชิงกล จึงต้องจัดการการเด้งของสัญญาณ
- ชื่อหน้าสัมผัส ความยาวพัลส์ และการเข้ารหัสตัวเลขอาจแตกต่างกันไปตามประเทศและผู้ผลิต จึงสำคัญที่จะต้องตรวจสอบการเดินสายจริงและป้ายกำกับ
- ผู้ใช้ต้องตั้งค่าโหนด
rotary-dial รวมถึง pulse-gpios และ busy-gpios ใน devicetree จากนั้นบิลด์และโหลดเป็น เคอร์เนลโมดูลนอกทรี
- แม้ไม่มีฮาร์ดแวร์จริง ก็สามารถรันการทดสอบแบบ end-to-end ใน VM สำหรับพัฒนา ได้ โดยควบคุม GPIO แบบ BUSY/PULSE ที่อิงกับ
gpio-sim
แปลงหน้าปัดหมุนเป็นอุปกรณ์อินพุต evdev
rotary_dial_kmod เป็นไดรเวอร์เคอร์เนล Linux ที่เปลี่ยนหน้าปัดหมุนของโทรศัพท์ให้เป็น อุปกรณ์อินพุต evdev
- ออกแบบโดยคำนึงถึงสถานการณ์ต่อไปนี้
- กรณีที่ชอบ การหมุนเลขที่ช้ากว่า แป้นตัวเลข
- กรณีที่ต้องการใช้โทรศัพท์หมุนหน้าปัดรุ่นเก่าในสภาพแวดล้อมดิจิทัล
- กรณีที่ต้องการตัวอย่างไดรเวอร์แบบง่าย ๆ ซึ่งมีสภาพแวดล้อมพัฒนาและทดสอบ end-to-end บน VM โดยไม่ต้องมีฮาร์ดแวร์จริง
- กรณีการใช้งานสร้างสรรค์อื่น ๆ
การเดินสายและการทำงานของสัญญาณ
- โปรเจกต์นี้มองหน้าปัดหมุนเป็นอุปกรณ์ที่ประกอบด้วยสวิตช์สองตัวคือ BUSY และ PULSE
- BUSY เป็น normally open
- PULSE เป็น normally closed
- สวิตช์ทั้งสองเชื่อมต่อกับขา GPIO ของ SoC ที่รัน embedded Linux ผ่านตัวต้านทาน pull-up
- เมื่อหมุนหน้าปัดไป สวิตช์ BUSY จะปิด และขา busy จะถูกขับเป็น low
- ระหว่างที่หน้าปัดหมุนกลับสู่ตำแหน่งเดิม สวิตช์ PULSE จะเปิดซ้ำ ๆ และขา pulse จะถูกขับเป็น high
- เนื่องจากเป็นสวิตช์เชิงกล จึงอาจเกิด การเด้งของสัญญาณ ได้
ความแตกต่างตามประเทศและผู้ผลิต
- การระบุหน้าสัมผัสของสวิตช์อาจแตกต่างกันไปตามประเทศและผู้ผลิต หรืออาจไม่มีระบุไว้เลย
- ในเยอรมนี สวิตช์ BUSY เรียกว่า nsa
- ในเยอรมนี สวิตช์ PULSE เรียกว่า nsi
- หากไม่แน่ใจเรื่องการจัดขา ให้ค่อย ๆ ขยับหน้าปัดและใช้ตัวทดสอบความต่อเนื่องของมัลติมิเตอร์เพื่อตรวจสอบการตอบสนองของสวิตช์
- duty cycle และระยะเวลาของสัญญาณพัลส์ก็แตกต่างกันไปตามประเทศและผู้ผลิต
- ตัวอย่างในเยอรมนี สวิตช์ PULSE จะ เปิด 62ms และปิด 38ms ต่อหนึ่งพัลส์
- โดยส่วนใหญ่ พัลส์ 1~9 ครั้งจะตรงกับตัวเลข 1~9 และพัลส์ 10 ครั้งจะตรงกับ 0
- บางประเทศใช้การเข้ารหัสต่างออกไป เช่น ตัวอย่างในสวีเดน พัลส์ 1 ครั้งคือ 0 และพัลส์ 10 ครั้งคือ 9
- หากไม่แน่ใจ ควรตรวจสอบป้ายกำกับบนหน้าปัด
วิธีใช้เคอร์เนลโมดูล
- ไดรเวอร์นี้เป็น เคอร์เนลโมดูลนอกทรี มาตรฐาน
- ขั้นตอนการใช้งานเริ่มจากสมมติว่ามีสภาพแวดล้อมสำหรับบิลด์เคอร์เนล Linux พร้อมแล้ว และโฮสต์ที่ใช้บิลด์กับโฮสต์เป้าหมายเป็นเครื่องเดียวกัน
- ในสภาพแวดล้อมจริง มักบิลด์ด้วย cross toolchain ที่ Yocto หรือ Buildroot จัดเตรียมให้
- ต้องเพิ่มโหนด
rotary-dial ใน devicetree
- พร็อพเพอร์ตี
pulse-gpios ผูกกับขา GPIO ของ pulse
- พร็อพเพอร์ตี
busy-gpios ผูกกับขา GPIO ของ busy
- สามารถเปลี่ยนแมป keycode เริ่มต้นได้ตามต้องการผ่านพร็อพเพอร์ตี
linux,keycodes
- รายละเอียดและตัวอย่างอยู่ใน devicetree binding
- ตัวแปรสภาพแวดล้อม
KDIR ต้องชี้ไปยัง source tree ของเคอร์เนล
- การบิลด์ ติดตั้ง และโหลดทำได้ด้วยคำสั่งต่อไปนี้
make
make install
modprobe rotary_dial
- เมื่อโหลดเคอร์เนลโมดูลแล้ว อุปกรณ์อินพุตหน้าปัดหมุนจะปรากฏขึ้น และโดยค่าเริ่มต้นจะทำงานเหมือนแป้นตัวเลขตามการแมป keycode
- สำหรับการดีบัก สามารถใช้แพ็กเกจ evemu ได้
- ใช้
evemu-describe เพื่อตรวจสอบคุณสมบัติของอุปกรณ์อินพุต
- ใช้
evemu-record เพื่อตรวจดูเหตุการณ์จากการหมุนหน้าปัด
VM สำหรับพัฒนาและการจำลอง
- มี VM สำหรับการพัฒนาไดรเวอร์และการทดสอบ end-to-end
- เคอร์เนล Linux ใน VM ถูกใช้ แพตช์ devicetree แล้ว
- devicetree นี้ให้ไลน์ GPIO ของ busy และ pulse ที่จำลองผ่าน gpio-sim
- สามารถจำลองการโทรด้วยหน้าปัดหมุนได้โดยควบคุมไลน์ GPIO จาก user space
- ขั้นตอนการใช้ VM มีดังนี้
- ติดตั้ง Nix package manager
- เปิดใช้งาน flakes
- บิลด์ VM ด้วย
make vm
- อาจใช้เวลาสักพัก เพราะต้องบิลด์เคอร์เนลใหม่พร้อมการตั้งค่าแบบกำหนดเองและแพตช์ devicetree
- รัน VM ด้วย
make run-vm
- หลังเริ่มต้น จะเข้าสู่ระบบในเชลล์สำหรับพัฒนาโดยอัตโนมัติ
- ใน VM ค่า
KDIR จะชี้ไปยังผลลัพธ์การบิลด์เคอร์เนลของ VM จึงสามารถบิลด์ไดรเวอร์ได้ด้วย make เพียงอย่างเดียว
- บาง target ของ
clang-format และ clang-tidy ใช้แค่ผลลัพธ์การบิลด์ไม่พอ และ KDIR ต้องชี้ไปยังซอร์สเคอร์เนลที่ดาวน์โหลดแยกต่างหาก
- หลังบิลด์แล้ว สามารถโหลดและยกเลิกโหลดไดรเวอร์ได้ด้วย target
insmod และ rmmod
rotary_dialer และการทดสอบ
rotary_dialer จำลองการหมุนเลขโดยควบคุมไลน์ GPIO
- บิลด์ด้วยคำสั่งต่อไปนี้
make rotary_dialer
- ตัวอย่างการหมุนสามพัลส์มีดังนี้
test/rotary_dialer 3
- เมื่อกลับมาที่เชลล์ ควรเห็นตัวเลข
2 เนื่องจาก devicetree สำหรับจำลองตั้งค่าเป็น การเข้ารหัสแบบสวีเดน
- ชุดทดสอบสามารถรันได้ใน VM สำหรับพัฒนา
make test
- การทดสอบจะโหลดเคอร์เนลโมดูลและรันหลายกรณี
- ตรวจสอบความสามารถของอุปกรณ์อินพุต
- หลังหมุนตามจำนวนพัลส์ที่กำหนด ตรวจสอบว่า keycode ที่คาดไว้ถูกปล่อยออกมาหรือไม่
- ตรวจสอบว่าจัดการอินพุตที่ไม่ถูกต้องได้อย่างเหมาะสมหรือไม่
การรวมเข้า mainline
- คำอธิบายโปรเจกต์จบด้วยมุกว่า แม้อนาคตของการใช้หน้าปัดหมุนเป็นอุปกรณ์อินพุตจะดูสดใส แต่ Linus Torvalds อาจไม่เห็นด้วย
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
ช่วงปลายยุค 70 ผมเคยทำตัวหมุนเบอร์โทรศัพท์แบบจานหมุนด้วย เครื่องคิดเลข HP41C
ต่อรีเลย์รีดแบบ NC เข้ากับบัซเซอร์เพียโซ และใส่หน้าสัมผัส NC แบบอนุกรมเข้ากับสายโทรศัพท์
ใช้ synthetic programming ที่อาศัย opcode ที่ไม่มีเอกสารกำกับ เพื่อสร้างเสียงบี๊บสั้น ๆ ที่จำเป็นสำหรับพัลส์การหมุนหมายเลข และถ้าป้อนชื่อเป็นตัวอักษร/ตัวเลข ก็สามารถค้นหาเบอร์แล้วโทรออกได้
ราว 10 ปีก่อน ผมเจอคนชื่อ Keith Jarrett ที่บริษัท และก่อนจะทันได้ถามว่าเขาใช่ Keith Jarrett คนที่เขียน HP-41C Synthetic Programming Manual หรือเปล่า เขาก็บอกว่า “ไม่ใช่ครับ ไม่ใช่นักดนตรี ทุกคนถามแบบนั้นกันหมด”
พอผมถามจนจบ เขากลับดีใจและประหลาดใจมาก เพราะเขาคือผู้เขียนหนังสือเล่มที่ผมอ่านเมื่อ 35 ปีก่อนจริง ๆ
https://picclick.com/HP-41-Synthetic-Programming-Made-Easy-b...
https://www.hpmuseum.org/prog/synth41.htm
ผมยังมีหนังสือคู่มือ synthetic programming ฉบับกระดาษอยู่เลย
แม้ไม่นับเทคนิคนั้น เครื่องคิดเลขรุ่นนี้ก็เป็นเครื่องมือที่ตั้งโปรแกรมได้ที่ทรงพลังมากตามมาตรฐานต้นยุค 1980
ผมกับเพื่อนคนเดิมยังเขียนโปรแกรมที่จัดการการคำนวณทั้งหมดในคลาสระดับบัณฑิตศึกษาเรื่องการสร้างแบบจำลอง S-parameter ของการส่งสัญญาณ RF และเมื่อเอาไปอวดอาจารย์ “รางวัล” ที่ได้คือการห้ามใช้โปรแกรมในเครื่องคิดเลขในการสอบทุกครั้ง
ภายหลังผมถึงได้รู้ว่าระหว่างสาย RF กับสายอิเล็กทรอนิกส์ดิจิทัลในภาควิชาวิศวกรรมไฟฟ้ามี การแย่งชิงอาณาเขต กันอยู่
เครื่องคิดเลข HP-41CX สอนบทเรียนที่สำคัญที่สุดข้อหนึ่งในหลักสูตรวิศวกรรมไฟฟ้าให้ผม นั่นคือในการตัดสินใจของมนุษย์ เทคโนโลยีมักไม่ใช่ลำดับความสำคัญสูงสุด
ผมเคยทำอะไรคล้าย ๆ กันบน hp49g และภูมิใจกับการเขียนโปรแกรมในสภาพแวดล้อมที่มีข้อจำกัด แต่ถ้าทำบน หน้าจอแสดงผลบรรทัดเดียวของ 41c ได้จริง นั่นคงเป็นความสำเร็จที่ยอดเยี่ยมมาก
ขอโปรโมตเล็กน้อยสำหรับคนที่ชอบโทรศัพท์แบบจานหมุน ผมดัดแปลงโทรศัพท์ของตัวเองให้เป็น เฮดเซ็ต Bluetooth ที่ใช้งานได้เต็มรูปแบบ รวมถึงโทรออกด้วยจานหมุนด้วย
โพสต์ใน HN ไม่ค่อยไปได้สวย แต่ Hackaday นำไปลง
https://hackaday.com/2024/10/31/bakelite-to-the-future-a-195...
https://blog.waleson.com/2024/10/bakelite-to-future-1950s-ro...
การทำโหมดทางเลือกให้กับแป้นตัวเลขแบบจานหมุน Bluetooth ไม่น่าจะยาก
เหลือแค่ต้องหาเวลาให้ได้
สมัยที่ iPhone ยังเป็นแค่ข่าวลือ ผมเคยเสนอว่าถ้าใส่ touch wheel แบบ iPod ในตอนนั้นเข้าไป จะเป็นโอกาสดีในการชุบชีวิตหน้าปัดหมุนโทรศัพท์
ทุกคนในที่ประชุมปฏิเสธอย่างหนักแน่น แต่ตอนนี้ต้องขอบคุณเรื่องนั้น แค่เตรียมกล่อง Linux ก็ใช้ความรู้สึกคลาสสิกแบบจานหมุนได้แล้ว
Steve Jobs ก็ถูกระบุเป็นหนึ่งในผู้ประดิษฐ์ของสิทธิบัตรนี้ด้วย
ผมกับเพื่อนร่วมงาน Apple อีกคนก็ยื่นสิทธิบัตรที่แทบเหมือนกันในช่วงเวลาไล่เลี่ยกัน และอยู่พักหนึ่ง Apple มีสิทธิบัตรสองฉบับสำหรับการจำลองจานหมุนบน touch wheel
สิทธิบัตรของผมหมดอายุไปในที่สุด ส่วนสิทธิบัตรของ Steve ได้รับการต่ออายุ
ผมเสนอไอเดียนี้กับเพื่อนร่วมงานระหว่างมื้อค่ำในซานฟรานซิสโก ตอนที่ดื่มไปค่อนข้างมาก โดยนึกถึงเกมพินบอลเก่า ๆ ที่ให้สัมผัสทางกายภาพดีมากจนรู้สึกเหมือนของจริง
ผมมองว่าแก่นสำคัญคือการทำ ฟิสิกส์ของหน้าปัดหมุน ให้ผู้ใช้สามารถหมุนไปยังเลขใด ๆ ได้อย่างรวดเร็วด้วยท่าทางที่เหมาะสม
ตอนที่ผมเสนอไอเดียนี้ ผมยังไม่ได้รับข้อมูลเกี่ยวกับ iPhone แต่เพื่อนร่วมงานส่งเรื่องไปยังคณะกรรมการสิทธิบัตรและได้รับอนุมัติ
เมื่อดูความคล้ายกับสิทธิบัตรของ Steve ผมคิดว่าคณะกรรมการคงขำกันอยู่ แต่ก็มีความแตกต่างใหญ่พอที่จะไม่ถือว่าซ้ำกัน
เพียงแต่ดูเหมือนว่าพวกเขาอยากเพิ่มจำนวนสิทธิบัตรเกี่ยวกับ iPhone ให้เป็นส่วนหนึ่งของการตลาดช่วงแรก Steve เองก็พูดตอนเปิดตัว iPhone ว่ามี “สิทธิบัตรมากกว่า 200 ฉบับ” แล้ว
ใช้อันนี้เป็นอินพุตได้เลย: https://www.youtube.com/watch?v=9BnLbv6QYcA
ถึงเวลาแล้วที่ใครสักคนควรใช้โทรศัพท์จานหมุนนั้นให้เกิดประโยชน์จริง ๆ แล้วเล่น Dark Souls ให้จบ
ต้องมี เวอร์ชัน DTMF
ในออสเตรเลียมีคนทำกล่องเล็กมาก ๆ ที่ทำงานด้วยไฟจากสายโทรศัพท์อย่างเดียว และแปลงพัลส์จากจานหมุนเป็น Touch Tone
ผมใช้มันทำให้โทรศัพท์จานหมุนยังใช้งานต่อได้เรื่อย ๆ จนกระทั่งเมื่อไม่กี่ปีก่อนย้ายไปอาคารที่ไม่มีสาย POTS เสียดายมาก
ผมเองก็ยังใช้โทรศัพท์หลายเครื่องแบบนั้นให้ทำงานอยู่ รวมถึงโทรศัพท์ทรงเชิงเทียนจากยุค 1920 ด้วย
ดีมาก ชอบ การทำไดรเวอร์แบบขั้นต่ำ แบบนี้
มันแสดงให้เห็นว่าไดรเวอร์ต้องใช้โค้ดจริง ๆ น้อยแค่ไหน แต่ขณะเดียวกันก็แสดงให้เห็นด้วยว่าถ้าจะทำให้ไดรเวอร์พื้นฐานตัวหนึ่งทำงานได้ ต้องรู้จัก flag และเมธอดของเคอร์เนลมากแค่ไหน
ตอนที่บอกว่า “ตอนแรกตั้งใจจะเขียนไดรเวอร์ใหม่ด้วย Rust เพื่อดูสถานะของโปรเจกต์ Rust for Linux แต่ไม่นานก็รู้ว่าบายดิ้งที่จำเป็นยังไม่มี และคงต้องรอตรงส่วนนั้นไปก่อน” นั้นน่าสนใจและค่อนข้างน่าผิดหวัง แต่ก็ไม่ได้เกินคาด
ถ้าบันทึกแนวทางที่ใช้และอุปสรรคที่เจอไว้ น่าจะกลายเป็นบล็อกโพสต์ที่น่าสนใจได้
ถ้าราวปีหน้าการรองรับโตเต็มที่จนสามารถเขียนใหม่ด้วย Rust ได้ ผมก็ยินดีจะเขียนเล่าประสบการณ์
นึกถึงเรื่องเกี่ยวกับโทรศัพท์แบบหมุนเมื่อราว 30 ปีก่อน
ผมไม่ได้ใช้โทรศัพท์แบบหมุนเอง แต่เกี่ยวข้องกับเครือข่ายโทรศัพท์ที่ยังคงเข้ากันได้กับโทรศัพท์แบบนั้น
แทนที่จะเล่าซ้ำ ขอแปะลิงก์ไว้ตรงนี้:
https://news.ycombinator.com/item?id=40391220
เพื่อกระตุ้นความอยากรู้ เป็นเรื่องที่มีเสียงเคาะประตูดัง ๆ กับคำว่า “San Jose Police! Open up!”
เพราะ 112 หมุนง่ายกว่า แต่ปรากฏว่าตอนเห็นโพสต์นั้นครั้งแรกเมื่อปีก่อน ผมก็เคยคอมเมนต์แบบเดียวกันไปแล้ว
นึกถึงตอนที่ Sarah ที่ Connections Museum ใน Seattle เขียนไดรเวอร์ให้ Asterisk soft PBX บนเครื่อง Linux สื่อสารกับ trunk แบบ pre-DTMF ของชุมสายโทรศัพท์เก่าด้วย revertive pulse signaling
https://www.youtube.com/watch?v=35N5vKKGDy8
ในแง่ประวัติศาสตร์ที่พลิกมุมน่าสนใจ โทรศัพท์แบบหมุนของนิวซีแลนด์มีการจับคู่ตัวเลขกับจำนวน pulse กลับด้านกัน
ที่นั่นจำนวน pulse คือ 10 - ตัวเลข
ผมน่าจะเป็นหนึ่งในคนที่ยังมีชีวิตอยู่เพียงไม่กี่คนที่รู้เหตุผลนั้น เลยขอแชร์ไว้เพื่อไม่ให้ความรู้นี้สูญหาย
ในบรรดาชุมสายโทรศัพท์แบบกลไกยุคค่อนข้างแรก ๆ มีสิ่งที่เรียกว่า rotary exchange [0]
pulse จากโทรศัพท์จะไปต่อคลัตช์ในชุมสายให้ชุดขับหมุนทำงาน และนั่นจะไปขยับอุปกรณ์สวิตชิ่ง
หนึ่งในปัญหาของ rotary exchange คือแผ่นคลัตช์สึก ทำให้การเชื่อมต่อไม่เสถียร
ตอนที่ Aotearoa/NZ ตัดสินใจติดตั้ง rotary exchange นั้น มีแผนเลขหมายเดิมอยู่แล้ว
มีคนฉลาดคนหนึ่งรู้เรื่องปัญหาการสึกหรอ และคำนวณจากแผนเลขหมายเดิมว่า ถ้าตำแหน่ง 1 บนหน้าปัดทำให้เกิด 9 pulse จะลดการสึกของแผ่นโดยรวมได้มาก ทำให้ต้องบำรุงรักษาน้อยลง
วิธีนี้จึงเริ่มจากตรงนั้น
อีกข้อที่น่าสนใจคือ เท่าที่ผมรู้ Norway ก็เลือกการจัดแบบเดียวกันสำหรับโทรศัพท์แบบหมุน
แต่ไม่แน่ใจว่าเป็นด้วยเหตุผลเดียวกันหรือไม่
[0] https://en.wikipedia.org/wiki/Rotary_system
พอดีมีโทรศัพท์แบบหมุนที่ถอดแยกชิ้นส่วนวางอยู่บนโต๊ะ และกำลังกรอ clock spring กลับเข้าไปใหม่ตอนโพสต์นี้ขึ้นมา
เป็นเรื่องบังเอิญแปลกดี
ถ้าเหมือนผม ก็น่าจะประมาณ 2 ปีแล้ว