GPIO按键处理流程

这篇博客详细介绍了GPIO按键在Linux系统中的处理过程,包括Button设备的定义和注册、Button驱动的定义和注册,以及Linux中断与时钟的相关内容。在设备定义中,展示了如何使用GPIO_BUTTON宏创建设备,并在`loco_add_device_buttons`中进行注册。Button驱动的定义在`gpio_keys_device_driver`中,通过`platform_driver_register`进行注册,并在`gpio_keys_probe`中进行初始化。Linux中断方面,讨论了`request_irq`和`free_irq`的使用,以及如何利用`mod_timer`处理按键抖动。
摘要由CSDN通过智能技术生成

GPIO按键属于是系统的一种设备,挂载到platform总线上,其原理请参考Android学习之platform开发流程,以下直接介绍其在imx53qsb上的应用。

1       Button设备的定义和注册

1.1 Button设备的定义

Kernel-imx\arch\arm\mach-mx5\Mx53_loco.c#L690

#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake)      \

{                                                       \

       .gpio            = gpio_num,                          \

       .type             = EV_KEY,                      \

       .code           = ev_code,                       \

       .active_low = act_low,                        \

       .desc            = "btn " descr,                         \

       .wakeup             = wake,                                   \

}

 

static struct gpio_keys_button loco_buttons[] = {

       GPIO_BUTTON(MX53_nONKEY, KEY_POWER, 1, "power", 0),

       GPIO_BUTTON(USER_UI1, KEY_BACK, 1, "back", 0),

       //GPIO_BUTTON(USER_UI2, KEY_HOME, 1, "home", 0),   //edit by havery for menu key

       GPIO_BUTTON(USER_UI2, KEY_HOME, 1, "menu", 0),   //key 与。code有关,与。desc无关

};

static struct gpio_keys_platform_data loco_button_data = {

       .buttons       = loco_buttons,

       .nbuttons    = ARRAY_SIZE(loco_buttons),

};

 

static struct platform_device loco_button_device = {

       .name          = "gpio-keys",

       .id          = -1,

       .num_resources  = 0,

       .dev              = {

              .platform_data = &loco_button_data,

       }

};

1.2 Button设备的注册

Kernel-imx\arch\arm\mach-mx5\Mx53_loco.c#L713

static void __init loco_add_device_buttons(void)

{

       platform_device_register(&loco_button_device);

}

loco_add_device_buttons()其在mxc_board_init()调用。

2       Button 驱动的定义和注册

2.1 Button驱动的定义

Kernel-imx\drivers\input\keyboard\Gpio_keys.c#L589

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

       }

};

2.2 Button驱动的注册

Kernel-imx\drivers\input\keyboard\Gpio_keys.c#L601

static int __init gpio_keys_init(void)

{

       return platform_driver_register(&gpio_keys_device_driver);

}

module_init(gpio_keys_init);

 

platform_driver_register之后,将调用.probe函数:

Kernel-imx\drivers\input\keyboard\Gpio_keys.c#L417

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;

       struct device *dev = &pdev->dev;

       struct input_dev *input;

       int i, error;

       int wakeup = 0;

 

       ddata = kzalloc(sizeof(struct gpio_keys_drvdata) +

                     pdata->nbuttons * sizeof(struct gpio_button_data),

                     GFP_KERNEL);

       input = input_allocate_device();

       if (!ddata || !input) {

              dev_err(dev, "failed to allocate state\n");

              error = -ENOMEM;

              goto fail1;

       }

 

       ddata->input = input;

       ddata->n_buttons = pdata->nbuttons;

       mutex_init(&ddata->disable_lock);</

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值