日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android振動(dòng)器(Vibrator)系統(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)注冊(cè),使用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 

二、硬件抽象層

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


網(wǎng)頁標(biāo)題:Android振動(dòng)器(Vibrator)系統(tǒng)詳解
文章出自:http://www.5511xx.com/article/cohjggi.html