- 论坛徽章:
- 0
|
本帖最后由 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"
但是又能调用中断函数 这奇怪了?请高手们解答 万分感谢!!!!!!!!! |
|