1_>路径:linux\drivers\input\keyboard
2_>文件名:matrix_keypad.c
说明:这是一个平台驱动程序,在上面的.c文件里没有建一个设备,只有驱动
static struct platform_driver matrix_keypad_driver = {
.probe= matrix_keypad_probe,
.remove= __devexit_p(matrix_keypad_remove),
.suspend= matrix_keypad_suspend,
.resume= matrix_keypad_resume,
.driver= {
.name= "matrix-keypad",
.owner= THIS_MODULE,
},
};首先在init函数里边要注册上面的驱动结构体。当然在这之前,就是我们需要在编译下载内核到开发板以前,需要在例如mach-mini2440.c这样的文件添加代表矩阵键盘的platform_device结构体。
3_>probe探测函数
一个重要思想,我们需要使用input子系统实现这个矩阵键盘,与其他方法的主要不同便是当我们按一次键时,接受包是一个input子系统的,其中按的哪一个键就藏在这个结构体的某一个成员里边。
当然一般都是填充input结构体,然后给input申请中断服务程序matrix_keypad_interrupt,一旦我们按键,就会跳到中断服务程序。
static irqreturn_t matrix_keypad_interrupt(int irq, void *id)
{
struct matrix_keypad *keypad = id;
unsigned long flags;
spin_lock_irqsave(&keypad->lock, flags);
/*
* See if another IRQ beaten us to it and scheduled the
* scan already. In that case we should not try to
* disable IRQs again.
*/
if (unlikely(keypad->scan_pending || keypad->stopped))
goto out;
disable_row_irqs(keypad);
keypad->scan_pending = true;
schedule_delayed_work(&keypad->work,
msecs_to_jiffies(keypad->pdata->debounce_ms));
out:
spin_unlock_irqrestore(&keypad->lock, flags);
return IRQ_HANDLED;
}这里的中断服务程序是消抖的作用。