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

相关文章

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO