红外接收头在内核里的驱动

    #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("\n");
 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 

猜你喜欢

转载自www.cnblogs.com/edan/p/9176219.html
今日推荐