HAL lama

HAL mendefinisikan antarmuka standar untuk diimplementasikan vendor perangkat keras, yang memungkinkan Android menjadi agnostik tentang implementasi driver tingkat rendah. Menggunakan HAL memungkinkan Anda untuk mengimplementasikan fungsionalitas tanpa mempengaruhi atau memodifikasi sistem tingkat yang lebih tinggi. Halaman ini menjelaskan arsitektur lama, yang tidak lagi didukung pada Android 8.0. Untuk Android 8.0 dan lebih tinggi, silakan lihat Jenis HAL .

komponen HAL

Gambar 1. Komponen HAL

Anda harus menerapkan HAL (dan driver) yang sesuai untuk perangkat keras tertentu yang disediakan produk Anda. Implementasi HAL biasanya dibangun ke dalam modul pustaka bersama (file .so ), tetapi karena Android tidak mengamanatkan interaksi standar antara implementasi HAL dan driver perangkat, Anda dapat melakukan yang terbaik untuk situasi Anda. Namun, untuk memungkinkan sistem Android berinteraksi dengan benar dengan perangkat keras Anda, Anda harus mematuhi kontrak yang ditentukan di setiap antarmuka HAL khusus perangkat keras.

Untuk menjamin bahwa HAL memiliki struktur yang dapat diprediksi, setiap antarmuka HAL khusus perangkat keras memiliki properti yang ditentukan dalam hardware/libhardware/include/hardware/hardware.h . Antarmuka ini memungkinkan sistem Android memuat versi modul HAL yang benar secara konsisten. Antarmuka HAL terdiri dari dua komponen: modul dan perangkat.

modul HAL

Modul mewakili implementasi HAL Anda yang dikemas, yang disimpan sebagai pustaka bersama ( .so file ). File header hardware/libhardware/include/hardware/hardware.h mendefinisikan struct ( hw_module_t ) yang mewakili modul dan berisi metadata seperti versi, nama, dan penulis modul. Android menggunakan metadata ini untuk menemukan dan memuat modul HAL dengan benar.

Selain itu, struct hw_module_t berisi pointer ke struct lain, hw_module_methods_t , yang berisi pointer ke fungsi terbuka untuk modul. Fungsi terbuka ini digunakan untuk memulai komunikasi dengan perangkat keras yang berfungsi sebagai abstraksi HAL. Setiap HAL khusus perangkat keras biasanya memperluas struct hw_module_t generik dengan informasi tambahan untuk perangkat keras tertentu itu. Misalnya, di kamera HAL, struct camera_module_t berisi struct hw_module_t bersama dengan penunjuk fungsi khusus kamera lainnya:

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;

Saat Anda mengimplementasikan HAL dan membuat struct modul, Anda harus HAL_MODULE_INFO_SYM . Contoh dari audio HAL Nexus 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,
    },
};

perangkat HAL

Perangkat mengabstraksi perangkat keras produk Anda. Misalnya, modul audio dapat berisi perangkat audio utama, perangkat audio USB, atau perangkat audio Bluetooth A2DP.

Perangkat diwakili oleh struct hw_device_t . Mirip dengan modul, setiap jenis perangkat mendefinisikan versi rinci dari hw_device_t generik yang berisi pointer fungsi untuk fitur spesifik dari perangkat keras. Misalnya, tipe struct audio_hw_device_t berisi penunjuk fungsi ke operasi perangkat 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;

Selain properti standar ini, setiap antarmuka HAL khusus perangkat keras dapat menentukan lebih banyak fitur dan persyaratannya sendiri. Untuk detailnya, lihat dokumentasi referensi HAL serta instruksi individual untuk setiap HAL.

Membangun modul HAL

Implementasi HAL dibangun ke dalam file modul ( .so ) dan ditautkan secara dinamis oleh Android bila perlu. Anda dapat membangun modul Anda dengan membuat file Android.mk untuk setiap implementasi HAL Anda dan menunjuk ke file sumber Anda. Secara umum, pustaka bersama Anda harus diberi nama dalam format tertentu agar dapat ditemukan dan dimuat dengan benar. Skema penamaan sedikit berbeda dari modul ke modul, tetapi mengikuti pola umum: <module_type>.<device_name> .