新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > Linux下PCI設備驅動程序開發

        Linux下PCI設備驅動程序開發

        作者:肖文鵬 碩士研究生, 北京理工大學計算機系 時間:2008-08-25 來源:21IC 中國電子網 收藏
          4. 打開設備模塊

          在這個模塊里主要實現申請中斷、檢查讀寫模式以及申請對設備的控制權等。在申請控制權的時候,非阻塞方式遇忙返回,否則進程主動接受調度,進入睡眠狀態,等待其它進程釋放對設備的控制權。 

        本文引用地址:http://www.104case.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)) {
            /* 檢查讀寫模式 */
            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);
                    /* 設備打開計數增1 */
                    MOD_INC_USE_COUNT;
                    /* ... */
                }
            }
          } 
         
          5. 數據讀寫和控制信息模塊

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

          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);
                    
          /* 將讀取的數據傳輸到用戶空間 */
                    return 0;
            }
            
            /* ... */
          } 
         
          事實上,在demo_fops里還可以實現諸如demo_read( )、demo_mmap( )等操作,內核源碼中的driver目錄里提供了許多設備驅動程序的源代碼,找那里可以找到類似的例子。在對資源的訪問方式上,除了有I/O指令以外,還有對外設I/O內存的訪問。對這些內存的操作一方面可以通過把I/O內存重新映射后作為普通內存進行操作,另一方面也可以通過主DMA(Bus Master DMA)的方式讓設備把數據通過DMA傳送到系統內存中。 

          6. 中斷處理模塊

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

          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 */
            }
            /* 告訴設備已經收到中斷 */
            outl(status & INT_MASK, card->iobase + GLOB_STA);
            spin_unlock(&card->lock);
            
            /* 其它進一步的處理,如更新DMA緩沖區指針等 */
          } 
         

          7. 釋放設備模塊

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

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

          卸載設備模塊與初始化設備模塊是相對應的,實現起來相對比較簡單,主要是調用函數pci_unregister_driver( )從內核中注銷設備驅動程序: 

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

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

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

        c++相關文章:c++教程



        上一頁 1 2 3 下一頁

        關鍵詞: PCI 總線 Linux Alpha

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 浠水县| 济宁市| 金秀| 民丰县| 蓬安县| 漳平市| 陈巴尔虎旗| 台南市| 绍兴县| 涞源县| 通许县| 喜德县| 成都市| 元朗区| 武乡县| 买车| 赤城县| 广河县| 定西市| 德庆县| 西林县| 绥中县| 夏津县| 江阴市| 五原县| 昭通市| 浦东新区| 石楼县| 天柱县| 绥化市| 独山县| 土默特右旗| 乾安县| 临清市| 健康| 正定县| 安溪县| 怀集县| 华池县| 青河县| 巴林左旗|