HAL definiuje standardowy interfejs dla dostawców sprzętu do wdrożenia który sprawia, że Android jest niezależny od implementacji sterowników niższego poziomu. Użycie HAL pozwala wdrożyć funkcje bez wpływu na z systemem wyższego poziomu. Na tej stronie opisujemy starszą architekturę, która nie jest obsługiwane przez Androida 8.0. W przypadku Androida 8.0 i nowszych wersji przeczytaj HAL Omówienie.
Musisz wdrożyć odpowiedni HAL (i sterownik) dla określonego
na sprzęcie dostępnym w ramach Twojego produktu. Implementacje HAL są zwykle wbudowane
moduły biblioteki udostępnionej (liczba plików: .so
), ale Android nie nakłada na nich nakazów.
standardu interakcji między implementacją HAL a sterownikami urządzeń,
zrób to, co najlepsze w Twojej sytuacji. Aby jednak umożliwić systemowi Android
współdziałają ze sprzętem, musisz przestrzegać
umowy zdefiniowanej dla każdego sprzętowego interfejsu HAL.
Aby mieć pewność, że HAL ma przewidywalną strukturę, każdy typ sprzętu
Interfejs HAL ma właściwości zdefiniowane w
hardware/libhardware/include/hardware/hardware.h
Ten interfejs
umożliwia systemowi Android ładowanie prawidłowych wersji modułów HAL w
w spójny sposób. Interfejs HAL składa się z 2 elementów: modułów i urządzeń.
Moduły HAL
Moduł reprezentuje Twoją implementację HAL w pakiecie, która jest przechowywana jako
zasoby wspólne (.so file
).
Plik nagłówka hardware/libhardware/include/hardware/hardware.h
określa strukturę (hw_module_t
), która reprezentuje moduł i
zawiera metadane, takie jak wersja, nazwa i autor modułu. Android,
korzysta z tych metadanych do prawidłowego znalezienia i wczytania modułu HAL.
Dodatkowo struktura hw_module_t
zawiera wskaźnik do
inny element struct (hw_module_methods_t
), który zawiera wskaźnik do
funkcję otwartą dla modułu. Ta otwarta funkcja służy do inicjowania
komunikacji ze sprzętem, dla którego HAL jest abstrakcyjnym elementem.
Każda sprzętowa lista HAL zazwyczaj rozszerza ogólny zakres hw_module_t
z dodatkowymi informacjami o danym elemencie sprzętowym. Dla:
np. w HAL aparatu element struct camera_module_t
zawiera
Element hw_module_t
struct wraz z inną funkcją związaną z aparatem
wskaźniki:
typedef struct camera_module { hw_module_t common; int (*get_number_of_cameras)(void); int (*get_camera_info)(int camera_id, struct camera_info *info); } camera_module_t;
Gdy implementujesz HAL i tworzysz strukturę modułu, musisz nazwać ją
HAL_MODULE_INFO_SYM
Przykład z HAL urządzenia Nexus 9 Audio:
struct audio_module HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .module_api_version = AUDIO_MODULE_API_VERSION_0_1, .hal_api_version = HARDWARE_HAL_API_VERSION, .id = AUDIO_HARDWARE_MODULE_ID, .name = "NVIDIA Tegra Audio HAL", .author = "The Android Open Source Project", .methods = &hal_module_methods, }, };
Urządzenia HAL
Urządzenie wyodrębnia elementy sprzętowe produktu. Na przykład plik audio moduł może zawierać główne urządzenie audio, urządzenie audio USB lub Bluetooth Urządzenie audio A2DP.
Urządzenie jest reprezentowane przez strukturę hw_device_t
. Podobne do
każdy typ urządzenia definiuje szczegółową wersję
hw_device_t
, który zawiera wskaźniki funkcji dotyczących określonych funkcji
i ulepszania sprzętu. Na przykład typ struktury audio_hw_device_t
zawiera wskaźniki funkcji do operacji na urządzeniu audio:
struct audio_hw_device { struct hw_device_t common; /** * used by audio flinger to enumerate what devices are supported by * each audio_hw_device implementation. * * Return value is a bitmask of 1 or more values of audio_devices_t */ uint32_t (*get_supported_devices)(const struct audio_hw_device *dev); ... }; typedef struct audio_hw_device audio_hw_device_t;
Oprócz tych standardowych właściwości każdy sprzętowy HAL interfejs może zdefiniować więcej własnych funkcji i wymagań. Więcej informacji: zobacz dokumentację HAL, a także instrukcje dotyczące każdej z nich.
Tworzenie modułów HAL
Implementacje HAL są wbudowane w pliki modułów (.so
) i są
dynamicznie połączone przez Androida. Moduły możesz tworzyć:
tworzenie Android.mk
plików dla każdej implementacji HAL
i wskazujesz pliki źródłowe. Ogólnie biblioteki udostępnione muszą być
mieć nazwę w określonym formacie,
by można je było znaleźć i wczytać. Nazewnictwo
schemat różni się w zależności od modułu, ale jest zgodny z ogólnym wzorcem
z: <module_type>.<device_name>
.