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 Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)