Masukan

Ikon Masukan Android HAL

Subsistem input Android secara nominal terdiri dari event pipeline yang melintasi beberapa lapisan sistem.

Pipa masukan

Pada lapisan paling bawah, perangkat input fisik menghasilkan sinyal yang menggambarkan perubahan keadaan seperti penekanan tombol dan titik kontak sentuh. Firmware perangkat mengkodekan dan mengirimkan sinyal-sinyal ini dengan beberapa cara seperti dengan mengirimkan laporan HID USB ke sistem atau dengan menghasilkan interupsi pada bus I2C.

Sinyal tersebut kemudian diterjemahkan oleh driver perangkat di kernel Linux. Kernel Linux menyediakan driver untuk banyak periferal standar, khususnya yang mematuhi protokol HID. Namun, OEM sering kali harus menyediakan driver khusus untuk perangkat tertanam yang terintegrasi erat ke dalam sistem pada tingkat rendah, seperti layar sentuh.

Driver perangkat masukan bertanggung jawab untuk menerjemahkan sinyal khusus perangkat ke dalam format kejadian masukan standar, melalui protokol masukan Linux. Protokol masukan Linux mendefinisikan serangkaian standar jenis peristiwa dan kode dalam file header kernel linux/input.h . Dengan cara ini, komponen di luar kernel tidak perlu mempedulikan detail seperti kode pemindaian fisik, penggunaan HID, pesan I2C, pin GPIO, dan sejenisnya.

Selanjutnya, komponen Android EventHub membaca kejadian masukan dari kernel dengan membuka driver evdev yang terkait dengan setiap perangkat masukan. Komponen Android InputReader kemudian mendekode kejadian masukan sesuai dengan kelas perangkat dan menghasilkan aliran kejadian masukan Android. Sebagai bagian dari proses ini, kode kejadian protokol masukan Linux diterjemahkan ke dalam kode kejadian Android sesuai dengan konfigurasi perangkat masukan, file tata letak keyboard, dan berbagai tabel pemetaan.

Terakhir, InputReader mengirimkan kejadian masukan ke InputDispatcher yang meneruskannya ke jendela yang sesuai.

Titik kontrol

Ada beberapa tahapan dalam pipa masukan yang mempengaruhi kontrol atas perilaku perangkat masukan.

Konfigurasi driver dan firmware

Driver perangkat input sering kali mengonfigurasi perilaku perangkat input dengan mengatur parameter di register atau bahkan mengunggah firmware itu sendiri. Hal ini terutama terjadi pada perangkat tertanam seperti layar sentuh yang sebagian besar proses kalibrasinya melibatkan penyetelan parameter ini atau perbaikan firmware untuk memberikan akurasi dan respons yang diinginkan serta untuk menekan noise.

Opsi konfigurasi driver sering kali ditentukan sebagai parameter modul dalam paket dukungan papan kernel (BSP) sehingga driver yang sama dapat mendukung beberapa implementasi perangkat keras yang berbeda.

Dokumentasi ini berupaya menjelaskan konfigurasi driver atau firmware, namun menawarkan panduan mengenai kalibrasi perangkat secara umum.

Properti konfigurasi papan

Paket dukungan papan kernel (BSP) dapat mengekspor properti konfigurasi papan melalui SysFS yang digunakan oleh komponen Android InputReader, seperti penempatan tombol virtual pada layar sentuh.

Lihat bagian kelas perangkat untuk rincian tentang bagaimana perangkat yang berbeda menggunakan properti konfigurasi papan.

Hamparan sumber daya

Beberapa perilaku masukan dikonfigurasi melalui hamparan sumber daya di config.xml seperti pengoperasian sakelar penutup.

Berikut beberapa contohnya:

  • config_lidKeyboardAccessibility : Menentukan efek tombol penutup pada apakah keyboard perangkat keras dapat diakses atau disembunyikan.

  • config_lidNavigationAccessibility : Menentukan efek tombol penutup pada apakah trackpad dapat diakses atau disembunyikan.

  • config_longPressOnPowerBehavior : Menentukan apa yang harus terjadi ketika pengguna menahan tombol daya.

  • config_lidOpenRotation : Menentukan efek tombol penutup pada orientasi layar.

Lihat dokumentasi dalam frameworks/base/core/res/res/values/config.xml untuk detail tentang setiap opsi konfigurasi.

Peta kunci

Peta kunci digunakan oleh komponen Android EventHub dan InputReader untuk mengonfigurasi pemetaan dari kode peristiwa Linux ke kode peristiwa Android untuk kunci, tombol joystick, dan sumbu joystick. Pemetaannya mungkin bergantung pada perangkat atau bahasa.

Lihat bagian kelas perangkat untuk detail tentang cara berbagai perangkat menggunakan peta utama.

File konfigurasi perangkat masukan

File konfigurasi perangkat input digunakan oleh komponen Android EventHub dan InputReader untuk mengonfigurasi karakteristik perangkat khusus seperti cara informasi ukuran sentuhan dilaporkan.

Lihat bagian kelas perangkat untuk detail tentang bagaimana perangkat yang berbeda menggunakan peta konfigurasi perangkat input.

Pahami penggunaan HID dan kode peristiwa

Seringkali ada beberapa pengenal berbeda yang digunakan untuk merujuk pada tombol tertentu pada keyboard, tombol pada pengontrol permainan, sumbu joystick, atau kontrol lainnya. Hubungan antara pengidentifikasi ini tidak selalu sama: mereka bergantung pada sekumpulan tabel pemetaan, beberapa diantaranya bersifat tetap, dan beberapa lainnya bervariasi berdasarkan karakteristik perangkat, driver perangkat, lokasi saat ini, konfigurasi sistem, preferensi pengguna dan faktor lainnya.

Kode Pemindaian Fisik

Kode pemindaian fisik adalah pengidentifikasi khusus perangkat yang dikaitkan dengan setiap kunci, tombol, atau kontrol lainnya. Karena kode pemindaian fisik sering kali berbeda dari satu perangkat ke perangkat lainnya, firmware atau driver perangkat bertanggung jawab untuk memetakannya ke pengidentifikasi standar seperti Penggunaan HID atau kode kunci Linux.

Kode pindaian terutama menarik untuk keyboard. Perangkat lain biasanya berkomunikasi pada tingkat rendah menggunakan pin GPIO, pesan I2C, atau cara lain. Akibatnya, lapisan atas tumpukan perangkat lunak bergantung pada driver perangkat untuk memahami apa yang sedang terjadi.

Penggunaan HID

Penggunaan HID adalah pengidentifikasi standar yang digunakan untuk melaporkan status kontrol seperti tombol keyboard, sumbu joystick, tombol mouse, atau titik kontak sentuh. Sebagian besar perangkat input USB dan Bluetooth mematuhi spesifikasi HID, yang memungkinkan sistem untuk berinteraksi dengannya secara seragam.

Kerangka Android bergantung pada driver HID kernel Linux untuk menerjemahkan kode penggunaan HID menjadi kode kunci Linux dan pengidentifikasi lainnya. Oleh karena itu penggunaan HID terutama menarik bagi produsen periferal.

Kode Kunci Linux

Kode kunci Linux adalah pengidentifikasi standar untuk kunci atau tombol. Kode kunci Linux didefinisikan dalam file header linux/input.h menggunakan konstanta yang dimulai dengan awalan KEY_ atau BTN_ . Driver input kernel Linux bertanggung jawab untuk menerjemahkan kode pemindaian fisik, penggunaan HID, dan sinyal khusus perangkat lainnya ke dalam kode kunci Linux dan mengirimkan informasi tentangnya sebagai bagian dari peristiwa EV_KEY .

Android API terkadang mengacu pada kode kunci Linux yang terkait dengan kunci sebagai "kode pindaian". Ini secara teknis salah tetapi membantu membedakan kode kunci Linux dari kode kunci Android di API.

Kode Sumbu Relatif atau Absolut Linux

Kode sumbu relatif atau absolut Linux adalah pengidentifikasi standar untuk melaporkan pergerakan relatif atau posisi absolut di sepanjang sumbu, seperti pergerakan relatif mouse di sepanjang sumbu X atau posisi absolut joystick di sepanjang sumbu X. Kode sumbu Linux didefinisikan dalam file header linux/input.h menggunakan konstanta yang dimulai dengan awalan REL_ atau ABS_ . Driver input kernel Linux bertanggung jawab untuk menerjemahkan penggunaan HID dan sinyal khusus perangkat lainnya ke dalam kode sumbu Linux dan mengirimkan informasi tentangnya sebagai bagian dari peristiwa EV_REL dan EV_ABS .

Kode Pengalih Linux

Kode saklar Linux adalah pengidentifikasi standar untuk melaporkan status saklar pada perangkat, seperti saklar penutup. Kode saklar Linux didefinisikan dalam file header linux/input.h menggunakan konstanta yang dimulai dengan awalan SW_ . Driver input kernel Linux melaporkan perubahan status peralihan sebagai peristiwa EV_SW .

Aplikasi Android umumnya tidak menerima kejadian dari switch, namun sistem dapat menggunakannya secara internal untuk mengontrol berbagai fungsi spesifik perangkat.

Kode Kunci Android

Kode kunci Android adalah pengidentifikasi standar yang ditentukan dalam API Android untuk menunjukkan kunci tertentu seperti 'HOME'. Kode kunci Android didefinisikan oleh kelas android.view.KeyEvent sebagai konstanta yang dimulai dengan awalan KEYCODE_ .

Tata letak kunci menentukan cara kode kunci Linux dipetakan ke kode kunci Android. Tata letak tombol yang berbeda dapat digunakan tergantung pada model keyboard, bahasa, negara, tata letak, atau fungsi khusus.

Kombinasi kode kunci Android diubah menjadi kode karakter menggunakan perangkat dan peta karakter kunci lokal tertentu. Misalnya, ketika tombol yang diidentifikasi sebagai KEYCODE_SHIFT dan KEYCODE_A ditekan bersamaan, sistem akan mencari kombinasi tersebut di peta karakter kunci dan menemukan huruf kapital 'A', yang kemudian dimasukkan ke dalam widget teks yang saat ini difokuskan.

Kode Sumbu Android

Kode sumbu Android adalah pengidentifikasi standar yang ditentukan dalam API Android untuk menunjukkan sumbu perangkat tertentu. Kode sumbu Android didefinisikan oleh kelas android.view.MotionEvent sebagai konstanta yang dimulai dengan awalan AXIS_ .

Tata letak kunci menentukan bagaimana Kode Sumbu Linux dipetakan ke kode sumbu Android. Tata letak tombol yang berbeda dapat digunakan tergantung pada model perangkat, bahasa, negara, tata letak, atau fungsi khusus.

Status Meta Android

Status meta Android adalah pengidentifikasi standar yang ditentukan dalam API Android untuk menunjukkan tombol pengubah mana yang ditekan. Status meta Android ditentukan oleh class android.view.KeyEvent sebagai konstanta yang dimulai dengan awalan META_ .

Status meta saat ini ditentukan oleh komponen Android InputReader yang memantau kapan tombol pengubah seperti KEYCODE_SHIFT_LEFT ditekan/dilepaskan dan menyetel/mereset tanda status meta yang sesuai.

Hubungan antara kunci pengubah dan status meta bersifat hardcode tetapi tata letak kunci dapat mengubah cara kunci pengubah itu sendiri dipetakan yang pada gilirannya memengaruhi status meta.

Status Tombol Android

Status tombol Android adalah pengidentifikasi standar yang ditentukan dalam API Android untuk menunjukkan tombol mana (pada mouse atau stylus) yang ditekan. Status tombol Android ditentukan oleh class android.view.MotionEvent sebagai konstanta yang dimulai dengan awalan BUTTON_ .

Status tombol saat ini ditentukan oleh komponen Android InputReader yang memantau kapan tombol (pada mouse atau stylus) ditekan/dilepas dan menyetel/mereset tanda status tombol yang sesuai.

Hubungan antara tombol dan status tombol dikodekan secara keras.

Bacaan lebih lanjut

  1. Linux memasukkan kode peristiwa
  2. Protokol multi-sentuh Linux
  3. Driver masukan Linux
  4. Linux memaksa umpan balik
  5. Informasi HID, termasuk tabel penggunaan HID