5375|6

199

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2440中断按键检测 [复制链接]

最近在学linux驱动开发,在做中断程序的时候不知道为什么就是进不了中断服务函数,下面贴出源码,希望各位大侠们给点帮助,不胜感激~
//s3c2440_key.c(底层驱动程序)
//#include
#include
#include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include

#define DEVICE_NAME "s3c2440_key"       
#define LED_MAJOR 240       
static irqreturn_t key_isr(int irq, void *dev_id)
{
        disable_irq(IRQ_EINT0);              //Disable global interrupt
        printk("IRQ_EINT0: Congratulation! you can go into the interrupt\n");
        enable_irq(IRQ_EINT0);                                //Enable global interrupt
        return IRQ_HANDLED;
}

static int request_irqs(void)
{
        int ret;
        set_irq_type(IRQ_EINT0,IRQ_TYPE_EDGE_FALLING);
        ret=request_irq(IRQ_EINT0,key_isr,IRQF_SHARED,DEVICE_NAME,NULL);
        if(ret)
        {
                printk("IRQ_EINT0: could not register interrupt\n");
                return ret;
        }
        return 0;
}

static struct file_operations s3c2440_key_fops = {
.owner = THIS_MODULE,
};

static int __init s3c2440_key_init(void)
{
        int ret;
        ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &s3c2440_key_fops);
        if (ret < 0)
        {
                printk(DEVICE_NAME " can't register major number\n");
                return ret;
        }
        s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_EINT0);
        printk(DEVICE_NAME " initialized\n");
        return 0;
}

static void __exit s3c2440_key_exit(void)
{
        //devfs_remove(DEVICE_NAME);
        unregister_chrdev(LED_MAJOR, DEVICE_NAME);
}
module_init(s3c2440_key_init);
module_exit(s3c2440_key_exit);


//key_test.c(测试函数)
#include
#include
#include
#include "stdio.h"
#include "sys/types.h"
#include "sys/ioctl.h"
#include "stdlib.h"
#include "termios.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "sys/time.h"
int main()
{
        int fd;
        fd = open("/dev/s3c2440_key",0);
        if (fd < 0)
        {
                perror("open device key");
                exit(1);
        }
        printf("key test show. press ctrl+c to exit \n");
        while(1)
        {
        }
        close(fd);       
        return 0;
}

最新回复

我又仔细看了一下,如果是完整的程序的话,还有些问题呀。 你用户空间的应用程序使用open打开设备节点,可是你的驱动程序里,并没有open这个方法,同时也没有程序来调用你自己编写的这个 request_irqs函数,所以根本没有注册中断,所以没有显示。 你应该编写一个open函数,添加到结构体: static struct file_operations s3c2440_key_fops = { .owner = THIS_MODULE, .open = (你的函数) }; 在open函数里在调用request_irqs函数,最后你最好还是要设置一下触发类型。差不多就这样吧,你可以试一下。  详情 回复 发表于 2011-4-10 18:07
点赞 关注

回复
举报

199

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
第一个文件包含的的头文件如下:
//#include
#include
#include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include
 
 

回复

199

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不知道为什么显示不了,不过编译都是能够通过的
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

4
 
代码不全,看一下你跑裸机的中断程序是否能成功,如果能成功的话,说明是你的linux的驱动模块没写好。以前我在跑裸机的中断程序,也有问题,记住2440上有MMU,必须确保MMU打开,不然的话会找不到中断处理函数的。
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

5
 
1、先看看中断控制器有没有收到来自 uart  的中断,如果连这个都没有的话,就好好检查一下串口的初始化,已经中断使能相关部分。
2、如果有中断了并且中断挂接正确了的话,必然要调中断处理函数的。
3、可以写一个简单的串口轮询输出函数,在串口初始化完成,系统起来后调用,看看串口运转是否正常。
4、mmu 也是要看的,别对应的寄存器没有 映射对。
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

6
 
ret=request_irq(IRQ_EINT0,key_isr,IRQF_SHARED,DEVICE_NAME,NULL);
如果使用IRQF_SHARED的话,最后就不能用NULL了,你可以随便指定一个地址,但是不能为NULL的。
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

7
 
我又仔细看了一下,如果是完整的程序的话,还有些问题呀。
你用户空间的应用程序使用open打开设备节点,可是你的驱动程序里,并没有open这个方法,同时也没有程序来调用你自己编写的这个 request_irqs函数,所以根本没有注册中断,所以没有显示。
你应该编写一个open函数,添加到结构体:
static struct file_operations s3c2440_key_fops = {
.owner = THIS_MODULE,
.open = (你的函数)
};
在open函数里在调用request_irqs函数,最后你最好还是要设置一下触发类型。差不多就这样吧,你可以试一下。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表