03day01irq

 1 #include <linux/module.h>
 2 #include <linux/init.h>
 3 #include <linux/kernel.h>
 4 
 5 #include <linux/interrupt.h> //request_irq   注册中断
 6 #include <mach/irqs.h> 
 7 /*
 8 对于中断号,它是和芯片相关,  头文件是在linux-3.5/arch/arm/mach-exynos/include/mach   中
 9 该头文件又包含了  plat/irqs.h   该文件中有IRQ_EINT()   可以算出外部中断号
10 */
11 
12 /*
13 按键产生中断
14 /sysfs  /proc   这两个目录都是虚拟文件系统,这种文件系统存在内存中
15 在/proc/interrupts  文件可以查看   中断的注册信息 
16 */
17 //中断处理函数  irqno  中断号,   data
18 irqreturn_t key_hankler(int  irqno, void * data)
19 {
20     printk("hello world\n");
21     printk("data = %d\n", (int)data);
22 
23     return  IRQ_HANDLED;
24 }
25 
26 
27 static int test_init(void)
28 {
29     int  ret = 0;
30     printk("%s:%d\n", __FILE__, __LINE__);
31 
32     //注册  按键中断
33     //XEINT26  ~29 
34 /*
35 static inline int __must_check
36 request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
37         const char *name, void *dev)
38 
39 irq   中断号   4412 平台   
40 #define IRQ_EINT(x)   
41 IRQ_EINT(26)
42 
43 typedef irqreturn_t (*irq_handler_t)(int, void *);
44 中断 服务函数
45 
46 flags  中断的标志  中断触发的形式  IRQF_TRIGGER_FALLING
47 
48 name  名称  注册成功之后,可以在/proc/interrupts  看到
49 
50 dev   向中断服务函数,传递的参数,如果不需要传递,可以赋值为NULL
51 
52 */
53     ret = request_irq(IRQ_EINT(26), key_hankler, IRQF_TRIGGER_FALLING, 
54         "candle_test",   (void *)123);
55     if(ret < 0) {
56         printk("request_irq  failed\n");
57         goto  err_request_irq;
58     }
59 
60 
61     return 0;
62 err_request_irq:
63     return -1;
64 }
65 
66 
67 static void test_exit(void)
68 {
69     printk("%s:%d\n", __FILE__, __LINE__);
70     //释放中断号
71     free_irq(IRQ_EINT(26), (void *)123);
72 }
73 
74 
75 module_init(test_init);
76 module_exit(test_exit);
77 
78 MODULE_LICENSE("GPL");

 

posted @ 2017-02-19 16:41  小黑·.·  阅读(208)  评论(0编辑  收藏  举报