按鍵中斷

free_irq(IRQ_EINT17 , 3);數組

  free_irq(IRQ_EINT219, 4);函數

  參數爲中斷號和ID事件

  return 0;get

}it

 

內核有個函數爲:io

int up = s3c2410_gpio_getpin(button_irqs->pin);讀取event

 

 

用switch寫太麻煩,能夠用結構體。file

struct pin_desc{}程序

{static

  unsigned int pin;

  unsigned int key_val;

}

/*鍵值:按下爲0x01,0x02,0x03,0x04/

/*鬆開時,爲0x81,0x82,0x83,0x84*/

 

static unsigned char key_val;

 

static DEVLARE_WAIT_QUEUE_HEAD(button_waitq);

中斷事件標誌,中斷服務程序將它置1,third_drv_read將它清0

static volatile int ev_press = 0;

 

struct pin_desc pins_desc[4] = {

  {S3C2410_GPF0 ,  0X01},

  {S3C2410_GPF2 ,  0X02},

  {S3C2410_GPG3 ,  0X03},

  {S3C2410_GPG11 , 0X04},

};

怎樣調用這個數組?

  在open函數中將值傳入id!

 

 

處理函數:根據ID來判斷哪一個按鍵形成的中斷!

static irqreturn_t buttons_irq(int irq , void *dev_id)    irq貌似爲中斷號

{

  struct pin_desc *pindesc = (struct pin_desc *)dev_id;

  unsigned int pinval;

  pinval = s3c2410_gpio_getpin(pindesc->pi);

 

  if(pinval)

  {

    key_val = 0x80 | pindesc->key_val;

    /*鬆開*/

  }

  else

  {

    /*按下*/

  }

  ev_press = 1;

  wake_up_interruptible(&button_waitq);

 

  return IRQ_HANDLED;

 

 

ssize_t  third_drv_read(struct  file  *file,  char  __user  *buf,  size_t  size,  loff_t  *ppos)

{

  /*若是沒有按鍵動做發生就休眠!!!即讓出CPU,不返回值!

  若按鍵按下就返回值!

  */

  

  wait_event_interruptible(button_waitq,ev_press);

  當ev_press = 0 ,他就會休眠。不等於0,往下運行。

  copy_to_user(buf,key_val,1);

  ev_press = 0;

 

  return 0;

}

相關文章
相關標籤/搜索