????3.3 ?ж???????
/*???????ж???ж????????????*/
static int request irqs(void)
{
struct key info *k;
int i;
for (i= 0; i < sizeof(key info tab) / sizeof(key info tab [1]); i++)
{
k = key info tab + i;
set external irq (k->irq no?? EXT LOWLEVEL?? GPIO PULLUP DIS);
//???????????
if   (request irq (k->irq no??  &buttons irq??  SA INTERRUPT??
DEVICE NAME??
i))  //?????ж???? ?????????????????ж???????
{
return  - 1;
}
}
return 0;
}
????3.4 ?ж???????
????/*????ж?*/
????static void free irqs(void)
????{
????struct key info *k;
????int i;
????for (i= 0; i < sizeof(key info tab) / sizeof(key info tab [1]); i++)
????{
????k = key info tab + i;
????free irq (k->irq no?? buttons irq); //????ж?
????}
????}
????4 ?????豸?????ж?????????????
???????????????????????ж?????ж????????У?????????ж????????????????????????ж?????????ж???????е????
????4.1 ?ж???????
????static void s3c2410 eint key (int irq?? void *dev id?? struct pt regs
????*reg)
????{
????int key = dev id;
????disable irq (key info tab [key].irq no); //???ж??????? ?
????keydev.keyStatus[key] = KEYSTATUS DOWNX;//???????
????_
????key timer [key].expires == jiffies + KEY TIMER DELAY1;//???
????add timer (&key timer[key]); //????????
????}
????4.2 ?????????????
????????????????e????????????????????????????????????μ???μ????????????б????????????????
//?????豸?????????????????
static void key timer handler (unsigned long data)
{
int key = data;
if (ISKEY DOWN (key))
{
if (keydev.keyStatus[key] == KEYSTATUS DOWNX)
//???ж????
{
keydev .keyStatus[key] = KEYSTATUS DOWN;
key timer[key].expires == jiffies + KEY TIMER DELAY; //???
keyEvent ();  //??????????????????
add timer(&key timer [key]);
}
else
{
key timer[key].expires == jiffies + KEY TIMER DELAY; //???
add timer(&key timer [key]);
}
}
else       //???????
{
keydev.keyStatus[key] = KEYSTATUS UP;
enable irq (key info tab [key].irq no);
}
????5 ??????????
?????????????????keydev.head??keydev.tail???а?????????????keyEvent??????????豸??????????????????£?
static int s3c2410 key open (struct inode *inode?? struct file *filp)
{
keydev .head = keydev .tail = 0; //??? ????????????
keyEvent = keyEvent raw; //?????????? ?????????keyEvent raw
return 0;
}
static int s3c2410 key release (struct inode *inode?? struct file *filp)
{
keyEvent = keyEvent dummy; //??????????????
return 0??
}
????6 ??????
???????????????????????豸???建??????????????????????keydev.head != keydev.tail??????????????????????copy_to_user()??????????????????????????????????????????????????????????????
????????????????а??????棬??????- EAGAIN??
??????????????keydev.wq?????????????????а?????? ???????????????
//?????豸???????????
static ssize t s3c2410 key read (struct file *filp??char *buf??ssize tcount?? loff t*ppos)
{
retry: if (keydev.head != keydev .tail)
//??????????????????
{
key ret = keyRead (); //???????
copy to user(..); //?????????????????????
}
else
{
if (filp->f flags &O NONBLOCK)
//????????÷???????????
{
return  - EAGAIN;
}
interruptible sleep on (&(keydev .wq));
//???????????????????????ú???????????
goto retry;
}
return 0;
}