由于按键驱动程序需要与硬件交互,且不同的硬件平台实现方式不同,因此编写一个通用的 Linux 系统的按键驱动程序是很困难的。下面是一个简单的示例程序,仅供参考。

  1. 定义按键设备结构体
struct key_device {
    struct input_dev *input;
    int gpio;
};
  1. 初始化按键设备
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;
}
  1. 处理按键事件
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;
}
  1. 注册按键中断
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);

以上是一个简单的示例程序,它注册了一个按键设备,并处理按键事件。在实际开发中,需要根据硬件平台和具体需求进行适当的修改和扩展。

Linux 按键驱动程序编写指南:简单示例和最佳实践

原文地址: https://www.cveoy.top/t/topic/nc98 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录