HALs เดิม

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

HAL กำหนดอินเทอร์เฟซมาตรฐานสำหรับผู้จำหน่ายฮาร์ดแวร์เพื่อนำไปใช้ ซึ่งช่วยให้ Android สามารถไม่เชื่อเรื่องพระเจ้าเกี่ยวกับการใช้งานไดรเวอร์ระดับล่าง การใช้ HAL ช่วยให้คุณใช้งานฟังก์ชันได้โดยไม่กระทบหรือแก้ไขระบบระดับที่สูงกว่า หน้านี้อธิบายสถาปัตยกรรมที่เก่ากว่า ซึ่งไม่รองรับใน Android 8.0 อีกต่อไป สำหรับ Android 8.0 ขึ้นไป โปรดดู HAL Types

ส่วนประกอบ HAL

รูปที่ 1 ส่วนประกอบ HAL

คุณต้องใช้ HAL (และไดรเวอร์) ที่สอดคล้องกันสำหรับฮาร์ดแวร์เฉพาะที่ผลิตภัณฑ์ของคุณมีให้ โดยทั่วไปแล้ว การใช้งาน HAL จะถูกสร้างขึ้นในโมดูลไลบรารีที่ใช้ร่วมกัน (ไฟล์ . .so ) แต่เนื่องจาก Android ไม่ได้กำหนดให้มีการโต้ตอบมาตรฐานระหว่างการใช้งาน HAL และไดรเวอร์อุปกรณ์ คุณจึงสามารถทำสิ่งที่ดีที่สุดสำหรับสถานการณ์ของคุณได้ อย่างไรก็ตาม เพื่อให้ระบบ Android สามารถโต้ตอบกับฮาร์ดแวร์ของคุณได้อย่างถูกต้อง คุณ ต้อง ปฏิบัติตามสัญญาที่กำหนดไว้ในอินเทอร์เฟซ HAL เฉพาะฮาร์ดแวร์แต่ละรายการ

เพื่อรับประกันว่า HAL มีโครงสร้างที่คาดการณ์ได้ อินเทอร์เฟซ HAL เฉพาะฮาร์ดแวร์แต่ละรายการจะมีคุณสมบัติที่กำหนดไว้ใน hardware/libhardware/include/hardware/hardware.h อินเทอร์เฟซนี้ช่วยให้ระบบ Android สามารถโหลดโมดูล HAL เวอร์ชันที่ถูกต้องได้อย่างสม่ำเสมอ อินเทอร์เฟซ HAL ประกอบด้วยสององค์ประกอบ: โมดูลและอุปกรณ์

โมดูล HAL

โมดูลแสดงถึงการใช้งาน HAL ที่ทำแพ็กเกจของคุณ ซึ่งจัดเก็บเป็นไลบรารีที่ใช้ร่วมกัน ( .so file ) ไฟล์ส่วนหัว hardware/libhardware/include/hardware/hardware.h กำหนดโครงสร้าง ( hw_module_t ) ที่แสดงถึงโมดูลและมีข้อมูลเมตา เช่น เวอร์ชัน ชื่อ และผู้สร้างโมดูล Android ใช้ข้อมูลเมตานี้เพื่อค้นหาและโหลดโมดูล HAL อย่างถูกต้อง

นอกจากนี้ โครงสร้าง hw_module_t ยังมีตัวชี้ไปยังโครงสร้างอื่น hw_module_methods_t ที่มีตัวชี้ไปยังฟังก์ชันที่เปิดอยู่สำหรับโมดูล ฟังก์ชันเปิดนี้ใช้เพื่อเริ่มต้นการสื่อสารกับฮาร์ดแวร์ที่ HAL ทำหน้าที่เป็นนามธรรม HAL เฉพาะฮาร์ดแวร์แต่ละตัวมักจะขยาย hw_module_t struct ทั่วไปด้วยข้อมูลเพิ่มเติมสำหรับฮาร์ดแวร์ชิ้นนั้น ตัวอย่างเช่น ในกล้อง HAL โครงสร้าง camera_module_t มี hw_module_t พร้อมกับตัวชี้ฟังก์ชันเฉพาะของกล้องอื่นๆ:

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;

เมื่อคุณใช้ HAL และสร้างโครงสร้างโมดูล คุณต้องตั้งชื่อ HAL_MODULE_INFO_SYM ตัวอย่างจาก 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,
    },
};

อุปกรณ์ HAL

อุปกรณ์สรุปฮาร์ดแวร์ของผลิตภัณฑ์ของคุณ ตัวอย่างเช่น โมดูลเสียงสามารถประกอบด้วยอุปกรณ์เสียงหลัก อุปกรณ์เสียง USB หรืออุปกรณ์เสียง Bluetooth A2DP

อุปกรณ์ถูกแสดงโดยโครงสร้าง hw_device_t เช่นเดียวกับโมดูล อุปกรณ์แต่ละประเภทจะกำหนดเวอร์ชันโดยละเอียดของ hw_device_t ทั่วไปที่มีพอยน์เตอร์ฟังก์ชันสำหรับคุณลักษณะเฉพาะของฮาร์ดแวร์ ตัวอย่างเช่น ประเภท audio_hw_device_t มีตัวชี้ฟังก์ชันไปยังการทำงานของอุปกรณ์เสียง:

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;

นอกเหนือจากคุณสมบัติมาตรฐานเหล่านี้แล้ว อินเทอร์เฟซ HAL เฉพาะฮาร์ดแวร์แต่ละตัวยังสามารถกำหนดคุณสมบัติและข้อกำหนดของตนเองได้มากขึ้น สำหรับรายละเอียด โปรดดู เอกสารอ้างอิง HAL รวมถึงคำแนะนำสำหรับแต่ละ HAL

การสร้างโมดูล HAL

การใช้งาน HAL ถูกสร้างไว้ในไฟล์โมดูล ( .so ) และ Android จะเชื่อมโยงแบบไดนามิกตามความเหมาะสม คุณสามารถสร้างโมดูลของคุณโดยการสร้างไฟล์ Android.mk สำหรับการใช้งาน HAL แต่ละรายการของคุณและชี้ไปที่ไฟล์ต้นทางของคุณ โดยทั่วไป ไลบรารีที่แบ่งใช้ของคุณจะต้องตั้งชื่อในรูปแบบเฉพาะเพื่อให้สามารถค้นหาและโหลดได้อย่างถูกต้อง รูปแบบการตั้งชื่อแตกต่างกันไปเล็กน้อยในแต่ละโมดูล แต่เป็นไปตามรูปแบบทั่วไปของ: <module_type>.<device_name>