国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Linux下無配置信息PCI設(shè)備的驅(qū)動開發(fā)

發(fā)布時間:2010-6-19 18:25    發(fā)布者:zealot
關(guān)鍵詞: linux , PCI , 驅(qū)動開發(fā)
0 引言

Linux是非常優(yōu)秀的開源操作系統(tǒng),有著十分廣泛的應用。基于該操作系統(tǒng)設(shè)備驅(qū)動程序的需求越來越多。PCI作為一種廣泛采用的總線標準,在嵌入式系統(tǒng)中正被大量使用,而Linux的內(nèi)核也能很好地支持PCI設(shè)備。為此,本文介紹了Linux下無配置信息PCI設(shè)備驅(qū)動程序的設(shè)計開發(fā)方法。

1 PCI總線及無配置信息PCI設(shè)備

1.1 PCI總線

PCI是外圍設(shè)備互連(Peripheral ComponentInterconnect)的簡稱,是一種通用的總線接口標準,原先是應用于計算機系統(tǒng)的。PCI提供了一組完整的總線接口規(guī)范,其目的是描述如何將計算機系統(tǒng)中的外圍設(shè)備以一種結(jié)構(gòu)化和可控化的方式連接在一起。該規(guī)范同時詳細定義了計算機系統(tǒng)中各個不同部件之間應該如何正確地進行交互。在一般的計算機系統(tǒng)中,總線子系統(tǒng)與存儲子系統(tǒng)被PCI總線分開,CPU通過一塊稱為PCI橋的設(shè)備來完成同總線子系統(tǒng)的交互,圖1所示是一個PCI子系統(tǒng)的體系結(jié)構(gòu)。


盡管目前PCI設(shè)備大多采用32位數(shù)據(jù)總線,但PCI規(guī)范中已經(jīng)給出了64位的擴展實現(xiàn)方案,從而使PCI總線能夠更好地實現(xiàn)平臺無關(guān)性。雖然PCI總線是由Intel公司提出的,但它不局限于Intel系列的處理器。當今流行的其它處理器系列如Alpha、PowerPC、APARC,以及多處理器結(jié)構(gòu)的下一代處理器都可以使用PCI總線。具體而言,PCI總線包含的特點可簡要描述為高性能、線性突發(fā)傳輸、極小的存取延誤、采用總線主控和同步操作、獨立于處理器、兼容性強、預留了發(fā)展空間、低成本、高效益、軟件透明等等。

1.2 PCI設(shè)備的配置空間

標準的PCI設(shè)備上有三種地址空間:I/O空間、存儲空間及配置空間。CPU可以訪問PCI設(shè)備上的所有地址空間,其中I/O空間和存儲空間提供給設(shè)備驅(qū)動程序使用,主要用來實現(xiàn)PCI設(shè)備和Linux內(nèi)核中設(shè)備驅(qū)動程序之間的通訊。而配置空間則裝載著PCI設(shè)備的配置信息,主要由Linux內(nèi)核中的PCI初始化代碼使用。PCI設(shè)備的配置信息空間如圖2所示。


標準PCI設(shè)備配置信息空間的大小為256個字節(jié),其中低64個字節(jié)稱為頭標區(qū),這部分區(qū)域的格式是固定的。內(nèi)容包括PCI設(shè)備號、廠商識別號、命令寄存器、狀態(tài)寄存器、基址寄存器等重要信息;其余的192個字節(jié)稱為設(shè)備有關(guān)區(qū),不同的設(shè)備可以對這部分寄存器進行不同的定義。

1.3 無配置信息的PCI設(shè)備

目前的嵌人式系統(tǒng)往往會要求CPU和專用數(shù)據(jù)運算器之間以很高的速率通信。由于現(xiàn)行的總線規(guī)范中,PCI的高性能是最為突出的,因此PCI總線的連接方式被大量采用。數(shù)據(jù)運算器往往是針對某一系統(tǒng)設(shè)計的,通常會采用FPGA設(shè)計。即在FPGA中添加進PCI的接口設(shè)計,也就是把FPGA設(shè)計成為一塊PCI設(shè)備。但是由于嵌入式系統(tǒng)的局限性,在某些FPGA的PCI接口設(shè)計中不能劃分配置信息空間(I/O空間和存儲空間是設(shè)備與CPU信息交互的基礎(chǔ),是必須存在的),因此這個設(shè)計也就是一塊無配置信息的PCI設(shè)備。

2 Linux設(shè)備驅(qū)動程序

Linux的設(shè)備驅(qū)動程序大致可以分為驅(qū)動程序的注冊與注銷、設(shè)備的打開與釋放、設(shè)備的讀寫操作、設(shè)備的控制操作、設(shè)備的中斷和輪詢處理幾個部分。

2.1 設(shè)備的注冊與注銷

向系統(tǒng)增加一個驅(qū)動程序就要賦予它一個主設(shè)備號,這一賦值過程應該在驅(qū)動程序的初始化中完成,它通過調(diào)用函數(shù)register_chrdev()或reg-iste_blkdev ()向內(nèi)核注冊。接下來就是給程序一個設(shè)備驅(qū)動程序名,這個名字必須插入到/dev目錄中,并與驅(qū)動程序的主設(shè)備號和次設(shè)備號相連。獲得主設(shè)備號的方法是選擇一個當前不用的設(shè)備號,或者在調(diào)用register_chrdev時讓參數(shù)ma-jor為0,這樣,其返回值便是設(shè)備的主設(shè)備號。另外,在關(guān)閉字符設(shè)備或塊設(shè)備時,還需要通過unregisler_chrdev()或unregister_blkdev()從內(nèi)核中注銷設(shè)備,并釋放主設(shè)備號。

2.2 設(shè)備的打開與釋放

打開設(shè)備可由open()完成。在大部分驅(qū)動程序中,open主要用于檢查設(shè)備相關(guān)錯誤(如設(shè)備尚未準備好等)、識別次設(shè)備號(如有必要更新當前read/write位置f_ops指針),以及分配和填寫要放在file->private_data里的數(shù)據(jù)結(jié)構(gòu)。

釋放設(shè)備由release()完成,release的作用與open相反,主要是釋放file->private_data中open分配的內(nèi)存,并在最后一次關(guān)閉操作時關(guān)閉設(shè)備。

2.3 設(shè)備的讀寫操作

字符設(shè)備使用各自的read()和write ()來對設(shè)備進行數(shù)據(jù)讀寫。塊設(shè)備則使用通用block_read()和block_write()來對設(shè)備進行數(shù)據(jù)讀寫。這兩個通用函數(shù)可以向請求表中增加讀寫請求,這樣,內(nèi)核就可以優(yōu)化請求順序。由于是對內(nèi)存緩沖區(qū)而不是對設(shè)備進行操作,因而能加快讀寫請求。如果內(nèi)存緩沖區(qū)內(nèi)沒有要讀入的數(shù)據(jù)或者需要將寫請求寫入設(shè)備,那么就需要真正地執(zhí)行數(shù)據(jù)傳輸。

2.4 設(shè)備的控制操作和中斷處理

除了讀寫操作外,有時還需要控制設(shè)備。這在操作時可以通過設(shè)備驅(qū)動程序中的ioctl()來完成。另外,對于不支持中斷的設(shè)備,讀寫時需要輪流查詢設(shè)備狀態(tài),以決定是否繼續(xù)進行數(shù)據(jù)傳輸。如果設(shè)備支持中斷,則可按中斷方式進行。

3 無配置信息PCI設(shè)備驅(qū)動程序的設(shè)計

無配置信息PCI設(shè)備驅(qū)動程序設(shè)計的關(guān)鍵在于初始化,其余部分與標準PCI設(shè)備驅(qū)動差別不大。其初始化的方法有兩種:一是選用外接的EEPROM來存儲該設(shè)備的配置信息;二是直接在驅(qū)動程序的探測模塊里注冊設(shè)備。

用外接EEPROM配置方式時,內(nèi)核啟動后會檢測EEPROM,然后讀出其中的配置信息,并將設(shè)備的信息注冊到pci dev里。

在實際的系統(tǒng)應用中,如果無法外接EEP-ROM,就必須直接在驅(qū)動程序的探測模塊里注冊設(shè)備。在這種方式下,若系統(tǒng)中沒有其它的即插即用PCI設(shè)備,則可能會導致檢測設(shè)備失敗,但事實上已經(jīng)注冊了該PCI設(shè)備,因此完全可以正常運行。

筆者開發(fā)的嵌入式TDMA衛(wèi)星通信系統(tǒng)中的CPU采用MPC8250芯片,基帶信號處理模塊采用Xilinx公司的X3SC4000(FG676)。MPC8250是Mo-torola公司開發(fā)的一款PowerPC系列嵌入式處理器,該處理器中有32位超標量體系結(jié)構(gòu)Power-PC603e處理器內(nèi)核,并集成有PCI橋、PCI仲裁器、存儲器控制器等部件。FPGA的設(shè)計中則包括PCI接口、sdram控制器及編碼調(diào)制運算模塊。

此操作系統(tǒng)采用Linux,內(nèi)核版本為2.6。由于Linux能很好地支持PCI總線,本設(shè)計在CPU和FPGA之間采用了PCI總線連接方式。由于FPGA的設(shè)計要求,PCI總線的中斷信號未被使用,而是另行設(shè)定了兩條中斷信號線通往MPC8250的通用設(shè)計口。該系統(tǒng)支持FPGA中bin文件的實時更新,因此沒有采用配置EPROM來配置FPGA,而是把要下載到FPGA里的bin文件同Uboot、Linux內(nèi)核及jffs2文件系統(tǒng)一起放在了FLASH里,然后通過MPC8250提供的SPI總線下載到FPGA中。實際上,如需要更新FPGA的.bin文件,則可通過以太網(wǎng)口將文件拷入FLASH中再下載。

在系統(tǒng)上電啟動后,由于Linux內(nèi)核先于jffs2解壓,而FPGA的文件又必須在jffs2解壓完后才能釋放到內(nèi)核空間,然后再借助SPI總線下載到FP-GA中,因此無法在FPGA中創(chuàng)建PCI設(shè)備配置信息空間,所以,本設(shè)計采用在檢測PCI設(shè)備時直接注冊的方法。

3.1 驅(qū)動程序的總體框架

下面是筆者驅(qū)動的整體框架,從中可以很明顯地看出幾個模塊是如何聯(lián)系起來的:


3.2 具體模塊的實現(xiàn)

由于本系統(tǒng)沒有采用標準PCI總線提供的中斷信號,因此驅(qū)動程序中無中斷處理模塊,下面著重介紹對本設(shè)計比較重要的初始化設(shè)備過程以及打開設(shè)備模塊、讀寫模塊的設(shè)計方法。

(1) 初始化設(shè)備過程

初始化設(shè)備過程也是本系統(tǒng)PCI設(shè)備驅(qū)動中最為關(guān)鍵的部分。由于本系統(tǒng)中允許PCI總線掛接其它的即插即用設(shè)備,因此,這部分程序還需要保留。其部分代碼及注釋如下:


在2.4之前的內(nèi)核版本中,需要手動調(diào)用pci_find_device()函數(shù)來查找PCI設(shè)備,但在2.4版本后,則可以調(diào)用probe探測函數(shù)來完成對硬件的檢測及信息獲取工作。其部分代碼如下:


在獲取的PCI信息子函數(shù)pci_rewin_pci_re-sources_claim()和注冊設(shè)備子函數(shù)pci_rewin_de-vice_register()里,筆者自己創(chuàng)建的PCI設(shè)備信息可以寫人到pci_dev,然后由Liunx內(nèi)核通過pci_register_drivet ()將此PCI設(shè)備信息創(chuàng)建在PCI設(shè)備列表中。

(2) 打開設(shè)備模塊

打開設(shè)備模塊主要用來檢查設(shè)備號、開辟PCI總線映射空間。打開設(shè)備模塊的部分代碼及注釋如下:


(3) 讀寫模塊

讀操作就是先通過memcpy_fromio函數(shù)將PCI上傳來的數(shù)據(jù)搬移到內(nèi)核空間中的接收緩沖區(qū),再用copy_to_user搬移到用戶數(shù)據(jù)空間。接收緩沖區(qū)和接收數(shù)據(jù)散列表都要在初始化模塊中進行處理。讀操作的部分代碼及注釋如下:


寫操作與讀操作正好相反,它先通過copy_from_user函數(shù)將用戶空間的數(shù)據(jù)搬移到內(nèi)核空間中的發(fā)送緩沖區(qū),再通過memcpy函數(shù)搬移到PCI總線上。由于發(fā)送的數(shù)據(jù)長度是可變的,所以每次發(fā)送都需要構(gòu)造不同的發(fā)送散列表(發(fā)送緩沖區(qū)可以再初始化時分配)。寫操作的代碼與讀操作類似,故此省略。

值得注意的是,在PCI設(shè)備用I/O方式讀寫的時候,CPU將被迫停止工作以等待PCI設(shè)備完成此操作,且每次只允許一個設(shè)備訪問。這個策略不利于提升系統(tǒng)性能。但利用MPC8250芯片提供的DMA(直接內(nèi)存訪問)機制則可大大提高PCI總線的性能,這也是筆者下一步需要改進的地方。

4 結(jié)束語

本文討論了Linux2.6版本下開發(fā)設(shè)備驅(qū)動程序的原理和相關(guān)知識。著重介紹了無配置信息PCI設(shè)備驅(qū)動程序的開發(fā)方法。該驅(qū)動開發(fā)方法可成功應用于嵌入式TDMA衛(wèi)星通信系統(tǒng)。測試證明:本系統(tǒng)可穩(wěn)定有效工作。今后的工作將著重是提升系統(tǒng)性能并進行改進。
本文地址:http://www.qingdxww.cn/thread-13281-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責;文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
  • 我們是Microchip
  • Cortex-M4外設(shè) —— TC&TCC結(jié)合事件系統(tǒng)&DMA優(yōu)化任務(wù)培訓教程
  • 利用模擬開發(fā)工具生態(tài)系統(tǒng)進行安全電路設(shè)計
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲高清在线观看看片 | 亚洲一级免费毛片 | 在线成人免费观看国产精品 | 韩国福利高清 免费 | 成人午夜无人区一区二区 | 精品视频在线播放 | 成人午夜国产福到在线 | 国产免费麻豆 | 亚洲综合在线视频 | 欧美视频在线观看视频 | 日本中文字幕一区 | 国产成人夜色91 | 欧美日韩国产一区二区三区 | 国产aaa伦理片 | 99久久精品免费看国产一区二区 | 一级做a爰片久久毛片图片 一级做a爰片久久毛片人呢 | 日韩欧美色视频在线观看 | 国产成人a v在线影院 | 精品国产欧美一区二区 | 家庭教师动漫 | 欧美男人天堂网 | 国产精品永久在线 | 向日葵视频app在线观看 | 久久久久久国产精品三级 | 一级欧美一级日韩 | 亚洲国产精品一区二区三区久久 | 青青自拍视频一区二区三区 | 91麻豆精品激情在线观看最新 | 国产日韩久久久精品影院首页 | 国内精品久久久久久久999下 | 涩999| 免费永久在线观看污污的网站 | 亚洲自拍p | 久久观看视频 | 一级毛片免费全部播放完整 | 91av小视频| 天堂成人在线 | 99久久精品国产一区二区三区 | 日韩一区二区三区在线免费观看 | 黄色日b视频 | 欧洲性大片xxxxx久久久 |