Starsze warstwy HAL

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

HAL definiuje standardowy interfejs dla dostawców sprzętu do zaimplementowania, który umożliwia systemowi Android niezależność od implementacji sterowników niższego poziomu. Korzystanie z warstwy HAL umożliwia wdrożenie funkcjonalności bez wpływu lub modyfikacji systemu wyższego poziomu. Ta strona opisuje starszą architekturę, która nie jest już obsługiwana od Androida 8.0. W przypadku systemu Android 8.0 lub nowszego zobacz Typy HAL .

Składniki HAL

Rysunek 1. Składniki HAL

Musisz zaimplementować odpowiednią warstwę HAL (i sterownik) dla określonego sprzętu, jaki zapewnia Twój produkt. Implementacje warstwy HAL są zwykle wbudowane w moduły bibliotek współdzielonych (pliki .so ), ale ponieważ system Android nie wymaga standardowej interakcji między implementacją warstwy HAL a sterownikami urządzeń, można zrobić to, co jest najlepsze w danej sytuacji. Aby jednak system Android mógł prawidłowo współdziałać ze sprzętem, należy przestrzegać umowy zdefiniowanej w każdym interfejsie HAL dotyczącym sprzętu.

Aby zagwarantować, że warstwy HAL mają przewidywalną strukturę, każdy interfejs HAL specyficzny dla sprzętu ma właściwości zdefiniowane w hardware/libhardware/include/hardware/hardware.h . Ten interfejs umożliwia systemowi Android ładowanie poprawnych wersji modułów HAL w spójny sposób. Interfejs HAL składa się z dwóch komponentów: modułów i urządzeń.

Moduły HAL

Moduł reprezentuje twoją spakowaną implementację warstwy HAL, która jest przechowywana jako biblioteka współużytkowana ( .so file ). Plik hardware/libhardware/include/hardware/hardware.h definiuje strukturę ( hw_module_t ), która reprezentuje moduł i zawiera metadane, takie jak wersja, nazwa i autor modułu. System Android używa tych metadanych do prawidłowego znalezienia i załadowania modułu HAL.

Ponadto struktura hw_module_t zawiera wskaźnik do innej struktury, hw_module_methods_t , która zawiera wskaźnik do otwartej funkcji modułu. Ta otwarta funkcja służy do inicjowania komunikacji ze sprzętem, dla którego warstwa HAL służy jako abstrakcja. Każda warstwa HAL specyficzna dla sprzętu zwykle rozszerza ogólną strukturę hw_module_t o dodatkowe informacje dotyczące tego konkretnego elementu sprzętu. Na przykład w kamerze HAL struktura camera_module_t zawiera strukturę hw_module_t wraz z innymi wskaźnikami funkcji specyficznych dla kamery:

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;

Kiedy implementujesz HAL i tworzysz strukturę modułu, musisz nazwać ją HAL_MODULE_INFO_SYM . Przykład z dźwiękowej warstwy HAL Nexusa 9:

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 sprzęt Twojego produktu. Na przykład moduł audio może zawierać główne urządzenie audio, urządzenie audio USB lub urządzenie audio Bluetooth A2DP.

Urządzenie jest reprezentowane przez strukturę hw_device_t . Podobnie jak moduł, każdy typ urządzenia definiuje szczegółową wersję ogólnego hw_device_t , która zawiera wskaźniki funkcji dla określonych funkcji sprzętu. Na przykład typ struktury audio_hw_device_t zawiera wskaźniki funkcji do operacji urządzenia 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 interfejs HAL specyficzny dla sprzętu może definiować więcej własnych funkcji i wymagań. Szczegółowe informacje można znaleźć w dokumentacji referencyjnej HAL oraz w indywidualnych instrukcjach dla każdej warstwy HAL.

Budowanie modułów HAL

Implementacje HAL są wbudowane w pliki modułów ( .so ) i są dynamicznie łączone przez system Android, gdy jest to właściwe. Możesz budować swoje moduły, tworząc pliki Android.mk dla każdej implementacji HAL i wskazując pliki źródłowe. Ogólnie rzecz biorąc, twoje biblioteki współdzielone muszą być nazwane w określonym formacie, aby można je było prawidłowo znaleźć i załadować. Schemat nazewnictwa różni się nieco w zależności od modułu, ale jest zgodny z ogólnym wzorem: <module_type>.<device_name> .