From e6904fbdf7976abbadf3e7e658e9416ca49402f9 Mon Sep 17 00:00:00 2001 From: Vincent Becker Date: Fri, 10 Aug 2012 14:17:33 +0200 Subject: [PATCH] Vibra: Add loading of the vibrator hardware module. Vibrator HAL is now formed of two hardware modules: one is the default AOSP and the other is the vendor implementation. The vendor implementation will be loaded prior to the default one. For that, the vibrator service has to load the module before registering itself to the JNI. This change is related to other changes in: - hardware/libhardware - hardware/libhardware_legacy Change-Id: I844279f5535289f079d412fdc44c5cb3c9c1130c Author: Vincent Becker Signed-off-by: Vincent Becker Signed-off-by: Shuo Gao Signed-off-by: Bruce Beare Signed-off-by: Jack Ren Signed-off-by: David Wagner Author-tracking-BZ: 49760 94611 --- .../com/android/server/VibratorService.java | 2 + .../com_android_server_VibratorService.cpp | 49 ++++++++++++++++--- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 20f6f1ccffecc..9557ebde794b4 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -82,6 +82,7 @@ public class VibratorService extends IVibratorService.Stub private SettingsObserver mSettingObserver; native static boolean vibratorExists(); + native static void vibratorInit(); native static void vibratorOn(long milliseconds); native static void vibratorOff(); @@ -147,6 +148,7 @@ public class VibratorService extends IVibratorService.Stub } VibratorService(Context context) { + vibratorInit(); // Reset the hardware to a default state, in case this is a runtime // restart instead of a fresh boot. vibratorOff(); diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp index fb1166b41d41e..b8e004f06ee6e 100644 --- a/services/core/jni/com_android_server_VibratorService.cpp +++ b/services/core/jni/com_android_server_VibratorService.cpp @@ -22,32 +22,69 @@ #include #include -#include +#include #include namespace android { +static hw_module_t *gVibraModule = NULL; +static vibrator_device_t *gVibraDevice = NULL; + +static void vibratorInit(JNIEnv /* env */, jobject /* clazz */) +{ + if (gVibraModule != NULL) { + return; + } + + int err = hw_get_module(VIBRATOR_HARDWARE_MODULE_ID, (hw_module_t const**)&gVibraModule); + + if (err) { + ALOGE("Couldn't load %s module (%s)", VIBRATOR_HARDWARE_MODULE_ID, strerror(-err)); + } else { + if (gVibraModule) { + vibrator_open(gVibraModule, &gVibraDevice); + } + } +} + static jboolean vibratorExists(JNIEnv* /* env */, jobject /* clazz */) { - return vibrator_exists() > 0 ? JNI_TRUE : JNI_FALSE; + if (gVibraModule && gVibraDevice) { + return JNI_TRUE; + } else { + return JNI_FALSE; + } } static void vibratorOn(JNIEnv* /* env */, jobject /* clazz */, jlong timeout_ms) { - // ALOGI("vibratorOn\n"); - vibrator_on(timeout_ms); + if (gVibraDevice) { + int err = gVibraDevice->vibrator_on(gVibraDevice, timeout_ms); + if (err != 0) { + ALOGE("The hw module failed in vibrator_on: %s", strerror(-err)); + } + } else { + ALOGW("Tried to vibrate but there is no vibrator device."); + } } static void vibratorOff(JNIEnv* /* env */, jobject /* clazz */) { - // ALOGI("vibratorOff\n"); - vibrator_off(); + if (gVibraDevice) { + int err = gVibraDevice->vibrator_off(gVibraDevice); + if (err != 0) { + ALOGE("The hw module failed in vibrator_off(): %s", strerror(-err)); + } + } else { + ALOGW("Tried to stop vibrating but there is no vibrator device."); + } } static JNINativeMethod method_table[] = { { "vibratorExists", "()Z", (void*)vibratorExists }, + { "vibratorInit", "()V", (void*)vibratorInit }, { "vibratorOn", "(J)V", (void*)vibratorOn }, { "vibratorOff", "()V", (void*)vibratorOff } };