技术开发 频道

Android如何实现振动器的移植与开发

  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)
{
    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
相关文章