999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于WDF的PCI-CAN設備驅動程序設計

2013-11-05 06:43:20黎順杰張艷榮
電子測試 2013年5期
關鍵詞:設備系統

黎順杰 張艷榮

(西南交通大學機械工程學院,成都 610031)

設備驅動程序是硬件設備連接到計算機操作系統的軟件接口,驅動程序的好壞直接影響到硬件的運行與系統的安全。所以,穩(wěn)定高效的驅動程序對于設備硬件的開發(fā)具有重要的意義。

1 PCI-CAN卡系統架構

本文所述驅動程序是基于自行研發(fā)的PCI-CAN總線設備,該設備的系統結構框圖如圖1所示:

圖1 PCI-CAN設備硬件結構框圖

系統是在S1300 PCI開發(fā)平臺上利用硬件描述語言(Verilog HDL)實現,核心芯片采用的是ALTERA公司CYCLONE2 FPGA系列的EP2C5Q208C8。通過使用開發(fā)平臺內部集成的PCI總線控制器模塊,可實現符合PCI總線協議的數據傳輸。PCICAN總線設備的工作流程如下:計算機通過IO端口寫控制命令到控制寄存器模塊,控制寄存器模塊接收指令并初始化CAN總線控制器,如果是讀CAN指令,控制寄存器模塊將CAN總線上傳的數據緩存到 SDRAM,利用 DMA(Direct Memory Access)方式寫入主機內存,由主機進行相應的處理;如果是寫CAN指令,計算機將數據通過內存映射寫入FIFO,控制寄存器模塊控制CAN(Controller Area Network)總線控制器從FIFO中取出數據。在整個系統流程中,驅動程序實現了應用程序與硬件之間的控制引導,作用不可取代。

2 WDF驅動程序設計

2.1 WDF驅動程序框架

WDF驅動程序框架中,所有的事物都由對象來表示,所有操作都被定義為一個事件(Event)或回調(Callback)。基于對象技術的WDF實現了驅動程序與操作系統內核之間的分離,驅動程序通過框架內定義的對象與方法來實現自己的功能,具體的驅動程序與操作系統內核的交互工作則交給框架內封裝的方法(函數)完成。這樣使得驅動程序的設計變得更加簡單明了。

WDF 之中包含了 KMDF(Kernel-Mode Driver Framework)與UMDF(User-Mode Driver Framework),本文所涉及的設備驅動程序開發(fā)是基于KDMF實現的。

2.2 設備驅動程序開發(fā)

PCI-CAN設備驅動程序結構框架如圖2所示:

圖2 PCI-CAN設備驅動程序結構框圖

PCI-CAN設備驅動程序設計從功能上可分為設備初始化、控制設置與數據交換三個部分。設備初始化主要實現設備識別、相關信息狀態(tài)獲取與硬件資源分配;控制設置負責系統初始化與啟動;數據交換處理的是設備功能的具體應用,即PCI總線與CAN總線之間的數據傳輸。

從本質上來說,WDF驅動程序就是入口函數DriverEntry與事件函數及其子函數的集合。操作系統第一次裝載驅動程序時會調用DriverEntry例程以完成驅動程序初始化。不同類型的驅動函數其DriverEntry也不同,可分為設備驅動、過濾驅動與純軟件驅動。本文所述驅動程序屬于設備驅動,在入口函數DriverEntry中,除了創(chuàng)建和初始化WDFDRIVER對象,還需要注冊EvtDriverDeviceAdd事件回調。

status=WdfDriverCreate(DriverObject,RegistryPat h,……);

//創(chuàng)建WDFDRIVER對象

WDF_DRIVER_CONFIG_INIT(&config,PCICAN_EvtDeviceAdd);//注冊EvtDriverDeviceAdd事件回調

(1)設備初始化

驅動程序成功初始化后,操作系統會順序調用EvtDriverDeviceAdd、EvtDevicePrepareHardware、EvtDeviceReleaseHardware 和InitializeDMA等回調函數以實現設備的初始化。

作為在設備初始化過程中第一個被調用的回調函數,EvtDriverDeviceAdd需要完成:

(1)創(chuàng)建設備對象;

(2)創(chuàng)建設備對象GUID接口或符號鏈接;

(3)創(chuàng)建一個或多個的I/O隊列;

(4)設置各種事件的回調例程,如電源管理、即插即用、I/O處理例程等。

status=WdfDeviceCreate(&DeviceInit,&deviceAttributes, &device);//創(chuàng)建設備對象

status=WdfDeviceCreateDeviceInterface(device,(LPGUID)&PCICAN_DEVINTERFACE_GUID, NULL); //創(chuàng)建GUID接口

X86處理器有兩種獨立的地址空間,分別是I/O地址與內存地址。I/O地址空間只有64KB,內存地址空間可以達到4G。對于微機接口卡,可以將I/O端口與存儲器芯片分別映射到這兩個地址空間中。而對這兩種不同的地址空間的訪問,需要驅動程序進行相應的預處理工作:在EvtDevicePrepareHardware中,首先獲取配置資源與資源描述符:對于I/O端口,將首地址與空間大小值保存起來;對于存儲器芯片,調用MmMapIoSpace函數將物理地址轉換為系統內核地址然后保存。相對應的,在卸載設備時,系統會調用EvtDeviceReleaseHardware回調函數釋放之前申請的硬件資源,對于存儲器地址,要用MmUnmapIoSpace函數解除物理地址與系統內核地址之間的關聯。

for(i=0; i

descriptor=WdfCmResourceListGetDescriptor(Resource ListTranslated,i);//獲取資源描述符

case CmResourceTypeMemory:pDeviceContext->MemBaseAddress=MmMapIoSpace(

descriptor->u.Memory.Start, descriptor->u.Memory.Length,MmNonCached);

pDeviceContext->MemLength=descriptor->u.Memory.Length;break;

case CmResourceTypePort:pDeviceContext->IoBaseAddress=descriptor->u.Port.Start.LowPart;//I/O地址配置

pDeviceContext->IoLength = descriptor->u.Port.Length;break;

MmUnmapIoSpace(pDeviceContext->MemBaseAddress,pDeviceContext->MemLength);//解除地址關聯

設備初始化第三步,利用函數InitializeDMA()創(chuàng)建DMA適配器與一個DMA傳輸。

InitializeDMA(IN WDFDEVICE Device){……

status=WdfDmaEnablerCreate(…);//創(chuàng)建DMA適配器

status=WdfDmaTransactionCreate(pDeviceContext->DmaEnabler,WDF_NO_OBJECT_ATTRIBUTES,&pDeviceContext->DmaTransaction ); //創(chuàng)建一個DMA傳輸

……}

(2)控制設置及數據交換

應用程序對驅動程序的通信需要調用CreateFile、ReadFile、WriteFile、DeviceIoControl 與 CloseHandle。CreateFile打開設備的方式有兩種:GUID接口與符號鏈接名,本文所述驅動程序采用的是GUID接口方式。

DevicePath=GetDevicePath((LPGUID)&PCICAN_DEVINTERFACE_GUID);//獲取設備路徑

hDevice=CreateFile(DevicePath,…… );//打開設備

獲得了設備的有效句柄,應用程序就可以調用DeviceIoControl函數寫設備控制寄存器。應用程序的請求會被放入請求隊列之中,并在EvtIoDeviceControl函數之中被處理。EvtIoDeviceControl函數之中可以定義多個不同的分支,對應于不同的I/O控制命令。應用程序通過I/O控制命令鎖定具體的操作分支。I/O控制命令定義了4種數據訪問方式,本文采用的是METHOD_BUFFERED,系統會分配一個緩沖區(qū)用作輸入與輸出。由于系統的控制寄存器被映射到了I/O地址空間之中,可以使用下面兩條指令對寄存器進行讀寫:WRITE_PORT_XXX();//寫端口數據 READ_PORT_XXX()//讀端口數據

數據交換操作可以分為輸出數據與輸入數據。應用程序調用WriteFile寫數據,在DeviceIoWrite中實現。對于數據讀寫,使用的是內存映射方式。DeviceIoWrite首先需要獲得一個輸入緩沖,然后利用WdfMemoryCopyToBuffer()函數將數據送入到設備存儲器。

status=WdfRequestRetrieveInputMemory(Request,&memory);//輸入緩沖

3 結束語

本文重點討論了基于WDF的PCI-CAN設備驅動程序設計方法。本文所述的PCI-CAN卡驅動程序,在WDK1.9中成功編譯,自動生成INF文件(設備安裝信息)與SYS文件(驅動程序代碼),成功安裝且運行穩(wěn)定可靠。經過測試,支持5kbps-1MbpsCAN總線波特率,數據流量最高可達3000幀/秒,相關參數均可由應用程序設置后傳遞到FPGA。另外,測試DMA讀極限速率為116M/s,大大降低了總線數據交換的系統延遲。總而言之,WDF驅動模型簡化并優(yōu)化了驅動開發(fā)技術,同WDM驅動模型相比,變得更加穩(wěn)定、靈活與高效。

[1] 譚文.寒江獨釣—Windows內核安全編程[M].北京:電子工業(yè)出版社,2009.

[2] 武安河.Windows設備驅動程序WDF開發(fā)[M].北京:電子工業(yè)出版社,2009.

[3] Penny Orwick,Guy Smith . Developing Drivers with the Microsoft Windows Driver Foundations[M]. Microsoft Press, 2007.

[4] 鄒敬軒,蔡皖東.基于WDF過濾驅動的USB存儲設備監(jiān)控系統[J]. 計算機工程與科學,2010 ;32(3):42.

[5] 錢宇紅.USB數據傳輸卡WDF驅動程序開發(fā)[J].計算機應用與軟件,2012 ;29(6):225-227.

猜你喜歡
設備系統
諧響應分析在設備減振中的應用
Smartflower POP 一體式光伏系統
WJ-700無人機系統
ZC系列無人機遙感系統
北京測繪(2020年12期)2020-12-29 01:33:58
基于PowerPC+FPGA顯示系統
半沸制皂系統(下)
基于VB6.0+Access2010開發(fā)的設備管理信息系統
基于MPU6050簡單控制設備
電子制作(2018年11期)2018-08-04 03:26:08
連通與提升系統的最后一塊拼圖 Audiolab 傲立 M-DAC mini
500kV輸變電設備運行維護探討
主站蜘蛛池模板: 最新日韩AV网址在线观看| 99久久国产精品无码| 免费一极毛片| 狠狠操夜夜爽| 香蕉在线视频网站| 波多野结衣一二三| 亚洲精品欧美重口| 伊人激情综合| 久久香蕉国产线看观看精品蕉| 欧美亚洲欧美区| 日韩欧美中文字幕在线精品| 欧美日本在线| 美女一级免费毛片| 毛片免费在线视频| 精品久久久久无码| 久久久久国产精品嫩草影院| 精品无码国产自产野外拍在线| 亚洲三级成人| 国产国拍精品视频免费看| 亚洲成人动漫在线观看| 国产精品网曝门免费视频| 亚洲国产天堂在线观看| 亚洲一区二区在线无码| 国产精品污视频| 九色在线观看视频| 国产美女叼嘿视频免费看| 在线观看av永久| 天天爽免费视频| 区国产精品搜索视频| 亚洲性视频网站| 免费人成视网站在线不卡| 一个色综合久久| 国产jizzjizz视频| 热99精品视频| 国产主播福利在线观看| 国产成人久久777777| 国产午夜人做人免费视频中文| 国产高潮流白浆视频| 九九热这里只有国产精品| 国产你懂得| 国产乱人视频免费观看| 在线欧美日韩国产| 亚洲av无码成人专区| 国产精品久线在线观看| 亚洲狼网站狼狼鲁亚洲下载| 国产一级小视频| 一区二区三区成人| 亚洲二三区| 久久久久青草线综合超碰| 国产中文一区二区苍井空| 少妇人妻无码首页| 美女国产在线| 欧美三级视频在线播放| 欧美午夜在线播放| 国产尤物jk自慰制服喷水| 亚洲AV无码久久天堂| 亚洲AV无码乱码在线观看裸奔| 午夜精品久久久久久久99热下载| 中文字幕永久视频| 亚洲综合18p| 青青国产在线| 五月婷婷综合网| 亚洲成aⅴ人在线观看| 国产精品自在线天天看片| 国产自视频| 国产精品内射视频| AV不卡在线永久免费观看| 亚洲AV无码久久精品色欲| 亚洲视频四区| 亚洲国产一区在线观看| 国产成人免费手机在线观看视频| 国产福利小视频高清在线观看| 午夜国产在线观看| 国产激情无码一区二区三区免费| 午夜在线不卡| 91网在线| 国产精品自在在线午夜| 黄色免费在线网址| 在线日韩一区二区| 亚洲国产综合精品中文第一| 极品尤物av美乳在线观看| 国产精品毛片一区|