首页 文章

使用Custom INF的微控制器的USB驱动程序安装问题

提问于
浏览
3

我正在使用恩智浦LPC1788微控制器,我正在尝试在主机上创建一个驱动程序,通过USB与它通信 . 我相信我已经设法让设备正确处理标准USB请求(PC能够正确读取字符串描述符) .

但是,我在编写示例USB驱动程序并为设备安装时遇到了麻烦 . 我正在使用Microsoft Visual Studio 2013.我的步骤是:

  • 创建一个WinUSB应用程序,它生成一个“驱动程序”和“驱动程序包”项目 .

  • 修改生成的INF文件以使用我的设备的VID和PID .

  • 构建项目 - 都成功构建 . 输出文件夹包含INF文件,目录文件和WdfCoinstaller01011.dll .

  • 通过USB插入微控制器,转到 Device ManagerUpdate Driver Software... ,浏览到包含INF文件的文件夹并选择它 .

  • 这会导致出现以下屏幕:

  • 我选择"Install this driver software anyway" . 过了一会儿,就出现了这个屏幕:

我的INF文件如下:

;
; TestCubeDriver.inf
;
; Installs WinUsb
;

[Version]
Signature = "$Windows NT$"
Class     = USBDevice
ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider = %ManufacturerName%
CatalogFile=TestCubeDriver.cat
DriverVer=04/16/2014,15.55.4.44

; ========== Manufacturer/Models sections ===========

[Manufacturer]
%ManufacturerName% = Standard,NTamd64

[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_0483&PID_5720

; ========== Class definition ===========

[ClassInstall32]
AddReg = ClassInstall_AddReg

[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2

; =================== Installation ===================

[USB_Install]
Include=winusb.inf
Needs=WINUSB.NT

[USB_Install.Services]
Include=winusb.inf
AddService=WinUsb,0x00000002,WinUsb_ServiceInstall

[WinUsb_ServiceInstall]
DisplayName     = %WinUsb_SvcDesc%
ServiceType     = 1
StartType       = 3
ErrorControl    = 1
ServiceBinary   = %12%\WinUSB.sys

[USB_Install.HW]
AddReg=Dev_AddReg

[Dev_AddReg]
; By default, USBDevice class uses iProduct descriptor to name the device in
; Device Manager on Windows 8 and higher.
; Uncomment for this device to use %DeviceName% on Windows 8 and higher:
;HKR,,FriendlyName,,%DeviceName%
HKR,,DeviceInterfaceGUIDs,0x10000,"{fcb251a5-6a1f-4e5b-9df8-e8de91d04cfe}"

[USB_Install.CoInstallers]
AddReg=CoInstallers_AddReg
CopyFiles=CoInstallers_CopyFiles

[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01011.dll,WdfCoInstaller"

[CoInstallers_CopyFiles]
WdfCoInstaller01011.dll

[DestinationDirs]
CoInstallers_CopyFiles=11

; ================= Source Media Section =====================

[SourceDisksNames]
1 = %DiskName%

[SourceDisksFiles]
WdfCoInstaller01011.dll=1

; =================== Strings ===================

[Strings]
ManufacturerName=""
ClassName="Universal Serial Bus devices"
DiskName="TestCubeDriver Installation Disk"
WinUsb_SvcDesc="WinUSB Driver"
DeviceName="TestCubeDriver Device"
REG_MULTI_SZ = 0x00010000

.

我的setupapi.dev.log文件的相关部分是here . 以下类型的行在日志中多次出现:

sig:                               Key      = testcubedriver.inf
     sig:                               FilePath = C:\Windows\System32\DriverStore\Temp\{1bf7c0e3-30cb-6135-d9b8-7d1ac87a6c7c}\testcubedriver.inf
     sig:                               Catalog  = C:\Windows\System32\DriverStore\Temp\{1bf7c0e3-30cb-6135-d9b8-7d1ac87a6c7c}\TestCubeDriver.cat
!    sig:                               Verifying file against specific (valid) catalog failed! (0x800b0109)
!    sig:                               Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.

以下还出现了:

ndv:                Installing device...
     dvi:                {DIF_INSTALLDEVICE} 09:58:11.087
     dvi:                     No class installer for 'TestCubeDriver Device'
     dvi:                     CoInstaller 1: Enter 09:58:11.087
     inf:                          Opened PNF: 'C:\Windows\INF\oem68.inf' ([strings])
!!!  dvi:                     CoInstaller 1: failed(0xe0000101)!
!!!  dvi:                     Error 0xe0000101: The required section was not found in the INF.
     dvi:                {DIF_INSTALLDEVICE - exit(0xe0000101)} 09:58:11.907
!!!  ndv:                Error(e0000101) installing device!

.

我为我的USB设备使用以下描述符:

/*----------------------------------------------------------------------------
 *      U S B  -  K e r n e l
 *----------------------------------------------------------------------------
 *      Name:    USBDESC.C
 *      Purpose: USB Descriptors
 *      Version: V1.10
 *----------------------------------------------------------------------------
 *      This software is supplied "AS IS" without any warranties, express,
 *      implied or statutory, including but not limited to the implied
 *      warranties of fitness for purpose, satisfactory quality and
 *      noninfringement. Keil extends you a royalty-free right to reproduce
 *      and distribute executable files created using this software for use
 *      on NXP Semiconductors LPC family microcontroller devices only. Nothing
 *      else gives you the right to use this software.
 *
 *      Copyright (c) 2005-2009 Keil Software.
 *---------------------------------------------------------------------------*/
#include "lpc_types.h"
#include "usb.h"
#include "usbcore.h"
#include "usbhw.h"

/* USB Standard Device Descriptor */
const uint8_t USB_DeviceDescriptor[] = {
  USB_DEVICE_DESC_SIZE,              /* bLength */
  USB_DEVICE_DESCRIPTOR_TYPE,        /* bDescriptorType */
  WBVAL(0x0200), /* 2.00 */          /* bcdUSB */
  0xFF,                              /* bDeviceClass */
  0x00,                              /* bDeviceSubClass */
  0x00,                              /* bDeviceProtocol */
  USB_MAX_PACKET_SIZE,               /* bMaxPacketSize0 */
  WBVAL(0x0483),                     /* idVendor */
  WBVAL(0x5720),                     /* idProduct */
  WBVAL(0x0100), /* 1.00 */          /* bcdDevice */
  0x04,                              /* iManufacturer */
  0x30,                              /* iProduct */
  0x42,                              /* iSerialNumber */
  0x01                               /* bNumConfigurations */
};

/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const uint8_t USB_ConfigDescriptor[] = {
/* Configuration 1 */
  USB_CONFIGURATION_DESC_SIZE,       /* bDescriptorType */
  USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
  WBVAL(                             /* wTotalLength */
    1*USB_CONFIGURATION_DESC_SIZE +
    1*USB_INTERFACE_DESC_SIZE     +
    2*USB_ENDPOINT_DESC_SIZE
  ),
  0x01,                              /* bNumInterfaces */
  0x01,                              /* bConfigurationValue */
  0x00,                              /* iConfiguration */
  USB_CONFIG_SELF_POWERED /*|*/      /* bmAttributes */
/*USB_CONFIG_REMOTE_WAKEUP*/,
  USB_CONFIG_POWER_MA(100),          /* bMaxPower */
/* Interface 0, Alternate Setting 0, MSC Class */
  USB_INTERFACE_DESC_SIZE,           /* bLength */
  USB_INTERFACE_DESCRIPTOR_TYPE,     /* bDescriptorType */
  0x00,                              /* bInterfaceNumber */
  0x00,                              /* bAlternateSetting */
  0x02,                              /* bNumEndpoints */
  0xFF,                              /* bInterfaceClass */
  0x0,                               /* bInterfaceSubClass */
  0x0,                               /* bInterfaceProtocol */
  0x5C,                              /* iInterface */
/* Interrupt In Endpoint */
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_IN(2),                /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,       /* bmAttributes */
  WBVAL(0x0040),                     /* wMaxPacketSize */
  0xA,                               /* bInterval */
/* Interrupt Out Endpoint */
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_OUT(2),               /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,       /* bmAttributes */
  WBVAL(0x0040),                     /* wMaxPacketSize */
  0xA,                               /* bInterval */
/* Terminator */
  0                                  /* bLength */
};

/* USB String Descriptor (optional) */
const uint8_t USB_StringDescriptor[] = {
/* Index 0x00: LANGID Codes */
  0x04,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  WBVAL(0x0409), /* US English */    /* wLANGID */
/* Index 0x04: Manufacturer */
  0x2C,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  'A',0,
  'T',0,
  'P',0,
  ' ',0,
  'I',0,
  'n',0,
  'd',0,
  'u',0,
  's',0,
  't',0,
  'r',0,
  'i',0,
  'e',0,
  's',0,
  ' ',0,
  'G',0,
  'r',0,
  'o',0,
  'u',0,
  'p',0,
  ' ',0,
/* Index 0x30: Product */
  0x12,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  'T',0,
  'e',0,
  's',0,
  't',0,
  'C',0,
  'u',0,
  'b',0,
  'e',0,
  ' ',0,
/* Index 0x42: Serial Number */
  0x1A,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  'D',0,
  'E',0,
  'M',0,
  'O',0,
  '0',0,
  '0',0,
  '0',0,
  '0',0,
  '0',0,
  '0',0,
  '0',0,
  '0',0,
/* Index 0x5C: Interface 0, Alternate Setting 0 */
  0x0E,                              /* bLength */
  USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
  'M',0,
  'e',0,
  'm',0,
  'o',0,
  'r',0,
  'y',0,
};

2 回答

  • 1

    我试用了Daniel K建议的INF模板here我自己的配置:

    ;This .inf file is a modified version of the example INF provided
    ;in the Microsoft document:
    ;"How to Use WinUSB to Communicate with a USB Device"
    
    
    [Version]
    Signature = "$Windows NT$"
    Class = USBDevices
    ClassGuid= {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
    Provider = %MFGNAME%
    DriverVer=04/17/2014,1.0.0.0
    CatalogFile=winusb.cat    ;CAT file needed for a signed driver pacakage
    ;------------------------------------------------------------------------------
    ; ========== Manufacturer/Models sections ===========
    ;------------------------------------------------------------------------------
    [Manufacturer]
    %MFGNAME% = MyDevice_WinUSB,NTx86,NTamd64
    
    ;------------------------------------------------------------------------------
    ;  Vendor and Product ID Definitions
    ;------------------------------------------------------------------------------
    ; When developing your custom USB device, the VID and PID used in the PC side
    ; application program and the firmware on the microcontroller must match.
    ; Modify the below lines to use your VID and PID.  Use the format as shown below.
    ; Note: One INF file can be used for multiple devices with different VID and PIDs.
    ; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line.
    ; There is a maximum number of devices that can be supported per line however.
    ; If you append a large number of VID/PIDs to the end of the line, and get a:
    ; "The data area passed to a system call is too small." error when trying to install
    ; the INF, try removing some of the VIDs/PIDs.
    ;------------------------------------------------------------------------------
    [MyDevice_WinUSB.NTx86]
    %DESCRIPTION% =USB_Install, USB\VID_0483&PID_5720
    
    [MyDevice_WinUSB.NTamd64]
    %DESCRIPTION% =USB_Install, USB\VID_0483&PID_5720
    
    
    ;=========================================================================================
    ;ClassInstall32 and ClassInstall_AddReg sections used to make new device manager category.
    ;=========================================================================================
    [ClassInstall32]
    AddReg=ClassInstall_AddReg
    
    [ClassInstall_AddReg]
    HKR,,,,%DEVICEMANAGERCATEGORY%
    HKR,,Icon,,"-20"
    
    
    ; =================== Installation ===================
    
    [USB_Install]
    Include=winusb.inf
    Needs=WINUSB.NT
    
    [USB_Install.Services]
    Include=winusb.inf
    AddService=WinUSB,0x00000002,WinUSB_ServiceInstall
    
    [WinUSB_ServiceInstall]
    DisplayName     = %WinUSB_SvcDesc%
    ServiceType     = 1
    StartType       = 3
    ErrorControl    = 1
    ServiceBinary   = %12%\WinUSB.sys
    
    [USB_Install.Wdf]
    KmdfService=WINUSB, WinUsb_Install
    
    [WinUSB_Install]
    KmdfLibraryVersion=1.11
    
    [USB_Install.HW]
    AddReg=Dev_AddReg
    
    [Dev_AddReg]
    HKR,,DeviceInterfaceGUIDs,0x10000,"{fcb251a5-6a1f-4e5b-9df8-e8de91d04cfe}"
    ;When editing the GUID (the big hex number with dashes inside the squiggly 
    ;braces), make sure to write the intended PC application to use the same GUID.
    ;Otherwise the application won't be able to find the USB device properly.
    
    [USB_Install.CoInstallers]
    AddReg=CoInstallers_AddReg
    CopyFiles=CoInstallers_CopyFiles
    
    [CoInstallers_AddReg]
    HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01011.dll,WdfCoInstaller",
    
    [CoInstallers_CopyFiles]
    ;WinUSBCoInstaller2.dll
    WdfCoInstaller01011.dll
    
    [DestinationDirs]
    CoInstallers_CopyFiles=11
    
    ; ================= Source Media Section =====================
    
    [SourceDisksNames]
    1 = %DISK_NAME%
    
    [SourceDisksFiles]
    WdfCoInstaller01011.dll=1
    
    ; =================== Strings ===================
    
    [Strings]
    MFGNAME="ATP Industries Group" ; ManufacturerName
    DESCRIPTION="TestCube" ; DeviceName
    WinUSB_SvcDesc="WinUSB Device"
    DISK_NAME="TestCubeDriver Installation Disk" ; DiskName
    DEVICEMANAGERCATEGORY="Universal Serial Bus devices" ; ClassName
    

    我的设备驱动程序安装成功,Device Manager报告设备正常运行 . 我尝试运行我的应用程序,它能够找到我的设备并检索有关它的详细信息 . 这一切现在都有效,我终于可以开始处理应用程序方面的事情了 .

    编辑:即使它现在都在工作,我也不知道原始模板有什么问题 - 有人可以向我解释为什么第二个模板工作而不是第一个?

  • 1

    你正在运行32位Windows,对吧?原始文件不能为您工作的一个原因是它没有32位驱动程序的部分,它只有一个NTamd64部分 .

    从原始文件:

    [Standard.NTamd64]
    %DeviceName% =USB_Install, USB\VID_0483&PID_5720
    

    从新文件中, MyDevice_WinUSB 类似于 Standard

    [MyDevice_WinUSB.NTx86]
    %DESCRIPTION% =USB_Install, USB\VID_0483&PID_5720
    
    [MyDevice_WinUSB.NTamd64]
    %DESCRIPTION% =USB_Install, USB\VID_0483&PID_5720
    

    新文件有一个额外的部分,您的旧文件没有 .

相关问题