天嵌 ARM开发社区

 找回密码
 注册
查看: 2085|回复: 3

按键中断驱动程序

[复制链接]
zhujunfengx 发表于 2009-11-11 20:30:43 | 显示全部楼层 |阅读模式
我按照PDF上写的驱动程序将它烧入了板子里,并且加载运行,但是当我按下按键的时候,它特别 的慢,那像是中断呀。
另外中断处理程序的返回是什么呀?
就是这个:return IRQ_RETVAL(IRQ_HANDLED);
谢谢!
wangdawei_80 发表于 2009-11-11 21:48:36 | 显示全部楼层
能把内核模块的代码和用户态的代码贴出来不,帮你分析一下。
 楼主| zhujunfengx 发表于 2009-11-12 20:31:20 | 显示全部楼层
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/fs.h>
#include<linux/init.h>
#include<linux/delay.h>
#include<asm/irq.h>
#include<linux/interrupt.h>
#include<asm/uaccess.h>
#include<asm/arch/regs-gpio.h>
#include<asm/hardware.h>

#define DEVICE_NAME  "buttons"
#define BUTTON_MAJOR  232

static volatile int press_cnt[]={0,0,0,0};


struct button_irq_desc
{
        int irq;
        unsigned long flags;
        char *name;
};

static struct button_irq_desc button_irqs[]=
{
        {IRQ_EINT1,IRQF_TRIGGER_FALLING,"KEY1"},
        {IRQ_EINT2,IRQF_TRIGGER_FALLING,"KEY2"},
        {IRQ_EINT3, IRQF_TRIGGER_FALLING,"KEY3"},
//        {IRQ_EINT0, IRQF_TRIGGER_FALLING,"KEY4"},
};


static irqreturn_t buttons_interrupt(int irq,void *dev_id)
{
        volatile int *press_cnt=(volatile int *)dev_id;
        *press_cnt=*press_cnt+1;
//        ev_press=1;        //表示中断发生了
//    wake_up_interruptible(&button_waitq);  //唤醒休眠的进程
        printk("Now Key interrupt occur  %d times!!!\n",*press_cnt);
    return IRQ_RETVAL(IRQ_HANDLED);
}
static int s3c24xx_buttons_open(struct inode *inode,struct file *file)
{
        int i;
        int err;

        for(i=0;i<sizeof(button_irqs)/sizeof(button_irqs[0]);i++)
        {
                //注册中断处理函数
                err=request_irq(button_irqs[i].irq,buttons_interrupt,button_irqs[i].flags,button_irqs[i].name,(void *)&press_cnt[i]);

                if(err)break;
        }

        if(err)
        {
                //释放已经注册的中断
                i--;
                for(;i>=0;i--)
                        free_irq(button_irqs[i].irq,(void *)&press_cnt[i]);
                return -EBUSY;
        }
        return 0;
}

static int s3c24xx_buttons_close(struct inode *inode,struct file *file)
{
        int i;
        for(i=0;i<sizeof(button_irqs)/sizeof(button_irqs[0]);i++)
        {
                free_irq(button_irqs[i].irq,(void *)&press_cnt[i]);
        }
        return 0;
}


static struct file_operations s3c24xx_buttons_fops=
{
                .owner    = THIS_MODULE,
                .open     = s3c24xx_buttons_open,
                .release  = s3c24xx_buttons_close,
//                .read     = s3c24xx_buttons_read,
};

static int __init s3c24xx_buttons_init(void)
{
        int ret;
        ret =register_chrdev(BUTTON_MAJOR,DEVICE_NAME,&s3c24xx_buttons_fops);

        if(ret<0)
        {
           printk(DEVICE_NAME "can't register major number\n");
           return ret;
        }
        printk(DEVICE_NAME "initialized \n");
        return 0;
}

static void __exit s3c24xx_buttons_exit(void)
{
        unregister_chrdev(BUTTON_MAJOR,DEVICE_NAME);
}

module_init(s3c24xx_buttons_init);
module_exit(s3c24xx_buttons_exit);
wangdawei_80 发表于 2009-11-12 22:50:14 | 显示全部楼层
我分析你只是将该模块加载到内核后就进行按键测试了,是吗?若是这样的话,应该将注册中断的代码放在初始化函数中。因为当你作insmod的时候系统会调用执行module_init()指定的函数,而你的注册中断的代码在open()系统调用中,没有被执行到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-5-18 07:37 , Processed in 1.031244 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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