Implementacja interfejsu HAL USB

W Androidzie 8.0 przenosimy obsługę poleceń USB ze skryptów init do natywnego demona USB, aby poprawić konfigurację i niezawodność kodu. W przypadku konfiguracji funkcji Gadget skrypty init (wyzwalacze właściwości) służą do wykonywania operacji na gadżetach specyficznych dla urządzenia.

W poprzednich wersjach te konfiguracje specyficzne dla urządzenia były realizowane za pomocą skryptów init specyficznych dla urządzenia (z użyciem wyzwalaczy właściwości). Przejście na warstwę abstrakcji sprzętowej (HAL) zapewnia znacznie czystszą implementację, która rozwiązuje te problemy:

  1. Operacje takie jak zapisywanie w węzłach sysfs jądra mogą się nie powieść, ale nie są propagowane z powrotem do kodu platformy, który ustawia wyzwalacz właściwości. W rezultacie platforma błędnie zakłada, że operacje się powiodły, mimo że w rzeczywistości nie powiodły się po cichu.
  2. Skrypty init mają ograniczoną liczbę operacji, które można wykonać.

W Androidzie 12 dodaliśmy obsługę USB Gadget HAL dla modeli sterowania siecią (NCM) i wywołań API, które zwracają zarówno numer wersji HAL, jak i prędkość USB. Więcej informacji o wywołaniach API dostępnych przez USB HAL znajdziesz w podsumowaniu pakietu android.hardware.usb.

HAL i Treble

Skrypty init specyficzne dla urządzenia były używane jako zamiennik warstw HAL do wykonywania operacji USB specyficznych dla urządzenia. USB (przez ADB) to podstawowy interfejs do debugowania problemów z systemem. Natywny demon do konfigurowania USB eliminuje zależność od kodu platformy, więc nawet jeśli platforma ulegnie awarii, USB powinno działać.

W modelu Treble wprowadzonym w Androidzie 8.0 wszystkie warstwy HAL są odizolowane od usług systemowych i muszą działać w swoich własnych natywnych demonach. Eliminuje to konieczność posiadania wyłącznego demona USB, ponieważ warstwa HAL pełni również funkcję demona USB.

Domyślna implementacja HAL obsługuje wszystkie urządzenia z Androidem w wersji wcześniejszej niż 8.0. Dlatego w przypadku urządzeń z Androidem w wersji wcześniejszej niż 8.0 nie trzeba wykonywać żadnych prac specyficznych dla urządzenia. Android 8.0 używa interfejsu HAL do sprawdzania stanu portów USB oraz do przełączania ról danych i ról zasilania.

Implementacja

Na każdym urządzeniu z Androidem 8.0 trzeba zaimplementować nowy interfejs USB HAL. Domyślna implementacja powinna obsługiwać urządzenia z Androidem w wersji wcześniejszej niż 8.0. Domyślna implementacja jest wystarczająca, jeśli urządzenie używa klasy dual_role_usb do raportowania stanu portu typu C. W skryptach USB specyficznych dla urządzenia mogą być wymagane drobne zmiany, aby przekazać własność węzłów typu C do systemu.