首页 > 其他 > 详细

keypad代码分析

时间:2014-03-07 05:55:42      阅读:581      评论:0      收藏:0      [点我收藏+]

keypad作为input设备注册到内核,与platform总线驱动match。

1、描述一个输入设备对象

1 static struct input_dev *kpd_input_dev;

告知输入子系统 kpd_input_dev 是一个input设备。

2、注册platform总线驱动

r = platform_driver_register(&kpd_pdrv);

 继续看kpd_pdrv有哪些信息:

bubuko.com,布布扣
 1 static struct platform_driver kpd_pdrv = {
 2     .probe        = kpd_pdrv_probe,
 3     .remove        = kpd_pdrv_remove,
 4 #ifndef CONFIG_HAS_EARLYSUSPEND    
 5     .suspend    = kpd_pdrv_suspend,
 6     .resume        = kpd_pdrv_resume,
 7 #endif    
 8     .driver        = {
 9         .name    = KPD_NAME,
10         .owner    = THIS_MODULE,
11     },
12 };
bubuko.com,布布扣

先关注probe这个重要角色,继续看kpd_pdrv_probe里做了哪些工作:

bubuko.com,布布扣
 1 static int kpd_pdrv_probe(struct platform_device *pdev)
 2 {
 3     
 4     int i, r;
 5     int err = 0;
 6         kpd_input_dev = input_allocate_device(); //初始化input设备 kpd_input_dev,通知输入子系统有新设备加入。
 7     if (!kpd_input_dev)
 8         return -ENOMEM;
 9     kpd_input_dev->name = KPD_NAME;              //设备名
10     kpd_input_dev->id.bustype = BUS_HOST;
11     kpd_input_dev->id.vendor = 0x2454;
12     kpd_input_dev->id.product = 0x6572;
13     kpd_input_dev->id.version = 0x0010;
14     kpd_input_dev->open = kpd_open;
15 
16     __set_bit(EV_KEY, kpd_input_dev->evbit);//设置input设备kpd_input_dev支持的设备类型:按键事件型
bubuko.com,布布扣
bubuko.com,布布扣
 1     kpd_input_dev->dev.parent = &pdev->dev;   //
 2     r = input_register_device(kpd_input_dev);  //完成上述工作后,便可以注册输入设备,通知事件处理层当有满足条件的事件发生时调用相应的函数
 3     if (r) {
 4         printk(KPD_SAY "register input device failed (%d)\n", r);
 5         input_free_device(kpd_input_dev);
 6         return r;
 7     }
bubuko.com,布布扣
bubuko.com,布布扣
1     /* register misc device (/dev/mtk-kpd) */
2     kpd_dev.parent = &pdev->dev;
3     r = misc_register(&kpd_dev); //注册kpd_dev这个混杂设备
4     if (r) {
5         printk(KPD_SAY "register device failed (%d)\n", r);
6         input_unregister_device(kpd_input_dev);
7         return r;
8     }
bubuko.com,布布扣
bubuko.com,布布扣
1     /* register IRQ and EINT */
2     kpd_set_debounce(KPD_KEY_DEBOUNCE);
3     r = request_irq(MT_KP_IRQ_ID, kpd_irq_handler, IRQF_TRIGGER_FALLING, KPD_NAME, NULL); //注册中断出发条件,中断号,中断函数
4     if (r) {
5         printk(KPD_SAY "register IRQ failed (%d)\n", r);
6         misc_deregister(&kpd_dev);                 //如果中断注册不成功,需卸载掉混杂设备kpd_dev的注册
7         input_unregister_device(kpd_input_dev);    //同样,也也需卸载掉input设备的注册
8         return r;
9     }
bubuko.com,布布扣
1     hrtimer_init(&aee_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
2     aee_timer.function = aee_timer_func;

 

1     if((err = kpd_create_attr(&kpd_pdrv.driver)))
2     {
3         kpd_print("create attr file fail\n");
4         kpd_delete_attr(&kpd_pdrv.driver);
5         return err;
6     }

keypad代码分析,布布扣,bubuko.com

keypad代码分析

原文:http://www.cnblogs.com/haimeng2010/p/3584914.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!