freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux下pci設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)-資料下載頁(yè)

2025-08-04 09:47本頁(yè)面
  

【正文】 e amp。 filef_mode) { if (filef_flags amp。 O_NONBLOCK) { /* NONBLOCK模式,返回EBUSY */ up(amp。cardopen_sem)。 return EBUSY。 } else { /* 等待調(diào)度,獲得控制權(quán) */ cardopen_mode |= f_mode amp。 (FMODE_READ | FMODE_WRITE)。 up(amp。cardopen_sem)。 /* 設(shè)備打開(kāi)計(jì)數(shù)增1 */ MOD_INC_USE_COUNT。 /* ... */ } }}5. 數(shù)據(jù)讀寫(xiě)和控制信息模塊PCI設(shè)備驅(qū)動(dòng)程序可以通過(guò)demo_fops 結(jié)構(gòu)中的函數(shù)demo_ioctl( ),向應(yīng)用程序提供對(duì)硬件進(jìn)行控制的接口。例如,通過(guò)它可以從I/O寄存器里讀取一個(gè)數(shù)據(jù),并傳送到用戶空間里: static int demo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){ /* ... */ switch(cmd) { case DEMO_RDATA: /* 從I/O端口讀取4字節(jié)的數(shù)據(jù) */ val = inl(cardiobae + 0x10)。 /* 將讀取的數(shù)據(jù)傳輸?shù)接脩艨臻g */ return 0。 } /* ... */}事實(shí)上,在demo_fops里還可以實(shí)現(xiàn)諸如demo_read( )、demo_mmap( )等操作,Linux內(nèi)核源碼中的driver目錄里提供了許多設(shè)備驅(qū)動(dòng)程序的源代碼,找那里可以找到類(lèi)似的例子。在對(duì)資源的訪問(wèn)方式上,除了有I/O指令以外,還有對(duì)外設(shè)I/O內(nèi)存的訪問(wèn)。對(duì)這些內(nèi)存的操作一方面可以通過(guò)把I/O內(nèi)存重新映射后作為普通內(nèi)存進(jìn)行操作,另一方面也可以通過(guò)總線主DMA(Bus Master DMA)的方式讓設(shè)備把數(shù)據(jù)通過(guò)DMA傳送到系統(tǒng)內(nèi)存中。 6. 中斷處理模塊PC的中斷資源比較有限,只有0~15的中斷號(hào),因此大部分外部設(shè)備都是以共享的形式申請(qǐng)中斷號(hào)的。當(dāng)中斷發(fā)生的時(shí)候,中斷處理程序首先負(fù)責(zé)對(duì)中斷進(jìn)行識(shí)別,然后再做進(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(amp。cardlock)。 /* 識(shí)別中斷 */ status = inl(cardiobase + GLOB_STA)。 if(!(status amp。 INT_MASK)) { spin_unlock(amp。cardlock)。 return。 /* not for us */ } /* 告訴設(shè)備已經(jīng)收到中斷 */ outl(status amp。 INT_MASK, cardiobase + GLOB_STA)。 spin_unlock(amp。cardlock)。 /* 其它進(jìn)一步的處理,如更新DMA緩沖區(qū)指針等 */}7. 釋放設(shè)備模塊釋放設(shè)備模塊主要負(fù)責(zé)釋放對(duì)設(shè)備的控制權(quán),釋放占用的內(nèi)存和中斷等,所做的事情正好與打開(kāi)設(shè)備模塊相反:static int demo_release(struct inode *inode, struct file *file){ /* ... */ /* 釋放對(duì)設(shè)備的控制權(quán) */ cardopen_mode amp。= (FMODE_READ | FMODE_WRITE)。 /* 喚醒其它等待獲取控制權(quán)的進(jìn)程 */ wake_up(amp。cardopen_wait)。 up(amp。cardopen_sem)。 /* 釋放中斷 */ free_irq(cardirq, card)。 /* 設(shè)備打開(kāi)計(jì)數(shù)增1 */ MOD_DEC_USE_COUNT。 /* ... */ }8. 卸載設(shè)備模塊卸載設(shè)備模塊與初始化設(shè)備模塊是相對(duì)應(yīng)的,實(shí)現(xiàn)起來(lái)相對(duì)比較簡(jiǎn)單,主要是調(diào)用函數(shù)pci_unregister_driver( )從Linux內(nèi)核中注銷(xiāo)設(shè)備驅(qū)動(dòng)程序: static void __exit demo_cleanup_module (void){ pci_unregister_driver(amp。demo_pci_driver)。}回頁(yè)首四、小結(jié)PCI總線不僅是目前應(yīng)用廣泛的計(jì)算機(jī)總線標(biāo)準(zhǔn),而且是一種兼容性最強(qiáng)、功能最全的計(jì)算機(jī)總線。而Linux作為一種新的操作系統(tǒng),其發(fā)展前景是無(wú)法估量的,同時(shí)也為PCI總線與各種新型設(shè)備互連成為可能。由于Linux源碼開(kāi)放,因此給連接到PCI總線上的任何設(shè)備編寫(xiě)驅(qū)動(dòng)程序變得相對(duì)容易。本文介紹如何編譯Linux下的PCI驅(qū)動(dòng)程序。 參考資料 David A Rusling在 The Linux Kernel中對(duì)Linux的PCI子系統(tǒng)進(jìn)行了比較詳細(xì)的介紹。 Linux PCIHOWTO是了解Linux下PCI設(shè)備的最好讀物。 毛德操,胡希明,Linux內(nèi)核源代碼情景分析,杭州:浙江大學(xué)出版社,2001 Alessandro Rubini,,Linux Device Drivers(2nd Edition) USA:O’Reilly,2001 Tomshanley,DonAderson,PCI系統(tǒng)結(jié)構(gòu)(第四版),北京:電子工業(yè)出版社,2000關(guān)于作者肖文鵬,北京理工大學(xué)計(jì)算機(jī)系的一名碩士研究生,主要從事操作系統(tǒng)和分布式計(jì)算環(huán)境的研究,喜愛(ài)Linux和Python。你可以通過(guò) xiaowp@。
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1