Eski HAL'ler

HAL, donanım satıcılarının uygulaması için standart bir arabirim tanımlar; bu, Android'in alt düzey sürücü uygulamaları hakkında agnostik olmasını sağlar. HAL kullanmak, üst düzey sistemi etkilemeden veya değiştirmeden işlevsellik uygulamanıza olanak tanır. Bu sayfa, Android 8.0'dan itibaren artık desteklenmeyen eski mimariyi açıklamaktadır. Android 8.0 ve üstü için lütfen HAL Türleri'ne bakın.

HAL bileşenleri

Şekil 1. HAL bileşenleri

Ürününüzün sağladığı belirli donanım için ilgili HAL'ı (ve sürücüyü) uygulamanız gerekir. HAL uygulamaları genellikle paylaşılan kitaplık modüllerinde ( .so dosyaları) yerleşiktir, ancak Android, bir HAL uygulaması ile aygıt sürücüleri arasında standart bir etkileşimi zorunlu kılmadığından, durumunuz için en iyi olanı yapabilirsiniz. Ancak, Android sisteminin donanımınızla doğru bir şekilde etkileşime girmesini sağlamak için, donanıma özel her bir HAL arabiriminde tanımlanan sözleşmeye uymanız gerekir .

HAL'lerin tahmin edilebilir bir yapıya sahip olmasını garantilemek için, donanıma özgü her HAL arabirimi, hardware/libhardware/include/hardware/hardware.h içinde tanımlanan özelliklere sahiptir. Bu arayüz, Android sisteminin HAL modüllerinizin doğru sürümlerini tutarlı bir şekilde yüklemesini sağlar. Bir HAL arabirimi iki bileşenden oluşur: modüller ve aygıtlar.

HAL modülleri

Modül, paylaşılan bir kitaplık ( .so file ) olarak depolanan paketlenmiş HAL uygulamanızı temsil eder. hardware/libhardware/include/hardware/hardware.h başlık dosyası, bir modülü temsil eden ve modülün sürümü, adı ve yazarı gibi meta verileri içeren bir yapıyı ( hw_module_t ) tanımlar. Android, HAL modülünü doğru şekilde bulmak ve yüklemek için bu meta verileri kullanır.

Ek olarak, hw_module_t yapısı, modül için açık bir işleve yönelik bir işaretçi içeren hw_module_methods_t başka bir yapıya yönelik bir işaretçi içerir. Bu açık işlev, HAL'ın bir soyutlama olarak hizmet verdiği donanımla iletişimi başlatmak için kullanılır. Donanıma özgü her bir HAL, genellikle, genel hw_module_t yapısını, o belirli donanım parçası için ek bilgilerle genişletir. Örneğin, kamera HAL'inde hw_module_t camera_module_t içerir:

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;

Bir HAL uyguladığınızda ve modül yapısını oluşturduğunuzda, onu HAL_MODULE_INFO_SYM olarak adlandırmalısınız. Nexus 9 ses HAL'inden örnek:

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 cihazları

Bir cihaz, ürününüzün donanımını soyutlar. Örneğin, bir ses modülü bir birincil ses cihazı, bir USB ses cihazı veya bir Bluetooth A2DP ses cihazı içerebilir.

Bir cihaz, hw_device_t yapısı ile temsil edilir. Bir modüle benzer şekilde, her aygıt türü, donanımın belirli özellikleri için işlev işaretçileri içeren genel hw_device_t ayrıntılı bir sürümünü tanımlar. Örneğin, audio_hw_device_t yapı türü, ses cihazı işlemlerine yönelik işlev işaretçilerini içerir:

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;

Bu standart özelliklere ek olarak, donanıma özgü her HAL arabirimi, kendi özellik ve gereksinimlerinden daha fazlasını tanımlayabilir. Ayrıntılar için HAL başvuru belgelerine ve her HAL için ayrı yönergelere bakın.

HAL modülleri oluşturma

HAL uygulamaları modül ( .so ) dosyalarında yerleşiktir ve uygun olduğunda Android tarafından dinamik olarak bağlanır. Modüllerinizi, HAL uygulamalarınızın her biri için Android.mk dosyaları oluşturarak ve kaynak dosyalarınıza işaret ederek oluşturabilirsiniz. Genel olarak, paylaşılan kitaplıklarınızın bulunabilmeleri ve düzgün bir şekilde yüklenebilmeleri için belirli bir biçimde adlandırılması gerekir. Adlandırma şeması modülden modüle biraz farklılık gösterir, ancak genel kalıbı takip eder: <module_type>.<device_name> .

,

HAL, donanım satıcılarının uygulaması için standart bir arabirim tanımlar; bu, Android'in alt düzey sürücü uygulamaları hakkında agnostik olmasını sağlar. HAL kullanmak, üst düzey sistemi etkilemeden veya değiştirmeden işlevsellik uygulamanıza olanak tanır. Bu sayfa, Android 8.0'dan itibaren artık desteklenmeyen eski mimariyi açıklamaktadır. Android 8.0 ve üstü için lütfen HAL Türleri'ne bakın.

HAL bileşenleri

Şekil 1. HAL bileşenleri

Ürününüzün sağladığı belirli donanım için ilgili HAL'ı (ve sürücüyü) uygulamanız gerekir. HAL uygulamaları genellikle paylaşılan kitaplık modüllerinde ( .so dosyaları) yerleşiktir, ancak Android, bir HAL uygulaması ile aygıt sürücüleri arasında standart bir etkileşimi zorunlu kılmadığından, durumunuz için en iyi olanı yapabilirsiniz. Ancak, Android sisteminin donanımınızla doğru bir şekilde etkileşime girmesini sağlamak için, donanıma özel her bir HAL arabiriminde tanımlanan sözleşmeye uymanız gerekir .

HAL'lerin tahmin edilebilir bir yapıya sahip olmasını garantilemek için, donanıma özgü her HAL arabirimi, hardware/libhardware/include/hardware/hardware.h içinde tanımlanan özelliklere sahiptir. Bu arayüz, Android sisteminin HAL modüllerinizin doğru sürümlerini tutarlı bir şekilde yüklemesini sağlar. Bir HAL arabirimi iki bileşenden oluşur: modüller ve aygıtlar.

HAL modülleri

Modül, paylaşılan bir kitaplık ( .so file ) olarak depolanan paketlenmiş HAL uygulamanızı temsil eder. hardware/libhardware/include/hardware/hardware.h başlık dosyası, bir modülü temsil eden ve modülün sürümü, adı ve yazarı gibi meta verileri içeren bir yapıyı ( hw_module_t ) tanımlar. Android, HAL modülünü doğru şekilde bulmak ve yüklemek için bu meta verileri kullanır.

Ek olarak, hw_module_t yapısı, modül için açık bir işleve yönelik bir işaretçi içeren hw_module_methods_t başka bir yapıya yönelik bir işaretçi içerir. Bu açık işlev, HAL'ın bir soyutlama olarak hizmet verdiği donanımla iletişimi başlatmak için kullanılır. Donanıma özgü her bir HAL, genellikle, genel hw_module_t yapısını, o belirli donanım parçası için ek bilgilerle genişletir. Örneğin, kamera HAL'inde hw_module_t camera_module_t içerir:

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;

Bir HAL uyguladığınızda ve modül yapısını oluşturduğunuzda, onu HAL_MODULE_INFO_SYM olarak adlandırmalısınız. Nexus 9 ses HAL'inden örnek:

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 cihazları

Bir cihaz, ürününüzün donanımını soyutlar. Örneğin, bir ses modülü bir birincil ses cihazı, bir USB ses cihazı veya bir Bluetooth A2DP ses cihazı içerebilir.

Bir cihaz, hw_device_t yapısı ile temsil edilir. Bir modüle benzer şekilde, her aygıt türü, donanımın belirli özellikleri için işlev işaretçileri içeren genel hw_device_t ayrıntılı bir sürümünü tanımlar. Örneğin, audio_hw_device_t yapı türü, ses cihazı işlemlerine yönelik işlev işaretçilerini içerir:

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;

Bu standart özelliklere ek olarak, donanıma özgü her HAL arabirimi, kendi özellik ve gereksinimlerinden daha fazlasını tanımlayabilir. Ayrıntılar için HAL başvuru belgelerine ve her HAL için ayrı yönergelere bakın.

HAL modülleri oluşturma

HAL uygulamaları modül ( .so ) dosyalarında yerleşiktir ve uygun olduğunda Android tarafından dinamik olarak bağlanır. Modüllerinizi, HAL uygulamalarınızın her biri için Android.mk dosyaları oluşturarak ve kaynak dosyalarınıza işaret ederek oluşturabilirsiniz. Genel olarak, paylaşılan kitaplıklarınızın bulunabilmeleri ve düzgün bir şekilde yüklenebilmeleri için belirli bir biçimde adlandırılması gerekir. Adlandırma şeması modülden modüle biraz farklılık gösterir, ancak genel kalıbı takip eder: <module_type>.<device_name> .