ระบบย่อยอินพุต 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 ซึ่งจะตรวจสอบเมื่อมีการกด / ปล่อยปุ่ม (บนเมาส์หรือสไตลัส) และตั้งค่า / รีเซ็ตการตั้งค่าสถานะของปุ่มที่เหมาะสม
ความสัมพันธ์ระหว่างปุ่มและสถานะของปุ่มเป็นแบบฮาร์ดโค้ด
อ่านเพิ่มเติม
- รหัสเหตุการณ์อินพุต Linux
- โปรโตคอลมัลติทัชลินุกซ์
- ไดรเวอร์อินพุต Linux
- การตอบสนองของ Linux
- ข้อมูล HID รวมถึงตารางการใช้งาน HID