- 論壇徽章:
- 0
|
本帖最后由 牡丹巖 于 2014-08-28 13:30 編輯
這是我的bug代碼,不是每次insmod都會(huì)出錯(cuò)的,問(wèn)題真心難找,麻煩各位大仙看看!謝過(guò)~- [size=6][size=5][code]
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/input.h>
- #include <linux/interrupt.h>
- #include <asm/gpio.h>
- #include <linux/timer.h>
- static struct input_dev *p_button_dev = NULL;//定義輸入設(shè)備
- struct timer_list my_timer;//定義定時(shí)器
- //定義定時(shí)器超時(shí)處理函數(shù)
- void timer_func(unsigned long data)
- {
- int key_value = gpio_get_value(S5PV210_GPH2(0));
- //上報(bào)事件給input核心層
- input_report_key(p_button_dev, KEY_A, !key_value);//按下為1,釋放為0
- //告訴input子系統(tǒng)上報(bào)已經(jīng)完成
- input_sync(p_button_dev);
- }
- //中斷處理函數(shù)
- static irqreturn_t button_interrupt(int irq, void *dev_id)
- {
- mod_timer(&my_timer, jiffies + 5);//啟動(dòng)定時(shí)器以及設(shè)置超時(shí)時(shí)間
-
- return IRQ_HANDLED;
- }
- //初始化按鈕
- static int __init button_init(void)
- {
- int ret;
- ret = gpio_request(S5PV210_GPH2(0), "key2");
- if (ret)
- {
- printk(KERN_ERR "gpio_request Failed to register device\r\n");
- goto error1;
- }
-
- //為新輸入設(shè)備分配內(nèi)存并初始化
- p_button_dev = input_allocate_device();
- if (!p_button_dev)
- {
- printk(KERN_ERR "can't allocate input mem!\r\n");
- goto error2;
- }
-
- p_button_dev->name = "gec_input";
- p_button_dev->id.bustype = 0x1;
- p_button_dev->id.product = 0x2;
- p_button_dev->id.vendor = 0x3;
- p_button_dev->id.version = 0x4;
- p_button_dev->evbit[BIT_WORD(EV_KEY)] = BIT_MASK(EV_KEY);
- p_button_dev->keybit[BIT_WORD(KEY_A)] = BIT_MASK(KEY_A);
- //注冊(cè)一個(gè)輸入設(shè)備
- ret = input_register_device(p_button_dev);
- if (ret)
- {
- printk(KERN_ERR "Failed to register device\r\n");
- goto error3;
- }
-
- //申請(qǐng)中斷注冊(cè)中斷處理函數(shù)
- ret = request_irq(IRQ_EINT(16), button_interrupt,
- IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | IRQF_DISABLED,
- "button", NULL);
- if (ret)
- {
- printk(KERN_ERR "Can't request irq %d\r\n", IRQ_EINT(16));
- goto error4;
- }
-
- //定時(shí)器
- init_timer(&my_timer);//初始化定時(shí)器
- my_timer.function = timer_func;//注冊(cè)定時(shí)器超時(shí)處理函數(shù)
- return 0;
-
- error4:
- free_irq(IRQ_EINT(16), NULL);//釋放分配給已定中斷的內(nèi)存
- input_unregister_device(p_button_dev);
-
- error3:
- input_free_device(p_button_dev);
- error2:
- ret = -ENOMEM;
- error1:
- gpio_free(S5PV210_GPH2(0));
-
- return ret;
- }
- static void __exit button_exit(void)
- {
- gpio_free(S5PV210_GPH2(0));
- free_irq(IRQ_EINT(16), NULL);
- input_unregister_device(p_button_dev);
- del_timer(&my_timer);//刪除內(nèi)核定時(shí)器
- }
- module_init(button_init);
- module_exit(button_exit);
- MODULE_LICENSE("Dual BSD/GPL");
- MODULE_LICENSE("GPL");
復(fù)制代碼 [/code] |
|