Mengimplementasikan HAL USB

Rilis Android 8.0 memindahkan penanganan perintah USB dari skrip init ke daemon USB native untuk konfigurasi yang lebih baik dan keandalan kode. Untuk konfigurasi fungsi Gadget, skrip init (pemicu properti) digunakan untuk melakukan operasi gadget khusus perangkat.

Pada rilis sebelumnya, konfigurasi khusus perangkat ini dicapai melalui skrip init khusus perangkat (menggunakan pemicu properti). Beralih ke desain Hardware Abstraction Layer (HAL) menghasilkan penerapan yang jauh lebih bersih yang memecahkan masalah ini:

  1. Operasi seperti penulisan ke node sysfs kernel dapat gagal, tetapi tidak dipropagasi kembali ke kode framework yang menetapkan pemicu properti. Akibatnya, framework secara keliru mengasumsikan bahwa operasi telah berhasil meskipun operasi tersebut gagal tanpa pemberitahuan.
  2. Skrip init memiliki jumlah operasi terbatas yang dapat dieksekusi.

Rilis Android 12 menambahkan dukungan HAL Gadget USB untuk Model Kontrol Jaringan (NCM) dan panggilan API yang menampilkan nomor versi HAL dan kecepatan USB. Untuk mengetahui informasi selengkapnya tentang panggilan API yang tersedia melalui USB HAL, lihat ringkasan paket android.hardware.usb.

HAL dan Treble

Skrip initspesifik per perangkat digunakan sebagai pengganti lapisan HAL untuk melakukan operasi USB spesifik per perangkat. USB (melalui ADB) adalah antarmuka utama untuk men-debug masalah sistem. Dengan adanya daemon native untuk melakukan konfigurasi USB, dependensi pada kode framework akan dihilangkan sehingga meskipun framework mengalami error, USB akan tetap berjalan.

Dalam model Treble yang juga diperkenalkan di Android 8.0, semua HAL diisolasi dari layanan Sistem dan harus berjalan di daemon native-nya sendiri. Dengan demikian, Anda tidak perlu memiliki daemon USB eksklusif karena lapisan HAL berfungsi ganda dengan baik sebagai daemon USB.

Penerapan HAL default menangani semua perangkat pra-Android 8.0. Oleh karena itu, tidak ada pekerjaan khusus perangkat untuk perangkat sebelum Android 8.0. Android 8.0 menggunakan antarmuka HAL untuk mengkueri status port USB dan melakukan pertukaran peran data dan peran daya.

Implementasi

Antarmuka HAL USB baru harus diimplementasikan di setiap perangkat yang diluncurkan di Android 8.0. Implementasi default akan menangani perangkat sebelum Android 8.0. Penerapan default sudah cukup jika perangkat menggunakan class dual_role_usb untuk melaporkan status port type-c. Perubahan kecil mungkin diperlukan dalam skrip USB khusus perangkat untuk mentransfer kepemilikan node typc-c ke sistem.