Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

อินพุต

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

ระบบย่อยอินพุตของ 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 สำหรับรายละเอียดเกี่ยวกับอ็อพชันคอนฟิกูเรชันแต่ละตัว

แผนที่สำคัญ

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

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

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

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

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

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

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

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

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

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

การใช้งาน HID

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

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

รหัสคีย์ Linux

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

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

Linux Relative หรือ Absolute Axis Code

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

รหัสสวิตช์ลินุกซ์

รหัสสวิตช์ Linux เป็นตัวระบุมาตรฐานสำหรับรายงานสถานะของสวิตช์บนอุปกรณ์เช่นสวิตช์ฝาปิด รหัสสวิตช์ของ Linux ถูกกำหนดไว้ในไฟล์ส่วนหัว linux/input.h โดยใช้ค่าคงที่ที่ขึ้นต้นด้วยคำนำหน้า SW_ ไดรเวอร์อินพุตเคอร์เนลของลินุกซ์รายงานสถานะสวิตช์เปลี่ยนเป็นเหตุการณ์ 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_

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

สถานะ Meta ของ Android

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

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

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

สถานะปุ่ม Android

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

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

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

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

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