• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

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

       2.3 程序主要模塊的實現

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

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

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

     ?。椋睿?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); ……}

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

     ?。ǎ保┦褂茫螅恚猓铮?loader加載驅動程序,然后使用SoftICE跟蹤調試,確認驅動程序正常加載;

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

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


    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 广宗县| 馆陶县| 阳西县| 吕梁市| 中超| 靖江市| 乡宁县| 屏东市| 高淳县| 宿松县| 寿宁县| 石狮市| 靖边县| 石门县| 富平县| 旺苍县| 开鲁县| 汉中市| 青冈县| 太白县| 棋牌| 资源县| 银川市| 洪湖市| 普兰县| 洛隆县| 德保县| 蒲江县| 平南县| 甘南县| 霍州市| 昆明市| 桦川县| 米泉市| 永安市| 清水县| 宝丰县| 盐亭县| 丰台区| 安溪县| 太湖县|