<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 模擬技術(shù) > 設計應用 > Linux下PCI設備驅動(dòng)程序開(kāi)發(fā)

Linux下PCI設備驅動(dòng)程序開(kāi)發(fā)

作者:肖文鵬 碩士研究生, 北京理工大學(xué)計算機系 時(shí)間:2008-08-25 來(lái)源:21IC 中國電子網(wǎng) 收藏
  4. 打開(kāi)設備模塊

  在這個(gè)模塊里主要實(shí)現申請中斷、檢查讀寫(xiě)模式以及申請對設備的控制權等。在申請控制權的時(shí)候,非阻塞方式遇忙返回,否則進(jìn)程主動(dòng)接受調度,進(jìn)入睡眠狀態(tài),等待其它進(jìn)程釋放對設備的控制權。 

本文引用地址:http://dyxdggzs.com/article/87319.htm

  static int demo_open(struct inode *inode, struct file *file)
  {
    /* 申請中斷,注冊中斷處理程序 */
    request_irq(card->irq, &demo_interrupt, SA_SHIRQ,
        card_names[pci_id->driver_data], card)) {
    /* 檢查讀寫(xiě)模式 */
    if(file->f_mode & FMODE_READ) {
        /* ... */
    }
    if(file->f_mode & FMODE_WRITE) {
       /* ... */
    }
    
    /* 申請對設備的控制權 */
    down(&card->open_sem);
    while(card->open_mode & file->f_mode) {
        if (file->f_flags & O_NONBLOCK) {
            /* NONBLOCK模式,返回-EBUSY */
            up(&card->open_sem);
            return -EBUSY;
        } else {
            /* 等待調度,獲得控制權 */
            card->open_mode |= f_mode & (FMODE_READ | FMODE_WRITE);
            up(&card->open_sem);
            /* 設備打開(kāi)計數增1 */
            MOD_INC_USE_COUNT;
            /* ... */
        }
    }
  } 
 
  5. 數據讀寫(xiě)和控制信息模塊

  設備驅動(dòng)程序可以通過(guò)demo_fops 結構中的函數demo_ioctl( ),向應用程序提供對硬件進(jìn)行控制的接口。例如,通過(guò)它可以從I/O寄存器里讀取一個(gè)數據,并傳送到用戶(hù)空間里: 

  static int demo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  {
    /* ... */
    
    switch(cmd) {
        case DEMO_RDATA:
            /* 從I/O端口讀取4字節的數據 */
            val = inl(card->iobae + 0x10);
            
  /* 將讀取的數據傳輸到用戶(hù)空間 */
            return 0;
    }
    
    /* ... */
  } 
 
  事實(shí)上,在demo_fops里還可以實(shí)現諸如demo_read( )、demo_mmap( )等操作,內核源碼中的driver目錄里提供了許多設備驅動(dòng)程序的源代碼,找那里可以找到類(lèi)似的例子。在對資源的訪(fǎng)問(wèn)方式上,除了有I/O指令以外,還有對外設I/O內存的訪(fǎng)問(wèn)。對這些內存的操作一方面可以通過(guò)把I/O內存重新映射后作為普通內存進(jìn)行操作,另一方面也可以通過(guò)主DMA(Bus Master DMA)的方式讓設備把數據通過(guò)DMA傳送到系統內存中。 

  6. 中斷處理模塊

  PC的中斷資源比較有限,只有0~15的中斷號,因此大部分外部設備都是以共享的形式申請中斷號的。當中斷發(fā)生的時(shí)候,中斷處理程序首先負責對中斷進(jìn)行識別,然后再做進(jìn)一步的處理。 

  static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  {
    struct demo_card *card = (struct demo_card *)dev_id;
    u32 status;
    spin_lock(&card->lock);
    /* 識別中斷 */
    status = inl(card->iobase + GLOB_STA);
    if(!(status & INT_MASK)) 
    {
        spin_unlock(&card->lock);
        return;  /* not for us */
    }
    /* 告訴設備已經(jīng)收到中斷 */
    outl(status & INT_MASK, card->iobase + GLOB_STA);
    spin_unlock(&card->lock);
    
    /* 其它進(jìn)一步的處理,如更新DMA緩沖區指針等 */
  } 
 

  7. 釋放設備模塊

  釋放設備模塊主要負責釋放對設備的控制權,釋放占用的內存和中斷等,所做的事情正好與打開(kāi)設備模塊相反:

  static int demo_release(struct inode *inode, struct file *file)
  {
    /* ... */
    
    /* 釋放對設備的控制權 */
    card->open_mode &= (FMODE_READ | FMODE_WRITE);
    
    /* 喚醒其它等待獲取控制權的進(jìn)程 */
    wake_up(&card->open_wait);
    up(&card->open_sem);
    
    /* 釋放中斷 */
    free_irq(card->irq, card);
    
    /* 設備打開(kāi)計數增1 */
    MOD_DEC_USE_COUNT;
    
    /* ... */  
  } 
 
  8. 卸載設備模塊

  卸載設備模塊與初始化設備模塊是相對應的,實(shí)現起來(lái)相對比較簡(jiǎn)單,主要是調用函數pci_unregister_driver( )從內核中注銷(xiāo)設備驅動(dòng)程序: 

  static void __exit demo_cleanup_module (void)
  {
    pci_unregister_driver(&demo_pci_driver);
  }
 
  四、小結

  不僅是目前應用廣泛的計算機標準,而且是一種兼容性最強、功能最全的計算機總線(xiàn)。而作為一種新的操作系統,其發(fā)展前景是無(wú)法估量的,同時(shí)也為總線(xiàn)與各種新型設備互連成為可能。由于Linux源碼開(kāi)放,因此給連接到PCI總線(xiàn)上的任何設備編寫(xiě)驅動(dòng)程序變得相對容易。本文介紹如何編譯Linux下的PCI驅動(dòng)程序,針對的內核版本是2.4。 

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

c++相關(guān)文章:c++教程



上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: PCI 總線(xiàn) Linux Alpha

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>