

1 #include <linux/module.h> 2 #include <linux/init.h> 3 4 //#include <linux/kernel.h> 5 //#include <linux/fs.h> 6 #include <linux/interrupt.h> 7 #include <linux/irq.h> 8 //#include <linux/sched.h> 9 //#include <linux/pm.h> 10 //#include <linux/slab.h> 11 //#include <linux/sysctl.h> 12 //#include <linux/proc_fs.h> 13 //#include <linux/delay.h> 14 //#include <linux/platform_device.h> 15 #include <linux/input.h> 16 //#include <linux/workqueue.h> 17 18 #include <linux/gpio.h> 19 #include <plat/gpio-cfg.h> 20 21 22 struct pin_desc{ 23 int irq; 24 char *name; 25 unsigned int pin; 26 unsigned int key_val; 27 }; 28 29 struct pin_desc pins_desc[4] = { 30 {IRQ_EINT(9), "K1", EXYNOS4_GPX1(1), KEY_L}, 31 {IRQ_EINT(10), "K2", EXYNOS4_GPX1(2), KEY_S}, 32 {IRQ_EINT(16), "K3", EXYNOS4_GPX2(0), KEY_ENTER}, 33 {IRQ_EINT(17), "K4", EXYNOS4_GPX2(1), KEY_LEFTSHIFT}, 34 }; 35 36 37 static struct input_dev *key_dev; 38 static struct pin_desc *irq_pd; 39 static struct timer_list buttons_timer; 40 41 42 43 static irqreturn_t buttons_irq(int irq, void *dev_id) 44 { 45 irq_pd = (struct pin_desc *)dev_id; 46 //input_event(key_dev, EV_KEY, irq_pd->key_val, 1); 47 //input_sync(key_dev); 48 //input_event(key_dev, EV_KEY, irq_pd->key_val, 0); 49 //input_sync(key_dev); 50 51 mod_timer(&buttons_timer, jiffies+HZ/100); 52 return IRQ_RETVAL(IRQ_HANDLED); 53 } 54 55 static void buttons_timer_function(unsigned long data) 56 { 57 struct pin_desc * pindesc = irq_pd; 58 unsigned int pinval; 59 60 if (!pindesc) 61 return; 62 63 pinval = gpio_get_value(pindesc->pin); 64 65 if (pinval) 66 { 67 /* 松开 : 最后一个参数: 0-松开, 1-按下 */ 68 input_event(key_dev, EV_KEY, irq_pd->key_val, 0); 69 input_sync(key_dev); 70 } 71 else 72 { 73 /* 按下 */ 74 input_event(key_dev, EV_KEY, irq_pd->key_val, 1); 75 input_sync(key_dev); 76 77 } 78 } 79 80 81 static int __init key_input_init(void) 82 { 83 int i; 84 int ret; 85 printk("hello wsz\n"); 86 key_dev = input_allocate_device(); 87 if(!key_dev) 88 { 89 printk("key_dev allocate fail\n"); 90 return -ENOMEM; 91 } 92 93 set_bit(EV_KEY, key_dev->evbit); 94 /*能产生这类事件的哪些具体事件*/ 95 set_bit(KEY_L, key_dev->keybit); 96 set_bit(KEY_S, key_dev->keybit); 97 set_bit(KEY_ENTER, key_dev->keybit); 98 set_bit(KEY_LEFTSHIFT, key_dev->keybit); 99 100 ret = input_register_device(key_dev); 101 if(ret) 102 { 103 printk("request_irq faild\n"); 104 return ret; 105 } 106 107 /* 4. 硬件相关的操作 */ 108 init_timer(&buttons_timer); 109 buttons_timer.function = buttons_timer_function; 110 add_timer(&buttons_timer); 111 112 for (i = 0; i < 4; i++) 113 { 114 s3c_gpio_setpull(pins_desc[i].pin, S3C_GPIO_PULL_NONE); 115 ret = request_irq(pins_desc[i].irq, buttons_irq, IRQ_TYPE_EDGE_BOTH, pins_desc[i].name, &pins_desc[i]); 116 if(ret) 117 { 118 printk("request_irq faild\n"); 119 return ret; 120 } 121 } 122 return 0; 123 } 124 125 static void __exit key_input_exit(void) 126 { 127 int i; 128 for (i = 0; i < 4; i++) 129 { 130 free_irq(pins_desc[i].irq, &pins_desc[i]); 131 } 132 133 del_timer(&buttons_timer); 134 input_unregister_device(key_dev); 135 input_free_device(key_dev); 136 } 137 138 139 module_init(key_input_init); 140 module_exit(key_input_exit); 141 142 MODULE_LICENSE("GPL");
gpio_keys.c解析
https://blog.youkuaiyun.com/woshidahuaidan2011/article/details/51695147