1 คะแนน โดย GN⁺ 2025-05-25 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Rotary Phone Dial Linux Kernel Driver เป็นเคอร์เนลโมดูลที่แปลงโทรศัพท์แบบหมุนรุ่นเก่าให้กลายเป็น อุปกรณ์ป้อนข้อมูล evdev ของ Linux
  • โปรเจ็กต์นี้มีทั้งไดรเวอร์ตัวอย่างแบบเรียบง่ายและสภาพแวดล้อมพัฒนาที่อิงบนเครื่องเสมือน จึงมีประโยชน์มากสำหรับ การศึกษาและการทดสอบ
  • สามารถพัฒนาและทดสอบได้แม้ไม่มีฮาร์ดแวร์จริง และรองรับ การจำลอง GPIO
  • รองรับการตั้งค่า key mapping ได้แทบทั้งหมด และยังรองรับ รูปแบบ pulse encoding ที่หลากหลาย ของแต่ละประเทศ
  • เนื่องจากเป็นเคอร์เนลโมดูลมาตรฐาน จึงสามารถ ขยายและผสานรวม เข้ากับระบบ Linux ได้อย่างง่ายดาย

ภาพรวมของ Rotary Phone Dial Linux Kernel Driver

  • โปรเจ็กต์นี้เป็น เคอร์เนลโมดูล ที่แปลง แป้นหมุนของโทรศัพท์แบบหมุนรุ่นเก่า ให้เป็นอุปกรณ์ป้อนข้อมูลมาตรฐานของระบบ Linux (เช่น แป้นตัวเลข)
  • เหมาะสำหรับผู้ที่อาจสนใจใช้งานดังต่อไปนี้
    • ผู้ที่ต้องการป้อนตัวเลขผ่านการหมุนหมายเลขแบบช้า ๆ
    • ผู้ใช้ที่ต้องการนำ โทรศัพท์อนาล็อก รุ่นเก่ามาสู่ยุคดิจิทัล
    • ผู้สอน ที่ต้องการไดรเวอร์เคอร์เนลตัวอย่างและสภาพแวดล้อมพัฒนา/ทดสอบเสมือนโดยไม่ต้องมีฮาร์ดแวร์จริง
    • หรือเพื่อการทดลองสร้างสรรค์อื่น ๆ

วิธีการต่อวงจร

  • แป้นหมุนโดยพื้นฐานประกอบด้วยสวิตช์ 2 ตัวคือ BUSY (สถานะเปิดวงจร) และ PULSE (สถานะปิดวงจร)
    • สวิตช์ทั้งสองนี้จะถูกต่อเข้ากับ ขา GPIO ของระบบที่รัน Embedded Linux ได้ พร้อมตัวต้านทาน pull-up
  • เมื่อหมุนแป้น BUSY จะเปลี่ยนเป็นสถานะปิดวงจร และระหว่างที่แป้นหมุนกลับสู่ตำแหน่งเดิม สวิตช์ PULSE จะสลับเปิด/ปิดซ้ำ ๆ
  • การต่อสายและ การจัดวางขา อาจแตกต่างกันไปตามประเทศหรือผู้ผลิต จึงแนะนำให้ทดสอบการตอบสนองของสวิตช์ด้วยมัลติมิเตอร์
  • duty cycle ของสัญญาณพัลส์ (เวลาเปิด/ปิด) และ วิธีการถอดรหัส ก็แตกต่างกันไปตามแต่ละประเทศและผู้ผลิต
    • ตัวอย่าง: เยอรมนีมีช่วงเปิด 62ms และช่วงปิด 38ms ต่อหนึ่งพัลส์
    • โดยทั่วไป 1 ถึง 9 พัลส์จะหมายถึง 1 ถึง 9 และ 10 พัลส์จะหมายถึง 0 (มีข้อยกเว้น เช่น สวีเดน)
  • หากไม่แน่ใจ ควรตรวจสอบ ฉลาก บนแป้นหมุนหรือทำการทดสอบเพิ่มเติม

วิธีใช้งาน

  • ไดรเวอร์นี้เป็น out-of-tree kernel module มาตรฐาน
  • ขั้นตอนโดยสรุปคือ
    • เพิ่มโหนด rotary-dial ลงใน device tree และแมป pulse-gpios กับ busy-gpios ไปยังขาจริง
    • หากจำเป็น ให้เปลี่ยน keycode map ด้วยพร็อพเพอร์ตี linux,keycodes
    • กำหนดพาธซอร์สเคอร์เนล (KDIR) เป็นตัวแปรสภาพแวดล้อม จากนั้น build ติดตั้ง และโหลดโมดูล
  • เมื่อโหลดเคอร์เนลโมดูลแล้ว ระบบจะสร้างอุปกรณ์ป้อนข้อมูลขึ้นมาและทำงานเป็นแป้นตัวเลข
  • สามารถใช้เครื่องมือ evemu เพื่อตรวจสอบคุณสมบัติของอุปกรณ์ป้อนข้อมูลและมอนิเตอร์เหตุการณ์จากแป้นหมุนได้

เครื่องเสมือน (VM) สำหรับการพัฒนาและทดสอบ

  • มีการจัดเตรียมสภาพแวดล้อมเครื่องเสมือนสำหรับการพัฒนาไดรเวอร์และ การทดสอบแบบ end-to-end
    • VM นี้ใช้ gpio-sim เพื่อจำลอง GPIO ของ busy/pulse และแพตช์เข้ากับ devicetree
    • สามารถควบคุม GPIO จาก user space เพื่อสร้างสถานการณ์ทดสอบได้
  • สามารถ build และรัน VM ได้หลังเปิดใช้งาน Nix package manager และความสามารถของ flakes
  • ภายใน VM จะล็อกอินเข้าสู่ development shell ให้ทันที
  • หลัง build ไดรเวอร์แล้ว ยังรองรับการโหลด/ถอดโหลดโมดูล
  • สามารถใช้เครื่องมือ rotary_dialer เพื่อจำลองจำนวนพัลส์ที่ต้องการและทดสอบการป้อนข้อมูลจากแป้นหมุนได้
    • (เช่น ในสภาพแวดล้อมการเข้ารหัสแบบสวีเดน 3 พัลส์จะถูกตีความเป็นเลข 2)

การทดสอบ

  • ไดรเวอร์นี้มาพร้อมกับ ชุดทดสอบที่ครอบคลุม
  • ในสภาพแวดล้อม VM สามารถรันเคสอัตโนมัติด้วย make test
    • ตรวจสอบได้หลากหลายสถานการณ์ เช่น การทำงานของอุปกรณ์ป้อนข้อมูล การปล่อย keycode ที่ถูกต้องเมื่อหมุนตัวเลข และการจัดการอินพุตที่ไม่ถูกต้อง

การเข้าสู่เมนไลน์

  • ผู้พัฒนากล่าวแบบขำ ๆ ว่าตนมองอนาคตของแป้นหมุนโทรศัพท์ในแง่ บวก แต่ Linus Torvalds อาจไม่ได้เห็นด้วย

1 ความคิดเห็น

 
GN⁺ 2025-05-25
ความคิดเห็นบน Hacker News
  • แชร์ความทรงจำสมัยปลายยุค 70 ที่เคยทำตัวหมุนโทรศัพท์แบบหมุนเองด้วยเครื่องคิดเลข HP41C โดยต่อรีเลย์ลิ้นแบบไร้หน้าสัมผัสเข้ากับ piezo buzzer และสายโทรศัพท์ และใช้ “synthetic programming” (คำสั่งที่ไม่มีเอกสาร) เพื่อสร้างเสียงบี๊บสั้น ๆ ให้กลายเป็น pulse dialling เล่าว่าระบบนั้นสามารถใส่ชื่อได้ (รองรับตัวอักษร) แล้วค้นหาเบอร์และโทรออกได้ทันที อีกทั้งยังเล่าเกร็ดเมื่อราว 10 ปีก่อนตอนพบ Keith Jarrett ที่บริษัท ผู้คนมักสับสนว่าเป็นนักดนตรีหรือไม่ แต่ตนกลับถามว่าใช่ผู้เขียน HP-41C Synthetic Programming Manual หรือเปล่า ซึ่งเขาก็แสดงทั้งความประหลาดใจและดีใจ พร้อมแนบลิงก์ ข้อมูลหนังสือ และ ข้อมูล synthetic programming
    • สงสัยว่าได้เขียนโปรแกรมแบบนั้นบนเครื่องคิดเลขโดยตรงหรือไม่ ตัวเองก็เคยเขียนบน hp49g เหมือนกันเลยขออวดบ้าง และมองว่า 41c ที่มีจอแค่บรรทัดเดียวน่าจะเป็นความท้าทายที่หนักกว่ามาก
  • แชร์ประสบการณ์ดัดแปลงโทรศัพท์แบบหมุนให้เป็นบลูทูธเฮดเซ็ตเต็มรูปแบบ และทำให้หมุนหมายเลขได้ด้วย บน HN กระแสตอบรับไม่ค่อยดีนัก แต่ภูมิใจที่ถูกนำไปลงใน hackaday พร้อมแนบ ลิงก์โปรเจกต์ที่เกี่ยวข้อง และ โพสต์บล็อกส่วนตัว อีกทั้งคิดว่าโหมด Bluetooth rotary numberpad ก็น่าจะทำได้ไม่ยาก เพียงแต่ตอนนี้ไม่มีเวลา
    • ทุกวันนี้ ESP32 เป็นตัวเลือกที่คุ้มค่ากว่ามาก แต่ตอนนั้นอยากทำ Linux kernel driver ให้ได้จริง ๆ เลยลงมือทำเอง
  • เล่าว่าสมัยที่ iPhone ยังเป็นแค่ข่าวลือ เคยเสนอไอเดียว่าเอา touch wheel ของ iPod มาจำลองเป็น rotary dial น่าจะสนุก แต่โดนทุกคนปฏิเสธหมด และยังคิดว่าอยากตั้งค่า Linux box เพื่อได้อารมณ์หมุนสายแบบคลาสสิก
    • บอกว่าไม่ได้คิดอยู่คนเดียว เพราะ Apple จดสิทธิบัตร rotary dial แบบ touch wheel จริง และ Steve Jobs ก็มีชื่อเป็นหนึ่งในผู้ประดิษฐ์ด้วย ตัวเขาเองกับเพื่อนร่วมงานที่ Apple ก็ยื่นสิทธิบัตรที่แทบเหมือนกัน แต่สุดท้ายสิทธิบัตรของตัวเองหมดอายุไป เหลือแต่ของ Steve เล่าด้วยว่าตอนนั่งดื่มกันใน SF แล้วตนเสนอไอเดียการหมุนเบอร์ด้วย touch wheel นั้น physics engine ของเกมพินบอลเป็นแรงบันดาลใจสำคัญ และไอเดียนั้นก็ได้รับการยอมรับจากคณะกรรมการสิทธิบัตร แม้จะต่างจากสิทธิบัตรของ Steve อยู่บ้าง แต่ก็อาจเป็นส่วนหนึ่งของกลยุทธ์เพิ่มจำนวนสิทธิบัตรของ iPhone
    • จินตนาการว่าถ้า iPod ถูกวางขายโดยแค่เพิ่ม cellular networking เข้าไป ก็คงเกิดประวัติศาสตร์ทางเลือกที่น่าสนุก พร้อมแนะนำ วิดีโอการพิมพ์ที่มีประสิทธิภาพ
    • เดาว่าน่าจะมีแอปสำหรับโทรออกด้วย rotary dial บนหน้าจอสัมผัสอยู่แน่นอน
  • ตื่นเต้นที่ในที่สุดก็ดูเหมือนจะมีคนพยายามเคลียร์ Dark Souls ด้วยโทรศัพท์แบบหมุนแล้ว
    • ทำให้นึกถึงความหลังตอนเล่น Soul Calibur ด้วยคอนโทรลเลอร์คันเบ็ดของ Dreamcast
  • ทำให้นึกถึง Sarah จาก Connections Museum ที่ซีแอตเทิล ซึ่งเคยทำไดรเวอร์ให้เชื่อมกับซอฟต์ PBX อย่าง Asterisk เพื่อให้ตู้สลับสายโทรศัพท์รุ่นเก่ารองรับ pulse signaling พร้อมแนะนำ ลิงก์วิดีโออธิบาย
  • พอเห็นการทำไดรเวอร์มินิมัลแบบนี้ก็ยิ่งรู้สึกว่าตัวโค้ดไดรเวอร์จริง ๆ อาจมีไม่มากก็พอ แต่ต้องรู้ kernel flags กับ methods จำนวนมากจริง ๆ เลยประทับใจ เคยอยากเขียนใหม่ด้วย Rust แต่เสียดายที่ binding ที่จำเป็นยังไม่พร้อม และมองว่าการเขียนบล็อกเล่าทั้งแนวทางและอุปสรรคที่เจอก็น่าจะน่าสนใจ
    • ยอมรับว่าตอนนี้ subsystem API ที่ Rust bindings รองรับยังมีอยู่ไม่กี่ส่วน เลยไปต่อได้ไม่มากนัก หวังว่าปีหน้าพอการรองรับสมบูรณ์ขึ้นจะได้ลองอีกครั้งและมาแชร์ประสบการณ์
  • นึกถึงสมัยโมเด็มที่รองรับ Hayes ซึ่งสามารถใช้คำสั่ง ATDP แทน ATDT เพื่อหมุนหมายเลขแบบ pulse dialling ได้
  • เล่าข้อเท็จจริงทางประวัติศาสตร์ที่น่าสนใจว่าโทรศัพท์แบบหมุนในนิวซีแลนด์มีการจับคู่ตัวเลขกับจำนวนพัลส์กลับด้านกัน โดยใช้ระบบ 10-digit pulse จริง
    • อธิบายเหตุผลทางเทคนิคว่าในอุปกรณ์ชุมสายโทรศัพท์เชิงกลยุคแรกอย่าง rotary exchange มีปัญหาการสึกหรอของ clutch pads จึงเกิดแนวคิดให้กลับด้าน เช่น หมุนเลข 1 แล้วส่ง 9 พัลส์ เพื่อลดการสึกหรอโดยรวม ซึ่งแนวคิดนี้เริ่มในนิวซีแลนด์ และเท่าที่ทราบนอร์เวย์ก็ใช้วิธีเดียวกัน พร้อมแนบ ลิงก์วิกิพีเดียเกี่ยวกับ rotary system
  • มีคนบอกว่าควรมีเวอร์ชันแปลงเป็น DTMF (touch-tone) ด้วย ในออสเตรเลียเคยมีคนทำกล่องเล็ก ๆ ที่กินไฟจากสายโทรศัพท์เพื่อแปลงสัญญาณหมุนเป็น touch-tone ทำให้ยังใช้กับสายโทรศัพท์ปกติได้นาน แต่ก็น่าเสียดายที่อาคารสมัยนี้แทบไม่มีสายโทรศัพท์แล้ว
    • ยังสามารถต่อเข้ากับ FXS/ATA เพื่อใช้เป็นโทรศัพท์ voip ได้อยู่ และโทรศัพท์แท่งตั้งโต๊ะแบบ candlestick จากยุค 1920s ก็ยังใช้งานได้ด้วยวิธีนี้
  • บอกว่าตอนที่มาอ่านข้อความนี้ก็บังเอิญกำลังถอดโทรศัพท์แบบหมุนวางไว้บนโต๊ะและกำลังขึ้นลานพอดี เลยรู้สึกว่าบังเอิญดีจัง
    • สงสัยจริง ๆ ว่าโทรศัพท์ที่ถูกถอดชิ้นส่วนแล้ววางอยู่บนโต๊ะนั้นอยู่แบบนั้นมานานแค่ไหน เพราะของตัวเองก็คล้ายกันและน่าจะราว 2 ปีแล้ว