Alte HALs

Ein HAL definiert eine Standardschnittstelle, die Hardwarehersteller implementieren können, Dadurch ist Android unabhängig von untergeordneten Treiberimplementierungen. Mit einem HAL können Sie Funktionen implementieren, ohne dies zu beeinflussen oder zu verändern. übergeordnetes System. Auf dieser Seite wird die ältere Architektur beschrieben, die keine ab Android 8.0 nicht mehr unterstützt. Wenn Sie Android 8.0 und höher verwenden, lesen Sie bitte die HAL-Übersicht

HAL-Komponenten

Abbildung 1: HAL-Komponenten

Sie müssen den entsprechenden HAL (und den Treiber) für die spezifische Hardware Ihres Produkts. HAL-Implementierungen sind in der Regel in der gemeinsam genutzten Bibliothek (.so Dateien), aber da Android Standardinteraktion zwischen einer HAL-Implementierung und Gerätetreibern das Beste für Ihre Situation zu tun. Damit das Android-System jedoch mit Ihrer Hardware ordnungsgemäß interagieren können, müssen Sie die in jeder hardwarespezifischen HAL-Schnittstelle definiert wird.

Um sicherzustellen, dass HALs eine vorhersehbare Struktur haben, ist jedes hardwarespezifische Für die HAL-Schnittstelle sind Eigenschaften definiert in hardware/libhardware/include/hardware/hardware.h Diese Schnittstelle kann das Android-System die richtigen Versionen Ihrer HAL-Module auf einheitliche Weise. Eine HAL-Schnittstelle besteht aus zwei Komponenten: Module und Geräte.

HAL-Module

Ein Modul stellt Ihre gepackte HAL-Implementierung dar, die als gemeinsam genutzte Bibliothek (.so file). Die hardware/libhardware/include/hardware/hardware.h-Headerdatei definiert eine Struktur (hw_module_t), die ein Modul darstellt enthält Metadaten wie die Version, den Namen und den Autor des Moduls. Android-Geräte verwendet diese Metadaten, um das HAL-Modul korrekt zu finden und zu laden.

Darüber hinaus enthält die Struktur hw_module_t einen Zeiger auf eine weitere Struktur, hw_module_methods_t, die einen Zeiger auf eine offene Funktion für das Modul. Diese Funktion wird verwendet, um Kommunikation mit der Hardware, für die der HAL als Abstraktion dient. Jede hardwarespezifische HAL erweitert in der Regel den generischen hw_module_t. mit zusätzlichen Informationen für diese spezielle Hardware erstellen. Für Beispiel: In der Kamera-HAL enthält die camera_module_t-Struktur einen hw_module_t-Struktur zusammen mit anderen kameraspezifischen Funktionen Hinweise:

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;

Wenn Sie einen HAL implementieren und die Modulstruktur erstellen, müssen Sie ihr einen Namen geben HAL_MODULE_INFO_SYM Beispiel vom Nexus 9-Audio-HAL:

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,
    },
};

HAL-Geräte

Ein Gerät abstrahiert die Hardware Ihres Produkts. Beispiel: Eine Audiodatei kann ein primäres Audiogerät, ein USB-Audiogerät oder ein Bluetooth- A2DP-Audiogerät.

Ein Gerät wird durch die Struktur hw_device_t dargestellt. Ähnlich wie ein enthält, definiert jeder Gerätetyp eine detaillierte Version des generischen hw_device_t, die Funktionszeiger für bestimmte Funktionen enthält der Hardware. Ein Beispiel: Der Strukturtyp audio_hw_device_t enthält Funktionszeiger für Audiogerätevorgänge:

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;

Zusätzlich zu diesen Standardeigenschaften kann jeder hardwarespezifische HAL eigene Funktionen und Anforderungen definieren kann. Weitere Informationen finden Sie in der HAL-Referenzdokumentation sowie in der Anleitung für jeden HAL.

HAL-Module erstellen

HAL-Implementierungen sind in Moduldateien (.so) integriert und werden gegebenenfalls dynamisch von Android verknüpft. Sie können Ihre Module erstellen, indem Sie Erstellen von Android.mk-Dateien für jede Ihrer HAL-Implementierungen und auf Ihre Quelldateien verweisen. Im Allgemeinen müssen Ihre gemeinsam genutzten Bibliotheken in einem bestimmten Format benannt sind, damit sie gefunden und richtig geladen werden können. Die Benennung -Schema variiert geringfügig von Modul zu Modul, folgt jedoch dem allgemeinen Muster von: <module_type>.<device_name>.

Alter HAL

Der Begriff Legacy-HAL bezieht sich grob auf alle HALs vor Android 8.0, die in Android 8 eingestellt wurden. Die Die meisten Android-Systemschnittstellen (Kamera, Audio, Sensoren usw.) sind unter „hardware/libhardware/include/hardware“, haben eine grobe Versionsverwaltung und eine ungefähr stabile ABI. A Einige Subsysteme (einschließlich Wi-Fi, Radio Interface Layer und Bluetooth) haben andere nicht standardisierte Schnittstellen in 'libhardware_legacy' oder über die Codebasis verteilt. Ältere HALs werden nie verwendet harte Stabilitätsgarantien gegeben.