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