Linux操作系統(tǒng)下的PCI驅(qū)動開發(fā)
O 引言
本文引用地址:http://cafeforensic.com/article/150611.htmPCI總線是一種成熟的計算機標準總線,而Linux操作系統(tǒng)則是一種源代碼公開的操作系統(tǒng)。Linux構架完全沿襲了UNIX的系統(tǒng)架構,它不但擁有UNIX的全部功能,而且具有UNIX穩(wěn)定、可靠、安全的優(yōu)點,尤其是Linux加入GNU并遵循公共版權許可證(GPL)之后,幾乎所有的GNU軟件都可以移植到Linux,從而完善和提高了Linux系統(tǒng)的使用性,并逐步成為通信、工業(yè)控制、消費電子等領域的主流操作系統(tǒng)。
本文主要對Linux環(huán)境下開發(fā)PCI9054芯片驅(qū)動的具體方法進行描述,并給出了如何將驅(qū)動程序編譯進內(nèi)核,以使驅(qū)動模塊靜態(tài)加載的方法。
1 PCI9054簡介
PCI總線協(xié)議一般需要繁瑣的邏輯驗證和時序分析工作,而且開發(fā)周期較長,因此,更多的做法是采用通用PCI接口芯片,這樣,只需要控制接口芯片的幾根控制線,就可以完成PCI總線的數(shù)據(jù)傳輸,故可大大減少開發(fā)時間和成本。
PCI9054是由美國PLX公司生產(chǎn)的PCI橋接芯片,該芯片采用先進的PLX流水線結構技術,符合PCI本地總線規(guī)范2.2版,并配有可選的串行EEPROM接口。芯片的本地總線時鐘可與PCI時鐘異步,其內(nèi)部有6種可編程FIFO,可以實現(xiàn)零等待突發(fā)傳輸及本地總線與PCI總線的異步操作,同時支持主模式、從模式、DMA傳輸模式,可廣泛用于嵌入式系統(tǒng)中。
PCI9054的地址資源是由其基址寄存器來設置的,PCI9054的配置空間有六個基址寄存器:BARO~BAR5,其中BARO映射到配置空間的基地址,BARl為映射到I/O空間的基地址,BAR2~BAR5可以定義為映射到內(nèi)存地址空間的基地址。配置空間的內(nèi)容可被Linux核心中的PCI初始化代碼使用,I/O空間和內(nèi)存地址空間可提供給設備驅(qū)動程序使用。
2 Linux下的PCI驅(qū)動程序
Linux將所有外部設備看成是一類特殊文件,即“設備文件”,它可分為兩大類:字符設備和塊設備。字符設備是必須以串行順序依次進行訪問的設備,如觸摸屏、磁帶驅(qū)動器、鼠標等。塊設備則是利用一塊系統(tǒng)內(nèi)存作為緩沖區(qū),以塊為單位進行操作,如硬盤、軟驅(qū)等。字符設備不經(jīng)過系統(tǒng)的快速緩沖,而塊設備則需經(jīng)過系統(tǒng)的快速緩沖。此外,Linux下還存在一類外設,即“網(wǎng)絡設備”,網(wǎng)絡設備主要針對數(shù)據(jù)包的接收和發(fā)送而設計,它并不對應于文件系統(tǒng)的節(jié)點。PCI驅(qū)動通??梢钥醋鲎址O備的驅(qū)動來設計。
Linux的操作過程分為兩個步驟:首先用PCI驅(qū)動將內(nèi)核與設備掛接起來;緊接著通過應用程序來根據(jù)設備文件所屬類型并通過驅(qū)動提供的接口函數(shù)來操作設備。這使得PCI驅(qū)動至少應該包含兩部分內(nèi)容:一是PCI設備驅(qū)動,二是具體設備本身的驅(qū)動。
Linux系統(tǒng)啟動后會自動檢測PCI設備信息,并分別記錄在pci_dev結構體中形成一個PCI設備鏈表pci_devices。這個結構體記錄了PCI設備幾乎所有的硬件信息,包括廠商ID、設備ID、各種資源等,PCI驅(qū)動就是根據(jù)廠商ID和設備ID來連接設備并加載驅(qū)動的。
驅(qū)動加載以后,為了操作設備文件,Linux會在include/linux/fs.h中提供一個數(shù)據(jù)結構file_operaTIons,該數(shù)據(jù)結構可向Linux文件系統(tǒng)注冊一組文件操作,以定義設備提供的諸如open、close、read、write等操作,內(nèi)核則將通過file_operations結構訪問驅(qū)動程序所提供的函數(shù)。
3 PCI9054驅(qū)動的實現(xiàn)
Linux下設備驅(qū)動程序的編寫應遵循一定的框架結構進行,大致可分為模塊的加載與卸載、設備的初始化、設備的打開及操作、中斷處理和設備的釋放等幾部分。
3.1 模塊的加載與初始化
當Linux內(nèi)核啟動時,會完成對所有PCI設備的掃描、登錄和資源分配等初始化操作,并建立起所有PCI設備的拓撲結構,此后,在加載PCI驅(qū)動程序時,就會通過加載驅(qū)動程序模塊入口跳轉到設備初始化模塊。Linux2.4內(nèi)核與Linux2.6內(nèi)核的初始化方式是不同的,在Linux-2.4內(nèi)核中,初始化程序首先會使用pci_present函數(shù)來判斷PCI總線是否被內(nèi)核支持,然后使用register_chrdev函數(shù)來注冊設備,這樣就可以輪詢PCI總線上的設備,并利用pci_find_device函數(shù)檢查設備是否插在總線插槽上。如果在,則保存其所占用的插槽位置信息,并返回pci_dev結構,然后將pci_dev結構加入到設備鏈表中,直到輪詢完畢。圖1所示是Linux下PCI驅(qū)動程序的流程圖。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論