- 参考资料
- 概述(TBD)
- 主要组成
- 工作流程
- Linux 层
- HAL层
- JNI层
- Framework层
安卓马达驱动
AIDL
本章分析马达的驱动,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”
通过目录去访问设备。
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”。
马达服务涉及的主要文件如下:
- frameworks/base/services/java/com/android/server/SystemServer.java
- /home/x90396/workspace/cut_1860_sdr/frameworks/base/core/java/android/os/IVibratorService.aidl



