xingi386 发表于 2013-9-30 09:30:28

Cubieboard v1 PIO 中断问题,请大虾给些建议

本帖最后由 xingi386 于 2013-9-30 09:34 编辑

万能的网友们,能否帮我看下PIO中断不工作的问题?请给些建议?小弟感激不尽。
      开发环境:
                  硬件:cubieboard v1                   软件:cubieboard-tv-sdk
      问题描述:
               我在调试wifi模块,使用spi接口+外部中断,目前spi接口已经OK,但中断却不工作。中断已经注册成功,注册的中断函数从来没有被触发过。                  我有使用示波器测量过,外部的中断信号是有的,但是中断函数却没有被触发。
                  软件上我确定已经修改了相应的寄存器,具体的代码如请查看下面。
      具体代码:
1、配置fex文件,我使用的为EINT15。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.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.port, gpio_int_info.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_val &= (~(7 << (reg_num *4)));                            reg_val |= (NMC1000_IRQ_MODE << (reg_num * 4));                   writel(reg_val,gpio_addr+int_cfg_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上,中断函数从来没有被触发过
页: [1]
查看完整版本: Cubieboard v1 PIO 中断问题,请大虾给些建议