Android 振动器系统架构

2023-10-06 20:02

本文主要是介绍Android 振动器系统架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

平台 MTK6573

Android 振动器系统架构

  • 驱动层
  • 硬件抽象层
  • JNI框架层
  • Java应用层

一、驱动层

Android修改、新增Linux内核文件

  1. /kernel/drivers/staging/android/timed_output.h
  2. /kernel/drivers/staging/android/timed_output.c
复制代码
timed_output.h 定义了timed_output_dev 结构体
  1. struct timed_output_dev {
  2.     const char  *name;

  3.     /* enable the output and set the timer */
  4.     void    (*enable)(struct timed_output_dev *sdev, int timeout);

  5.     /* returns the current number of milliseconds remaining on the timer */
  6.     int     (*get_time)(struct timed_output_dev *sdev);

  7.     /* private data */
  8.     struct device   *dev;
  9.     int     index;
  10.     int     state;
  11. };
复制代码
timed_output.c 实现了该结构体,使用函数timed_output_dev_register实现注册,使用timed_output_dev_unregister实现注销。
  1. int timed_output_dev_register(struct timed_output_dev *tdev)
  2. {
  3.     int ret;

  4.     if (!tdev || !tdev->name || !tdev->enable || !tdev->get_time)
  5.         return -EINVAL;

  6.     ret = create_timed_output_class();
  7.     if (ret < 0)
  8.         return ret;

  9.     tdev->index = atomic_inc_return(&device_count);
  10.     tdev->dev = device_create(timed_output_class, NULL,
  11.         MKDEV(0, tdev->index), NULL, tdev->name);
  12.     if (IS_ERR(tdev->dev))
  13.         return PTR_ERR(tdev->dev);

  14.     ret = device_create_file(tdev->dev, &dev_attr_enable);
  15.     if (ret < 0)
  16.         goto err_create_file;

  17.     dev_set_drvdata(tdev->dev, tdev);
  18.     tdev->state = 0;
  19.     return 0;

  20. err_create_file:
  21.     device_destroy(timed_output_class, MKDEV(0, tdev->index));
  22.     printk(KERN_ERR "timed_output: Failed to register driver %s\n",
  23.             tdev->name);

  24.     return ret;
  25. }
  26. EXPORT_SYMBOL_GPL(timed_output_dev_register);

  27. void timed_output_dev_unregister(struct timed_output_dev *tdev)
  28. {
  29.     device_remove_file(tdev->dev, &dev_attr_enable);
  30.     device_destroy(timed_output_class, MKDEV(0, tdev->index));
  31.     dev_set_drvdata(tdev->dev, NULL);
  32. }
  33. 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. {
  3.     /* constant on, up to maximum allowed time */
  4.     return sendit(timeout_ms);
  5. }

  6. int vibrator_off()
  7. {
  8.     return sendit(0);
  9. }
复制代码
三、 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

这篇关于Android 振动器系统架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/153904

相关文章

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

CPython与PyPy解释器架构的性能测试结果对比

《CPython与PyPy解释器架构的性能测试结果对比》Python解释器的选择对应用程序性能有着决定性影响,CPython以其稳定性和丰富的生态系统著称;而PyPy作为基于JIT(即时编译)技术的替... 目录引言python解释器架构概述CPython架构解析PyPy架构解析架构对比可视化性能基准测试测

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

MySQL集群高可用架构的两种使用小结

《MySQL集群高可用架构的两种使用小结》本文介绍了MySQL的两种高可用解决方案:组复制(MGR)和MasterHighAvailability(MHA),文中通过示例代码介绍的非常详细,对大家的学... 目录一、mysql高可用之组复制(MGR)1.1 组复制核心特性与优势1.2 组复制架构原理1.3

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码