Linux操作系統下的PCI驅動(dòng)開(kāi)發(fā)
3.2 設備的打開(kāi)及操作
通過(guò)上述步驟,系統內核就可以發(fā)現并打開(kāi)設備了。設備打開(kāi)模塊中主要完成檢查讀寫(xiě)模式以及申請對設備的控制權等工作。同時(shí)可分配并填private_data數據結構、申請PCI設備I/O資源的占用、申請中斷、注冊中斷處理程序。
Linux是以操作文件的方式來(lái)操作設備的,也就是通過(guò)系統定義的file_operation結構體向Linux文件系統注冊一些操作設備的函數。其file_operation結構體的定義如下:
當應用程序對設備文件進(jìn)行諸如open、close、read、write等操作時(shí),Linux內核將通過(guò)file_operation結構訪(fǎng)問(wèn)驅動(dòng)程序提供的函數。
簡(jiǎn)單的讀寫(xiě)任務(wù)直接用read、write函數就可以完成,而復雜的控制則需要使用ioctl函數。ioctl函數是設備驅動(dòng)程序中對設備的I/O通道進(jìn)行管理的函數,可以對設備的一些特性進(jìn)行控制。因此,為實(shí)現對PCI設備各種I/O資源的訪(fǎng)問(wèn)和實(shí)現不同的傳輸方式,通常都需要使用ioc-tl函數,驅動(dòng)程序的ioctl控制命令差不多完全是用一個(gè)switch語(yǔ)句來(lái)實(shí)現的,可實(shí)現初始化信息的初始化控制、讀寫(xiě)配置空間、讀寫(xiě)I/O端口地址空間、讀寫(xiě)I/O內存空間、DMA傳輸等多種控制操作。
3.3 中斷處理
Linux將中斷處理程序分解為頂半部和底半部?jì)蓚€(gè)半部。驅動(dòng)程序在打開(kāi)設備時(shí),為系統安裝了中斷處理程序,當硬件設備觸發(fā)中斷時(shí),中斷處理程序首先調用頂半部程序以判斷中斷類(lèi)型,對中斷類(lèi)型的判斷可通過(guò)訪(fǎng)問(wèn)PCI設備處理中斷的寄存器來(lái)實(shí)現。當有中斷信號來(lái)臨時(shí),驅動(dòng)程序將中斷處理任務(wù)排進(jìn)任務(wù)隊列中進(jìn)行“登記”并清除中斷標志,這樣做的目的是占用較少的內核時(shí)間,然后再通過(guò)調度底半部來(lái)運行,這樣,內核負責底半部的函數就會(huì )處理任務(wù)隊列中的中斷任務(wù)??梢哉f(shuō),底半部幾乎做了中斷處理程序所有的事情。
驅動(dòng)程序在設備驅動(dòng)對象數據結構中為中斷處理定義了一個(gè)任務(wù)隊列Task_DpcForIsr,并將其rouTIne參數設置為負責底半部的函數,data參數設置為傳遞給底半部函數的參數,這樣,當系統獲得中斷信號時(shí),驅動(dòng)程序就可將中斷處理任務(wù)排進(jìn)該任務(wù)隊列中,以提供給底半部應用。
3.4 釋放設備模塊及卸載
釋放設備模塊主要負責釋放對設備的控制權,同時(shí)釋放所占用的內存和中斷等。具體來(lái)說(shuō),首先是釋放對設備的控制權。即對設備控制權的釋放,這只需簡(jiǎn)單地將控制設備控制權的信號量釋放即可。在Linux下可使用up,其調用形式是up(sem),它可遞增信號量的值,并換醒所有正在等待信號量轉為可用狀態(tài)的進(jìn)程。其次是釋放由open分配的、保存在filp->private_data中的所有內容,將其值設為NULL。接著(zhù)釋放中斷。最后釋放PCI設備I/O資源的占用權。對PCI設備的I/O端口資源而言,實(shí)現I/O端口資源占有權的釋放是通過(guò)release_region函數來(lái)完成的,而對于I/O內存資源,則需要使用iounmap函數同時(shí)釋放其內存映射。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論