Starsze listy HAL

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.

Komponenty HAL

Rysunek 1. Komponenty HAL

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>.

Starsza wersja HAL

Termin „starsza wersja HAL” odnosi się ogólnie do wszystkich licencji HAL starszych niż Androida 8.0 (wycofanych w Androidzie 8). większość interfejsów systemu Android (aparat, dźwięk, czujniki itp.) jest zdefiniowanych w „hardware/libhardware/include/hardware” oraz mają przybliżoną obsługę wersji i mniej więcej stabilny interfejs ABI. O niewiele podsystemów (w tym Wi-Fi, Radio Interface Layer i Bluetooth) ma inne w interfejsie „libhardware_legacy” lub ich połączeniach w bazie kodu. Starsze listy HAL nigdy które daje twarde gwarancje stabilności.