7th_drv.c

来源:互联网 发布:辐射4 mac 下载 编辑:程序博客网 时间:2024/06/15 02:25
 7th_drv.c
驱动层:
 static struct timer_list buttons_timer;

 static struct pin_desc *irq_pd;

/*
  * 确定按键值
  */
static irqreturn_t buttons_irq(int irq, void *dev_id)
{
/* 10ms后启动定时器 */
irq_pd = (struct pin_desc *)dev_id;
mod_timer(&buttons_timer, jiffies+HZ/100);    
return IRQ_RETVAL(IRQ_HANDLED);
}

static void buttons_timer_function(unsigned long data)
{
struct pin_desc * pindesc = irq_pd;
unsigned int pinval;

if (!pindesc)
return;

pinval = s3c2410_gpio_getpin(pindesc->pin);

if (pinval)
{
/* 松开 */
key_val = 0x80 | pindesc->key_val;
}
else
{
/* 按下 */
key_val = pindesc->key_val;
}

    ev_press = 1;                  /* 表示中断发生了 */
    wake_up_interruptible(&button_waitq);   /* 唤醒休眠的进程 */

kill_fasync (&button_async, SIGIO, POLL_IN);
}

static int sixth_drv_init(void)
{
init_timer(&buttons_timer);
buttons_timer.function = buttons_timer_function;
//buttons_timer.expires  = 0;  //它初始化的溢出值为0,当add_timer()一使用就会进入定时器函数
add_timer(&buttons_timer);     //由于通过pindesc判断过,所以不会进行错误判断
....       //只有当按键按下时,进入中断程序irq_button中,将定时器时间
}       //修改延时10ms后,再进入定时器函数中。
0 0
原创粉丝点击