栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

安卓马达驱动实现说明

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

安卓马达驱动实现说明

目录
  • 参考资料
  • 概述(TBD)
  • 主要组成
  • 工作流程
  • Linux 层
  • HAL层
  • JNI层
  • Framework层

参考资料

安卓马达驱动
AIDL

概述(TBD)

本章分析马达的驱动,vibrator
文章未完,带补充。

主要组成
  • linux内核驱动文件 timed_output.c 定义一个类,
  • linux内核驱动文件 comip-vibrator.c 在timed_output类下 添加一个设备
工作流程
static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, enable_show, enable_store);



Linux 层

cut_1860_sdr/kernel/linux-3.10.y/drivers/staging/android/timed_output.c
cut_1860_sdr/kernel/linux-3.10.y/drivers/comip/vibrator/comip-vibrator.c

linux内核驱动文件 timed_output.c 定义一个类, comip-vibrator.c 在timed_output类下 添加vibrator设备。

HAL层

cut_1860_sdr/hardware/libhardware_legacy/vibrator/vibrator.c
#define THE_DEVICE “/sys/class/timed_output/vibrator/enable”
通过目录去访问设备。

JNI层

frameworks/base/services/core/jni/com_android_server_VibratorService.cpp

通过 jniRegisterNativeMethods(),我们将method_table中的方法注册到 com.android.server.VibratorService.java 中。配对表格如下:

  文件           VibratorService.java                          com_android_server_VibratorService.cpp   
native static boolean vibratorExists();                static jboolean vibratorExists(JNIEnv *env, jobject clazz)
native static void vibratorOn(long milliseconds);      static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms)
native static void vibratorOff();                      static void vibratorOff(JNIEnv *env, jobject clazz)

JNI如何和HAL层代码关联起来的。即com_android_server_VibratorService.cpp是如何调用到vibrator.c中的代码的。实际上道理很简单,我们先将vibrator.c封装成.so库;然后在com_android_server_VibratorService.cpp中导入该库,就可以调用vibrator.c的接口了。下面,看看Android中具体是如何做到的。

在hardware/libhardware_legacy/vibrator/Android.mk中,会将vibrator.c添加到 LOCAL_SRC_FILES 变量中。
hardware/libhardware_legacy/vibrator/Android.mk源码如下:

LOCAL_SRC_FILES += vibrator/vibrator.c

在hardware/libhardware_legacy/Android.mk中,它会调用子目录的Android.mk并将它们导入当前的Android.mk中。
hardware/libhardware_legacy/Android.mk源码如下:

legacy_modules := power uevent vibrator wifi qemu qemu_tracing

SAVE_MAKEFILES := $(call all-named-subdir-makefiles,$(legacy_modules))
LEGACY_AUDIO_MAKEFILES := $(call all-named-subdir-makefiles,audio)

include $(SAVE_MAKEFILES)

...

LOCAL_MODULE:= libhardware_legacy

include $(BUILD_SHARED_LIBRARY)

在“我们编译Android系统”或“通过 mmm hardware/libhardware_legacy进行模块编译”的时候,就会生成库libhardware_legacy.so;而且vibrator.c被包含在该库中。

/home/x90396/workspace/cut_1860_sdr/frameworks/base/services/core/jni/Android.mk

...

LOCAL_C_INCLUDES += 
    $(JNI_H_INCLUDE) 
    frameworks/base/services 
    frameworks/base/libs 
    frameworks/base/libs/hwui 
    frameworks/base/core/jni 
    frameworks/native/services 
    libcore/include 
    libcore/include/libsuspend 
    system/security/keystore/include 
    $(call include-path-for, libhardware)/hardware 
    $(call include-path-for, libhardware_legacy)/hardware_legacy 

LOCAL_SHARED_LIBRARIES += 
    libandroid_runtime 
    libandroidfw 
    libbinder
...

/home/x90396/workspace/cut_1860_sdr/frameworks/base/services/Android.mk

...
# native library
# =============================================================

include $(CLEAR_VARS)

LOCAL_SRC_FILES :=
LOCAL_SHARED_LIBRARIES :=

# include all the jni subdirs to collect their sources
include $(wildcard $(LOCAL_PATH)/*/jni/Android.mk)

LOCAL_CFLAGS += -DEGL_EGLEXT_PROTOTYPES -DGL_GLEXT_PROTOTYPES

LOCAL_MODULE:= libandroid_servers

include $(BUILD_SHARED_LIBRARY)

...
Framework层

应用层操作马达,是通过马达服务进行操作的。而马达服务是通过aidl实现的,aidl是Android进程间的通信方式。关于aidl的更多说明可以参考“Android Service总结06 之AIDL”。

马达服务涉及的主要文件如下:

  1. frameworks/base/services/java/com/android/server/SystemServer.java
  2. /home/x90396/workspace/cut_1860_sdr/frameworks/base/core/java/android/os/IVibratorService.aidl
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035926.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号