網站導航:首頁開源項目 USB開源項目:Easy USB 51 Programer  

目錄導航

   
  1、項目簡介
USB開發基礎
1、USB接口的優點及開發難易度
2、USB設備的開發流程
3、USB接口芯片(USB控制器)的選擇
4、了解USB的通訊過程
5、USB命令(請求)和USB描述符
6、實例講解USB的枚舉(配置)過程
准備工作
1、需要哪些工具
2、電路原理圖
3、手工制作您的電路板
4、測試您的硬件
HID設備類
1、讓PC機找到我們的硬件
2、如何成爲一個HID設備(模擬鼠標)
3、如何成爲一個HID設備(模擬鍵盤)
4、如何與HID設備通訊(一)
5、如何與HID設備通訊(二)
6、51編程器的實現
Windows USB 驱动程序(自定义设备)
1、Windows驅動開發基礎
2、開發環境配置
3、第一个实例-Hello Wdm(一)
4、第一个实例-Hello Wdm(二)
5、真正的實例—驅動我們的實驗板
6、真正的實例—測試驅動程序
7、真正的實例—控制LED及讀取按鍵狀態
8、如何編寫應用程序
   

相关産品    淘寶網店
     
 

 
  更多...  
 
 
第一个实例-Hello Wdm(二) 查看/参与此開源項目相关讨论
 

3、測試驅動程序

  切换到DriverMonitor,我们可以找到“Message text”列中有以“HelloWdm:”开始的字符串,这是驱动程序发出的调试信息,如下图所示:

  下面我们用HelloWdm实例中自带的测试程序进行测试。切换到VC6,选择菜单“Project”->“Set Active Project”->“Hello App”,如下图所示:

  编译测试程序:选择菜单“DriverStudio”->“Build with BUILD.EXE”进行编译(如果编译不成功,确认是否配置好“DDK Build Settings”

  運行測試程序:按Ctrl+F5,將彈出基于命令行模式的測試程序,如下圖所示:

  切換到DriverMonitor,我們發現驅動程序又發出了三條調試信息,如下圖所示:

  大家可以分析這個驅動程序的結構,不過您如果不是專業驅動開發人員的話,建議不要探索的過深,因爲Windows設備驅動程序太過于龐大和複雜了,我自已也只是略懂一點點皮毛^_^。

4、小試身手

  一般Hello World类程序都会输出一个“Hello World”字符串,但Hello Wdm却没有,下面我们来修改一下这个驱动程序,让它变更生动一点,也输出一个“Hello Wdm”字符串。我们来实现这样一个功能:向设备写入字符串“Hello Wdm!!!”,然后设备再将收到的字符串“显示”出来。Windows系统中一般通过调用WriteFile来向设备写入数据,通过“基础知识”一节,我们知道调用WriteFile时最终会转化为对驱动程序IRP_MJ_WRITE功能代码所对应的 Dispatch例程的调用,下面我们来增加驱动程序IRP_MJ_WRITE功能代码所对应的 Dispatch例程。

  通過查看DriverWorks的幫助文檔,得知實現IRP_MJ_WRITE的功能函數原型爲KDevice::Write,我們來繼承它。

  1)在HelloDev.h中找到以下內容:

 
  1. virtual NTSTATUS Create(KIrp I);                // COMMENT_ONLY   
  2. virtual NTSTATUS Close(KIrp I);                 // COMMENT_ONLY   
  3. virtual NTSTATUS DeviceControl(KIrp I);         // COMMENT_ONLY   
  4. virtual NTSTATUS SystemControl(KIrp I);         // COMMENT_ONLY   

在後面加入:

 
  1. ////////////////Added by www.baiheee.com//////////////////////////////   
  2. virtual NTSTATUS Write(KIrp I);                 // COMMENT_ONLY   
  3. ///////////////////////////////////end////////////////////////////////////////////////   

  2)還要在function.h中加入

 
  1. /////////added by www.baiheee.com//////////   
  2. #define DRIVER_FUNCTION_WRITE   
  3. ////////////////end////////////////////////   

  3)在HelloDev.c中實例化Write功能函數,加入的內容如下:

 
  1. //////////////////////////Added by www.baiheee.com//////////////   
  2. //Dispatch routine for IRP_MJ_WRITE requests.   
  3. //   
  4. NTSTATUS SimpleWdmDevice::Write(KIrp I)   
  5. {   
  6.     NTSTATUS status = STATUS_SUCCESS;   
  7.   
  8.     T << "entered the write handler\n";     //輸出調試信息   
  9.   
  10.     PUCHAR pBuffer  = (PUCHAR) I.UserBuffer();   
  11.   
  12.     DbgPrint("%s",pBuffer); //在調試窗口中輸出通過WriteFile發過來的字符串       
  13.   
  14.     return I.PnpComplete(this, status);   
  15. }   
  16. ////////////////////////////////end////////////////////////////   

  4)选择菜单“Build”->“Batch Build”编译驱动程序,然后重新安装编译好的驱动程序。

  5)在HelloApp.cpp中定位到main函數,找到下面語句

 
  1. CloseHandle(hHello);  

在前面加入以下這段代碼:

 
  1. ///////////////Added by www.baiheee.com/////////////////   
  2. BOOL bWriteSuccess;   
  3. DWORD dwByteWrite;   
  4. //利用WriteFile向設備寫數據   
  5. bWriteSuccess   = WriteFile(hHello,("Hello Wdm!!!\n"),   
  6.                    sizeof(("Hello Wdm!!!\n")),&dwByteWrite,NULL);   
  7.   
  8. if(bWriteSuccess)   
  9. {   
  10.     cout << "WriteFile operation ok\n";   
  11. }   
  12. else  
  13. {   
  14.     cout << "WriteFile operation failed, code=" << GetLastError() << endl;   
  15. }   
  16. //////////////////////////End///////////////////////////   

  6)选择菜单“Build”->“Batch Build”,编译驱动程序,然后重新安装驱动程序。

  7) 选择菜单“DriverStudio”->“Build with BUILD.EXE”进行编译(编译前确认是否配置好“DDK Build Settings”),然后执行编译后的测试程序,我们可以看到运行后的结果,如下图所示:

 

測試程序的運行結果

DriverMonitor監測到調試信息

下載編譯好的驅動

下載測試程序(需要在命令行模式運行程序,否則窗口一閃而過,看不到運行結果)

下載源代碼

 
 
 
本站程序由百合電子工作室開發和維護
Copyright @ baihe electric studio
渝ICP備09006681號-4