2017-12-27 105 views
0

特定のデバイス用のWindows用のUSBドライバを作成したいと思います。インターネットの検索私はWindowsのWDF命令に遭遇し、ターゲットPCをセットアップしました。最初のサンプルプロジェクトの1つは、汎用Hello Worldドライバ(KMDF)です。Windows用USBドライバを作成

https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/writing-a-very-small-kmdf--driver

例は非常に簡単であるように思わが、それはエラーで終了します。

Driver Deployment Task Failed: Driver Preparation

Driver Deployment Task Failed: Driver Install

私はこのトピックに新たなんだので、ここで誰かが助けることがあれば、私はお願いしたいwoukd私は 私はVS2017と最新のWDFの両方のマシンでWindows 10を使用します。

私の2番目の質問は、全体のUSBドライバのトピックに関するものです。良いサンプルプロジェクトや詳細な説明はどこで見つけることができますか?

答えて

1

質問2:USBドライバの例は、here(カーネルモードとユーザーモードの両方のドライバ)です。

+0

わかりました。ありがとう:)私は.infファイルで少し演奏し、私は思っています。現時点では私にはUMDFやKMDF、あるいはその両方が必要なのかどうかは分かりません。イメージによると私は両方が必要ですが、私はWinUSBを使用したいと思います。 [1] [1]:https://i.stack.imgur.com/PBNV1.png –

+0

これはアプリケーションアーキテクチャによって異なります。 [Here](https://msdn.microsoft.com/en-us/library/windows/hardware/ff540215(v=vs.85).aspx)は、場合によっては何を使用するかを説明する記事です。 WinUSBを使用する場合は、[IOCTLs](https://msdn.microsoft.com/en-us/library/windows/hardware/ff540046(v = vs.85).aspx#winusb)からWinUSBと通信できます。 (あなたはUMDFに移動することができるプロトタイプを作ることができると思います)。 – nowaqq

+0

私の頭は喫煙しています^^私はWinUSBテンプレートを使用してデバイス固有の値を変更することでドライバを "ビルド"することができました。ドライバはターゲットPC上で動作し、デバイスにはマークがありません。さて、.infファイルはWinUSBを使用するようにOSに指示するだけで問題はありません。それ以上のファイルをドライバプロジェクトに追加しませんでした。 次のステップでは、Windows.Devices.Usbクラスを使用してデバイスにアクセスしたかったのです。私は、appmanifestにusb機能を追加しました。しかし、UsbDevice.GetDeviceSelector(vid、pid)によって返された文字列は機能しません。私は何かを逃していますか? –

0

WinUSBを試してください - ドライバを書く必要はありません! は、アプリケーションでのWinUSB APIを使用するには:

  • をWinUsb.h
  • がアプリケーションにリンクされているライブラリのリストにWinUsb.libを追加含めます。
  • Usb100.hには、いくつかの有用なマクロの宣言が含まれています。
  • デバイスインターフェイスGUIDを使用して、デバイスパスを取得します。正しいGUIDは、WinUsb.sysのインストールに使用されたINFで指定したGUIDです。
  • INFで定義したデバイスインターフェイスGUIDをSetupDiGetClassDevsに渡して、デバイス情報セットのハンドルを取得します。この関数は、HDEVINFOハンドルを返します。
  • SetupDiEnumDeviceInterfacesを呼び出して、システムのデバイスインターフェイスを列挙し、デバイスインターフェイスの情報を取得します。
  • デバイスインターフェイスの詳細データを取得するには、SetupDiGetDeviceInterfaceDetailを呼び出します。
  • GetDevicePath関数を呼び出してデバイスパスを取得します。
  • デバイスパスをCreateFileに渡すと、デバイスのファイルハンドルが取得されます。 ReadFileとWrite Fileを使用してデバイスと通信してください!
  • ファイルハンドルをWinUsb_Initializeに渡してWinUSBを初期化し、WinUSBハンドルを取得します。デバイスのファイルハンドルではなく、WinUSB API関数を呼び出すときに、デバイスのWinUSBハンドルを使用してデバイスを識別します。より高度なソリューションの

- 使用機能:

  • WinUsb_QueryDeviceInformationデバイスの速度を得ることができます。
  • 対応するインターフェイス記述子を取得するWinUsb_QueryInterfaceSettings。 WinUSBハンドルは、最初のインターフェイスに対応します。
  • WinUsb_QueryPipeは、各エンドポイントに関する情報を取得します。
  • WinUsb_WritePipeはバッファをデバイスに書き込みます。デフォルト動作:長さ0の書き込みはスタックに転送されます。転送長が最大転送長より大きい場合、WinUSBは要求を最大転送長のより小さい要求に分割し、連続して送信します。あなたはおそらく必要なデバッグ目的http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/winusb_howto.docx

  • より多くの機能と情報https://blogs.msdn.microsoft.com/usbcoreblog/2010/02/05/how-to-generate-and-view-a-winusb-debug-trace-log/ winusbtrace_tool 。 Wireshark https://www.wireshark.orgとUSBPcapプラグイン。

    その他の例: http://searchingforbit.blogspot.com/2012/04/winusb-communication-with-stm32-part-1.html。 サンプルテンプレートにはVisual Studioが付属しています。

    .infファイルを作成する知識も必要です。 -

    USBと通信するためのもう一つの簡単な方法のlibusb-win32のhttps://sourceforge.net/projects/libusb-win32/

    私の簡単なコンソールアプリケーションは、デバイスへのチャンクを送信します。

    #include "stdafx.h" 
    #include <SetupAPI.h> 
    #include <Hidsdi.h> 
    #include <devguid.h> 
    #include <winusb.h> 
    #include <usb.h> 
    #pragma comment(lib, "hid.lib") 
    #pragma comment(lib, "setupapi.lib") 
    #pragma comment(lib, "winusb.lib") 
    #include <iUString.h> 
    
    
    iString<char> DevicePath; 
    bool     WinusbHandle_Open=false; 
    bool     DeviceHandle_Open = false; 
    WINUSB_INTERFACE_HANDLE WinusbHandle; 
    HANDLE     DeviceHandle; 
    UCHAR usb_out_buffer[64]; 
    DEFINE_GUID(GUID_DEVCLASS_WINUSB, 0x88bae032L, 0x5a81, 0x49f0, 0xbc, 0x3d, 0xa4, 0xff, 0x13, 0x82, 0x16, 0xd6); 
    DEFINE_GUID(GUID_DEVCLASS_STL, 0xf177724dL, 0x74d3, 0x430e, 0x86, 0xb5, 0xf0, 0x36, 0x89, 0x10, 0xeb, 0x23); 
    GUID winusb_guid; 
    GUID stl_guid; 
    
    bool connectusb(); 
    void disconnectusb(); 
    
    
    
    
    int main() 
    { 
        DWORD n; 
        DWORD numEvents; 
        HANDLE rHnd;  
    
    WinusbHandle_Open = false; 
    DeviceHandle_Open = false; 
    winusb_guid = GUID_DEVCLASS_WINUSB; 
    stl_guid = GUID_DEVCLASS_STL; 
    usb_out_buffer[0] = 0; 
    usb_out_buffer[1] = 1; 
    usb_out_buffer[2] = 2; 
    usb_out_buffer[3] = 3; 
    
    ULONG bytesWritten; 
    ULONG timeout; 
    timeout = 100; 
    rHnd = GetStdHandle(STD_INPUT_HANDLE); 
    
    WinUsb_SetPipePolicy(WinusbHandle, 0x01, PIPE_TRANSFER_TIMEOUT, sizeof(ULONG), &timeout); 
    
    timeout = TRUE; 
    WinUsb_SetPipePolicy(WinusbHandle, 0x01, AUTO_CLEAR_STALL, sizeof(ULONG), &timeout); 
    
    
    timeout = TRUE; 
    WinUsb_SetPipePolicy(WinusbHandle, 0x01, RAW_IO, sizeof(ULONG), &timeout);//Bypasses queuing and error handling to boost performance for multiple read requests. 
    
    
    while (true) 
    { 
    if ((!WinusbHandle_Open) || (!WinusbHandle_Open)) { if (!connectusb())Sleep(2000); } 
    if ((!WinusbHandle_Open) || (!WinusbHandle_Open))continue; 
    
    bytesWritten = 0; 
    if (!WinUsb_WritePipe(WinusbHandle, 0x01, &usb_out_buffer[0], 2, &bytesWritten, NULL)) 
    { 
        n = GetLastError(); 
    disconnectusb(); 
    } 
    Sleep(2000); 
    } 
    disconnectusb(); 
    return 0; 
    } 
    
    
    
    
    bool connectusb() 
    { 
        BOOL        bResult = FALSE; 
        HDEVINFO       deviceInfo; 
        SP_DEVICE_INTERFACE_DATA   interfaceData; 
        PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = NULL; 
        DWORD n; 
        SP_DEVINFO_DATA devinfo; 
        BYTE devdetailbuffer[4096]; 
        bool found; 
    
        deviceInfo = SetupDiGetClassDevs(&stl_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); 
        if (deviceInfo == INVALID_HANDLE_VALUE) { return false; } 
    
        found = false; 
        for (n = 0;; n++) 
        { 
    
         interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); 
    
         if (!SetupDiEnumDeviceInterfaces(deviceInfo, NULL, &stl_guid, n, &interfaceData)) 
         { 
          n = GetLastError(); 
          break; 
         } 
    
    
    
    
         detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)devdetailbuffer; 
         detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 
         devinfo.cbSize = sizeof(devinfo); 
         if (!SetupDiGetDeviceInterfaceDetail(deviceInfo, &interfaceData, detailData, sizeof(devdetailbuffer), NULL, &devinfo)) { printf("SetupDiGetDeviceInterfaceDetail: %u\n", GetLastError()); break; } 
         if (IsEqualGUID(devinfo.ClassGuid, winusb_guid)) 
         { 
          if ((-1 != iStrPos(detailData->DevicePath, "VID_0483")) || (-1 != iStrPos(detailData->DevicePath, "vid_0483"))) 
          { 
           if ((-1 != iStrPos(detailData->DevicePath, "PID_576B")) || (-1 != iStrPos(detailData->DevicePath, "pid_576b"))) 
           { 
    
            DevicePath = detailData->DevicePath; 
            found = true; 
            break; 
           } 
          } 
         } 
        } 
    
    
    
    SetupDiDestroyDeviceInfoList(deviceInfo); 
    if (!found)return false; 
    
    
    DeviceHandle = CreateFile(DevicePath.Buffer() , 
        GENERIC_WRITE | GENERIC_READ, 
        FILE_SHARE_WRITE | FILE_SHARE_READ, 
        NULL, 
        OPEN_EXISTING, 
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
        NULL); 
    
    if (INVALID_HANDLE_VALUE == DeviceHandle) { 
        n = GetLastError(); 
    } 
    
    if (INVALID_HANDLE_VALUE == DeviceHandle) return false; 
    DeviceHandle_Open = true; 
    
    
    
    if (!WinUsb_Initialize(DeviceHandle, &WinusbHandle)) 
    { 
        n = GetLastError(); 
        CloseHandle(DeviceHandle); DeviceHandle_Open = false; 
        return false; 
    } 
    
    
    
    WinusbHandle_Open = true; 
    return true; 
    } 
    
    void disconnectusb() 
    { 
        if (WinusbHandle_Open) { WinUsb_Free(WinusbHandle); WinusbHandle_Open = false; } 
        if (DeviceHandle_Open) { CloseHandle(DeviceHandle); DeviceHandle_Open = false; } 
    } 
    
  • 関連する問題