อินพุต

ไอคอน HAL อินพุตของ Android

ระบบย่อยอินพุตของ Android ประกอบด้วยไปป์ไลน์เหตุการณ์ที่ข้ามหลายเลเยอร์ของระบบ

ไปป์ไลน์อินพุต

ที่เลเยอร์ต่ำสุด อุปกรณ์อินพุตจริงจะสร้างสัญญาณที่อธิบายการเปลี่ยนแปลงสถานะ เช่น การกดแป้นและจุดสัมผัส เฟิร์มแวร์ของอุปกรณ์จะเข้ารหัสและส่งสัญญาณเหล่านี้ด้วยวิธีใดวิธีหนึ่ง เช่น ส่งรายงาน USB HID ไปยังระบบ หรือสร้างการขัดจังหวะในบัส I2C

จากนั้นโปรแกรมควบคุมอุปกรณ์ในเคอร์เนล Linux จะถอดรหัสสัญญาณ เคอร์เนล Linux มีไดรเวอร์สำหรับอุปกรณ์ต่อพ่วงมาตรฐานหลายอย่าง โดยเฉพาะอุปกรณ์ที่เป็นไปตามโปรโตคอล HID อย่างไรก็ตาม OEM มักจะต้องจัดหาไดรเวอร์ที่กําหนดเองสําหรับอุปกรณ์แบบฝังที่ผสานรวมกับระบบในระดับล่างอย่างแน่นหนา เช่น หน้าจอสัมผัส

โปรแกรมควบคุมอุปกรณ์อินพุตมีหน้าที่แปลสัญญาณเฉพาะอุปกรณ์เป็นรูปแบบเหตุการณ์อินพุตมาตรฐานผ่านโปรโตคอลอินพุตของ Linux โปรโตคอลอินพุตของ Linux จะกำหนดชุดประเภทและรหัสเหตุการณ์มาตรฐานในlinux/input.hไฟล์ส่วนหัวของเคอร์เนล วิธีนี้ช่วยให้คอมโพเนนต์ภายนอกเคอร์เนลไม่ต้องสนใจรายละเอียดต่างๆ เช่น รหัสการสแกนทางกายภาพ การใช้งาน HID ข้อความ I2C พิน GPIO และอื่นๆ

ถัดไป คอมโพเนนต์ EventHub ของ Android จะอ่านเหตุการณ์อินพุตจากเคอร์เนลโดยเปิดไดรเวอร์ evdev ที่เชื่อมโยงกับอุปกรณ์อินพุตแต่ละเครื่อง จากนั้นคอมโพเนนต์ Android InputReader จะถอดรหัสเหตุการณ์อินพุตตามคลาสอุปกรณ์และสร้างสตรีมเหตุการณ์อินพุต Android ในกระบวนการนี้ ระบบจะแปลรหัสเหตุการณ์ของโปรโตคอลอินพุต Linux เป็นรหัสเหตุการณ์ของ Android ตามการกำหนดค่าอุปกรณ์อินพุต ไฟล์เลย์เอาต์แป้นพิมพ์ และตารางการแมปต่างๆ

สุดท้าย InputReader จะส่งเหตุการณ์อินพุตไปยัง InputDispatcher ซึ่งจะส่งต่อไปยังหน้าต่างที่เหมาะสม

จุดควบคุม

ไปป์ไลน์อินพุตมีหลายขั้นตอนที่ส่งผลต่อการควบคุมลักษณะการทํางานของอุปกรณ์อินพุต

การกำหนดค่าไดรเวอร์และเฟิร์มแวร์

ไดร์เวอร์อุปกรณ์อินพุตมักจะกำหนดค่าลักษณะการทำงานของอุปกรณ์อินพุตด้วยการตั้งค่าพารามิเตอร์ในรีจิสเตอร์หรือแม้แต่การอัปโหลดเฟิร์มแวร์เอง กรณีนี้เกิดขึ้นกับอุปกรณ์แบบฝังโดยเฉพาะ เช่น หน้าจอสัมผัสที่กระบวนการปรับเทียบส่วนใหญ่เกี่ยวข้องกับการปรับพารามิเตอร์เหล่านี้หรือแก้ไขเฟิร์มแวร์เพื่อให้มีความแม่นยำและการตอบสนองที่ต้องการ และเพื่อลดสัญญาณรบกวน

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

เอกสารประกอบนี้พยายามอธิบายการกำหนดค่าไดรเวอร์หรือเฟิร์มแวร์ แต่ให้คำแนะนำเกี่ยวกับการปรับเทียบอุปกรณ์โดยทั่วไป

พร็อพเพอร์ตี้การกําหนดค่ากระดาน

แพ็กเกจการสนับสนุนบอร์ดตัวประมวลผล (BSP) อาจส่งออกพร็อพเพอร์ตี้การกำหนดค่าบอร์ดมายัง SysFS ที่ใช้โดยคอมโพเนนต์ InputReader ของ Android เช่น ตำแหน่งของแป้นพิมพ์เสมือนบนหน้าจอสัมผัส

โปรดดูรายละเอียดเกี่ยวกับวิธีที่อุปกรณ์ต่างๆ ใช้พร็อพเพอร์ตี้การกําหนดค่าบอร์ดที่ส่วนคลาสอุปกรณ์

การซ้อนทับทรัพยากร

ลักษณะการทำงานบางอย่างของอินพุตได้รับการกำหนดค่าผ่านการวางซ้อนทรัพยากรใน config.xml เช่น การทำงานของสวิตช์ฝา

ลองดูตัวอย่างต่อไปนี้

  • config_lidKeyboardAccessibility: ระบุผลของสวิตช์ฝาว่าแป้นพิมพ์ฮาร์ดแวร์จะเข้าถึงได้หรือซ่อนอยู่

  • config_lidNavigationAccessibility: ระบุผลของสวิตช์ฝาว่าสามารถเข้าถึงหรือซ่อนแทร็กแพดได้หรือไม่

  • config_longPressOnPowerBehavior: ระบุสิ่งที่ควรเกิดขึ้นเมื่อผู้ใช้กดปุ่มเปิด/ปิดค้างไว้

  • config_lidOpenRotation: ระบุผลของสวิตช์ฝาต่อการวางแนวหน้าจอ

ดูรายละเอียดเกี่ยวกับตัวเลือกการกําหนดค่าแต่ละรายการได้ในเอกสารประกอบภายใน frameworks/base/core/res/res/values/config.xml

คีย์แมป

คอมโพเนนต์ EventHub และ InputReader ของ Android จะใช้แผนที่คีย์เพื่อกำหนดค่าการแมปจากรหัสเหตุการณ์ Linux ไปยังรหัสเหตุการณ์ Android สำหรับปุ่มจอยสติ๊กและแกนจอยสติ๊ก การแมปอาจขึ้นอยู่กับอุปกรณ์หรือภาษา

โปรดดูรายละเอียดเกี่ยวกับวิธีที่อุปกรณ์ต่างๆ ใช้แผนที่คีย์ในส่วนคลาสอุปกรณ์

ไฟล์การกำหนดค่าอุปกรณ์อินพุต

คอมโพเนนต์ EventHub และ InputReader ของ Android จะใช้ไฟล์การกําหนดค่าอุปกรณ์อินพุตเพื่อกําหนดค่าลักษณะพิเศษของอุปกรณ์ เช่น วิธีการรายงานข้อมูลขนาดการสัมผัส

โปรดดูรายละเอียดเกี่ยวกับวิธีที่อุปกรณ์ต่างๆ ใช้แผนที่การกําหนดค่าอุปกรณ์อินพุตที่ส่วนคลาสอุปกรณ์

ทำความเข้าใจการใช้งาน HID และรหัสเหตุการณ์

มักมีตัวระบุหลายรายการที่ใช้อ้างอิงถึงแป้นบนแป้นพิมพ์ ปุ่มบนตัวควบคุมเกม แกนจอยสติ๊ก หรือการควบคุมอื่นๆ ความสัมพันธ์ระหว่างตัวระบุเหล่านี้จะไม่เหมือนกันเสมอไป โดยขึ้นอยู่กับชุดตารางการแมป ซึ่งบางรายการเป็นแบบคงที่ และบางรายการจะแตกต่างกันไปตามลักษณะของอุปกรณ์ ไดรเวอร์อุปกรณ์ ภาษาปัจจุบัน การกำหนดค่าระบบ ค่ากําหนดของผู้ใช้ และปัจจัยอื่นๆ

โค้ดสแกนที่อุปกรณ์

รหัสสแกนจริงคือตัวระบุเฉพาะอุปกรณ์ที่เชื่อมโยงกับแต่ละปุ่ม แป้น หรือตัวควบคุมอื่นๆ เนื่องจากรหัสการสแกนจริงมักแตกต่างกันไปในแต่ละอุปกรณ์ เฟิร์มแวร์หรือไดรเวอร์อุปกรณ์จึงมีหน้าที่จับคู่รหัสเหล่านั้นกับตัวระบุมาตรฐาน เช่น การใช้งาน HID หรือรหัสคีย์ของ Linux

รหัสสแกนมักใช้กับแป้นพิมพ์ อุปกรณ์อื่นๆ มักสื่อสารในระดับต่ำโดยใช้พิน GPIO, ข้อความ I2C หรือวิธีอื่นๆ ด้วยเหตุนี้ เลเยอร์บนของซอฟต์แวร์สแต็กจึงต้องอาศัยไดรเวอร์อุปกรณ์เพื่อทําความเข้าใจสิ่งที่เกิดขึ้น

การใช้งาน HID

การใช้งาน HID คือตัวระบุมาตรฐานที่ใช้รายงานสถานะการควบคุม เช่น ปุ่มแป้นพิมพ์ แกนจอยสติ๊ก ปุ่มเมาส์ หรือจุดสัมผัส อุปกรณ์อินพุต USB และบลูทูธส่วนใหญ่เป็นไปตามข้อกำหนด HID ซึ่งช่วยให้ระบบสามารถอินเทอร์เฟซกับอุปกรณ์เหล่านั้นในลักษณะที่สอดคล้องกัน

เฟรมเวิร์ก Android อาศัยไดรเวอร์ HID ของเคอร์เนล Linux เพื่อแปลรหัสการใช้งาน HID เป็นรหัสคีย์ Linux และตัวระบุอื่นๆ ดังนั้น การใช้งาน HID จึงเป็นที่สนใจของผู้ผลิตอุปกรณ์ต่อพ่วงเป็นหลัก

รหัสคีย์ Linux

รหัสแป้นของ Linux คือตัวระบุมาตรฐานสำหรับแป้นหรือปุ่ม รหัสคีย์ของ Linux จะกำหนดไว้ในlinux/input.hไฟล์ส่วนหัวโดยใช้ค่าคงที่ที่ขึ้นต้นด้วยคำนำหน้า KEY_ หรือ BTN_ โปรแกรมควบคุมอินพุตเคอร์เนล Linux มีหน้าที่แปลรหัสการสแกนทางกายภาพ การใช้งาน HID และสัญญาณอื่นๆ ที่เจาะจงอุปกรณ์เป็นรหัสคีย์ของ Linux และส่งข้อมูลเกี่ยวกับรหัสเหล่านั้นเป็นส่วนหนึ่งของเหตุการณ์ EV_KEY

บางครั้ง Android API จะเรียกรหัสคีย์ Linux ที่เชื่อมโยงกับคีย์ว่า "รหัสสแกน" ในทางเทคนิคแล้ว การดำเนินการนี้ไม่ถูกต้อง แต่จะช่วยแยกรหัสคีย์ของ Linux ออกจากรหัสคีย์ของ Android ใน API

โค้ดแกนสัมบูรณ์หรือสัมพัทธ์ของ Linux

รหัสแกนสัมพัทธ์หรือสัมบูรณ์ของ Linux คือตัวระบุมาตรฐานสำหรับการรายงานการเคลื่อนไหวสัมพัทธ์หรือตำแหน่งสัมบูรณ์ตามแกน เช่น การเคลื่อนไหวสัมพัทธ์ของเมาส์ตามแกน X หรือตำแหน่งสัมบูรณ์ของจอยสติ๊กตามแกน X รหัสแกน Linux จะกำหนดไว้ในไฟล์ส่วนหัว linux/input.h โดยใช้ค่าคงที่ที่ขึ้นต้นด้วยคำนำหน้า REL_ หรือ ABS_ ไดร์เวอร์อินพุตเคอร์เนล Linux จะมีหน้าที่แปลการใช้งาน HID และสัญญาณอื่นๆ ที่เจาะจงอุปกรณ์เป็นรหัสแกน Linux และส่งข้อมูลเกี่ยวกับรหัสดังกล่าวเป็นส่วนหนึ่งของเหตุการณ์ EV_REL และ EV_ABS

รหัสสวิตช์ Linux

รหัสสวิตช์ Linux คือตัวระบุมาตรฐานสำหรับการรายงานสถานะของสวิตช์ในอุปกรณ์ เช่น สวิตช์ฝา Linux โค้ดสวิตช์จะกำหนดไว้ในlinux/input.hไฟล์ส่วนหัว โดยใช้ค่าคงที่ที่ขึ้นต้นด้วยคำนำหน้า SW_ ไดร์เวอร์อินพุตเคอร์เนล Linux จะรายงานการเปลี่ยนแปลงสถานะของสวิตช์เป็นเหตุการณ์ EV_SW

โดยทั่วไปแอปพลิเคชัน Android จะไม่รับเหตุการณ์จากสวิตช์ แต่ระบบอาจใช้เหตุการณ์ดังกล่าวภายในเพื่อควบคุมฟังก์ชันต่างๆ ที่เจาะจงอุปกรณ์

รหัสคีย์ Android

รหัสคีย์ Android คือตัวระบุมาตรฐานที่กําหนดไว้ใน Android API เพื่อระบุคีย์หนึ่งๆ เช่น "HOME" รหัสคีย์ Android จะกำหนดโดยคลาส android.view.KeyEvent เป็นค่าคงที่ที่ขึ้นต้นด้วยคำนำหน้า KEYCODE_

เลย์เอาต์แป้นพิมพ์จะระบุวิธีแมปรหัสแป้นพิมพ์ของ Linux กับรหัสแป้นพิมพ์ของ Android อาจมีการใช้เลย์เอาต์แป้นพิมพ์ที่แตกต่างกัน ทั้งนี้ขึ้นอยู่กับรุ่น ภาษา ประเทศ เลย์เอาต์ หรือฟังก์ชันพิเศษของแป้นพิมพ์

ระบบจะเปลี่ยนชุดค่าผสมของรหัสคีย์ Android เป็นรหัสอักขระโดยใช้แผนที่อักขระคีย์เฉพาะอุปกรณ์และภาษา เช่น เมื่อกดแป้นที่ระบุเป็น KEYCODE_SHIFT และ KEYCODE_A พร้อมกัน ระบบจะค้นหาชุดค่าผสมในแผนที่อักขระของแป้นพิมพ์และพบตัวอักษรตัวพิมพ์ใหญ่ "A" จากนั้นจะแทรกตัวอักษรดังกล่าวลงในวิดเจ็ตข้อความที่โฟกัสอยู่

รหัส Axis ของ Android

รหัสแกน Android คือตัวระบุมาตรฐานที่กําหนดไว้ใน Android API เพื่อระบุแกนของอุปกรณ์ที่เฉพาะเจาะจง รหัสแกนของ Android กำหนดโดยคลาส android.view.MotionEvent เป็นค่าคงที่ที่ขึ้นต้นด้วยคำนำหน้า AXIS_

เลย์เอาต์คีย์จะระบุวิธีแมปรหัสแกน X และ Y ของ Linux กับรหัสแกน X และ Y ของ Android อาจมีการใช้เลย์เอาต์แป้นพิมพ์ที่แตกต่างกันโดยขึ้นอยู่กับรุ่นอุปกรณ์ ภาษา ประเทศ เลย์เอาต์ หรือฟังก์ชันพิเศษ

สถานะเมตาของ Android

เมตาสถานะของ Android คือตัวระบุมาตรฐานที่กําหนดไว้ใน Android API เพื่อระบุแป้นตัวแก้ไขที่กด สถานะเมตาของ Android กำหนดโดยคลาส android.view.KeyEvent เป็นค่าคงที่ที่ขึ้นต้นด้วยคำนำหน้า META_

สถานะเมตาปัจจุบันจะกำหนดโดยคอมโพเนนต์ InputReader ของ Android ซึ่งจะตรวจสอบเมื่อมีการกด / ปล่อยแป้นแปรสภาพ เช่น KEYCODE_SHIFT_LEFT และตั้งค่า / รีเซ็ต Flag สถานะเมตาที่เหมาะสม

ความสัมพันธ์ระหว่างแป้นกดร่วมกับสถานะเมตาจะได้รับการฮาร์ดโค้ดไว้ แต่เลย์เอาต์แป้นพิมพ์สามารถเปลี่ยนวิธีแมปแป้นกดร่วม ซึ่งจะส่งผลต่อสถานะเมตา

สถานะปุ่ม Android

สถานะปุ่ม Android คือตัวระบุมาตรฐานที่กําหนดไว้ใน Android API เพื่อระบุปุ่ม (บนเมาส์หรือสไตลัส) ที่กดอยู่ สถานะของปุ่ม Android กำหนดโดยandroid.view.MotionEvent คลาสเป็นค่าคงที่ที่ขึ้นต้นด้วยคำนำหน้า BUTTON_

สถานะปุ่มปัจจุบันจะกำหนดโดยคอมโพเนนต์ InputReader ของ Android ซึ่งจะตรวจสอบเมื่อมีการกด / ปล่อยปุ่ม (บนเมาส์หรือปากกาสไตลัส) และตั้งค่า / รีเซ็ต Flag สถานะปุ่มที่เหมาะสม

ความสัมพันธ์ระหว่างปุ่มและสถานะปุ่มเป็นแบบฮาร์ดโค้ด

อ่านเพิ่มเติม

  1. รหัสเหตุการณ์การป้อนข้อมูลของ Linux
  2. โปรโตคอลการสัมผัสหลายจุดของ Linux
  3. ไดรเวอร์อินพุต Linux
  4. การตอบสนองด้วยแรงสัมผัสของ Linux
  5. ข้อมูล HID รวมถึงตารางการใช้งาน HID