Mengimplementasikan USB HAL

Rilis Android 8.0 memindahkan penanganan perintah USB dari skrip init dan masuk 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). Peralihan ke desain Hardware Abstraksi Layer (HAL) menghasilkan implementasi yang jauh lebih rapi yang memecahkan masalah ini:

  1. Operasi seperti penulisan ke node sysfs kernel dapat gagal, tetapi tidak disebarkan kembali ke kode framework yang menetapkan pemicu properti. Akibatnya, framework salah mengasumsikan bahwa operasi telah berhasil meskipun telah gagal secara diam-diam.
  2. Skrip init memiliki jumlah operasi terbatas yang dapat dijalankan.

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 HAL USB, 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.

Berdasarkan model Treble yang juga diperkenalkan di Android 8.0, semua HAL diisolasi dari layanan Sistem dan diwajibkan untuk berjalan di daemon native-nya sendiri. Hal ini menghilangkan persyaratan untuk memiliki daemon USB eksklusif karena lapisan HAL berfungsi sebagai daemon USB dengan baik.

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

Implementasi

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