linux上层app调用驱动底层的过程详解
2017-05-27 14:43
501 查看
APP应用程序->应用框架层->硬件抽象层-> 硬件驱动程序
一、硬件驱动层
进入kernel/drivers文件夹中,创建一文件夹,放入驱动程序。包括头文件,C文件,Makefile,Kconfig。同时对drivers下的Makefile跟Kconfig进行相应的添加,这样配置编译选项后,即可编译。编译完后,可以在/dev,/proc,/sys/class中得到相应的文件,其中dev下的文件即为该设备文件。
二、硬件抽象层
进入源码根目录下的hardware/libhardware/include/hardware新建头文件,在hardware/libhardware/modules中新建目录,在该目录下放入C文件调用设备文件(open函数打开/dev/XXX设备文件),最后在该目录下创建Android.mk文件,编译后得到XXX.default.so文件。重新打包后,system.img就包含我们定义的硬件抽象层模块XXX.default。
三、应用框架层
进入frameworks/base/services/jni目录,创建com_android_server_XXXService.cpp文件(#include <hardware/hello.h> 以此调用抽象层方法 ),实现jni方法。com_android_server前缀表示的是包名,表示硬件服务XXXService是放在frameworks/base/services/java目录下的com/android/server目录的。对同目录下的onload.cpp文件进行修改,这样,在Android系统初始化时,就会自动加载该JNI方法调用表。同时修改该目录下的Android.mk。
进入到frameworks/base/core/java/android/os目录,新增IXXXService.aidl接口定义文件,该文件提供功能函数。在frameworks/base目录下的Android.mk添加该aidl文件。进入frameworks/base/services/java/com/android/server目录,新增XXXService.java(主要是通过调用JNI方法来提供硬件服务),修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载HelloService的代码。
这样,重新打包后的system.img系统镜像文件就在Application Frameworks层中包含了我们自定义的硬件服务XXXService了,并且会在系统启动的时候,自动加载XXXService。这时,应用程序就可以通过Java接口来访问Hello硬件服务了。
四、APP应用层
用eclipse编写应用层的APP。程序通过ServiceManager.getService("XXX")来获得XXXService,接着通过IXXXService.Stub.asInterface函数转换为IXXXService接口。然后把出R文件的其他文件都拷到/packages/experimental下,在该APP目录下创建Android.mk文件。编译后安装该生成的apk即可使用该程序调用底层硬件驱动。
大概整个过程就这样,上层app调用框架层的java接口,java接口通过jni调用硬件抽象层,硬件抽象层则通过打开设备文件调用底层硬件驱动。
一、硬件驱动层
进入kernel/drivers文件夹中,创建一文件夹,放入驱动程序。包括头文件,C文件,Makefile,Kconfig。同时对drivers下的Makefile跟Kconfig进行相应的添加,这样配置编译选项后,即可编译。编译完后,可以在/dev,/proc,/sys/class中得到相应的文件,其中dev下的文件即为该设备文件。
二、硬件抽象层
进入源码根目录下的hardware/libhardware/include/hardware新建头文件,在hardware/libhardware/modules中新建目录,在该目录下放入C文件调用设备文件(open函数打开/dev/XXX设备文件),最后在该目录下创建Android.mk文件,编译后得到XXX.default.so文件。重新打包后,system.img就包含我们定义的硬件抽象层模块XXX.default。
三、应用框架层
进入frameworks/base/services/jni目录,创建com_android_server_XXXService.cpp文件(#include <hardware/hello.h> 以此调用抽象层方法 ),实现jni方法。com_android_server前缀表示的是包名,表示硬件服务XXXService是放在frameworks/base/services/java目录下的com/android/server目录的。对同目录下的onload.cpp文件进行修改,这样,在Android系统初始化时,就会自动加载该JNI方法调用表。同时修改该目录下的Android.mk。
进入到frameworks/base/core/java/android/os目录,新增IXXXService.aidl接口定义文件,该文件提供功能函数。在frameworks/base目录下的Android.mk添加该aidl文件。进入frameworks/base/services/java/com/android/server目录,新增XXXService.java(主要是通过调用JNI方法来提供硬件服务),修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载HelloService的代码。
这样,重新打包后的system.img系统镜像文件就在Application Frameworks层中包含了我们自定义的硬件服务XXXService了,并且会在系统启动的时候,自动加载XXXService。这时,应用程序就可以通过Java接口来访问Hello硬件服务了。
四、APP应用层
用eclipse编写应用层的APP。程序通过ServiceManager.getService("XXX")来获得XXXService,接着通过IXXXService.Stub.asInterface函数转换为IXXXService接口。然后把出R文件的其他文件都拷到/packages/experimental下,在该APP目录下创建Android.mk文件。编译后安装该生成的apk即可使用该程序调用底层硬件驱动。
大概整个过程就这样,上层app调用框架层的java接口,java接口通过jni调用硬件抽象层,硬件抽象层则通过打开设备文件调用底层硬件驱动。
相关文章推荐
- 从上层APP到底层驱动的调用过程
- 上层APP调用底层硬件驱动过程解析
- 上层APP调用底层硬件驱动过程解析
- 上层APP调用底层硬件驱动过程解析
- 上层APP调用底层硬件驱动过程解析
- Android上层APP利用sysfs调用底层驱动分析
- 浅析Linux从API调用到底层驱动的过程
- (转)上层APP调用底层硬件驱动过…
- linux底层驱动模型之二:上层容器
- linux驱动系统调用ioctl()的cmd参数详解【字段划分图】
- 如果你在学嵌入式底层驱动,内核模块编程将是你的第一课!小白学Linux之内核模块编程详解
- linux驱动开发之字符设备框架 -调用过程分析
- Linux学习:应用层open调用驱动层open过程
- FM函数从上层到底层调用过程(回顾)
- 详解应用层open函数如何调用到底层驱动中xxx_open函数
- 如果你在学嵌入式底层驱动,内核模块编程将是你的第一课!小白学Linux之内核模块编程详解
- windows 调用Linux集群运行过程详解
- android电池管理系统从上层的java到底层驱动的调用(转载)
- linux驱动调试之段错误分析-根据栈信息分析函数调用过程
- linux底层驱动模型之二:上层容器