求救。。。S3C6410无法触发camera中断。。。
在Linux下用最简单的字符驱动的方法写camera驱动,就是要自己配置寄存器的那种,摄像头是OV9650,输出格式ITU601。我先用request_irq(IRQ_CAMIF_P,(irq_handler_t)camif_p_interrupt,IRQF_DISABLED|IRQF_TRIGGER_HIGH,"camif","camif");申请IRQ_CAMIF_P中断,然后配置camif的寄存器,帧缓冲地址就是LCD的显存地址,示波器检测行场信号都有,中断也注册成功,但是程序始终进不了中断,到底是寄存器配置问题还是中断申请的问题?求解。。。。
camif寄存器初始化子函数如下:
void camif_reg_init(void)
{
unsigned int MainHorRatio,MainVerRatio;
writel(0x2AAAAAA,S3C64XX_GPFCON);//CAMIF
camif_regs->cisrcfmt=(1<<31);
camif_regs->cigctrl=1<<31;//software reset
camif_regs->cigctrl=~(1<<31);
camif_regs->cisrcfmt=(1<<31)|(640<<16)|480;
//clear all flags
camif_regs->ciwdofst=(1<<30)|(3<<27)|(0xf<<12);
camif_regs->ciwdofst=0;
camif_regs->ciwdofst=(1<<31)|(80<<16)|104;//cut window
camif_regs->ciwdofst2=(80<<16)|104;
camif_regs->cigctrl=(1<<26)|(0<<25)|(1<<21)|(1<<20)|(1<<19)|(1<<18);//disable overflow interrupt & set level interrupt &clear p interrupt
//set address
camif_regs->ciprysa1=lcd_info->screen_base;//lcd_info->fix.smem_start;
camif_regs->ciprysa2=lcd_info->screen_base;//lcd_info->fix.smem_start;
camif_regs->ciprysa3=lcd_info->screen_base;//lcd_info->fix.smem_start;
camif_regs->ciprysa4=lcd_info->screen_base;//lcd_info->fix.smem_start;
camif_regs->ciprtrgfmt=(3<<29)|(480<<16)|272;//output RGB
camif_regs->ciprctrl=(16<<19)|(16<<14)|(1<<2);//main burst & remained burst length & enable lastIRQ
camif_regs->ciprscpreratio=(0<<28)|(1<<16)|1;
camif_regs->ciprscpredst=(480<<16)|272;
MainHorRatio=(480<<8)/480;
MainVerRatio=(272<<8)/272;
camif_regs->ciprscctrl=(1<<30)|(1<<29)|(MainHorRatio<<16)|(3<<13)|(2<<11)|MainVerRatio;
camif_regs->ciprtarea=480*272;
camif_regs->ciprscctrl|=1<<15;
camif_regs->ciimgcpt=(1<<31)|(1<<29)|(1<<24)|(100<<10);//enable global capture&preview scaler
}