您所在的位置:设计开发 > Java系列 > 23.3 MSM中的实现
《Android系统级深入开发--移植与调试》第23章 振动器系统,本章介绍振动器在Android较小系统的移植。本节为大家介绍MSM中的实现。
AD:
23.3 MSM中的实现
MSM的mahimahi平台中Vibrator实现是基于Timed Output驱动程序框架的驱动程序,因此不需要再实现硬件抽象层。
Vibrator的驱动程序在内核的arch/arm/mach-msm/目录中的msm_vibrator.c文件中实现。
msm_vibrator.c中的核心实现是set_pmic_vibrator()函数,其实现内容如下所示:
- static void set_pmic_vibrator(int on)
- {} req;
- if (!vib_endpoint) {}
- 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调用 */
- }
set_pmic_vibrator()函数通过MSM系统的远程过程调用(RPC)实现了具体的功能,调用的指令由HTC_PROCEDURE_SET_VIB_ON_OFF指定。
这个驱动程序的初始化过程如下所示:
- void __init msm_init_pmic_vibrator(void)
- {}
vibrator_work为work_struct类型,在队列的执行函数update_vibrator中,调用set_pmic_vibrator()函数。
pmic_vibrator是一个timed_output_dev类型的设备。其enable函数指针的实现vibrator_enable根据输入的数值开始定时器,并通过向调度队列进行输出操作。get_time函数指针的实现vibrator_get_time则只是从定时器中获取剩余时间。
这里之所以使用定时器加队列的方式,是因为enable的调用将形成一个持续时间的效果,但是调用本身不宜阻塞,因此实现就让vibrator_enable函数退出后,通过定时器实现效果。
| 回书目 上一节 |