pci没有驱动程序怎么解

img

img


pci数据捕获和信号处理控制器没有驱动程序
sm总线控制器没有驱动程序
pci简单通讯控制器没有驱动程序
pci设备没有驱动程序
pci串行端口没有驱动程序

  • 建议你看下这篇博客👉 :pci总线扫描及pci网卡驱动
  • 除此之外, 这篇博客: PCI设备驱动解析中的 2.4 申请注册中断函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 看函数

    result = request_irq(bt->irq, bt878_irq,
                         IRQF_SHARED, "bt878", (void *) bt);
    

    bt878_irq函数定义如下:

    /*****************************/
    /* Interrupt service routine */
    /*****************************/
    
    static irqreturn_t bt878_irq(int irq, void *dev_id)
    {
            u32 stat, astat, mask;
            int count;
            struct bt878 *bt;
    
            bt = (struct bt878 *) dev_id;
    
            count = 0;
            while (1) {
                    stat = btread(BT878_AINT_STAT);
                    mask = btread(BT878_AINT_MASK);
                    if (!(astat = (stat & mask)))
                            return IRQ_NONE;        /* this interrupt is not for me */
    /*              dprintk("bt878(%d) debug: irq count %d, stat 0x%8.8x, mask 0x%8.8x\n",bt->nr,count,stat,mask); */
                    btwrite(astat, BT878_AINT_STAT);        /* try to clear interrupt condition */
    
    
                    if (astat & (BT878_ASCERR | BT878_AOCERR)) {
                            if (bt878_verbose) {
                                    printk(KERN_INFO
                                           "bt878(%d): irq%s%s risc_pc=%08x\n",
                                           bt->nr,
                                           (astat & BT878_ASCERR) ? " SCERR" :
                                           "",
                                           (astat & BT878_AOCERR) ? " OCERR" :
                                           "", btread(BT878_ARISC_PC));
                            }
                    }
                    if (astat & (BT878_APABORT | BT878_ARIPERR | BT878_APPERR)) {
                            if (bt878_verbose) {
                                    printk(KERN_INFO
                                         "bt878(%d): irq%s%s%s risc_pc=%08x\n",
                                         bt->nr,
                                         (astat & BT878_APABORT) ? " PABORT" :
                                         "",
                                         (astat & BT878_ARIPERR) ? " RIPERR" :
                                         "",
                                         (astat & BT878_APPERR) ? " PPERR" :
                                         "", btread(BT878_ARISC_PC));
                            }
                    }
                    if (astat & (BT878_AFDSR | BT878_AFTRGT | BT878_AFBUS)) {
                            if (bt878_verbose) {
                                    printk(KERN_INFO
                                         "bt878(%d): irq%s%s%s risc_pc=%08x\n",
                                         bt->nr,
                                         (astat & BT878_AFDSR) ? " FDSR" : "",
                                         (astat & BT878_AFTRGT) ? " FTRGT" :
                                         "",
                                         (astat & BT878_AFBUS) ? " FBUS" : "",
                                         btread(BT878_ARISC_PC));
                            }
                    }
                    if (astat & BT878_ARISCI) {
                            bt->finished_block = (stat & BT878_ARISCS) >> 28;
                            tasklet_schedule(&bt->tasklet);
                            break;
                    }
                    count++;
                    if (count > 20) {
                            btwrite(0, BT878_AINT_MASK);
                            printk(KERN_ERR
                                   "bt878(%d): IRQ lockup, cleared int mask\n",
                                   bt->nr);
                            break;
                    }
            }
            return IRQ_HANDLED;
    }