a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > PCI傳輸卡的WDM驅動程序設計

PCI傳輸卡的WDM驅動程序設計

作者: 時間:2009-10-27 來源:網絡 收藏

   2.3 程序主要模塊的實現

  (1)配置空間的訪問模塊 DriverWorks的KPciConfiguration類封裝了訪問PCI設備配置空間的所有操作。首先初始化這個類的實例: KpciConfiguration PciConfig()m_Lower.TopOfStack()); /?}m_Lower是 KpnpLowerDevice類的對象。m_LowerTopOfStack()返回當前設備堆棧頂部的設備對象。*/ 初始化完后可以直接利用成員函數 ReadHeader/ WriteHeader函數訪問所有的配置寄存器。

  為了確定映射空間的類型和大小,先向目標基地址寄存器寫入0Xffffffffh,然后回讀該寄存器的值。如果最低位為1,表示映射于I/O空間,反之為存儲空間;如果映射于存儲空間,從第四位開始計算0的個數可以確定內存空間的大小;如果是I/O方式,從第二位開始計算0的個數可確定I/O空間的大小,最大為256字節。如果設備的存儲空間超過256字節,要實現設備的整個存儲部分的訪問,就必須采用內存映射。

  (2)I/O操作模塊 Driverworks的KIoRange類封裝了I/O端口訪問的操作。部分代碼如下: {…… KIORange DevIoPort () ;//創建實例 NTSTATUS status= DevIoPort ().Initialize ( pResListTranslated,pResListRaW,PciConfig.BaseAddressIndexToOrdinal(0)); /* 第一個參數為轉換后的資源列表指針;第二個參數為原始資源列表指針;第三個參數中的0為 I/O口對應的基地址,用來轉換成特定端口資源的序數*/ If(NT _SUCCESS(status)) {…… DevIoPort.

  inb(0,LineBuf1,10); /*成功初始化后可分別用KIoRange類的成員函數inb(/outb)從端口中讀/寫字節 */ } else{Invalidate();return status; /*未能初始化成功,錯誤信息在status中*/ { ……}

  (3)內存讀寫模塊 DriverWorks的 KMemoryRange類封裝了端口訪問的操作。 status=m_MemoryRange().Initialize(pResListTranslated,pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0)); 此函數的參數、意義及具體用法與I/O端口的操作基本相同。 內存對象也用來發送控制字,以控制CPLD的開始和停止等。實際上控制字是通過PCI9052發送的。該控制字地址已被映射成PCI的內存空間。所以定義一個指向內存空間的內存對象,通過該對象即可發送控制字。

  (4)中斷模塊 在中斷模塊,首先要激活PCI9052中斷使能位,然后判斷硬件中斷響應是否產生,如果有,則進行突發,讀入FIFO中的數據。 BOOLEAN TranCard::Isr_MyIrq(void) { if (// 中斷未產生) {…… return FALSE;} else {/* 如果產生硬件中斷,設置命令寄存器,進行突發數據 */ return TRUE;} } 為了將硬件中斷與編寫的中斷服務程序連接在一起,采用InitializeAndConnect方法,部分代碼如下: NTSTATUS TranCardDevice?押?押OnStartDevice(KIrp I ) {…… status=m_MyIrq. InitializeAndConnect( pResListTranlated, LinkTo(Isr_MyIrq), This;) ……}

  2.4 程序的調用

  編寫程序本身不是最終目的,最終目的是調用驅動程序管理資源,并為用戶應用程序使用。驅動程序加載以后,它的許多進程處于Idle狀態,實際上需要用戶應用程序去調用激活。應用程序利用Win32 API直接調用驅動程序,實現驅動程序和應用程序的信息交互。 首先用CreateFile()打開設備,獲得一個指向設備對象的句柄。

  使用CreateFile函數時應注意:由于驅動程序是*.sys,所以第一個參數應該是這個設備對象的標志連接(symbolic link)。該標志連接名有一個設置數據文件搜索路徑的數字號,而這個數字號通常是零。如果這個連接名是″TranCard″,則傳遞給CreateFile的宇符串就是:″\\\\.\\ TranCard0″。例如: HANDLE hDevice=CreateFile(″\\\\.\\TranCard0″)GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ, NULL?, OPEN_EXISTING,0,NULL); 然后用 DeviceIoControl()進行數據的傳送。最后用CloseHandle( )關閉設備句柄。 下面是應用DeviceIoControl()程序片段。 {…… m_b=DeviceIoControl(hDevice,TRANCARD_IOCTL_ RECEIVE(buffer, sizeof,buffer, NULL,0,&buffersize,NULL); ……}

  2.5 驅動程序的調試 采用SoftICE、DriverMonitor作為調試工具,基本調試過程如下:

  (1)使用symbol loader加載驅動程序,然后使用SoftICE跟蹤調試,確認驅動程序正常加載;

  (2)對核心的中斷響應程序代碼,用SoftICE中的Genint命令產生虛擬中斷,單步跟蹤中斷;

  (3)硬件發送大量的數據,通過查看內存的數據,確認數據是否正確。 在驅動程序的調試過程中,經常出現系統“死機”、“藍屏”等現象,這些情況可能因內存訪問分頁錯誤、設備資源和系統資源沖突、I/O使用錯誤、程序中“指針”使用錯誤等因素造成。 上述方案均調試通過。使用WDM模式開發驅動程序,程序結構清晰,開發周期較短,效率高。在PCI從模式條件下,大數據量連續傳輸速度可達28Mbps以上。


上一頁 1 2 下一頁

評論


相關推薦

技術專區

關閉