振动器负责控制引动德律风的振动功能,Android中的振动器系统是一个专供这方面功能的小系统,提供根据时间振动的功能。
振动器系统包含了驱动轨范、硬件抽象层、JNI部门、Java框架类等几个部门,也向Java应用轨范层提供了简单的API作为平台接口。Android振动器系统的基本条理结构如图23-1所示。
Android震动系统结构 移植与调试的要点_第1张图片
▲图23-1 Android振动器系统的基本条理结构
1 、振动器部门的结构
Android振动器系统自下而上包含了驱动轨范、振动器系统硬件抽象层、振动器系统Java框架类、Java框架中振动器系统使用等几个部门,其结构如图23-2所示。


▲图23-2 Android振动器系统的结构
自下而上,Android的振动器系统分成了以下部门。
(1)驱动轨范:特定硬件平台振动器的驱动轨范,通常基于Android的Timed Output驱动框架实现
(2)硬件抽象层
光系统硬件抽象层接口路径为:hardware/libhardware_legacy/include/hardware_legacy/ vibrator.h
振动器系统的硬件抽象层在Android中已经具有默认实现,代码路径:
hardware/libhardware_legacy/vibrator/vibrator.c
振动器的硬件抽象层通常其实不需要重新实现,是libhardware_legacy.so的一部门。
(3)JNI部门
代码路径:frameworks/base/services/jni/com_android_server_VibratorService.cpp
这个类是振动器的JNI部门,通过挪用硬件抽象层向上层提供接口。
(4)Java部门
代码路径:
frameworks/base/services/java/com/android/server/VibratorService.java
frameworks/base/core/java/android/os/Vibrator.java
VibratorService.java通过挪用,VibratorService JNI来实现com.android.server包中的VibratorService类。这个类不是平台的API,被Android系统Java框架中的一小部门挪用。
Vibrator.java文件实现了android.os包中的Vibrator类,这是向Java层提供的API。

2 、移植内容
针对特定的硬件平台,振动器系统的移植有两种体例。
第一种体例(通常情况):由于已经具有硬件抽象层,振动器系统的移植只需要实现驱动轨范即可。这个驱动轨范需要基于Android内核中的Timed Output驱动框架。
第二种体例:根据自己实现的驱动轨范,重新实现振动器的硬件抽象层界说接口(需要在libhardware_legacy.so库中),由于振动器硬件抽象层的接口很是简单,因此这种实现体例也不会很复杂。
1、驱动轨范
Vibrator的驱动轨范只需要实现振动的接口即可,这是一个输出设备,需要接受振动时间作为参数。由于斗劲简单,因此Vibrator的驱动轨范可使用多种体例来实现。
在Android中,推荐基于Android内核界说Timed Output驱动轨范框架来实现Vibrator的驱动轨范。
Timed Output的含义为按时输出,用于按时发出某个输出。实际上,这种驱动轨范依然是基于sys文件系统来完成的。
drivers/staging/android/目录timed_output.h中界说timed_output_dev结构体,其中包含enable和get_time这两个函数指针,实现结构体后,使用timed_output_dev_register和timed_output_dev_unregister函数注册和注销即可。
Timed Output驱动轨范框架将为每个设备在/sys/class/timed_output/目录中建立一个子目录,设备子目录中的enable文件就是设备的控制文件。读enable文件暗示获得剩余时间,写这个文件暗示根据时间振动。
Timed Output驱动的设备调试,通过sys文件系统即可。
对Vibrator设备,其实现的Timed Output驱动轨范的名称应该为“vibrator”。因此Vibrator设备在sys文件系统中的体例如下所示:
# echo"10000">/sys/class/timed_output//enable
# cat/sys/class/timed_output//enable
3290
# echo"0">/sys/class/timed_output//enable
对enable文件,“写”暗示使能指定的时间,“读”暗示获取剩余时间。
2 、硬件抽象层的内容
1.硬件抽象层的接口
Vibrator硬件抽象层的接口在hardware/libhardware_legacy/include/hardware_legacy/目录的vibrator.h文件中界说:
int vibrator_on(int timeout_ms); // 开始振动
int vibrator_off; // 关闭振动
vibrator.h文件中界说两个接口,别离暗示振动和关闭,振动开始以毫秒(ms)作为时间单元。

提示:Timed Output类型驱动自己有获得剩余时间的能力(读enable文件),可是在Android Vibrator硬件抽象层以上的各层接口都没有使用这个功能。
2.尺度硬件抽象层的实现
Vibrator硬件抽象层具有尺度的实现,在hardware/libhardware_legacy/vibrator/目录的vibrator.c中。
其中实现的核心内容为sendit函数,这个函数的内容如下所示:
#define THE_DEVICE"/sys/class/timed_output/vibrator/enable"
staticintsendit(inttimeout_ms)
{
intnwr, ret, fd;
char value[20];
#ifdef QEMU_HARDWARE//使用QEMU的情况
if(qemu_check) {
return qemu_control_command("vibrator:%d", timeout_ms );
}
#endif
fd=open(THE_DEVICE, O_RDWR);//读取sys文件系统中的内容
if(fd<0) return errno;
nwr=sprintf(value,"%d\n", timeout_ms);
ret=write(fd, value, nwr);
close(fd);
return (ret==nwr) ?0:-1;
}
sendit函数负责根据时间“振动”:在真实的硬件中,通过sys文件系统的文件进行控制;如果是模拟器环境则通过QEMU发送命令。
vibrator_on挪用sendit以时间作为参数,vibrator_on挪用sendit以0作为参数。
3、上层的情况和注意事项
frameworks/base/services/jni/目录中的com_android_server_VibratorService.cpp文件是Vibrator硬件抽象层的挪用者,它同时也向Java提供JNI支持。
其中,为JNI界说的体例列表如下所示:
static JNINativeMethod method_table[]={
{"vibratorOn","(J)V", (void*)vibratorOn },//振动器开
{"vibratorOff","V", (void*)vibratorOff }//振动器关
};
intregister_android_server_VibratorService(JNIEnv*env) {
return jniRegisterNativeMethods(env,"com/android/server/VibratorService",
method_table, NELEM(method_table));
}
vibratorOn和vibratorOff这两个函数的实现别离如下所示:
static void vibratorOn(JNIEnv*env, jobject clazz, jlong timeout_ms){
vibrator_on(timeout_ms);
}
static void vibratorOff(JNIEnv*env, jobject clazz){
vibrator_off;
}
frameworks/base/services/java/com/android/server/目录中的VibratorService.java通过挪用VibratorService JNI来实现com.android.server包中的VibratorService类。
frameworks/base/core/java/android/os/目录中的Vibrator.java文件实现了android.os包中的Vibrator类。它通过挪用vibrator的Java服务来实现(获得名称为vibrator的服务),配合同目录中的IVibratorService.aidl文件向应用轨范层提供Vibrator的相关API。




更多相关文章

  1. 第三部分:Android 应用程序接口指南---第四节:动画和图形---第五章
  2. Android 驱动之旅: 第三章 硬件抽象层(HAL)增加接口模块访问硬件
  3. Android串口的兼收 Android上执行硬件指令
  4. 转载加原创Android振动器调试
  5. Android开发平台振动器系统详解
  6. android 振动器系统

随机推荐

  1. Android之SharedPreferences详解
  2. Android(安卓)开发规范总结
  3. Android中的自定义Adapter(继承自BaseAdap
  4. Android Studio module里面放switch语句
  5. Android 四大组件(总结)
  6. ant生成android工程与 自动或者手动签名a
  7. 读写系统设置
  8. 获取Android崩溃crash信息并写入日志
  9. RK3288 Android 7.1 调试 USB MIDI
  10. ubuntu-11.04下android开发环境搭建