linux按键驱动程序示例
时间: 2023-07-20 14:19:54 浏览: 59
以下是一个简单的Linux按键驱动程序示例:
```c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/input.h>
#define KEY_GPIO 17
static irqreturn_t key_isr(int irq, void *dev_id)
{
static struct input_dev *key_dev = NULL;
int val = gpio_get_value(KEY_GPIO);
if (!key_dev)
return IRQ_HANDLED;
input_report_key(key_dev, KEY_ENTER, !val);
input_sync(key_dev);
return IRQ_HANDLED;
}
static int __init key_init(void)
{
int ret;
ret = gpio_request(KEY_GPIO, "key");
if (ret < 0) {
printk(KERN_ERR "Failed to request GPIO\n");
return ret;
}
gpio_direction_input(KEY_GPIO);
ret = gpio_to_irq(KEY_GPIO);
if (ret < 0) {
printk(KERN_ERR "Failed to get IRQ\n");
goto err_free_gpio;
}
ret = request_irq(ret, key_isr, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
"key_irq", NULL);
if (ret < 0) {
printk(KERN_ERR "Failed to request IRQ\n");
goto err_free_gpio;
}
printk(KERN_INFO "Key driver initialized\n");
return 0;
err_free_gpio:
gpio_free(KEY_GPIO);
return ret;
}
static void __exit key_exit(void)
{
free_irq(gpio_to_irq(KEY_GPIO), NULL);
gpio_free(KEY_GPIO);
printk(KERN_INFO "Key driver exited\n");
}
module_init(key_init);
module_exit(key_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Simple key driver");
```
该驱动程序使用GPIO 17作为按键输入引脚,并在按键被按下或释放时报告键值。它还创建了一个输入设备并将键值报告给该设备。在 `key_isr()` 中,该驱动程序获取按键的值并使用 `input_report_key()` 报告键值,然后使用 `input_sync()` 同步输入设备。在 `key_init()` 中,该驱动程序请求GPIO并IRQ,并在IRQ触发时调用 `key_isr()`。在 `key_exit()` 中,该驱动程序释放GPIO和IRQ。