天嵌 ARM开发社区

 找回密码
 注册
查看: 1910|回复: 8

请教: 按键驱动测试时,系统档机(驱动非天嵌源码)

[复制链接]
konizhang 发表于 2010-12-3 08:41:02 | 显示全部楼层 |阅读模式
本帖最后由 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这里就档机了

请教一下:是不是哪里出现冲突导致的? 还是有其它的问题
(后面附上驱动代码和测试代码)
谢谢~
  1. //中断处理函数
  2. static irqreturn_t key_eint_handler(int irq, void *dev_id)
  3. {
  4.         int cnt, key_index;
  5.         key_index = 0;
  6.         for (cnt=0; cnt<KEY_NUM; cnt++)
  7.         {
  8.                 if (key_info_tab[cnt].irq_no == irq)
  9.                 {
  10.                         key_index = key_info_tab[cnt].key_no;
  11.                         break;
  12.                 }               
  13.         }
  14.         printk(KERN_NOTICE "Eint %d\n", key_index);
  15.        
  16.         disable_irq(key_info_tab[key_index].irq_no); //disable irq
  17.         printk(KERN_NOTICE "0\n");
  18.        
  19.         key_dev->keyStatus[key_index] = KEYSTATUS_X; //set key in unsure state
  20.         key_timer[key_index].expires = jiffies + KEY_DELAY_20MS; //set timer value
  21.         add_timer(&key_timer[key_index]); //start timer
  22.        
  23.         return IRQ_HANDLED;
  24. }
复制代码
按键源码行数太多,传不上,以附件形式加上
按键测试程序
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>

  4. int main()
  5. {
  6.         int fd, ret, key_num;
  7.         fd = open("/dev/key", 0);
  8.         if (fd < 0)
  9.         {
  10.                 printf("open error!\n");
  11.                 return -1;
  12.         }

  13.         while (1)
  14.         {
  15.                 ret = read(fd, &key_num, sizeof(int));
  16.                 printf("you press the key %d\n", key_num);
  17.         }
  18.         close(fd);
  19.         return 0;
  20. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| konizhang 发表于 2010-12-3 19:27:52 | 显示全部楼层
哥们,谁给点提示咯~
天嵌_support1 发表于 2010-12-4 11:20:13 | 显示全部楼层
2# konizhang

看别人的代码是很头疼的事情。
你在中断处理中为什么要把中断禁用掉呢?
中断处理就做些按键扫描,数据获取不就行么?
 楼主| konizhang 发表于 2010-12-6 22:50:54 | 显示全部楼层
3# embedsky_lxt
不好意思啦~
因为为了防抖动,在按键中断中禁用掉当前按下按键所对应的的中断
再用定时器进行去抖动,以却保是真的进行按键的动作
当中断请求函数加上IRQF_DISABLED标志的时候,进入中断时是禁用掉所有中断的
但是当出了中断处理时,中断还是会打开。

如果不在按键中断中进行禁用,如果我按键的时间过长,是不是可能会有几次触发?

我在网上看的教程中, 很多都是和版主说的一样,在中断只进行了按键扫描

谢谢解答.
 楼主| konizhang 发表于 2010-12-8 19:38:03 | 显示全部楼层
3# embedsky_lxt
对于linux2.6的版本不同,有些函数也不同
有没有网站专门查这不同版本的不同函数,然后还有相应的用法的

谢谢解答
天嵌_support1 发表于 2010-12-9 11:19:36 | 显示全部楼层
4# konizhang

你要禁止中断就把相应的SUB中断位设置了不就行了?
天嵌_support1 发表于 2010-12-9 11:20:13 | 显示全部楼层
5# konizhang


这些东西你可以去看看内核源代码的网站,其实函数变更也会有记录的。
 楼主| konizhang 发表于 2010-12-10 01:05:45 | 显示全部楼层
本帖最后由 konizhang 于 2010-12-10 01:09 编辑

6# embedsky_lxt
设置SUB和disable_irq()停止中断有什么不同吗
disable_irq(key_info_tab[key_index].irq_no); //disable irq

在编写驱动的时候,发现凡是执行了disable_irq()后,代码就不再往下执行了??
不知道是什么原因。

今天只是在天嵌按键代码的基础上加入了禁止中断的语句,结果运行到disable_irq()就停住了,下面的代码就不执行了,屏蔽掉disable_irq()后,下面的代码就可以执行。
天嵌_support1 发表于 2010-12-10 11:02:07 | 显示全部楼层
8# konizhang


disable_irq();

中断处理过程你怎么会去禁用了中断呢?
你如果不想用中断,可以才用论寻来完成。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-8-21 06:42 , Processed in 1.033243 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表