개발 이야기

Origin HAL Interface

ANDYLION 2020. 5. 12. 00:44
728x90
반응형

Origin HAL


HAL은 HW공급업체에서 구현해야 하는 표준 인터페이스를 정의합니다.
Android에서 Low Level의 드라이버 구현을 고려하지 않고 응용어플리케이션 개발을 할 수 있도록 도움을 줍니다.
이 시스템은 Android 8.0 이전까지 사용했으며 이후에는 HIDL로 변경해서 제공하고 있습니다.
 

 
Vendor사의 하드웨어에 해당하는 HAL 및 드라이버는 일반적으로 공유 라이브러리 모듈(.so파일) 내에 구축됩니다.
안드로이드 시스템이 하드웨어와 올바른 방식으로 상호작용하기 위해서는 각 하드웨어 별 HAL 인터페이스에 정의된 계약을 준수해야합니다.
hardware/libhardware/include/hardware/hardware.h 에서 정의된 속성이 있어야 합니다. 이 인터페이스를 사용하면 Android 시스템에서 올바른 버전의 HAL 모듈을 일관된 방식으로 로드할 수 있습니다. HAL 인터페이스는 모듈과 기기, 이렇게 두 가지 요소로 구성됩니다.
 
 

HAL Module


모듈은 공유 라이브러리( .so file )로 저장되는 패키징된 HAL 구현을 나타냅니다.
hardware/libhardware/include/hardware/hardware.h 헤더 파일은 모듈을 나타내는 구조 (hw_module_t)를 정의하며, 버전, 이름 및 모듈 작성자와 같은 메타데이터를 포함합니다.  Android는 이 메타데이터를 사용하여 HAL 모듈을 정상적으로 로드합니다.
또한 hw_module_t 구조는 모듈의 Open 함수에 대한 포인터가 포함된 또 다른 구조, hw_module_methods_t에 대한 포인터를 포함하고 있습니다. 이 Open 함수는 HAL이 추상화 기능을 하는 하드웨어와 통신을 개시하는 데 사용됩니다. 각 하드웨어별 HAL은 보통 특정 하드웨어의 추가 정보로 일반적인 hw_module_t 구조를 확장합니다. 예를 들어 카메라 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으로 이름을 지정해야 합니다. Nexus 9 오디오 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 device


device는 제품의 하드웨어를 추상화합니다. 예를 들어 오디오 무듈에는 기본 오디오 기기, USB 오디오 기기 또는 블루투스 A2DP 오디오 기기가 포함될 수 있습니다.
 
기기는 hw_device_t 구조로 표현됩니다. 모듈과 마찬가지로 각 유형의 기기는 하드웨어의 특정 기능에 대한 함수 포인터를 포함하는 일반 hw_device_t의 상세한 버전을 정의합니다. 기기는 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 Module Build


HAL 구현은 Module ( .so )내에 빌드되며 적절한 경우 Android에 의해 동적으로 연결됩니다. 각 HAL 구현의 Android.mk 파일을 생성하고 소스 파일을 가리키는 방식으로 모듈을 빌드할 수 있습니다. 일반적인 네이밍 방식은 <module_type>.<device_name>.so입니다.
예를 들어, camera의 경우는 camera.$(Target_Name).so 라는 것입니다.

728x90
반응형
SMALL

'개발 이야기' 카테고리의 다른 글

ION memory allocator  (0) 2020.05.12
HAL 유형  (0) 2020.05.12
[파이썬 완전정복] 제어문 - 조건문  (0) 2020.05.10
[RTOS] QNX  (0) 2020.05.09
오토핫키 ImageSearch, Send, Sleep  (0) 2020.05.08