Starsze warstwy HAL

Warstwa HAL definiuje standardowy interfejs do zaimplementowania przez dostawców sprzętu, który umożliwia systemowi Android niezależność od implementacji sterowników niższego poziomu. Korzystanie z warstwy HAL umożliwia implementację funkcjonalności bez wpływania na system wyższego poziomu lub modyfikowania go. Ta strona opisuje starszą architekturę, która nie jest już obsługiwana od systemu Android 8.0. W przypadku Androida 8.0 i nowszych zobacz Typy HAL .

Rysunek 1. Komponenty HAL

Musisz zaimplementować odpowiednią warstwę HAL (i sterownik) dla określonego sprzętu, który zapewnia Twój produkt. Implementacje HAL są zwykle wbudowane w moduły bibliotek współdzielonych (pliki .so ), ale ponieważ system Android nie wymaga standardowej interakcji między implementacją HAL a sterownikami urządzeń, możesz zrobić to, co jest najlepsze w Twojej sytuacji. Aby jednak umożliwić poprawną interakcję systemu Android ze sprzętem, należy przestrzegać umowy zdefiniowanej w każdym interfejsie HAL specyficznym dla 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 spakowaną implementację 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. Android używa tych metadanych, aby poprawnie znaleźć i załadować moduł 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 specyficzna dla sprzętu warstwa HAL zwykle rozszerza ogólną strukturę hw_module_t o dodatkowe informacje dotyczące tego konkretnego elementu sprzętu. Na przykład w HAL kamery struktura camera_module_t zawiera strukturę hw_module_t wraz z innymi wskaźnikami funkcji specyficznymi 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;

Podczas implementowania HAL_MODULE_INFO_SYM HAL i tworzenia struktury modułu należy nadać jej nazwę HAL_MODULE_INFO_SYM . Przykład z HAL audio 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 w przypadku modułu, 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 na urządzeniach 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, a także w indywidualnych instrukcjach dla każdej warstwy HAL.

Budowanie modułów HAL

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