Android震动系统结构移植



负责控制引动电话的振功能,Android中的振器系是一个方面功能的小系,提供根据时间的功能。

  振器系包含了驱动程序、硬件抽象JNI部分、Java框架等几个部分,也向Java用程序提供了简单API平台接口.



  1、振器部分的

  Android器系自下而上包含了驱动程序、振器系硬件抽象、振器系Java框架Java框架中振器系使用等几个部分.


  自下而上,Android的振器系分成了以下部分。

  (1)驱动程序:特定硬件平台振器的驱动程序,通常基于AndroidTimedOutput驱动框架实现

  (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过调用,VibratorServiceJNI实现com.android.server包中的VibratorService不是平台的API,被AndroidJava框架中的一小部分用。

  Vibrator.java文件实现android.os包中的Vibrator是向Java提供的API

  2、移植内容

  针对特定的硬件平台,振器系的移植有两种方法。

  第一种方法(通常情况):由于已具有硬件抽象,振器系的移植只需要实现驱动程序即可。驱动程序需要基于Android内核中的TimedOutput驱动框架。

  第二种方法:根据自己实现驱动程序,重新实现器的硬件抽象接口(需要在libhardware_legacy.so),由于振器硬件抽象的接口非常简单,因此实现方式也不会很复


  1驱动程序

  Vibrator驱动程序只需要实现的接口即可,是一个设备,需要接受振动时间参数。由于比较简单,因此Vibrator驱动程序可以使用多种方式来实现

  在Android中,推荐基于Android内核定TimedOutput驱动程序框架来实现Vibrator驱动程序。

  TimedOutput的含义为时输出,用于定时发出某个出。实际上,驱动程序依然是基于sys文件系来完成的。

  drivers/staging/android/timed_output.h中定timed_output_dev构体,其中包含enableget_time两个函数指实现结构体后,使用timed_output_dev_register()timed_output_dev_unregister()函数注册和注即可。

  TimedOutput驱动程序框架将每个设备/sys/class/timed_output/中建立一个子目设备子目中的enable文件就是设备的控制文件。enable文件表示得剩余时间,写个文件表示根据时间

  TimedOutput驱动设备调试,通sys文件系即可。

  Vibrator设备,其实现TimedOutput驱动程序的名称应该为vibrator”。因此Vibrator设备sys文件系中的方法如下所示:

#echo "10000"> /sys/class/timed_output/vibrator/enable
# cat/sys/class/timed_output/vibrator/enable
3290
#echo
"0"  >/sys/class/timed_output/vibrator/enable

  enable文件,“写”表示使能指定的时间,“”表示取剩余时间

  2、硬件抽象的内容

  1.硬件抽象的接口

  Vibrator硬件抽象的接口在hardware/libhardware_legacy/include/hardware_legacy/vibrator.h文件中定

  intvibrator_on(int timeout_ms); // 开始振

  intvibrator_off(); //

  vibrator.h文件中定两个接口,分表示振和关,振开始以毫秒(ms)为时间单位。

  提示:TimedOutput驱动本身有得剩余时间的能力(enable文件),但是在AndroidVibrator硬件抽象以上的各接口都没有使用个功能。

  2.

准硬件抽象实现

  Vibrator硬件抽象具有

准的实现,在hardware/libhardware_legacy/vibrator/vibrator.c中。

  其中实现的核心内容sendit()函数,个函数的内容如下所示:

#defineTHE_DEVICE "/sys/class/timed_output/vibrator/enable"
static
intsendit(inttimeout_ms)
{
    
intnwr, ret, fd;
    char value[
20];
#ifdefQEMU_HARDWARE                //
使用QEMU的情况
    
if(qemu_check()) {
        returnqemu_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的方法列表如下所示:

staticJNINativeMethod method_table[] = {
    {
"vibratorOn","(J)V",(void*)vibratorOn },   //
器开
    {
"vibratorOff","()V",(void*)vibratorOff }   // 器关
};
intregister_android_server_VibratorService(JNIEnv *env) {
    returnjniRegisterNativeMethods(env,
"com/android/server/VibratorService",
            method_table,NELEM(method_table));
}

  vibratorOn()vibratorOff()两个函数的实现如下所示:

staticvoid vibratorOn(JNIEnv *env, jobject clazz, jlongtimeout_ms){
    vibrator_on(timeout_ms);
}
staticvoid vibratorOff(JNIEnv *env, jobject clazz){
    vibrator_off();
}

  frameworks/base/services/java/com/android/server/中的VibratorService.java过调VibratorServiceJNI实现com.android.server包中的VibratorService

  frameworks/base/core/java/android/os/中的Vibrator.java文件实现android.os包中的Vibrator。它通过调vibratorJava实现(得名称vibrator的服),配合同目中的IVibratorService.aidl文件向用程序提供Vibrator的相关API


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值