文章目录
-
- 传感器 HAL 层的设计与实现
传感器 HAL 层的设计与实现
Linux
驱动通常由访问硬件代码和业务逻辑代码组成。Linux
内核提供了 只需调用标准的读写硬件方法Linux
提供的标准函数即可。 而
Linux
驱动的业务逻辑对制造商或个人保密。例如,缓冲区的设置等。Google
在Android
在系统中添加一个HAL
层的目的是为了满足不想开源的个人或者厂商的要求,该层位于系统库层和Linux
内核层之间。对于想要开源的Linux
可以驱动个人或制造商 把驱动业务的逻辑放在一边HAL
层也可以放在驱动程序中。不想公开。Linux
个人或制造商驱动代码,Linux
驱动只是将数据传递给相关设备的角色。也就是说Linux
只有操作设备寄存器的代码的代码,没有任何业务代码。HAL
硬件层统一 调用接口,HAL
层的编写需要遵循一定的规范。HA
L 如下图所示。Android
通过应用程序NDK
访问HAL
或直接访问系统库HAL
中程序库,最后通过程序库访问驱动程序提供的设备节点,为程序库提供操作 作接口。
本chat
驱动硬件抽象层模块的重力传感器将被设计和实现。重力传感器的业务逻辑 在硬件抽象层中编辑。事实上,硬件抽象层也是Linux
以系统库的形式提供,HAL
与其像C
在操作过程中需要加载当需要硬件抽象层时 通过程序库ID
加载相应的程序库。硬件抽象层的工作流程如下图所示。 应用层传输传感器类型值到硬件抽象层,硬件抽象层完成相应传感器的配置和初始化,最最后,判断硬件抽象层的命令是打开或关闭。如果打开传感器,报告传感器数据,最后判断传感器是否动态,如果动态,再次报告传感器数量 报告传感器数据时,会有一定时间的延迟。若传感器关闭,则直接结束。当传感器不动态时,读取过程将直接结束。
Android
框架相关数据结构如图所示: 结构分为三部分。
hw_module_t
是Android
根据框架定义的结构体Android
硬件抽象层的确定 义 , 被sensors_module_t
封 装 , 作 为 重 力 传 感 器 模 块 的 数 据 结 构 。 而 且hw_module_t
必须定义在结构体sensors_module_t
开头。这个定义主要是为了扩展 以及接口的统一。系统可以自动调用的任何程序都有规范,例如main
函数。HAL
模块可以被Android
系统是自动调用的,所以它也必须有一个固定的接口,但它不是一个函数,而是一个结构的变量名。该结构的设计如下:
/*初始化描述 HAL 模块信息的结构,结构体的变量名必须是 HAL_MODULE_INFO_SYM*/ struct sensors_module_t HAL_MODULE_INFO_SYM = { .common = { .id = SENSORS_HARDWARE_MODULE_ID,//初始化 HAL 模块的 ID 通 过这 ID 可以找到该 HAL 模块 .methods= &sensors_module_methods,//初始化 HAL 模块的 open 函数指针 }; .get_sensors_list = sensors_get_sensors_list };
static struct hw_module_methods_t sensors_module_methods = { .open = open_sensors };
sensors_poll_device_t
sensors_poll_device_t
是对hw_device_t
该结构代表传感器。主要包括打开传感器、关闭传感器、读取传感器数据等函数接口。
hw_module_methods_t
hw_module_methods_t
提供了open_sensors
上层调用方法。 首先在这个结构中使用sensors_module_t
结构体通过结构体methods
方法找到sensors_module_methods.open
方法,open
方法相当于HAL
模块入口。 调用此函数,打开设备文件,初始化sensor_poll_context_t
结构体。
open_sensors
函数将在NDK
调用函数。函数的最后一个参数被调用。HAL
层初始化,但框架层调用时引入的变量类型是sensors_poll_context_t
,这样就必须 要求sensor_poll_device_t
必须为sensors_poll_context_t
该函数的主要工作是初始化sensor_poll_device_t
子结构。除了初始化一些必要的变量外, 传感器的初始操作也需要一些方法(本文中的一些方法)close
、activate
、setDelay
和poll
)
如下图所示:
版权声明:本文为qq_33487044原创文章CC 4.0 BY-SA版权协议,请附上原始来源链接和本声明。
本文链接:https://blog.csdn.net/qq_33487044/article/details/104113953