Jimmy Chen

A Programmer

(原创)Android HAL详解

  其实挺久之前就了解过HAL的相关内容,只是好久没看有点遗忘,现在刚好写个博客重新学习下。

三个重要的结构体

  下面一个一个结构体来看:

hw_module_t结构体

  hw_module_t结构体的内容如上面,该结构体内带有一个hw_module_methods_t结构体,hw_module_methods_t结构体的内容下面再列出,其次就是hw_module_t结构体主要注意最前面的注释就好,其他没什么好说的。

hw_module_methods_t结构体

  里面只带有一个open的方法指针,如上面的内容所示,该结构体的内容被包含在hw_module_t结构体中。所以,获得了特定设备的hw_module_t结构体内容,就可以通过open函数指针来回调device的open方法了。

hw_device_t结构体

  hw_device_t结构体内含有一个close函数指针。在设备卸载的时候会调用到。

这三个结构体的内容就这些,下面拿个实际的例子来看看。代码在AOSP源码的hardware/libhardware/include/hardware/fingerprint.h文件中:

  上面的代码中定义了两个和fingerprint相关的结构体。首先是fingerprint_module_t结构体,里面只包含一个hw_module_t结构体,看源码注释可以知道如果自己定义一个hardware module的话,必须将hw_module_t作为自定义结构体的第一个字段,主要是为了方便在代码中做hw_module_t结构体和自定义结构体之间进行转化,下面会在代码中进行讲解。

另一个结构体就是fingerprint_device_t结构体了,这个结构体的要求和hw_module_t的要求类似,也是要将hw_device_t结构体作为第一个字段,然后可以在自定义的device结构体后添加一些设备的操作函数指针。

所以,要添加自己的Hardware module就简单很多了,自定义两个结构体,一个xxx_module_t结构体,该结构体的第一个字段为hw_module_t结构体,另一个xxx_device_t结构体,该结构体的第一个字段为hw_devict_t结构体即可。

hardware module的加载过程

上面了解了基本的结构体后,接下来看看hardware module的加载过程。

源码在AOSP的hardware/libhardware/hardware.c文件下,获取hardware module以hw_get_module函数作为入口,例如获取fingerprint时,就是在hardware/interfaces/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp文件下调用的:

直接调用hw_get_module_by_class函数,下面看看hw_get_module_by_class函数的代码

这样HAL层的so库就被加载到系统中了。接下来说明一下为什么需要将hw_device_t和hw_module_t作为自定义结构体的第一个字段。

我们以BiometricsFingerprint作为实例看看

BiometricsFingerprint::openHal简单分析

所以从这里可以知道为什么在自定义硬件设备的module结构体和device结构体时需要将第一个字段分别设置为hw_module_t结构体和hw_device_t结构体。一切的一切都是为了在使用reinterpret_cast进行强制类型转换的时候能够兼容。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注