#include <linux/init.h>
3 #include <linux/module.h>
4 #include <linux/interrupt.h>
5 #include <linux/gpio.h>
6 #include <mach/gpio.h>
7 #include <linux/ktime.h>
8
9 #define IR_IO GPIOL(11)
10
11 int num = 0; //记录第几位数据
12 int times[80]; //记录第几位数据所占用的时间 us
13
14 void process()
15 {
16 int i, j, t;
17
18 for (i = 0; i < 4; i++)
19 {
20 t = 0;
21 for (j = 0; j < 8; j++)
22 {
23 if (times[i*8+j] > 2000)
24 t |= 1 << j;
25 }
26 printk("%02x ", t);
27 }
28 printk("
");
29 }
30
31 irqreturn_t irq_func(int irqno, void *arg)
32 {
33 s64 now = ktime_to_us(ktime_get());
34 static s64 prev = -1; //静态局部变量,只能执行一次,之后不会再赋值为-1;
35 u32 offset = now - prev;
36
37
38 if (-1 == prev)
39 {
40 prev = now; //只会执行这一次,
goto exit;
42 }
43
44 prev = now;
45 //引导码周期时间为13.5ms
46 if ((offset > 12800) && (offset < 14000))
47 {
48 num = 0; //收到引导码,准备接收第0位数据的周期时间
49 goto exit;
50 }
51
52 times[num++] = offset;
53 if (num > 32)
54 {
55 process();
56 prev = -1;
57 num = 0;
58 }
59 exit:
60 return IRQ_HANDLED;
61 }
62
63 static int __devinit test_init(void)
64 {
65 int ret;
66
67 ret = request_irq(gpio_to_irq(IR_IO), irq_func, IRQF_TRIGGER_FALLING, "myir", NULL);
68 if (ret < 0)
69 goto err0;
70
71
72 return 0;
73 err0:
74 return ret;
75 }
76
static void __devexit test_exit(void)
78 {
79 free_irq(gpio_to_irq(IR_IO), NULL);
80 }
81
82 module_init(test_init);
83 module_exit(test_exit);
84
85 MODULE_LICENSE("GPL");
86