技术开发 频道

如何在MSM中实现Android震动系统

  【IT168技术】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)

  {

  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调用 */

  }

  set_pmic_vibrator()函数通过MSM系统的远程过程调用(RPC)实现了具体的功能,调用的指令由HTC_PROCEDURE_SET_VIB_ON_OFF指定。

  这个驱动程序的初始化过程如下所示:

  void __init msm_init_pmic_vibrator(void)

  {

  INIT_WORK(&vibrator_work, update_vibrator); /* 建立消息队列 */

  spin_lock_init(&vibe_lock);

  vibe_state = 0;

  hrtimer_init(&vibe_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); /* 定时器 */

  vibe_timer.function = vibrator_timer_func;

  timed_output_dev_register(&pmic_vibrator); /* 注册timed_output_dev设备 */

  }

  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函数退出后,通过定时器实现效果。

0
相关文章