Linux 按键驱动程序编写指南:简单示例和最佳实践
由于按键驱动程序需要与硬件交互,且不同的硬件平台实现方式不同,因此编写一个通用的 Linux 系统的按键驱动程序是很困难的。下面是一个简单的示例程序,仅供参考。
- 定义按键设备结构体
struct key_device {
struct input_dev *input;
int gpio;
};
- 初始化按键设备
static int key_init(struct key_device *dev)
{
int ret;
dev->input = input_allocate_device();
if (!dev->input) {
printk(KERN_ERR "Failed to allocate input device\n");
return -ENOMEM;
}
dev->input->name = "key_device";
dev->input->phys = "key_device/input0";
dev->input->id.bustype = BUS_HOST;
dev->input->id.vendor = 0x0001;
dev->input->id.product = 0x0001;
dev->input->id.version = 0x0100;
input_set_capability(dev->input, EV_KEY, KEY_POWER);
ret = input_register_device(dev->input);
if (ret) {
printk(KERN_ERR "Failed to register input device\n");
input_free_device(dev->input);
return ret;
}
return 0;
}
- 处理按键事件
static irqreturn_t key_interrupt(int irq, void *dev_id)
{
struct key_device *dev = dev_id;
if (gpio_get_value(dev->gpio)) {
input_report_key(dev->input, KEY_POWER, 1);
input_sync(dev->input);
} else {
input_report_key(dev->input, KEY_POWER, 0);
input_sync(dev->input);
}
return IRQ_HANDLED;
}
- 注册按键中断
static int key_probe(struct platform_device *pdev)
{
struct key_device *dev;
int ret;
dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
if (!dev)
return -ENOMEM;
dev->gpio = platform_get_irq(pdev, 0);
if (dev->gpio < 0)
return dev->gpio;
ret = devm_gpio_request_one(&pdev->dev, dev->gpio, GPIOF_IN, "key_device");
if (ret)
return ret;
ret = devm_request_irq(&pdev->dev, dev->gpio, key_interrupt, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "key_device", dev);
if (ret)
return ret;
ret = key_init(dev);
if (ret)
return ret;
platform_set_drvdata(pdev, dev);
return 0;
}
static int key_remove(struct platform_device *pdev)
{
struct key_device *dev = platform_get_drvdata(pdev);
input_unregister_device(dev->input);
input_free_device(dev->input);
return 0;
}
static struct platform_driver key_driver = {
.driver = {
.name = "key_device",
},
.probe = key_probe,
.remove = key_remove,
};
module_platform_driver(key_driver);
以上是一个简单的示例程序,它注册了一个按键设备,并处理按键事件。在实际开发中,需要根据硬件平台和具体需求进行适当的修改和扩展。
原文地址: https://www.cveoy.top/t/topic/nc98 著作权归作者所有。请勿转载和采集!