ret_irq = request_irq(IRQ_EINT(12), EINT_thread,IRQF_DISABLED | IRQ_TYPE_EDGE_FALLING, "mem", 0);
if ( ret_irq<0 )
{
printk(KERN_ERR "timer: cannot register IRQ %d\n", IRQ_EINT(12));
}
static irqreturn_t EINT_thread(int irq, void *dev_id)
{
//if(ir_read_size != 34)
//{
printk("xai jiang yan chu fa %d\n",n++);
do_gettimeofday(&time_tv[ir_read_size++]);
if(ir_read_size >1)
{
time_lenth = time_tv[ir_read_size-1].tv_usec - time_tv[ir_read_size-2].tv_usec ;
if(time_lenth < 0)
{
time_lenth = 1000000- time_tv[ir_read_size-2].tv_usec;
time_lenth = time_tv[bitcount-1].tv_usec + time_lenth ;
}
if(ir_read_size == 2)
{
if((time_lenth > 13200) && (time_lenth < 13800))
{
printk("yindao\n");
bit=0;
ir_data = 0;
}
else
{
printk("no yindao\n");
//ir_read_size=0;
n=0;
ir_learned_size =0;
return 0;
}
}
if((time_lenth > 1000) && (time_lenth < 1300))//捕获到的是0
{
printk("0 bit : %d\n",bit);
bit++;
}
if((time_lenth > 2100) && (time_lenth < 2400))//捕获到的是1
{
ir_data |= (1<<(31-bit));
printk("1 bit : %d\n",bit);
bit++;
}
if(bit == 32)
{
bit=0;
ir_read_size =0;
}
}
return IRQ_HANDLED;
}
我按以上中断方式解红红外码,下降沿中断,有时候都触发不够次数的,这样按一下按钮应该触发33次才对的,但是有时候触发够,有时候没有,还有有时候即使触发33次,但是统计0和1时候,几乎没有一次统计够32位的
统计0和1,总是少于32位,上面的中断有什么问题吗?希望得到技术支持的回答