當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]Linux操作系統(tǒng)下的PCI驅(qū)動(dòng)開發(fā)

摘要:以PCI9054為例,介紹了在Linux操作系統(tǒng)下,PCI的驅(qū)動(dòng)過程,同時(shí)針對(duì)Linux內(nèi)核版本2.4,介紹了PCI驅(qū)動(dòng)的靜態(tài)加載方法,最后通過硬件對(duì)該P(yáng)CI驅(qū)動(dòng)程序進(jìn)行了簡(jiǎn)單測(cè)試。
關(guān)鍵詞:Linux;pci9054;靜態(tài)加載

O 引言
    PCI總線是一種成熟的計(jì)算機(jī)標(biāo)準(zhǔn)總線,而Linux操作系統(tǒng)則是一種源代碼公開的操作系統(tǒng)。Linux構(gòu)架完全沿襲了UNIX的系統(tǒng)架構(gòu),它不但擁有UNIX的全部功能,而且具有UNIX穩(wěn)定、可靠、安全的優(yōu)點(diǎn),尤其是Linux加入GNU并遵循公共版權(quán)許可證(GPL)之后,幾乎所有的GNU軟件都可以移植到Linux,從而完善和提高了Linux系統(tǒng)的使用性,并逐步成為通信、工業(yè)控制、消費(fèi)電子等領(lǐng)域的主流操作系統(tǒng)。
    本文主要對(duì)Linux環(huán)境下開發(fā)PCI9054芯片驅(qū)動(dòng)的具體方法進(jìn)行描述,并給出了如何將驅(qū)動(dòng)程序編譯進(jìn)內(nèi)核,以使驅(qū)動(dòng)模塊靜態(tài)加載的方法。

1 PCI9054簡(jiǎn)介
    PCI總線協(xié)議一般需要繁瑣的邏輯驗(yàn)證和時(shí)序分析工作,而且開發(fā)周期較長(zhǎng),因此,更多的做法是采用通用PCI接口芯片,這樣,只需要控制接口芯片的幾根控制線,就可以完成PCI總線的數(shù)據(jù)傳輸,故可大大減少開發(fā)時(shí)間和成本。
    PCI9054是由美國(guó)PLX公司生產(chǎn)的PCI橋接芯片,該芯片采用先進(jìn)的PLX流水線結(jié)構(gòu)技術(shù),符合PCI本地總線規(guī)范2.2版,并配有可選的串行EEPROM接口。芯片的本地總線時(shí)鐘可與PCI時(shí)鐘異步,其內(nèi)部有6種可編程FIFO,可以實(shí)現(xiàn)零等待突發(fā)傳輸及本地總線與PCI總線的異步操作,同時(shí)支持主模式、從模式、DMA傳輸模式,可廣泛用于嵌入式系統(tǒng)中。
    PCI9054的地址資源是由其基址寄存器來(lái)設(shè)置的,PCI9054的配置空間有六個(gè)基址寄存器:BARO~BAR5,其中BARO映射到配置空間的基地址,BARl為映射到I/O空間的基地址,BAR2~BAR5可以定義為映射到內(nèi)存地址空間的基地址。配置空間的內(nèi)容可被Linux核心中的PCI初始化代碼使用,I/O空間和內(nèi)存地址空間可提供給設(shè)備驅(qū)動(dòng)程序使用。

2 Linux下的PCI驅(qū)動(dòng)程序
    Linux將所有外部設(shè)備看成是一類特殊文件,即“設(shè)備文件”,它可分為兩大類:字符設(shè)備和塊設(shè)備。字符設(shè)備是必須以串行順序依次進(jìn)行訪問的設(shè)備,如觸摸屏、磁帶驅(qū)動(dòng)器、鼠標(biāo)等。塊設(shè)備則是利用一塊系統(tǒng)內(nèi)存作為緩沖區(qū),以塊為單位進(jìn)行操作,如硬盤、軟驅(qū)等。字符設(shè)備不經(jīng)過系統(tǒng)的快速緩沖,而塊設(shè)備則需經(jīng)過系統(tǒng)的快速緩沖。此外,Linux下還存在一類外設(shè),即“網(wǎng)絡(luò)設(shè)備”,網(wǎng)絡(luò)設(shè)備主要針對(duì)數(shù)據(jù)包的接收和發(fā)送而設(shè)計(jì),它并不對(duì)應(yīng)于文件系統(tǒng)的節(jié)點(diǎn)。PCI驅(qū)動(dòng)通常可以看做字符設(shè)備的驅(qū)動(dòng)來(lái)設(shè)計(jì)。
    Linux的操作過程分為兩個(gè)步驟:首先用PCI驅(qū)動(dòng)將內(nèi)核與設(shè)備掛接起來(lái);緊接著通過應(yīng)用程序來(lái)根據(jù)設(shè)備文件所屬類型并通過驅(qū)動(dòng)提供的接口函數(shù)來(lái)操作設(shè)備。這使得PCI驅(qū)動(dòng)至少應(yīng)該包含兩部分內(nèi)容:一是PCI設(shè)備驅(qū)動(dòng),二是具體設(shè)備本身的驅(qū)動(dòng)。
    Linux系統(tǒng)啟動(dòng)后會(huì)自動(dòng)檢測(cè)PCI設(shè)備信息,并分別記錄在pci_dev結(jié)構(gòu)體中形成一個(gè)PCI設(shè)備鏈表pci_devices。這個(gè)結(jié)構(gòu)體記錄了PCI設(shè)備幾乎所有的硬件信息,包括廠商ID、設(shè)備ID、各種資源等,PCI驅(qū)動(dòng)就是根據(jù)廠商ID和設(shè)備ID來(lái)連接設(shè)備并加載驅(qū)動(dòng)的。
    驅(qū)動(dòng)加載以后,為了操作設(shè)備文件,Linux會(huì)在include/linux/fs.h中提供一個(gè)數(shù)據(jù)結(jié)構(gòu)file_operations,該數(shù)據(jù)結(jié)構(gòu)可向Linux文件系統(tǒng)注冊(cè)一組文件操作,以定義設(shè)備提供的諸如open、close、read、write等操作,內(nèi)核則將通過file_operations結(jié)構(gòu)訪問驅(qū)動(dòng)程序所提供的函數(shù)。

3 PCI9054驅(qū)動(dòng)的實(shí)現(xiàn)
    Linux下設(shè)備驅(qū)動(dòng)程序的編寫應(yīng)遵循一定的框架結(jié)構(gòu)進(jìn)行,大致可分為模塊的加載與卸載、設(shè)備的初始化、設(shè)備的打開及操作、中斷處理和設(shè)備的釋放等幾部分。[!--empirenews.page--]
3.1 模塊的加載與初始化
    當(dāng)Linux內(nèi)核啟動(dòng)時(shí),會(huì)完成對(duì)所有PCI設(shè)備的掃描、登錄和資源分配等初始化操作,并建立起所有PCI設(shè)備的拓?fù)浣Y(jié)構(gòu),此后,在加載PCI驅(qū)動(dòng)程序時(shí),就會(huì)通過加載驅(qū)動(dòng)程序模塊入口跳轉(zhuǎn)到設(shè)備初始化模塊。Linux2.4內(nèi)核與Linux2.6內(nèi)核的初始化方式是不同的,在Linux-2.4內(nèi)核中,初始化程序首先會(huì)使用pci_present函數(shù)來(lái)判斷PCI總線是否被內(nèi)核支持,然后使用register_chrdev函數(shù)來(lái)注冊(cè)設(shè)備,這樣就可以輪詢PCI總線上的設(shè)備,并利用pci_find_device函數(shù)檢查設(shè)備是否插在總線插槽上。如果在,則保存其所占用的插槽位置信息,并返回pci_dev結(jié)構(gòu),然后將pci_dev結(jié)構(gòu)加入到設(shè)備鏈表中,直到輪詢完畢。圖1所示是Linux下PCI驅(qū)動(dòng)程序的流程圖。


3.2 設(shè)備的打開及操作
    通過上述步驟,系統(tǒng)內(nèi)核就可以發(fā)現(xiàn)并打開設(shè)備了。設(shè)備打開模塊中主要完成檢查讀寫模式以及申請(qǐng)對(duì)設(shè)備的控制權(quán)等工作。同時(shí)可分配并填private_data數(shù)據(jù)結(jié)構(gòu)、申請(qǐng)PCI設(shè)備I/O資源的占用、申請(qǐng)中斷、注冊(cè)中斷處理程序。
    Linux是以操作文件的方式來(lái)操作設(shè)備的,也就是通過系統(tǒng)定義的file_operation結(jié)構(gòu)體向Linux文件系統(tǒng)注冊(cè)一些操作設(shè)備的函數(shù)。其file_operation結(jié)構(gòu)體的定義如下:

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

4 Linux下驅(qū)動(dòng)模塊的加載
    Linux下驅(qū)動(dòng)程序模塊的加載通常有靜態(tài)加載和動(dòng)態(tài)加載兩種方式。動(dòng)態(tài)加載是利用Linux的module特性,在系統(tǒng)啟動(dòng)后使用insmode命令把驅(qū)動(dòng)程序(.o文件)添加上去,然后通過rmmod命令卸載,這種加載方式有利于程序的調(diào)試,可以隨時(shí)更改;靜態(tài)加載就是把驅(qū)動(dòng)程序直接編譯到內(nèi)核里,在系統(tǒng)啟動(dòng)后直接調(diào)用,顯然這種方式對(duì)于調(diào)試階段的程序比較麻煩,而且效率較低,因而只適用于最終版本的程序。因此,程序開發(fā)者通常先用動(dòng)態(tài)加載方式來(lái)調(diào)試,調(diào)試完畢后,再編譯到內(nèi)核里使用。
    靜態(tài)加載時(shí),通常先把驅(qū)動(dòng)程序原文件放在內(nèi)核驅(qū)動(dòng)相應(yīng)類型的文件夾下,這里的PCI驅(qū)動(dòng)屬于字符類型, 可拷貝到…\linux-2.4.x\drivers\char下。然后再更改…\linux-2.4.x\drivers\char\Makefile文件,并添加如下語(yǔ)句:

    這樣做的目的是根據(jù)編譯選項(xiàng)$( CON-FIG_PLX9054)來(lái)決定是否要添加設(shè)備驅(qū)動(dòng)。
    之后,再在…\linux-2.4.x\drivers\char\Config.in中添加語(yǔ)句
    tristate’PLX9054 Support’CONFIG_PLX9054,這樣就可以在運(yùn)行menuconfig時(shí)產(chǎn)生與設(shè)備對(duì)應(yīng)的編譯選項(xiàng),圖2所示是其編譯選項(xiàng)界面圖。圖中,在前面的尖括號(hào)中點(diǎn)Y表示靜態(tài)加載,點(diǎn)M表示作為模塊動(dòng)態(tài)加載。


    最后,運(yùn)行make menuconfig,剪切內(nèi)核,并選中需要的模塊所對(duì)應(yīng)的編譯選項(xiàng),編譯內(nèi)核。

5 驅(qū)動(dòng)程序的測(cè)試
    由于所編寫的驅(qū)動(dòng)程序是在PLX官方驅(qū)動(dòng)的基礎(chǔ)上得來(lái)的,因此,在這里,為了方便測(cè)試起見,也應(yīng)使用PLX公司的SDK包中的測(cè)試程序來(lái)
查看PCI9054的配置情況,圖3所示為五個(gè)基址寄存器的映射情況。圖4所示為公共緩沖區(qū)的映射情況示意圖。

6 結(jié)束語(yǔ)
    本文首先介紹了在Linux下開發(fā)PCI驅(qū)動(dòng)的方法,然后介紹了如何將驅(qū)動(dòng)靜態(tài)編譯到內(nèi)核,這種方法非常適用于開發(fā)以Linux作為嵌入式系統(tǒng)的驅(qū)動(dòng)程序。可以看出,由于Linux系統(tǒng)完全開源,其驅(qū)動(dòng)程序較Windows下的驅(qū)動(dòng)程序簡(jiǎn)單易懂,框架感更強(qiáng)。此外,由于其具有豐富的開源資源,故其開發(fā)成本較低。因此,我們有理由相信,Linux在未來(lái)的操作系統(tǒng)市場(chǎng)中的地位會(huì)變得越來(lái)越重要。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉