Timed out Device -- Vibrator

Vibrator框架图:

Timed out Device -- Vibrator_第1张图片

自下而上,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。

移植与调试的要点   

驱动程序

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/vibrator/enable
# cat /sys/class/timed_output/vibrator/enable
3290//剩余震动时间,定时时间到
# echo "0"  > /sys/class/timed_output/vibrator/enable
对于enable文件,“写”表示使能指定的时间,“读”表示获取剩余时间。

标准硬件抽象层:

主要是操作交互接口
/sys/class/timed_output/vibrator/enable
代码:
#define THE_DEVICE "/sys/class/timed_output/vibrator/enable"
static int sendit(int timeout_ms)
{
    int nwr, ret, fd;
    char value[20];
#ifdef QEMU_HARDWARE
    if (qemu_check()) {
        return qemu_control_command( "vibrator:%d", timeout_ms );
    }
#endif
    fd = open(THE_DEVICE, O_RDWR);
    if(fd < 0)
        return errno;
    nwr = sprintf(value, "%d\n", timeout_ms);//转换格式成字符串
    ret = write(fd, value, nwr);//写接口,设定定时时间
    close(fd);
    return (ret == nwr) ? 0 : -1;
}

Hal层,提供了主要的三个函数的实现:

1.是否存在vibrator
2.Vibrator enable
3.Vibrator disable
这三个函数会被jni 调用
frameworks/base/services/jni/com_android_server_VibratorService.cpp,jni 传递到java层
frameworks/base/services/java/com/android/server/VibratorService.java

写app:

Android中手机震动的设置(Vibrator)的步骤:
a、通过系统服务获得手机震动服务,Vibrator vibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE);   
b、得到震动服务后检测vibrator是否存在:
vibrator.hasVibrator();
检测当前硬件是否有vibrator,如果有返回true,如果没有返回false。
c、根据实际需要进行适当的调用,
vibrator.vibrate(long milliseconds);
开始启动vibrator持续milliseconds毫秒。      
vibrator.vibrate(long[] pattern, int repeat);
以pattern方式重复repeat次启动vibrator。(pattern的形式为new  long[]{arg1,arg2,arg3,arg4......},其中以两个一组的如arg1 和arg2为一组、arg3和arg4为一组,每一组的前一个代表等待多少毫 秒启动vibrator,后一个代表vibrator持续多少毫秒停止,之后往复即 可。Repeat表示重复次数,当其为-1时,表示不重复只以pattern的方 式运行一次)。
vibrator.cancel();
Vibrator停止。
注意:在使用震动服务时需要如下权限:android.permission.VIBRATE。

 

你可能感兴趣的:(Android,driver,porting)