
ระบบย่อยอินพุตของ Android ในนามประกอบด้วยไปป์ไลน์เหตุการณ์ที่ข้ามผ่านหลายเลเยอร์ของระบบ
ท่ออินพุต
ที่ชั้นต่ำสุด อุปกรณ์อินพุตทางกายภาพจะสร้างสัญญาณที่อธิบายการเปลี่ยนแปลงสถานะ เช่น การกดปุ่มและจุดสัมผัสสัมผัส เฟิร์มแวร์ของอุปกรณ์จะเข้ารหัสและส่งสัญญาณเหล่านี้ในทางใดทางหนึ่ง เช่น โดยการส่งรายงาน USB HID ไปยังระบบ หรือโดยการขัดจังหวะบนบัส I2C
สัญญาณจะถูกถอดรหัสโดยโปรแกรมควบคุมอุปกรณ์ในเคอร์เนล 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 และ Bluetooth ส่วนใหญ่เป็นไปตามข้อกำหนดเฉพาะของ HID ซึ่งทำให้ระบบสามารถเชื่อมต่อกับอุปกรณ์เหล่านั้นในลักษณะเดียวกัน
Android Framework อาศัยไดรเวอร์ HID ของเคอร์เนล Linux เพื่อแปลรหัสการใช้งาน 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/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