linux下矩阵键盘驱动

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;
}
这里的中断服务程序是消抖的作用。



你可能感兴趣的:(内核,linux)