一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Linux操作系統(tǒng)下的PCI驅(qū)動(dòng)開發(fā)

 迎風(fēng)初開 2014-02-06

  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簡介

  PCI總線協(xié)議一般需要繁瑣的邏輯驗(yàn)證和時(shí)序分析工作,而且開發(fā)周期較長,因此,更多的做法是采用通用PCI接口芯片,這樣,只需要控制接口芯片的幾根控制線,就可以完成PCI總線的數(shù)據(jù)傳輸,故可大大減少開發(fā)時(shí)間和成本。

  PCI9054是由美國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的地址資源是由其基址寄存器來設(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)通??梢钥醋鲎址O(shè)備的驅(qū)動(dòng)來設(shè)計(jì)。

  Linux的操作過程分為兩個(gè)步驟:首先用PCI驅(qū)動(dòng)將內(nèi)核與設(shè)備掛接起來;緊接著通過應(yīng)用程序來根據(jù)設(shè)備文件所屬類型并通過驅(qū)動(dòng)提供的接口函數(shù)來操作設(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)檢測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來連接設(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è)備的釋放等幾部分。

  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ù)來判斷PCI總線是否被內(nèi)核支持,然后使用register_chrdev函數(shù)來注冊(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)程序的流程圖。

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是以操作文件的方式來操作設(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ù)。

  簡單的讀寫任務(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語句來實(shí)現(xiàn)的,可實(shí)現(xiàn)初始化信息的初始化控制、讀寫配置空間、讀寫I/O端口地址空間、讀寫I/O內(nèi)存空間、DMA傳輸?shù)榷喾N控制操作。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    九九热最新视频免费观看| 亚洲成人免费天堂诱惑| 国产又粗又猛又大爽又黄同志| 九九热这里只有精品哦| 欧美性猛交内射老熟妇| 人妻一区二区三区在线| 中文字幕日韩无套内射| 欧美一级黄片欧美精品| 国产成人亚洲精品青草天美| 神马午夜福利一区二区| 国产色偷丝袜麻豆亚洲| 久久国产精品亚州精品毛片| 国产午夜精品福利免费不| 婷婷色香五月综合激激情| 老司机精品一区二区三区| 精品人妻av区波多野结依 | 日本精品啪啪一区二区三区| 好吊日视频这里都是精品| 精品欧美日韩一二三区 | 99国产成人免费一区二区| 亚洲欧美视频欧美视频| 久久亚洲精品中文字幕| 亚洲一区二区欧美在线| 日韩欧美综合中文字幕| 又色又爽又黄的三级视频| 视频一区中文字幕日韩| 好吊色免费在线观看视频| 精品少妇一区二区视频| 精品一区二区三区不卡少妇av| 久久国产亚洲精品成人| 五月情婷婷综合激情综合狠狠| 亚洲国产一区精品一区二区三区色| 激情五月天免费在线观看| 国产精品乱子伦一区二区三区| 日本免费一级黄色录像| 黄片免费观看一区二区| 亚洲专区中文字幕视频| 亚洲欧洲一区二区中文字幕| 久热香蕉精品视频在线播放| 亚洲国产av在线观看一区| 99热九九在线中文字幕|