關(guān) 閉

新聞中心

EEPW首頁 > 工控自動化 > 設(shè)計應(yīng)用 > 簡化PCI總線協(xié)議的實現(xiàn)以及FPGA驅(qū)動設(shè)計

簡化PCI總線協(xié)議的實現(xiàn)以及FPGA驅(qū)動設(shè)計

作者: 時間:2009-02-19 來源:網(wǎng)絡(luò) 收藏

  地址譯碼模塊主要檢測地址與本卡的基地址是否匹配,可以通過AD[31:00]信號線上的值與設(shè)備的基地址作比較判斷。如果地址落在設(shè)置的基地址范圍內(nèi),則PCI卡響應(yīng)當前的總線操作。

  命令譯碼模塊指示PCI卡響應(yīng)不同的總線命令,通過檢測C/BE[3:0]#信號線上的值,與表1列出的總線命令作比較,完成命令譯碼。

3 Windows9x系統(tǒng)下驅(qū)動程序的設(shè)計

  對PCI設(shè)備而言,驅(qū)動程序提供了獲取PCI卡的配置空間信息、勾掛PCI中斷、總線數(shù)據(jù)傳輸?shù)裙δ?。本文介紹使用Numega公司的VtooIsD軟件進行的方法。

  3.1 尋找PCI卡并讀取配置空間信息

  配置空間包含了系統(tǒng)初始化PCI設(shè)備所必需的信息,首先需要遍歷整個硬件樹結(jié)構(gòu)來尋找指定的PCI設(shè)備。對于每一個設(shè)備,比較其廠商號(Vendor ID)和設(shè)備編號(Device ID),如果與設(shè)計的PCI卡的信息匹配,則讀取它的配置空間信息。

  3.2 I/O方式下的讀寫操作

  I/O方式下的讀寫比較簡單。在得到PCI設(shè)備基地址信息后,通過C++語言中的端口讀寫函數(shù)inpd和outpd即可完成。舉例如下:

  Temp=_inpd(gBaseAddresses);//Temp中得到讀出的數(shù)據(jù)

  _outpd(gBaseAddresses,Data);//向基地址寫入數(shù)據(jù)

  其中,gBaseAddresses為基地址值,Data為寫操作時的數(shù)據(jù)。

  3.3 內(nèi)存方式下的讀寫

  對于內(nèi)存方式下的讀寫,一個重要問題就是地址的映射。因為硬件設(shè)備讀寫的是物理內(nèi)存,但應(yīng)用程序讀寫的是虛擬地址,所以存在著將物理內(nèi)存地址映射到用戶程序線性地址的問題。

  映射功能通過調(diào)用VtoolsD軟件的標準庫函數(shù)完成。根據(jù)給定的物理地址和所要求的空間大小,在系統(tǒng)內(nèi)存中分配相應(yīng)空間。首先,用PageReserve函數(shù)分配當前保留頁的線性地址空間,再利用PageCommitPhys函數(shù)的服務(wù)對開始的線性地址空間分配相應(yīng)的物理地址空間。程序如下:

ULONG nPages=_NPAGES_(PhysAddress,SizeInByte);
Linear=PageReserve(PR_SYSTEM,nPages,PR_FIXED);
PageCommitPhys(PAGENUM(Linear),nPages,PAGENUM
(PhysAddress),PC_INCR|PC_WRITEABLE|PC_USER);
LinPageLock(PAGENUM(Linear),nPages,0);

  其中,PhysAddress為給定的物理地址,SizeInBytes為需要的空間大小。

  建立了物理RAM到系統(tǒng)內(nèi)存的映射后,就可以利用C++語言中的文件操作基類CFile類完成數(shù)據(jù)的讀寫。首先使用CFile類的成員函數(shù)Open打開文件,為保證數(shù)據(jù)讀寫的準確無誤,必須使用二進制方式打開;接下來使用Read和Write成員函數(shù)進行文件讀寫;完畢后用Close成員函數(shù)關(guān)閉文件。

  3.4 中斷的勾掛和處理

  首先在ON_DEVICE_INIT函數(shù)中完成中斷的初始化。即通過前面讀取的PCI設(shè)備的中斷號,使用VPICD_Virtualize_IRQ函數(shù)進行中斷勾掛,外調(diào)用VPICD_Physically_Unmask函數(shù)開中斷。

  RTCIRQHandle=VPICD_Virtualize_IRQ(IRQdesc);

  VPICD_Physically_Unmask(RTCIRQHandle);

  然后在RTCInt_Handler函數(shù)中進行中斷處理,可以進行各種操作,例如向應(yīng)用程序發(fā)送自定義的消息來通知中斷的發(fā)生。

3.5 與應(yīng)用程序的通信

  一般地,應(yīng)用程序通過CreateFile函數(shù)調(diào)用VxD驅(qū)動程序,得到一個VxD的文件句柄。使用如下的語句可以打開一個名為mydriver.VXD的文件,得到的句柄保存在hVxD中。

  hVxD=CreateFile(.mydriver.VXD,0,0,0,CREATE-NEW,FILE-FLAG-DELETE-ON-CLOSE,0);

  通過句柄hVxD和DeviceIoControl函數(shù)就可以與驅(qū)動程序進行數(shù)據(jù)傳輸。

  本文采用ALTERA公司的FLEX6000系列芯片,型號為EPF6016TC144-3,實現(xiàn)了簡化的從設(shè)備模式PCI協(xié)議,并在Windows9x系統(tǒng)下實現(xiàn)驅(qū)動程序的設(shè)計。整個系統(tǒng)工作良好。資源占用情況如下:可用I/O引腳113根,占用51根,占用率45%;可用邏輯單元數(shù)1320個,占用151個,占用率11%。

  簡化的PCI協(xié)議的實現(xiàn)占用較少的邏輯資源,可以靈活方便地進行功能添加和改進,同時可以在同一塊芯片中集成其他用戶模塊,實現(xiàn)不同功能,以降低成本。目前,本系統(tǒng)已經(jīng)應(yīng)用在數(shù)據(jù)采集處理、圖像處理等方面。


上一頁 1 2 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉