เคอร์เนล Linux วางรหัสการสแกนคีย์บอร์ดแบบกำหนดเอง


16

ฉันมีแป้นพิมพ์ M คีย์ IBM 122 รุ่นวินเทจที่ฉันปรับให้ใช้กับคอมพิวเตอร์ที่ทันสมัย ฉันใช้ Teensy 2.0 เพื่อทำการเข้ารหัสและจัดการกับด้าน USB ของสิ่งต่าง ๆ ฉันยืมเฟิร์มแวร์จากโครงการแป้นพิมพ์ฮัมเบิลแฮ็กเกอร์ ( https://github.com/humblehacker/keyboard ) และฉันเพิ่มคีย์พิเศษในการกำหนดค่าบิลด์ จนถึงตอนนี้ดีมาก

คีย์ "ปกติ" ทั้งหมดใช้งานได้ แต่เคอร์เนลดูเหมือนจะวางคีย์พิเศษ ( F13- F24และอื่น ๆ )

การเรียกใช้/lib/udev/keymap -i input/event0แสดงรหัสสแกนของปุ่มปกติทั้งหมด แต่ไม่มีสิ่งใดสำหรับปุ่มพิเศษ

การเรียกใช้wiresharkแพ็คเก็ตเพื่อจับแพ็คเก็ตพอร์ต USB แสดงว่าแป้นพิมพ์กำลังส่งรหัสสแกน แต่ดูเหมือนว่าเคอร์เนลกำลังวางมันลงบนหลักการ

ฉันรู้สึกว่านี่เป็นสิ่งที่อยู่ในเคอร์เนลไดรเวอร์ที่ไม่ส่งโค้ดสแกนที่ไม่ได้คาดหวัง

ฉันคิดว่าจะมีการเรียงลำดับของคีย์หลัก "master" ใน.hไฟล์บางไฟล์ในเคอร์เนลที่อื่น แต่จนถึงตอนนี้ฉันยังไม่ประสบความสำเร็จในความพยายามที่จะค้นหา

เป็นเรื่องที่น่าเครียดที่ฉันไม่ได้ถามเกี่ยวกับการทำแผนที่ปุ่มพิเศษใน X เหมือนกับคนอื่น ๆ ก่อนหน้าฉัน นี่เป็นปัญหาระดับต่ำซึ่งมีความเกี่ยวข้องกับเคอร์เนล สมมติว่าฉันจะไม่ใช้ X เลย สิ่งที่ฉันต้องการก็คือรหัสสแกนจะปรากฏขึ้นเมื่อฉันเรียกใช้/lib/udev/keymap -iฉันสามารถทำส่วนที่เหลือจากที่นั่นได้


ฉันรู้ว่าสิ่งนี้ไม่ได้ช่วย แต่: ทำไมคุณใช้ Teensy? แป้นพิมพ์นั้นควรทำงานกับอะแดปเตอร์ PS2 / USB แบบตรง
goldilocks

แป้นพิมพ์มาจากเทอร์มินัล IBM เก่ามันไม่ได้ใช้โปรโตคอลที่เข้ากันได้กับ PS / 2
user2543941

ว้าว. อาจเป็นไปได้ว่าคนขับไม่ผ่านกิจกรรม (ดูที่ส่วนสุดท้ายที่นี่ ) คุณสามารถลองevtestแทน/lib/udev/keymap -iไม่ได้ถ้ามันจะออกมาแตกต่างกัน
goldilocks

1
evtest ยังไม่แสดงอะไรเมื่อใช้ปุ่มพิเศษ
user2543941

1
ดูเหมือนว่าถ้าคุณต้องการใช้คีย์เหล่านั้นโปรเจคของคุณก็จะใหญ่ขึ้นฮ่า ๆ สิ่งที่ยากที่สุดเกี่ยวกับการเขียนไดรเวอร์แป้นพิมพ์คือการเรียนรู้ API มิฉะนั้นพวกเขาจะดูไม่ซับซ้อนนัก ฉันยังไม่ได้ทำอะไรเคอร์เนลในขณะนี้ แต่: LDD3ยังคงใช้ได้สำหรับ 3.x ฉันคิดว่า
goldilocks

คำตอบ:


1

เคอร์เนลเห็นรหัสสแกนแปลก ๆ และวางลง ฉันจะลองรับค่ารหัสสแกนเหล่านั้นจากนั้นอัพเดตดัชนีฐานข้อมูลฮาร์ดแวร์ ดังนั้นในระยะสั้นแผนคือ:

  • รับรหัสจากเอาต์พุต dmesg - dmesg ควรแสดงผลลัพธ์เช่นนี้เมื่อกดรหัสที่ไม่รู้จัก:

    Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0)
    

a0 เป็นค่ารหัส

  • สร้างไฟล์การแมปรหัสที่กำหนดเอง ตัวอย่างและความช่วยเหลืออยู่ในไฟล์เริ่มต้น
    ( /usr/lib/udev/hwdb.d/60-keyboard.hwdbสำหรับ Arch อาจแตกต่างจากการกระจายอื่น ๆ )

  • อัพเดตและทริกเกอร์ฐานข้อมูลฮาร์ดแวร์โดยรันคำสั่ง:

    > udevadm hwdb --update
    > udevadm trigger /dev/input/eventXX
    

ที่eventXXสอดคล้องกับแป้นพิมพ์ของคุณ (คุณจะได้รับโดยการทำงานevtest) คุณสามารถรีบูตแทนการกระตุ้น

ดูในArch wikiและไฟล์การแมปรหัสคีย์เริ่มต้นสำหรับคำอธิบายโดยละเอียดเพิ่มเติม (หรือในเอกสารประกอบการแจกจ่ายของคุณหากไม่ใช่ Arch)

นี่เป็นวิธีที่เชื่อถือได้และใช้งานง่ายทำให้การแมปในระดับเคอร์เนลทำงานได้ทุกที่กับเซิร์ฟเวอร์ดิสเพลย์ DE เป็นต้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.