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

更多相关文章

  1. Android培训班(103)内核入口汇编3
  2. Android(安卓)FrameWork——Binder机制详解(1)
  3. Android(安卓)获取WebView的高度
  4. 【Android】AsyncTask机制
  5. OpenCore代码阅读--PVPlayer的实现
  6. Android(安卓)Camera框架
  7. Android(安卓)- 如何判断当前线程是否是主线程
  8. AudioTrack使用示例
  9. android中使用 定时更新界面定时器Timer的使用

随机推荐

  1. 如何开启phpstudy中的gd库
  2. php中如何使用websocket(聊天室实例详解)
  3. php中如何在数组指定位置插入数据单元
  4. ubuntu多版本php切换
  5. html是如何与php进行数据交互的
  6. 在树莓派上搭建LNMP环境
  7. PHP 如何上传文件和下载
  8. Asf PHP开发之配置信息常驻系统内存
  9. 用PHP实现一个简易版文件上传功能(超详细
  10. php中如何响应button的onclick事件