自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android振動(dòng)器(Vibrator)系統(tǒng)詳解

移動(dòng)開發(fā) Android
Android振動(dòng)器系統(tǒng)是Android其他系統(tǒng)中相對(duì)簡單的系統(tǒng)。 振動(dòng)器系統(tǒng)用來啟動(dòng)電話的震動(dòng)功能。比如鬧鐘、振動(dòng)模式都需要用到振動(dòng)器系統(tǒng)。

平臺(tái) MTK6573

Android 振動(dòng)器系統(tǒng)架構(gòu)

  1. 驅(qū)動(dòng)層
  2. 硬件抽象層
  3. JNI框架層
  4. Java應(yīng)用層

一、驅(qū)動(dòng)層

Android修改、新增Linux內(nèi)核文件

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

timed_output.h 定義了timed_output_dev 結(jié)構(gòu)體

  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 實(shí)現(xiàn)了該結(jié)構(gòu)體,使用函數(shù)timed_output_dev_register實(shí)現(xiàn)注冊,使用timed_output_dev_unregister實(shí)現(xiàn)注銷。

  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); 

驅(qū)動(dòng)實(shí)現(xiàn)移植

以MTK 6573平臺(tái)為例 

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

操作設(shè)備

首先打開手機(jī)調(diào)試,連接USB,執(zhí)行adb shell,進(jìn)入/sys/devices/timed_output/vibrator/

執(zhí)行 echo "10000" enable 發(fā)現(xiàn)手機(jī)在震動(dòng)

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

執(zhí)行 cat enable 可以查看當(dāng)前震動(dòng)時(shí)間剩余數(shù):

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

二、硬件抽象層

Android 封裝了對(duì)底層驅(qū)動(dòng)的調(diào)用,成為硬件抽象層。

/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調(diào)用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應(yīng)用層

這層包括Java 應(yīng)用的調(diào)用,Android系統(tǒng)服務(wù)Java層

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

責(zé)任編輯:徐川 來源: OSChina
相關(guān)推薦

2021-09-07 08:49:35

Android

2013-01-06 13:06:02

2010-01-28 14:35:21

Android系統(tǒng)信息

2010-03-31 14:57:23

CentOS系統(tǒng)

2011-06-01 10:48:28

Android系統(tǒng)

2010-01-28 17:18:08

Android模擬器s

2010-01-25 14:13:36

Android菜單系統(tǒng)

2011-05-04 09:48:14

2023-03-23 09:33:22

Android移動(dòng)開發(fā)

2011-05-05 14:44:43

SurfaceFlinSurfaceActivity

2013-11-05 11:25:21

Android 4.4系統(tǒng)詳解

2011-05-16 09:27:14

Android 3.1谷歌

2009-12-23 10:27:22

vi編輯器

2009-12-16 16:17:17

服務(wù)器遠(yuǎn)程監(jiān)控系統(tǒng)

2017-01-11 19:05:45

AndroidAndroid Loa詳解

2014-07-24 09:11:34

2013-11-14 16:50:08

2012-11-28 10:46:26

2014-07-28 10:09:30

Android

2011-05-27 15:02:15

Android ListView
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)