| 
 | 
 
 本帖最后由 konizhang 于 2010-12-3 08:49 编辑  
 
内核版本 2.6.30.4 
驱动名称: kaypad.ko 
驱动测试程序: keypad_test 
运行kepad_test, 按键后显示: 
------------------------------------------- 
keyp opened 
Eint 0 
 
------------------------------------------- 
显示完上两行后就档机。 
输出Eint 0, 说明已经进入中断处理程序,代码如下: 
根据代码,在输出Eint 0--->disable_irq-->终端输出 0 
实际上终端未输出0, 也就是就在disable_irq这里就档机了 
 
请教一下:是不是哪里出现冲突导致的? 还是有其它的问题 
(后面附上驱动代码和测试代码) 
谢谢~- //中断处理函数
 
 - static irqreturn_t key_eint_handler(int irq, void *dev_id)
 
 - {
 
 -         int cnt, key_index;
 
 -         key_index = 0;
 
 -         for (cnt=0; cnt<KEY_NUM; cnt++)
 
 -         {
 
 -                 if (key_info_tab[cnt].irq_no == irq)
 
 -                 {
 
 -                         key_index = key_info_tab[cnt].key_no;
 
 -                         break;
 
 -                 }                
 
 -         }
 
 -         printk(KERN_NOTICE "Eint %d\n", key_index);
 
 -         
 
 -         disable_irq(key_info_tab[key_index].irq_no); //disable irq
 
 -         printk(KERN_NOTICE "0\n");
 
 -         
 
 -         key_dev->keyStatus[key_index] = KEYSTATUS_X; //set key in unsure state
 
 -         key_timer[key_index].expires = jiffies + KEY_DELAY_20MS; //set timer value
 
 -         add_timer(&key_timer[key_index]); //start timer
 
 -         
 
 -         return IRQ_HANDLED;
 
 - }
 
  复制代码 按键源码行数太多,传不上,以附件形式加上 
按键测试程序- #include <stdio.h>
 
 - #include <stdlib.h>
 
 - #include <unistd.h>
 
  
- int main()
 
 - {
 
 -         int fd, ret, key_num;
 
 -         fd = open("/dev/key", 0);
 
 -         if (fd < 0)
 
 -         {
 
 -                 printf("open error!\n");
 
 -                 return -1;
 
 -         }
 
  
-         while (1)
 
 -         {
 
 -                 ret = read(fd, &key_num, sizeof(int));
 
 -                 printf("you press the key %d\n", key_num);
 
 -         }
 
 -         close(fd);
 
 -         return 0;
 
 - }
 
 
  复制代码 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册  
 
×
 
 
 
 
 |