อินพุต

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

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

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

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

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

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

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

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

จุดควบคุม

มีหลายขั้นตอนในไปป์ไลน์อินพุตซึ่งส่งผลต่อการควบคุมพฤติกรรมของอุปกรณ์อินพุต

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

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

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

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

คุณสมบัติการกำหนดค่าบอร์ด

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

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

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

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

นี่คือตัวอย่างบางส่วน:

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

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

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

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

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

แผนที่สำคัญ

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

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

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

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

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

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

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

รหัสสแกนทางกายภาพ

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

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

การใช้งาน HID

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

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

รหัสคีย์ลินุกซ์

รหัสคีย์ 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' ซึ่งจากนั้นจะถูกแทรกลงในวิดเจ็ตข้อความที่โฟกัสอยู่ในปัจจุบัน

รหัสแกน Android

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

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

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

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

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

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

สถานะปุ่ม Android

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

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

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

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

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