本帖最后由 xingi386 于 2013-9-30 09:34 编辑
万能的网友们,能否帮我看下PIO中断不工作的问题?请给些建议?小弟感激不尽。
开发环境:
硬件:cubieboard v1 软件:cubieboard-tv-sdk
问题描述:
我在调试wifi模块,使用spi接口+外部中断,目前spi接口已经OK,但中断却不工作。中断已经注册成功,注册的中断函数从来没有被触发过。 我有使用示波器测量过,外部的中断信号是有的,但是中断函数却没有被触发。
软件上我确定已经修改了相应的寄存器,具体的代码如请查看下面。
具体代码:
1、 配置fex文件,我使用的为EINT15。 [spi_wifi_para] nmc100_wl_irq = port : PH15<6><default><default><default> 2、在module_init是进行ioremap
gpio_addr = ioremap(PIO_BASE_ADDRESS, PIO_RANGE_SIZE); if(!gpio_addr) { NMI_PRINTF("fail to ioremap pio.\n"); return -1; } 3、 在我的driver probe函数里 初始化 irq //int ret= 0; #defineNMC1000_IRQ_NAME "NMC_IRQ" #defineNMC1000_IRQ_NO gpio_int_info[0].port_num //(IRQ_EINT7) #defineNMC1000_IRQ_MODE NEGATIVE_EDGE
__u32 reg_num = 0; __u32 reg_addr = 0; __u32 reg_val = 0;
//config gpio to int mode if(gpio_irq_hdle){ gpio_release(gpio_irq_hdle, 2); } gpio_irq_hdle = gpio_request_ex("spi_wifi_para","nmc100_wl_irq");
if(!gpio_irq_hdle){ ret = -1; PRINT_ER("Failed to request IRQ for GPIO: %d\n",nic->dev_irq_num); return ret; }
gpio_get_one_pin_status(gpio_irq_hdle, gpio_int_info,"nmc100_wl_irq", 1); PRINT_D(INIT_DBG,"%s, %d: gpio_int_info, port = %d, port_num = %d.\n", __func__, __LINE__, \ gpio_int_info[0].port, gpio_int_info[0].port_num);
nic->dev_irq_num = NMC1000_IRQ_NO;
reg_num =NMC1000_IRQ_NO%8; reg_addr = NMC1000_IRQ_NO/8; reg_val = readl(gpio_addr + int_cfg_addr[reg_addr]); reg_val &= (~(7 << (reg_num *4))); reg_val |= (NMC1000_IRQ_MODE << (reg_num * 4)); writel(reg_val,gpio_addr+int_cfg_addr[reg_addr]);
//reg_val = readl(gpio_addr+PIO_INT_CFG1_OFFSET); //printk("PIO_INT_CFG1_OFFSET========================================%x", reg_val);
//clear the IRQ_EINT7 interrupt pending reg_val = readl(gpio_addr + PIO_INT_STAT_OFFSET); if((reg_val = (reg_val&(1<<(NMC1000_IRQ_NO))))){ //print_int_info("==NMC1000_IRQ_NO=\n"); writel(reg_val,gpio_addr + PIO_INT_STAT_OFFSET); }
reg_val = readl(gpio_addr+PIO_INT_CTRL_OFFSET); reg_val |= (1 << NMC1000_IRQ_NO); writel(reg_val,gpio_addr+PIO_INT_CTRL_OFFSET);
udelay(10);
ret=request_irq(SW_INT_IRQNO_PIO, isr_uh_routine, IRQF_TRIGGER_LOW|IRQF_SHARED , NMC1000_IRQ_NAME, (void*)nic);//IRQF_TRIGGER_LOW #else ret=request_irq(NMC1000_IRQ_NO, isr_uh_routine, IRQF_SHARED ,NMC1000_IRQ_NAME, (void*)nic);// IRQF_TRIGGER_LOW #endif
if (ret < 0){ PRINT_ER("request nmc1000 irq failed\n"); }else{ PRINT_D(INIT_DBG,"request nmc1000 irq success \n"); }
我通过log可以看见request nmc1000 irq success已经被打出来的。之后我有做了测试,我手动将中断的PIO pin接地或接到其他的3.3v的pin上,中断函数从来没有被触发过
|