代码之家  ›  专栏  ›  技术社区  ›  uɐɪ

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

  •  10
  • uɐɪ  · 技术社区  · 15 年前

    这可能不被认为是与编程直接相关的,但我不知道还能问到什么。我试过浏览各种网站,但到目前为止,谷歌还不是我的朋友。

    我很难确定是否需要为我正在开发的设备可能连接到的各种Windows/Linux/Mac平台编写自己的设备驱动程序,或者是否由标准驱动程序提供功能。

    我的设备是一个USB CDC(通信设备),显示为com:port。它还包括一个电池充电器,一旦设备被枚举,将需要5个单位负载(500MA)的电源电流,可以从USB连接器。我的问题是,如果主机中的USB驱动程序决定它不能提供完整的电源电流,那么它应该无法枚举设备。

    如果作为回退,我提供第二个配置集,只允许设备从接口连接器中提取1个单元负载,标准驱动程序将使用此配置枚举设备。

    5 回复  |  直到 15 年前
        1
  •  6
  •   Vicky    15 年前

    您需要为Windows编写一个.inf文件,将设备VID和PID与系统usbser.sys绑定在一起。我的看起来是这样的(必要时更换您的公司,放入VID和PID(十六进制),并将驱动程序行更改为您想要的任何日期和版本):

    ; -----------------------------------------------------------------------------
    ; 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位OSS。它也适用于Vista,尽管文件头没有这么说!

    请注意,usbser.sys的某些版本存在重大问题,包括蓝屏,例如,传输完全是64字节倍数的数据包时。如果您使用的是xp sp2或更高版本,请安装修补程序kb943198。xp sp3和vista都可以。

    对于Mac,您只需要正确地报告设备类,并且驱动程序扫描会选择正确的驱动程序。(Windows忽略设备类,这就是您需要提供.inf文件的原因)。

    编辑:对不起,我应该更清楚些。如果它不能画满负载,这不会失败枚举-我不确定这是可能的。

        2
  •  1
  •   CrazyChris    15 年前

    我不确定电源问题,但有百分百疾控中心司机(或我认为有),所以你可以使用一个。对于电源问题,有许多配置的解决方案可能是很好的,我在工作中从未遇到过(我有USB分析仪),但有时在家里,当我有3个或更多需要USB电源的不同设备时,我的枚举失败。我认为这是操作系统的选择,如果它不能为新设备供电,它就切断电源(明智的选择,因为它不能为它供电)。这是我的猜测,而不是检查USB标准。

        3
  •  1
  •   Tim Williscroft    15 年前

    如果您的设备报告主机操作系统已经支持的设备ID, 那他们就不需要司机了。

    您可能需要模拟现有的USB UART。数据表随时可用。 (但我想你已经知道了。)

    我不确定主机操作系统是否会尊重您的多配置思想。

    但给它一个双关语,让我们都知道!

        4
  •  1
  •   naven87    15 年前

    你对司机的问题是正确的。当设备插入并经过枚举过程时,需要保持100mA。主机将询问并确定配置。如果有不止一个支持不同的功率级别,那么驱动程序将需要决定选择适当的配置。如果只有大功率而它不可用,那么它将不会枚举设备。一般来说,执行CDC的标准驱动程序不会知道可能的不同设备级配置,因此需要一定程度的定制来处理它们。

        5
  •  1
  •   marcus    10 年前

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

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

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