文章来源:http://mobile.51cto.com/abased-376134.htm

Android振动器系统是Android其他系统中相对简单的系统。 振动器系统用来启动电话的震动功能。比如闹钟、振动模式都需要用到振动器系统。

AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验

平台 MTK6573

Android 振动器系统架构

  1. 驱动层
  2. 硬件抽象层
  3. JNI框架层
  4. Java应用层

一、驱动层

Android修改、新增Linux内核文件

/kernel/drivers/staging/android/timed_output.h
/kernel/drivers/staging/android/timed_output.c

timed_output.h 定义了timed_output_dev 结构体

 
 
  1. struct timed_output_dev { 
  2.     const char  *name; 
  3.  
  4.     /* enable the output and set the timer */ 
  5.     void    (*enable)(struct timed_output_dev *sdev, int timeout); 
  6.  
  7.     /* returns the current number of milliseconds remaining on the timer */ 
  8.     int     (*get_time)(struct timed_output_dev *sdev); 
  9.  
  10.     /* private data */ 
  11.     struct device   *dev; 
  12.     int     index; 
  13.     int     state; 
  14. }; 

timed_output.c 实现了该结构体,使用函数timed_output_dev_register实现注册,使用timed_output_dev_unregister实现注销。

 
 
  1. int timed_output_dev_register(struct timed_output_dev *tdev) 
  2.     int ret; 
  3.  
  4.     if (!tdev || !tdev->name || !tdev->enable || !tdev->get_time) 
  5.         return -EINVAL; 
  6.  
  7.     ret = create_timed_output_class(); 
  8.     if (ret < 0
  9.         return ret; 
  10.  
  11.     tdev->index = atomic_inc_return(&device_count); 
  12.     tdev->dev = device_create(timed_output_class, NULL, 
  13.         MKDEV(0, tdev->index), NULL, tdev->name); 
  14.     if (IS_ERR(tdev->dev)) 
  15.         return PTR_ERR(tdev->dev); 
  16.  
  17.     ret = device_create_file(tdev->dev, &dev_attr_enable); 
  18.     if (ret < 0
  19.         goto err_create_file; 
  20.  
  21.     dev_set_drvdata(tdev->dev, tdev); 
  22.     tdev->state = 0
  23.     return 0
  24.  
  25. err_create_file: 
  26.     device_destroy(timed_output_class, MKDEV(0, tdev->index)); 
  27.     printk(KERN_ERR "timed_output: Failed to register driver %s\n"
  28.             tdev->name); 
  29.  
  30.     return ret; 
  31. EXPORT_SYMBOL_GPL(timed_output_dev_register); 
  32.  
  33. void timed_output_dev_unregister(struct timed_output_dev *tdev) 
  34.     device_remove_file(tdev->dev, &dev_attr_enable); 
  35.     device_destroy(timed_output_class, MKDEV(0, tdev->index)); 
  36.     dev_set_drvdata(tdev->dev, NULL); 
  37. EXPORT_SYMBOL_GPL(timed_output_dev_unregister); 

驱动实现移植

以MTK 6573平台为例 

./mediatek/platform/mt6573/kernel/drivers/vibrator/vibrator.c

操作设备

首先打开手机调试,连接USB,执行adb shell,进入/sys/devices/timed_output/vibrator/

执行 echo "10000" > enable 发现手机在震动

 
 
  1. # echo "10000" > enable 
  2. echo "10000"  > enable 
  3. 10000 enable 

执行 cat enable 可以查看当前震动时间剩余数:

 
 
  1. # cat enable 
  2. cat enable 
  3. 0 

二、硬件抽象层

Android 封装了对底层驱动的调用,成为硬件抽象层。

/hardware/libhardware_legacy/vibrator/vibrator.c

 
 
  1. int vibrator_on(int timeout_ms) 
  2.     /* constant on, up to maximum allowed time */ 
  3.     return sendit(timeout_ms); 
  4.  
  5. int vibrator_off() 
  6.     return sendit(0); 

三、 JNI框架层

Android JNI框架层是方便Java调用C/C++方法。

./frameworks/base/services/jni/com_android_server_VibratorService.cpp

 
 
  1. namespace android 
  2.  { 
  3.   
  4.  static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms) 
  5.  { 
  6.      // LOGI("vibratorOn\n"); 
  7.      vibrator_on(timeout_ms); 
  8.  } 
  9.  static void vibratorOff(JNIEnv *env, jobject clazz) 
  10.  { 
  11.      // LOGI("vibratorOff\n"); 
  12.      vibrator_off(); 
  13.  } 
  14.  static JNINativeMethod method_table[] = { 
  15.      { "vibratorOn""(J)V", (void*)vibratorOn }, 
  16.      { "vibratorOff""()V", (void*)vibratorOff } 
  17.  }; 
  18.  int register_android_server_VibratorService(JNIEnv *env) 
  19.  { 
  20.      return jniRegisterNativeMethods(env, "com/android/server/VibratorService"
  21.              method_table, NELEM(method_table)); 
  22.  } 
  23. }; 

四、Java应用层

这层包括Java 应用的调用,Android系统服务Java层

./frameworks/base/services/java/com/android/server/VibratorService.java



Logo

开源、云原生的融合云平台

更多推荐