1-4_Anroid振动器系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
针对特定的硬件平台,振动器系统的移植有两种方 法。 第一种方法(通常情况): 由于已经具有硬件抽象层,振动器的系统的移植只需要 实现驱动程序即可。这个驱动程序需要基于 Android 内核中的 Timed Output 驱动框架。 第二种方法: 根据自己实现的驱动程序,重新实现振动器的硬件抽象 层定义的接口(需要在 libhardware_legacy.so 库 中),由于振动器的硬件抽象层的接口非常简单,因此 这种实现方式也不会很复杂。
# echo "0" > /sys/class/timed_output/vibrator/enable
11
2 上层的情况和注意事项
Vibrator 硬件抽象层的接口在 hardware/libhardware_legacy/include/hardwar e_legacy/ 目录的 vibrator.h 文件中定义:
3
第一部分 振动器系统结构和移植内容
各种 Android应用
平台API
JAVA框架 Vibrator类,VibratorService 本地VibratorService JNI 硬件抽象层
本地框架 Android 系统 硬件 和驱动
振动器设备
4
第一部分 振动器系统结构和移植内容
自下而上, Android 的振动器系统分成了以下部分 1 、驱动程序:特定硬件平台振动器的驱动程序,通常基于 Timed Output 驱动框架实现 2 、硬件抽象层,光系统硬件抽象层接口路径为: 代码路径: hardware/libhardware_legacy/include/hardware_legacy/ vibrator.h 振动器系统的硬件抽象层在 Android 中已经具有默认实现,代码 路径为: 代码路径: hardware/libhardware_legacy/vibrator/vibrator.c 振动器的硬件抽象层通常并不需要重新实现,是 libhardware_legacy.so 的一部分。
14
第三部分 MSM 平台中的实现
static void set_pmic_vibrator(int on) { static struct msm_rpc_endpoint vib_endpoint; /* 定义 RPC 的端点 */ struct set_vib_on_off_req { struct rpc_request_hdr hdr; uint32_t data; } req; if (!vib_endpoint) { vib_endpoint = msm_rpc_connect(PM_LIBPROG, PM_LIBVERS, 0); /* ...... 省略部分内容 */ } if (on) req.data = cpu_to_be32(PMIC_VIBRATOR_LEVEL); /* 得到请求时间 */ else req.data = cpu_to_be32(0); msm_rpc_call(vib_endpoint, HTC_PROCEDURE_SET_VIB_ON_OFF, &req, sizeof(req), 5 * HZ); /* 进行 RPC 调用 */ }
10
1 驱动程序
drivers/staging/android/ 目录中 timed_output.h 中定义 timed_output_dev 结构体 ,其中包含 enable 和 get_time 这 2 个函数指针。 实现结构体后,使用 timed_output_dev_register() 和 timed_output_dev_unregister() 函数注册和注销 即可。 Timed Output 驱动程序框架将为每个设备 在 /sys/class/timed_output/ 目录中建立一个子目 录,设备子目录中的 enable 文件就是设备的控制文件。 # echo "10000" > /sys/class/timed_output/vibrator/enable 读 enable 文件表示获得剩余时间,写这个文件表示根据 # cat /sys/class/timed_output/vibrator/enable 3290 时间振动。
6
第一部百度文库 振动器系统结构和移植内容
JAVA 应用
Vibrator
VibratorService JAVA框架
VibratorService JNI
Vibrator
本地框架 内核 (libhardware _legacy.so)
振动器驱动
移植部分
Timed Output
7
第一部分 振动器系统结构和移植内容
谢谢!
17
12
2 上层的情况和注意事项
frameworks/base/services/jni/ 目录中 的 com_android_server_VibratorService.cpp 文件是 Vibrator 硬件抽象层的调用者,它同时也向 static JNINativeMethod method_table[] = { JAVA 提供 JNI 的支持。
第三部分 MSM 平台中的实现
MSM 的 mahimahi 平台中 Vibrator 的 实现是基于 Timed Output 驱动程序框架的 驱动程序,因此不需要再实现硬件抽象层。 Vibrator 的驱动程序在内核的 arch/arm/mach-msm/ 目录中的 msm_vibrator.c 文件中实现。
8
第二部分 移植和调试的要点
1 驱动程序 2 上层的情况和注意事项
9
1 驱动程序
Vibrator 的驱动程序只需要实现振动的 接口即可,这是一个输出设备,需要接受振动 时间作为参数。由于比较简单,因此 Vibrator 的驱动程序可以使用多种方式来实 现。 在 Android 中,推荐基于 Android 内 核定义 Timed Output 驱动程序框架来 实现 Vibrator 的驱动程序。 Timed Output 的含义为定时输出,用 于定时发出某个输出。实际上,这种驱动程序 依然是基于 sys 文件系统来完成的。
{ "vibratorOn", "(J)V", (void*)vibratorOn }, { "vibratorOff", "()V", (void*)vibratorOff } // 振动器开 // 振动器关 }; int register_android_server_VibratorService(JNIEnv *env) { return jniRegisterNativeMethods(env, "com/android/server/VibratorService", method_table, NELEM(method_table)); } static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms){ vibrator_on(timeout_ms); } static void vibratorOff(JNIEnv *env, jobject clazz){ vibrator_off(); } 13
15
第三部分 MSM 平台中的实现
pmic_vibrator 是一个 timed_output_dev 类型的设备。其 enable 函 数指针的实现 vibrator_enable 根据输入的数 值开始定时器,并通过向调度队列,进行输出操 作。 get_time 函数指针的实现 vibrator_get_time 则只是从定时器中获取剩 余时间。 这里之所以使用定时器加队列的方式,是因为 enable 的调用将形成一个持续时间的效果,但是 调用本身不宜阻塞,因此实现就让 vibrator_enable 函数退出后,通过定时器实 16 现效果。
5
第一部分 振动器系统结构和移植内容
3 、本地类 代码路径: frameworks/base/services/jni/com_android_server_VibratorService.cpp 这个类是振动器的 JNI 部分,通过调用硬件抽象层向上层提供接口。 4 、 JAVA 类 代码路径: frameworks/base/services/java/com/android/server/VibratorService.java frameworks/base/core/java/android/os/Vibrator.java VibratorService.java 通过调用, VibratorService JNI 来实现 com.android.server 包中的 VibratorService 类。这个类不是平台的 API ,被 Android 系统 JAVA 框架中的一些部分调用。 Vibrator.java 文件实现了 android.os 包中的 Vibrator 类,这是向 JAVA 层提供的 API 。
int vibrator_on(int timeout_ms); // 开始振动 int vibrator_off(); // 关闭振动
Timed Output 类型驱动本身有获得剩余时间的能力 (读 enable 文件),但是在 Android Vibrator 硬件 抽象层以上的各层接口,都没有使用这个功能。
振动器系统
1
振动器系统
第一部分 振动器系统结构和移植内容 第二部分 移植和调试的要点 第三部分 MSM 平台中的实现
2
第一部分 振动器系统结构和移植内容
振动器负责控制引动电话的振动功能, Android 中的振动器系统是一个专供这方面 的功能的小系统,提供根据时间振动的功能。 振动器系统包含了驱动程序、固定的硬 件抽象层、 JNI 部分、 JAVA 框架类等几个 部分,向 JAVA 应用程序层也提供了简单的 API 作为平台接口。
# echo "0" > /sys/class/timed_output/vibrator/enable
11
2 上层的情况和注意事项
Vibrator 硬件抽象层的接口在 hardware/libhardware_legacy/include/hardwar e_legacy/ 目录的 vibrator.h 文件中定义:
3
第一部分 振动器系统结构和移植内容
各种 Android应用
平台API
JAVA框架 Vibrator类,VibratorService 本地VibratorService JNI 硬件抽象层
本地框架 Android 系统 硬件 和驱动
振动器设备
4
第一部分 振动器系统结构和移植内容
自下而上, Android 的振动器系统分成了以下部分 1 、驱动程序:特定硬件平台振动器的驱动程序,通常基于 Timed Output 驱动框架实现 2 、硬件抽象层,光系统硬件抽象层接口路径为: 代码路径: hardware/libhardware_legacy/include/hardware_legacy/ vibrator.h 振动器系统的硬件抽象层在 Android 中已经具有默认实现,代码 路径为: 代码路径: hardware/libhardware_legacy/vibrator/vibrator.c 振动器的硬件抽象层通常并不需要重新实现,是 libhardware_legacy.so 的一部分。
14
第三部分 MSM 平台中的实现
static void set_pmic_vibrator(int on) { static struct msm_rpc_endpoint vib_endpoint; /* 定义 RPC 的端点 */ struct set_vib_on_off_req { struct rpc_request_hdr hdr; uint32_t data; } req; if (!vib_endpoint) { vib_endpoint = msm_rpc_connect(PM_LIBPROG, PM_LIBVERS, 0); /* ...... 省略部分内容 */ } if (on) req.data = cpu_to_be32(PMIC_VIBRATOR_LEVEL); /* 得到请求时间 */ else req.data = cpu_to_be32(0); msm_rpc_call(vib_endpoint, HTC_PROCEDURE_SET_VIB_ON_OFF, &req, sizeof(req), 5 * HZ); /* 进行 RPC 调用 */ }
10
1 驱动程序
drivers/staging/android/ 目录中 timed_output.h 中定义 timed_output_dev 结构体 ,其中包含 enable 和 get_time 这 2 个函数指针。 实现结构体后,使用 timed_output_dev_register() 和 timed_output_dev_unregister() 函数注册和注销 即可。 Timed Output 驱动程序框架将为每个设备 在 /sys/class/timed_output/ 目录中建立一个子目 录,设备子目录中的 enable 文件就是设备的控制文件。 # echo "10000" > /sys/class/timed_output/vibrator/enable 读 enable 文件表示获得剩余时间,写这个文件表示根据 # cat /sys/class/timed_output/vibrator/enable 3290 时间振动。
6
第一部百度文库 振动器系统结构和移植内容
JAVA 应用
Vibrator
VibratorService JAVA框架
VibratorService JNI
Vibrator
本地框架 内核 (libhardware _legacy.so)
振动器驱动
移植部分
Timed Output
7
第一部分 振动器系统结构和移植内容
谢谢!
17
12
2 上层的情况和注意事项
frameworks/base/services/jni/ 目录中 的 com_android_server_VibratorService.cpp 文件是 Vibrator 硬件抽象层的调用者,它同时也向 static JNINativeMethod method_table[] = { JAVA 提供 JNI 的支持。
第三部分 MSM 平台中的实现
MSM 的 mahimahi 平台中 Vibrator 的 实现是基于 Timed Output 驱动程序框架的 驱动程序,因此不需要再实现硬件抽象层。 Vibrator 的驱动程序在内核的 arch/arm/mach-msm/ 目录中的 msm_vibrator.c 文件中实现。
8
第二部分 移植和调试的要点
1 驱动程序 2 上层的情况和注意事项
9
1 驱动程序
Vibrator 的驱动程序只需要实现振动的 接口即可,这是一个输出设备,需要接受振动 时间作为参数。由于比较简单,因此 Vibrator 的驱动程序可以使用多种方式来实 现。 在 Android 中,推荐基于 Android 内 核定义 Timed Output 驱动程序框架来 实现 Vibrator 的驱动程序。 Timed Output 的含义为定时输出,用 于定时发出某个输出。实际上,这种驱动程序 依然是基于 sys 文件系统来完成的。
{ "vibratorOn", "(J)V", (void*)vibratorOn }, { "vibratorOff", "()V", (void*)vibratorOff } // 振动器开 // 振动器关 }; int register_android_server_VibratorService(JNIEnv *env) { return jniRegisterNativeMethods(env, "com/android/server/VibratorService", method_table, NELEM(method_table)); } static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms){ vibrator_on(timeout_ms); } static void vibratorOff(JNIEnv *env, jobject clazz){ vibrator_off(); } 13
15
第三部分 MSM 平台中的实现
pmic_vibrator 是一个 timed_output_dev 类型的设备。其 enable 函 数指针的实现 vibrator_enable 根据输入的数 值开始定时器,并通过向调度队列,进行输出操 作。 get_time 函数指针的实现 vibrator_get_time 则只是从定时器中获取剩 余时间。 这里之所以使用定时器加队列的方式,是因为 enable 的调用将形成一个持续时间的效果,但是 调用本身不宜阻塞,因此实现就让 vibrator_enable 函数退出后,通过定时器实 16 现效果。
5
第一部分 振动器系统结构和移植内容
3 、本地类 代码路径: frameworks/base/services/jni/com_android_server_VibratorService.cpp 这个类是振动器的 JNI 部分,通过调用硬件抽象层向上层提供接口。 4 、 JAVA 类 代码路径: frameworks/base/services/java/com/android/server/VibratorService.java frameworks/base/core/java/android/os/Vibrator.java VibratorService.java 通过调用, VibratorService JNI 来实现 com.android.server 包中的 VibratorService 类。这个类不是平台的 API ,被 Android 系统 JAVA 框架中的一些部分调用。 Vibrator.java 文件实现了 android.os 包中的 Vibrator 类,这是向 JAVA 层提供的 API 。
int vibrator_on(int timeout_ms); // 开始振动 int vibrator_off(); // 关闭振动
Timed Output 类型驱动本身有获得剩余时间的能力 (读 enable 文件),但是在 Android Vibrator 硬件 抽象层以上的各层接口,都没有使用这个功能。
振动器系统
1
振动器系统
第一部分 振动器系统结构和移植内容 第二部分 移植和调试的要点 第三部分 MSM 平台中的实现
2
第一部分 振动器系统结构和移植内容
振动器负责控制引动电话的振动功能, Android 中的振动器系统是一个专供这方面 的功能的小系统,提供根据时间振动的功能。 振动器系统包含了驱动程序、固定的硬 件抽象层、 JNI 部分、 JAVA 框架类等几个 部分,向 JAVA 应用程序层也提供了简单的 API 作为平台接口。