缺少 USB“输出”端点?

缺少 USB“输出”端点?

我正在尝试与作为激光控制器的 USB 设备进行通信。该设备有一个 Windows 控制器,可以进行写入(打开或关闭激光)和读取(获取激光的状态(打开或关闭))。现在我想使用 Python 在 Linux 机器上复制这个。我能够成功地从设备读取数据,但由于某种原因我无法写入它(请参阅这个问题更多细节)。

我在 USB 通信方面没有太多经验,但我在某处看到IN端点用于读取,OUT端点用于写入,并且我注意到当我这样做时,lsusb -v -d <my_device>我得到一个IN端点但没有OUT端点,所以这可能是我的问题的原因。它看起来像一个“只读设备”(我可能是错的)。

我现在的问题是:在 Linux 中是否有可能OUT由于缺少某些驱动程序或某些配置而看不到端点?

这是以下的输出lsusb -v -d <my_device>

Bus 002 Device 010: ID c251:2201 Keil Software, Inc. LASER Driver IJS
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0xc251 Keil Software, Inc.
  idProduct          0x2201 
  bcdDevice            1.00
  iManufacturer           1 LASER Driver 
  iProduct                2 LASER Driver IJS
  iSerial                 3 0001A0000000
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0022
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              4 HID
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.00
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      33
          Report Descriptor: (length is 33)
            Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
                            (null)
            Item(Local ): Usage, data= [ 0x01 ] 1
                            (null)
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x40 ] 64
            Item(Local ): Usage, data= [ 0x10 ] 16
                            (null)
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Count, data= [ 0x40 ] 64
            Item(Local ): Usage, data= [ 0x10 ] 16
                            (null)
            Item(Main  ): Output, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Local ): Usage, data= [ 0x01 ] 1
                            (null)
            Item(Main  ): Feature, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
can't get device qualifier: Resource temporarily unavailable
can't get debug descriptor: Resource temporarily unavailable
Device Status:     0x0001
  Self Powered

答案1

每个USB 设备都将接受默认端点(即端点#0)中的控制命令。这也是配置USB总线的基本要求,因此不必在端点描述符中提及,因为端点#0必须总是存在。默认端点也是双向的,因此单个端点控制转移可以包括从计算机到设备的命令和设备的响应。

您的激光控制器很可能使用端点 #0 作为计算机向激光控制器发出的命令。端点#1 是中断端点,因此控制器可能使用它来报告激光器状态的任何变化,或者必须及时做出反应的错误条件(例如“激光器过热”)。

激光控制器的 USB 接口使用 HID 接口类,因为 HID 类的规范包括用于各种和特定于供应商的控制的设施。

设备的接口描述符具有bNumEndpointsas 1,因此它确认除了始终存在的控制端点 #0 之外应该只有一个端点,并且您不会丢失任何内容。

相关内容