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

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手