(本文所有内容全部在linux-2.6.36内核基础上进行)
学习SoC留下的习惯,从基本IO入手。如果自己动手写字符驱动就违背了linux的platform device and driver 的精神,如果自己写我又没那水平,就从内核自带的gpio_keys驱动入手,了解输入子系统的应用。
Gpio输入子系统的初始化和注销是从platform_driver_register(&gpio_keys_device_driver)和platform_driver_unregister(&gpio_keys_device_driver)实现的:
/drivers/input/keyboard/gpio_key.c(line632-line643)
static int __init gpio_keys_init(void)
{
return platform_driver_register(&gpio_keys_device_driver);
}
static void __exit gpio_keys_exit(void)
{
platform_driver_unregister(&gpio_keys_device_driver);
}
module_init(gpio_keys_init);
module_exit(gpio_keys_exit);
在看到正文之前再看看struct platform_driver的设定:
static struct platform_driver gpio_keys_device_driver = {
.probe = gpio_keys_probe,
.remove = __devexit_p(gpio_keys_remove),
.driver = {
.name = "gpio-keys",
.owner = THIS_MODULE,
#ifdef CONFIG_PM
.pm = &gpio_keys_pm_ops,
#endif
}
};
从上面struct platform_driver可以看出来:
probe是从static int __devinit gpio_keys_probe(struct platform_device *pdev)函数开始的;
remove函数是从static int __devexit gpio_keys_remove(struct platform_device *pdev)函数开始的;
__devexit_p 的定义:#define __devexit_p(x) x
下面进入正题, gpio_keys_probe函数
static int __devinit gpio_keys_probe(struct platform_device *pdev)
{
struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
struct gpio_keys_drvdata *ddata;