android震动系统开发全过程

上传人:pu****.1 文档编号:560218538 上传时间:2023-07-25 格式:DOCX 页数:11 大小:131.47KB
返回 下载 相关 举报
android震动系统开发全过程_第1页
第1页 / 共11页
android震动系统开发全过程_第2页
第2页 / 共11页
android震动系统开发全过程_第3页
第3页 / 共11页
android震动系统开发全过程_第4页
第4页 / 共11页
android震动系统开发全过程_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《android震动系统开发全过程》由会员分享,可在线阅读,更多相关《android震动系统开发全过程(11页珍藏版)》请在金锄头文库上搜索。

1、Android 震动系统开发全过程5一、前言 本人刚学习安卓驱动开发,水平不能说菜,是根本没有水平,在这里把学习过程贴出来,跟大家一起 学习交流,还望大家多多指正,转载的请标明出处。二、android驱动介绍安卓总体架构是在Linux内核基础上,增加硬件抽象层(HAL),运行库,java虚拟机,程序框架等组 成的,具体如下图。Hardware Abstract io n LayerqpcnGL|E5IlfAl-_ -7HanicrCart Libniriflt賦郦林IAPPLIC ATICNS毗Zr1Gimli忖卢ClockAPPLIEATIDN RRAM EWORKActMty- Manag

2、erManasrLinux Kernei_Drivr?Butfactli DriverU5R 口抽刖WiA 口听比九udi臼焙MlPp羽 fCalendarPaco AlbumAin 尺口F 匚)R LI NT I N1 E j .; LIBRARIES銘旷觀;厂 履赢安卓的应用程序是从application framework层架构上建立的。所有APK应用程序都是通过framework 层来运行的。application framework是google写好的,除非自己深度定制,一般是不会更改这个层的。对于驱动开发来讲,我们要做的就是让framework层能认识并操作我们的硬件设备就0K 了

3、。因此我们 关心主要有 3 个层面:linux Kernel 层HAL 层JNI层1. linux Kernel:是google在linux内核基础上,专门为移动设备优化后的内核,增加修改一些东西, 担修改的不多,对于内核驱动来讲,基本没有修改,做过linux驱动开发的人应该很容易理解。2. HAL,硬件抽象层:简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实 现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内 核空间(Kernel Space),其中,硬件抽象层运行在用户空间。用户空间不属于内核不必遵守GPL 协议,各个厂

4、商可以把与自己硬件设备相关,具有商业机密的一些代码放在HAL层。3. JNI层:提供java和底层C、C+的动态链接库的接口。我理解的是JNI就是一个代理,可以把C 和C+生成的接口函数翻译成Java可用,提供给framework层。三、振动系统开发过程1. 硬件平台CPU:IMX6Q4 核 1GRAM:1GFLASH:8G 板载这次开发用的代码都是 google 和飞思卡尔提供的具体的就不再说明了,因为每个平台代码都有所不同, 而且买开发板时候都会带相应的资料。2. 震动系统是android里面比较简单的一个系统,我采用的是从高层到底层的学习方式。因为我们的 驱动最终是给应用程序用的,从ap

5、plication的需求分析JNI,然后分析HAL最后在我们写linux kernel 驱动时候,很容易理解为什么要这么写。好了开始正式分析。3. Application 层:通过 google 我找到关于 APK 访问震动的如下说明:A、通过系统服务获得手机震动服务,Vibrator vibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE);B、得到震动服务后检测vibrator是否存在:vibrator.hasVibrator();检测当前硬件是否有vibrator,如果有返回true,如果没有返回false。C、根据实际需要进行适当的

6、调用,vibrator.vibrate(long milliseconds);开始启动 vibrator 持续 milliseconds 毫秒。 vibrator.vibrate(long pattern, int repeat); 以 pattern 方式重复 repeat 次启动 vibrator。(pattern 的形式为 new Iongarg1,arg2,arg3,arg4.,其中以两个一组的如 arg1 和 arg2 为一 组、arg3和arg4为一组,每一组的前一个代表等待多少毫秒启动vibrator,后一个代表vibrator 持续多少毫秒停止,之后往复即可。Repeat表示重

7、复次数,当其为-1时,表示不重复只以 pattern 的方式运行一次)。D、vibrator.cancel();Vibrator 停止。从上面的说明,可以看出应用程序调用震动系统,是调用一个叫VIBRATOR_SERVICE的服务,这个服 务有3个函数,分别是hasVibrator(),r.vibrate, .cancel();当然这个三个函数可能在framework层进行 的另一层的封装,我没有去深究。但可以推测出JNI层要做的是与注册VIBRATOR_SERVICE服务和实 现这三个函数相关的.4. HAL层:这一层我找到了具体的代码我们会好分析很多,其代码是: androidframew

8、orksbaseservicesjnicom_android_server_VibratorService.cpp#define LOG_TAG VibratorService#include jni.h#include JNIHelp.h#include android_runtime/AndroidRuntime.h#include #include #include #include namespace android static jbooleanvibratorExists(JNIEnv *env, jobjectclazz)/判断振动器是否存在returnvibrator_exis

9、ts() 0 ? JNI_TRUE : JNI_FALSE;static void vibratorOn(JNIEnv *env, jobjectclazz, jlongtimeout_ms)/打开振动器/ LOGI(vibratorOnn);vibrator_on(timeout_ms);static void vibratorOff(JNIEnv *env, jobjectclazz)/关闭振动器/ LOGI(vibratorOffn);vibrator_off();staticJNINativeMethodmethod_table = vibratorExists, ()Z, (void

10、*)vibratorExists , vibratorOn, (J)V, (void*)vibratorOn , vibratorOff, ()V, (void*)vibratorOff ;intregister_android_server_VibratorService(JNIEnv *env) 注册 vibrator 服.务returnjniRegisterNativeMethods(env, com/android/server/VibratorService, method_table, NELEM(method_table);从上面代码可以看出,JNI做了两件事:其一注册vibra

11、tor服务,其二,实现了 vibratorExists, vibratorOn, vibratorOff三个服务函数。进而我们可以分析出HAL层主要的就是实现次代码里调用 的三个函数 vibrator_exists(), vibrator_on(timeout_ms), vibrator_off()。5. HAL 层:经过各种查找我们找到了 vibrator 的 hal 层代码: android40hardwarelibhardware_legacyvibratorvibrator.c#include #include qemu.h#include #include #include #inc

12、lude #define THE_DEVICE /sys/class/timed_output/vibrator/enable intvibrator_exists() /判断振动器是否存在intfd;#ifdef QEMU_HARDWARE/模拟器情况下实现此功能if (qemu_check() return 1;#endiffd = open(THE_DEVICE, O_RDWR); if(fd 0)return 0;close(fd);return 1;static intsendit(inttimeout_ms)打开振动器 timeout_ms 毫秒intnwr, ret, fd;ch

13、ar value20;#ifdef QEMU_HARDWARE/模拟器情况下实现次功能if (qemu_check() returnqemu_control_command( vibrator:%d, timeout_ms );#endiffd = open(THE_DEVICE, O_RDWR);if(fd 0)returnerrno;nwr = sprintf(value, %dn, timeout_ms);ret = write(fd, value, nwr);close(fd);return (ret = nwr) ? 0 : -1; intvibrator_on(inttimeout

14、_ms)/* constant on, up to maximum allowed time */returnsendit(timeout_ms);intvibrator_off()/关闭振动器就是设置振动器打开时间为 0returnsendit(0);分析上面代码可以看出,HAL访问这个设备是打开/sys/class/timed_output/vibrator/enable,这个设备 文件,然后向文件中写入打开时间来完成设备操作的。因此很容易我们可以推断出,linux kernel层 是要生成这个设备文件然后,实现相应的函数。6. Linux kernel层:通过上面分析我们大概了解了内核驱动所要实现的功能。通过各种参考资料,我 查到了这个设备驱动是通过timed_output框架来实现的,有框架在又简单了不少,我们找到 timed_output 框架实现的函数在:kerneldriversstagingandroidtimed_output.c#include #include #include #include #incl

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号