前言
在上一篇博客中介绍了Android9.0中的手动调节亮度的流程,但当时只讲到framwork的整个调用过程,并未讲到如何调用hardware层,这一张来讲一下如何调用hardware,以及如何实现简单的hareware.
Kernel: v4.4.126
Device: rk3399
Platform Version: Android 7.1
如何调用(以亮度调节为例,其他的也一样)
主要分为下面3个步骤:
使用hardware.c中定义的hw_get_module获取hal库中hw_module_t全局变量的地址。
利用全局变量hw_module_t地址调用它内部结构体变量hw_module_methods_t的open函数指针,并且将hw_module_t作为参数传入open函数,在open函数内将hw_module_t赋值给hw_device_t中定义的hw_module_t变量,最后获取到hw_device_t的地址。
利用上面的hw_device_t的地址就可以调用hw_device_t中定义的指针函数对应的实现。例如:set_light()
上面图中代码全在com_android_server_SerialService.cpp中,如果看完还是不太理解,请看完下面的实现步骤,再折回来看。
如何实现简单的hardware?
首先要知道hardware.h中有3个重要的公用结构体
struct hw_module_t;
struct hw_module_methods_t;
struct hw_device_t;
它们之间的关系
hw_module_t结构体中包含hw_module_methods_t的结构体指针
hw_device_t结构体中包含hw_module_t的结构体指针
结合它们之间的关系,再理解一下上面的3个调用步骤
接下讲如何实现:
- 首先是否基于hw_module_t和hw_device_t扩充自己的xx_module_t和xx_device_t
如果基于hw_module_t扩充,第一个成员变量必须包含 hw_module_t
如果基于hw_device_t扩充,第一个成员变量必须包含 hw_device_t
例如相机:
例如亮度:
2. 在源码中定义全局变量hw_module_t或者基于hw_module_t扩充的结构体全局变量
例如相机:
例如亮度:
3. 接下来就需要实现hw_module_t中的hw_module_methods_t结构体指针的open函数了。
4. 然后就是在open里面,创建基于hw_device_t的扩充结构体变量,并把hw_module_t赋值给hw_device_t中定义的hw_module_t指针
5. 最后我们得到了基于hw_device_t的结构体变量,里面包含了hw_module_t的信息,并且此时就可以调用hw_device_t中定义的可被调用的方法了。
结合后面hardware的实现流程,再回过头去看调用,就会清晰很多了。
转载请注明出处:http://www.wolfnx.com/2020/03/16/Brightness-Set-Stream
作者 : wolfnx
邮箱 : wolfnx@outlook.com
邮箱2 : lostnx@gmail.com