Usb

缺少 USB“輸出”端點?

  • December 16, 2021

我正在嘗試與作為雷射控制器的 USB 設備通信。該設備有一個 Windows 控制器,它既可以寫入(打開或關閉雷射),也可以讀取(獲取雷射的狀態,打開或關閉)。現在我想使用 Python 在 Linux 機器上複製它。我能夠成功地從設備讀取,但由於某種原因我無法寫入它(有關更多詳細資訊,請參閱此 SO 問題)。

我對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

每個 USB 設備都會在預設端點(即端點 #0)中接受控制命令。這也是配置 USB 匯流排的基本要求,所以端點描述符中不必提及,因為端點 #0 必須始終存在。預設端點也是雙向的,因此單個控制傳輸可以包括從電腦到設備的命令和設備的響應。

您的雷射控制器很可能使用端點 #0 將電腦命令發送到雷射控制器。端點 #1 是一個中斷端點,因此控制器可能使用它來報告雷射器狀態的任何變化,或必須及時響應的錯誤情況(例如“雷射器過熱”)。

雷射控制器的 USB 介面使用 HID 介面類,因為 HID 類的規範包括用於雜項和供應商特定控制的設施。

設備的介面描述符具有bNumEndpointsas 1,因此它確認除了始終存在的控制端點 #0 之外應該只有一個端點,並且您沒有遺漏任何東西。

引用自:https://unix.stackexchange.com/questions/681481