![ไอคอน HAL อินพุตของ Android](https://source.android.google.cn/static/docs/core/interaction/input/images/ape_fwk_hal_input.png?authuser=19&hl=th)
ระบบย่อยอินพุตของ 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 สถานะปุ่มที่เหมาะสม
ความสัมพันธ์ระหว่างปุ่มและสถานะปุ่มเป็นแบบฮาร์ดโค้ด
อ่านเพิ่มเติม
- รหัสเหตุการณ์การป้อนข้อมูลของ Linux
- โปรโตคอลการสัมผัสหลายจุดของ Linux
- ไดรเวอร์อินพุต Linux
- การตอบสนองด้วยแรงสัมผัสของ Linux
- ข้อมูล HID รวมถึงตารางการใช้งาน HID