android驱动开发基础android手机驱动「android驱动开发基础」
- 开发板:hikey960
- 代码:aosp,Android R
- 开发环境:64bit ubuntu 16.04,
添加新的lunch选项(新产品):赋值,如下 (参考,实例参考)
Android.mk模板如下所示:
- 编译报unused parameters错时,需加上: 以忽略掉该报错。
- log系统的设备节点:
-
转载来自文章《Android Log系统介绍 (基于Android N)》的log系统核心图如下所示,更多细节请参考此文。
图1 Android log系统
-
Android Q、R上面log的缓冲区有:main,system,radio,events,crash
-
c/c++中打印调试信息:
① 宏定义标签及添加头文件:
② Android.mk中声明所依赖的动态库:
③ 使用宏,,,,,进行打印log -
java中打印log信息:
① 导入包:
② 在类内部定义标签:
③ 使用方法,,,进行打印
参考中如下代码,可知祖先进程通过解析的内容来进行启动各种本地服务
- android init语言说明文档:
- 在厂商中添加规则,实例:
以控制LED灯为背景,进行JNI编程技术的介绍。aosp中JNI技术参考代码:
1. java调用jni接口
将native接口的声明组织到
然后在中进行调用:
- 注意:普通app没有权限加载jni动态库依赖的库,需将apk预置或传入到手机的下作为
2. aosp中开发native代码
① 定义JAVA和C/C++间的映射表如下所示。其中是java中native方法的签名,在APP目录下执行可查看各方法的签名,再把他们分别填充到映射表。
② 通过定义jni层的回调函数,来将上述映射表注册到java虚拟机:
③ 中指定生成的是动态库和编译工具分别如下:
- 注意:测试时,需要修改设备节点权限:,以及关闭selinux:
3. Android Studio中开发native代码
参考我的另一篇文章有详细开发步骤:Android Studio开发NDK代码。
本章介绍开发传统HAL代码和调用HAL的主要流程,如下出现的代码场景是控制LED灯。
1. 接口声明
开发HAL在头文件,定义相应硬件模块和设备结构,以继承基础模块结构()和基础设备结构()。另外还有暴露接口给调用者的目的。具体开发流程如下所示:
2. 接口实现
① 实例化自己派生的专有硬件模块结构;
② 实例化,该结构下成员只有;
③ 定义,它的任务是实例化的派生结构体;
④ 定义,HAL调用者调用此函数用于关闭设备和释放中申请的资源;
⑤ 实现暴露给HAL调用者的接口,本场景要实现;
3. 添加编译规则
① 动态库名应为,所以;
② HAL动态库应部署到和下,需加上规则;
③ 导出暴露给调用者的接口头文件。部署到分区的HAL库,使用;部署到分区的HAL库,应使用。
- 若要HAL动态库部署到和,还需加上规则
HAL参考代码:
4. 使用HAL的接口
① 加载硬件的HAL模块,使用 ;
- ——HAL动态库名字的前缀,本场景值为;
- ——通过此参数获得 实例
② 通过 的派生结构体,获取的派生结构体,方法如下所示。但为了方便调用者,HAL接口头文件一般会将下面的代码实现到内联函数中,如调用前文的;
③使用HAL接口进行硬件控制的形式:;如本场景使用:来点亮LED;
④ 在需要关闭设备和释放有关内存资源时,需调用,所以调用方法如下所示。但为了方便调用者,HAL接口头文件一般会将下面的代码实现到内联函数中,如调用前文的;
- 注:调用HAL动态库的代码,需要链接动态库,故有。
aosp中调用HAL的参考代码:
诸暨版权声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com