我需要为CDC设备编写自己的主机端USB驱动程序吗?

11
这可能不被视为直接与编程有关,但我不知道还能去哪里询问。我已经尝试查看各种网站,但目前为止谷歌并没有给我带来帮助。
我正在研发一款设备,该设备可能连接到各种Windows/Linux/Mac平台,但我无法确定是否需要为它编写自己的设备驱动程序,或者功能是否由标准驱动程序提供。
我的设备是一个USB CDC(通信设备),它显示为COM端口。 它还包括一个电池充电器,一旦设备被枚举,就需要完整的5个单位负载(500mA)供电电流,该电流可以从USB连接器中提取。 我的问题是,如果主机中的USB驱动程序确定无法提供完整的供电电流,则应该无法枚举该设备。
如果作为备选方案,我提供了第二个配置集,该配置集只允许设备从接口连接器中提取1个单位负载,那么标准驱动程序是否将使用该配置枚举设备。

我认为你首先需要查看USB规范,以确定这些事情是否被允许。如果规范允许,那么标准浏览器可能会支持它。 - kgiannakakis
在USB 2.0规范中,设备描述符允许多个配置,每个配置都可以指定它需要从接口获取一定量的电力。然后,我推测,由驱动程序来选择这些不同的配置。 - uɐɪ
5个回答

7
你需要为Windows编写一个.inf文件,将你的设备VID和PID与系统usbser.sys绑定。我的文件如下所示(请根据需要替换YourCompany,输入你的VID和PID(以十六进制表示),并将DriverVer行更改为所需的日期和版本):
; -----------------------------------------------------------------------------
; XP/2000 USB Comms Port Setup
; -----------------------------------------------------------------------------

[Version] 
DriverVer=12/03/2008,1.0.0000.0000
Signature="$Windows NT$"
Class=Ports 
ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318} 
Provider=%YourCompany% 

[DestinationDirs]
DefaultDestDir=10,system32\drivers
DriverCopyFiles=12

[ControlFlags]
ExcludeFromSelect = *

[Manufacturer] 
%YourCOmpany%=YourCompanySerialPort 

[YourCompanySerialPort] 
%YourCompanyUSBSerialPort%=YOURCOMPANYUSB,USB\VID_1234&PID_ABCD

; 
; Win 2000/XP
;
[YOURCOMPANYUSB]
Include=mdmcpq.inf
CopyFiles=FakeModemCopyFileSection

[YOURCOMPANYUSB.HW] 
AddReg=YOURCOMPANYUSBAddReg.HW 

[YOURCOMPANYUSBAddReg.HW] 
HKR,,DevLoader,0,*ntkern 
HKR,,NTMPDriver,,"usbser.sys" 

[YOURCOMPANYUSB.Services] 
AddService=usbser, 0x00000002, FuncDrv_Service_Inst 

[FuncDrv_Service_Inst] 
DisplayName=%USBFilterString% 
ServiceType= 1 
StartType = 3 
ErrorControl = 0 
ServiceBinary = %12%\usbser.sys 

[Strings] 
YourCompany="YourCompany" 
YourCompanySerialPort="Your Company USB Serial Port" 
USBFilterString = "USB Serial Service"

请注意,此方法只适用于32位操作系统。尽管文件头没有标明,但它也适用于Vista!

请注意,某些版本的usbser.sys存在严重问题,例如传输精确为64字节倍数的数据包时会导致蓝屏。如果您使用XP SP2或更早版本,请安装热补丁KB943198。XP SP3和Vista则没有问题。

对于Mac电脑,您只需要正确报告设备类别,驱动程序扫描即可拾取正确的驱动程序。(Windows忽略了设备类别,这就是为什么需要提供.inf文件的原因)。

编辑:抱歉,我应该更清楚地表达。如果无法绘制全部负载,则此方法不会无法枚举 - 我不确定这是否可能发生。


1
我正在尝试自动安装此驱动程序,而不是用户需要转到设备管理器(虽然这也可以工作)。我尝试过使用右键单击安装,也尝试使用https://dev59.com/I3RB5IYBdhLWcg3wQVSV中描述的方法。无论哪种情况,当我插入设备时,它会弹出新硬件向导,并且虽然在设备管理器中显示为端口,但没有与之关联的驱动程序。一些更多细节: - Edwin Evans
我正在尝试在Windows XP上使用Cypress芯片。 Cypress为此提供了一个.inf文件(http://www.cypress.com/?rID=40248),该文件与其他文件有很大不同,例如CopyFiles设置为DriverCopyFiles,而不是FakeModemCopyFileSection。 有什么建议吗? - Edwin Evans
我们公司已经使用usbser.sys作为许多产品的驱动程序,但我从未找到简便的方法来避免Windows XP中的“发现新硬件向导”。如果您有相关信息,请告知。好消息是,使用相同的inf文件,在Windows Vista和Windows 7中,只要在安装了inf文件之后再插入设备,驱动程序就可以自动安装而无需向导。 - David Grayson
1
@Edwin Evans:是的,这正是 .inf 文件的作用 - 将您的 VID/PID 与 usbser.sys 匹配。 - Vicky
1
@Edwin Evans:对于类似于大容量存储设备(存储卡)的东西,可能会使用设备类。但是对于USB串行设备,它不使用设备类。猜测微软意识到如果您必须为每个插入的存储卡安装驱动程序,那将会非常麻烦,但串行设备在用户领域并不是那么常见。 - Vicky
显示剩余4条评论

2
你在驱动程序方面的问题上是正确的。当设备插入并通过枚举过程时,需要保持小于100mA的电流。主机将进行询问并确定配置。如果有多个支持不同功率级别的配置,则驱动程序需要决定选择适当的配置。如果只有高功率且不可用,则不会枚举该设备。一般来说,执行CDC的标准驱动程序不会意识到可能存在的不同设备级别配置,因此需要进行某种程度的定制才能处理它们。

1
如果您的设备作为USB CDC-ACM设备连接到Windows桌面主机,则Windows桌面已经提供了驱动程序usbser.sys。但是在Windows Vista中存在一些问题。您只需要inf文件即可在桌面上安装usbser.sys。对于WinCE,您没有驱动程序,需要编写或从任何第三方供应商获取一个。这是其中一个。

http://www.em.avant-garde-lab.com/Products.html

如果您的设备在其设备描述符中指定为自供电,则主机将依赖于设备的自供电能力。您可以在usb.org上查看详细信息。 谢谢。

1

我不确定关于电源问题,但是有很多CDC驱动程序(或者我认为有),所以你可以使用其中一个。对于电源问题,具有许多配置的解决方案可能是一个好选择,我在工作中从未遇到过这种情况(我有USB分析仪),但是在家里有时当我有3个或更多需要从USB获取电源的不同设备时,我会遇到枚举失败的情况。我想这是操作系统的选择,如果它无法为新设备提供电源,则将其切断(这是明智的选择,因为它无法为其提供电源)。这是我的猜测,而不是检查USB标准。


1

如果您的设备报告的设备ID已被主机操作系统支持,则无需驱动程序。

您可能需要扮演一个现有的USB串口。数据表易于获得。 (但我想您已经知道了这一点。)

我不确定主机操作系统是否会支持您的多配置想法。

但是,让我们都试一下吧!


请注意,设备ID由供应商ID和产品ID组成,该供应商ID的所有者可能不欣赏您劫持他们的ID。对于个人项目来说,这并不是问题,但不要出售此类设备。 - MSalters
当然,获得自己的ID并不那么昂贵,我们都想购买你的神奇设备,对吧? - Tim Williscroft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接