ป้อนข้อมูล

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

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

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

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

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

รหัสแกนสัมพัทธ์หรือสัมบูรณ์ของลินุกซ์

รหัสแกนสัมพัทธ์หรือแกนสัมบูรณ์ของ 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 Meta State

สถานะเมตาของ 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. ไดรเวอร์อินพุตลินุกซ์
  4. คำติชมของกองทัพลินุกซ์
  5. ข้อมูล HID รวมถึงตารางการใช้งาน HID