shangdawei 发表于 2013-4-19 22:48:33

WinUSB - 微软为所有 USB 设备提供的常规驱动程序

本帖最后由 shangdawei 于 2013-4-19 22:54 编辑

WinUSB

本节介绍 Microsoft 为所有 USB 设备提供的常规 WinUSB 驱动程序 (Winusb.sys) 及其用户模式组件。

在早于 Windows XP Service Pack 2 (SP2) 的 Windows 版本中,所有 USB 设备驱动程序都必须在内核模式下运行。如果所创建的 USB 设备的操作系统没有本机类驱动程序,则需要为该设备编写内核模式设备驱动程序。

Windows USB (WinUSB) 是一种常规的 USB 设备驱动程序,它是与用于 Windows XP SP2 的 Windows 驱动程序框架 (WDF) 同时开发的。WinUSB 架构由内核模式驱动程序 (Winusb.sys) 和公开 WinUSB 功能的用户模式动态链接库 (Winusb.dll) 组成。 使用这些功能,你可以通过用户模式软件管理 USB 设备。


WinUSB 架构和模块

WinUSB 由于两个基本组件组成:

Winusb.sys 是一种内核模式驱动程序,可在 USB 设备的内核模式设备堆栈的协议驱动程序之上作为筛选器驱动程序或功能驱动程序进行安装。
Winusb.dll 是一种公开 WinUSB 功能的用户模式 DLL。.当 Winusb.sys 作为设备的功能驱动程序安装后,应用程序可以使用这些功能与其进行通信。
对于不要求自定义功能驱动程序的设备,Winusb.sys 可以在该设备的内核模式堆栈中作为功能驱动程序进行安装。随后,用户模式流程通过使用一组设备 I/O 控制请求或调用 WinUSB 功能来与 Winusb.sys 进行通信。


WinUSB (Winusb.sys) 安装

对于某些通用串行总线 (USB) 设备(如仅由单个应用程序访问的设备),你可以在该设备的内核模式堆栈中安装 WinUSB (Winusb.sys) 作为 USB 设备的功能驱动程序,来取代实施驱动程序。还可以安装 WinUSB 作为功能驱动程序或为 USB 复合设备的某个特定功能安装 WinUSB。WinUSB 通过使用 WinUSB 用户模式动态链接库 winusb.dll 公开的 WinUSB 功能 与设备进行通信。

编写 WinUSB 安装的自定义 INF

作为驱动程序包的一部分,你需要提供 .inf 文件,该文件将安装 Winusb.sys 作为 USB 设备的功能驱动程序。

有关如何安装 Winusb.sys 作为功能驱动程序的完整说明,请参阅如何安装 Winusb.sys 作为设备的功能驱动程序。

下面的示例 .inf 文件西那是的针对大多数 USB 设备的 WinUSB 安装,但进行了一些修改,例如将相应部分名称中的 USB_Install 更改为相应的 DDInstall 值。你还应根据需要更改版本、制造商和型号部分。例如,提供相应的制造商名称、已签名目录文件的名称、正确的设备类以及设备的供应商标识 (VID) 和产品标识 (PID)。

还应通知安装程序类已设置为 "USBDevice"。供应商可以对不属于其他类以及不是 USB 主控制器或集线器的设备使用 "USBDevice" 安装程序类。

如果要安装 WinUSB 作为 USB 复合设备中任一功能的功能驱动程序,必须在 INF 中提供中与该功能关联的硬件 ID。可以从“设备管理器”的 devnode 属性中获取该功能的硬件 ID。硬件 ID 字符串格式为 "USB\VID_vvvv&PID_pppp"。下面的 INF 安装 WinUSB 作为基于 x64 系统上 OSR USB FX2 主板的功能驱动程序。


;
;
; Installs WinUsb
;


Signature = "$Windows NT$"
Class   = USBDevice
ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider= %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer=09/04/2012,13.54.20.543

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


%ManufacturerName% = Standard,NTamd64


%DeviceName% =USB_Install, USB\VID_0547&PID_1002

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


AddReg = ClassInstall_AddReg


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

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


Include = winusb.inf
Needs   = WINUSB.NT


Include =winusb.inf
Needs   = WINUSB.NT.Services


AddReg=Dev_AddReg


HKR,,DeviceInterfaceGUIDs,0x10000,"{9f543223-cede-4fa3-b376-a25ce9a30e74}"

;
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
; You must explicitly reference all file-list-section names in this section.

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


ManufacturerName=""
ClassName="Universal Serial Bus devices"
DeviceName="Fx2 Learning Kit Device"
REG_MULTI_SZ = 0x00010000如何在不编写自定义 INF 的情况下自动安装 WinUSB

作为 OEM 或独立硬件供应商 (IHV),你可以构建自己的设备,以便在 Windows 8 以及早期版本的操作系统上自动安装 Winusb.sys。这种设备称作 WinUSB 设备,无需编写引用自带 Winusb.inf 的自定义 INF 文件。有关详细信息,请参阅 WinUSB 设备。

什么是 WinUSB 设备

WinUSB 设备是一种通用串行总线 (USB) 设备,其固件定义了某些 Microsoft 操作系统 (OS) 特征描述符,这些描述符将兼容 ID 报告为 "WINUSB"。

WinUSB 设备的用途是让 Windows 将 Winusb.sys 作为设备的功能驱动程序载入,而无需自定义 INF 文件。对于 WinUSB 设备,你无须为设备分发 INF 文件,对最终用户而言,这大大简化了驱动程序安装过程。相反,如果你需要提供自定义 INF,则不应将设备定义为 WinUSB 设备和在 INF 中指定设备的硬件 ID。

Microsoft 提供了 Winusb.inf,其中包含将 Winusb.sys 作为 USB 设备的设备驱动程序安装所需的信息。

在 Windows 8 之前,要将 Winusb.sys 作为功能驱动程序加载,你需要提供自定义 INF。自定义 INF 指定设备特定的硬件 ID,同时包括内置 Winusb.inf 的部分。这些部分是实例化服务、复制内置二进制文件以及注册设备接口 GUID(应用程序查找设备和与设备通讯必须使用 GUID)所必需的。有关编写自定义 INF 的信息,请参阅 WinUSB (Winusb.sys) 安装。

在 Windows 8 中,内置 Winusb.inf 文件经过更新后可让 Windows 自动将 INF 与 WinUSB 设备匹配。

使用内置 Winusb.inf 安装 WinUSB 设备

在 Windows 8 中,内置 Winusb.inf 文件已更新。INF 包括引用称为 "USB\MS_COMP_WINUSB" 的兼容 ID 的安装部分。



%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB

更新的 INF 还包括称为 "USBDevice" 的新安装程序类。

"USBDevice" 安装程序类可供这些 Microsoft 未提供内置驱动程序的设备使用。通常,此类设备不属于定义良好的 USB 类(如音频、Bluetooth 等),并且需要自定义驱动程序。如果你的设备是 WinUSB 设备,则该设备很可能不属于 USB 类。因此,你的设备必须安装在 "USBDevice" 安装程序类下。更新的 Winusb.inf 便于实现该要求。

关于 USBDevice 类的使用。:
不要对未分类设备使用“USB”安装程序类。该类预留用于安装控制器、集线器和复合设备。“USB”类误用可能造成严重的可靠性和性能问题。对于未分类设备,请使用“USBDevice”。

在 Windows 8 中,要使用“USBDevice”设备类,只需将其添加到你的 INF 中即可。

[版本]…



Class=USBDevice

ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}

…在设备管理器中,你将会看到一个新节点 USB 通用串行总线设备,你的设备就显示在该节点下。

在 Windows 7 中,除前面的行外,你还需要在 INF 中创建以下注册表设置:

;---------- 添加注册表部分 ----------

HKR,,,,"Universal Serial Bus devices"

HKR,,NoInstallClass,,1

HKR,,SilentInstall,,1

HKR,,IconPath,%REG_MULTI_SZ%," %systemroot%\system32\setupapi.dll,-20"在设备管理器中,你将会发现你的设备显示在 USB 通用串行总线设备下。不过,该设备类描述由 INF 中指定的注册表设置派生而来。

- Eliyas Yakub,Microsoft Windows USB 核心团队



注意,"USBDevice" 类不仅限于 WinUSB。如果你有设备的自定义驱动程序,则可在自定义 INF 中使用 "USBDevice" 安装程序类。

在设备枚举过程中,USB 驱动程序堆栈会从设备读取兼容 ID。如果兼容 ID 是 "WINUSB",Windows 会将其用作设备标识符,并在更新的内置 Winusb.inf 中查找匹配,然后将 Winusb.sys 作为设备的功能驱动程序加载。

对于 Windows 8 之前的 Windows 版本,更新的 Winusb.inf 可通过 Windows 更新提供。
如果你的计算机配置为自动获取驱动程序更新,WinUSB 驱动程序将使用新的 INF 程序包进行安装,无需任何用户干预。



如何配置 WinUSB 设备

若要将 USB 设备标识为 WinUSB 设备,设备固件必须具有这些 Microsoft OS 描述符。

支持扩展的特征描述符

为了让 USB 驱动程序堆栈了解设备支持扩展的特征描述符,设备必须定义存储在字符串索引 0xEE 处的 OS 字符串描述符。在枚举过程中,驱动程序堆栈查询字符串描述符。如果存在描述符,驱动程序堆栈会假定设备包含一个或多个 OS 特征描述符和检索这些特征描述符所需要的数据。

检索的字符串描述符具有 bMS_VendorCode 字段值。该值表示 USB 驱动程序堆栈必须用来检索扩展特征描述符的供应商代码。

设置兼容 ID

匹配内置 Winusb.inf 和加载 WinUSB 驱动程序模块所需要的扩展兼容 ID OS 特征描述符。

扩展兼容 ID OS 特征描述符包含紧跟一个或多个功能部分的标题部分,具体取决于是否是复合设备。标题部分指定整个描述符的长度、功能部分的数量以及版本号。对于非复合设备,标题后紧跟一个仅与设备的接口关联的功能部分。该部分的 compatibleID 字段必须指定 "WINUSB" 作为字段值。复合设备有多个功能部分。每个功能部分的 compatibleID 字段必须指定 "WINUSB"。

注册设备接口 GUID

注册设备接口 GUID 所需要的扩展属性 OS 特征描述符。需要使用 GUID 从应用程序或服务查找设备、配置设备以及执行 I/O 操作。

在以前版本的 Windows 中,设备接口 GUID 注册通过自定义 INF 完成。从 Windows 8 开始,你的设备应使用扩展属性 OS 特征描述符报告接口 GUID。

shangdawei 发表于 2013-4-19 22:58:10


如何通过 WinUSB 功能访问 USB 设备

在本主题中,你将了解应用程序如何通过调用 WinUSB 功能与 USB 设备通信。本主题假定你已经将 WinUSB (Winusb.sys) 加载为设备的函数驱动程序。位于设备的内核模式堆栈中的 WinUSB。此驱动程序包括在 Windows 的 \Windows\System32\drivers 文件夹中。 有关安装此驱动程序的说明,请参阅 WinUSB (Winusb.sys) 安装。

如果你正在使用 Winusb.sys 作为 USB 设备的函数驱动程序,则可以从应用程序调用 WinUSB 功能来与设备通信。这些由用户模式 DLL Winusb.dll 公开的函数可简化通信过程。与构建设备 I/O 控制请求来执行标准 USB 操作(如配置设备、发送控制请求以及与设备互传数据)不同,应用程序调用等效的 WinUSB 功能。

Winusb.dll 使用应用程序提供的数据构建适当的设备 I/O 控制请求,然后将请求发送到 Winusb.sys 进行处理。为与 USB 堆栈通信,WinUSB 功能使用与应用程序的请求对应的适当 IOCTL 调用 DeviceIoControl。 当请求完成时,WinUSB 功能将 Winusb.sys 返回的任何信息(例如来自读请求的数据)再回传到调用进程。如果调用 DeviceIoControl 成功,它将返回非零值。如果调用失败或者挂起(不立即处理),DeviceIoControl 将返回零值。 如果出现错误,应用程序可以调用 GetLastError 以获得更详细的错误消息。

使用 WinUSB 功能与设备通信比实现驱动程序更简单。不过,请注意以下限制:

WinUSB 功能一次仅允许一个应用程序与设备通信。如果需要多个应用程序同时与设备通信,则必须实现一个函数驱动程序。
WinUSB 功能不支持在同步终结点之间传输流数据。同步传输需要一个内核模式的函数驱动程序。
WinUSB 功能不支持已经提供内核模式支持的设备。此类设备的示例包括调制解调器和网络适配器,二者分别由电话服务 API (TAPI) 和 NDIS 支持。
对于多功能设备,可以使用设备的 INF 文件分别为每个 USB 函数指定内置内核模式驱动程序或 Winusb.sys。不过,对于某个特定函数,只能指定其中一个选项,而不能同时指定两个。
可以将 Winusb.sys 安装为 USB 复合设备中函数的函数驱动程序。这需要在 INF 中进行一些硬件 ID 修改。有关详细信息,请参阅 WinUSB (Winusb.sys) 安装中的“为 WinUSB 安装编写 .Inf 文件”。

Winusb.sys 也是 UMDF 函数驱动程序与关联的设备之间链接的关键部分。Winusb.sys 作为高层筛选器驱动程序安装在设备的内核模式堆栈中。应用程序通过与设备的 UMDF 函数驱动程序通信来发送读、写或设备 I/O 控制请求。驱动程序与框架交互,后者将请求传递到 Winusb.sys。Winusb.sys 随后处理该请求并将其传递到协议驱动程序,最后传递到设备。任何响应都通过反向路径返回。Winusb.sys 还作为设备堆栈的即插即用和电源所有者 (PPO)。

注意WinUSB 功能需要 Windows XP 或更高版本。你可以在 C/C++ 应用程序中使用这些函数与你的 USB 设备通信。Microsoft 不支持为 WinUSB 提供托管 API。
本主题包括如何使用 WinUSB 功能与使用 Winusb.sys 作为函数驱动程序的 USB 设备进行通信的详细演练。

先决条件
设置项目
创建设备的文件句柄
获取设备的 WinUSB 接口句柄
查询设备以获取 USB 描述符
向默认终结点发送控制传输
发送 I/O 请求
释放设备句柄
实现主函数
相关主题

如何通过 WinUSB 功能访问 USB 设备

renpeng009 发表于 2013-4-19 23:20:49

内容丰富,留待仔细阅读

cqsrmxxzyx 发表于 2013-4-19 23:23:34

感觉就像android里的HAL,把设备驱动放到用户态下

shangdawei 发表于 2013-4-20 09:13:07

本帖最后由 shangdawei 于 2013-4-20 09:31 编辑

使用内置 Winusb.inf 安装 WinUSB 设备

这个就像HID或者MSC之类, 只要设备符合WinUSB的要求, 无需提供 inf和驱动, windows自动安装winusb.sys

另外在win8下, 修改/自定义 inf 文件, 或出现签名问题, 似乎要启动安全模式才允许安装,
使用内置的inf则不会出现这个问题, 要符合WinUSB的要求, 至少需要提供以下 3 项 :

1. 定义存储在字符串索引 0xEE 处的 OS 字符串描述符#define bMS_VendorCode            ( 0x01 )
// "MSFT100" : index : 0xEE : langId : 0x0000
const U8 OS_StringDescritpor[ ] =
{ 0x12,0x03,'M',0,'S',0,'F',0,'T',0,'1',0,'0',0,'0',0,bMS_VendorCode,0 };处理 usb 标准请求时, 读取 index==0xEE 的串描述符, 返回 OS_StringDescritpor
bMS_VendorCode 将作为后续 Vendor 请求的请求代码

2. 设置扩展兼容 ID OS 特征描述符包// "WINUSB\0\0" : wIndex : 0x0004
const U8 WINUSB_ExtendedCompatId_Descritpor[ ] =
{
0x28, 0x00, 0x00, 0x00,                         // dwLength
0x00, 0x01,                                     // bcdVersion
0x04, 0x00,                                     // wIndex
0x01,                                           // bCount
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,       // Reserved
0x00,                                           // bFirstInterfaceNumber
0x01,                                           // RESERVED ( 0x01 )
'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,       // compactiableID
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // subCompactiableID
0x00, 0x00, 0x00, 0x00, 0x00, 0x00            // Reserved
};处理请求带代码为 bMS_VendorCode 的 vendor 请求时, 若设置包的 wIndex == 0x0004 返回WINUSB_ExtendedCompatId_Descritpor


3. 注册设备接口 GUID// L"DeviceInterfaceGUID" : wIndex = 0x0005
// L"{12345678-1234-1234-1234-123456789ABC}"
//
const U8 WINUSB_ExtendedProperty_InterfaceGUID_Descritpor[ ] =
{
0x8E, 0x00, 0x00, 0x00,   // dwTotalSize = Header + All sections
0x00, 0x01,               // bcdVersion
0x05, 0x00,               // wIndex
0x01, 0x00,               // wCount

0x84, 0x00, 0x00, 0x00,   // dwSize -- this section

0x01, 0x00, 0x00, 0x00,   // dwPropertyDataType

0x28, 0x00,               // wPropertyNameLength

'D', 0x00, 'e', 0x00,       // bProperytName : WCHAR : L"DeviceInterfaceGUID"
'v', 0x00, 'i', 0x00,       // bProperytName : WCHAR
'c', 0x00, 'e', 0x00,       // bProperytName : WCHAR
'I', 0x00, 'n', 0x00,       // bProperytName : WCHAR
't', 0x00, 'e', 0x00,       // bProperytName : WCHAR
'r', 0x00, 'f', 0x00,       // bProperytName : WCHAR
'a', 0x00, 'c', 0x00,       // bProperytName : WCHAR
'e', 0x00, 'G', 0x00,       // bProperytName : WCHAR
'U', 0x00, 'I', 0x00,       // bProperytName : WCHAR
'D', 0x00, 0x00, 0x00,      // bProperytName : WCHAR

0x4E, 0x00, 0x00, 0x00,   // dwPropertyDataLength : 78 Bytes = 0x0000004E

'{', 0x00, '1', 0x00,       // bPropertyData : WCHAR : L"{12345678-1234-1234-1234-123456789ABC}"
'2', 0x00, '3', 0x00,       // bPropertyData
'4', 0x00, '5', 0x00,       // bPropertyData
'6', 0x00, '7', 0x00,       // bPropertyData
'8', 0x00, '-', 0x00,       // bPropertyData
'1', 0x00, '2', 0x00,       // bPropertyData
'3', 0x00, '4', 0x00,       // bPropertyData
'-', 0x00, '1', 0x00,       // bPropertyData
'2', 0x00, '3', 0x00,       // bPropertyData
'4', 0x00, '-', 0x00,       // bPropertyData
'1', 0x00, '2', 0x00,       // bPropertyData
'3', 0x00, '4', 0x00,       // bPropertyData
'-', 0x00, '1', 0x00,       // bPropertyData
'2', 0x00, '3', 0x00,       // bPropertyData
'4', 0x00, '5', 0x00,       // bPropertyData
'6', 0x00, '7', 0x00,       // bPropertyData
'8', 0x00, '9', 0x00,       // bPropertyData
'A', 0x00, 'B', 0x00,       // bPropertyData
'C', 0x00, '}', 0x00,       // bPropertyData
0x00, 0x00                  // bPropertyData
};处理请求带代码为 bMS_VendorCode 的 vendor 请求时, 若设置包的 wIndex == 0x0005 返回WINUSB_ExtendedProperty_InterfaceGUID_Descritpor

至此, Windows 将安装 WinUsb.sys 作为设备的驱动







通讯过程参考



richards 发表于 2013-4-20 09:38:37

有意思。。。

wcm_e 发表于 2013-4-20 10:01:23

学习 mark

dr2001 发表于 2013-4-20 10:12:25

1、有直接生成WinUSB的驱动并且直接加载的工具。
2、访问可以直接用LibUSB的Win32驱动。
代码和Linux是兼容的。

adongliu 发表于 2013-4-20 10:17:14

这个很不错

shangdawei 发表于 2013-4-20 11:52:38

本帖最后由 shangdawei 于 2013-4-20 12:04 编辑

dr2001 发表于 2013-4-20 10:12 static/image/common/back.gif
1、有直接生成WinUSB的驱动并且直接加载的工具。
2、访问可以直接用LibUSB的Win32驱动。
代码和Linux是兼容 ...

搜索到这些软件, 应该可以生成的驱动并且直接加载

http://sourceforge.net/projects/libusb-win32/

http://sourceforge.net/projects/libusbx/

http://sourceforge.net/projects/libusbk/

http://sourceforge.net/projects/libwdi/

http://sourceforge.net/projects/libwdi/files/zadig/





bbs2009 发表于 2013-4-20 19:04:06

tongdayusu 发表于 2013-4-20 19:42:23

挺好。。。

TANK99 发表于 2013-4-20 20:27:19

标记一下,能自己做USB设备的驱动不?

shangdawei 发表于 2013-4-20 21:06:41

可以做自己设备的usb驱动

aureole 发表于 2013-4-20 21:10:16

真不错,支持下

McuPlayer 发表于 2013-6-13 11:03:19

WinUSB不错,和libusb有得一比

wmdng 发表于 2013-6-13 11:47:23

好东西, mark, winusb

bbs2009 发表于 2013-6-13 12:59:53

gwnpeter 发表于 2013-7-21 23:14:49

libusbx也是使用winusb作为底层驱动的,感觉libusbx的api更加方便一些
学习了,之前都是用的libwdi的wdi-sample.exe安装的winusb的驱动

phone 发表于 2013-7-22 09:03:16

标志备用。

janafar 发表于 2013-7-22 09:33:33

好资料,留下备用

lidongxin 发表于 2013-7-29 23:24:35

{:loveliness:}{:loveliness:}膜拜高人啊…………菜鸟还需更多修为。

chunjiu 发表于 2013-7-29 23:33:06

make make , 留待细看

hclin 发表于 2013-9-2 04:08:39

good job !!!

dengxiaofeng 发表于 2013-9-2 21:16:06

果断保存 并收藏 这个太有用了我用 libUSb-win32 出现一下莫名奇怪的问题 总是解决不了!

jdw924 发表于 2013-9-2 21:24:56

好资料,收藏

cocoloong 发表于 2013-9-16 23:13:47

mark 收藏,这个是好东东

wanyou132 发表于 2013-9-17 09:55:19

MARK 收藏

jz701209李 发表于 2013-9-22 17:43:29

留名,谢谢         

jsntzxh 发表于 2013-9-22 18:27:53

认真学习,收藏

chenwei1919 发表于 2013-10-12 21:34:53

好资料,果断收藏了

gentlerain 发表于 2013-10-12 22:22:06

收藏了,谢谢.WinUSB

WEIZ666 发表于 2013-10-12 23:01:46

不错 谢谢....................

huangqi412 发表于 2013-10-18 13:44:53

信息量很大,收下了。

bailao99 发表于 2013-11-2 08:35:21

果断收下,谢谢楼主共享

寒寒 发表于 2013-12-25 12:13:00

信息量真到,回帖的信息量也大,winusb,libusb

Tliang 发表于 2014-2-22 10:33:12

winusb,libusb

farmerzhangdl 发表于 2014-2-22 10:37:15

这个解决了win8的问题,很不错

_yuyixuantai 发表于 2014-2-22 14:45:54

很不错的资料,up之

armstrong 发表于 2014-3-14 12:19:29

标个记号,设备和PC通信常见的解决方案。

hexenzhou 发表于 2014-11-19 11:08:22

好东东。

673835452 发表于 2014-11-19 11:29:59

mark   以后用到

hyper320 发表于 2014-11-19 12:47:23

很不错的资料,如果有个范例那更好了

zwjiang8212 发表于 2014-11-19 13:07:09

mark,学习

happy_andy 发表于 2014-11-19 13:12:53

关注下,呵呵

love_zjb 发表于 2014-11-19 13:14:31

有时间再看。

jingyite 发表于 2014-11-19 13:52:48

正在做stm32的USB驱动,收藏一下

quzegang 发表于 2015-11-9 15:24:25

好贴,做USB通信很有用

zhxlx 发表于 2017-7-28 20:24:14


确实是好贴!

bitvi 发表于 2017-7-28 21:03:31

mark,好资料

jinzhen107 发表于 2017-11-20 00:44:42

请问这个只需要配置VID和PID即可找到驱动吗?

newlife2lyf 发表于 2017-11-20 01:03:21

make make , 留待细看

zhenke 发表于 2017-11-20 01:26:28

收藏一下.

shangdawei 发表于 2017-11-20 08:52:38

jinzhen107 发表于 2017-11-20 00:44
请问这个只需要配置VID和PID即可找到驱动吗?

不需要VID/PID匹配,需要实现提到的几个请求处理,就可以自动安装驱动。

jinzhen107 发表于 2017-11-20 16:51:38

您好!
    我想用WINUSB 去写下ISP1583的驱动!,按照要求建立个工程,只改了VID和HID,其他怎么去改什么断点,也不知道怎么去改!
请问你这个容易实现吗?

目前改了这些可以找到USB驱动并且安装了,但是就是不跟上位机软件通讯!

shangdawei 发表于 2017-11-20 17:01:53

jinzhen107 发表于 2017-11-20 16:51
您好!
    我想用WINUSB 去写下ISP1583的驱动!,按照要求建立个工程,只改了VID和HID,其他怎么去改什么 ...

如何通过 WinUSB 功能访问 USB 设备

https://msdn.microsoft.com/zh-cn/subscriptions/downloads/ff540174.aspx

jinzhen107 发表于 2017-11-20 17:27:00

本帖最后由 jinzhen107 于 2017-11-20 18:53 编辑

shangdawei 发表于 2017-11-20 17:01
如何通过 WinUSB 功能访问 USB 设备

https://msdn.microsoft.com/zh-cn/subscriptions/downloads/ff5401 ...

感谢
你的提供做的讯息

若有有个实例,直接改就好了!{:lol:}

shangdawei 发表于 2017-11-20 18:57:33

什么开发环境,什么语言?

jinzhen107 发表于 2017-11-20 19:35:11

shangdawei 发表于 2017-11-20 18:57
什么开发环境,什么语言?

Microsoft Visual Studio 2012
语言为:C++        或C也可以。别的我也看不懂

shangdawei 发表于 2017-11-20 20:48:07

jinzhen107 发表于 2017-11-20 19:35
Microsoft Visual Studio 2012
语言为:C++        或C也可以。别的我也看不懂

jinzhen107 发表于 2017-11-20 20:57:16

本帖最后由 jinzhen107 于 2017-11-20 21:00 编辑

shangdawei 发表于 2017-11-20 20:48


我也是这么建立的!

但是后面的怎么改端点,读写,怎么应用那些API就找不到
我把这个建立的也上传附件了!

通过这个生成的驱动,USB能找到能也能识别。就是不能跟上机通讯,总显示是脱机

sinc_mark 发表于 2017-11-21 08:29:04

mark,winUsb,留待查阅!

gracialee 发表于 2018-1-15 22:29:00


收藏了,谢谢.WinUSB

hanshiruo 发表于 2018-1-16 08:55:07

记号,以后用的到

chenxin2015 发表于 2018-1-16 10:40:27

好资料,做个记号!

makesoft 发表于 2018-1-16 10:59:35

没看明白,简单的问一句,有个以前老版本的XETIEK的编程器,只能工作在WIN7 32位系统上,我能把它通过这个升级到64位系统吗?

shangdawei 发表于 2018-1-16 13:35:35

makesoft 发表于 2018-1-16 10:59
没看明白,简单的问一句,有个以前老版本的XETIEK的编程器,只能工作在WIN7 32位系统上,我能把它通过这个 ...

如果有64位驱动的话,应该可以。

makesoft 发表于 2018-1-16 14:22:30

shangdawei 发表于 2018-1-16 13:35
如果有64位驱动的话,应该可以。

就是原厂不提供64位驱动,所以才无法使用的。

shangdawei 发表于 2018-1-16 14:29:08

makesoft 发表于 2018-1-16 14:22
就是原厂不提供64位驱动,所以才无法使用的。

不想用两台电脑,在虚拟机里面运行应该可以。

bbs2009 发表于 2018-1-27 13:30:16

shangdawei 发表于 2018-1-27 13:55:58

bbs2009 发表于 2018-1-27 13:30
可以看看这个据说是KEIL新作的 WinUSB上位机例子,支持中断传输,批量传输和控制传输 。




This is an Windows application that communicates with USB Device using WinUSB Interface.

This application can be built using Visual Studio 2010 or later.

This application requires WinDDK version 7600.16385.1 installed in C:\WinDDK\7600.16385.1\ folder.

With default settings it uses GUID assigned to USB Device Custom Class example that can be found
in respective device pack in folder .\Middleware\USB\Device\WinUSB_Echo

This application can also be used with any WinUSB device.

.\Middleware\USB\Device\WinUSB_Echo 这个是下位机程序吗?

bbs2009 发表于 2018-1-27 18:06:06

shangdawei 发表于 2018-1-27 18:25:07

bbs2009 发表于 2018-1-27 18:06
http://www.keil.com/pack/doc/mw/USB/html/dev_cc_tutorial.html

多谢分享!

Azuresky 发表于 2018-1-27 19:22:04

用过libusb,在Windows系统下的稳定性不行,会打嗝。改用WinUSB后就好了。

519358694 发表于 2019-7-5 20:42:50

您好请问下我按您的代码我OS 兼容ID注册GUID都已经被电脑识别到了为什么它还不会安装驱动 我是用的STM32F2的HID设备更改的代码 电脑已经接受到了 但不会自动安装 请问下这是为什么

519358694 发表于 2019-7-5 20:43:15


如果您愿意为我解决这个问题的话我会有偿询问的

zhifeng 发表于 2019-7-6 08:35:29

win10 才能面安装。win7之前,必须加载inf。winusb我测试结果就是这样。还是不尽人意。最后使用 msc 协议。这样系统会自动安装驱动,并且可以使用bulk传输

shangdawei 发表于 2019-7-6 10:59:25

对于 Windows 8 之前的 Windows 版本,更新的 Winusb.inf 可通过 Windows 更新提供。
如果你的计算机配置为自动获取驱动程序更新,WinUSB 驱动程序将使用新的 INF 程序包进行安装,无需任何用户干预。

WinUsbCompat.rar (5.41 KB, 下载次数: 376)

下载这个文件,解压缩 .inf 右键安装。



shouqiang_zhang 发表于 2019-7-6 14:05:20

本帖最后由 shouqiang_zhang 于 2019-7-6 14:07 编辑

楼主,我右键安装,说INF不支持此类安装,是什么原因造成的?我的系统win7 x64, 另外问下,这个支持USB3.0驱动吗?


amlt_shifu 发表于 2019-7-6 14:13:23

好资料 非常感谢

rube 发表于 2019-7-6 14:52:16

楼主真了不起,6年前的帖子还来解答{:victory:}

shangdawei 发表于 2019-7-6 23:37:17

shouqiang_zhang 发表于 2019-7-6 14:05
楼主,我右键安装,说INF不支持此类安装,是什么原因造成的?我的系统win7 x64, 另外问下,这个支持USB ...





Windows 2012 R2 安装成功。

shangdawei 发表于 2019-7-6 23:42:03

WinUSB (Winusb.sys) 安装
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/usbcon/winusb-installation
https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/winusb


Manually Install WinUsb Driver on Windows 7
https://www.silabs.com/community/interface/knowledge-base.entry.html/2017/02/06/manually_installwin-A2Jj
02/06/2017 | 02:19 pm

Win7 ships with the correct 'winusb.sys' file, but is missing an updated '.inf' file that associates the driver with "usb\ms_comp_winusb" devices. Normally if the USB device supports Microsoft OS descriptors, then it will allow Windows to automatically install the WinUSB driver. This mechanism is supported "in-box" for Win8 and newer. For Win7 the mechanism is supported through Windows update. Depending on the update policy for the Win7 machine, the appropriate driver may or may not be already available on the machine. If it is not already on the machine, user can use the following manual procedure to install the driver if necessary.

Search for "windows phone winusb" at https://www.catalog.update.microsoft.com/Home.aspx].
Download "Windows Phone - Other hardware - WinUsb Device".
Extract the contents of the downloaded '.cab' file to a temporary folder.
In device manager select "Update driver software ..." --> "Browse my computer for driver software".
5. Navigate to the temporary folder with the downloaded driver and complete the installation.

This procedure only needs to be done once.

liu100m 发表于 2020-1-28 13:42:45

WinUSB (Winusb.sys) 安装
2018/05/09

对于某些通用串行总线(USB)设备,例如仅由单个应用程序访问的设备,你可以将设备的内核模式堆栈中的WinUSB (WinUSB)安装为 USB 设备的函数驱动程序,而不是实现驱动程序。
本主题包含以下部分:
不使用 INF 文件自动安装 WinUSB
通过指定系统提供的设备类来安装 WinUSB
为 WinUSB 安装编写自定义 INF
如何创建驱动程序包以安装 Winusb

liu100m 发表于 2020-1-28 13:44:08

不使用 INF 文件自动安装 WinUSB

作为 OEM 或独立硬件供应商(IHV),可以构建设备,以便在 Windows 8 和更高版本的操作系统上自动安装 Winusb。 此类设备称为 WinUSB 设备,无需编写引用内置 Winusb 的自定义 INF 文件。
连接 WinUSB 设备时,系统会自动读取设备信息并加载 Winusb。
有关详细信息,请参阅WinUSB 设备。

EMC菜鸟 发表于 2022-11-23 14:53:23

正好在学 PYTHON + WINUSB ,感谢楼主的无私分享!

liang16888 发表于 2023-10-12 14:27:28

Thank you !!!

iamseer 发表于 2023-10-12 14:58:05

Win8及以后的操作系统可以直接上 Microsoft OS descriptors 自动安装。
简单来说就是把USB版本设到2.1,然后加入Microsoft OS descriptors描述符,windows读到以后会自己装winusb驱动,无需干预。

astankvai 发表于 2023-10-13 08:13:48

这个也叫WCID,比HID 确实要快多了。
页: [1]
查看完整版本: WinUSB - 微软为所有 USB 设备提供的常规驱动程序