1 Linux自带按键驱动程序源码
在Linux内核中也集成了按键的驱动程序,要使用的话,需要在内核中进行配置,按照下面路径找到相应的配置:
Device Drivers --->
Input device support --->
[*] Keyboards --->
<*> GPIO Buttons
选中“GPIO Buttons”选项,这样驱动程序就会编译进 Linux 内核中,如图 1.1所示:
保存退出后,在.congfig文件下会出现“CONFIG_KEYBOARD_GPIO=y”。
Linux内核中自带的按键驱动程序路径drivers/input/keyboard/gpio_keys.c,按键驱动程序基于platform框架,使用input子系统实现功能。
gpio_keys.c文件部分代码如下:
673 static const struct of_device_id gpio_keys_of_match[] = {
674 {
.compatible = "gpio-keys", },
675 {
},
676 };
......
842 static struct platform_driver gpio_keys_device_driver = {
843 .probe = gpio_keys_probe,
844 .remove = gpio_keys_remove,
845 .driver = {
846 .name = "gpio-keys",
847 .pm = &gpio_keys_pm_ops,
848 .of_match_table = of_match_ptr(gpio_keys_of_match),
849 }
850 };
851
852 static int __init gpio_keys_init(void)
853 {
854 return platform_driver_register(&gpio_keys_device_driver);
855 }
856
857 static void __exit gpio_keys_exit(void)
858 {
859 platform_driver_unregister(&gpio_keys_device_driver);
860 }
从上面代码可以看出,这是一个典型的platform框架结构,当和设备匹配成功后gpio_keys_probe函数就会执行,来看一下gpio_keys_probe函数中实现什么:
689 static int gpio_keys_probe(struct platform_device *pdev)
690 {
691 struct device *dev = &pdev->dev;
692 const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
693 struct gpio_keys_drvdata *ddata;
694 struct input_dev *input;
695 size_t size;
696 int i, error;
697 int wakeup = 0;
698