ป้อนข้อมูล

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

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

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

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