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 라는 것입니다.
'개발 이야기' 카테고리의 다른 글
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 |