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;
}