为Android添加HAL模块

1.每个硬件抽象层模块在内核中都对应一个驱动程序,硬件抽象层模块就时通过这些驱动程序来访问硬件设备的,它们是通过读写设备文件来进行通信的。

硬件抽象层中的模块接口源文件一般保存在hardware/libhardware目录中,为了方便起见,我们将虚拟硬件设备freg在硬件抽象层中的模块名称定义为freg,目录结构如下:

hardware/libhardware/include/hardware/freg.h

hardware/libhardware/modules/freg/Android.mk

hardware/libhardware/modules/freg/freg.cpp

上述三个文件分别对应模块的头文件、makefile文件、源文件。

2.HAL层的编译步骤

首先要修改hardware/libhardware/modules下面的Android.mk文件,如下:

hardware_modules := gralloc hwcomposer audio nfc nfc-nci local_time \
    power usbaudio audio_remote_submix camera consumerir sensors vibrator \
    tv_input fingerprint freg
include $(call all-named-subdir-makefiles,$(hardware_modules))

修改点:将freg加入到hardware_modules变量当中

编译:mmm ./hardware/libhardware/modules

结果:会生成一个HAL层的动态库,比如freg.default.so

3.查看freg.default.so

使用linux的nm工具可以查看动态库的符号表,我们查看out/target/product/XXXX/symbols/system/lib/hw

目录下面的freg.default.so动态库文件,命令如下:

nm freg.default.so

输出:

00000549 t _ZL12freg_get_valP13freg_device_tPi
0000059d t _ZL12freg_set_valP13freg_device_ti
000004b9 t _ZL16freg_device_openPK11hw_module_tPKcPP11hw_device_t
000004ad t _ZL17freg_device_closeP11hw_device_t
00002084 d _ZL19freg_module_methods

我们就可以看到确实是有HAL层的函数被编入。

4.加载硬件抽象层模块

上面我们生成了硬件抽象层对应的.so文件,那么怎么加载.so呢?Android系统中的硬件抽象层是由系统统一加载的,当调用者需要加载这些模块时,只要指定ID就可以了,在Android硬件抽象层中,负责加载硬件抽象层的函数是hw_get_module函数,原型如下:

int hw_get_module(const char *id, const struct hw_module_t **module);

比如我们传入参数FREG_HARDWARE_MODULE_ID,即”freg”,函数内部找到相应的.so文件,然后,最后调用load加载。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 19:29:59

为Android添加HAL模块的相关文章

为Android添加HAL模块(转)

1.每个硬件抽象层模块在内核中都对应一个驱动程序,硬件抽象层模块就时通过这些驱动程序来访问硬件设备的,它们是通过读写设备文件来进行通信的. 硬件抽象层中的模块接口源文件一般保存在hardware/libhardware目录中,为了方便起见,我们将虚拟硬件设备freg在硬件抽象层中的模块名称定义为freg,目录结构如下: hardware/libhardware/include/hardware/freg.h hardware/libhardware/modules/freg/Android.mk

Android HAL模块实现(转)

Android的HAL(Hardware Abstract Layer硬件抽象层)是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚.思路是把控制硬件的动作都放到了Android HAL中,而linux driver仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到user space.而Android是基于Aparch的license,因此硬件厂商可以只提供二进制代码,所以说Android只是一个开放的平台,并不是 一个开源的平台. 总结下来,Androi

Android HAL模块实现

1. HAL介绍 Android的HAL(Hardware Abstract Layer硬件抽象层)是为了保护一些硬件提供商的知识产权而提出的.是为了避开linux的GPL束缚. 思路是把控制硬件的动作都放到了Android HAL中,而linux driver仅仅完毕一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到user space.而Android是基于Aparch的license,因此硬件厂商能够仅仅提供二进制代码,所以说Android仅仅是一个开放的平台,并非一个开源的平台. 总

【转】【Android】HAL分析

原文网址:http://www.cnblogs.com/lcw/p/3335505.html HAL概述 以下是基于android4.0.3,对应其他低版本的代码,可能有所差异,但基本大同小异. Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚. 思路是把控制硬件的动作都放到了Android HAL中,而linux driver仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到user space.而Android是基于Aparch的

worktools-mmx 添加编译模块

1,添加模块到mmx.py文件 1>vim /home/zhangshuli/git/vanzo_team/xulei/mmx.py 2>按照格式"Gallery2":"packages/apps/Gallery2",appname(应用名)+:+modulename(包名) 在相应的module_path文件夹下添加相应模块信息 module_path = { "Contacts":"packages/apps/Conta

Android:HAL向上层提供接口

研究Android的核心库框架,慢慢的想了解一写驱动开发,Android怎么和Linux打交道?下面介绍一个对Android核心框架的HAL(Hardware Abstraction Layer)的理解.Android核心框架如图: Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚.思路是把控制硬件的动作都放到了 Android HAL中,而linux driver仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到user space

android添加账户源码浅析

上篇粗略的分析android添加账号的流程,本篇深入的解析下执行步骤.先来看图片,取自深入理解android卷2: 上图详细的分析了addAccount的流程,下面我们结合源码来理解它 1.addAccount:其实这里省略了一步,应该是客户端addAccount——>AddAccountSettings.addAccount——>AccountManager.addAccount.我们看下setting是如何到AccountManager: private void addAccount(S

动态编译添加php模块

注意:转载请注明出处:http://www.programfish.com/blog/?p=85 在很多时候我们用linux里搭建web服务器的时候会需要编译安装php套件,而在编译安装后可能又会需要添加一些编译安装时没有指定要编译进去的模块,例如如下情况: mysql.so 或mysqli.so .mbstring.so  zlib.so 等模块. 这里提示一下: 如果你有安装过phpmyadmin而且在安装配置好之后打开首页是空白的,那么很有可能就是你的php没有mysql和mbstring

Android添加快捷方式(Shortcut)到手机桌面

Android添加快捷方式(Short)到手机桌面 权限 要在手机桌面上添加快捷方式,首先需要在manifest中添加权限. <!-- 添加快捷方式 --> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <!-- 移除快捷方式 --> <uses-permission android:name="com.andro