Mengimplementasikan HAL USB

Rilis Android 8.0 memindahkan penanganan perintah USB dari skrip init ke daemon USB native untuk konfigurasi dan keandalan kode yang lebih baik. 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 salah mengasumsikan bahwa operasi telah berhasil meskipun gagal secara diam-diam.
  2. Skrip init memiliki jumlah operasi terbatas yang dapat dieksekusi.

Rilis Android 12 menambahkan dukungan USB Gadget HAL untuk Network Control Models (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 init khusus perangkat digunakan sebagai pengganti lapisan HAL untuk melakukan operasi USB khusus perangkat. USB (melalui ADB) adalah antarmuka utama untuk men-debug masalah sistem. Memiliki daemon native untuk melakukan konfigurasi USB akan menghilangkan dependensi pada kode framework 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. Hal ini menghilangkan persyaratan untuk memiliki daemon USB eksklusif karena lapisan HAL berfungsi ganda sebagai daemon USB.

Implementasi HAL default menangani semua perangkat sebelum Android 8.0. Oleh karena itu, tidak akan ada pekerjaan khusus perangkat untuk perangkat sebelum Android 8.0. Android 8.0 menggunakan antarmuka HAL untuk membuat kueri status port USB dan melakukan pertukaran peran data dan peran daya.

Penerapan

Antarmuka USB HAL baru harus diterapkan di setiap perangkat yang diluncurkan di Android 8.0. Implementasi default harus menangani perangkat sebelum Android 8.0. Implementasi 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.