免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1922 | 回复: 1
打印 上一主题 下一主题

210linux驱动中断问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-07 09:37 |只看该作者 |倒序浏览
本帖最后由 chen2611 于 2012-09-07 13:34 编辑

在驱动中,我的外设写数据进去,arm读取数据,中断有问题。
假如我在模块加载的时候申请中断   中断函数会自动调用,在open函数中,运行read和write测试,都会调用!我想用外部中断(给一个读信号,当读信号从低到高,触发中断),但是一直不行!
请高手帮忙解决呢   !下面是代码片段:
//中断函数
static   irqreturn_t   read_interrupt(int   irq,void   *dev_id)
{
int   str=gpio_get_value(S5PV210_GPJ1(5));
printk( "read1   the   register   data0   is   =%d   \n ",str);
int   g=gpio_get_value(S5PV210_GPJ2(0));
printk( "read1   the   register   data1   is   =%d   \n ",g);

int   f=gpio_get_value(S5PV210_GPJ2(1));
printk( "read1   the   register   data2   is   =%d   \n ",f);

int   e=gpio_get_value(S5PV210_GPJ2(2));
printk( "read1   the   register   data3   is   =%d   \n ",e);

int   d=gpio_get_value(S5PV210_GPJ2(3));
printk( "read1   the   register   data4   is   =%d   \n ",d);

int   c=   gpio_get_value(S5PV210_GPJ2(4));
printk( "read1   the   register   data5   is   =%d   \n ",c);

int   b=gpio_get_value(S5PV210_GPJ2(5));
printk( "read1   the   register   data6   is   =%d   \n ",b);

int   a=gpio_get_value(S5PV210_GPJ2(6));
printk( "read1   the   register   data7   is   =%d   \n ",a);
printk( "read   interrupt********\n ");
return   IRQ_HANDLED;
}

unsigned char Rinit_ioport(void)
{
        unsigned long err;
        s3c_gpio_cfgpin (S5PV210_GPJ1(5), S3C_GPIO_SFN(1));
        s3c_gpio_cfgpin (S5PV210_GPJ2(0), S3C_GPIO_SFN(1));
        s3c_gpio_cfgpin (S5PV210_GPJ2(1), S3C_GPIO_SFN(1));
        s3c_gpio_cfgpin (S5PV210_GPJ2(2), S3C_GPIO_SFN(1));
        s3c_gpio_cfgpin (S5PV210_GPJ2(3), S3C_GPIO_SFN(1));
        s3c_gpio_cfgpin (S5PV210_GPJ2(4), S3C_GPIO_SFN(1));
        s3c_gpio_cfgpin (S5PV210_GPJ2(5), S3C_GPIO_SFN(1));
        s3c_gpio_cfgpin (S5PV210_GPJ2(6), S3C_GPIO_SFN(1));
       
        s3c_gpio_cfgpin(S5PV210_GPH2(2),S3C_GPIO_SFN(1));
        s3c_gpio_cfgpin(S5PV210_GPH2(3),S3C_GPIO_SFN(1));
        //gpio_set_value(S5PV210_GPJ2(6), 0);
/*        s3c_gpio_setpull(S5PV210_GPJ2(0),S3C_GPIO_PULL_UP);
        s3c_gpio_setpull(S5PV210_GPJ2(1),S3C_GPIO_PULL_UP);
        s3c_gpio_setpull(S5PV210_GPJ2(2),S3C_GPIO_PULL_UP);
        s3c_gpio_setpull(S5PV210_GPJ2(3),S3C_GPIO_PULL_UP);
        s3c_gpio_setpull(S5PV210_GPJ2(4),S3C_GPIO_PULL_UP);
        s3c_gpio_setpull(S5PV210_GPJ2(5),S3C_GPIO_PULL_UP);
        s3c_gpio_setpull(S5PV210_GPJ2(6),S3C_GPIO_PULL_UP);
        s3c_gpio_setpull(S5PV210_GPJ1(5),S3C_GPIO_PULL_UP);*/
        err=gpio_request(S5PV210_GPH1(2),"io_irq");
        if (err < 0) {
                pr_err("gpio-irq: failed to request GPIO %d,"
                        " error %d\n", S5PV210_GPH1(2), err);
        }
        err=gpio_direction_input(S5PV210_GPH1(2));
                if (err < 0) {
                pr_err("gpio-keys: failed to configure input"
                        " direction for GPIO %d, error %d\n",
                        S5PV210_GPH1(2), err);
                gpio_free(S5PV210_GPH1(2));
        }
        s3c_gpio_cfgpin(S5PV210_GPH1(2),S3C_GPIO_SFN(0xf)); //设置成中断模式  把对应引脚设置成中断功能
        s3c_gpio_setpull(S5PV210_GPH1(2),S3C_GPIO_PULL_UP); //上拉

    return 1;

}

ssize_t   shebei_read(struct   file   *filp,char   __user   *buff,size_t   size,loff_t   *offp)
{
      int   data;
      int   have_data;

gpio_set_value(S5PV210_GPH2(2),0);     //RD_L;
ndelay(10);
gpio_set_value(S5PV210_GPH2(2),1);     //RD_H;

copy_to_user(buff,&have_data,sizeof(have_data));
}
int   shebei_init_module(void)
{
        ........
        flag=Rinit_ioport();
        unsigned   long   err;
        set_irq_type(IRQ_EINT10,IRQF_TRIGGER_RISING);//设置中断16_31   触发方式IRQ_TYPE_EDGE_RISING
        disable_irq(IRQ_EINT10);     
        enable_irq(IRQ_EINT10);
err   =   request_irq(IRQ_EINT10,read_interrupt,IRQF_TRIGGER_RISING, "rd_signal ",NULL);
        if(err <0){
//disable_irq(IRQ_EINT10);
//free_irq(IRQ_EINT10,NULL);
printk( "IRQ   %d   can   not   request\n ",IRQ_EINT10);
return   err;
}
            ...........
}
void   shebei_exit_module(void)
{
free_irq(IRQ_EINT10,NULL);   
                ..........
}


而且request_irq(),在cat /proc/interrupts 查看 中断注册成功了没 没有观察到request_irq()里面的"rd_signal"
但是又能调用中断函数 这奇怪了?请高手们解答 万分感谢!!!!!!!!!

论坛徽章:
0
2 [报告]
发表于 2012-09-07 10:31 |只看该作者
麻烦告诉告知呢  qq号:465177490
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP